permission.js 1.4 KB
Newer Older
P
Pan 已提交
1
import { asyncRouterMap, constantRouterMap } from '@/router'
P
Pan 已提交
2

P
Pan 已提交
3 4 5 6 7
/**
 * 通过meta.role判断是否与当前用户权限匹配
 * @param roles
 * @param route
 */
P
Pan 已提交
8
function hasPermission(roles, route) {
P
Pan 已提交
9
  if (route.meta && route.meta.roles) {
10
    return roles.some(role => route.meta.roles.includes(role))
P
Pan 已提交
11 12 13 14 15
  } else {
    return true
  }
}

16 17
/**
 * 递归过滤异步路由表,返回符合用户角色权限的路由表
18
 * @param routes asyncRouterMap
19 20
 * @param roles
 */
21 22 23 24 25 26 27 28
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)
P
Pan 已提交
29
      }
30
      res.push(tmp)
P
Pan 已提交
31 32
    }
  })
33 34

  return res
35 36
}

P
Pan 已提交
37 38
const permission = {
  state: {
39
    routers: [],
P
Pan 已提交
40 41 42 43
    addRouters: []
  },
  mutations: {
    SET_ROUTERS: (state, routers) => {
P
Pan 已提交
44 45
      state.addRouters = routers
      state.routers = constantRouterMap.concat(routers)
P
Pan 已提交
46 47 48 49
    }
  },
  actions: {
    GenerateRoutes({ commit }, data) {
P
Pan 已提交
50
      return new Promise(resolve => {
P
Pan 已提交
51
        const { roles } = data
52
        let accessedRouters
53
        if (roles.includes('admin')) {
54 55 56 57
          accessedRouters = asyncRouterMap
        } else {
          accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
        }
P
Pan 已提交
58 59
        commit('SET_ROUTERS', accessedRouters)
        resolve()
P
Pan 已提交
60
      })
P
Pan 已提交
61 62
    }
  }
P
Pan 已提交
63
}
P
Pan 已提交
64

P
Pan 已提交
65
export default permission