generate-accessible.ts 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import type {
  2. AccessModeType,
  3. GenerateMenuAndRoutesOptions,
  4. } from '@vben-core/typings';
  5. import {
  6. generateMenus,
  7. generateRoutesByBackend,
  8. generateRoutesByFrontend,
  9. } from '@vben-core/helpers';
  10. import { cloneDepp } from '@vben-core/toolkit';
  11. async function generateAccessible(
  12. mode: AccessModeType,
  13. options: GenerateMenuAndRoutesOptions,
  14. ) {
  15. const { router } = options;
  16. options.routes = cloneDepp(options.routes);
  17. // 生成路由
  18. const accessibleRoutes = await generateRoutes(mode, options);
  19. // 动态添加到router实例内
  20. accessibleRoutes.forEach((route) => {
  21. router.addRoute(route);
  22. });
  23. // 生成菜单
  24. const accessibleMenus = await generateMenus(accessibleRoutes, options.router);
  25. return { accessibleMenus, accessibleRoutes };
  26. }
  27. /**
  28. * Generate routes
  29. * @param mode
  30. */
  31. async function generateRoutes(
  32. mode: AccessModeType,
  33. options: GenerateMenuAndRoutesOptions,
  34. ) {
  35. const { forbiddenComponent, roles, routes } = options;
  36. switch (mode) {
  37. // 允许所有路由访问,不做任何过滤处理
  38. case 'allow-all': {
  39. return routes;
  40. }
  41. case 'frontend': {
  42. return await generateRoutesByFrontend(
  43. routes,
  44. roles || [],
  45. forbiddenComponent,
  46. );
  47. }
  48. case 'backend': {
  49. return await generateRoutesByBackend(options);
  50. }
  51. default: {
  52. return routes;
  53. }
  54. }
  55. }
  56. export { generateAccessible };