permission.js 1.3 KB
Newer Older
1
import { asyncRoutes, constantRoutes } from '@/router'
P
Pan 已提交
2

P
Pan 已提交
3
/**
4
 * Use meta.role to determine if the current user has permission
P
Pan 已提交
5 6 7
 * @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
 * Filter asynchronous routing tables by recursion
18
 * @param routes asyncRoutes
19 20
 * @param roles
 */
21
export function filterAsyncRoutes(routes, roles) {
22 23 24 25 26 27
  const res = []

  routes.forEach(route => {
    const tmp = { ...route }
    if (hasPermission(roles, tmp)) {
      if (tmp.children) {
28
        tmp.children = filterAsyncRoutes(tmp.children, roles)
P
Pan 已提交
29
      }
30
      res.push(tmp)
P
Pan 已提交
31 32
    }
  })
33 34

  return res
35 36
}

花裤衩 已提交
37 38 39 40 41 42 43 44 45
const state = {
  routes: [],
  addRoutes: []
}

const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes
    state.routes = constantRoutes.concat(routes)
P
Pan 已提交
46
  }
P
Pan 已提交
47
}
P
Pan 已提交
48

花裤衩 已提交
49 50 51 52 53
const actions = {
  generateRoutes({ commit }, roles) {
    return new Promise(resolve => {
      let accessedRoutes
      if (roles.includes('admin')) {
P
Pan 已提交
54
        accessedRoutes = asyncRoutes || []
花裤衩 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
      } else {
        accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
      }
      commit('SET_ROUTES', accessedRoutes)
      resolve(accessedRoutes)
    })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}