注册相关:
后端Flask代码:
import datetime
import re
from flask import request, jsonify, current_app, session
from info import sr, db
from info.response_code import RET
from info.models import User
from . import blue_passport
@blue_passport.route("/register", methods=["GET", "POST"])
def register():
"""
注册相关
1.接收参数(mobile, smscode, password)
2.校验参数(mobile, smscode, password)
2.1 校验所有参数是否存在
2.2 tel_number是否合法(re)
2.3 redis中是否存在tel_number对应的值
2.4 redis中取出的短信验证码与smscode是否一致
3.写入数据库(MySQL)
4.实现状态保持(session)
5.返回结果
:return:
"""
# 1.接收参数(mobile, smscode, password)
mobile = request.json.get("mobile")
smscode = request.json.get("smscode")
password = request.json.get("password")
# 2.校验参数(mobile, smscode, password)
# 2.1 校验所有参数是否存在
if not all([mobile, smscode, password]):
return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
# 2.2 tel_number是否合法(re)
if not re.findall("^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$", mobile.strip()):
return jsonify(errno=RET.PARAMERR, errmsg="手机号有误")
# 2.3 redis中是否存在tel_number对应的值
try:
smscode_server = sr.get("smsCodeTel:"+mobile)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg="数据库连接失败")
if not smscode_server:
return jsonify(errno=RET.DBERR, errmsg="验证失败")
# 2.4 redis中取出的短信验证码与smscode是否一致
if smscode != smscode_server:
return jsonify(errno=RET.PARAMERR, errmsg="手机验证码错误")
# 3.写入数据库(MySQL)
user = User()
user.nick_name = mobile
user.mobile = mobile
user.last_login = datetime.datetime.now()
user.pwd = password
try:
db.session.add(user)
db.session.commit()
except Exception as e:
current_app.logger.error(e)
db.session.rollback()
return jsonify(errno=RET.DBERR, errmsg="数据库写入失败")
# 4.实现状态保持(session)
session["id"] = user.id
session["mobile"] = user.mobile
session["nick_name"] = user.nick_name
# 5.返回结果
return jsonify(errno=RET.OK, errmsg="注册成功")
JS代码:
// TODO 注册按钮点击
$(".register_form_con").submit(function (e) {
// 阻止默认提交操作
e.preventDefault()
// 取到用户输入的内容
var mobile = $("#register_mobile").val()
var smscode = $("#smscode").val()
var password = $("#register_password").val()
if (!mobile) {
$("#register-mobile-err").show();
return;
}
if (!smscode) {
$("#register-sms-code-err").show();
return;
}
if (!password) {
$("#register-password-err").html("请填写密码!");
$("#register-password-err").show();
return;
}
if (password.length < 6) {
$("#register-password-err").html("密码长度不能少于6位");
$("#register-password-err").show();
return;
}
// 发起注册请求
var params = {
'mobile':mobile,
'smscode':smscode,
'password':password
};
$.ajax({
url:'/passport/register', // 请求地址
type:'post', // 请求方法
data:JSON.stringify(params), // 请求参数
contentType:'application/json',
headers:{'X-CSRFToken':getCookie('csrf_token')}, // 在请求头中带上csrf_token
success:function (response) {
if (response.errno == '0') {
// 注册成功
location.reload();
} else {
alert(response.errmsg);
}
}
});
})
数据库模型类:
class User(BaseModel, db.Model):
"""用户"""
__tablename__ = "info_user"
id = db.Column(db.Integer, primary_key=True) # 用户编号
nick_name = db.Column(db.String(32), unique=True, nullable=False) # 用户昵称
password_hash = db.Column(db.String(128), nullable=False) # 加密的密码
mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号
avatar_url = db.Column(db.String(256)) # 用户头像路径
last_login = db.Column(db.DateTime, default=datetime.now) # 最后一次登录时间
is_admin = db.Column(db.Boolean, default=False)
signature = db.Column(db.String(512)) # 用户签名
gender = db.Column( # 订单的状态
db.Enum(
"MAN", # 男
"WOMAN" # 女
),
default="MAN")
# 当前用户收藏的所有新闻
collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic") # 用户收藏的新闻
# 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人
followers = db.relationship('User',
secondary=tb_user_follows,
primaryjoin=id == tb_user_follows.c.followed_id,
secondaryjoin=id == tb_user_follows.c.follower_id,
backref=db.backref('followed', lazy='dynamic'),
lazy='dynamic')
# 当前用户所发布的新闻
news_list = db.relationship('News', backref='user', lazy='dynamic')
def to_dict(self):
resp_dict = {
"id": self.id,
"nick_name": self.nick_name,
"avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "",
"mobile": self.mobile,
"gender": self.gender if self.gender else "MAN",
"signature": self.signature if self.signature else "",
"followers_count": self.followers.count(),
"news_count": self.news_list.count()
}
return resp_dict
def to_admin_dict(self):
resp_dict = {
"id": self.id,
"nick_name": self.nick_name,
"mobile": self.mobile,
"register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"),
}
return resp_dict
@property
def pwd(self):
raise Exception("You can't read")
@pwd.setter
def pwd(self, value):
self.password_hash = generate_password_hash(value)
def check(self, value):
return check_password_hash(self.password_hash, value)