From 5c55f4acdeefa73e16a1af6b0beec149c406853a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9A=93=E6=9C=88=E5=BD=92=E5=B0=98?= Date: Thu, 27 Feb 2025 21:31:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=9D=83=E9=99=90=E5=88=86=E9=85=8D=E5=BC=82=E5=B8=B8=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/permission.py | 20 +++++++++++++++++--- api/role.py | 4 ++-- controller/query.py | 3 ++- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/api/permission.py b/api/permission.py index 0938f82..a9840d1 100644 --- a/api/permission.py +++ b/api/permission.py @@ -14,7 +14,7 @@ from annotation.auth import Auth, hasAdmin from annotation.log import Log from config.constant import BusinessType, RedisKeyConfig from controller.login import LoginController -from models import Permission +from models import Permission, RolePermission from schemas.common import BaseResponse from schemas.permission import AddPermissionParams, GetPermissionInfoResponse, GetPermissionListResponse from utils.response import Response @@ -73,8 +73,8 @@ async def add_permission(request: Request, params: AddPermissionParams): @Auth(permission_list=["permission:btn:delete"]) async def delete_permission(request: Request, id: str = Path(description="权限ID")): if permission := await Permission.get_or_none(id=id, del_flag=1): - permission.del_flag = 0 - await permission.save() + # 移除角色权限 + await delete_permission_recursive(permission_id=permission.id) # 更新用户信息缓存 userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*') if userInfos: @@ -88,6 +88,20 @@ async def delete_permission(request: Request, id: str = Path(description="权限 return Response.error(msg="删除权限失败,权限不存在!") +async def delete_permission_recursive(permission_id: str): + """ + 递归删除权限及其附属权限 + :param permission_id: 权限ID + :return: + """ + await Permission.filter(id=permission_id, del_flag=1).update(del_flag=0) + await RolePermission.filter(permission_id=permission_id, del_flag=1).update(del_flag=0) + sub_permissions = await Permission.filter(parent_id=permission_id, del_flag=1).all() + for sub_department in sub_permissions: + await delete_permission_recursive(sub_department.id) + return True + + @permissionAPI.put("/update/{id}", response_model=BaseResponse, response_class=JSONResponse, summary="更新权限") @permissionAPI.post("/update/{id}", response_model=BaseResponse, response_class=JSONResponse, summary="更新权限") @Log(title="更新权限", business_type=BusinessType.UPDATE) diff --git a/api/role.py b/api/role.py index cfeeb43..b05053c 100644 --- a/api/role.py +++ b/api/role.py @@ -305,11 +305,11 @@ async def update_role_permission(request: Request, params: AddRolePermissionPara department_permissions = await Permission.filter(del_flag=1).values("id") else: department_permissions = await Permission.filter(is_admin=False, del_flag=1).values("id") - department_permissions = filterKeyValues(department_permissions, "id") + department_permissions = await filterKeyValues(department_permissions, key="id", convert_type=str) if role := await Role.get_or_none(id=id, del_flag=1, department__id__in=sub_departments): # 已有角色权限 rolePermissions = await RolePermission.filter(role_id=role.id, del_flag=1).values("permission_id") - rolePermissions = await filterKeyValues(rolePermissions, "permission_id") + rolePermissions = await filterKeyValues(rolePermissions, key="permission_id", convert_type=str) # 利用集合筛选出角色权限中不存在的权限 delete_list = set(rolePermissions).difference(set(params.permission_ids)) # 利用集合筛选出角色权限中新增的权限 diff --git a/controller/query.py b/controller/query.py index ece4217..0f57e57 100644 --- a/controller/query.py +++ b/controller/query.py @@ -132,7 +132,8 @@ class QueryController: keepAlive="permission__keep_alive", hiddenTag="permission__hidden_tag", showLink="permission__show_link", - showParent="permission__show_parent" + showParent="permission__show_parent", + isAdmin="permission__is_admin", ) permissions.extend(permission) return permissions