From dddafa4826ed9ff9730096e86e8cf38b40da68c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Thu, 26 Dec 2024 08:56:19 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(20241226-fieldpermission):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=88=97=E6=9D=83=E9=99=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、后端优化,当多个角色的时候,合并列权限配置 2、前端优化,有多级表头时,列权限设置无效的bug --- backend/application/settings.py | 2 +- backend/dvadmin/utils/field_permission.py | 67 +++++++++-------------- web/src/utils/columnPermission.ts | 29 ++++------ 3 files changed, 38 insertions(+), 60 deletions(-) diff --git a/backend/application/settings.py b/backend/application/settings.py index 1d0adf79..e6bdec5e 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -404,7 +404,7 @@ PLUGINS_URL_PATTERNS = [] # ********** 一键导入插件配置开始 ********** # 例如: # from dvadmin_upgrade_center.settings import * # 升级中心 -from dvadmin3_celery.settings import * # celery 异步任务 +# from dvadmin3_celery.settings import * # celery 异步任务 # from dvadmin_third.settings import * # 第三方用户管理 # from dvadmin_ak_sk.settings import * # 秘钥管理管理 # from dvadmin_tenants.settings import * # 租户管理 diff --git a/backend/dvadmin/utils/field_permission.py b/backend/dvadmin/utils/field_permission.py index 7c259f68..97bb953e 100644 --- a/backend/dvadmin/utils/field_permission.py +++ b/backend/dvadmin/utils/field_permission.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -from itertools import groupby - from django.db.models import F from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated @@ -12,7 +10,7 @@ from dvadmin.utils.models import get_custom_app_models class FieldPermissionMixin: - @action(methods=['get'], detail=False,permission_classes=[IsAuthenticated]) + @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def field_permission(self, request): """ 获取字段权限 @@ -27,45 +25,32 @@ class FieldPermissionMixin: if finded is False: return [] user = request.user - if user.is_superuser==1: - data = MenuField.objects.filter( model=model['model']).values('field_name') + # 创建一个默认字典来存储最终的结果 + result = {} + if user.is_superuser == 1: + data = MenuField.objects.filter(model=model['model']).values('field_name') for item in data: - item['is_create'] = True - item['is_query'] = True - item['is_update'] = True - else: - roles = request.user.role.values_list('id', flat=True) - data= FieldPermission.objects.filter( - field__model=model['model'],role__in=roles - ).values( 'is_create', 'is_query', 'is_update',field_name=F('field__field_name')) - + field_name = item.pop('field_name') + result[field_name] = {} + result[field_name]['is_create'] = True + result[field_name]['is_query'] = True + result[field_name]['is_update'] = True + else: + roles = request.user.role.values_list('id', flat=True) + data = FieldPermission.objects.filter( + field__model=model['model'], role__in=roles + ).values('is_create', 'is_query', 'is_update', field_name=F('field__field_name')) """ 合并权限 - - 这段代码首先根据 field_name 对列表进行排序, - 然后使用 groupby 按 field_name 进行分组。 - 对于每个组,它创建一个新的字典 merged, - 并遍历组中的每个字典,将布尔值字段使用逻辑或(or)操作符进行合并(如果 merged 中还没有该字段,则默认为 False), - 其他字段(如 field_name)则直接取组的关键字(即 key) """ - - # 使用field_name对列表进行分组, # groupby 需要先对列表进行排序,因为它只能对连续相同的元素进行分组。 - grouped = groupby(sorted(list(data), key=lambda x: x['field_name']), key=lambda x: x['field_name']) - - data = [] - - # 遍历分组,合并权限 - for key, group in grouped: - - # 初始化一个空字典来存储合并后的结果 - merged = {} - for item in group: - # 合并权限, True值优先 - merged['is_create'] = merged.get('is_create', False) or item['is_create'] - merged['is_query'] = merged.get('is_query', False) or item['is_query'] - merged['is_update'] = merged.get('is_update', False) or item['is_update'] - merged['field_name'] = key - - data.append(merged) - - return DetailResponse(data=data) \ No newline at end of file + # 遍历原始数据并填充结果字典 + for item in data: + field_name = item.pop('field_name') + for key, value in item.items(): + if field_name in result: + if value: + result[field_name][key] = True + else: + result[field_name] = {} + result[field_name][key] = value + return DetailResponse(data=result) diff --git a/web/src/utils/columnPermission.ts b/web/src/utils/columnPermission.ts index adff4e1f..e58c9347 100644 --- a/web/src/utils/columnPermission.ts +++ b/web/src/utils/columnPermission.ts @@ -1,3 +1,4 @@ +import XEUtils from 'xe-utils'; import {useColumnPermission} from '/@/stores/columnPermission'; type permissionType = 'is_create' | 'is_query' | 'is_update'; @@ -23,25 +24,17 @@ export const handleColumnPermission = async (func: Function, crudOptions: any,ex } const columns = crudOptions.columns; const excludeColumns = ['checked','_index','id', 'create_datetime', 'update_datetime'].concat(excludeColumn) - for (let col in columns) { - for (let item of res.data) { - if (excludeColumns.includes(item.field_name)) { - continue - } else if(item.field_name === col) { - // 如果列表不可见,则禁止在列设置中选择 - // 只有列表不可见,才修改列配置,这样才不影响默认的配置 - if(!item['is_query']){ - columns[col].column.show = false - columns[col].column.columnSetDisabled = true - } - columns[col].addForm = { - show: item['is_create'] - } - columns[col].editForm = { - show: item['is_update'] - } + XEUtils.eachTree(columns, (item, key) => { + if (!excludeColumns.includes(String(key)) && key in res.data) { + // 如果列表不可见,则禁止在列设置中选择 + // 只有列表不可见,才修改列配置,这样才不影响默认的配置 + if (!res.data[key]['is_query']) { + item.column.show = false; + item.column.columnSetDisabled = true; } + item.addForm = { show: res.data[key]['is_create'] }; + item.editForm = { show: res.data[key]['is_update'] }; } - } + }); return crudOptions } -- Gitee From 6726d0167eab0fa910d409beb92df2d9e93e416b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=B0=8F=E6=B6=9B?= <1537080775@qq.com> Date: Thu, 26 Dec 2024 10:26:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat(20241226-fieldpermission):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=88=97=E6=9D=83=E9=99=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、优化后端合并权限代码 --- backend/dvadmin/utils/field_permission.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/backend/dvadmin/utils/field_permission.py b/backend/dvadmin/utils/field_permission.py index 97bb953e..b20cb4b6 100644 --- a/backend/dvadmin/utils/field_permission.py +++ b/backend/dvadmin/utils/field_permission.py @@ -46,11 +46,9 @@ class FieldPermissionMixin: # 遍历原始数据并填充结果字典 for item in data: field_name = item.pop('field_name') - for key, value in item.items(): - if field_name in result: - if value: - result[field_name][key] = True - else: - result[field_name] = {} - result[field_name][key] = value + if field_name not in result: + result[field_name] = item + else: + for key, value in item.items(): + result[field_name][key] = result[field_name][key] or value return DetailResponse(data=result) -- Gitee