From 22ed5227119a21e873a81a6a0fe3026fb672e8aa Mon Sep 17 00:00:00 2001 From: MistyMoon <33083971+MistyMoonR@users.noreply.github.com> Date: Mon, 9 Feb 2026 02:44:29 +0800 Subject: [PATCH] feat: support `menuVisibleWithForbidden` in generate-routes-backend (#7526) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当后端菜单项 `meta.menuVisibleWithForbidden` 为 true 时,将其路由组件替换为 403 页,菜单仍展示该项,访问时展示 403,便于用户知悉功能并申请权限。 --- .../src/helpers/generate-routes-backend.ts | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/utils/src/helpers/generate-routes-backend.ts b/packages/utils/src/helpers/generate-routes-backend.ts index c92b6d35..3f8693ce 100644 --- a/packages/utils/src/helpers/generate-routes-backend.ts +++ b/packages/utils/src/helpers/generate-routes-backend.ts @@ -8,13 +8,26 @@ import type { import { mapTree } from '@vben-core/shared/utils'; +/** + * 判断路由是否在菜单中显示但访问时展示 403(让用户知悉功能并申请权限) + */ +function menuHasVisibleWithForbidden(route: RouteRecordRaw): boolean { + return !!route.meta?.menuVisibleWithForbidden; +} + /** * 动态生成路由 - 后端方式 + * 对 meta.menuVisibleWithForbidden 为 true 的项直接替换为 403 组件,让用户知悉功能并申请权限。 */ async function generateRoutesByBackend( options: GenerateMenuAndRoutesOptions, ): Promise { - const { fetchMenuListAsync, layoutMap = {}, pageMap = {} } = options; + const { + fetchMenuListAsync, + layoutMap = {}, + pageMap = {}, + forbiddenComponent, + } = options; try { const menuRoutes = await fetchMenuListAsync?.(); @@ -28,7 +41,16 @@ async function generateRoutesByBackend( normalizePageMap[normalizeViewPath(key)] = value; } - const routes = convertRoutes(menuRoutes, layoutMap, normalizePageMap); + let routes = convertRoutes(menuRoutes, layoutMap, normalizePageMap); + + if (forbiddenComponent) { + routes = mapTree(routes, (route) => { + if (menuHasVisibleWithForbidden(route)) { + route.component = forbiddenComponent; + } + return route; + }); + } return routes; } catch (error) {