Skip to content

Commit ccfe35e

Browse files
authored
Simplify the user info update business (#638)
1 parent 4a118c1 commit ccfe35e

File tree

4 files changed

+13
-115
lines changed

4 files changed

+13
-115
lines changed

backend/app/admin/api/v1/sys/user.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@
66

77
from backend.app.admin.schema.user import (
88
AddUserParam,
9-
AvatarParam,
109
GetCurrentUserInfoWithRelationDetail,
1110
GetUserInfoWithRelationDetail,
1211
RegisterUserParam,
1312
ResetPasswordParam,
1413
UpdateUserParam,
15-
UpdateUserRoleParam,
1614
)
1715
from backend.app.admin.service.user_service import user_service
1816
from backend.common.pagination import DependsPagination, PageData, paging_data
@@ -70,31 +68,6 @@ async def update_user(
7068
return response_base.fail()
7169

7270

73-
@router.put(
74-
'/{username}/role',
75-
summary='更新用户角色',
76-
dependencies=[
77-
Depends(RequestPermission('sys:user:role:edit')),
78-
DependsRBAC,
79-
],
80-
)
81-
async def update_user_role(
82-
request: Request, username: Annotated[str, Path(description='用户名')], obj: UpdateUserRoleParam
83-
) -> ResponseModel:
84-
await user_service.update_roles(request=request, username=username, obj=obj)
85-
return response_base.success()
86-
87-
88-
@router.put('/{username}/avatar', summary='更新头像', dependencies=[DependsJwtAuth])
89-
async def update_avatar(
90-
request: Request, username: Annotated[str, Path(description='用户名')], avatar: AvatarParam
91-
) -> ResponseModel:
92-
count = await user_service.update_avatar(request=request, username=username, avatar=avatar)
93-
if count > 0:
94-
return response_base.success()
95-
return response_base.fail()
96-
97-
9871
@router.get(
9972
'',
10073
summary='分页获取所有用户',

backend/app/admin/crud/crud_user.py

Lines changed: 11 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@
1111
from backend.app.admin.model import Dept, Role, User
1212
from backend.app.admin.schema.user import (
1313
AddUserParam,
14-
AvatarParam,
1514
RegisterUserParam,
1615
UpdateUserParam,
17-
UpdateUserRoleParam,
1816
)
1917
from backend.common.security.jwt import get_hash_password
2018
from backend.utils.timezone import timezone
@@ -97,14 +95,13 @@ async def add(self, db: AsyncSession, obj: AddUserParam) -> None:
9795
dict_obj.update({'salt': salt})
9896
new_user = self.model(**dict_obj)
9997

100-
role_list = []
101-
for role_id in obj.roles:
102-
role_list.append(await db.get(Role, role_id))
103-
new_user.roles.extend(role_list)
98+
stmt = select(Role).where(Role.id.in_(obj.roles))
99+
roles = await db.execute(stmt)
100+
new_user.roles = roles.scalars().all()
104101

105102
db.add(new_user)
106103

107-
async def update_userinfo(self, db: AsyncSession, input_user: int, obj: UpdateUserParam) -> int:
104+
async def update(self, db: AsyncSession, input_user: User, obj: UpdateUserParam) -> int:
108105
"""
109106
更新用户信息
110107
@@ -113,36 +110,14 @@ async def update_userinfo(self, db: AsyncSession, input_user: int, obj: UpdateUs
113110
:param obj: 更新用户参数
114111
:return:
115112
"""
116-
return await self.update_model(db, input_user, obj)
113+
role_ids = obj.roles
114+
del obj.roles
115+
count = await self.update_model(db, input_user.id, obj)
117116

118-
@staticmethod
119-
async def update_role(db: AsyncSession, input_user: User, obj: UpdateUserRoleParam) -> None:
120-
"""
121-
更新用户角色
122-
123-
:param db: 数据库会话
124-
:param input_user: 用户对象
125-
:param obj: 更新角色参数
126-
:return:
127-
"""
128-
for i in list(input_user.roles):
129-
input_user.roles.remove(i)
130-
131-
role_list = []
132-
for role_id in obj.roles:
133-
role_list.append(await db.get(Role, role_id))
134-
input_user.roles.extend(role_list)
135-
136-
async def update_avatar(self, db: AsyncSession, input_user: int, avatar: AvatarParam) -> int:
137-
"""
138-
更新用户头像
139-
140-
:param db: 数据库会话
141-
:param input_user: 用户 ID
142-
:param avatar: 头像地址
143-
:return:
144-
"""
145-
return await self.update_model(db, input_user, {'avatar': str(avatar.url)})
117+
stmt = select(Role).where(Role.id.in_(role_ids))
118+
roles = await db.execute(stmt)
119+
input_user.roles = roles.scalars().all()
120+
return count
146121

147122
async def delete(self, db: AsyncSession, user_id: int) -> int:
148123
"""

backend/app/admin/schema/user.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,26 +55,17 @@ class UserInfoSchemaBase(SchemaBase):
5555
dept_id: int | None = Field(None, description='部门 ID')
5656
username: str = Field(description='用户名')
5757
nickname: str = Field(description='昵称')
58+
avatar: HttpUrl | None = Field(None, description='头像')
5859
email: EmailStr = Field(examples=['user@example.com'], description='邮箱')
5960
phone: CustomPhoneNumber | None = Field(None, description='手机号')
6061

6162

6263
class UpdateUserParam(UserInfoSchemaBase):
6364
"""更新用户参数"""
6465

65-
66-
class UpdateUserRoleParam(SchemaBase):
67-
"""更新用户角色参数"""
68-
6966
roles: list[int] = Field(description='角色 ID 列表')
7067

7168

72-
class AvatarParam(SchemaBase):
73-
"""更新头像参数"""
74-
75-
url: HttpUrl = Field(description='头像 http 地址')
76-
77-
7869
class GetUserInfoDetail(UserInfoSchemaBase):
7970
"""用户信息详情"""
8071

backend/app/admin/service/user_service.py

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,9 @@
1111
from backend.app.admin.model import User
1212
from backend.app.admin.schema.user import (
1313
AddUserParam,
14-
AvatarParam,
1514
RegisterUserParam,
1615
ResetPasswordParam,
1716
UpdateUserParam,
18-
UpdateUserRoleParam,
1917
)
2018
from backend.common.exception import errors
2119
from backend.common.security.jwt import get_hash_password, get_token, jwt_decode, password_verify, superuser_verify
@@ -152,50 +150,11 @@ async def update(*, request: Request, username: str, obj: UpdateUserParam) -> in
152150
email = await user_dao.check_email(db, obj.email)
153151
if email:
154152
raise errors.ForbiddenError(msg='邮箱已注册')
155-
count = await user_dao.update_userinfo(db, user.id, obj)
156-
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
157-
return count
158-
159-
@staticmethod
160-
async def update_roles(*, request: Request, username: str, obj: UpdateUserRoleParam) -> None:
161-
"""
162-
更新用户角色
163-
164-
:param request: FastAPI 请求对象
165-
:param username: 用户名
166-
:param obj: 角色更新参数
167-
:return:
168-
"""
169-
async with async_db_session.begin() as db:
170-
if not request.user.is_superuser and request.user.username != username:
171-
raise errors.ForbiddenError(msg='你只能修改自己的信息')
172-
input_user = await user_dao.get_with_relation(db, username=username)
173-
if not input_user:
174-
raise errors.NotFoundError(msg='用户不存在')
175153
for role_id in obj.roles:
176154
role = await role_dao.get(db, role_id)
177155
if not role:
178156
raise errors.NotFoundError(msg='角色不存在')
179-
await user_dao.update_role(db, input_user, obj)
180-
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{input_user.id}')
181-
182-
@staticmethod
183-
async def update_avatar(*, request: Request, username: str, avatar: AvatarParam) -> int:
184-
"""
185-
更新用户头像
186-
187-
:param request: FastAPI 请求对象
188-
:param username: 用户名
189-
:param avatar: 头像参数
190-
:return:
191-
"""
192-
async with async_db_session.begin() as db:
193-
if request.user.username != username:
194-
raise errors.AuthorizationError(msg='你只能修改自己的信息')
195-
user = await user_dao.get_by_username(db, username)
196-
if not user:
197-
raise errors.NotFoundError(msg='用户不存在')
198-
count = await user_dao.update_avatar(db, user.id, avatar)
157+
count = await user_dao.update(db, user, obj)
199158
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
200159
return count
201160

0 commit comments

Comments
 (0)