69 lines
2.0 KiB
JavaScript
69 lines
2.0 KiB
JavaScript
import { defineStore } from "pinia"
|
||
|
||
// 需要在头部传入路由表并且在用户登录的时候进行此操作
|
||
// 引入路由表
|
||
import { constantRouterMap, asyncRoutes } from '@/router'
|
||
|
||
/**
|
||
* 通过meta.role判断是否与当前用户权限匹配,此处也可以根据自己的需求进行修改。比如按位与
|
||
* @param roles 权限
|
||
* @param route 总的路由表
|
||
*/
|
||
function hasPermission(roles, route) {
|
||
if (route.meta && route.meta.roles) {
|
||
console.log(route.meta, roles.some(role => route.meta.roles.includes(role)))
|
||
return roles.some(role => route.meta.roles.includes(role))
|
||
} else {
|
||
return true
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 递归过滤异步路由表,返回符合用户角色权限的路由表
|
||
* @param routes 需要筛选的路由表
|
||
* @param roles 权限
|
||
*/
|
||
function filterAsyncRouter(routes, roles) {
|
||
const res = []
|
||
|
||
routes.forEach(route => {
|
||
const tmp = { ...route }
|
||
|
||
if (hasPermission(roles, tmp)) {
|
||
if (tmp.children) {
|
||
tmp.children = filterAsyncRouter(tmp.children, roles)
|
||
}
|
||
res.push(tmp)
|
||
}
|
||
})
|
||
return res
|
||
}
|
||
|
||
export const usePermissionStore = defineStore({
|
||
id: 'permission',
|
||
state: () => ({
|
||
routers: [],
|
||
}),
|
||
actions: {
|
||
GenerateRoutes(roles) {
|
||
return new Promise(resolve => {
|
||
let accessedRouters = []
|
||
// 在这里当是管理员权限时,就给予所有的路由表
|
||
if (roles === 'admin') {
|
||
accessedRouters = asyncRoutes
|
||
} else {
|
||
accessedRouters = filterAsyncRouter(asyncRoutes, roles)
|
||
}
|
||
this.routers = constantRouterMap.concat(accessedRouters)
|
||
resolve(this.routers)
|
||
})
|
||
},
|
||
ResetRoutes() {
|
||
return new Promise(resolve => {
|
||
this.routers = []
|
||
resolve()
|
||
})
|
||
}
|
||
},
|
||
})
|