generate-routes-frontend.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import type { RouteRecordRaw } from 'vue-router';
  2. import { filterTree, mapTree } from '@vben-core/shared/utils';
  3. /**
  4. * 动态生成路由 - 前端方式
  5. */
  6. async function generateRoutesByFrontend(
  7. routes: RouteRecordRaw[],
  8. roles: string[],
  9. forbiddenComponent?: RouteRecordRaw['component'],
  10. ): Promise<RouteRecordRaw[]> {
  11. // 根据角色标识过滤路由表,判断当前用户是否拥有指定权限
  12. const finalRoutes = filterTree(routes, (route) => {
  13. return hasAuthority(route, roles);
  14. });
  15. if (!forbiddenComponent) {
  16. return finalRoutes;
  17. }
  18. // 如果有禁止访问的页面,将禁止访问的页面替换为403页面
  19. return mapTree(finalRoutes, (route) => {
  20. if (menuHasVisibleWithForbidden(route)) {
  21. route.component = forbiddenComponent;
  22. }
  23. return route;
  24. });
  25. }
  26. /**
  27. * 判断路由是否有权限访问
  28. * @param route
  29. * @param access
  30. */
  31. function hasAuthority(route: RouteRecordRaw, access: string[]) {
  32. const authority = route.meta?.authority;
  33. if (!authority) {
  34. return true;
  35. }
  36. const canAccess = access.some((value) => authority.includes(value));
  37. return canAccess || (!canAccess && menuHasVisibleWithForbidden(route));
  38. }
  39. /**
  40. * 判断路由是否在菜单中显示,但是访问会被重定向到403
  41. * @param route
  42. */
  43. function menuHasVisibleWithForbidden(route: RouteRecordRaw) {
  44. return (
  45. !!route.meta?.authority &&
  46. Reflect.has(route.meta || {}, 'menuVisibleWithForbidden') &&
  47. !!route.meta?.menuVisibleWithForbidden
  48. );
  49. }
  50. export { generateRoutesByFrontend, hasAuthority };