usePermission.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import type { RouteRecordRaw } from 'vue-router';
  2. import { appStore } from '/@/store/modules/app';
  3. import { permissionStore } from '/@/store/modules/permission';
  4. import { userStore } from '/@/store/modules/user';
  5. import { useTabs } from './useTabs';
  6. import router, { resetRouter } from '/@/router';
  7. // import { RootRoute } from '/@/router/routes';
  8. import { PermissionModeEnum } from '/@/enums/appEnum';
  9. import { RoleEnum } from '/@/enums/roleEnum';
  10. import { intersection } from 'lodash-es';
  11. import { isArray } from '/@/utils/is';
  12. import { tabStore } from '/@/store/modules/tab';
  13. // User permissions related operations
  14. export function usePermission() {
  15. /**
  16. * Change permission mode
  17. */
  18. async function togglePermissionMode() {
  19. appStore.commitProjectConfigState({
  20. permissionMode:
  21. appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK
  22. ? PermissionModeEnum.ROLE
  23. : PermissionModeEnum.BACK,
  24. });
  25. location.reload();
  26. }
  27. /**
  28. * Reset and regain authority resource information
  29. * @param id
  30. */
  31. async function resume(id?: string | number) {
  32. tabStore.commitClearCache();
  33. resetRouter();
  34. const routes = await permissionStore.buildRoutesAction(id);
  35. routes.forEach((route) => {
  36. router.addRoute((route as unknown) as RouteRecordRaw);
  37. });
  38. permissionStore.commitLastBuildMenuTimeState();
  39. const { closeAll } = useTabs();
  40. closeAll();
  41. }
  42. /**
  43. * Determine whether there is permission
  44. */
  45. function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
  46. const permMode = appStore.getProjectConfig.permissionMode;
  47. if (PermissionModeEnum.ROLE === permMode) {
  48. // Visible by default
  49. if (!value) {
  50. return def;
  51. }
  52. if (!isArray(value)) {
  53. return userStore.getRoleListState?.includes(value as RoleEnum);
  54. }
  55. return (intersection(value, userStore.getRoleListState) as RoleEnum[]).length > 0;
  56. }
  57. if (PermissionModeEnum.BACK === permMode) {
  58. // Visible by default
  59. if (!value) {
  60. return def;
  61. }
  62. const allCodeList = permissionStore.getPermCodeListState;
  63. if (!isArray(value)) {
  64. return allCodeList.includes(value as string);
  65. }
  66. return (intersection(value, allCodeList) as string[]).length > 0;
  67. }
  68. return true;
  69. }
  70. /**
  71. * Change roles
  72. * @param roles
  73. */
  74. async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
  75. if (appStore.getProjectConfig.permissionMode !== PermissionModeEnum.ROLE) {
  76. throw new Error(
  77. 'Please switch PermissionModeEnum to ROLE mode in the configuration to operate!'
  78. );
  79. }
  80. if (!isArray(roles)) {
  81. roles = [roles];
  82. }
  83. userStore.commitRoleListState(roles);
  84. await resume();
  85. }
  86. /**
  87. * Change menu
  88. */
  89. async function changeMenu(id?: string | number) {
  90. // TODO The id passed in here is for testing. Actually, you don’t need to pass it. The id of the login person will be automatically obtained.
  91. resume(id);
  92. }
  93. return { changeRole, hasPermission, togglePermissionMode, changeMenu };
  94. }