feat(role_menu_20240628): 优化权限配置,增强用户体验
- 修复无法保存菜单授权bug - 列权限增加禁用状态的逻辑判断
This commit is contained in:
@@ -209,7 +209,8 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet):
|
|||||||
menu_list = RoleMenuPermission.objects.filter(role__in=role_id_list).values_list('menu__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')
|
menu_queryset = Menu.objects.filter(id__in=menu_list).prefetch_related('menuPermission').prefetch_related(
|
||||||
|
'menufield_set')
|
||||||
result = []
|
result = []
|
||||||
for menu_item in menu_queryset:
|
for menu_item in menu_queryset:
|
||||||
isCheck = RoleMenuPermission.objects.filter(
|
isCheck = RoleMenuPermission.objects.filter(
|
||||||
@@ -240,22 +241,27 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet):
|
|||||||
'isCheck': bool(rolemenubuttonpermission_queryset),
|
'isCheck': bool(rolemenubuttonpermission_queryset),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
for column_item in menu_item.menufield_set.all():
|
for column_item in menu_item.menufield_set.all():
|
||||||
fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first()
|
fieldpermission_queryset = column_item.menu_field.filter(role_id=current_role).first()
|
||||||
|
query = fieldpermission_queryset.is_query if fieldpermission_queryset else None
|
||||||
|
create = fieldpermission_queryset.is_create if fieldpermission_queryset else None
|
||||||
|
update = fieldpermission_queryset.is_update if fieldpermission_queryset else None
|
||||||
dicts['columns'].append({
|
dicts['columns'].append({
|
||||||
'id': column_item.id,
|
'id': column_item.id,
|
||||||
'field_name': column_item.field_name,
|
'field_name': column_item.field_name,
|
||||||
'title': column_item.title,
|
'title': column_item.title,
|
||||||
'is_query':fieldpermission_queryset.is_query,
|
'is_query': query,
|
||||||
'is_create':fieldpermission_queryset.is_create,
|
'is_create': create,
|
||||||
'is_update':fieldpermission_queryset.is_update
|
'is_update': update,
|
||||||
|
'query_disabled': False if is_superuser else not query,
|
||||||
|
'create_disabled': False if is_superuser else not create,
|
||||||
|
'update_disabled': False if is_superuser else not update,
|
||||||
})
|
})
|
||||||
|
print(dicts['columns'])
|
||||||
result.append(dicts)
|
result.append(dicts)
|
||||||
return DetailResponse(data=result)
|
return DetailResponse(data=result)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated])
|
@action(methods=['PUT'], detail=True, permission_classes=[IsAuthenticated])
|
||||||
def set_role_premission(self, request, pk):
|
def set_role_premission(self, request, pk):
|
||||||
"""
|
"""
|
||||||
@@ -268,7 +274,7 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet):
|
|||||||
RoleMenuPermission.objects.filter(role=pk).delete()
|
RoleMenuPermission.objects.filter(role=pk).delete()
|
||||||
RoleMenuButtonPermission.objects.filter(role=pk).delete()
|
RoleMenuButtonPermission.objects.filter(role=pk).delete()
|
||||||
for item in body:
|
for item in body:
|
||||||
for menu in item["menus"]:
|
for menu in item["children"]:
|
||||||
if menu.get('isCheck'):
|
if menu.get('isCheck'):
|
||||||
menu_parent = Menu.get_all_parent(menu.get('id'))
|
menu_parent = Menu.get_all_parent(menu.get('id'))
|
||||||
role_menu_permission_list = []
|
role_menu_permission_list = []
|
||||||
@@ -283,6 +289,7 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet):
|
|||||||
data_range=data_range)
|
data_range=data_range)
|
||||||
instance.dept.set(btn.get('dept', []))
|
instance.dept.set(btn.get('dept', []))
|
||||||
for col in menu.get('columns'):
|
for col in menu.get('columns'):
|
||||||
|
print(col)
|
||||||
FieldPermission.objects.update_or_create(role_id=pk, field_id=col.get('id'),
|
FieldPermission.objects.update_or_create(role_id=pk, field_id=col.get('id'),
|
||||||
defaults={
|
defaults={
|
||||||
'is_query': col.get('is_query'),
|
'is_query': col.get('is_query'),
|
||||||
|
|||||||
@@ -55,7 +55,8 @@
|
|||||||
<li v-for="(c_item, c_index) in menu.columns" :key="c_index" class="columns-item">
|
<li v-for="(c_item, c_index) in menu.columns" :key="c_index" class="columns-item">
|
||||||
<div class="width-txt">{{ c_item.title }}</div>
|
<div class="width-txt">{{ c_item.title }}</div>
|
||||||
<div v-for="(col, cIndex) in column.header" :key="cIndex" class="width-check">
|
<div v-for="(col, cIndex) in column.header" :key="cIndex" class="width-check">
|
||||||
<el-checkbox v-model="c_item[col.value]" class="ci-checkout"></el-checkbox>
|
<el-checkbox v-model="c_item[col.value]" class="ci-checkout"
|
||||||
|
:disabled="c_item[col.disabled]"></el-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -99,7 +100,7 @@ import {
|
|||||||
setRolePremission,
|
setRolePremission,
|
||||||
setBtnDatarange,
|
setBtnDatarange,
|
||||||
} from './api';
|
} from './api';
|
||||||
import { MenuDataType, MenusType, DataPermissionRangeType, CustomDataPermissionDeptType } from './types';
|
import { MenuDataType, DataPermissionRangeType, CustomDataPermissionDeptType } from './types';
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -159,6 +160,7 @@ let customDataPermission = ref([]);
|
|||||||
const getMenuBtnPermission = async () => {
|
const getMenuBtnPermission = async () => {
|
||||||
const resMenu = await getRolePermission({ role: props.roleId })
|
const resMenu = await getRolePermission({ role: props.roleId })
|
||||||
menuData.value = resMenu
|
menuData.value = resMenu
|
||||||
|
|
||||||
}
|
}
|
||||||
// 获取按钮的数据权限下拉选项
|
// 获取按钮的数据权限下拉选项
|
||||||
const getDataPermissionRangeLable = async () => {
|
const getDataPermissionRangeLable = async () => {
|
||||||
@@ -186,7 +188,7 @@ const fetchData = async (btnId:number) => {
|
|||||||
* @param record 当前菜单
|
* @param record 当前菜单
|
||||||
* @param btnType 按钮类型
|
* @param btnType 按钮类型
|
||||||
*/
|
*/
|
||||||
const handleSettingClick = (record: MenusType, btn: MenusType['btns'][number]) => {
|
const handleSettingClick = (record: MenuDataType, btn: MenuDataType['btns'][number]) => {
|
||||||
menuCurrent.value = record;
|
menuCurrent.value = record;
|
||||||
menuBtnCurrent.value = btn.id;
|
menuBtnCurrent.value = btn.id;
|
||||||
dialogVisible.value = true;
|
dialogVisible.value = true;
|
||||||
@@ -195,7 +197,7 @@ const handleSettingClick = (record: MenusType, btn: MenusType['btns'][number]) =
|
|||||||
fetchData(btn.id)
|
fetchData(btn.id)
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleColumnChange = (val: boolean, record: MenusType, btnType: string) => {
|
const handleColumnChange = (val: boolean, record: MenuDataType, btnType: string) => {
|
||||||
for (const iterator of record.columns) {
|
for (const iterator of record.columns) {
|
||||||
iterator[btnType] = val;
|
iterator[btnType] = val;
|
||||||
}
|
}
|
||||||
@@ -218,10 +220,8 @@ const handleDialogConfirm = () => {
|
|||||||
errorNotification('请选择');
|
errorNotification('请选择');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//if (dataPermission.value !== 4) {}
|
|
||||||
for (const item of menuData.value) {
|
for (const item of menuData.value) {
|
||||||
for (const iterator of item.menus) {
|
for (const iterator of item.children) {
|
||||||
if (iterator.id === menuCurrent.value.id) {
|
if (iterator.id === menuCurrent.value.id) {
|
||||||
for (const btn of iterator.btns) {
|
for (const btn of iterator.btns) {
|
||||||
if (btn.id === menuBtnCurrent.value) {
|
if (btn.id === menuBtnCurrent.value) {
|
||||||
@@ -243,7 +243,7 @@ const handleDialogClose = () => {
|
|||||||
dataPermission.value = null;
|
dataPermission.value = null;
|
||||||
};
|
};
|
||||||
|
|
||||||
//保存权限
|
//保存菜单授权
|
||||||
const handleSavePermission = () => {
|
const handleSavePermission = () => {
|
||||||
setRolePremission(props.roleId, menuData.value).then((res: any) => {
|
setRolePremission(props.roleId, menuData.value).then((res: any) => {
|
||||||
ElMessage({
|
ElMessage({
|
||||||
@@ -254,10 +254,11 @@ const handleSavePermission = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const column = reactive({
|
const column = reactive({
|
||||||
header: [{ value: 'is_create', label: '新增可见' }, { value: 'is_update', label: '编辑可见' }, {
|
header: [
|
||||||
value: 'is_query',
|
{ value: 'is_create', label: '新增可见',disabled:'create_disabled'},
|
||||||
label: '列表可见'
|
{ value: 'is_update', label: '编辑可见' ,disabled:'update_disabled'},
|
||||||
}]
|
{ value: 'is_query', label: '列表可见',disabled:'query_disabled' }
|
||||||
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ export interface CustomDataPermissionDeptType {
|
|||||||
id: number;
|
id: number;
|
||||||
name: string;
|
name: string;
|
||||||
patent: number;
|
patent: number;
|
||||||
children: CustomDataPermissionDeptType[]
|
children: CustomDataPermissionDeptType[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CustomDataPermissionMenuType {
|
export interface CustomDataPermissionMenuType {
|
||||||
@@ -16,21 +16,14 @@ export interface CustomDataPermissionMenuType {
|
|||||||
is_catalog: boolean;
|
is_catalog: boolean;
|
||||||
menuPermission: { id: number; name: string; value: string }[] | null;
|
menuPermission: { id: number; name: string; value: string }[] | null;
|
||||||
columns: { id: number; name: string; title: string }[] | null;
|
columns: { id: number; name: string; title: string }[] | null;
|
||||||
children: CustomDataPermissionMenuType[]
|
children: CustomDataPermissionMenuType[];
|
||||||
}
|
|
||||||
|
|
||||||
export interface MenusType{
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
isCheck: boolean;
|
|
||||||
radio: string;
|
|
||||||
btns: { id:number,name: string; value: string; isCheck: boolean; data_range: number; dept:object; name:string }[];
|
|
||||||
columns: { [key: string]: boolean | string; }[]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MenuDataType {
|
export interface MenuDataType {
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
menus:MenusType[];
|
isCheck: boolean;
|
||||||
|
btns: { id: number; name: string; value: string; isCheck: boolean; data_range: number; dept: object }[];
|
||||||
|
columns: { [key: string]: boolean | string; }[];
|
||||||
|
children: MenuDataType[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user