郑永安
2023-06-19 6ae336af4670a425ae8892aacda560ec2147d8a7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import { asyncRoutes, constantRoutes } from '@/router';
import ConstantRoutes from '@/router/constroutes';
import { deepClone } from '@/utils/index';
import store from '..';
 
/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
  if (route.meta && route.meta.roles) {
    return roles.some(role => route.meta.roles.includes(role));
  } else {
    return true;
  }
}
 
/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterRoutes(routers, permissionIds) {
  const result = deepClone(routers);
  for (let router of result) {
    if (!router.id) {
      continue;
    }
 
    if (permissionIds.includes(router.id)) {
      if (router.hasOwnProperty('children')) {
        router.children = filterRoutes(router.children, permissionIds);
      }
    } else {
      router.hidden = true;
    }
  }
 
  return result;
}
 
const state = {
  routes: [],
  addRoutes: []
};
 
const mutations = {
  SET_ROUTES: (state, routes) => {
    state.addRoutes = routes;
    state.routes = ConstantRoutes.concat(routes);
  }
};
 
const actions = {
  generateRoutes({ commit }, permissionId) {
    return new Promise(resolve => {
      const isAdmin = store.getters.username === 'admin' || store.getters.username === 'superadmin';
      const accessedRoutes = isAdmin ? ConstantRoutes : filterRoutes(ConstantRoutes, permissionId);
 
      commit('SET_ROUTES', accessedRoutes);
      resolve(accessedRoutes);
    });
  }
};
 
export default {
  namespaced: true,
  state,
  mutations,
  actions
};