55 lines
1.8 KiB
TypeScript
Raw Normal View History

2022-08-24 16:52:01 +08:00
import { ref } from "vue"
import store from "@/store"
import { defineStore } from "pinia"
2022-10-18 15:07:42 +08:00
import { type RouteRecordRaw } from "vue-router"
import { constantRoutes, asyncRoutes } from "@/router"
import { flatMultiLevelRoutes } from "@/router/helper"
import routeSettings from "@/config/route"
const hasPermission = (roles: string[], route: RouteRecordRaw) => {
const routeRoles = route.meta?.roles
return routeRoles ? roles.some((role) => routeRoles.includes(role)) : true
}
const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => {
const res: RouteRecordRaw[] = []
routes.forEach((route) => {
const tempRoute = { ...route }
if (hasPermission(roles, tempRoute)) {
if (tempRoute.children) {
tempRoute.children = filterAsyncRoutes(tempRoute.children, roles)
}
res.push(tempRoute)
}
})
return res
}
2022-08-24 16:52:01 +08:00
export const usePermissionStore = defineStore("permission", () => {
const routes = ref<RouteRecordRaw[]>([])
const dynamicRoutes = ref<RouteRecordRaw[]>([])
2024-02-06 20:22:07 +08:00
/** 根据角色生成可访问的 Routes可访问路由 = 常驻路由 + 有访问权限的动态路由) */
2022-08-24 16:52:01 +08:00
const setRoutes = (roles: string[]) => {
2024-02-06 20:22:07 +08:00
const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
_set(accessedRoutes)
}
/** 所有路由 = 所有常驻路由 + 所有动态路由 */
const setAllRoutes = () => {
_set(asyncRoutes)
}
const _set = (accessedRoutes: RouteRecordRaw[]) => {
2022-08-24 16:52:01 +08:00
routes.value = constantRoutes.concat(accessedRoutes)
dynamicRoutes.value = routeSettings.thirdLevelRouteCache ? flatMultiLevelRoutes(accessedRoutes) : accessedRoutes
}
2022-08-24 16:52:01 +08:00
2024-02-06 20:22:07 +08:00
return { routes, dynamicRoutes, setRoutes, setAllRoutes }
})
/** 在 setup 外使用 */
export function usePermissionStoreHook() {
return usePermissionStore(store)
}