usePermission.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import type { RouteRecordRaw } from 'vue-router';
  2. import { useAppStore } from '/@/store/modules/app';
  3. import { usePermissionStore } from '/@/store/modules/permission';
  4. import { useUserStore } 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 { useMultipleTabStore } from '/@/store/modules/multipleTab';
  14. // User permissions related operations
  15. export function usePermission() {
  16. const userStore = useUserStore();
  17. const appStore = useAppStore();
  18. const permissionStore = usePermissionStore();
  19. //动态加载流程节点表单权限
  20. let formData: any = {};
  21. function initBpmFormData(_bpmFormData) {
  22. formData = _bpmFormData;
  23. }
  24. const { closeAll } = useTabs(router);
  25. //==================================工作流权限判断-begin=========================================
  26. function hasBpmPermission(code, type) {
  27. // 禁用-type=2
  28. // 显示-type=1
  29. let codeList: string[] = [];
  30. let permissionList = formData.permissionList;
  31. if (permissionList && permissionList.length > 0) {
  32. for (let item of permissionList) {
  33. if (item.type == type) {
  34. codeList.push(item.action);
  35. }
  36. }
  37. }
  38. return codeList.indexOf(code) >= 0;
  39. }
  40. //==================================工作流权限判断-end=========================================
  41. /**
  42. * Change permission mode
  43. */
  44. async function togglePermissionMode() {
  45. appStore.setProjectConfig({
  46. permissionMode: projectSetting.permissionMode === PermissionModeEnum.BACK ? PermissionModeEnum.ROUTE_MAPPING : PermissionModeEnum.BACK,
  47. });
  48. location.reload();
  49. }
  50. /**
  51. * Reset and regain authority resource information
  52. * @param id
  53. */
  54. async function resume() {
  55. const tabStore = useMultipleTabStore();
  56. tabStore.clearCacheTabs();
  57. resetRouter();
  58. const routes = await permissionStore.buildRoutesAction();
  59. routes.forEach((route) => {
  60. router.addRoute(route as unknown as RouteRecordRaw);
  61. });
  62. permissionStore.setLastBuildMenuTime();
  63. closeAll();
  64. }
  65. /**
  66. * 确定是否存在权限
  67. */
  68. function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
  69. // Visible by default
  70. if (!value) {
  71. return def;
  72. }
  73. const permMode = projectSetting.permissionMode;
  74. if ([PermissionModeEnum.ROUTE_MAPPING, PermissionModeEnum.ROLE].includes(permMode)) {
  75. if (!isArray(value)) {
  76. return userStore.getRoleList?.includes(value as RoleEnum);
  77. }
  78. return (intersection(value, userStore.getRoleList) as RoleEnum[]).length > 0;
  79. }
  80. if (PermissionModeEnum.BACK === permMode) {
  81. const allCodeList = permissionStore.getPermCodeList as string[];
  82. if (!isArray(value) && allCodeList && allCodeList.length > 0) {
  83. //=============================工作流权限判断-显示-begin==============================================
  84. if (formData && JSON.stringify(formData) !== '{}') {
  85. let code = value as string;
  86. if (hasBpmPermission(code, '1') === true) {
  87. return true;
  88. }
  89. }
  90. //=============================工作流权限判断-显示-end==============================================
  91. // return allCodeList.includes(value);
  92. const permCode = allCodeList.find((item) => item['action'] == value);
  93. if (permCode) {
  94. return true;
  95. }
  96. return false;
  97. }
  98. return (intersection(value, allCodeList) as string[]).length > 0;
  99. }
  100. return true;
  101. }
  102. /**
  103. * 是否禁用组件
  104. */
  105. function isDisabledAuth(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
  106. //=============================工作流权限判断-禁用-begin==============================================
  107. if (formData) {
  108. let code = value as string;
  109. if (hasBpmPermission(code, '2') === true) {
  110. return true;
  111. }
  112. //update-begin-author:taoyan date:2022-6-17 for: VUEN-1342【流程】编码方式 节点权限配置好后,未生效
  113. if (isCodingButNoConfig(code) == true) {
  114. return false;
  115. }
  116. //update-end-author:taoyan date:2022-6-17 for: VUEN-1342【流程】编码方式 节点权限配置好后,未生效
  117. }
  118. //=============================工作流权限判断-禁用-end==============================================
  119. return !hasPermission(value);
  120. }
  121. /**
  122. * Change roles
  123. * @param roles
  124. */
  125. async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
  126. if (projectSetting.permissionMode !== PermissionModeEnum.ROUTE_MAPPING) {
  127. throw new Error('Please switch PermissionModeEnum to ROUTE_MAPPING mode in the configuration to operate!');
  128. }
  129. if (!isArray(roles)) {
  130. roles = [roles];
  131. }
  132. userStore.setRoleList(roles);
  133. await resume();
  134. }
  135. /**
  136. * refresh menu data
  137. */
  138. async function refreshMenu() {
  139. resume();
  140. }
  141. //update-begin-author:taoyan date:2022-6-17 for: VUEN-1342【流程】编码方式 节点权限配置好后,未生效
  142. /**
  143. * 判断是不是 代码里写了逻辑但是没有配置权限这种情况
  144. */
  145. function isCodingButNoConfig(code) {
  146. let all = permissionStore.allAuthList;
  147. if (all && all instanceof Array) {
  148. let temp = all.filter((item) => item.action == code);
  149. if (temp && temp.length > 0) {
  150. if (temp[0].status == '0') {
  151. return true;
  152. }
  153. } else {
  154. return true;
  155. }
  156. }
  157. return false;
  158. }
  159. //update-end-author:taoyan date:2022-6-17 for: VUEN-1342【流程】编码方式 节点权限配置好后,未生效
  160. return { changeRole, hasPermission, togglePermissionMode, refreshMenu, isDisabledAuth, initBpmFormData };
  161. }