1
0

accessible.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import type {
  2. AccessModeType,
  3. GenerateMenuAndRoutesOptions,
  4. RouteRecordRaw,
  5. } from '@vben/types';
  6. import {
  7. cloneDepp,
  8. generateMenus,
  9. generateRoutesByBackend,
  10. generateRoutesByFrontend,
  11. mapTree,
  12. } from '@vben/utils';
  13. async function generateAccessible(
  14. mode: AccessModeType,
  15. options: GenerateMenuAndRoutesOptions,
  16. ) {
  17. const { router } = options;
  18. options.routes = cloneDepp(options.routes);
  19. // 生成路由
  20. const accessibleRoutes = await generateRoutes(mode, options);
  21. // 动态添加到router实例内
  22. accessibleRoutes.forEach((route) => {
  23. router.addRoute(route);
  24. });
  25. // 生成菜单
  26. const accessibleMenus = await generateMenus(accessibleRoutes, options.router);
  27. return { accessibleMenus, accessibleRoutes };
  28. }
  29. /**
  30. * Generate routes
  31. * @param mode
  32. */
  33. async function generateRoutes(
  34. mode: AccessModeType,
  35. options: GenerateMenuAndRoutesOptions,
  36. ) {
  37. const { forbiddenComponent, roles, routes } = options;
  38. let resultRoutes: RouteRecordRaw[] = routes;
  39. switch (mode) {
  40. case 'frontend': {
  41. resultRoutes = await generateRoutesByFrontend(
  42. routes,
  43. roles || [],
  44. forbiddenComponent,
  45. );
  46. break;
  47. }
  48. case 'backend': {
  49. resultRoutes = await generateRoutesByBackend(options);
  50. break;
  51. }
  52. }
  53. /**
  54. * 调整路由树,做以下处理:
  55. * 1. 对未添加redirect的路由添加redirect
  56. */
  57. resultRoutes = mapTree(resultRoutes, (route) => {
  58. // 如果有redirect或者没有子路由,则直接返回
  59. if (route.redirect || !route.children || route.children.length === 0) {
  60. return route;
  61. }
  62. const firstChild = route.children[0];
  63. // 如果子路由不是以/开头,则直接返回,这种情况需要计算全部父级的path才能得出正确的path,这里不做处理
  64. if (!firstChild?.path || !firstChild.path.startsWith('/')) {
  65. return route;
  66. }
  67. route.redirect = firstChild.path;
  68. return route;
  69. });
  70. return resultRoutes;
  71. }
  72. export { generateAccessible };