Skip to content

Commit 9df29c7

Browse files
committed
fix issues
1 parent dd1baeb commit 9df29c7

File tree

19 files changed

+84
-67
lines changed

19 files changed

+84
-67
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ async def get_data_rule_models() -> ResponseSchemaModel[list[str]]:
2525
@router.get('/model/{model}/columns', summary='获取数据规则可用模型列', dependencies=[DependsJwtAuth])
2626
async def get_data_rule_model_columns(
2727
model: Annotated[str, Path(description='模型名称')],
28-
) -> ResponseSchemaModel[list[str]]:
28+
) -> ResponseSchemaModel[list[dict[str, str]]]:
2929
models = await data_rule_service.get_columns(model=model)
3030
return response_base.success(data=models)
3131

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# -*- coding: utf-8 -*-
33
from typing import Annotated, Any
44

5-
from fastapi import APIRouter, Depends, Path, Query
5+
from fastapi import APIRouter, Depends, Path, Query, Request
66

77
from backend.app.admin.schema.dept import CreateDeptParam, GetDeptDetail, UpdateDeptParam
88
from backend.app.admin.service.dept_service import dept_service
@@ -22,12 +22,13 @@ async def get_dept(pk: Annotated[int, Path(description='部门 ID')]) -> Respons
2222

2323
@router.get('', summary='获取所有部门展示树', dependencies=[DependsJwtAuth])
2424
async def get_all_depts(
25+
request: Request,
2526
name: Annotated[str | None, Query(description='部门名称')] = None,
2627
leader: Annotated[str | None, Query(description='部门负责人')] = None,
2728
phone: Annotated[str | None, Query(description='联系电话')] = None,
2829
status: Annotated[int | None, Query(description='状态')] = None,
2930
) -> ResponseSchemaModel[list[dict[str, Any]]]:
30-
dept = await dept_service.get_dept_tree(name=name, leader=leader, phone=phone, status=status)
31+
dept = await dept_service.get_dept_tree(request=request, name=name, leader=leader, phone=phone, status=status)
3132
return response_base.success(data=dept)
3233

3334

backend/app/admin/crud/crud_data_rule.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ async def get_list(self, name: str | None) -> Select:
3131
:param name: 规则名称
3232
:return:
3333
"""
34-
stmt = select(self.model).options(noload(self.model.roles)).order_by(desc(self.model.created_time))
34+
stmt = select(self.model).options(noload(self.model.scope)).order_by(desc(self.model.created_time))
3535

3636
filters = []
3737
if name is not None:

backend/app/admin/crud/crud_dept.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
# -*- coding: utf-8 -*-
33
from typing import Sequence
44

5+
from fastapi import Request
56
from sqlalchemy import select
67
from sqlalchemy.ext.asyncio import AsyncSession
78
from sqlalchemy.orm import selectinload
89
from sqlalchemy_crud_plus import CRUDPlus
910

1011
from backend.app.admin.model import Dept
1112
from backend.app.admin.schema.dept import CreateDeptParam, UpdateDeptParam
13+
from backend.common.security.permission import filter_data_permission
1214

1315

1416
class CRUDDept(CRUDPlus[Dept]):
@@ -35,11 +37,18 @@ async def get_by_name(self, db: AsyncSession, name: str) -> Dept | None:
3537
return await self.select_model_by_column(db, name=name, del_flag=0)
3638

3739
async def get_all(
38-
self, db: AsyncSession, name: str | None, leader: str | None, phone: str | None, status: int | None
40+
self,
41+
request: Request,
42+
db: AsyncSession,
43+
name: str | None,
44+
leader: str | None,
45+
phone: str | None,
46+
status: int | None,
3947
) -> Sequence[Dept]:
4048
"""
4149
获取所有部门
4250
51+
:param request: FastAPI 请求对象
4352
:param db: 数据库会话
4453
:param name: 部门名称
4554
:param leader: 负责人
@@ -56,7 +65,7 @@ async def get_all(
5665
filters.update(phone__startswith=phone)
5766
if status is not None:
5867
filters.update(status=status)
59-
return await self.select_models_order(db, sort_columns='sort', **filters)
68+
return await self.select_models_order(db, 'sort', None, await filter_data_permission(db, request), **filters)
6069

6170
async def create(self, db: AsyncSession, obj: CreateDeptParam) -> None:
6271
"""

backend/app/admin/crud/crud_user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ async def get_with_relation(
311311
"""
312312
stmt = select(self.model).options(
313313
selectinload(self.model.dept),
314-
selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.rules)),
314+
selectinload(self.model.roles).options(selectinload(Role.menus), selectinload(Role.scopes)),
315315
)
316316

317317
filters = []

backend/app/admin/model/data_rule.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
from typing import TYPE_CHECKING
66

77
from sqlalchemy import ForeignKey, String
8-
from sqlalchemy.dialects.mysql import LONGTEXT
9-
from sqlalchemy.dialects.postgresql import TEXT
108
from sqlalchemy.orm import Mapped, mapped_column, relationship
119

