44 :copyright: © 2020 by the Lin team.
55 :license: MIT, see LICENSE for more details.
66"""
7- from flask import Blueprint , current_app , request
7+ from flask import Blueprint , current_app , g , request
88from flask_jwt_extended import (
99 create_access_token ,
1010 create_refresh_token ,
3232
3333from app .api import AuthorizationBearerSecurity , api
3434from app .api .cms .exception import RefreshFailed
35- from app .api .cms .schema .user import CaptchaSchema , LoginSchema , LoginTokenSchema
36- from app .api .cms .validator import (
37- ChangePasswordForm ,
38- LoginForm ,
39- RegisterForm ,
40- UpdateInfoForm ,
35+ from app .api .cms .schema .user import (
36+ CaptchaSchema ,
37+ ChangePasswordSchema ,
38+ LoginSchema ,
39+ LoginTokenSchema ,
40+ UserBaseInfoSchema ,
41+ UserPermissionSchema ,
42+ UserRegisterSchema ,
43+ UserSchema ,
4144)
4245from app .util .captcha import CaptchaTool
4346from app .util .common import split_group
5255@api .validate (
5356 tags = ["用户" ],
5457 security = [AuthorizationBearerSecurity ],
55- resp = DocResponse (Success ("用户创建成功" )),
58+ resp = DocResponse (Success ("用户创建成功" ), Duplicated ( "字段重复,请重新输入" ) ),
5659)
57- def register ():
60+ def register (json : UserRegisterSchema ):
5861 """
5962 注册新用户
6063 """
61- form = RegisterForm ().validate_for_api ()
62- if manager .user_model .count_by_username (form .username .data ) > 0 :
64+ if manager .user_model .count_by_username (g .username ) > 0 :
6365 raise Duplicated ("用户名重复,请重新输入" ) # type: ignore
64- if form .email . data and form .email . data .strip () != "" :
65- if manager .user_model .count_by_email (form .email . data ) > 0 :
66+ if g .email and g .email .strip () != "" :
67+ if manager .user_model .count_by_email (g .email ) > 0 :
6668 raise Duplicated ("注册邮箱重复,请重新输入" ) # type: ignore
67- _register_user (form )
69+ # create a user
70+ with db .auto_commit ():
71+ user = manager .user_model ()
72+ user .username = g .username
73+ if g .email and g .email .strip () != "" :
74+ user .email = g .email
75+ db .session .add (user )
76+ db .session .flush ()
77+ user .password = g .password
78+ group_ids = g .group_ids
79+ # 如果没传分组数据,则将其设定为 guest 分组
80+ if len (group_ids ) == 0 :
81+ from lin import GroupLevelEnum
82+
83+ group_ids = [GroupLevelEnum .GUEST .value ]
84+ for group_id in group_ids :
85+ user_group = manager .user_group_model ()
86+ user_group .user_id = user .id
87+ user_group .group_id = group_id
88+ db .session .add (user_group )
89+
6890 return Success ("用户创建成功" ) # type: ignore
6991
7092
@@ -74,16 +96,15 @@ def login(json: LoginSchema):
7496 """
7597 用户登录
7698 """
77- form = LoginForm ().validate_for_api ()
7899 # 校对验证码
79100 if current_app .config .get ("LOGIN_CAPTCHA" ):
80101 tag = request .headers .get ("tag" )
81102 secret_key = current_app .config .get ("SECRET_KEY" )
82103 serializer = JWSSerializer (secret_key )
83- if form .captcha . data != serializer .loads (tag ):
104+ if g .captcha != serializer .loads (tag ):
84105 raise Failed ("验证码校验失败" ) # type: ignore
85106
86- user = manager .user_model .verify (form .username . data , form .password . data )
107+ user = manager .user_model .verify (g .username , g .password )
87108 # 用户未登录,此处不能用装饰器记录日志
88109 Log .create_log (
89110 message = f"{ user .username } 登录成功获取了令牌" ,
@@ -105,29 +126,26 @@ def login(json: LoginSchema):
105126@api .validate (
106127 tags = ["用户" ],
107128 security = [AuthorizationBearerSecurity ],
129+ resp = DocResponse (Success ("用户信息更新成功" ), ParameterError ("邮箱已被注册,请重新输入邮箱" )),
108130)
109- def update ():
131+ def update (json : UserBaseInfoSchema ):
110132 """
111133 更新用户信息
112134 """
113- form = UpdateInfoForm ().validate_for_api ()
114135 user = get_current_user ()
115- email = form .email .data
116- nickname = form .nickname .data
117- avatar = form .avatar .data
118136
119- if email and user .email != email :
120- exists = manager .user_model .get (email = form .email . data )
137+ if g . email and user .email != g . email :
138+ exists = manager .user_model .get (email = g .email )
121139 if exists :
122140 raise ParameterError ("邮箱已被注册,请重新输入邮箱" )
123141 with db .auto_commit ():
124- if email :
125- user .email = form .email . data
126- if nickname :
127- user .nickname = form .nickname . data
128- if avatar :
129- user ._avatar = form .avatar . data
130- return Success ("操作成功 " )
142+ if g . email :
143+ user .email = g .email
144+ if g . nickname :
145+ user .nickname = g .nickname
146+ if g . avatar :
147+ user ._avatar = g .avatar
148+ return Success ("用户信息更新成功 " )
131149
132150
133151@user_api .route ("/change_password" , methods = ["PUT" ])
@@ -137,14 +155,14 @@ def update():
137155@api .validate (
138156 tags = ["用户" ],
139157 security = [AuthorizationBearerSecurity ],
158+ resp = DocResponse (Success ("密码修改成功" ), Failed ("密码修改失败" )),
140159)
141- def change_password ():
160+ def change_password (json : ChangePasswordSchema ):
142161 """
143162 修改密码
144163 """
145- form = ChangePasswordForm ().validate_for_api ()
146164 user = get_current_user ()
147- ok = user .change_password (form .old_password . data , form .new_password . data )
165+ ok = user .change_password (g .old_password , g .new_password )
148166 if ok :
149167 db .session .commit ()
150168 return Success ("密码修改成功" )
@@ -158,6 +176,7 @@ def change_password():
158176@api .validate (
159177 tags = ["用户" ],
160178 security = [AuthorizationBearerSecurity ],
179+ resp = DocResponse (r = UserSchema ),
161180)
162181def get_information ():
163182 """
@@ -197,6 +216,7 @@ def refresh():
197216@api .validate (
198217 tags = ["用户" ],
199218 security = [AuthorizationBearerSecurity ],
219+ resp = DocResponse (r = UserPermissionSchema ),
200220)
201221def get_allowed_apis ():
202222 """
@@ -218,28 +238,6 @@ def get_allowed_apis():
218238 return user
219239
220240
221- def _register_user (form : RegisterForm ):
222- with db .auto_commit ():
223- user = manager .user_model ()
224- user .username = form .username .data
225- if form .email .data and form .email .data .strip () != "" :
226- user .email = form .email .data
227- db .session .add (user )
228- db .session .flush ()
229- user .password = form .password .data
230- group_ids = form .group_ids .data
231- # 如果没传分组数据,则将其设定为 guest 分组
232- if len (group_ids ) == 0 :
233- from lin import GroupLevelEnum
234-
235- group_ids = [GroupLevelEnum .GUEST .value ]
236- for group_id in group_ids :
237- user_group = manager .user_group_model ()
238- user_group .user_id = user .id
239- user_group .group_id = group_id
240- db .session .add (user_group )
241-
242-
243241@user_api .route ("/captcha" , methods = ["GET" , "POST" ])
244242@api .validate (
245243 resp = DocResponse (r = CaptchaSchema ),
0 commit comments