Django前后端连调(注册)

1. 注册

注册的内容需要完成用户名,密码,确认密码,手机号,验证码,注册按钮六个事件

1.1 校验用户名

1.1.1 后端实现校验用户名

判断用户名首先要定义类和请求方法,之后再进行判断是否写入,是否存在,长度是否符合条件

class CheckUserNameView(APIView):
    def get(self,request,username):
        if not username:
            return Response("用户名错误")
        #判断用户名的长度
        if not (6 <= len(username) <= 32) :
            return Response({
                "code" : 400,
                "msg" : "用户名长度不符"
            })
        # 在数据库查找用户名是否存在
        user_count = User.objects.filter(username=username).count()
        if user_count :   #如果存在
            return Response({
                "code" : 400,
                "msg" : "用户名已存在"
            })
		# 如果不存在
        return Response({
            "code" : 200,
            "msg" : "用户名可用"
        })

在url.py文件里写入路由

from django.urls import path
from users import views
urlpatterns = [
    path('check/username/<str:username>/',views.CheckUserNameView.as_view()),
]
1.1.2 前端实现校验用户名
     // 用户名的校验方法
    let validateName = (rule, value, callback) => {
      console.log("校验用户名,规则", rule, "用户名", value, "回调函数", callback)
      // TODO 校验用户名
      // 失败 return callback(new Error("字母开头,长度5-16之间,允许字母数字下划线"));
      // 成功 return callback();
      this.$axios.get("/user/check/username/" + value + '/').then((result) => {
        if(result.data.code == 200){
          return callback()
        }else{
          return callback(new Error(result.data.msg))
        }
      }).catch((err) => {
        console.log(err)
        alert("页面错误")
      });
    };

1.2 校验密码

1.2.1 后端实现校验密码

首先定义类,定义请求方法,然后从页面里获取密码,再判断密码的长度

class CheckPassword(APIView):
    def post(self,request):
    	#从页面里获取的密码
        pawd = request.data.get("pawd")
        #判断密码的长度
        if not (6 <= len(pawd) <= 32) :
            return Response({
                "code" : 400,
                "msg" : "密码长度不符"
            })
        return Response({
            "code" : 200,
            "msg" : "密码可用"
        })

写入路由

from django.urls import path
from users import views
urlpatterns = [
    path('check/username/<str:username>/',views.CheckUserNameView.as_view()),
    path("check/password/",views.CheckPassword.as_view()),  #密码路由
]
1.2.2 前端实现校验密码
    // 密码的校验方法
    let validatePass = (rule, value, callback) => {
      console.log("校验密码,规则", rule, "密码", value, "回调函数", callback)
      // TODO 校验密码
      // 失败 return callback(new Error("字母开头,长度5-16之间,允许字母数字下划线"));
      // 成功 return callback();
      this.$axios.post("/user/check/password/",{"pawd":value}).then((result) => {    //传参数{}
        if(result.data.code == 200){
          return callback()
        }else{
          return callback(new Error(result.data.msg))
        }
      }).catch((err) => {
        console.log(err)
      });
    };

1.3 校验确认密码

1.3.1 后端实现校验确认密码

从页面中获取密码和确认密码,在对两者进行比较,如果相等就通过,不相等就重新输入

# 检测再次输入的密码
class CheckPawd(APIView):
    def post(self,request):
        # 从页面中获取密码和确认密码
        pawd = request.data.get("pawd")
        pwd = request.data.get("pwd")
        # 判断密码是否一致
        if pawd != pwd :
            return Response({
                "code" : 400,
                "msg" : "密码不一致"
            })
        return Response({
            "code" : 200,
            "msg" : "密码一致"
        })

写入路由

