From 82d0b19bc2e1c0fad557b20120c5b382a54a621c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Fri, 28 Jun 2024 11:20:19 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=9B=B4=E6=96=B0=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E7=9A=84=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/role_menu_button_permission.py | 93 ++++++++++++++++--- .../role/components/PermissionComNew/api.ts | 8 +- .../components/PermissionComNew/index.vue | 10 +- 3 files changed, 89 insertions(+), 22 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index d44fab2..e9e0852 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -6,9 +6,11 @@ @Created on: 2021/6/3 003 0:30 @Remark: 菜单按钮管理 """ -from django.db.models import F, Subquery, OuterRef, Exists +from django.db.models import F, Subquery, OuterRef, Exists, BooleanField, Q, Case, Value, When +from django.db.models.functions import Coalesce from rest_framework import serializers from rest_framework.decorators import action +from rest_framework.fields import ListField from rest_framework.permissions import IsAuthenticated from dvadmin.system.models import RoleMenuButtonPermission, Menu, MenuButton, Dept, RoleMenuPermission, FieldPermission, \ @@ -172,24 +174,87 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): update_serializer_class = RoleMenuButtonPermissionCreateUpdateSerializer extra_filter_class = [] + # @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) + # def get_role_premission(self, request): + # """ + # 角色授权获取: + # :param request: role + # :return: menu,btns,columns + # """ + # params = request.query_params + # is_superuser = request.user.is_superuser + # if is_superuser: + # queryset = Menu.objects.filter(status=1, is_catalog=True).values('name', 'id').all() + # else: + # role_id = request.user.role.values_list('id', flat=True) + # menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('menu__id', flat=True) + # queryset = Menu.objects.filter(status=1, is_catalog=True, id__in=menu_list).values('name', 'id').all() + # serializer = RoleMenuSerializer(queryset, many=True, request=request) + # data = serializer.data + # return DetailResponse(data=data) + @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) - def get_role_premission(self, request): - """ - 角色授权获取: - :param request: role - :return: menu,btns,columns - """ + def get_role_permission(self, request): params = request.query_params + # 需要授权的角色信息 + current_role = params.get('role', None) + if current_role is None: + return ErrorResponse(msg='参数错误') is_superuser = request.user.is_superuser if is_superuser: - queryset = Menu.objects.filter(status=1, is_catalog=True).values('name', 'id').all() + menu_queryset = Menu.objects.prefetch_related('menuPermission').prefetch_related( + 'menufield_set') else: - role_id = request.user.role.values_list('id', flat=True) - menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('menu__id', flat=True) - queryset = Menu.objects.filter(status=1, is_catalog=True, id__in=menu_list).values('name', 'id').all() - serializer = RoleMenuSerializer(queryset, many=True, request=request) - data = serializer.data - return DetailResponse(data=data) + role_id_list = request.user.role.values_list('id', flat=True) + menu_list = RoleMenuPermission.objects.filter(role__in=role_id_list).values_list('menu__id', flat=True) + + # 当前角色已授权的菜单 + menu_queryset = Menu.objects.filter(id__in=menu_list).prefetch_related('menuPermission').prefetch_related('menufield_set') + result = [] + for menu_item in menu_queryset: + isCheck = RoleMenuPermission.objects.filter( + menu_id=menu_item.id, + role_id=current_role + ).exists() + dicts = { + 'name': menu_item.name, + 'id': menu_item.id, + 'parent': menu_item.parent.id if menu_item.parent else None, + 'isCheck':isCheck, + 'btns': [], + 'columns': [] + } + for mb_item in menu_item.menuPermission.all(): + rolemenubuttonpermission_queryset =RoleMenuButtonPermission.objects.filter( + menu_button_id=mb_item.id, + role_id=current_role + ).first() + dicts['btns'].append( + { + 'id': mb_item.id, + 'name': mb_item.name, + 'value': mb_item.value, + 'data_range': rolemenubuttonpermission_queryset.data_range + if rolemenubuttonpermission_queryset + else None, + 'isCheck': bool(rolemenubuttonpermission_queryset), + } + ) + for column_item in menu_item.menufield_set.all(): + fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first() + dicts['columns'].append({ + 'id':column_item.id, + 'field_name':column_item.field_name, + 'title':column_item.title, + 'is_query':fieldpermission_queryset.is_query, + 'is_create':fieldpermission_queryset.is_create, + 'is_update':fieldpermission_queryset.is_update + }) + result.append(dicts) + return DetailResponse(data=result) + + + @action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated]) def set_role_premission(self, request, pk): diff --git a/web/src/views/system/role/components/PermissionComNew/api.ts b/web/src/views/system/role/components/PermissionComNew/api.ts index eee6d2a..dde42b8 100644 --- a/web/src/views/system/role/components/PermissionComNew/api.ts +++ b/web/src/views/system/role/components/PermissionComNew/api.ts @@ -1,15 +1,17 @@ import { request } from "/@/utils/service"; - +import XEUtils from "xe-utils"; /** * 获取角色的授权列表 * @param roleId * @param query */ -export function getRolePremission(query:object) { +export function getRolePermission(query:object) { return request({ - url: '/api/system/role_menu_button_permission/get_role_premission/', + url: '/api/system/role_menu_button_permission/get_role_permission/', method: 'get', params:query + }).then((res:any)=>{ + return XEUtils.toArrayTree(res.data, {key: 'id', parentKey: 'parent',children: 'children',strict: false}) }) } diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 7770b05..6c21141 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -20,7 +20,7 @@ - + 页面显示权限
@@ -95,9 +95,9 @@ import { errorNotification } from '/@/utils/message'; import { getDataPermissionRange, getDataPermissionDept, - getRolePremission, + getRolePermission, setRolePremission, - setBtnDatarange + setBtnDatarange, } from './api'; import { MenuDataType, MenusType, DataPermissionRangeType, CustomDataPermissionDeptType } from './types'; import { ElMessage } from 'element-plus' @@ -155,8 +155,8 @@ let dataPermission = ref(); let customDataPermission = ref([]); //获取菜单,按钮,权限 const getMenuBtnPermission = async () => { - const resMenu = await getRolePremission({ role: props.roleId }) - menuData.value = resMenu.data + const resMenu = await getRolePermission({ role: props.roleId }) + menuData.value = resMenu } const fetchData = async (btnId) => {