From 68b3d479caa963b8dcc18c51b7e88787386e8409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com> Date: Sun, 24 Dec 2023 12:09:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=8A=9F=E8=83=BD:?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.菜单新增是否固定配置; 2.菜单新增框外显示配置 --- backend/dvadmin/system/models.py | 2 + web/src/utils/menu.ts | 42 ++++++++++++++++--- .../menu/components/MenuFormCom/index.vue | 16 ++++++- web/src/views/system/menu/types.ts | 8 +++- 4 files changed, 61 insertions(+), 7 deletions(-) diff --git a/backend/dvadmin/system/models.py b/backend/dvadmin/system/models.py index ea7224d..e2bf262 100644 --- a/backend/dvadmin/system/models.py +++ b/backend/dvadmin/system/models.py @@ -171,6 +171,8 @@ class Menu(CoreModel): cache = models.BooleanField(default=False, blank=True, verbose_name="是否页面缓存", help_text="是否页面缓存") visible = models.BooleanField(default=True, blank=True, verbose_name="侧边栏中是否显示", help_text="侧边栏中是否显示") + is_iframe = models.BooleanField(default=False, blank=True, verbose_name="框架外显示", help_text="框架外显示") + is_affix = models.BooleanField(default=False, blank=True, verbose_name="是否固定", help_text="是否固定") class Meta: db_table = table_prefix + "system_menu" diff --git a/web/src/utils/menu.ts b/web/src/utils/menu.ts index 42ff823..34b76c1 100644 --- a/web/src/utils/menu.ts +++ b/web/src/utils/menu.ts @@ -1,4 +1,5 @@ import XEUtils from "xe-utils" +import {dynamicRoutes, staticRoutes} from "/@/router/route"; /** * @description: 处理后端菜单数据格式 @@ -13,20 +14,51 @@ export const handleMenu = (menuData: Array) => { isLink: item.is_link, isHide: !item.visible, isKeepAlive: item.cache, - isAffix: false, - isIframe: false, + isAffix: item.is_affix, + isIframe: item.is_iframe, roles: ['admin'], icon: item.icon } item.name = item.component_name + item.path = item.web_path return item } + + // 处理框架外的路由 + const handleFrame = (item: any) => { + if (item.is_iframe) { + item.meta = { + title: item.title, + isLink: item.is_link, + isHide: !item.visible, + isKeepAlive: item.cache, + isAffix: item.is_affix, + isIframe: item.is_iframe, + roles: ['admin'], + icon: item.icon + } + item.name = item.component_name + item.path = item.web_path + } + return item + } + + // 框架内路由 + const dynamicRoutes:Array = [] + // 框架外路由 + const staticRoutes:Array = [] + menuData.forEach((val) => { - handleMeta(val) - val.path = val.web_path + console.log(111,val.is_iframe) + if(val.is_iframe){ + staticRoutes.push(handleFrame(val)) + console.log(staticRoutes) + }else{ + dynamicRoutes.push(handleMeta(val)) + } }) - const data = XEUtils.toArrayTree(menuData, { + const data = XEUtils.toArrayTree(dynamicRoutes, { parentKey: 'parent', strict: true, }) diff --git a/web/src/views/system/menu/components/MenuFormCom/index.vue b/web/src/views/system/menu/components/MenuFormCom/index.vue index a75e908..95273ea 100644 --- a/web/src/views/system/menu/components/MenuFormCom/index.vue +++ b/web/src/views/system/menu/components/MenuFormCom/index.vue @@ -24,7 +24,7 @@ /> - + @@ -56,6 +56,16 @@ + + + + + + + + + + @@ -168,6 +178,8 @@ let menuFormData = reactive({ description: '', is_catalog: false, is_link: false, + is_iframe: false, + is_affix: false, }); let menuBtnLoading = ref(false); @@ -186,6 +198,8 @@ 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; } }; diff --git a/web/src/views/system/menu/types.ts b/web/src/views/system/menu/types.ts index a89150c..6e6d5e3 100644 --- a/web/src/views/system/menu/types.ts +++ b/web/src/views/system/menu/types.ts @@ -44,6 +44,8 @@ export interface MenuTreeItemType { visible: boolean; creator: string; parent: number | string; + is_iframe:boolean; + is_affix:boolean; } export interface MenuFormDataType { @@ -60,4 +62,8 @@ export interface MenuFormDataType { description: string; is_catalog: boolean; is_link: boolean; -} \ No newline at end of file + + is_iframe:boolean; + + is_affix:boolean; +}