lighty-admin-vite
Version:
基于 Vue3、TypeScript、Element Plus、Pinia 和 Vite 等主流技术.
58 lines (51 loc) • 1.54 kB
text/typescript
import { ref } from "vue"
import store from "@/store"
import { defineStore } from "pinia"
import { type RouteRecordRaw } from "vue-router"
import { constantRoutes, asyncRoutes } from "@/router"
import asyncRouteSettings from "@/config/async-route"
const hasPermission = (roles: string[], route: RouteRecordRaw) => {
if (route.meta && route.meta.roles) {
return roles.some((role) => {
if (route.meta?.roles !== undefined) {
return route.meta.roles.includes(role)
} else {
return false
}
})
} else {
return true
}
}
const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => {
const res: RouteRecordRaw[] = []
routes.forEach((route) => {
const r = { ...route }
if (hasPermission(roles, r)) {
if (r.children) {
r.children = filterAsyncRoutes(r.children, roles)
}
res.push(r)
}
})
return res
}
export const usePermissionStore = defineStore("permission", () => {
const routes = ref<RouteRecordRaw[]>([])
const dynamicRoutes = ref<RouteRecordRaw[]>([])
const setRoutes = (roles: string[]) => {
let accessedRoutes
if (!asyncRouteSettings.open) {
accessedRoutes = asyncRoutes
} else {
accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
}
routes.value = constantRoutes.concat(accessedRoutes)
dynamicRoutes.value = accessedRoutes
}
return { routes, dynamicRoutes, setRoutes }
})
/** 在 setup 外使用 */
export function usePermissionStoreHook() {
return usePermissionStore(store)
}