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