77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
import { routeFilenameHelper } from '@/utils/file/routeFileUtil';
|
|
import _ from 'lodash';
|
|
import { RouteRecordRaw } from 'vue-router';
|
|
|
|
// * 最终路由
|
|
const routeMap: Record<string, RouteRecordRaw> = {};
|
|
|
|
// * 所有处理的路由
|
|
const contexts = [
|
|
{ context: import.meta.glob('@/views/**/index.vue', { eager: true, import: 'default' }), isIndex: true },
|
|
{ context: import.meta.glob('@/views/**/page.ts', { eager: true, import: 'default' }), isIndex: false },
|
|
];
|
|
|
|
/**
|
|
* 构建路由信息
|
|
* @param context 上下文信息
|
|
* @param isIndex 是否第一次遍历
|
|
* @param route 路由内容
|
|
*/
|
|
function buildRouteTree(context: any, isIndex: boolean, route: any) {
|
|
// 遍历当前子路由
|
|
Object.entries(context).forEach(([filePath, _]) => {
|
|
// 获取子路由下所有文件对象格式
|
|
const childrenFileInfo = routeFilenameHelper(filePath);
|
|
// 组装子路由对象
|
|
const childrenRoute: any = {
|
|
name: childrenFileInfo?.name,
|
|
path: childrenFileInfo!.path,
|
|
component: isIndex ? context[filePath] : undefined,
|
|
children: [],
|
|
meta: { isFullScreen: false },
|
|
};
|
|
// 如果当前路由对象等于当前遍历的路由子对象,将子路由推到父级路由中
|
|
if (childrenFileInfo?.path.includes(route.path) && childrenFileInfo?.path !== route.path) {
|
|
route.children.push(childrenRoute);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 遍历路由信息
|
|
* @param context 路由上下文
|
|
* @param isIndex 是否为索引遍历
|
|
*/
|
|
const createRouteList = (context: any, isIndex: boolean) => {
|
|
Object.entries(context).forEach(([filePath, exportRouteConfig]) => {
|
|
const fileInfo = routeFilenameHelper(filePath);
|
|
// 组装路由对象
|
|
const route: any = {
|
|
name: fileInfo?.name,
|
|
path: fileInfo!.path,
|
|
component: isIndex ? context[filePath] : undefined,
|
|
children: [],
|
|
meta: { isFullScreen: false },
|
|
};
|
|
|
|
// 初始化赋值
|
|
if (isIndex) {
|
|
routeMap[route.path] = route;
|
|
buildRouteTree(context, isIndex, route);
|
|
} else {
|
|
// 导出当前存在的路由并重新赋值
|
|
const existingRoute = routeMap[route.path];
|
|
// 当前路由存在
|
|
if (existingRoute) {
|
|
// 使用loadsh合并对象
|
|
routeMap[route.path] = _.merge(existingRoute, exportRouteConfig);
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
// * 生成路由信息
|
|
contexts.forEach(({ context, isIndex }) => createRouteList(context, isIndex));
|
|
|
|
export const pageRoutes: Array<RouteRecordRaw> = Object.values(routeMap);
|