1210
from backend.common.model import Base, id_key
@@ -21,17 +19,17 @@ class DataRule(Base):
2119
__tablename__ = 'sys_data_rule'
2220

2321
id: Mapped[id_key] = mapped_column(init=False)
24-
model: Mapped[str] = mapped_column(String(50), comment='SQLA 模型类名')
22+
name: Mapped[str] = mapped_column(String(500), unique=True, comment='名称')
23+
model: Mapped[str] = mapped_column(String(50), comment='SQLA 模型名,对应 DATA_PERMISSION_MODELS 键名')
2524
column: Mapped[str] = mapped_column(String(20), comment='模型字段名')
2625
operator: Mapped[int] = mapped_column(comment='运算符(0:and、1:or)')
2726
expression: Mapped[int] = mapped_column(
2827
comment='表达式(0:==、1:!=、2:>、3:>=、4:<、5:<=、6:in、7:not_in)'
2928
)
3029
value: Mapped[str] = mapped_column(String(255), comment='规则值')
31-
remark: Mapped[str] = mapped_column(LONGTEXT().with_variant(TEXT, 'postgresql'), comment='备注')
3230

3331
# 数据范围规则一对多
34-
rule_id: Mapped[int | None] = mapped_column(
32+
scope_id: Mapped[int | None] = mapped_column(
3533
ForeignKey('sys_data_scope.id', ondelete='SET NULL'), default=None, comment='数据范围关联 ID'
3634
)
37-
rule: Mapped[DataScope] = relationship(init=False, back_populates='rules')
35+
scope: Mapped[DataScope] = relationship(init=False, back_populates='rules')

backend/app/admin/model/data_scope.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3+
from __future__ import annotations
4+
5+
from typing import TYPE_CHECKING
36

47
from sqlalchemy import String
58
from sqlalchemy.orm import Mapped, mapped_column, relationship
69

7-
from backend.app.admin.model import DataRule, Role
810
from backend.app.admin.model.m2m import sys_role_data_scope
911
from backend.common.model import Base, id_key
1012

13+
if TYPE_CHECKING:
14+
from backend.app.admin.model import DataRule, Role
15+
1116

1217
class DataScope(Base):
1318
"""数据范围表"""

backend/app/admin/schema/data_rule.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@ class DataRuleSchemaBase(SchemaBase):
1414
name: str = Field(description='规则名称')
1515
model: str = Field(description='模型名称')
1616
column: str = Field(description='字段名称')
17-
operator: RoleDataRuleOperatorType = Field(RoleDataRuleOperatorType.OR, description='操作符(AND/OR)')
17+
operator: RoleDataRuleOperatorType = Field(RoleDataRuleOperatorType.AND, description='操作符(AND/OR)')
1818
expression: RoleDataRuleExpressionType = Field(RoleDataRuleExpressionType.eq, description='表达式类型')
1919
value: str = Field(description='规则值')
20-
remark: str = Field(description='备注')
2120

2221

2322
class CreateDataRuleParam(DataRuleSchemaBase):

backend/app/admin/service/data_rule_service.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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[str]:
39+
async def get_columns(model: str) -> list[dict[str, str]]:
4040
"""
4141
获取数据规则可用模型的字段列表
4242
@@ -46,8 +46,11 @@ async def get_columns(model: str) -> list[str]:
4646
if model not in settings.DATA_PERMISSION_MODELS:
4747
raise errors.NotFoundError(msg='数据规则可用模型不存在')
4848
model_ins = dynamic_import_data_model(settings.DATA_PERMISSION_MODELS[model])
49+
4950
model_columns = [
50-
key for key in model_ins.__table__.columns.keys() if key not in settings.DATA_PERMISSION_COLUMN_EXCLUDE
51+
{column.key: column.comment}
52+
for column in model_ins.__table__.columns
53+
if column.key not in settings.DATA_PERMISSION_COLUMN_EXCLUDE
5154
]
5255
return model_columns
5356

@@ -95,6 +98,9 @@ async def update(*, pk: int, obj: UpdateDataRuleParam) -> int:
9598
data_rule = await data_rule_dao.get(db, pk)
9699
if not data_rule:
97100
raise errors.NotFoundError(msg='数据规则不存在')
101+
if data_rule.name != obj.name:
102+
if await data_rule_dao.get_by_name(db, obj.name):
103+
raise errors.ForbiddenError(msg='数据规则已存在')
98104
count = await data_rule_dao.update(db, pk, obj)
99105
return count
100106

backend/app/admin/service/data_scope_service.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ async def update(*, pk: int, obj: UpdateDataScopeParam) -> int:
8080
data_scope = await data_scope_dao.get(db, pk)
8181
if not data_scope:
8282
raise errors.NotFoundError(msg='数据范围不存在')
83+
if data_scope.name != obj.name:
84+
if await data_scope_dao.get_by_name(db, obj.name):
85+
raise errors.ForbiddenError(msg='数据范围已存在')
8386
count = await data_scope_dao.update(db, pk, obj)
8487
for role in await data_scope.awaitable_attrs.roles:
8588
for user in await role.awaitable_attrs.users:

0 commit comments

Comments
 (0)