2024-02-06 20:22:07 +08:00

55 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ref } from "vue"
import store from "@/store"
import { defineStore } from "pinia"
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
}
export const usePermissionStore = defineStore("permission", () => {
const routes = ref<RouteRecordRaw[]>([])
const dynamicRoutes = ref<RouteRecordRaw[]>([])
/** 根据角色生成可访问的 Routes可访问路由 = 常驻路由 + 有访问权限的动态路由) */
const setRoutes = (roles: string[]) => {
const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
_set(accessedRoutes)
}
/** 所有路由 = 所有常驻路由 + 所有动态路由 */
const setAllRoutes = () => {
_set(asyncRoutes)
}
const _set = (accessedRoutes: RouteRecordRaw[]) => {
routes.value = constantRoutes.concat(accessedRoutes)
dynamicRoutes.value = routeSettings.thirdLevelRouteCache ? flatMultiLevelRoutes(accessedRoutes) : accessedRoutes
}
return { routes, dynamicRoutes, setRoutes, setAllRoutes }
})
/** 在 setup 外使用 */
export function usePermissionStoreHook() {
return usePermissionStore(store)
}