import type { RouteRecordRaw } from "vue-router" import routeSettings from "@/config/route" import { constantRoutes, dynamicRoutes } from "@/router" import { flatMultiLevelRoutes } from "@/router/helper" import { pinia } from "@/store" import { defineStore } from "pinia" import { ref } from "vue" function hasPermission(roles: string[], route: RouteRecordRaw) { const routeRoles = route.meta?.roles return routeRoles ? roles.some(role => routeRoles.includes(role)) : true } function filterDynamicRoutes(routes: RouteRecordRaw[], roles: string[]) { const res: RouteRecordRaw[] = [] routes.forEach((route) => { const tempRoute = { ...route } if (hasPermission(roles, tempRoute)) { if (tempRoute.children) { tempRoute.children = filterDynamicRoutes(tempRoute.children, roles) } res.push(tempRoute) } }) return res } export const usePermissionStore = defineStore("permission", () => { /** 可访问的路由 */ const routes = ref([]) /** 有访问权限的动态路由 */ const addRoutes = ref([]) /** 根据角色生成可访问的 Routes(可访问的路由 = 常驻路由 + 有访问权限的动态路由) */ const setRoutes = (roles: string[]) => { const accessedRoutes = filterDynamicRoutes(dynamicRoutes, roles) _set(accessedRoutes) } /** 所有路由 = 所有常驻路由 + 所有动态路由 */ const setAllRoutes = () => { _set(dynamicRoutes) } const _set = (accessedRoutes: RouteRecordRaw[]) => { routes.value = constantRoutes.concat(accessedRoutes) addRoutes.value = routeSettings.thirdLevelRouteCache ? flatMultiLevelRoutes(accessedRoutes) : accessedRoutes } return { routes, addRoutes, setRoutes, setAllRoutes } }) /** * 在 SPA 应用中可用于在 pinia 实例被激活前使用 store * 在 SSR 应用中可用于在 setup 外使用 store */ export function usePermissionStoreOutside() { return usePermissionStore(pinia) }