Vben
2021-04-10 215d8bab380728164d7fe2958c2d2d1151fce892
提交 | 用户 | age
46e087 1 import type { RouteRecordRaw } from 'vue-router';
V 2
215d8b 3 import { useAppStore } from '/@/store/modules/app';
V 4 import { usePermissionStore } from '/@/store/modules/permission';
5 import { useUserStore } from '/@/store/modules/user';
2f6253 6
46e087 7 import { useTabs } from './useTabs';
V 8
9 import router, { resetRouter } from '/@/router';
c303ec 10 // import { RootRoute } from '/@/router/routes';
46e087 11
b7ce74 12 import projectSetting from '/@/settings/projectSetting';
46e087 13 import { PermissionModeEnum } from '/@/enums/appEnum';
V 14 import { RoleEnum } from '/@/enums/roleEnum';
15
16 import { intersection } from 'lodash-es';
17 import { isArray } from '/@/utils/is';
215d8b 18 import { useMultipleTabStore } from '/@/store/modules/multipleTab';
46e087 19
V 20 // User permissions related operations
2f6253 21 export function usePermission() {
215d8b 22   const userStore = useUserStore();
V 23   const appStore = useAppStore();
24   const permissionStore = usePermissionStore();
25   const { closeAll } = useTabs(router);
26
2f6253 27   /**
46e087 28    * Change permission mode
2f6253 29    */
30   async function togglePermissionMode() {
215d8b 31     appStore.setProjectConfig({
2f6253 32       permissionMode:
b7ce74 33         projectSetting.permissionMode === PermissionModeEnum.BACK
2f6253 34           ? PermissionModeEnum.ROLE
35           : PermissionModeEnum.BACK,
36     });
c303ec 37     location.reload();
2f6253 38   }
39
46e087 40   /**
V 41    * Reset and regain authority resource information
42    * @param id
43    */
2f6253 44   async function resume(id?: string | number) {
215d8b 45     const tabStore = useMultipleTabStore();
V 46     tabStore.clearCacheTabs();
2f6253 47     resetRouter();
48     const routes = await permissionStore.buildRoutesAction(id);
49     routes.forEach((route) => {
8a9ca4 50       router.addRoute((route as unknown) as RouteRecordRaw);
2f6253 51     });
215d8b 52     permissionStore.setLastBuildMenuTime();
c303ec 53     closeAll();
2f6253 54   }
55
56   /**
46e087 57    * Determine whether there is permission
2f6253 58    */
59   function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
b7ce74 60     const permMode = projectSetting.permissionMode;
215d8b 61
2f6253 62     if (PermissionModeEnum.ROLE === permMode) {
46e087 63       // Visible by default
2f6253 64       if (!value) {
65         return def;
66       }
67       if (!isArray(value)) {
215d8b 68         return userStore.getRoleList?.includes(value as RoleEnum);
2f6253 69       }
215d8b 70       return (intersection(value, userStore.getRoleList) as RoleEnum[]).length > 0;
2f6253 71     }
215d8b 72
2f6253 73     if (PermissionModeEnum.BACK === permMode) {
46e087 74       // Visible by default
2f6253 75       if (!value) {
76         return def;
77       }
215d8b 78       const allCodeList = permissionStore.getPermCodeList;
2f6253 79       if (!isArray(value)) {
80         return allCodeList.includes(value as string);
81       }
82       return (intersection(value, allCodeList) as string[]).length > 0;
83     }
84     return true;
85   }
86
87   /**
46e087 88    * Change roles
2f6253 89    * @param roles
90    */
91   async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
b7ce74 92     if (projectSetting.permissionMode !== PermissionModeEnum.ROLE) {
46e087 93       throw new Error(
V 94         'Please switch PermissionModeEnum to ROLE mode in the configuration to operate!'
95       );
2f6253 96     }
97     if (!isArray(roles)) {
98       roles = [roles];
99     }
215d8b 100     userStore.setRoleList(roles);
2f6253 101     await resume();
102   }
103
104   /**
46e087 105    * Change menu
2f6253 106    */
107   async function changeMenu(id?: string | number) {
46e087 108     // 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.
2f6253 109     resume(id);
110   }
111
112   return { changeRole, hasPermission, togglePermissionMode, changeMenu };
113 }