2024-06-30 15:03:37 +08:00
|
|
|
import type { accessModeType } from '@vben-core/preferences';
|
|
|
|
import type { RouteRecordRaw } from 'vue-router';
|
|
|
|
|
|
|
|
import type { GeneratorMenuAndRoutesOptions } from '../types';
|
|
|
|
|
2024-07-05 23:15:46 +08:00
|
|
|
import { cloneDepp } from '@vben-core/toolkit';
|
|
|
|
|
2024-06-30 15:03:37 +08:00
|
|
|
import { generateMenus } from './generate-menus';
|
|
|
|
import { generateRoutesByBackend } from './generate-routes-backend';
|
|
|
|
import { generateRoutesByFrontend } from './generate-routes-frontend';
|
|
|
|
|
|
|
|
async function generateMenusAndRoutes(
|
|
|
|
mode: accessModeType,
|
|
|
|
options: GeneratorMenuAndRoutesOptions,
|
|
|
|
) {
|
|
|
|
const { router } = options;
|
2024-07-05 23:15:46 +08:00
|
|
|
|
|
|
|
options.routes = cloneDepp(options.routes);
|
2024-06-30 15:03:37 +08:00
|
|
|
// 生成路由
|
|
|
|
const accessibleRoutes = await generateRoutes(mode, options);
|
|
|
|
|
|
|
|
// 动态添加到router实例内
|
|
|
|
accessibleRoutes.forEach((route) => router.addRoute(route));
|
|
|
|
|
|
|
|
// 生成菜单
|
|
|
|
const accessibleMenus = await generateMenus1(mode, accessibleRoutes, options);
|
|
|
|
|
|
|
|
return { accessibleMenus, accessibleRoutes };
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Generate routes
|
|
|
|
* @param mode
|
|
|
|
*/
|
|
|
|
async function generateRoutes(
|
|
|
|
mode: accessModeType,
|
|
|
|
options: GeneratorMenuAndRoutesOptions,
|
|
|
|
) {
|
|
|
|
const { forbiddenComponent, roles, routes } = options;
|
|
|
|
|
|
|
|
switch (mode) {
|
|
|
|
// 允许所有路由访问,不做任何过滤处理
|
|
|
|
case 'allow-all': {
|
|
|
|
return routes;
|
|
|
|
}
|
|
|
|
case 'frontend': {
|
|
|
|
return await generateRoutesByFrontend(
|
|
|
|
routes,
|
|
|
|
roles || [],
|
|
|
|
forbiddenComponent,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
case 'backend': {
|
|
|
|
return await generateRoutesByBackend(options);
|
|
|
|
}
|
|
|
|
default: {
|
|
|
|
return routes;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function generateMenus1(
|
|
|
|
mode: accessModeType,
|
|
|
|
routes: RouteRecordRaw[],
|
|
|
|
options: GeneratorMenuAndRoutesOptions,
|
|
|
|
) {
|
|
|
|
const { router } = options;
|
|
|
|
switch (mode) {
|
|
|
|
case 'allow-all':
|
|
|
|
case 'frontend':
|
|
|
|
case 'backend': {
|
|
|
|
return await generateMenus(routes, router);
|
|
|
|
}
|
|
|
|
default: {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export { generateMenusAndRoutes };
|