mirror of
https://github.com/imdap/ruoyi-plus-vben5.git
synced 2026-05-11 05:02:10 +08:00
Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin into antdv-next
This commit is contained in:
@@ -26,6 +26,7 @@ async function generateAccessible(
|
||||
const { router } = options;
|
||||
|
||||
options.routes = cloneDeep(options.routes);
|
||||
|
||||
// 生成路由
|
||||
const accessibleRoutes = await generateRoutes(mode, options);
|
||||
|
||||
@@ -111,8 +112,10 @@ async function generateRoutes(
|
||||
generateRoutesByFrontend(routes, roles || [], forbiddenComponent),
|
||||
generateRoutesByBackend(options),
|
||||
]);
|
||||
|
||||
resultRoutes = [...frontend_resultRoutes, ...backend_resultRoutes];
|
||||
resultRoutes = mergeRoutesByName(
|
||||
backend_resultRoutes,
|
||||
frontend_resultRoutes,
|
||||
);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -170,4 +173,63 @@ async function generateRoutes(
|
||||
return resultRoutes;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据 name 合并前后端路由
|
||||
* @param baseRoutes 后端路由
|
||||
* @param extraRoutes 前端路由
|
||||
*/
|
||||
function mergeRoutesByName(
|
||||
baseRoutes: RouteRecordRaw[],
|
||||
extraRoutes: RouteRecordRaw[],
|
||||
): RouteRecordRaw[] {
|
||||
const result: RouteRecordRaw[] = [];
|
||||
const routeMap = new Map<string, RouteRecordRaw>();
|
||||
|
||||
for (const route of baseRoutes) {
|
||||
const clone = { ...route } as RouteRecordRaw;
|
||||
result.push(clone);
|
||||
if (clone.name && isString(clone.name)) {
|
||||
routeMap.set(clone.name as string, clone);
|
||||
}
|
||||
}
|
||||
|
||||
for (const route of extraRoutes) {
|
||||
if (
|
||||
route.name &&
|
||||
isString(route.name) &&
|
||||
routeMap.has(route.name as string)
|
||||
) {
|
||||
const existing = routeMap.get(route.name as string);
|
||||
if (!existing) {
|
||||
continue;
|
||||
}
|
||||
const existingChildren = existing.children ?? [];
|
||||
const routeChildren = route.children ?? [];
|
||||
|
||||
const merged = {
|
||||
...route,
|
||||
...existing, // keep backend as base
|
||||
meta: {
|
||||
...route.meta,
|
||||
...existing.meta, // backend meta wins on conflicts
|
||||
},
|
||||
} as RouteRecordRaw;
|
||||
|
||||
if (existingChildren.length > 0 || routeChildren.length > 0) {
|
||||
merged.children = mergeRoutesByName(existingChildren, routeChildren);
|
||||
}
|
||||
|
||||
Object.assign(existing, merged);
|
||||
} else {
|
||||
const clone = { ...route } as RouteRecordRaw;
|
||||
result.push(clone);
|
||||
if (clone.name && isString(clone.name)) {
|
||||
routeMap.set(clone.name as string, clone);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export { generateAccessible };
|
||||
|
||||
Reference in New Issue
Block a user