feat: 菜单新窗口打开.

This commit is contained in:
lijiahang
2023-12-05 14:44:46 +08:00
parent c5120463d9
commit 9b3e5eef48
15 changed files with 108 additions and 89 deletions

View File

@@ -1,9 +1,11 @@
import type { RouteRecordNormalized } from 'vue-router';
import type { RouteMeta, RouteRecordNormalized } from 'vue-router';
import type { MenuState } from './types';
import type { MenuQueryResponse } from '@/api/system/menu';
import { defineStore } from 'pinia';
import { Notification } from '@arco-design/web-vue';
import { getMenuList } from '@/api/user/auth';
import router from '@/router';
import { EnabledStatus } from '@/types/const';
export default defineStore('menu', {
state: (): MenuState => ({
@@ -18,49 +20,51 @@ export default defineStore('menu', {
},
actions: {
// 转换菜单
convert(item: MenuQueryResponse): RouteRecordNormalized {
// 设置路由属性
const meta: RouteMeta = {
locale: item.name,
icon: item.icon,
order: item.sort,
hideInMenu: item.visible === EnabledStatus.DISABLED,
noAffix: item.visible === EnabledStatus.DISABLED,
ignoreCache: item.cache === EnabledStatus.DISABLED,
newWindow: item.newWindow === EnabledStatus.ENABLED,
};
// 获取 router
const route = router.getRoutes().find(r => {
return r.name === item.component;
});
// 设置 router meta
if (route) {
// 路由配置覆盖菜单配置
route.meta = { ...meta, ...route.meta };
}
// 返回
return {
name: item.component,
path: item.path,
meta: meta,
children: undefined
} as unknown as RouteRecordNormalized;
},
// 加载菜单
async fetchMenu() {
try {
// 查询菜单
const { data } = await getMenuList();
// @ts-ignore
this.serverMenus = (data as Array<any>).map(s => {
// 转换
const convert = (item: any) => {
// 设置路由属性
const meta = {
locale: item.name,
icon: item.icon,
order: item.sort,
hideInMenu: item.visible === 0,
hideChildrenInMenu: item.visible === 0,
noAffix: item.visible === 0,
ignoreCache: item.cache === 0,
};
// 获取 router
const route = router.getRoutes().find(r => {
return r.name === item.component;
});
// 设置 router meta
if (route) {
// 路由配置覆盖菜单配置
route.meta = { ...meta, ...route.meta };
}
// 返回
return {
name: item.component,
path: item.path,
meta: meta,
children: undefined as unknown
};
};
// 转换菜单
this.serverMenus = data.map(s => {
// 构建父目录
const menu = convert(s);
const menu = this.convert(s);
// 构建子目录
if (s.children) {
menu.children = (s.children as Array<any>).map(convert);
menu.children = s.children.map(this.convert);
}
return menu;
});
}) as RouteRecordNormalized[];
// 是否已加载过
this.menuFetched = true;
// 未配置菜单
@@ -72,7 +76,7 @@ export default defineStore('menu', {
}
} catch (error) {
Notification.error({
content: '加载菜单失败',
content: '加载菜单失败, 请刷新后重试',
closable: true,
});
}