2022-08-24 16:52:01 +08:00
|
|
|
import { ref } from "vue"
|
2022-04-22 01:16:02 +08:00
|
|
|
import store from "@/store"
|
|
|
|
import { defineStore } from "pinia"
|
2022-08-26 10:35:25 +08:00
|
|
|
import type { RouteRecordRaw } from "vue-router"
|
2022-04-22 01:16:02 +08:00
|
|
|
import { constantRoutes, asyncRoutes } from "@/router"
|
2022-04-21 18:20:39 +08:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2022-08-24 16:52:01 +08:00
|
|
|
export const usePermissionStore = defineStore("permission", () => {
|
|
|
|
const routes = ref<RouteRecordRaw[]>([])
|
|
|
|
const dynamicRoutes = ref<RouteRecordRaw[]>([])
|
|
|
|
|
|
|
|
const setRoutes = (roles: string[]) => {
|
|
|
|
let accessedRoutes
|
|
|
|
if (roles.includes("admin")) {
|
|
|
|
accessedRoutes = asyncRoutes
|
|
|
|
} else {
|
|
|
|
accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
|
2022-04-21 18:20:39 +08:00
|
|
|
}
|
2022-08-24 16:52:01 +08:00
|
|
|
routes.value = constantRoutes.concat(accessedRoutes)
|
|
|
|
dynamicRoutes.value = accessedRoutes
|
2022-04-21 18:20:39 +08:00
|
|
|
}
|
2022-08-24 16:52:01 +08:00
|
|
|
|
|
|
|
return { routes, dynamicRoutes, setRoutes }
|
2022-04-21 18:20:39 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
/** 在 setup 外使用 */
|
|
|
|
export function usePermissionStoreHook() {
|
|
|
|
return usePermissionStore(store)
|
|
|
|
}
|