Skip to content

Commit 57ae7f0

Browse files
authored
Refactor routes to better align with RESTful (#645)
1 parent 6ee3983 commit 57ae7f0

File tree

11 files changed

+84
-89
lines changed

11 files changed

+84
-89
lines changed

backend/app/admin/api/v1/auth/auth.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ async def user_login(
3434
return response_base.success(data=data)
3535

3636

37-
@router.post('/token/new', summary='创建新 token')
38-
async def create_new_token(request: Request) -> ResponseSchemaModel[GetNewToken]:
37+
@router.post('/tokens/refresh', summary='刷新 token')
38+
async def refresh_token(request: Request) -> ResponseSchemaModel[GetNewToken]:
3939
data = await auth_service.new_token(request=request)
4040
return response_base.success(data=data)
4141

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@
2020
router.include_router(data_rule_router, prefix='/data-rules', tags=['系统数据规则'])
2121
router.include_router(data_scope_router, prefix='/data-scopes', tags=['系统数据范围'])
2222
router.include_router(upload_router, prefix='/upload', tags=['系统上传'])
23-
router.include_router(plugin_router, prefix='/plugin', tags=['系统插件'])
23+
router.include_router(plugin_router, prefix='/plugins', tags=['系统插件'])

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ async def get_data_rule_models() -> ResponseSchemaModel[list[str]]:
2727
return response_base.success(data=models)
2828

2929

30-
@router.get('/model/{model}/columns', summary='获取数据规则可用模型列', dependencies=[DependsJwtAuth])
30+
@router.get('/models/{model}/columns', summary='获取数据规则可用模型列', dependencies=[DependsJwtAuth])
3131
async def get_data_rule_model_columns(
3232
model: Annotated[str, Path(description='模型名称')],
3333
) -> ResponseSchemaModel[list[GetDataRuleColumnDetail]]:

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ async def get_all_plugins() -> ResponseSchemaModel[list[dict[str, Any]]]:
2222
return response_base.success(data=plugins)
2323

2424

25-
@router.get('/changed', summary='插件状态是否变更', dependencies=[DependsJwtAuth])
25+
@router.get('/changes', summary='插件状态是否变更', dependencies=[DependsJwtAuth])
2626
async def plugin_changed() -> ResponseSchemaModel[bool]:
2727
plugins = await plugin_service.changed()
2828
return response_base.success(data=bool(plugins))
2929

3030

3131
@router.post(
32-
'/install/zip',
32+
'/zip',
3333
summary='安装 zip 插件',
3434
description='使用插件 zip 压缩包进行安装',
3535
dependencies=[
36-
Depends(RequestPermission('sys:plugin:install')),
36+
Depends(RequestPermission('sys:plugin:zip')),
3737
DependsRBAC,
3838
],
3939
)
@@ -43,11 +43,11 @@ async def install_zip_plugin(file: Annotated[UploadFile, File()]) -> ResponseMod
4343

4444

4545
@router.post(
46-
'/install/git',
46+
'/git',
4747
summary='安装 git 插件',
4848
description='使用插件 git 仓库地址进行安装,不限制平台;如果需要凭证,需在 git 仓库地址中添加凭证信息',
4949
dependencies=[
50-
Depends(RequestPermission('sys:plugin:install')),
50+
Depends(RequestPermission('sys:plugin:git')),
5151
DependsRBAC,
5252
],
5353
)
@@ -57,35 +57,35 @@ async def install_git_plugin(repo_url: Annotated[str, Query(description='插件
5757

5858

5959
@router.delete(
60-
'/uninstall',
60+
'/{plugin}',
6161
summary='卸载插件',
6262
description='此操作会直接删除插件依赖,但不会直接删除插件,而是将插件移动到备份目录',
6363
dependencies=[
64-
Depends(RequestPermission('sys:plugin:uninstall')),
64+
Depends(RequestPermission('sys:plugin:del')),
6565
DependsRBAC,
6666
],
6767
)
68-
async def uninstall_plugin(plugin: Annotated[str, Query(description='插件名称')]) -> ResponseModel:
68+
async def uninstall_plugin(plugin: Annotated[str, Path(description='插件名称')]) -> ResponseModel:
6969
await plugin_service.uninstall(plugin=plugin)
7070
return response_base.success(res=CustomResponseCode.PLUGIN_UNINSTALL_SUCCESS)
7171

7272

7373
@router.post(
74-
'/status',
74+
'/{plugin}/status',
7575
summary='更新插件状态',
7676
dependencies=[
7777
Depends(RequestPermission('sys:plugin:status')),
7878
DependsRBAC,
7979
],
8080
)
81-
async def update_plugin_status(plugin: Annotated[str, Query(description='插件名称')]) -> ResponseModel:
81+
async def update_plugin_status(plugin: Annotated[str, Path(description='插件名称')]) -> ResponseModel:
8282
await plugin_service.update_status(plugin=plugin)
8383
return response_base.success()
8484

8585

8686
@router.get(
87-
'/zip/{plugin}',
88-
summary='打包插件',
87+
'/{plugin}',
88+
summary='打包并下载插件',
8989
dependencies=[
9090
Depends(RequestPermission('sys:plugin:zip')),
9191
DependsRBAC,

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,6 @@ async def get_all_roles() -> ResponseSchemaModel[list[GetRoleDetail]]:
2929
return response_base.success(data=data)
3030

3131

32-
@router.get('/{pk}/all', summary='获取用户所有角色', dependencies=[DependsJwtAuth])
33-
async def get_user_all_roles(
34-
pk: Annotated[int, Path(description='用户 ID')],
35-
) -> ResponseSchemaModel[list[GetRoleDetail]]:
36-
data = await role_service.get_users(pk=pk)
37-
return response_base.success(data=data)
38-
39-
4032
@router.get('/{pk}/menus', summary='获取角色所有菜单', dependencies=[DependsJwtAuth])
4133
async def get_role_all_menus(
4234
pk: Annotated[int, Path(description='角色 ID')],
@@ -106,7 +98,7 @@ async def update_role(pk: Annotated[int, Path(description='角色 ID')], obj: Up
10698

10799

108100
@router.put(
109-
'/{pk}/menu',
101+
'/{pk}/menus',
110102
summary='更新角色菜单',
111103
dependencies=[
112104
Depends(RequestPermission('sys:role:menu:edit')),
@@ -123,7 +115,7 @@ async def update_role_menus(
123115

124116

125117
@router.put(
126-
'/{pk}/scope',
118+
'/{pk}/scopes',
127119
summary='更新角色数据范围',
128120
dependencies=[
129121
Depends(RequestPermission('sys:role:scope:edit')),

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

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from fastapi import APIRouter, Depends, Path, Query, Request
66

7+
from backend.app.admin.schema.role import GetRoleDetail
78
from backend.app.admin.schema.user import (
89
AddUserParam,
910
GetCurrentUserInfoWithRelationDetail,
@@ -36,9 +37,11 @@ async def add_user(request: Request, obj: AddUserParam) -> ResponseSchemaModel[G
3637
return response_base.success(data=data)
3738

3839

39-
@router.post('/password/reset', summary='密码重置', dependencies=[DependsJwtAuth])
40-
async def password_reset(request: Request, obj: ResetPasswordParam) -> ResponseModel:
41-
count = await user_service.pwd_reset(request=request, obj=obj)
40+
@router.post('/{username}/password', summary='密码重置', dependencies=[DependsJwtAuth])
41+
async def password_reset(
42+
username: Annotated[str, Path(description='用户名')], obj: ResetPasswordParam
43+
) -> ResponseModel:
44+
count = await user_service.pwd_reset(username=username, obj=obj)
4245
if count > 0:
4346
return response_base.success()
4447
return response_base.fail()
@@ -58,14 +61,12 @@ async def get_user(
5861
return response_base.success(data=data)
5962

6063

61-
@router.put('/{username}', summary='更新用户信息', dependencies=[DependsJwtAuth])
62-
async def update_user(
63-
request: Request, username: Annotated[str, Path(description='用户名')], obj: UpdateUserParam
64-
) -> ResponseModel:
65-
count = await user_service.update(request=request, username=username, obj=obj)
66-
if count > 0:
67-
return response_base.success()
68-
return response_base.fail()
64+
@router.get('/{username}/roles', summary='获取用户所有角色', dependencies=[DependsJwtAuth])
65+
async def get_user_all_roles(
66+
username: Annotated[str, Path(description='用户名')],
67+
) -> ResponseSchemaModel[list[GetRoleDetail]]:
68+
data = await user_service.get_roles(username=username)
69+
return response_base.success(data=data)
6970

7071

7172
@router.get(
@@ -88,6 +89,16 @@ async def get_pagination_users(
8889
return response_base.success(data=page_data)
8990

9091

92+
@router.put('/{username}', summary='更新用户信息', dependencies=[DependsJwtAuth])
93+
async def update_user(
94+
request: Request, username: Annotated[str, Path(description='用户名')], obj: UpdateUserParam
95+
) -> ResponseModel:
96+
count = await user_service.update(request=request, username=username, obj=obj)
97+
if count > 0:
98+
return response_base.success()
99+
return response_base.fail()
100+
101+
91102
@router.put('/{pk}/super', summary='修改用户超级权限', dependencies=[DependsRBAC])
92103
async def super_set(request: Request, pk: Annotated[int, Path(description='用户 ID')]) -> ResponseModel:
93104
count = await user_service.update_permission(request=request, pk=pk)

backend/app/admin/crud/crud_role.py

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from sqlalchemy.orm import noload, selectinload
88
from sqlalchemy_crud_plus import CRUDPlus
99

10-
from backend.app.admin.model import DataScope, Menu, Role, User
10+
from backend.app.admin.model import DataScope, Menu, Role
1111
from backend.app.admin.schema.role import (
1212
CreateRoleParam,
1313
UpdateRoleMenuParam,
@@ -54,18 +54,6 @@ async def get_all(self, db: AsyncSession) -> Sequence[Role]:
5454
"""
5555
return await self.select_models(db)
5656

57-
async def get_users(self, db: AsyncSession, user_id: int) -> Sequence[Role]:
58-
"""
59-
获取用户角色列表
60-
61-
:param db: 数据库会话
62-
:param user_id: 用户 ID
63-
:return:
64-
"""
65-
stmt = select(self.model).join(self.model.users).where(User.id == user_id)
66-
roles = await db.execute(stmt)
67-
return roles.scalars().all()
68-
6957
async def get_list(self, name: str | None, status: int | None) -> Select:
7058
"""
7159
获取角色列表

backend/app/admin/service/role_service.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,6 @@ async def get_all() -> Sequence[Role]:
4545
roles = await role_dao.get_all(db)
4646
return roles
4747

48-
@staticmethod
49-
async def get_users(*, pk: int) -> Sequence[Role]:
50-
"""
51-
获取用户的角色列表
52-
53-
:param pk: 用户 ID
54-
:return:
55-
"""
56-
async with async_db_session() as db:
57-
roles = await role_dao.get_users(db, user_id=pk)
58-
return roles
59-
6048
@staticmethod
6149
async def get_select(*, name: str | None, status: int | None) -> Select:
6250
"""

backend/app/admin/service/user_service.py

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
# -*- coding: utf-8 -*-
33
import random
44

5+
from typing import Sequence
6+
57
from fastapi import Request
68
from sqlalchemy import Select
79

810
from backend.app.admin.crud.crud_dept import dept_dao
911
from backend.app.admin.crud.crud_role import role_dao
1012
from backend.app.admin.crud.crud_user import user_dao
11-
from backend.app.admin.model import User
13+
from backend.app.admin.model import Role, User
1214
from backend.app.admin.schema.user import (
1315
AddUserParam,
1416
RegisterUserParam,
@@ -81,28 +83,28 @@ async def add(*, request: Request, obj: AddUserParam) -> None:
8183
await user_dao.add(db, obj)
8284

8385
@staticmethod
84-
async def pwd_reset(*, request: Request, obj: ResetPasswordParam) -> int:
86+
async def pwd_reset(*, username: str, obj: ResetPasswordParam) -> int:
8587
"""
8688
重置用户密码
8789
88-
:param request: FastAPI 请求对象
90+
:param username: 用户名
8991
:param obj: 密码重置参数
9092
:return:
9193
"""
9294
async with async_db_session.begin() as db:
93-
user = await user_dao.get(db, request.user.id)
95+
user = await user_dao.get_by_username(db, username)
9496
if not user:
9597
raise errors.NotFoundError(msg='用户不存在')
9698
if not password_verify(obj.old_password, user.password):
9799
raise errors.ForbiddenError(msg='原密码错误')
98100
if obj.new_password != obj.confirm_password:
99101
raise errors.ForbiddenError(msg='密码输入不一致')
100102
new_pwd = get_hash_password(obj.new_password, user.salt)
101-
count = await user_dao.reset_password(db, request.user.id, new_pwd)
103+
count = await user_dao.reset_password(db, user.id, new_pwd)
102104
key_prefix = [
103-
f'{settings.TOKEN_REDIS_PREFIX}:{request.user.id}',
104-
f'{settings.TOKEN_REFRESH_REDIS_PREFIX}:{request.user.id}',
105-
f'{settings.JWT_USER_REDIS_PREFIX}:{request.user.id}',
105+
f'{settings.TOKEN_REDIS_PREFIX}:{user.id}',
106+
f'{settings.TOKEN_REFRESH_REDIS_PREFIX}:{user.id}',
107+
f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}',
106108
]
107109
for prefix in key_prefix:
108110
await redis_client.delete_prefix(prefix)
@@ -122,6 +124,33 @@ async def get_userinfo(*, username: str) -> User:
122124
raise errors.NotFoundError(msg='用户不存在')
123125
return user
124126

127+
@staticmethod
128+
async def get_roles(*, username: str) -> Sequence[Role]:
129+
"""
130+
获取用户所有角色
131+
132+
:param username: 用户名
133+
:return:
134+
"""
135+
async with async_db_session() as db:
136+
user = await user_dao.get_with_relation(db, username=username)
137+
if not user:
138+
raise errors.NotFoundError(msg='用户不存在')
139+
return user.roles
140+
141+
@staticmethod
142+
async def get_select(*, dept: int, username: str, phone: str, status: int) -> Select:
143+
"""
144+
获取用户列表查询条件
145+
146+
:param dept: 部门 ID
147+
:param username: 用户名
148+
:param phone: 手机号
149+
:param status: 状态
150+
:return:
151+
"""
152+
return await user_dao.get_list(dept=dept, username=username, phone=phone, status=status)
153+
125154
@staticmethod
126155
async def update(*, request: Request, username: str, obj: UpdateUserParam) -> int:
127156
"""
@@ -158,19 +187,6 @@ async def update(*, request: Request, username: str, obj: UpdateUserParam) -> in
158187
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
159188
return count
160189

161-
@staticmethod
162-
async def get_select(*, dept: int, username: str, phone: str, status: int) -> Select:
163-
"""
164-
获取用户列表查询条件
165-
166-
:param dept: 部门 ID
167-
:param username: 用户名
168-
:param phone: 手机号
169-
:param status: 状态
170-
:return:
171-
"""
172-
return await user_dao.get_list(dept=dept, username=username, phone=phone, status=status)
173-
174190
@staticmethod
175191
async def update_permission(*, request: Request, pk: int) -> int:
176192
"""

backend/plugin/code_generator/api/router.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99

1010
v1 = APIRouter(prefix=f'{settings.FASTAPI_API_V1_PATH}/gen', tags=['代码生成'])
1111

12-
v1.include_router(gen_router)
12+
v1.include_router(gen_router, prefix='/tables')
1313
v1.include_router(business_router, prefix='/businesses')
1414
v1.include_router(model_router, prefix='/models')

0 commit comments

Comments
 (0)