手机号注册验证接口

user.py——>urls.py
添加路由:
path('mobile/', views.MobileCheckAPIView.as_view()),

在views.py
手机号码验证是否注册了
首先获取手机号
如果不存在,提示mobile必须提供
如果格式错误,提示mobile格式有误
获取数据库中的mobile,如果相等,手机号已注册
否则,手机号未注册

注册接口

views.py
手机号验证码注册
发送post请求

转到views,
1、将请求的携带的数据丢给data,然后丢给序列化类(序列化字段)
serializer = serializers.RegisterMobileModelSerializer(data=request.data)

2、如果校验通过
serializer.is_valid(raise_exception=True)

3、保存产生对象到user_obj对象中
user_obj = serializer.save()

4、返回序列化结果(反序列化结果)
return APIResponse(results=serializers.RegisterMobileModelSerializer(user_obj).data)

参与  序列化的字段(用户名,手机号,邮箱)
参与  反序列化的字段(手机号,密码,验证码)

来到serializers.py中
class RegisterMobileModelSerializer(serializers.ModelSerializer):

先写反序列化的字段,因为没有code字段,需要自己定义
code = serializers.CharField(write_only=True, min_length=6, max_length=6)
    class Meta:
        model = models.User
        fields = ('username', 'mobile', 'password', 'code')

序列化反序列化参数:是否是序列化反序列化
extra_kwargs = {
            'password': {
                'write_only': True
            },
            'username': {
                'read_only': True
            }
        }

提示下面的代码:每一个反序列化字段都可以配置一个局部钩子
定义mobile(手机号)局部钩子,校验格式
如果输入的手机号格式错误,提示手机号格式有误
def validate_mobile(self, value):
	if not re.match(r'^1[3-9][0-9]{9}$', value):
		raise serializers.ValidationError('手机号格式有误')
	return value
        
定义code(验证码)局部钩子
强转value验证码值,返回值,如果抛出错误,返回验证码有误
def validate_code(self, value):
        try:
            int(value)
            return value
        except:
            raise serializers.ValidationError('验证码有误')

然后进行全局校验
1)一个序列化类存在一个全局钩子可以对所有字段进行全局校验,钩子方法 validate(self, 所有字段值字典attrs)
    规则:成功直接返回attrs,失败抛出校验失败信息ValidationError({'异常字段', '错误信息'})
2)重写create方法实现增入库,返回入库成功的对象
def validate(self, attrs):
        # 所有字段值字典 attrs
        mobile = attrs.get('mobile')
        # 必须拿出字典attrs中的code(验证码),和下面的缓存code进行校验
        code = attrs.pop('code')
        # 短信验证码缓存key,就是old_code(SMS_CACHE_FORMAT)
        old_code = cache.get(settings.SMS_CACHE_FORMAT % mobile)
        # 如果不相等
        if code != old_code:
            # 抛出错误,验证码有误
            raise serializers.ValidationError({'code': '验证码有误'})
            
验证码校验通过,验证码失效,使用一次失效,为了验证码信息安全考虑
cache.set(settings.SMS_CACHE_FORMAT % mobile, None, 0)

创建用户需要一些额外的信息,比如username,邮箱(可以多方式登录)
attrs['username'] = mobile

return attrs

然后就是重写create方法:默认入库,默认密码是明文,重写后就是密文了,因为create方法是auth组件的
def create(self, validated_data):
	return models.User.objects.create_user(**validated_data)
	

避免主页横向滚动条

到前端的全局css样式文件中添加,避免横向产生滚动条的配置
body {
    overflow: hidden;
}

登录模态框

在components新建Login.vue
配置style,渲染login组件
在登录按钮中绑定方法,
绑定密码登陆和短信验证登陆事件
如果登录方式是is_pwd
可以使用用户名,手机号,邮箱
在mothods中,写显示模态框代码
登录按钮中添加关闭登录事件
Header.vue中的methods:中的is_login改成False(这里的is_login在父级中)
Login.vue中mothods中的close_login()
利用子传参,发送close事件
在Header.vue中的父级中,绑定close事件
把值改为False,然后复制粘贴模态框代码
获取验证码,获取后设置false
校验手机对应用户是否存在
前台校验手机格式,如果有误提示手机号有误
设置显示模态框的显示时间为1秒,单位是1000=1s
访问后台校验手机号对应用户是否存在
注册过的手机才允许发送验证码
this.is_send = true;
发送中..
验证码倒计时设置
获取验证码
重新回复点击发送给功能的条件
到0秒后重新发送
验证码发送成功
验证码发送失败
获取验证码异常
验证码登录
要将相应的用户信息和token存储到cookies中
弹出框提示后,关闭登录界面
登录成功,如果异常,就是登录失败
密码登录,要将响应的用户信息和token存储到cookies中
弹出框提示后,关闭登录界面
异常就是登录失败
style scoped中设置布局
可以完成前台登录手机校验,获取验证码,
前台密码登录,注销,注册多个请求。

后台验证码处理一次性使用

设置配置文件中的三大认证模块
拥有具体权限限制的视图类局部配置权限
拥有具体频率限制的视图类局部配置频率
频率限制scope的规则
在serializer文件中添加代码
在全局钩子中设置def validate(self, attrs):
验证码校验通过,验证码失败(验证码一次性使用)
在实际项目中一般需要设置一次性使用的验证码(为了提高验证码的安全)