parent
c5eb0841a5
commit
30f7472d26
@ -1,24 +1,28 @@
|
|||||||
|
import { mergeRouteModules } from '@vben-core/helpers';
|
||||||
import type { RouteRecordRaw } from 'vue-router';
|
import type { RouteRecordRaw } from 'vue-router';
|
||||||
|
|
||||||
import { essentialRoutes } from './_essential';
|
import { essentialRoutes } from './_essential';
|
||||||
import { nestedRoutes } from './modules/nested';
|
|
||||||
import { outsideRoutes } from './modules/outside';
|
const dynamicRouteFiles = import.meta.glob('./dynamic/**/*.ts', {
|
||||||
import { rootRoutes } from './modules/root';
|
eager: true,
|
||||||
import { vbenRoutes } from './modules/vben';
|
});
|
||||||
|
|
||||||
|
const staticRouteFiles = import.meta.glob('./static/**/*.ts', { eager: true });
|
||||||
|
|
||||||
|
const externalRouteFiles = import.meta.glob('./external/**/*.ts', {
|
||||||
|
eager: true,
|
||||||
|
});
|
||||||
|
|
||||||
/** 动态路由 */
|
/** 动态路由 */
|
||||||
const dynamicRoutes: RouteRecordRaw[] = [
|
const dynamicRoutes: RouteRecordRaw[] = mergeRouteModules(dynamicRouteFiles);
|
||||||
// 根路由
|
|
||||||
...rootRoutes,
|
/** 静态路由列表,访问这些页面可以不需要权限 */
|
||||||
...nestedRoutes,
|
const staticRoutes: RouteRecordRaw[] = mergeRouteModules(staticRouteFiles);
|
||||||
...outsideRoutes,
|
|
||||||
...vbenRoutes,
|
|
||||||
];
|
|
||||||
|
|
||||||
/** 排除在主框架外的路由,这些路由没有菜单和顶部及其他框架内容 */
|
/** 排除在主框架外的路由,这些路由没有菜单和顶部及其他框架内容 */
|
||||||
const externalRoutes: RouteRecordRaw[] = [];
|
const externalRoutes: RouteRecordRaw[] = mergeRouteModules(externalRouteFiles);
|
||||||
|
|
||||||
/** 静态路由列表,访问这些页面可以不需要权限 */
|
/** 路由列表,由基本路由+静态路由组成 */
|
||||||
const staticRoutes: RouteRecordRaw[] = [...essentialRoutes];
|
const routes: RouteRecordRaw[] = [...essentialRoutes, ...staticRoutes];
|
||||||
|
|
||||||
export { dynamicRoutes, externalRoutes, staticRoutes };
|
export { dynamicRoutes, externalRoutes, routes };
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
export * from './flatten-object';
|
export * from './flatten-object';
|
||||||
export * from './generator-menus';
|
export * from './generator-menus';
|
||||||
export * from './generator-routes';
|
export * from './generator-routes';
|
||||||
|
export * from './merge-route-modules';
|
||||||
export * from './nested-object';
|
export * from './nested-object';
|
||||||
|
|||||||
@ -0,0 +1,68 @@
|
|||||||
|
import type { RouteRecordRaw } from 'vue-router';
|
||||||
|
|
||||||
|
import { describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
|
import { mergeRouteModules } from './merge-route-modules';
|
||||||
|
|
||||||
|
import type { RouteModuleType } from './merge-route-modules';
|
||||||
|
|
||||||
|
describe('mergeRouteModules', () => {
|
||||||
|
it('should merge route modules correctly', () => {
|
||||||
|
const routeModules: Record<string, RouteModuleType> = {
|
||||||
|
'./dynamic-routes/about.ts': {
|
||||||
|
default: [
|
||||||
|
{
|
||||||
|
component: () => Promise.resolve({ template: '<div>About</div>' }),
|
||||||
|
name: 'About',
|
||||||
|
path: '/about',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'./dynamic-routes/home.ts': {
|
||||||
|
default: [
|
||||||
|
{
|
||||||
|
component: () => Promise.resolve({ template: '<div>Home</div>' }),
|
||||||
|
name: 'Home',
|
||||||
|
path: '/',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedRoutes: RouteRecordRaw[] = [
|
||||||
|
{
|
||||||
|
component: expect.any(Function),
|
||||||
|
name: 'About',
|
||||||
|
path: '/about',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
component: expect.any(Function),
|
||||||
|
name: 'Home',
|
||||||
|
path: '/',
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const mergedRoutes = mergeRouteModules(routeModules);
|
||||||
|
expect(mergedRoutes).toEqual(expectedRoutes);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty modules', () => {
|
||||||
|
const routeModules: Record<string, RouteModuleType> = {};
|
||||||
|
const expectedRoutes: RouteRecordRaw[] = [];
|
||||||
|
|
||||||
|
const mergedRoutes = mergeRouteModules(routeModules);
|
||||||
|
expect(mergedRoutes).toEqual(expectedRoutes);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle modules with no default export', () => {
|
||||||
|
const routeModules: Record<string, RouteModuleType> = {
|
||||||
|
'./dynamic-routes/empty.ts': {
|
||||||
|
default: [],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const expectedRoutes: RouteRecordRaw[] = [];
|
||||||
|
|
||||||
|
const mergedRoutes = mergeRouteModules(routeModules);
|
||||||
|
expect(mergedRoutes).toEqual(expectedRoutes);
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
import type { RouteRecordRaw } from 'vue-router';
|
||||||
|
|
||||||
|
// 定义模块类型
|
||||||
|
interface RouteModuleType {
|
||||||
|
default: RouteRecordRaw[];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合并动态路由模块的默认导出
|
||||||
|
* @param routeModules 动态导入的路由模块对象
|
||||||
|
* @returns 合并后的路由配置数组
|
||||||
|
*/
|
||||||
|
function mergeRouteModules(
|
||||||
|
routeModules: Record<string, unknown>,
|
||||||
|
): RouteRecordRaw[] {
|
||||||
|
const mergedRoutes: RouteRecordRaw[] = [];
|
||||||
|
|
||||||
|
for (const routeModule of Object.values(routeModules)) {
|
||||||
|
const moduleRoutes = (routeModule as RouteModuleType)?.default ?? [];
|
||||||
|
mergedRoutes.push(...moduleRoutes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mergedRoutes;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { mergeRouteModules };
|
||||||
|
|
||||||
|
export type { RouteModuleType };
|
||||||
Loading…
Reference in new issue