133 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
import { constantRoutes } from '@/router'
 | 
						|
import Layout from '@/layout'
 | 
						|
import TrialsLayout from '@/views/trials/trials-layout'
 | 
						|
// 遍历后台传来的路由字符串,转换为组件对象
 | 
						|
function filterAsyncRouter(asyncRouterMap = [], lastRouter = false, type = false) {
 | 
						|
  return asyncRouterMap.filter(route => {
 | 
						|
    delete route.ParentId
 | 
						|
    delete route.MenuId
 | 
						|
    delete route.ApiPath
 | 
						|
    if (route.Redirect) {
 | 
						|
      route.redirect = route.Redirect
 | 
						|
      delete route.Redirect
 | 
						|
    }
 | 
						|
    if (route.IsInTabDisplay) {
 | 
						|
      route.tabHiddn = route.IsInTabDisplay
 | 
						|
      delete route.IsInTabDisplay
 | 
						|
    }
 | 
						|
    if (route.MenuName) {
 | 
						|
      route.name = route.MenuName
 | 
						|
      delete route.MenuName
 | 
						|
    }
 | 
						|
    if (route.IsDisplay) {
 | 
						|
      route.hidden = route.IsDisplay
 | 
						|
      delete route.IsDisplay
 | 
						|
    }
 | 
						|
    if (route.Path) {
 | 
						|
      route.path = route.Path
 | 
						|
      if (route.IsExternalLink && ~route.Path.indexOf('http')) {
 | 
						|
        route.path = route.Path
 | 
						|
      } else if (route.IsExternalLink) {
 | 
						|
        route.path = `${window.location.protocol}//${window.location.host}${route.Path}`
 | 
						|
      } else {
 | 
						|
        route.path = route.Path
 | 
						|
      }
 | 
						|
      delete route.Path
 | 
						|
    }
 | 
						|
    route.meta = { icon: route.MenuIcon }
 | 
						|
    if (route.Meta) {
 | 
						|
      // eslint-disable-next-line
 | 
						|
      route.meta = eval('(' + route.Meta + ')')
 | 
						|
      route.meta.icon = route.MenuIcon
 | 
						|
      delete route.Meta
 | 
						|
    }
 | 
						|
    delete route.MenuIcon
 | 
						|
    if (type && route.Children) {
 | 
						|
      route.children = filterChildren(route.Children)
 | 
						|
    }
 | 
						|
    // Layout ParentView 组件特殊处理
 | 
						|
    if (route.Component === '') {
 | 
						|
      if (route.name === 'Trials') {
 | 
						|
        route.component = TrialsLayout
 | 
						|
      } else {
 | 
						|
        route.component = Layout
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      route.component = loadView(route.Component)
 | 
						|
    }
 | 
						|
    delete route.Component
 | 
						|
    if (route.Children != null && route.Children && route.Children.length) {
 | 
						|
      route.children = filterAsyncRouter(route.Children, route, type)
 | 
						|
      delete route['Children']
 | 
						|
    } else {
 | 
						|
      delete route['Children']
 | 
						|
      delete route['redirect']
 | 
						|
    }
 | 
						|
    return true
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
function filterChildren(childrenMap, lastRouter = false) {
 | 
						|
  var children = []
 | 
						|
  childrenMap.forEach((el, index) => {
 | 
						|
    if (el.children && el.children.length) {
 | 
						|
      if (el.component === 'ParentView' && !lastRouter) {
 | 
						|
        el.children.forEach(c => {
 | 
						|
          c.path = el.path + '/' + c.path
 | 
						|
          if (c.children && c.children.length) {
 | 
						|
            children = children.concat(filterChildren(c.children, c))
 | 
						|
            return
 | 
						|
          }
 | 
						|
          children.push(c)
 | 
						|
        })
 | 
						|
        return
 | 
						|
      }
 | 
						|
    }
 | 
						|
    if (lastRouter) {
 | 
						|
      el.path = lastRouter.path + '/' + el.path
 | 
						|
    }
 | 
						|
    children = children.concat(el)
 | 
						|
  })
 | 
						|
  return children
 | 
						|
}
 | 
						|
 | 
						|
export const loadView = (view) => {
 | 
						|
  if (process.env.NODE_ENV === 'development') {
 | 
						|
    return (resolve) => require([`@/${view}.vue`], resolve)
 | 
						|
  } else {
 | 
						|
    // 使用 import 实现生产环境的路由懒加载
 | 
						|
    return () => import(`@/${view}`)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const state = {
 | 
						|
  routes: [],
 | 
						|
  addRoutes: []
 | 
						|
}
 | 
						|
 | 
						|
const mutations = {
 | 
						|
  SET_ROUTES: (state, routes) => {
 | 
						|
    state.addRoutes = routes
 | 
						|
    state.routes = constantRoutes.concat(routes)
 | 
						|
    // zzSessionStorage.setItem('Menus', JSON.stringify(state.routes))
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
const actions = {
 | 
						|
  generateRoutes({ commit }) {
 | 
						|
    return new Promise(resolve => {
 | 
						|
      var newTree = JSON.parse(zzSessionStorage.getItem('newTree'))
 | 
						|
      const sidebarRoutes = filterAsyncRouter(newTree || [])
 | 
						|
      commit('SET_ROUTES', sidebarRoutes)
 | 
						|
      resolve(sidebarRoutes)
 | 
						|
    })
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
export default {
 | 
						|
  namespaced: true,
 | 
						|
  state,
 | 
						|
  mutations,
 | 
						|
  actions
 | 
						|
}
 |