redis默认有16个 数据库(0-15) select 3 切换到数据库3
info 查看redis服务的信息 info replication查看主从复制的状况
keys * 查看所有的key, 生产环境中不使用 可能阻塞redis
查看key的数据类型 type key1
key 是否存在 exists key1
删除一个key del key1
重命名 rename key key1
flushdb # 清空当前数据库
flushall # 清空所有数据库
二、git 常用命令1.初始化仓库:git init
2.查看状态:git status
3.添加文件:git add 文件名(*指的是全部)
4.配置个人信息:
git config user.name 你的名字
git config user.email 你的邮箱
5.提交代码:git commit -m 版本信息
6.查看日志信息:git log --oneline
7.回退:git reset --hard HEAD/版本号
8.关联远程仓库:git remote add origin ‘码云地址’
9.提交代码到远程仓库:git push -u origin "master"
10.获取远程仓库的代码:git pull origin master
11.分支操作:
#查看分支 git branch
#创建分支 git branch b1
#切换到b1分支 git switch b1
#将b1分支合并到master git switch master git merge b1
三、django,vue前后端注册代码1.手机号跟用户名判断是否重复
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
import re
from user.models import User
# Create your views here.
# 用户名
class CheckUsername(APIView):
def get(self,request,username):
# 1.判断用户名格式
# 要求字母开头,中间为字母,数字,下划线,长度5-16
if not re.findall(r'^[a-zA-Z]w{4,15}$',username):
return Response({
'code':404,
'msg':'用户名格式不正确'
})
# 2.判断用户是否存在
if User.objects.filter(username=username):
return Response({'msg':'用户名重复','code':400})
else:
return Response({'msg':'ok','code':200})
# 手机号
class MobileAPIView(APIView):
def get(self,request,mobile):
# 1. 判断手机号格式是否满足要求
if not re.findall(r'^1[3-9]d{9}$',mobile):
return Response({
'msg':'手机号格式不正确',
'code':404
})
# 2. 判断手机号是否存在
if User.objects.filter(mobile=mobile):
return Response({
'msg':'手机号重复',
'code':400
})
else:
return Response({
'msg':'ok',
'code':200
})
2.前端用户名手机号,判断密码是否一致请求
// 用户名的校验方法
let validateName = (rule, value, callback) => {
if (!value) {
return callback(new Error("用户名不能为空"));
}
// 用户名以字母开头,长度在5-16之间,允许字母数字下划线
const userNameRule = /^[a-zA-Z][a-zA-Z0-9_]{4,15}$/;
if (userNameRule.test(value)) {
// 前端校验,用户名复合规则
//请求后端, 判断用户名是否重复
this.$axios
.get("/users/check/username/" + value + "/"
)
.then((res) => {
// 200代表用户名不重复,可以注册
console.log("校验用户名是否重复:", res);
if (res.data.code == 200) {
this.$refs.ruleForm.validateField("checkPass");
return callback();
} else {
// 用户名重复或者不符合规则
return callback(new Error(res.data.msg));
}
})
.catch((err) => {
return Promise.reject(err);
});
} else {
// 前端校验,用户名不符合规则
return callback(new Error("字母开头,长度5-16之间,允许字母数字下划线"));
}
};
// 手机号的校验方法
let validateMobile = (rule, value, callback) => {
if (value === "") {
return callback(new Error("请输入手机号"));
}
// 手机号以1开头,第二位3-9之间的数字,长度为11,只允许数字
const mobileRule = /^1[3-9]d{9}$/;
if (mobileRule.test(value)) {
this.$axios.get("/users/check/mobile/" + this.RegisterUser.mobile + "/")
.then(res=>{
console.log("验证手机号是否可用:", res)
if(res.data.code == 200){
this.$refs.ruleForm.validateField("checkPass");
return callback();
}else{
return callback(new Error(res.data.msg))
}
}).catch(err=>{
return Promise.reject(err)
})
} else {
return callback(new Error("手机号不符合格式"));
}
};
// 密码的校验方法
let validatePass = (rule, value, callback) => {
if (value === "") {
return callback(new Error("请输入密码"));
}
// 密码以字母开头,长度在6-18之间,允许字母数字和下划线
const passwordRule = /^[a-zA-Z]w{5,17}$/;
if (passwordRule.test(value)) {
this.$refs.ruleForm.validateField("checkPass");
return callback();
} else {
return callback(
new Error("字母开头,长度6-18之间,允许字母数字和下划线")
);
}
};
// 确认密码的校验方法
let validateConfirmPass = (rule, value, callback) => {
if (value === "") {
return callback(new Error("请输入确认密码"));
}
// 校验是否以密码一致
if (this.RegisterUser.pass != "" && value === this.RegisterUser.pass) {
this.$refs.ruleForm.validateField("checkPass");
return callback();
} else {
return callback(new Error("两次输入的密码不一致"));
}
};
3.django后端实现图形验证码及注册功能
# 图形验证码
class ImgCode(APIView):
def get(self,request,uuid):
# 1.生成4位验证码
# string.ascii_letters 随机字母 a-zA-Z
# string.digits 随机数字 0-9
code = ''.join(random.sample(string.ascii_letters+string.digits,4))
# 2.生成图形验证码
cap = ImageCaptcha() # 定义对象
img_code = cap.generate(code) # 生成图形验证码 de 图片
# 3.保存验证码
r = redis.Redis(host='localhost',port=6379,password='password',db=0)
r.set(uuid,code,ex=60)
r.close()
# 4.返回图形验证码,使用httpResponse返回,需要加上数据类型context_type
return HttpResponse(img_code,content_type='image/png')
# 校验图形验证码
class CheckImageCode(APIView):
def post(self,request):
# 1.提取get参数中的uuid和验证码
uuid = request.data.get('imageCodeID')
img_code = request.data.get('imageCode')
# 2.读取redis数据库中的验证码
r = redis.Redis(host='localhost',password='password',port=6379,db=0)
r_code = r.get(uuid).decode()
if not r_code:
return Response({
'msg':'验证码过期',
'code':204
})
# redis数据库中存的是二进制
# lower()都转换为小写
# decode()解码
if img_code.lower() == r_code.lower():
return Response({'msg':'ok','code':200})
else:
return Response({'msg':'验证码错误','code':404})
# 用户注册
class Register(APIView):
def post(self,request):
# 获取前端提交数据
username = request.data.get('userName')
pwd = request.data.get('pwd')
mobile = request.data.get('mobile')
aggree = request.data.get('aggree')
# 2.判断数据是否齐全
if not all([username,pwd,mobile]):
return Response({
'msg':'用户的注册信息不完整',
'code':204
})
# 3.判断是否同意协议
if not aggree:
return Response({
'msg':'用户未同意协议',
'code':204
})
# 4.往数据库中保存数据 create_user是AbstractUser提供的注册方法,会对密码进行加密
User.objects.create_user(username=username,password=pwd,mobile=mobile)
return Response({'msg':'注册成功','code':200})
4.vue前端实现图形验证码及用户注册
// 校验图片验证码
let validateImageCode = (rule, value, callback) => {
if (value === "") {
return callback(new Error("请输入图片验证码"));
}
// 图片验证码是由字母、数字组成,长度为4
const iamgeCodeRule = /^[a-zA-Z0-9]{4}$/;
if (iamgeCodeRule.test(value)) {
this.$axios.post("/users/check_image_code/", {imageCode:this.RegisterUser.imageCode,imageCodeID:this.imageCodeID})
// this.$axios.post("/users/test/", {username:'laufing1', password:"laufing123",mobile:123})
.then(res => {
if(res.data.code == 200){
this.$refs.ruleForm.validateField("checkPass");
return callback();
}else{
return callback(new Error(res.data.msg))
}
}).catch(err => {
return Promise.reject(err)
})
} else {
return callback(new Error("图片验证码不正确!"));
}
};
// 用户注册
Register() {
// 是否同意用户协议
if(!this.aggree){
this.flag = true
return
}
// 已勾选,则不显示提示信息
this.flag = false
// 通过element自定义表单校验规则,校验用户输入的用户信息
this.$refs["ruleForm"].validate((valid) => {
//如果通过校验开始注册
if (valid) {
this.$axios
.post("/users/register/", {
userName: this.RegisterUser.name,
pwd: this.RegisterUser.pass,
mobile: this.RegisterUser.mobile,
aggree: this.aggree,
})
.then((res) => {
// 200代表注册成功,其他的均为失败
if (res.data.code == 200) {
// 隐藏注册组件
this.isRegister = false;
// 弹出通知框提示注册成功信息
this.notifySucceed(res.data.msg);
} else {
// 弹出通知框提示注册失败信息
this.notifyError(res.data.msg);
}
})
.catch((err) => {
return Promise.reject(err);
});
} else {
return false;
}
});
},
四、登录及退出登录
from django.db.models import Q
# 用户登录
class Login(APIView):
def post(self,request):
username = request.data.get('username')
pwd = request.data.get('password')
try:
user = User.objects.get(Q(username=username)|Q(mobile=username))
except Exception as e:
print(e)
return Response({
'msg': '用户名不存在',
'code': 204
})
if not user.check_password(pwd):
return Response({
'msg':'用户名或密码不正确',
'code':204
})
token = generate_jwt_token(user)
return Response({
'msg':'登录成功',
'code':200,
'user':{
'username':user.username,
'uid':user.id
},
'token':token,
})
# jwt token
def generate_jwt_token(user):
payload = {
'id':user.id,
'username':user.username,
'mobile':user.mobile,
'exp':datetime.datetime.now() + datetime.timedelta(seconds=300)
}
# 进行加密,生成 jwt token
token = jwt.encode(payload=payload,key=settings.SECRET_KEY,algorithm='HS256')
# 返回token
return token
// 退出登录
logout() {
// 不显示退出登录框
this.visible = false;
this.$axios.get("/users/exit/").then((res) => {
console.log("@@退出登录的响应:", res);
if (res.data.code == 200) {
// 清空本地登录信息
// localStorage.setItem("user", "");
localStorage.removeItem("user");
localStorage.removeItem("token")
// 清空vuex登录信息
this.setUser("");
this.notifySucceed("成功退出登录");
} else {
console.log("退出请求失败")
}
}).catch(err => {
return Promise.reject(err)
})
},
// 点击登录触发
Login() {
// 通过element自定义表单校验规则,校验用户输入的用户信息
this.$refs["ruleForm"].validate(valid => {
//如果通过校验开始登录
if (valid) {
// 发送ajax
this.$axios.post("/users/login/", {
user: this.LoginUser.name,
pwd: this.LoginUser.pass,
// withCredentials: true,
})
.then(res => {
console.log("@@登录的响应:", res)
// 200代表登录成功,其他的均为失败
if (res.data.code == 200) {
// res.data为后端响应的json
// 隐藏登录组件
this.isLogin = false;
// 登录信息存到本地缓存
let user = JSON.stringify(res.data.user);
console.log("@@user", user)
//要求后台返回什么样的数据?
//{
// "code":200,
// 'msg': "欢迎user",
// "user":{
// userName:"xxx",
// },
//
//}
// 前端存储用户信息,表示登录成功
localStorage.setItem("user", user);
localStorage.setItem("token", res.data.token)
// sessionStorage.setItem("")
// 登录信息存到vuex,控制页面欢迎信息
// console.log("@@res.data.user", res.data.user)
this.setUser(res.data.user);
// 弹出通知框提示登录成功信息
this.notifySucceed(res.data.msg);
} else {//响应不是200
// 清空输入框的校验状态
this.$refs["ruleForm"].resetFields();
// 弹出通知框提示登录失败信息
this.notifyError(res.data.msg);
}
})
.catch(err => {
console.log(err)
return Promise.reject(err);
});
} else {//未通过用户校验
return false;
}
});
}



