vue-vben-admin/src/hooks/web/usePermission.ts

111 lines
3.1 KiB
TypeScript
Raw Normal View History

2020-11-18 22:41:59 +08:00
import type { RouteRecordRaw } from 'vue-router';
2021-04-10 19:25:49 +08:00
import { useAppStore } from '/@/store/modules/app';
import { usePermissionStore } from '/@/store/modules/permission';
import { useUserStore } from '/@/store/modules/user';
2020-11-18 22:41:59 +08:00
2020-09-28 20:19:10 +08:00
import { useTabs } from './useTabs';
2020-11-18 22:41:59 +08:00
2021-06-07 21:30:27 +08:00
import { router, resetRouter } from '/@/router';
2020-12-03 21:49:32 +08:00
// import { RootRoute } from '/@/router/routes';
2020-11-18 22:41:59 +08:00
import projectSetting from '/@/settings/projectSetting';
2020-09-28 20:19:10 +08:00
import { PermissionModeEnum } from '/@/enums/appEnum';
2020-11-18 22:41:59 +08:00
import { RoleEnum } from '/@/enums/roleEnum';
2020-09-28 20:19:10 +08:00
import { intersection } from 'lodash-es';
2020-11-18 22:41:59 +08:00
import { isArray } from '/@/utils/is';
2021-04-10 19:25:49 +08:00
import { useMultipleTabStore } from '/@/store/modules/multipleTab';
2020-09-28 20:19:10 +08:00
2020-11-18 22:41:59 +08:00
// User permissions related operations
2020-09-28 20:19:10 +08:00
export function usePermission() {
2021-04-10 19:25:49 +08:00
const userStore = useUserStore();
const appStore = useAppStore();
const permissionStore = usePermissionStore();
const { closeAll } = useTabs(router);
2020-09-28 20:19:10 +08:00
/**
2020-11-18 22:41:59 +08:00
* Change permission mode
2020-09-28 20:19:10 +08:00
*/
async function togglePermissionMode() {
2021-04-10 19:25:49 +08:00
appStore.setProjectConfig({
2020-09-28 20:19:10 +08:00
permissionMode:
projectSetting.permissionMode === PermissionModeEnum.BACK
? PermissionModeEnum.ROUTE_MAPPING
2020-09-28 20:19:10 +08:00
: PermissionModeEnum.BACK,
});
2020-12-03 21:49:32 +08:00
location.reload();
2020-09-28 20:19:10 +08:00
}
2020-11-18 22:41:59 +08:00
/**
* Reset and regain authority resource information
* @param id
*/
async function resume() {
2021-04-10 19:25:49 +08:00
const tabStore = useMultipleTabStore();
tabStore.clearCacheTabs();
2020-09-28 20:19:10 +08:00
resetRouter();
const routes = await permissionStore.buildRoutesAction();
2020-09-28 20:19:10 +08:00
routes.forEach((route) => {
router.addRoute(route as unknown as RouteRecordRaw);
2020-09-28 20:19:10 +08:00
});
2021-04-10 19:25:49 +08:00
permissionStore.setLastBuildMenuTime();
2020-12-03 21:49:32 +08:00
closeAll();
2020-09-28 20:19:10 +08:00
}
/**
2020-11-18 22:41:59 +08:00
* Determine whether there is permission
2020-09-28 20:19:10 +08:00
*/
function hasPermission(value?: RoleEnum | RoleEnum[] | string | string[], def = true): boolean {
// Visible by default
if (!value) {
return def;
}
const permMode = projectSetting.permissionMode;
2021-04-10 19:25:49 +08:00
if ([PermissionModeEnum.ROUTE_MAPPING, PermissionModeEnum.ROLE].includes(permMode)) {
2020-09-28 20:19:10 +08:00
if (!isArray(value)) {
2021-04-10 19:25:49 +08:00
return userStore.getRoleList?.includes(value as RoleEnum);
2020-09-28 20:19:10 +08:00
}
2021-04-10 19:25:49 +08:00
return (intersection(value, userStore.getRoleList) as RoleEnum[]).length > 0;
2020-09-28 20:19:10 +08:00
}
2021-04-10 19:25:49 +08:00
2020-09-28 20:19:10 +08:00
if (PermissionModeEnum.BACK === permMode) {
2021-06-26 23:56:57 +08:00
const allCodeList = permissionStore.getPermCodeList as string[];
2020-09-28 20:19:10 +08:00
if (!isArray(value)) {
2021-06-26 23:56:57 +08:00
return allCodeList.includes(value);
2020-09-28 20:19:10 +08:00
}
return (intersection(value, allCodeList) as string[]).length > 0;
}
return true;
}
/**
2020-11-18 22:41:59 +08:00
* Change roles
2020-09-28 20:19:10 +08:00
* @param roles
*/
async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
if (projectSetting.permissionMode !== PermissionModeEnum.ROUTE_MAPPING) {
2020-11-18 22:41:59 +08:00
throw new Error(
2021-08-24 22:41:48 +08:00
'Please switch PermissionModeEnum to ROUTE_MAPPING mode in the configuration to operate!',
2020-11-18 22:41:59 +08:00
);
2020-09-28 20:19:10 +08:00
}
2021-04-10 20:32:44 +08:00
2020-09-28 20:19:10 +08:00
if (!isArray(roles)) {
roles = [roles];
}
2021-04-10 19:25:49 +08:00
userStore.setRoleList(roles);
2020-09-28 20:19:10 +08:00
await resume();
}
/**
* refresh menu data
2020-09-28 20:19:10 +08:00
*/
async function refreshMenu() {
resume();
2020-09-28 20:19:10 +08:00
}
return { changeRole, hasPermission, togglePermissionMode, refreshMenu };
2020-09-28 20:19:10 +08:00
}