59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| import { constantRoutes } from '@/router'
 | ||
| import { getRouters } from '@/api/menu'
 | ||
| import Layout from '@/layout/index'
 | ||
| 
 | ||
| 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)
 | ||
|           accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
 | ||
|           commit('SET_ROUTES', accessedRoutes)
 | ||
|           resolve(accessedRoutes)
 | ||
|         })
 | ||
|       })
 | ||
|     }
 | ||
|   }
 | ||
| }
 | ||
| 
 | ||
| // 遍历后台传来的路由字符串,转换为组件对象
 | ||
| function filterAsyncRouter(asyncRouterMap) {
 | ||
|   return asyncRouterMap.filter(route => {
 | ||
|     if(!route.path){
 | ||
|       // 防止空路由出现的警告,设置默认path
 | ||
|       route.path = '/path';
 | ||
|     }
 | ||
|     if (route.component) {
 | ||
|       // Layout组件特殊处理
 | ||
|       if (route.component === 'Layout') {
 | ||
|         route.component = Layout
 | ||
|       } 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) => { // 路由懒加载
 | ||
|   return (resolve) =>  require([`@/views/${view}`], resolve)
 | ||
| }
 | ||
| 
 | ||
| export default permission
 |