from django.urls import path
from users import views
urlpatterns = [
    path('check/username/<str:username>/',views.CheckUserNameView.as_view()),
    path("check/password/",views.CheckPassword.as_view()),
    path("check/pawd/",views.CheckPawd.as_view()),  # 确认密码

]
1.3.2 前端实现校验确认密码
    // 确认密码的校验方法
    let validateConfirmPass = (rule, value, callback) => {
      console.log("校验确认密码,规则", rule, "二次输入的密码", value, "回调函数", callback)
      // TODO 校验确认密码
      // 失败 return callback(new Error("字母开头,长度5-16之间,允许字母数字下划线"));
      // 成功 return callback();
      this.$axios.post("/user/check/pawd/",
      {"pawd":this.RegisterUser.pass,
      "pwd":value}).then((result) => {
        if(result.data.code == 200){
          return callback()
        }else{
          return callback(new Error(result.data.msg))
        }
      }).catch((err) => {
        console.log(err)
      });
    };

1.4 校验手机号

1.4.1 后端实现校验手机号

校验手机号需要用到正则表达式进行判断,输入的手机号是否符合手机号格式或手机号长度是否符合

# 手机电话号码
class CheckMobile(APIView):
    def get(self,request,mobile):
        # 正则判断手机号
        rule = r'^1[3-9][0-9]{9}$'
        rs = re.findall(rule,mobile)
        # 如果不匹配
        if not rs:
            return Response({
                "code" : 400,
                "msg" : "手机号格式或长度不匹配"
            })
        # 在数据库查找手机号是否存在
        mobile_count = User.objects.filter(mobile=mobile).count()
        if mobile_count:
            return Response({
                "code" : 400,
                "msg" : "手机号已存在"
            })
        return Response({
            "code" : 200,
            "msg" : "手机号可用"
        })

写入路由

from django.urls import path
from users import views
urlpatterns = [
    path('check/username/<str:username>/',views.CheckUserNameView.as_view()),
    path("check/mobile/<str:mobile>/",views.CheckMobile.as_view()),
    path("check/password/",views.CheckPassword.as_view()),
    path("check/pawd/",views.CheckPawd.as_view()),

]
1.4.2 前端校验手机号
    // 手机号的校验方法
    let validateMobile = (rule, value, callback) => {
      console.log("校验手机号,规则", rule, "手机号", value, "回调函数", callback)
      // TODO 校验手机号
      // 失败 return callback(new Error("字母开头,长度5-16之间,允许字母数字下划线")); 
      // 成功 return callback();
      this.$axios.get("/user/check/mobile/" + value + '/').then((result) => {
        if(result.data.code == 200){
          return callback()
        }else{
          return callback(new Error(result.data.msg))
        }
      }).catch((err) => {
        console.log(err)
      });
    };

1.5 校验验证码

想要校验验证码,首先得生成验证码的图片

1.5.1 生成验证码图片

后端

通过django中的模块,生成随机数和图片

class VerImageView(APIView):
    def get(self,request,uuid):
        # 1.生成创建验证码需要的字符串
        code = str(random.randint(1000,9999))
        # 2.根据字符串生成图片
        from captcha.image import ImageCaptcha
        img = ImageCaptcha()
        img_pic = img.generate(code)
        print("生成的图片是",img_pic)
        # 把验证码存到redis
        r = redis.Redis(host="localhost",port=6379,password="123456")
        r.set(uuid,code,ex=3000)     #失效时间5分钟
        print(code)
        print(uuid)
        return HttpResponse(img_pic,content_type="image/png")

写入路由

from django.urls import path
from users import views
urlpatterns = [
    path('check/username/<str:username>/',views.CheckUserNameView.as_view()),
    path("check/mobile/<str:mobile>/",views.CheckMobile.as_view()),
    path("check/password/",views.CheckPassword.as_view()),
    path("check/pawd/",views.CheckPawd.as_view()),
    path("check/image/<str:uuid>/",views.VerImageView.as_view()),   #生成图片

]

1.5.2 校验验证码

后端

需要从页面获取验证码,并且需要与验证码图片上的数字进行比较

class CheckCodeView(APIView):
    def post(self,request):
        # 从页面获取验证码和验证码图片上的字符串
        code = request.data.get("code")
        uuid = request.data.get("uuid")
        # 存入redis数据库中
        r = redis.Redis(host="localhost", port=6379, password="123456")
        sys_code = r.get(uuid)
        # 判断是否过期
        if not sys_code:
            return Response({
                "code" : 400,
                "msg" : "验证码过期"
            })
        sys_code_str = sys_code.decode()
        # 判断两者是否相等
        if sys_code_str != code:
            return Response({
                "code": 400,
                "msg": "验证码错误"
            })
        return Response({
            "code" : 200,
            "msg" : "验证通过"
        })

