feat: 菜单新窗口打开.
This commit is contained in:
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user