123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import type { AppRouteRecordRaw, Menu } from '/@/router/types';
- import store from '/@/store/index';
- import { hotModuleUnregisterModule } from '/@/utils/helper/vuexHelper';
- import { VuexModule, Mutation, Module, getModule, Action } from 'vuex-module-decorators';
- import { PermissionModeEnum } from '/@/enums/appEnum';
- import { appStore } from '/@/store/modules/app';
- import { userStore } from '/@/store/modules/user';
- import { asyncRoutes } from '/@/router/routes';
- import { filter } from '/@/utils/helper/treeHelper';
- import { toRaw } from 'vue';
- import { getMenuListById } from '/@/api/sys/menu';
- import { transformObjToRoute } from '/@/router/helper/routeHelper';
- import { transformRouteToMenu } from '/@/router/helper/menuHelper';
- import { useMessage } from '/@/hooks/web/useMessage';
- import { useI18n } from '/@/hooks/web/useI18n';
- import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '/@/router/constant';
- const { createMessage } = useMessage();
- const NAME = 'permission';
- hotModuleUnregisterModule(NAME);
- @Module({ dynamic: true, namespaced: true, store, name: NAME })
- class Permission extends VuexModule {
- // Permission code list
- private permCodeListState: string[] = [];
- // Whether the route has been dynamically added
- private isDynamicAddedRouteState = false;
- // To trigger a menu update
- private lastBuildMenuTimeState = 0;
- // Backstage menu list
- private backMenuListState: Menu[] = [];
- get getPermCodeListState() {
- return this.permCodeListState;
- }
- get getBackMenuListState() {
- return this.backMenuListState;
- }
- get getLastBuildMenuTimeState() {
- return this.lastBuildMenuTimeState;
- }
- get getIsDynamicAddedRouteState() {
- return this.isDynamicAddedRouteState;
- }
- @Mutation
- commitPermCodeListState(codeList: string[]): void {
- this.permCodeListState = codeList;
- }
- @Mutation
- commitBackMenuListState(list: Menu[]): void {
- this.backMenuListState = list;
- }
- @Mutation
- commitLastBuildMenuTimeState(): void {
- this.lastBuildMenuTimeState = new Date().getTime();
- }
- @Mutation
- commitDynamicAddedRouteState(added: boolean): void {
- this.isDynamicAddedRouteState = added;
- }
- @Mutation
- commitResetState(): void {
- this.isDynamicAddedRouteState = false;
- this.permCodeListState = [];
- this.backMenuListState = [];
- this.lastBuildMenuTimeState = 0;
- }
- @Action
- async buildRoutesAction(id?: number | string): Promise<AppRouteRecordRaw[]> {
- const { t } = useI18n();
- let routes: AppRouteRecordRaw[] = [];
- const roleList = toRaw(userStore.getRoleListState);
- const { permissionMode } = appStore.getProjectConfig;
- // role permissions
- if (permissionMode === PermissionModeEnum.ROLE) {
- routes = filter(asyncRoutes, (route) => {
- const { meta } = route as AppRouteRecordRaw;
- const { roles } = meta || {};
- if (!roles) return true;
- return roleList.some((role) => roles.includes(role));
- });
- // 如果确定不需要做后台动态权限,请将下面整个判断注释
- } else if (permissionMode === PermissionModeEnum.BACK) {
- createMessage.loading({
- content: t('sys.app.menuLoading'),
- duration: 1,
- });
- // 这里获取后台路由菜单逻辑自行修改
- const paramId = id || userStore.getUserInfoState.userId;
- if (!paramId) {
- throw new Error('paramId is undefined!');
- }
- let routeList = (await getMenuListById({ id: paramId })) as AppRouteRecordRaw[];
- // 动态引入组件
- routeList = transformObjToRoute(routeList);
- // 后台路由转菜单结构
- const backMenuList = transformRouteToMenu(routeList);
- this.commitBackMenuListState(backMenuList);
- routes = [PAGE_NOT_FOUND_ROUTE, ...routeList];
- }
- routes.push(ERROR_LOG_ROUTE);
- return routes;
- }
- }
- export const permissionStore = getModule<Permission>(Permission);
|