写入路由

from django.urls import path
from users import views
urlpatterns = [
    path('check/username/<str:username>/',views.CheckUserNameView.as_view()),
    path("check/mobile/<str:mobile>/",views.CheckMobile.as_view()),
    path("check/password/",views.CheckPassword.as_view()),
    path("check/pawd/",views.CheckPawd.as_view()),
    path("check/image/<str:uuid>/",views.VerImageView.as_view()),
    path("check/img/code/",views.CheckCodeView.as_view()),  #校验验证码
]
前端
    // 校验图片验证码
    let validateImageCode = (rule, value, callback) => {
      console.log("校验验证码,规则", rule, "二验证码", value, "回调函数", callback)
      // TODO 校验验证码
      // 失败 return callback(new Error("字母开头,长度5-16之间,允许字母数字下划线"));
      // 成功 return callback();
      this.$axios.post("/user/check/img/code/",{
        "uuid" : this.imageCodeID,"code" : value
      }).then((result) => {
        if(result.data.code == 200){
            return callback()
        }else{
          return callback(new Error(result.data.msg))
        }
      }).catch((err) => {
        console.log(err)
        alert("页面错误")
      });
    };

1.6 注册按钮

1.6.1 后端实现注册

从页面获取用户名,密码,手机号以及是否勾选用户协议

class RegView(APIView):
    def post(self,request):
        # 获取用户名,密码,电话号码
        username = request.data.get("username")
        password = request.data.get("password")
        mobile = request.data.get("mobile")
        agree = request.data.get("agree")
        # 判断是否勾选协议
        if not int(agree):
            return Response({
                "code" : 400,
                "msg" : "请勾选协议"
            })
        # 判断用户名,密码,手机号是否为空
        if not username or not password or not mobile:
            return Response({
                "code" : 400,
                "msg" : "参数输入错误"
            })
        # 尝试将数据添加到数据库中
        try:
            User.objects.create(
                username = username,
                password = password,
                mobile = mobile
            )
            return Response({
                "code": 200,
                "msg": "注册成功"
            })
        # 失败
        except Exception as e:
            print(e)
            return Response({
                "code" : 400,
                "msg" : "注册失败"
            })

写入路由

from django.urls import path
from users import views
urlpatterns = [
    path('check/username/<str:username>/',views.CheckUserNameView.as_view()),
    path("check/mobile/<str:mobile>/",views.CheckMobile.as_view()),
    path("check/password/",views.CheckPassword.as_view()),
    path("check/pawd/",views.CheckPawd.as_view()),
    path("check/image/<str:uuid>/",views.VerImageView.as_view()),
    path("check/img/code/",views.CheckCodeView.as_view()),
    path("reg/",views.RegView.as_view()),   #注册
]
1.6.1 前端实现注册按钮
    Register() {
      // 是否同意用户协议
      if (!this.aggree) {
        this.flag = true
        return
      }
      // 已勾选,则不显示提示信息
      this.flag = false
      // 通过element自定义表单校验规则,校验用户输入的用户信息
      this.$refs["ruleForm"].validate((valid) => {
        if (valid) {
          // TODO 注册用户
          this.$axios.post("/user/reg/",{
            "username" : this.RegisterUser.name,
            "password" : this.RegisterUser.pass,
            "mobile" : this.RegisterUser.mobile,
            "agree" : this.aggree,
          }).then((result) => {
            if(result.data.code == 200){
              this.RegisterUser.name = ""
              this.RegisterUser.pass = ""
              this.RegisterUser.mobile = ""
              this.RegisterUser.confirmPass = ""
              this.RegisterUser.imageCode = ""
              this.aggree = false

              // 关闭注册弹窗
              this.isRegister = false

              this.notifySucceed(result.data.msg);
            }else{
              this.notifyError(result.data.msg)
            }
          }).catch((err) => {
            console.log(err)
            alert("页面错误")
          });
        } else {
          return false;
        }
      });
    },
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值