155 lines
4.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

export const Layout = () => import("@/layout/index.vue");
/**
* 固定路由
*/
const constRoutes = [
{
path: "/login",
component: () => import("@/views/login/index.vue"),
meta: { hidden: true },
},
{
path: "/404",
component: () => import("@/views/error-page/404-permission.vue"),
meta: { hidden: true },
},
// {
// path: "/",
// component: () => import("@/views/dashboard/Analysis/index1.vue"),
// meta: { hidden: true },
// }
];
/**
* home路由需要修改redirect使用
*/
const homeRoute = { path: '/', root: true, redirect: '' };
/**
* 404兜底路由
*/
const notFoundRoute = { path: '/:catchAll(.*)', redirect: '/404', root: true };
/**
* 使用require加载组件失败时弹出提示
* @param {string} path 组件路径
* @return {function} 加载组件的方法
*/
async function getView(path: any) {
const comps = import.meta.glob("../views/**/*.vue");
let match = comps[`../views${path}/index.vue`];
if (!match) {
match = () => import("@/views/error-page/404.vue")
}
return (await match()).default;
}
/**
* @typedef {Object} Menu
* @property {number} parentId 父级菜单id
* @property {boolean} leafFlag 是否是页面
* @property {boolean} hiddenFlag 是否是
* @property {string} routePath 路由路径
* @property {string} routeName 路由名称
* @property {string} componentPath 组件路径
* @property {string} menuName 菜单名称
* @property {string} icon 图标
* @property {string} title 标题
* @property {string} icon 图标
* @property {string} cacheFlag 是否缓存
* @property {string} affix 是否钉在 TAG 栏(暂未实现)
*/
/**
* 后端menu转为路由
* @param {Menu} menu
* @return {Object} {route, currRote}
*/
function generateParentRouter(menu: any) {
// 顶级且是页面
if (menu.parentId === 'root' && menu.leafFlag) {
const route = {
path: menu.routePath,
component: Layout,
hidden: menu.hiddenFlag,
icon: menu.icon,
children: [
{
path: '',
name: menu.routeName || menu.id, // 取routeName作为每个页面的namename必须对应才能有缓存
component: () => getView(menu.componentPath),
meta: { title: menu.menuName, icon: menu.icon, cacheFlag: menu.cacheFlag, leafFlag: menu.leafFlag }
}
],
meta: {}
};
return { route, currRoute: null };
}
// 顶级且是菜单
if (menu.parentId === 'root' && !menu.leafFlag) {
const route = {
// alwaysShow 不管多少 children都会展示展开箭头
alwaysShow: true,
path: menu.routePath,
name: menu.routeName || menu.id,
component: Layout,
hidden: menu.hiddenFlag,
icon: menu.icon,
// noRedirect 面包屑中是否可点击导航
meta: { title: menu.menuName, icon: menu.icon, noRedirect: true, cacheFlag: menu.cacheFlag, leafFlag: menu.leafFlag }
};
return { route, currRoute: route };
}
// 子级
if (menu.parentId !== 'root' && menu.leafFlag) {
const route = {
alwaysShow: !menu.leafFlag,
path: menu.routePath,
name: menu.routeName || menu.id, // 取routeName作为每个页面的namename必须对应才能有缓存
component: () => getView(menu.componentPath),
hidden: menu.hiddenFlag,
icon: menu.icon,
meta: { title: menu.menuName, icon: menu.icon, cacheFlag: menu.cacheFlag, leafFlag: menu.leafFlag }
};
return { route, currRoute: route };
}
if (menu.parentId !== null && !menu.leafFlag) {
const route = {
alwaysShow: !menu.leafFlag,
path: menu.routePath,
name: menu.routeName || menu.id, //
hidden: menu.hiddenFlag,
icon: menu.icon,
meta: { title: menu.menuName, icon: menu.icon, cacheFlag: menu.cacheFlag, leafFlag: menu.leafFlag }
};
return { route, currRoute: route };
}
}
/**
* 转换后端menu列表为routes
* 后端menu结构{id,parentId,routeName,routePath,componentPath,menuName,leafFlag,icon}
* @param {Menu[]} menuList
* @return {Array} 路由数组
*/
function convertAsyncRoutes(menuList: any) {
if (!menuList || menuList.length <= 0) { return }
const routes = [];
for (let i = 0; i < menuList.length; i++) {
const menu = menuList[i];
const menuRoute: any = generateParentRouter(menu);
routes.push(menuRoute.route);
if (menuRoute.currRoute && menu.children) {
menuRoute.currRoute.children = convertAsyncRoutes(menu.children);
}
}
return routes;
}
export {
constRoutes,
homeRoute,
notFoundRoute,
convertAsyncRoutes
};