!95 角色授权增加默认接口权限

1.授权时带入默认权限
2.查看权限,如果单接口权限与默认接口权限一致,显示默认接口权限
3.复选框等宽显示
This commit is contained in:
dvadmin
2025-01-30 04:44:58 +00:00
committed by Gitee
2 changed files with 97 additions and 7 deletions

View File

@@ -231,9 +231,17 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet):
isCheck = data.get('isCheck', None) isCheck = data.get('isCheck', None)
roleId = data.get('roleId', None) roleId = data.get('roleId', None)
btnId = data.get('btnId', None) btnId = data.get('btnId', None)
data_range = data.get('data_range', None) or 0 # 默认仅本人权限
dept = data.get('dept', None) or [] # 默认空部门
if isCheck: if isCheck:
# 添加权限:创建关联记录 # 添加权限:创建关联记录
RoleMenuButtonPermission.objects.create(role_id=roleId, menu_button_id=btnId) instance = RoleMenuButtonPermission.objects.create(role_id=roleId,
menu_button_id=btnId,
data_range=data_range)
# 自定义部门权限
if data_range == 4 and dept:
instance.dept.set(dept)
else: else:
# 删除权限:移除关联记录 # 删除权限:移除关联记录
RoleMenuButtonPermission.objects.filter(role_id=roleId, menu_button_id=btnId).delete() RoleMenuButtonPermission.objects.filter(role_id=roleId, menu_button_id=btnId).delete()

View File

