fix: 修正角色权限分配异常问题

This commit is contained in:
2025-02-28 16:47:48 +08:00
parent b59dba18f0
commit 141883424b
4 changed files with 30 additions and 12 deletions

View File

@@ -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,19 @@ 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)

View File

@@ -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))
# 利用集合筛选出角色权限中新增的权限

View File

@@ -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

View File

@@ -5,6 +5,8 @@
# @File : common.py
# @Software : PyCharm
# @Comment : 本程序
from typing import List, Any, Optional, Type
def bytes2human(n, format_str='%(value).1f%(symbol)s'):
"""Used by various scripts. See:
@@ -26,11 +28,13 @@ def bytes2human(n, format_str='%(value).1f%(symbol)s'):
return format_str % dict(symbol=symbols[0], value=n)
async def filterKeyValues(dataList: list, key: str) -> list:
async def filterKeyValues(dataList: List[dict], key: str, default: Any = None, convert_type: Optional[Type] = None) -> List[Any]:
"""
获取列表字段数据
:param dataList: 数据列表
:param key: 关键字
:return:
获取列表字段数据,并可选择进行类型转换。
:param dataList: 数据列表(列表中的元素是字典)
:param key: 要提取的字段
:param default: 如果字段不存在,返回的默认值
:param convert_type: 需要转换的类型(如 int、str、float 等),默认为 None 不转换
:return: 提取并转换后的值列表
"""
return [item[key] for item in dataList]
return [convert_type(item.get(key, default)) if convert_type else item.get(key, default) for item in dataList]