1.4登录功能的实现

首先我们还是先分析思路

1、接收参数(手机号,密码)

2、判断接收的参数是否齐全

3、判断手机号是否是合法的

  3.1用正则验证手机号的合法性

4、对比用户传入的密码和数据库的值进行对比

  4.1从数据库取值进行比较

5、更新session,提交数据

6、返回结果

以下是代码

 1 def login():
 2     #接收参数
 3     res_list = request.json
 4     mobile = res_list.get('mobile')
 5     password = res_list.get('password')
 6     #判断参数受否齐全
 7     if not all([mobile,password]):
 8         return jsonify(error=RET.PARAMERR,errmsg="缺失参数")
 9     #判断手机号是否合法
10     if not re.match("^1[37895][0-9]{9}$",mobile):
11         return jsonify(error=RET.PARAMERR, errmsg="非法手机号")
12     #从数据库中查询用户的信息,同时检测异常
13     try:
14         user = User.query.filter(User.mobile == mobile).first()
15     except Exception as e:
16         current_app.logger.error(e)
17         return jsonify(error=RET.DBERR, errmsg="数据库查询失败")
18     #判断密码是否正确
19     if not user.check_password(password):
20         return jsonify(error=RET.PARAMERR, errmsg="账号或者密码错误")
21     #修改session值以用于登录
22     session['id'] = user.id
23     session['nick_name'] = user.nick_name
24     session['mobile'] = user.mobile
25 
26     #更新用户最后一次登录时间
27     user.last_login = datetime.datetime.now()
28     #提交数据
29     try:
30         db.session.commit()
31     except Exception as e:
32         current_app.logger.error(e)
33         db.session.rollback()
34         return jsonify(error=RET.DATAERR,errmsg="数据库写入失败")
35     #返回结果
36     return jsonify(error=RET.OK, errmsg="登录成功")

其中在19行代码中我们调用了user.check_password(password)   check_password()这个函数,这个函数是我们自己在模型类中

定义的函数,用于对比密码的.

 1 class User(BaseModel, db.Model):
 2     """用户"""
 3     __tablename__ = "info_user"
 4 
 5     id = db.Column(db.Integer, primary_key=True)  # 用户编号
 6     nick_name = db.Column(db.String(32), unique=True, nullable=False)  # 用户昵称
 7     password_hash = db.Column(db.String(128), nullable=False)  # 加密的密码
 8     mobile = db.Column(db.String(11), unique=True, nullable=False)  # 手机号
 9     avatar_url = db.Column(db.String(256))  # 用户头像路径
10     last_login = db.Column(db.DateTime, default=datetime.now)  # 最后一次登录时间
11     is_admin = db.Column(db.Boolean, default=False)
12     signature = db.Column(db.String(512))  # 用户签名
13     gender = db.Column(  # 订单的状态
14         db.Enum(
15             "MAN",  #
16             "WOMAN"  #
17         ),
18         default="MAN")
19     @property
20     def password(self):
21         return "you can't read"
22     
23     @password.setter
24     def password(self, value):
25         self.password_hash = generate_password_hash(value)
26 
27     def check_password(self,value):
28         return check_password_hash(self.password_hash,value)

这里我们可以看到我们是直接在User类里面创建的这个方法,这里我们为了方便一点就用了@property这个装饰器

@property这个装饰器的作用就是将类中的方法变成属性,以便于可以直接用类名去调用

下面是前端的代码

 1 $(".login_form_con").submit(function (e) {
 2         e.preventDefault()
 3         var mobile = $(".login_form #mobile").val()
 4         var password = $(".login_form #password").val()
 5 
 6         if (!mobile) {
 7             $("#login-mobile-err").show();
 8             return;
 9         }
10 
11         if (!password) {
12             $("#login-password-err").show();
13             return;
14         }
15 
16         // 发起登录请求
17         var params = {
18             'mobile':mobile,
19             'password':password
20         };
21 
22         $.ajax({
23             url:'/passport/login',
24             type:'post',
25             data:JSON.stringify(params),
26             contentType:'application/json',
27             headers:{'X-CSRFToken':getCookie('csrf_token')}, // 在请求头中带上csrf_token
28             success:function (response) {
29                 if (response.errno == '0') {
30                     // 登录成功后刷新当前界面
31                     location.reload();
32                 } else {
33                     alert(response.errmsg);
34                 }
35             }
36         });
37     })
原文地址:https://www.cnblogs.com/Hdwmsyqdm/p/13894820.html