admin-vben5/packages/business/access/src/generate-menu-and-routes/generate-routes-frontend.ts

66 lines
1.7 KiB
TypeScript
Raw Normal View History

2024-06-02 15:04:37 +08:00
import type { RouteRecordRaw } from 'vue-router';
2024-06-08 19:49:06 +08:00
import { filterTree, mapTree } from '@vben-core/toolkit';
2024-06-02 15:04:37 +08:00
/**
* -
2024-06-02 15:04:37 +08:00
*/
async function generateRoutesByFrontend(
2024-06-02 15:04:37 +08:00
routes: RouteRecordRaw[],
roles: string[],
forbiddenComponent?: RouteRecordRaw['component'],
2024-06-02 15:04:37 +08:00
): Promise<RouteRecordRaw[]> {
// 根据角色标识过滤路由表,判断当前用户是否拥有指定权限
2024-06-08 19:49:06 +08:00
const finalRoutes = filterTree(routes, (route) => {
2024-06-02 15:04:37 +08:00
return hasVisible(route) && hasAuthority(route, roles);
});
2024-06-08 19:49:06 +08:00
if (!forbiddenComponent) {
2024-06-08 19:49:06 +08:00
return finalRoutes;
}
// 如果有禁止访问的页面将禁止访问的页面替换为403页面
return mapTree(finalRoutes, (route) => {
if (menuHasVisibleWithForbidden(route)) {
route.component = forbiddenComponent;
2024-06-08 19:49:06 +08:00
}
return route;
});
2024-06-02 15:04:37 +08:00
}
/**
* 访
* @param route
* @param access
*/
function hasAuthority(route: RouteRecordRaw, access: string[]) {
const authority = route.meta?.authority;
if (!authority) {
return true;
}
const canAccess = access.some((value) => authority.includes(value));
return canAccess || (!canAccess && menuHasVisibleWithForbidden(route));
2024-06-02 15:04:37 +08:00
}
/**
*
* @param route
*/
function hasVisible(route?: RouteRecordRaw) {
return !route?.meta?.hideInMenu;
}
2024-06-08 19:49:06 +08:00
/**
* 访403
* @param route
*/
function menuHasVisibleWithForbidden(route: RouteRecordRaw) {
return (
!!route.meta?.authority &&
Reflect.has(route.meta || {}, 'menuVisibleWithForbidden') &&
!!route.meta?.menuVisibleWithForbidden
);
2024-06-08 19:49:06 +08:00
}
export { generateRoutesByFrontend, hasAuthority, hasVisible };