mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-02-02 18:28:40 +08:00
feat: 路由增加perms配置项
This commit is contained in:
parent
1b172b0329
commit
52be26b371
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user