diff --git a/backend/dvadmin/system/views/role_menu_button_permission.py b/backend/dvadmin/system/views/role_menu_button_permission.py index e26d7ef..755ff80 100644 --- a/backend/dvadmin/system/views/role_menu_button_permission.py +++ b/backend/dvadmin/system/views/role_menu_button_permission.py @@ -284,27 +284,21 @@ class RoleMenuButtonPermissionViewSet(CustomModelViewSet): RoleMenuPermission.objects.filter(role=pk).delete() RoleMenuButtonPermission.objects.filter(role=pk).delete() for item in body: - for menu in item["children"]: - 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') - }) + if item.get('isCheck'): + RoleMenuPermission.objects.create(role_id=pk, menu_id=item["id"]) + for btn in item.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 item.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]) diff --git a/web/src/views/system/menu/components/MenuFormCom/index.vue b/web/src/views/system/menu/components/MenuFormCom/index.vue index 37dff84..15591b5 100644 --- a/web/src/views/system/menu/components/MenuFormCom/index.vue +++ b/web/src/views/system/menu/components/MenuFormCom/index.vue @@ -10,21 +10,12 @@ - + - + @@ -35,12 +26,14 @@ - + - + @@ -48,46 +41,45 @@ - + - + + + + + + + + + + + - - - - - - - - - - - + - + - + @@ -96,7 +88,8 @@ - + @@ -119,6 +112,8 @@ import { lazyLoadMenu, AddObj, UpdateObj } from '../../api'; import { successNotification } from '/@/utils/message'; import { MenuFormDataType, MenuTreeItemType, ComponentFileItem, APIResponseData } from '../../types'; import type Node from 'element-plus/es/components/tree/src/model/node'; +import { log } from 'console'; +import XEUtils from 'xe-utils'; interface IProps { initFormData: Partial | null; @@ -149,14 +144,14 @@ const validateWebPath = (rule: any, value: string, callback: Function) => { }; const validateLinkUrl = (rule: any, value: string, callback: Function) => { - let pattern = /^\/.*?/; - let patternUrl = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/; - const reg = pattern.test(value) || patternUrl.test(value) - if (reg) { - callback(); - } else { - callback(new Error('请输入正确的地址')); - } + let pattern = /^\/.*?/; + let patternUrl = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/; + const reg = pattern.test(value) || patternUrl.test(value) + if (reg) { + callback(); + } else { + callback(new Error('请输入正确的地址')); + } }; const props = withDefaults(defineProps(), { @@ -173,7 +168,7 @@ const rules = reactive({ name: [{ required: true, message: '菜单名称必填', trigger: 'blur' }], component: [{ required: true, message: '请输入组件地址', trigger: 'blur' }], component_name: [{ required: true, message: '请输入组件名称', trigger: 'blur' }], - link_url: [{ required: true, message: '请输入外链接地址',validator:validateLinkUrl, trigger: 'blur' }], + link_url: [{ required: true, message: '请输入外链接地址', validator: validateLinkUrl, trigger: 'blur' }], }); let deptDefaultList = ref([]); @@ -190,9 +185,9 @@ let menuFormData = reactive({ description: '', is_catalog: false, is_link: false, - is_iframe: false, - is_affix: false, - link_url:'' + is_iframe: false, + is_affix: false, + link_url: '' }); let menuBtnLoading = ref(false); @@ -211,9 +206,9 @@ const setMenuFormData = () => { menuFormData.description = props.initFormData?.description || ''; menuFormData.is_catalog = !!props.initFormData.is_catalog; menuFormData.is_link = !!props.initFormData.is_link; - menuFormData.is_iframe =!!props.initFormData.is_iframe; - menuFormData.is_affix =!!props.initFormData.is_affix; - menuFormData.link_url =props.initFormData.link_url; + menuFormData.is_iframe = !!props.initFormData.is_iframe; + menuFormData.is_affix = !!props.initFormData.is_affix; + menuFormData.link_url = props.initFormData.link_url; } }; @@ -279,6 +274,9 @@ const handleCancel = (type: string = '') => { formRef.value?.resetFields(); }; +/** + * 初始化 + */ onMounted(async () => { props.treeData.map((item) => { if (item.is_catalog) { @@ -293,6 +291,7 @@ onMounted(async () => { .menu-form-com { margin: 10px; overflow-y: auto; + .menu-form-alert { color: #fff; line-height: 24px; @@ -301,6 +300,7 @@ onMounted(async () => { border-radius: 4px; background-color: var(--el-color-primary); } + .menu-form-btns { padding-bottom: 10px; box-sizing: border-box; diff --git a/web/src/views/system/menu/types.ts b/web/src/views/system/menu/types.ts index 7975478..e99086c 100644 --- a/web/src/views/system/menu/types.ts +++ b/web/src/views/system/menu/types.ts @@ -65,5 +65,5 @@ export interface MenuFormDataType { is_link: boolean; is_iframe:boolean; is_affix:boolean; - link_url: string; + link_url: string|undefined; } diff --git a/web/src/views/system/role/components/PermissionComNew/index.vue b/web/src/views/system/role/components/PermissionComNew/index.vue index 0b1ca19..9e12dfb 100644 --- a/web/src/views/system/role/components/PermissionComNew/index.vue +++ b/web/src/views/system/role/components/PermissionComNew/index.vue @@ -1,205 +1,244 @@ - - - - - 当前授权角色: - {{ props.roleName }} - - - - - 保存菜单授权 - - - - - - - - - - - 页面显示权限 - - - 配置操作功能接口权限,配置数据权限点击小齿轮 - - - {{ btn.data_range !== null ? `${btn.name}(${formatDataRange(btn.data_range)})` : btn.name }} - - - - - - - - + + + + + + 当前授权角色: + {{ props.roleName }} + + + + + 保存菜单授权 + + + + + + + + + + + + - - 配置数据列字段权限 - - - - 字段 - - - - {{ head.label }} - - - + + + + 配置操作功能接口权限,配置数据权限点击小齿轮 + + + {{ btn.data_range !== null ? `${btn.name}(${formatDataRange(btn.data_range)})` : btn.name }} + + + + + + + + - - {{ c_item.title }} - - - - - - - - - - - + + 配置数据列字段权限 + + + + 字段 + + + + {{ head.label }} + + + - - - - - - - - - - 确定 - 取消 - - - - - + + {{ c_item.title }} + + + + + + + + + + + + + + + + + + + + 确定 + 取消 + + + + +