import router from '@/router' import { systemRouterMap } from '@/router/routes/system' import type { AppRouteRecordRaw } from '@/router/model' import { defineStore } from 'pinia' import { RouteRecordRaw } from 'vue-router' interface PermissionState { authoritiesRoutes: AppRouteRecordRaw[] } function hasPermission(roles: string[], route: AppRouteRecordRaw) { if (route.meta && route.meta.permissions) { let flag = false for (let i = 0, len = roles.length; i < len; i++) { flag = route.meta.permissions.includes(roles[i]) if (flag) { return true } } return false } return true } function filterAsyncRouter(routerMap: AppRouteRecordRaw[], roles: string[]) { const accessedRouters = routerMap.filter(route => { if (hasPermission(roles, route)) { if (route.children && route.children.length) { route.children = filterAsyncRouter(route.children, roles) } return true } return false }) return accessedRouters } // 防止某个redirect对应的子路由无权限,显示空白页,重新给redirect赋值 function filterRoutesForeach(routes) { routes.forEach(route => { if (route.children && route.children.length > 0) { route.redirect = route.children[0].path filterRoutesForeach(route.children) // 遍历子树 } }) } export const permissionStore = defineStore({ id: 'store-permisson', state: (): PermissionState => ({ authoritiesRoutes: [], }), actions: { setAuthoritiesRoutes(authoritiesRoutes: AppRouteRecordRaw[]) { this.authoritiesRoutes = authoritiesRoutes }, generateRoutes(authoritiesList: string[]) { return new Promise(resolve => { const filterRoutes: AppRouteRecordRaw[] = filterAsyncRouter( systemRouterMap, authoritiesList ) filterRoutesForeach(filterRoutes) this.setAuthoritiesRoutes(filterRoutes) resolve(filterRoutes) }) }, addRoutes(authoritiesList: string[]) { return new Promise(resolve => { this.generateRoutes(authoritiesList).then( (filterRoutes: AppRouteRecordRaw[]) => { filterRoutes.forEach((f: AppRouteRecordRaw) => { router.addRoute(f as unknown as RouteRecordRaw) }) } ) resolve() }) }, }, })