@@ -1,9 +1,39 @@
<template> <template>
<div class="pccm-item" v-if="RoleMenuBtn.$state.length > 0"> <div class="pccm-item" v-if="RoleMenuBtn.$state.length > 0">
<div class="menu-form-alert">配置操作功能接口权限配置数据权限点击小齿轮</div> <div class="menu-form-alert">
<div style="display:flex; align-items: center; white-space: nowrap; margin-bottom: 10px;">
<span>默认接口权限:</span>
<el-select
v-model="default_selectBtn.data_range"
@change="defaulthandlePermissionRangeChange"
placeholder="请选择"
style="margin-left: 5px; width: 250px; min-width: 250px;"
>
<el-option v-for="item in dataPermissionRange" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-tree-select
v-show="default_selectBtn.data_range === 4"
node-key="id"
v-model="default_selectBtn.dept"
:props="defaultTreeProps"
:data="deptData"
@change="customhandlePermissionRangeChange(default_selectBtn.dept)"
placeholder="请选择自定义部门"
multiple
check-strictly
:render-after-expand="false"
show-checkbox
class="dialog-tree"
style="margin-left: 15px; width: AUTO; min-width: 250px; margin-top: 0;"
/>
</div>
<span>配置操作功能接口权限配置数据权限点击小齿轮</span>
</div>
<el-checkbox v-for="btn in RoleMenuBtn.$state" :key="btn.id" v-model="btn.isCheck" @change="handleCheckChange(btn)"> <el-checkbox v-for="btn in RoleMenuBtn.$state" :key="btn.id" v-model="btn.isCheck" @change="handleCheckChange(btn)">
<div class="btn-item"> <div class="btn-item">
{{ btn.data_range !== null ? `${btn.name}(${formatDataRange(btn.data_range)})` : btn.name }} {{ btn.data_range !== null ? `${btn.name}(${formatDataRange(btn.data_range, btn.dept)})` : btn.name }}
<span v-show="btn.isCheck" @click.stop.prevent="handleSettingClick(btn)"> <span v-show="btn.isCheck" @click.stop.prevent="handleSettingClick(btn)">
<el-icon> <el-icon>
<Setting /> <Setting />
@@ -48,10 +78,26 @@ import { RoleMenuBtnType } from '../types';
import { getRoleToDeptAll, setRoleMenuBtn, setRoleMenuBtnDataRange } from './api'; import { getRoleToDeptAll, setRoleMenuBtn, setRoleMenuBtnDataRange } from './api';
import XEUtils from 'xe-utils'; import XEUtils from 'xe-utils';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { Local } from '/@/utils/storage';
const RoleDrawer = RoleDrawerStores(); // 角色-菜单 const RoleDrawer = RoleDrawerStores(); // 角色-菜单
const RoleMenuTree = RoleMenuTreeStores(); // 角色-菜单 const RoleMenuTree = RoleMenuTreeStores(); // 角色-菜单
const RoleMenuBtn = RoleMenuBtnStores(); // 角色-菜单-按钮 const RoleMenuBtn = RoleMenuBtnStores(); // 角色-菜单-按钮
const dialogVisible = ref(false); const dialogVisible = ref(false);
// 默认按钮
const default_selectBtn = ref<RoleMenuBtnType>({
id: 0,
menu_btn_pre_id: 0,
/** 是否选中 */
isCheck: false,
/** 按钮名称 */
name: '',
/** 数据权限范围 */
data_range: Local.get('role_default_data_range'),
dept: Local.get('role_default_custom_dept'),
});
// 选中的按钮 // 选中的按钮
const selectBtn = ref<RoleMenuBtnType>({ const selectBtn = ref<RoleMenuBtnType>({
id: 0, id: 0,
@@ -83,6 +129,29 @@ const defaultTreeProps = {
value: 'id', value: 'id',
}; };
/**
* 默认数据权限下拉选择事件
* 保留数据到cache
*/
const defaulthandlePermissionRangeChange = async (val: number) => {
if (val < 4) {
// default_selectBtn.value.dept = [];
// Local.set('role_default_custom_dept', []);
}
default_selectBtn.value.data_range = val;
Local.set('role_default_data_range', val);
};
/**
* 默认部门下拉选择事件
* 保留数据到cache
*/
const customhandlePermissionRangeChange = async (dept: Array<number>) => {
default_selectBtn.value.dept = dept;
Local.set('role_default_custom_dept', dept);
};
/** /**
* 自定数据权限下拉选择事件 * 自定数据权限下拉选择事件
*/ */
@@ -95,12 +164,21 @@ const handlePermissionRangeChange = async (val: number) => {
* 格式化按钮数据范围 * 格式化按钮数据范围
*/ */
const formatDataRange = computed(() => { const formatDataRange = computed(() => {
return function (datarange: number) { return function (datarange: number, dept: Array<number>) {
const datarangeitem = XEUtils.find(dataPermissionRange.value, (item: any) => { const datarangeitem = XEUtils.find(dataPermissionRange.value, (item: any) => {
if (item.value === datarange) { if (item.value === datarange) {
return item.label; return item.label;
} }
}); });
// 数据权限与默认数据权限一致
if (datarange === default_selectBtn.value.data_range) {
// 判断选择的部门是否一致
if (datarange !== 4 || JSON.stringify(dept) === JSON.stringify(default_selectBtn.value.dept)) {
return "默认接口权限"
}
}
// datarange === 4 选择的部门不一致返回datarangeitem.label
return datarangeitem.label; return datarangeitem.label;
}; };
}); });
@@ -108,11 +186,14 @@ const formatDataRange = computed(() => {
* 勾选按钮 * 勾选按钮
*/ */
const handleCheckChange = async (btn: RoleMenuBtnType) => { const handleCheckChange = async (btn: RoleMenuBtnType) => {
selectBtn.value = default_selectBtn.value;
const put_data = { const put_data = {
isCheck: btn.isCheck, isCheck: btn.isCheck,
roleId: RoleDrawer.roleId, roleId: RoleDrawer.roleId,
menuId: RoleMenuTree.id, menuId: RoleMenuTree.id,
btnId: btn.id, btnId: btn.id,
data_range: default_selectBtn.value.data_range,
dept: default_selectBtn.value.dept,
}; };
const { data, msg } = await setRoleMenuBtn(put_data); const { data, msg } = await setRoleMenuBtn(put_data);
RoleMenuBtn.updateState(data); RoleMenuBtn.updateState(data);
@@ -168,9 +249,10 @@ onMounted(async () => {
background-color: var(--el-color-primary); background-color: var(--el-color-primary);
} }
} }
// .el-checkbox {
// width: 200px; .el-checkbox {
// } width: 20%;
}
.btn-item { .btn-item {
display: flex; display: flex;
align-items: center; align-items: center;