import { defineStore } from 'pinia';
|
import { store } from '@/store';
|
// import { RouteConfigs } from "@/layout/types";
|
import { constantRoutes, Route } from '@/router';
|
import { addAsyncRoutes, ascending } from '@/router/utils';
|
import * as menuServices from '@/services/api/menu';
|
import { myClient } from '@/constants/query';
|
|
export interface PermissonState {
|
routes: Route[];
|
addRoutes: Route[];
|
}
|
|
export const usePermissionStore = defineStore({
|
id: 'permission',
|
state: (): PermissonState => ({
|
// 静态路由生成的菜单
|
routes: [],
|
// 动态路由
|
addRoutes: [],
|
}),
|
getters: {
|
permission_routes(state) {
|
return state.routes;
|
},
|
},
|
actions: {
|
getModuleList() {
|
return new Promise<Route[]>(async (resolve, reject) => {
|
try {
|
const params: API.APIgetMenusParams = {
|
userType: EnumUserType.Operation,
|
clientType: EnumClientType.PcWeb,
|
};
|
const res = await myClient.fetchQuery({
|
queryKey: ['menuServices/getMenus', params],
|
queryFn: () => {
|
return menuServices.getMenus(params, {
|
showLoading: false,
|
});
|
},
|
staleTime: Infinity,
|
});
|
const accessedRoutes = ascending(addAsyncRoutes(formatModuleList(res))); // createAccessedRoutes(userMenuList, userInfo)
|
//@ts-ignore
|
accessedRoutes.push({ path: '/:pathMatch(.*)*', redirect: '/404', hidden: true });
|
|
this.addRoutes = accessedRoutes;
|
this.routes = constantRoutes.concat(accessedRoutes);
|
|
resolve(accessedRoutes);
|
} catch (e) {
|
reject(e);
|
}
|
});
|
},
|
// 清空缓存页面
|
resetModuleList() {
|
this.addRoutes = [];
|
this.routes = [];
|
},
|
},
|
});
|
|
export function usePermissionStoreHook() {
|
return usePermissionStore(store);
|
}
|
|
function formatModuleList(moduleList: API.GetMenusQueryResultItem[]) {
|
return moduleList.map((item) => {
|
const isRootModule = !item.parentId && item.type == EnumMenuType.Menu;
|
//@ts-ignore
|
let asyncRoute: Route = isRootModule
|
? {
|
path: formatPath(item.url),
|
name: item.code,
|
redirect: 'noRedirect',
|
alwaysShow: true,
|
hidden: item.type != EnumMenuType.Menu,
|
meta: {
|
title: item.name,
|
icon: item.icon,
|
moduleId: item.id,
|
rank: item?.sort,
|
rootMenu: true,
|
},
|
}
|
: {
|
path: formatPath(item.url),
|
name: item.code,
|
hidden: item.type != EnumMenuType.Menu,
|
alwaysShow: true,
|
meta: {
|
title: item.name,
|
moduleId: item.id,
|
noCache: !item.isCache,
|
rank: item?.sort,
|
},
|
};
|
const children = formatModuleList(item.children);
|
asyncRoute.children = children;
|
return asyncRoute;
|
});
|
}
|
|
function formatPath(path: string) {
|
return path.startsWith('/') ? path : '/' + path;
|
}
|