新功能:

1.菜单新增是否固定配置;
2.菜单新增框外显示配置
This commit is contained in:
猿小天
2023-12-24 12:09:15 +08:00
parent 2826cafa75
commit 68b3d479ca
4 changed files with 61 additions and 7 deletions

View File

@@ -171,6 +171,8 @@ class Menu(CoreModel):
cache = models.BooleanField(default=False, blank=True, verbose_name="是否页面缓存", help_text="是否页面缓存") cache = models.BooleanField(default=False, blank=True, verbose_name="是否页面缓存", help_text="是否页面缓存")
visible = models.BooleanField(default=True, blank=True, verbose_name="侧边栏中是否显示", visible = models.BooleanField(default=True, blank=True, verbose_name="侧边栏中是否显示",
help_text="侧边栏中是否显示") 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: class Meta:
db_table = table_prefix + "system_menu" db_table = table_prefix + "system_menu"

View File

@@ -1,4 +1,5 @@
import XEUtils from "xe-utils" import XEUtils from "xe-utils"
import {dynamicRoutes, staticRoutes} from "/@/router/route";
/** /**
* @description: 处理后端菜单数据格式 * @description: 处理后端菜单数据格式
@@ -13,20 +14,51 @@ export const handleMenu = (menuData: Array<any>) => {
isLink: item.is_link, isLink: item.is_link,
isHide: !item.visible, isHide: !item.visible,
isKeepAlive: item.cache, isKeepAlive: item.cache,
isAffix: false, isAffix: item.is_affix,
isIframe: false, isIframe: item.is_iframe,
roles: ['admin'], roles: ['admin'],
icon: item.icon icon: item.icon
} }
item.name = item.component_name item.name = item.component_name
item.path = item.web_path
return item 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<any> = []
// 框架外路由
const staticRoutes:Array<any> = []
menuData.forEach((val) => { menuData.forEach((val) => {
handleMeta(val) console.log(111,val.is_iframe)
val.path = val.web_path 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', parentKey: 'parent',
strict: true, strict: true,
}) })

View File

@@ -24,7 +24,7 @@
/> />
</el-form-item> </el-form-item>
<el-form-item label="路由地址" prop="web_path"> <el-form-item v-if="!menuFormData.is_link" label="路由地址" prop="web_path">
<el-input v-model="menuFormData.web_path" placeholder="请输入路由地址,请以/开头" /> <el-input v-model="menuFormData.web_path" placeholder="请输入路由地址,请以/开头" />
</el-form-item> </el-form-item>
@@ -56,6 +56,16 @@
<el-switch v-model="menuFormData.is_link" width="60" inline-prompt active-text="是" inactive-text="否" /> <el-switch v-model="menuFormData.is_link" width="60" inline-prompt active-text="是" inactive-text="否" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item required v-if="!menuFormData.is_catalog" label="是否固定">
<el-switch v-model="menuFormData.is_affix" width="60" inline-prompt active-text="是" inactive-text="否" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item v-if="!menuFormData.is_catalog" required label="框外显示">
<el-switch v-model="menuFormData.is_iframe" width="60" inline-prompt active-text="是" inactive-text="否" />
</el-form-item>
</el-col>
</el-row> </el-row>
<el-form-item label="备注"> <el-form-item label="备注">
@@ -168,6 +178,8 @@ let menuFormData = reactive<MenuFormDataType>({
description: '', description: '',
is_catalog: false, is_catalog: false,
is_link: false, is_link: false,
is_iframe: false,
is_affix: false,
}); });
let menuBtnLoading = ref(false); let menuBtnLoading = ref(false);
@@ -186,6 +198,8 @@ const setMenuFormData = () => {
menuFormData.description = props.initFormData?.description || ''; menuFormData.description = props.initFormData?.description || '';
menuFormData.is_catalog = !!props.initFormData.is_catalog; menuFormData.is_catalog = !!props.initFormData.is_catalog;
menuFormData.is_link = !!props.initFormData.is_link; menuFormData.is_link = !!props.initFormData.is_link;
menuFormData.is_iframe =!!props.initFormData.is_iframe;
menuFormData.is_affix =!!props.initFormData.is_affix;
} }
}; };

View File

@@ -44,6 +44,8 @@ export interface MenuTreeItemType {
visible: boolean; visible: boolean;
creator: string; creator: string;
parent: number | string; parent: number | string;
is_iframe:boolean;
is_affix:boolean;
} }
export interface MenuFormDataType { export interface MenuFormDataType {
@@ -60,4 +62,8 @@ export interface MenuFormDataType {
description: string; description: string;
is_catalog: boolean; is_catalog: boolean;
is_link: boolean; is_link: boolean;
is_iframe:boolean;
is_affix:boolean;
} }