Skip to content

Commit 383716e

Browse files
committed
Merge branch 'master' into add-aliyun-oss-plugin
2 parents a4da635 + d9985f9 commit 383716e

File tree

100 files changed

+1859
-1318
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+1859
-1318
lines changed

.pre-commit-config.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
repos:
22
- repo: https://github.com/pre-commit/pre-commit-hooks
3-
rev: v4.6.0
3+
rev: v5.0.0
44
hooks:
55
- id: check-added-large-files
66
- id: end-of-file-fixer
77
- id: check-yaml
88
- id: check-toml
99

1010
- repo: https://github.com/charliermarsh/ruff-pre-commit
11-
rev: v0.7.2
11+
rev: v0.9.5
1212
hooks:
1313
- id: ruff
1414
args:
@@ -20,7 +20,7 @@ repos:
2020
- id: ruff-format
2121

2222
- repo: https://github.com/astral-sh/uv-pre-commit
23-
rev: 0.4.29
23+
rev: 0.5.29
2424
hooks:
2525
- id: uv-lock
2626
args:

README.md

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,6 @@ pattern, use templates to transform it to your heart's content!
4747
| data access | dao / mapper | crud |
4848
| model | model / entity | model |
4949

50-
## Online Demo
51-
52-
You can view some of the preview screenshots
53-
in [fastapi_best_architecture_ui](https://github.com/fastapi-practices/fastapi_best_architecture_ui)
54-
55-
For the demo entrance, please refer
56-
to [Official documentation](https://fastapi-practices.github.io/fastapi_best_architecture_docs/)
57-
58-
> tester: test / 123456
59-
>
60-
> super: admin / 123456
61-
6250
## Features
6351

6452
- [x] Design with FastAPI PEP 593 Annotated Parameters
@@ -81,6 +69,7 @@ to [Official documentation](https://fastapi-practices.github.io/fastapi_best_arc
8169
- [x] Menu management: Configuration of system menus, user menus, button permission labels
8270
- [x] Role management: assignment of role menu privileges, assignment of role routing privileges
8371
- [x] Dictionary management: maintenance of commonly used fixed data or parameters within the system
72+
- [x] Token management:System user online status detection, supports kicking user offline
8473
- [x] Code generation: back-end code is automatically generated, supporting preview, write and download.
8574
- [x] Operation log: logging and querying of normal and abnormal system operations.
8675
- [x] Login authentication: graphical captcha backend authentication login

README.zh-CN.md

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,6 @@ mvc 架构作为常规设计模式,在 python web 中也很常见,但是三
4343
| 数据访问 | dao / mapper | crud |
4444
| 模型 | model / entity | model |
4545

46-
## 在线预览
47-
48-
你可以在 [fastapi_best_architecture_ui](https://github.com/fastapi-practices/fastapi_best_architecture_ui) 中查看部分预览截图
49-
50-
演示入口请查看 [官方文档](https://fastapi-practices.github.io/fastapi_best_architecture_docs/)
51-
52-
> 测试员:tester / 123456
53-
>
54-
> 管理员:admin / 123456
55-
5646
## 特征
5747

5848
- [x] 使用 FastAPI PEP 593 Annotated 参数设计
@@ -75,6 +65,7 @@ mvc 架构作为常规设计模式,在 python web 中也很常见,但是三
7565
- [x] 菜单管理:配置系统菜单,用户菜单,按钮权限标识
7666
- [x] 角色管理:角色菜单权限分配,角色路由权限分配
7767
- [x] 字典管理:维护系统内部常用固定数据或参数
68+
- [x] 令牌管理:系统用户在线状态检测,支持踢人下线
7869
- [x] 代码生成:后端代码自动生成,支持预览,写入及下载
7970
- [x] 操作日志:系统正常和异常操作的日志记录与查询
8071
- [x] 登录认证:图形验证码后台认证登录

backend/.ruff.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ select = [
99
"E",
1010
"F",
1111
"I",
12-
"TCH",
12+
"TC",
1313
# W
1414
"W505",
1515
# PT
@@ -43,8 +43,8 @@ lines-between-types = 1
4343
order-by-type = true
4444

4545
[lint.per-file-ignores]
46-
"**/api/v1/*.py" = ["TCH"]
47-
"**/model/*.py" = ["TCH003"]
46+
"**/api/v1/*.py" = ["TC"]
47+
"**/model/*.py" = ["TC003"]
4848
"**/model/__init__.py" = ["F401"]
4949
"**/tests/*.py" = ["E402"]
5050

backend/alembic/env.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,20 @@
1616
from backend.common.model import MappedBase
1717
from backend.core import path_conf
1818
from backend.database.db import SQLALCHEMY_DATABASE_URL
19+
from backend.plugin.tools import get_plugin_models
1920

2021
# import your new model here
2122
from backend.app.admin.model import * # noqa: F401
2223
from backend.app.generator.model import * # noqa: F401
2324

25+
# import plugin model
26+
for cls in get_plugin_models():
27+
class_name = cls.__name__
28+
if class_name in globals():
29+
print(f'\nWarning: Class "{class_name}" already exists in global namespace.')
30+
else:
31+
globals()[class_name] = cls
32+
2433
if not os.path.exists(path_conf.ALEMBIC_VERSION_DIR):
2534
os.makedirs(path_conf.ALEMBIC_VERSION_DIR)
2635

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
from fastapi_limiter.depends import RateLimiter
88
from starlette.background import BackgroundTasks
99

10-
from backend.app.admin.schema.token import GetSwaggerToken
10+
from backend.app.admin.schema.token import GetLoginToken, GetNewToken, GetSwaggerToken
1111
from backend.app.admin.schema.user import AuthLoginParam
1212
from backend.app.admin.service.auth_service import auth_service
13-
from backend.common.response.response_schema import ResponseModel, response_base
13+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1414
from backend.common.security.jwt import DependsJwtAuth
1515

1616
router = APIRouter()
@@ -30,13 +30,13 @@ async def swagger_login(obj: Annotated[HTTPBasicCredentials, Depends()]) -> GetS
3030
)
3131
async def user_login(
3232
request: Request, response: Response, obj: AuthLoginParam, background_tasks: BackgroundTasks
33-
) -> ResponseModel:
33+
) -> ResponseSchemaModel[GetLoginToken]:
3434
data = await auth_service.login(request=request, response=response, obj=obj, background_tasks=background_tasks)
3535
return response_base.success(data=data)
3636

3737

3838
@router.post('/token/new', summary='创建新 token', dependencies=[DependsJwtAuth])
39-
async def create_new_token(request: Request, response: Response) -> ResponseModel:
39+
async def create_new_token(request: Request, response: Response) -> ResponseSchemaModel[GetNewToken]:
4040
data = await auth_service.new_token(request=request, response=response)
4141
return response_base.success(data=data)
4242

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from starlette.concurrency import run_in_threadpool
77

88
from backend.app.admin.conf import admin_settings
9-
from backend.common.response.response_schema import ResponseModel, response_base
9+
from backend.app.admin.schema.captcha import GetCaptchaDetail
10+
from backend.common.response.response_schema import ResponseSchemaModel, response_base
1011
from backend.database.redis import redis_client
1112

1213
router = APIRouter()
@@ -17,14 +18,17 @@
1718
summary='获取登录验证码',
1819
dependencies=[Depends(RateLimiter(times=5, seconds=10))],
1920
)
20-
async def get_captcha(request: Request) -> ResponseModel:
21+
async def get_captcha(request: Request) -> ResponseSchemaModel[GetCaptchaDetail]:
2122
"""
2223
此接口可能存在性能损耗,尽管是异步接口,但是验证码生成是IO密集型任务,使用线程池尽量减少性能损耗
2324
"""
2425
img_type: str = 'base64'
2526
img, code = await run_in_threadpool(img_captcha, img_byte=img_type)
2627
ip = request.state.ip
2728
await redis_client.set(
28-
f'{admin_settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{ip}', code, ex=admin_settings.CAPTCHA_LOGIN_EXPIRE_SECONDS
29+
f'{admin_settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{ip}',
30+
code,
31+
ex=admin_settings.CAPTCHA_LOGIN_EXPIRE_SECONDS,
2932
)
30-
return response_base.success(data={'image_type': img_type, 'image': img})
33+
data = GetCaptchaDetail(image_type=img_type, image=img)
34+
return response_base.success(data=data)

backend/app/admin/api/v1/log/login_log.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
from fastapi import APIRouter, Depends, Query
66

7-
from backend.app.admin.schema.login_log import GetLoginLogListDetails
7+
from backend.app.admin.schema.login_log import GetLoginLogDetail
88
from backend.app.admin.service.login_log_service import login_log_service
9-
from backend.common.pagination import DependsPagination, paging_data
10-
from backend.common.response.response_schema import ResponseModel, response_base
9+
from backend.common.pagination import DependsPagination, PageData, paging_data
10+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1111
from backend.common.security.jwt import DependsJwtAuth
1212
from backend.common.security.permission import RequestPermission
1313
from backend.common.security.rbac import DependsRBAC
@@ -29,9 +29,9 @@ async def get_pagination_login_logs(
2929
username: Annotated[str | None, Query()] = None,
3030
status: Annotated[int | None, Query()] = None,
3131
ip: Annotated[str | None, Query()] = None,
32-
) -> ResponseModel:
32+
) -> ResponseSchemaModel[PageData[GetLoginLogDetail]]:
3333
log_select = await login_log_service.get_select(username=username, status=status, ip=ip)
34-
page_data = await paging_data(db, log_select, GetLoginLogListDetails)
34+
page_data = await paging_data(db, log_select)
3535
return response_base.success(data=page_data)
3636

3737

backend/app/admin/api/v1/log/opera_log.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
from fastapi import APIRouter, Depends, Query
66

7-
from backend.app.admin.schema.opera_log import GetOperaLogListDetails
7+
from backend.app.admin.schema.opera_log import GetOperaLogDetail
88
from backend.app.admin.service.opera_log_service import opera_log_service
9-
from backend.common.pagination import DependsPagination, paging_data
10-
from backend.common.response.response_schema import ResponseModel, response_base
9+
from backend.common.pagination import DependsPagination, PageData, paging_data
10+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1111
from backend.common.security.jwt import DependsJwtAuth
1212
from backend.common.security.permission import RequestPermission
1313
from backend.common.security.rbac import DependsRBAC
@@ -29,9 +29,9 @@ async def get_pagination_opera_logs(
2929
username: Annotated[str | None, Query()] = None,
3030
status: Annotated[int | None, Query()] = None,
3131
ip: Annotated[str | None, Query()] = None,
32-
) -> ResponseModel:
32+
) -> ResponseSchemaModel[PageData[GetOperaLogDetail]]:
3333
log_select = await opera_log_service.get_select(username=username, status=status, ip=ip)
34-
page_data = await paging_data(db, log_select, GetOperaLogListDetails)
34+
page_data = await paging_data(db, log_select)
3535
return response_base.success(data=page_data)
3636

3737

backend/app/admin/api/v1/oauth2/github.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from backend.app.admin.conf import admin_settings
99
from backend.app.admin.service.oauth2_service import oauth2_service
1010
from backend.common.enums import UserSocialType
11-
from backend.common.response.response_schema import ResponseModel, response_base
11+
from backend.common.response.response_schema import ResponseSchemaModel, response_base
1212

1313
router = APIRouter()
1414

@@ -17,7 +17,7 @@
1717

1818

1919
@router.get('', summary='获取 Github 授权链接')
20-
async def github_auth2() -> ResponseModel:
20+
async def github_auth2() -> ResponseSchemaModel[str]:
2121
auth_url = await _github_client.get_authorization_url(redirect_uri=admin_settings.OAUTH2_GITHUB_REDIRECT_URI)
2222
return response_base.success(data=auth_url)
2323

0 commit comments

Comments
 (0)