fix: 修正角色权限分配异常问题
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
# 利用集合筛选出角色权限中新增的权限
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user