usePermission.ts 3.1 KB

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