feat: 路由增加perms配置项

This commit is contained in:
mldong 2024-10-21 20:52:22 +08:00
parent 1b172b0329
commit 52be26b371
6 changed files with 27 additions and 1 deletions

View File

@ -102,6 +102,7 @@ function setupAccessGuard(router: Router) {
// 生成菜单和路由 // 生成菜单和路由
const { accessibleMenus, accessibleRoutes } = await generateAccess({ const { accessibleMenus, accessibleRoutes } = await generateAccess({
accessCodes: accessStore.accessCodes || [],
roles: userRoles, roles: userRoles,
router, router,
// 则会在菜单中显示但是访问会被重定向到403 // 则会在菜单中显示但是访问会被重定向到403

View File

@ -102,6 +102,7 @@ function setupAccessGuard(router: Router) {
// 生成菜单和路由 // 生成菜单和路由
const { accessibleMenus, accessibleRoutes } = await generateAccess({ const { accessibleMenus, accessibleRoutes } = await generateAccess({
accessCodes: accessStore.accessCodes || [],
roles: userRoles, roles: userRoles,
router, router,
// 则会在菜单中显示但是访问会被重定向到403 // 则会在菜单中显示但是访问会被重定向到403

View File

@ -101,6 +101,7 @@ function setupAccessGuard(router: Router) {
// 生成菜单和路由 // 生成菜单和路由
const { accessibleMenus, accessibleRoutes } = await generateAccess({ const { accessibleMenus, accessibleRoutes } = await generateAccess({
accessCodes: accessStore.accessCodes || [],
roles: userRoles, roles: userRoles,
router, router,
// 则会在菜单中显示但是访问会被重定向到403 // 则会在菜单中显示但是访问会被重定向到403

View File

@ -102,6 +102,10 @@ interface RouteMeta {
* -> * ->
*/ */
order?: number; order?: number;
/**
* 访
*/
perms?: string[];
/** /**
* *
*/ */
@ -121,6 +125,7 @@ type RouteRecordStringComponent<T = string> = {
type ComponentRecordType = Record<string, () => Promise<Component>>; type ComponentRecordType = Record<string, () => Promise<Component>>;
interface GenerateMenuAndRoutesOptions { interface GenerateMenuAndRoutesOptions {
accessCodes?: string[];
fetchMenuListAsync?: () => Promise<RouteRecordStringComponent[]>; fetchMenuListAsync?: () => Promise<RouteRecordStringComponent[]>;
forbiddenComponent?: RouteRecordRaw['component']; forbiddenComponent?: RouteRecordRaw['component'];
layoutMap?: ComponentRecordType; layoutMap?: ComponentRecordType;

View File

@ -42,7 +42,7 @@ async function generateRoutes(
mode: AccessModeType, mode: AccessModeType,
options: GenerateMenuAndRoutesOptions, options: GenerateMenuAndRoutesOptions,
) { ) {
const { forbiddenComponent, roles, routes } = options; const { forbiddenComponent, roles, routes, accessCodes } = options;
let resultRoutes: RouteRecordRaw[] = routes; let resultRoutes: RouteRecordRaw[] = routes;
switch (mode) { switch (mode) {
@ -54,6 +54,7 @@ async function generateRoutes(
resultRoutes = await generateRoutesByFrontend( resultRoutes = await generateRoutesByFrontend(
routes, routes,
roles || [], roles || [],
accessCodes || [],
forbiddenComponent, forbiddenComponent,
); );
break; break;

View File

@ -8,10 +8,14 @@ import { filterTree, mapTree } from '@vben-core/shared/utils';
async function generateRoutesByFrontend( async function generateRoutesByFrontend(
routes: RouteRecordRaw[], routes: RouteRecordRaw[],
roles: string[], roles: string[],
accessCodes: string[],
forbiddenComponent?: RouteRecordRaw['component'], forbiddenComponent?: RouteRecordRaw['component'],
): Promise<RouteRecordRaw[]> { ): Promise<RouteRecordRaw[]> {
// 根据角色标识过滤路由表,判断当前用户是否拥有指定权限 // 根据角色标识过滤路由表,判断当前用户是否拥有指定权限
const finalRoutes = filterTree(routes, (route) => { const finalRoutes = filterTree(routes, (route) => {
if (!route.meta?.authority) {
return hasPerms(route, accessCodes);
}
return hasAuthority(route, roles); return hasAuthority(route, roles);
}); });
@ -42,7 +46,20 @@ function hasAuthority(route: RouteRecordRaw, access: string[]) {
return canAccess || (!canAccess && menuHasVisibleWithForbidden(route)); return canAccess || (!canAccess && menuHasVisibleWithForbidden(route));
} }
/**
* 访
* @param route
* @param access
*/
function hasPerms(route: RouteRecordRaw, access: string[]) {
const perms = route.meta?.perms;
if (!perms) {
return true;
}
const canAccess = access.some((value) => perms.includes(value));
return canAccess || (!canAccess && menuHasVisibleWithForbidden(route));
}
/** /**
* 访403 * 访403
* @param route * @param route