permission.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import type { AppRouteRecordRaw, Menu } from '/@/router/types';
  2. import store from '/@/store/index';
  3. import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper';
  4. import { VuexModule, Mutation, Module, getModule, Action } from 'vuex-module-decorators';
  5. import { PermissionModeEnum } from '/@/enums/appEnum';
  6. import { appStore } from '/@/store/modules/app';
  7. import { userStore } from '/@/store/modules/user';
  8. import { asyncRoutes } from '/@/router/routes';
  9. import { filter } from '/@/utils/helper/treeHelper';
  10. import { toRaw } from 'vue';
  11. import { getMenuListById } from '/@/api/sys/menu';
  12. import { transformObjToRoute } from '/@/router/helper/routeHelper';
  13. import { transformRouteToMenu } from '/@/router/helper/menuHelper';
  14. import { useMessage } from '/@/hooks/web/useMessage';
  15. import { useI18n } from '/@/hooks/web/useI18n';
  16. import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '/@/router/constant';
  17. const { createMessage } = useMessage();
  18. const NAME = 'permission';
  19. hotModuleUnregisterModule(NAME);
  20. @Module({ dynamic: true, namespaced: true, store, name: NAME })
  21. class Permission extends VuexModule {
  22. // Permission code list
  23. private permCodeListState: string[] = [];
  24. // Whether the route has been dynamically added
  25. private isDynamicAddedRouteState = false;
  26. // To trigger a menu update
  27. private lastBuildMenuTimeState = 0;
  28. // Backstage menu list
  29. private backMenuListState: Menu[] = [];
  30. get getPermCodeListState() {
  31. return this.permCodeListState;
  32. }
  33. get getBackMenuListState() {
  34. return this.backMenuListState;
  35. }
  36. get getLastBuildMenuTimeState() {
  37. return this.lastBuildMenuTimeState;
  38. }
  39. get getIsDynamicAddedRouteState() {
  40. return this.isDynamicAddedRouteState;
  41. }
  42. @Mutation
  43. commitPermCodeListState(codeList: string[]): void {
  44. this.permCodeListState = codeList;
  45. }
  46. @Mutation
  47. commitBackMenuListState(list: Menu[]): void {
  48. this.backMenuListState = list;
  49. }
  50. @Mutation
  51. commitLastBuildMenuTimeState(): void {
  52. this.lastBuildMenuTimeState = new Date().getTime();
  53. }
  54. @Mutation
  55. commitDynamicAddedRouteState(added: boolean): void {
  56. this.isDynamicAddedRouteState = added;
  57. }
  58. @Mutation
  59. commitResetState(): void {
  60. this.isDynamicAddedRouteState = false;
  61. this.permCodeListState = [];
  62. this.backMenuListState = [];
  63. this.lastBuildMenuTimeState = 0;
  64. }
  65. @Action
  66. async buildRoutesAction(id?: number | string): Promise<AppRouteRecordRaw[]> {
  67. const { t } = useI18n();
  68. let routes: AppRouteRecordRaw[] = [];
  69. const roleList = toRaw(userStore.getRoleListState);
  70. const { permissionMode } = appStore.getProjectConfig;
  71. // role permissions
  72. if (permissionMode === PermissionModeEnum.ROLE) {
  73. routes = filter(asyncRoutes, (route) => {
  74. const { meta } = route as AppRouteRecordRaw;
  75. const { roles } = meta || {};
  76. if (!roles) return true;
  77. return roleList.some((role) => roles.includes(role));
  78. });
  79. // 如果确定不需要做后台动态权限,请将下面整个判断注释
  80. } else if (permissionMode === PermissionModeEnum.BACK) {
  81. createMessage.loading({
  82. content: t('sys.app.menuLoading'),
  83. duration: 1,
  84. });
  85. // 这里获取后台路由菜单逻辑自行修改
  86. const paramId = id || userStore.getUserInfoState.userId;
  87. if (!paramId) {
  88. throw new Error('paramId is undefined!');
  89. }
  90. let routeList = (await getMenuListById({ id: paramId })) as AppRouteRecordRaw[];
  91. // 动态引入组件
  92. routeList = transformObjToRoute(routeList);
  93. // 后台路由转菜单结构
  94. const backMenuList = transformRouteToMenu(routeList);
  95. this.commitBackMenuListState(backMenuList);
  96. routes = [PAGE_NOT_FOUND_ROUTE, ...routeList];
  97. }
  98. routes.push(ERROR_LOG_ROUTE);
  99. return routes;
  100. }
  101. }
  102. export const permissionStore = getModule<Permission>(Permission);