Django项目之电商购物商城 – 校验用户输入密码是否合法
需要开发文档和前端资料的可私聊
一. 创建用户逻辑操作
1. 创建用户app – users
python manage.py startapp users
2.注册app
'users.apps.UsersConfig',
3. 创建视图
from django.shortcuts import render
from django.views import View
class RegisterView(View):
def get(self , request):
return render(request , 'register.html')
def post(self , request):
pass
4. 分发路由
from django.urls import path
from users import views
urlpatterns = [
path('register/' , views.RegisterView.as_view())
]
注册界面展示
二. 创建用户模型类
-
创建用户模型类 , 继承Django原有user表
from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class User(AbstractUser): # 创建手机号字段 mobile = models.IntegerField(max_length=11 , unique=True) class Meta: db_table = 'User'
-
修改配置
AUTH_USER_MODEL = 'user.User'
-
迁移数据库
python manage.py makemigrations python manage.py migrate
三. 接受用户数据进行校验
1. 前端校验
let vm = new Vue({
// 通过ID选择器找到绑定的html标签的内容
el : '#app',
// 修改vue的模板语法
delimiters : ['[[',']]'],
data : {
// v-model
username:'',
password:'',
password2:'',
mobile:'',
allow:'',
image_code_url:'',
uuid:'',
image_code:'',
sms_code:'',
sms_code_tip:'获取短信验证码',
// 该变量作为标记,默认允许访问
sand_flag:false,
// v-show
error_name:false,
error_password:false,
error_password2:false,
error_mobile:false,
error_allow:false,
error_image_code:false,
error_sms_code:false,
// 自定义错误信息
error_name_message:'',
error_sms_code_message:'',
},
// 这个方法会在页面加载之后被调用
mounted(){
this.generate_image_code();
},
// 定义事件方法
methods:{
// 校验短信验证码
check_sms_code() {
if(this.sms_code.length != 5){
this.error_sms_code = true;
} else {
this.error_sms_code = false;
}
},
//发送短信验证码
send_sms_code() {
// 判断作为标记的变量是否允许访问
if (this.sand_flag == true ){
// 当标记为true时,说明短时间内已经发送请求了,不允许访问停止方法。
return;
}
// 标记允许访问,可以实现发送Ajax请求
// 修改标记为不允许访问的状态
this.sand_flag = true;
let url = '/ver/sms_code/'+this.mobile+'/?uuid='+this.uuid+'&image_code='+this.image_code;
axios.get(url ,{responseType: 'json'})
// 请求成功
.then(response => {
console.log(response.data.errsg)
// 实现发送短信验证码的倒计时
if (response.data.code == '0'){
let number = 60;
console.log(123)
let t = setInterval(() => {
console.log(4536)
// 倒计时结束
if(number == 1){
// 倒计时结束
// 停止回调函数的执行
clearInterval(t)
this.sms_code_tip = '获取短信验证码';
// 倒计时结束之后,重新生成图片验证码
this.generate_image_code();
// 倒计时结束,把标记修改为允许访问的状态
this.sand_flag = false;
} else {
number -= 1 ;
this.sms_code_tip = number +'秒';
}
} , 1000)
} else {
// 短信验证码发送失败
this.error_sms_code_message = response.data.errsg;
this.error_sms_code = true;
}
// 把标记修改为允许访问的状态
this.sand_flag = false;
})
// 请求失败
.catch(error =>{
console.log(error.response)
// 把标记修改为允许访问的状态
this.sand_flag = false;
})
},
// 校验图片验证码
check_image_code(){
if(this.image_code.length != 4){
this.error_image_code = true;
} else {
this.error_image_code = false;
}
},
// 生成 图片验证码的url
generate_image_code(){
// 通过生成uuid来对用户进行标识
this.uuid = generateUUID()
this.image_code_url = '/ver/image_code/'+this.uuid+'/'
},
// 校验用户名
check_username(){
// 定义用户名的规则
let re = /^[A-Za-z0-9_]{5,15}$/;
// 判断接收到的数据是否符合条件
if(re.test(this.username)){
// 数据合法
this.error_name = false;
} else {
// 用户名不合法
this.error_name = true;
this.error_name_message = "用户名不合法 , 应当使用A-Za-z0-9_"
}
// 判断用户是否重复
// 前提保证用户名合法
if(this.error_name == false){
// 发送ajax请求
let url = '/user/username/'+ this.username +'/count/';
axios.get(
url , {responseType :'json'}
)
// 请求成功
.then(response => {
// 获取后端传递过来的数据 response.data
if(response.data.count == 1){
// 用户已存在
this.error_name_message = '用户名已存在';
this.error_name = true;
} else {
this.error_name = false;
}
})
// 请求失败
.catch(error =>{
console.log(error.response)
})
}
},
// 校验密码
check_password(){
// 密码中合法的字符
let re=/^[0-9a-zA-Z]{6,20}$/;
if(re.test(this.password)){
// 符合要求 , 密码字符合法
this.error_password = false;
} else {
// 密码不合法 ,显示错误信息
this.error_password = true;
}
},
// 校验两次密码是否一致
check_password2(){
if(this.password2 == this.password){
this.error_password2 = false;
} else {
this.error_password2 = true;
}
},
// 校验手机号
check_mobile(){
let re =/^1[3-9]\d{9}$/;
if(re.test(this.mobile)){
this.error_mobile = false;
} else {
this.error_mobile = true;
}
},
// 校验勾选框是否勾选
check_allow(){
if(this.allow){
this.error_allow = false;
} else {
this.error_allow = true;
}
},
// 校验表单中数据是否全部合格
on_submit(){
// 调用所有校验数据的方法
this.check_username();
this.check_password();
this.check_password2();
this.check_mobile();
this.check_allow();
// 判断error的对应值是否为true , 如果其中有一个为true则限制提交
if(this.error_name == true || this.error_password == true ||
this.error_password2 == true || this.error_mobile == true || this.error_allow == true){
// 禁止表单提交
window.event.returnValue = false;
}
},
}
})
2. 后端校验数据是否合法, 两次输入密码是否一致 – 定义forms表单
-
在当前app中创建forms模块
from django import forms class RegisterForms(forms.Form): username = forms.CharField(min_length=5,max_length=15, error_messages={ "min_length":"用户名太短", "max_length":"用户名太长", "required":"用户名不允许为空" }) password = forms.CharField(min_length=6, max_length=20, error_messages={ "min_length": "密码名太短", "max_length": "密码名太长", "required": "密码不允许为空" }) password2 = forms.CharField(min_length=6, max_length=20, error_messages={ "min_length": "用户名太短", "max_length": "用户名太长", "required": "用户名不允许为空" }) mobile = forms.IntegerField(min_length=11, max_length=11, error_messages={ "min_length": "手机号不合法", "max_length": "手机号不合法", "required": "手机号不允许为空" }) # 校验两次输入是否一致 def clean(self): clean_data = super(RegisterForms, self).clean() pw = clean_data.get('password') pw2 = clean_data.get('password2') if pw != pw2: raise forms.ValidationError return clean_data
-
将forms组件传入视图进行数据校验
class RegisterView(View): def get(self , request): return render(request , 'register.html') def post(self , request): # 将用户数据传入forms组件进行校验 register_forms = RegisterForms(request.POST) # 这里先返回httpresponse进行测试 if register_forms.is_valid(): return HttpResponse("注册成功") return HttpResponse("注册失败")
下节介绍用户名重复校验 , 图形验证码制作 , 以及短信验证码生成