feat(20241226-fieldpermission): 优化列权限逻辑
1、后端优化,当多个角色的时候,合并列权限配置 2、前端优化,有多级表头时,列权限设置无效的bug
This commit is contained in:
@@ -404,7 +404,7 @@ PLUGINS_URL_PATTERNS = []
|
|||||||
# ********** 一键导入插件配置开始 **********
|
# ********** 一键导入插件配置开始 **********
|
||||||
# 例如:
|
# 例如:
|
||||||
# from dvadmin_upgrade_center.settings import * # 升级中心
|
# 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_third.settings import * # 第三方用户管理
|
||||||
# from dvadmin_ak_sk.settings import * # 秘钥管理管理
|
# from dvadmin_ak_sk.settings import * # 秘钥管理管理
|
||||||
# from dvadmin_tenants.settings import * # 租户管理
|
# from dvadmin_tenants.settings import * # 租户管理
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
from itertools import groupby
|
|
||||||
|
|
||||||
from django.db.models import F
|
from django.db.models import F
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
@@ -27,45 +25,32 @@ class FieldPermissionMixin:
|
|||||||
if finded is False:
|
if finded is False:
|
||||||
return []
|
return []
|
||||||
user = request.user
|
user = request.user
|
||||||
|
# 创建一个默认字典来存储最终的结果
|
||||||
|
result = {}
|
||||||
if user.is_superuser == 1:
|
if user.is_superuser == 1:
|
||||||
data = MenuField.objects.filter(model=model['model']).values('field_name')
|
data = MenuField.objects.filter(model=model['model']).values('field_name')
|
||||||
for item in data:
|
for item in data:
|
||||||
item['is_create'] = True
|
field_name = item.pop('field_name')
|
||||||
item['is_query'] = True
|
result[field_name] = {}
|
||||||
item['is_update'] = True
|
result[field_name]['is_create'] = True
|
||||||
|
result[field_name]['is_query'] = True
|
||||||
|
result[field_name]['is_update'] = True
|
||||||
else:
|
else:
|
||||||
roles = request.user.role.values_list('id', flat=True)
|
roles = request.user.role.values_list('id', flat=True)
|
||||||
data = FieldPermission.objects.filter(
|
data = FieldPermission.objects.filter(
|
||||||
field__model=model['model'], role__in=roles
|
field__model=model['model'], role__in=roles
|
||||||
).values('is_create', 'is_query', 'is_update', field_name=F('field__field_name'))
|
).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 需要先对列表进行排序,因为它只能对连续相同的元素进行分组。
|
for item in data:
|
||||||
grouped = groupby(sorted(list(data), key=lambda x: x['field_name']), key=lambda x: x['field_name'])
|
field_name = item.pop('field_name')
|
||||||
|
for key, value in item.items():
|
||||||
data = []
|
if field_name in result:
|
||||||
|
if value:
|
||||||
# 遍历分组,合并权限
|
result[field_name][key] = True
|
||||||
for key, group in grouped:
|
else:
|
||||||
|
result[field_name] = {}
|
||||||
# 初始化一个空字典来存储合并后的结果
|
result[field_name][key] = value
|
||||||
merged = {}
|
return DetailResponse(data=result)
|
||||||
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)
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import XEUtils from 'xe-utils';
|
||||||
import {useColumnPermission} from '/@/stores/columnPermission';
|
import {useColumnPermission} from '/@/stores/columnPermission';
|
||||||
|
|
||||||
type permissionType = 'is_create' | 'is_query' | 'is_update';
|
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 columns = crudOptions.columns;
|
||||||
const excludeColumns = ['checked','_index','id', 'create_datetime', 'update_datetime'].concat(excludeColumn)
|
const excludeColumns = ['checked','_index','id', 'create_datetime', 'update_datetime'].concat(excludeColumn)
|
||||||
for (let col in columns) {
|
XEUtils.eachTree(columns, (item, key) => {
|
||||||
for (let item of res.data) {
|
if (!excludeColumns.includes(String(key)) && key in res.data) {
|
||||||
if (excludeColumns.includes(item.field_name)) {
|
|
||||||
continue
|
|
||||||
} else if(item.field_name === col) {
|
|
||||||
// 如果列表不可见,则禁止在列设置中选择
|
// 如果列表不可见,则禁止在列设置中选择
|
||||||
// 只有列表不可见,才修改列配置,这样才不影响默认的配置
|
// 只有列表不可见,才修改列配置,这样才不影响默认的配置
|
||||||
if(!item['is_query']){
|
if (!res.data[key]['is_query']) {
|
||||||
columns[col].column.show = false
|
item.column.show = false;
|
||||||
columns[col].column.columnSetDisabled = true
|
item.column.columnSetDisabled = true;
|
||||||
}
|
|
||||||
columns[col].addForm = {
|
|
||||||
show: item['is_create']
|
|
||||||
}
|
|
||||||
columns[col].editForm = {
|
|
||||||
show: item['is_update']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
item.addForm = { show: res.data[key]['is_create'] };
|
||||||
|
item.editForm = { show: res.data[key]['is_update'] };
|
||||||
}
|
}
|
||||||
|
});
|
||||||
return crudOptions
|
return crudOptions
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user