From ea9d0608346235772a5db45adfc2aa8a99398674 Mon Sep 17 00:00:00 2001 From: Wu Clan Date: Mon, 9 Jun 2025 19:06:56 +0800 Subject: [PATCH] Update data scope and rule to m2m --- backend/app/admin/crud/crud_data_rule.py | 2 +- backend/app/admin/model/data_rule.py | 10 ++++------ backend/app/admin/model/data_scope.py | 6 +++--- backend/app/admin/model/m2m.py | 20 ++++++++++++++++++++ 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/backend/app/admin/crud/crud_data_rule.py b/backend/app/admin/crud/crud_data_rule.py index 5ea4b4da2..2240c16d1 100644 --- a/backend/app/admin/crud/crud_data_rule.py +++ b/backend/app/admin/crud/crud_data_rule.py @@ -31,7 +31,7 @@ async def get_list(self, name: str | None) -> Select: :param name: 规则名称 :return: """ - stmt = select(self.model).options(noload(self.model.scope)).order_by(desc(self.model.created_time)) + stmt = select(self.model).options(noload(self.model.scopes)).order_by(desc(self.model.created_time)) filters = [] if name is not None: diff --git a/backend/app/admin/model/data_rule.py b/backend/app/admin/model/data_rule.py index 4c8fde1c7..7ce3c81c0 100644 --- a/backend/app/admin/model/data_rule.py +++ b/backend/app/admin/model/data_rule.py @@ -4,9 +4,10 @@ from typing import TYPE_CHECKING -from sqlalchemy import ForeignKey, String +from sqlalchemy import String from sqlalchemy.orm import Mapped, mapped_column, relationship +from backend.app.admin.model.m2m import sys_data_scope_rule from backend.common.model import Base, id_key if TYPE_CHECKING: @@ -28,8 +29,5 @@ class DataRule(Base): ) value: Mapped[str] = mapped_column(String(255), comment='规则值') - # 数据范围规则一对多 - scope_id: Mapped[int | None] = mapped_column( - ForeignKey('sys_data_scope.id', ondelete='SET NULL'), default=None, comment='数据范围关联 ID' - ) - scope: Mapped[DataScope] = relationship(init=False, back_populates='rules') + # 数据范围规则多对多 + scopes: Mapped[list[DataScope]] = relationship(init=False, secondary=sys_data_scope_rule, back_populates='rules') diff --git a/backend/app/admin/model/data_scope.py b/backend/app/admin/model/data_scope.py index 1289dfe7d..3817e84d1 100644 --- a/backend/app/admin/model/data_scope.py +++ b/backend/app/admin/model/data_scope.py @@ -7,7 +7,7 @@ from sqlalchemy import String from sqlalchemy.orm import Mapped, mapped_column, relationship -from backend.app.admin.model.m2m import sys_role_data_scope +from backend.app.admin.model.m2m import sys_data_scope_rule, sys_role_data_scope from backend.common.model import Base, id_key if TYPE_CHECKING: @@ -23,8 +23,8 @@ class DataScope(Base): name: Mapped[str] = mapped_column(String(50), unique=True, comment='名称') status: Mapped[int] = mapped_column(default=1, comment='状态(0停用 1正常)') - # 数据范围规则一对多 - rules: Mapped[list[DataRule]] = relationship(init=False, back_populates='scope') + # 数据范围规则多对多 + rules: Mapped[list[DataRule]] = relationship(init=False, secondary=sys_data_scope_rule, back_populates='scopes') # 角色数据范围多对多 roles: Mapped[list[Role]] = relationship(init=False, secondary=sys_role_data_scope, back_populates='scopes') diff --git a/backend/app/admin/model/m2m.py b/backend/app/admin/model/m2m.py index 33f707006..bfb66db4a 100644 --- a/backend/app/admin/model/m2m.py +++ b/backend/app/admin/model/m2m.py @@ -33,3 +33,23 @@ comment='数据范围 ID', ), ) + +sys_data_scope_rule = Table( + 'sys_data_scope_rule', + MappedBase.metadata, + Column('id', INT, primary_key=True, unique=True, index=True, autoincrement=True, comment='主键ID'), + Column( + 'data_scope_id', + Integer, + ForeignKey('sys_data_scope.id', ondelete='CASCADE'), + primary_key=True, + comment='数据范围 ID', + ), + Column( + 'data_rule_id', + Integer, + ForeignKey('sys_data_rule.id', ondelete='CASCADE'), + primary_key=True, + comment='数据规则 ID', + ), +)