文章目录
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;
}
});
},