permission.js 1.6 KB
Newer Older
RuoYi's avatar
RuoYi committed
1 2 3
import { constantRoutes } from '@/router'
import { getRouters } from '@/api/menu'
import Layout from '@/layout/index'
4
import ParentView from '@/components/ParentView';
RuoYi's avatar
RuoYi committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

const permission = {
  state: {
    routes: [],
    addRoutes: []
  },
  mutations: {
    SET_ROUTES: (state, routes) => {
      state.addRoutes = routes
      state.routes = constantRoutes.concat(routes)
    }
  },
  actions: {
    // 生成路由
    GenerateRoutes({ commit }) {
      return new Promise(resolve => {
        // 向后端请求路由数据
        getRouters().then(res => {
          const accessedRoutes = filterAsyncRouter(res.data)
24
          accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
RuoYi's avatar
RuoYi committed
25 26 27 28 29 30 31 32 33 34 35 36
          commit('SET_ROUTES', accessedRoutes)
          resolve(accessedRoutes)
        })
      })
    }
  }
}

// 遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter(asyncRouterMap) {
  return asyncRouterMap.filter(route => {
    if (route.component) {
37
      // Layout ParentView 组件特殊处理
RuoYi's avatar
RuoYi committed
38 39
      if (route.component === 'Layout') {
        route.component = Layout
40 41
      } else if (route.component === 'ParentView') {
        route.component = ParentView
RuoYi's avatar
RuoYi committed
42 43 44 45 46 47 48 49 50 51 52 53
      } else {
        route.component = loadView(route.component)
      }
    }
    if (route.children != null && route.children && route.children.length) {
      route.children = filterAsyncRouter(route.children)
    }
    return true
  })
}

export const loadView = (view) => { // 路由懒加载
54
  return (resolve) =>  require([`@/views/${view}`], resolve)
RuoYi's avatar
RuoYi committed
55 56 57
}

export default permission