Skip to content

Commit af048d7

Browse files
committed
Fix issues
1 parent e533660 commit af048d7

File tree

6 files changed

+66
-8
lines changed

6 files changed

+66
-8
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,12 @@
44

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

7-
from backend.app.admin.schema.data_rule import CreateDataRuleParam, GetDataRuleDetail, UpdateDataRuleParam
7+
from backend.app.admin.schema.data_rule import (
8+
CreateDataRuleParam,
9+
GetDataRuleColumnDetail,
10+
GetDataRuleDetail,
11+
UpdateDataRuleParam,
12+
)
813
from backend.app.admin.service.data_rule_service import data_rule_service
914
from backend.common.pagination import DependsPagination, PageData, paging_data
1015
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
@@ -25,7 +30,7 @@ async def get_data_rule_models() -> ResponseSchemaModel[list[str]]:
2530
@router.get('/model/{model}/columns', summary='获取数据规则可用模型列', dependencies=[DependsJwtAuth])
2631
async def get_data_rule_model_columns(
2732
model: Annotated[str, Path(description='模型名称')],
28-
) -> ResponseSchemaModel[list[dict[str, str]]]:
33+
) -> ResponseSchemaModel[list[GetDataRuleColumnDetail]]:
2934
models = await data_rule_service.get_columns(model=model)
3035
return response_base.success(data=models)
3136

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ async def update_data_scope(
9191
summary='更新数据范围规则',
9292
dependencies=[
9393
Depends(RequestPermission('data:scope:rule:edit')),
94+
DependsRBAC,
9495
],
9596
)
9697
async def update_data_scope_rules(

backend/app/admin/schema/data_rule.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,10 @@ class GetDataRuleDetail(DataRuleSchemaBase):
3535
id: int = Field(description='规则 ID')
3636
created_time: datetime = Field(description='创建时间')
3737
updated_time: datetime | None = Field(None, description='更新时间')
38+
39+
40+
class GetDataRuleColumnDetail(SchemaBase):
41+
"""数据规则可用模型字段详情"""
42+
43+
key: str = Field(description='字段名')
44+
comment: str = Field(description='字段评论')

backend/app/admin/service/data_rule_service.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from backend.app.admin.crud.crud_data_rule import data_rule_dao
88
from backend.app.admin.model import DataRule
9-
from backend.app.admin.schema.data_rule import CreateDataRuleParam, UpdateDataRuleParam
9+
from backend.app.admin.schema.data_rule import CreateDataRuleParam, GetDataRuleColumnDetail, UpdateDataRuleParam
1010
from backend.common.exception import errors
1111
from backend.core.conf import settings
1212
from backend.database.db import async_db_session
@@ -36,7 +36,7 @@ async def get_models() -> list[str]:
3636
return list(settings.DATA_PERMISSION_MODELS.keys())
3737

3838
@staticmethod
39-
async def get_columns(model: str) -> list[dict[str, str]]:
39+
async def get_columns(model: str) -> list[GetDataRuleColumnDetail]:
4040
"""
4141
获取数据规则可用模型的字段列表
4242
@@ -48,7 +48,7 @@ async def get_columns(model: str) -> list[dict[str, str]]:
4848
model_ins = dynamic_import_data_model(settings.DATA_PERMISSION_MODELS[model])
4949

5050
model_columns = [
51-
{column.key: column.comment}
51+
GetDataRuleColumnDetail(key=column.key, comment=column.comment)
5252
for column in model_ins.__table__.columns
5353
if column.key not in settings.DATA_PERMISSION_COLUMN_EXCLUDE
5454
]

backend/common/security/permission.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,27 @@ async def filter_data_permission(db: AsyncSession, request: Request) -> ColumnEl
6868
data_scopes.append(scope)
6969

7070
# 超级管理员和无规则用户不做过滤
71-
# if request.user.is_superuser or not data_scopes:
72-
# return or_(1 == 1)
71+
if request.user.is_superuser or not data_scopes:
72+
return or_(1 == 1)
7373

7474
# 获取数据范围规则
7575
data_rule_list: list[DataRule] = []
7676
for data_scope in data_scopes:
7777
data_scope_with_relation = await data_scope_dao.get_with_relation(db, data_scope.id)
7878
data_rule_list.extend(data_scope_with_relation.rules)
7979

80+
# 去重
81+
seen_data_rule_ids = set()
82+
new_data_rule_list = []
83+
for rule in data_rule_list:
84+
if rule.id not in seen_data_rule_ids:
85+
seen_data_rule_ids.add(rule.id)
86+
new_data_rule_list.append(rule)
87+
8088
where_and_list = []
8189
where_or_list = []
8290

83-
for data_rule in data_rule_list:
91+
for data_rule in new_data_rule_list:
8492
# 验证规则模型
8593
rule_model = data_rule.model
8694
if rule_model not in settings.DATA_PERMISSION_MODELS:

backend/utils/health_check.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3+
import asyncio
4+
import functools
5+
import time
6+
37
from math import ceil
8+
from typing import Any, Callable
49

510
from fastapi import FastAPI, Request, Response
611
from fastapi.routing import APIRoute
712

813
from backend.common.exception import errors
14+
from backend.common.log import log
915

1016

1117
def ensure_unique_route_names(app: FastAPI) -> None:
@@ -34,3 +40,34 @@ async def http_limit_callback(request: Request, response: Response, expire: int)
3440
"""
3541
expires = ceil(expire / 1000)
3642
raise errors.HTTPError(code=429, msg='请求过于频繁,请稍后重试', headers={'Retry-After': str(expires)})
43+
44+
45+
def timer(func) -> Callable:
46+
"""函数耗时计时装饰器"""
47+
48+
@functools.wraps(func)
49+
async def async_wrapper(*args, **kwargs) -> Any:
50+
start_time = time.perf_counter()
51+
result = await func(*args, **kwargs)
52+
elapsed_seconds = time.perf_counter() - start_time
53+
_log_time(func, elapsed_seconds)
54+
return result
55+
56+
@functools.wraps(func)
57+
def sync_wrapper(*args, **kwargs) -> Any:
58+
start_time = time.perf_counter()
59+
result = func(*args, **kwargs)
60+
elapsed_seconds = time.perf_counter() - start_time
61+
_log_time(func, elapsed_seconds)
62+
return result
63+
64+
def _log_time(func, elapsed: float):
65+
# 智能选择单位(秒、毫秒、微秒、纳秒)
66+
if elapsed >= 1:
67+
unit, factor = 's', 1
68+
else:
69+
unit, factor = 'ms', 1e3
70+
71+
log.info(f'{func.__module__}.{func.__name__} | {elapsed * factor:.3f} {unit}')
72+
73+
return async_wrapper if asyncio.iscoroutinefunction(func) else sync_wrapper

0 commit comments

Comments
 (0)