From b542ef908681f6c45106504a723fac3067150099 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Fri, 24 May 2024 22:17:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(muzili):=20=E4=BF=AE=E6=94=B9=E6=9D=83?= =?UTF-8?q?=E9=99=90=E9=85=8D=E7=BD=AE=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、修改了权限配置页面布局 2、修复权限页面,保存菜单授权按钮的后端逻辑 --- .../views/role_menu_button_permission.py | 164 +++++++++------- .../components/PermissionComNew/index.vue | 184 +++++++++--------- .../role/components/PermissionComNew/types.ts | 11 +- 3 files changed, 187 insertions(+), 172 deletions(-) diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index 745daee8..604ebe24 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -23,13 +23,13 @@ class RoleMenuButtonPermissionSerializer(CustomModelSerializer): """ 菜单按钮-序列化器 """ + class Meta: model = RoleMenuButtonPermission fields = "__all__" read_only_fields = ["id"] - class RoleMenuButtonPermissionCreateUpdateSerializer(CustomModelSerializer): """ 初始化菜单按钮-序列化器 @@ -67,17 +67,17 @@ class RoleButtonPermissionSerializer(CustomModelSerializer): return None return obj.data_range - class Meta: model = MenuButton - fields = ['id','name','value','isCheck','data_range'] + fields = ['id', 'name', 'value', 'isCheck', 'data_range'] -class RoleFieldPermissionSerializer(CustomModelSerializer): +class RoleFieldPermissionSerializer(CustomModelSerializer): class Meta: model = FieldPermission fields = "__all__" + class RoleMenuFieldSerializer(CustomModelSerializer): is_query = serializers.SerializerMethodField() is_create = serializers.SerializerMethodField() @@ -103,24 +103,38 @@ class RoleMenuFieldSerializer(CustomModelSerializer): if queryset: return queryset.is_update return False + class Meta: model = MenuField - fields = ['id','field_name','title','is_query','is_create','is_update'] + fields = ['id', 'field_name', 'title', 'is_query', 'is_create', 'is_update'] + + +class RoleMenuSerializer(CustomModelSerializer): + menus = serializers.SerializerMethodField() + + def get_menus(self, instance): + menu_list = Menu.objects.filter(parent=instance['id']).values('id', 'name') + serializer = RoleMenuPermissionSerializer(menu_list, many=True, request=self.request) + return serializer.data + + class Meta: + model = Menu + fields = ['id', 'name', 'menus'] class RoleMenuPermissionSerializer(CustomModelSerializer): """ 菜单和按钮权限 """ - name = serializers.SerializerMethodField() + # name = serializers.SerializerMethodField() isCheck = serializers.SerializerMethodField() btns = serializers.SerializerMethodField() columns = serializers.SerializerMethodField() - def get_name(self, instance): - parent_list = Menu.get_all_parent(instance['id']) - names = [d["name"] for d in parent_list] - return "/".join(names) + # def get_name(self, instance): + # parent_list = Menu.get_all_parent(instance['id']) + # names = [d["name"] for d in parent_list] + # return "/".join(names) def get_isCheck(self, instance): params = self.request.query_params return RoleMenuPermission.objects.filter( @@ -130,19 +144,18 @@ class RoleMenuPermissionSerializer(CustomModelSerializer): def get_btns(self, instance): btn_list = MenuButton.objects.filter(menu__id=instance['id']).values('id', 'name', 'value') - serializer = RoleButtonPermissionSerializer(btn_list,many=True,request=self.request) - return serializer.data + serializer = RoleButtonPermissionSerializer(btn_list, many=True, request=self.request) + return serializer.data def get_columns(self, instance): col_list = MenuField.objects.filter(menu=instance['id']) - serializer = RoleMenuFieldSerializer(col_list,many=True,request=self.request) + serializer = RoleMenuFieldSerializer(col_list, many=True, request=self.request) return serializer.data - - class Meta: model = Menu - fields = ['id','name','isCheck','btns','columns'] + fields = ['id', 'name', 'isCheck', 'btns', 'columns'] + class RoleMenuButtonPermissionViewSet(CustomModelViewSet): """ @@ -167,54 +180,54 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): :return: menu,btns,columns """ params = request.query_params - role = params.get('role',None) - if role is None: + role = params.get('role', None) + if role is None: return ErrorResponse(msg="未获取到角色信息") is_superuser = request.user.is_superuser - # if is_superuser: - # queryset = Menu.objects.filter(status=1,is_catalog=False).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('id',flat=True) - # queryset = Menu.objects.filter(status=1, is_catalog=False,id__in=menu_list).values('name', 'id').all() - # serializer = RoleMenuPermissionSerializer(queryset,many=True,request=request) - # data = serializer.data - # return DetailResponse(data=data) - data = [] if is_superuser: - queryset = Menu.objects.filter(status=1,is_catalog=False).values('name', 'id').all() + 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('id',flat=True) - queryset = Menu.objects.filter(status=1, is_catalog=False,id__in=menu_list).values('name', 'id') - for item in queryset: - parent_list = Menu.get_all_parent(item['id']) - names = [d["name"] for d in parent_list] - completeName = "/".join(names) - isCheck = RoleMenuPermission.objects.filter( - menu__id=item['id'], - role__id=role, - ).exists() - mbCheck = RoleMenuButtonPermission.objects.filter( - menu_button=OuterRef("pk"), - role__id=role, - ) - btns = MenuButton.objects.filter( - menu__id=item['id'], - ).annotate(isCheck=Exists(mbCheck)).values('id', 'name', 'value', 'isCheck', - data_range=F('menu_button_permission__data_range')) - dicts = { - 'name': completeName, - 'id': item['id'], - 'isCheck': isCheck, - 'btns': btns, - - } - data.append(dicts) + menu_list = RoleMenuPermission.objects.filter(role__in=role_id).values_list('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) + # data = [] + # if is_superuser: + # queryset = Menu.objects.filter(status=1, is_catalog=False).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('id', flat=True) + # queryset = Menu.objects.filter(status=1, is_catalog=False, id__in=menu_list).values('name', 'id') + # for item in queryset: + # parent_list = Menu.get_all_parent(item['id']) + # names = [d["name"] for d in parent_list] + # completeName = "/".join(names) + # isCheck = RoleMenuPermission.objects.filter( + # menu__id=item['id'], + # role__id=role, + # ).exists() + # mbCheck = RoleMenuButtonPermission.objects.filter( + # menu_button=OuterRef("pk"), + # role__id=role, + # ) + # btns = MenuButton.objects.filter( + # menu__id=item['id'], + # ).annotate(isCheck=Exists(mbCheck)).values('id', 'name', 'value', 'isCheck', + # data_range=F('menu_button_permission__data_range')) + # dicts = { + # 'name': completeName, + # 'id': item['id'], + # 'isCheck': isCheck, + # 'btns': btns, + # + # } + # data.append(dicts) + # return DetailResponse(data=data) @action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated]) - def set_role_premission(self,request,pk): + def set_role_premission(self, request, pk): """ 对角色的菜单和按钮及按钮范围授权: :param request: @@ -224,25 +237,30 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): body = request.data RoleMenuPermission.objects.filter(role=pk).delete() RoleMenuButtonPermission.objects.filter(role=pk).delete() - for menu in body: - if menu.get('isCheck'): - menu_parent = Menu.get_all_parent(menu.get('id')) - role_menu_permission_list = [] - for d in menu_parent: - role_menu_permission_list.append(RoleMenuPermission(role_id=pk, menu_id=d["id"])) - RoleMenuPermission.objects.bulk_create(role_menu_permission_list) - # RoleMenuPermission.objects.create(role_id=pk, menu_id=menu.get('id')) - for btn in menu.get('btns'): - if btn.get('isCheck'): - data_range = btn.get('data_range',0) or 0 - instance = RoleMenuButtonPermission.objects.create(role_id=pk, menu_button_id=btn.get('id'),data_range=data_range) - instance.dept.set(btn.get('dept',[])) - for col in menu.get('columns'): - FieldPermission.objects.update_or_create(role_id=pk,field_id=col.get('id'),is_query=col.get('is_query'),is_create=col.get('is_create'),is_update=col.get('is_update')) + for item in body: + for menu in item["menus"]: + if menu.get('isCheck'): + menu_parent = Menu.get_all_parent(menu.get('id')) + role_menu_permission_list = [] + for d in menu_parent: + role_menu_permission_list.append(RoleMenuPermission(role_id=pk, menu_id=d["id"])) + RoleMenuPermission.objects.bulk_create(role_menu_permission_list) + # RoleMenuPermission.objects.create(role_id=pk, menu_id=menu.get('id')) + for btn in menu.get('btns'): + if btn.get('isCheck'): + data_range = btn.get('data_range', 0) or 0 + instance = RoleMenuButtonPermission.objects.create(role_id=pk, menu_button_id=btn.get('id'), + data_range=data_range) + instance.dept.set(btn.get('dept', [])) + for col in menu.get('columns'): + FieldPermission.objects.update_or_create(role_id=pk, field_id=col.get('id'), + defaults={ + 'is_query': col.get('is_query'), + 'is_create': col.get('is_create'), + 'is_update': col.get('is_update') + }) return DetailResponse(msg="授权成功") - - @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated]) def role_menu_get_button(self, request): """ diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index a76a154c..07264b11 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -1,8 +1,6 @@