import { defineStore } from 'pinia'
|
import { store } from '@/store'
|
import { cloneDeep } from 'lodash-es'
|
import remainingRouter from '@/router/modules/remaining'
|
import { flatMultiLevelRoutes, generateRoute } from '@/utils/routerHelper'
|
import {CACHE_KEY, useSessionCache} from '@/hooks/web/useCache'
|
|
const { wsSessionCache } = useSessionCache()
|
|
export interface PermissionState {
|
routers: AppRouteRecordRaw[]
|
addRouters: AppRouteRecordRaw[]
|
menuTabRouters: AppRouteRecordRaw[]
|
}
|
|
export const usePermissionStore = defineStore('permission', {
|
state: (): PermissionState => ({
|
routers: [],
|
addRouters: [],
|
menuTabRouters: []
|
}),
|
getters: {
|
getRouters(): AppRouteRecordRaw[] {
|
return this.routers
|
},
|
getAddRouters(): AppRouteRecordRaw[] {
|
return flatMultiLevelRoutes(cloneDeep(this.addRouters))
|
},
|
getMenuTabRouters(): AppRouteRecordRaw[] {
|
return this.menuTabRouters
|
}
|
},
|
actions: {
|
async generateRoutes(): Promise<unknown> {
|
return new Promise<void>(async (resolve) => {
|
// 获得菜单列表,它在登录的时候,setUserInfoAction 方法中已经进行获取
|
let res: AppCustomRouteRecordRaw[] = []
|
const roleRouters = wsSessionCache.get(CACHE_KEY.ROLE_ROUTERS)
|
if (roleRouters) {
|
res = roleRouters as AppCustomRouteRecordRaw[]
|
}
|
const routerMap: AppRouteRecordRaw[] = generateRoute(res)
|
// 动态路由,404一定要放到最后面
|
// preschooler:vue-router@4以后已支持静态404路由,此处可不再追加
|
this.addRouters = routerMap.concat([
|
{
|
path: '/:path(.*)*',
|
// redirect: '/404',
|
component: () => import('@/views/Error/404.vue'),
|
name: '404Page',
|
meta: {
|
hidden: true,
|
breadcrumb: false
|
}
|
}
|
])
|
// 渲染菜单的所有路由
|
this.routers = cloneDeep(remainingRouter).concat(routerMap)
|
resolve()
|
})
|
},
|
setMenuTabRouters(routers: AppRouteRecordRaw[]): void {
|
this.menuTabRouters = routers
|
}
|
},
|
persist: false
|
})
|
|
export const usePermissionStoreWithOut = () => {
|
return usePermissionStore(store)
|
}
|