vben
2020-11-03 bcab4b774d384a5de9b87a0c700a9937c79eb5cd
提交 | 用户 | age
2f6253 1 import { appStore } from './../../store/modules/app';
2 import { permissionStore } from '/@/store/modules/permission';
3 import { useTabs } from './useTabs';
4 import { RoleEnum } from '/@/enums/roleEnum';
5 import router, { resetRouter } from '/@/router';
6 import { userStore } from '/@/store/modules/user';
7 import { isArray } from '/@/utils/is';
8 import { RootRoute } from '/@/router/routes';
9 import type { RouteRecordRaw } from 'vue-router';
10 import { PermissionModeEnum } from '/@/enums/appEnum';
11 import { intersection } from 'lodash-es';
12
13 export function usePermission() {
14   /**
15    * 更换权限模式
16    */
17   async function togglePermissionMode() {
18     appStore.commitProjectConfigState({
19       permissionMode:
20         appStore.getProjectConfig.permissionMode === PermissionModeEnum.BACK
21           ? PermissionModeEnum.ROLE
22           : PermissionModeEnum.BACK,
23     });
24     resume();
25     // location.reload();
26   }
27
28   async function resume(id?: string | number) {
29     resetRouter();
30     const routes = await permissionStore.buildRoutesAction(id);
31     routes.forEach((route) => {
32       router.addRoute(RootRoute.name!, route as RouteRecordRaw);
33     });
34     permissionStore.commitLastBuildMenuTimeState();
35     const {
36       // closeAll,
37       closeOther,
38     } = useTabs();
39     // closeAll();
40     closeOther();
41   }
42
43   /**
44    * 角色模式下判断是否显示
45    */
46   function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
47     const permMode = appStore.getProjectConfig.permissionMode;
48     if (PermissionModeEnum.ROLE === permMode) {
49       // !不传默认可见
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       // !不传默认可见
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
70     return true;
71   }
72
73   /**
74    * 更新角色
75    * @param roles
76    */
77   async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
78     if (appStore.getProjectConfig.permissionMode !== PermissionModeEnum.ROLE) {
79       throw new Error('请在配置中将PermissionModeEnum切换为ROLE模式在进行操作!');
80     }
81     if (!isArray(roles)) {
82       roles = [roles];
83     }
84     userStore.commitRoleListState(roles);
85     await resume();
86   }
87
88   /**
89    *
90    */
91   async function changeMenu(id?: string | number) {
92     // 这里传入id是为测试,实际可以不用传,会自动获取登录人的id
93     resume(id);
94   }
95
96   return { changeRole, hasPermission, togglePermissionMode, changeMenu };
97 }