2424 AddUserRoleParam ,
2525 UpdateUserParam ,
2626)
27- from backend .common . security . jwt import get_hash_password
27+ from backend .app . admin . utils . password_security import get_hash_password
2828from backend .plugin .oauth2 .crud .crud_user_social import user_social_dao
2929from backend .utils .serializers import select_join_serialize
3030from backend .utils .timezone import timezone
@@ -63,15 +63,47 @@ async def get_by_nickname(self, db: AsyncSession, nickname: str) -> User | None:
6363 """
6464 return await self .select_model_by_column (db , nickname = nickname )
6565
66- async def update_login_time (self , db : AsyncSession , username : str ) -> int :
66+ async def check_email (self , db : AsyncSession , email : str ) -> User | None :
6767 """
68- 更新用户最后登录时间
68+ 检查邮箱是否已被绑定
6969
7070 :param db: 数据库会话
71+ :param email: 电子邮箱
72+ :return:
73+ """
74+ return await self .select_model_by_column (db , email = email )
75+
76+ async def get_select (self , dept : int | None , username : str | None , phone : str | None , status : int | None ) -> Select :
77+ """
78+ 获取用户列表查询表达式
79+
80+ :param dept: 部门 ID
7181 :param username: 用户名
82+ :param phone: 电话号码
83+ :param status: 用户状态
7284 :return:
7385 """
74- return await self .update_model_by_column (db , {'last_login_time' : timezone .now ()}, username = username )
86+ filters = {}
87+
88+ if dept :
89+ filters ['dept_id' ] = dept
90+ if username :
91+ filters ['username__like' ] = f'%{ username } %'
92+ if phone :
93+ filters ['phone__like' ] = f'%{ phone } %'
94+ if status is not None :
95+ filters ['status' ] = status
96+
97+ return await self .select_order (
98+ 'id' ,
99+ 'desc' ,
100+ join_conditions = [
101+ JoinConfig (model = Dept , join_on = Dept .id == self .model .dept_id , fill_result = True ),
102+ JoinConfig (model = user_role , join_on = user_role .c .user_id == self .model .id ),
103+ JoinConfig (model = Role , join_on = Role .id == user_role .c .role_id , fill_result = True ),
104+ ],
105+ ** filters ,
106+ )
75107
76108 async def add (self , db : AsyncSession , obj : AddUserParam ) -> None :
77109 """
@@ -119,90 +151,85 @@ async def add_by_oauth2(self, db: AsyncSession, obj: AddOAuth2UserParam) -> None
119151 user_role_stmt = insert (user_role ).values (AddUserRoleParam (user_id = new_user .id , role_id = role .id ).model_dump ())
120152 await db .execute (user_role_stmt )
121153
122- async def update (self , db : AsyncSession , input_user : User , obj : UpdateUserParam ) -> int :
154+ async def update (self , db : AsyncSession , user_id : int , obj : UpdateUserParam ) -> int :
123155 """
124156 更新用户信息
125157
126158 :param db: 数据库会话
127- :param input_user : 用户 ID
159+ :param user_id : 用户 ID
128160 :param obj: 更新用户参数
129161 :return:
130162 """
131163 role_ids = obj .roles
132164 del obj .roles
133165
134- count = await self .update_model (db , input_user . id , obj )
166+ count = await self .update_model (db , user_id , obj )
135167
136168 role_stmt = select (Role ).where (Role .id .in_ (role_ids ))
137169 result = await db .execute (role_stmt )
138170 roles = result .scalars ().all ()
139171
140- user_role_stmt = delete (user_role ).where (user_role .c .user_id == input_user . id )
172+ user_role_stmt = delete (user_role ).where (user_role .c .user_id == user_id )
141173 await db .execute (user_role_stmt )
142174
143- user_role_data = [AddUserRoleParam (user_id = input_user . id , role_id = role .id ).model_dump () for role in roles ]
175+ user_role_data = [AddUserRoleParam (user_id = user_id , role_id = role .id ).model_dump () for role in roles ]
144176 user_role_stmt = insert (user_role )
145177 await db .execute (user_role_stmt , user_role_data )
146178
147179 return count
148180
149- async def update_nickname (self , db : AsyncSession , user_id : int , nickname : str ) -> int :
181+ async def update_login_time (self , db : AsyncSession , username : str ) -> int :
150182 """
151- 更新用户昵称
183+ 更新用户上次登录时间
152184
153185 :param db: 数据库会话
154- :param user_id: 用户 ID
155- :param nickname: 用户昵称
186+ :param username: 用户名
156187 :return:
157188 """
158- return await self .update_model (db , user_id , { 'nickname ' : nickname } )
189+ return await self .update_model_by_column (db , { 'last_login_time ' : timezone . now ()}, username = username )
159190
160- async def update_avatar (self , db : AsyncSession , user_id : int , avatar : str ) -> int :
191+ async def update_password_changed_time (self , db : AsyncSession , user_id : int ) -> int :
161192 """
162- 更新用户头像
193+ 更新用户上次密码变更时间
163194
164195 :param db: 数据库会话
165196 :param user_id: 用户 ID
166- :param avatar: 头像地址
167197 :return:
168198 """
169- return await self .update_model (db , user_id , {'avatar ' : avatar })
199+ return await self .update_model (db , user_id , {'last_password_changed_time ' : timezone . now () })
170200
171- async def update_email (self , db : AsyncSession , user_id : int , email : str ) -> int :
201+ async def update_nickname (self , db : AsyncSession , user_id : int , nickname : str ) -> int :
172202 """
173- 更新用户邮箱
203+ 更新用户昵称
174204
175205 :param db: 数据库会话
176206 :param user_id: 用户 ID
177- :param email: 邮箱
207+ :param nickname: 用户昵称
178208 :return:
179209 """
180- return await self .update_model (db , user_id , {'email ' : email })
210+ return await self .update_model (db , user_id , {'nickname ' : nickname })
181211
182- async def delete (self , db : AsyncSession , user_id : int ) -> int :
212+ async def update_avatar (self , db : AsyncSession , user_id : int , avatar : str ) -> int :
183213 """
184- 删除用户
214+ 更新用户头像
185215
186216 :param db: 数据库会话
187217 :param user_id: 用户 ID
218+ :param avatar: 头像地址
188219 :return:
189220 """
190- user_role_stmt = delete (user_role ).where (user_role .c .user_id == user_id )
191- await db .execute (user_role_stmt )
192-
193- await user_social_dao .delete_by_user_id (db , user_id )
194-
195- return await self .delete_model (db , user_id )
221+ return await self .update_model (db , user_id , {'avatar' : avatar })
196222
197- async def check_email (self , db : AsyncSession , email : str ) -> User | None :
223+ async def update_email (self , db : AsyncSession , user_id : int , email : str ) -> int :
198224 """
199- 检查邮箱是否已被绑定
225+ 更新用户邮箱
200226
201227 :param db: 数据库会话
202- :param email: 电子邮箱
228+ :param user_id: 用户 ID
229+ :param email: 邮箱
203230 :return:
204231 """
205- return await self .select_model_by_column (db , email = email )
232+ return await self .update_model (db , user_id , { ' email' : email } )
206233
207234 async def reset_password (self , db : AsyncSession , pk : int , password : str ) -> int :
208235 """
@@ -215,39 +242,7 @@ async def reset_password(self, db: AsyncSession, pk: int, password: str) -> int:
215242 """
216243 salt = bcrypt .gensalt ()
217244 new_pwd = get_hash_password (password , salt )
218- return await self .update_model (db , pk , {'password' : new_pwd , 'salt' : salt })
219-
220- async def get_select (self , dept : int | None , username : str | None , phone : str | None , status : int | None ) -> Select :
221- """
222- 获取用户列表查询表达式
223-
224- :param dept: 部门 ID
225- :param username: 用户名
226- :param phone: 电话号码
227- :param status: 用户状态
228- :return:
229- """
230- filters = {}
231-
232- if dept :
233- filters ['dept_id' ] = dept
234- if username :
235- filters ['username__like' ] = f'%{ username } %'
236- if phone :
237- filters ['phone__like' ] = f'%{ phone } %'
238- if status is not None :
239- filters ['status' ] = status
240-
241- return await self .select_order (
242- 'id' ,
243- 'desc' ,
244- join_conditions = [
245- JoinConfig (model = Dept , join_on = Dept .id == self .model .dept_id , fill_result = True ),
246- JoinConfig (model = user_role , join_on = user_role .c .user_id == self .model .id ),
247- JoinConfig (model = Role , join_on = Role .id == user_role .c .role_id , fill_result = True ),
248- ],
249- ** filters ,
250- )
245+ return await self .update_model (db , pk , {'password' : new_pwd , 'salt' : salt }, flush = True )
251246
252247 async def set_super (self , db : AsyncSession , user_id : int , * , is_super : bool ) -> int :
253248 """
@@ -293,6 +288,21 @@ async def set_multi_login(self, db: AsyncSession, user_id: int, *, multi_login:
293288 """
294289 return await self .update_model (db , user_id , {'is_multi_login' : multi_login })
295290
291+ async def delete (self , db : AsyncSession , user_id : int ) -> int :
292+ """
293+ 删除用户
294+
295+ :param db: 数据库会话
296+ :param user_id: 用户 ID
297+ :return:
298+ """
299+ user_role_stmt = delete (user_role ).where (user_role .c .user_id == user_id )
300+ await db .execute (user_role_stmt )
301+
302+ await user_social_dao .delete_by_user_id (db , user_id )
303+
304+ return await self .delete_model (db , user_id )
305+
296306 async def get_join (
297307 self ,
298308 db : AsyncSession ,
0 commit comments