blob: 7f638d2e33839100fa5bbce37d3a2b275c21caf6 [file] [log] [blame]
import Vue from 'vue'
import Router from 'vue-router'
// in development-env not use lazy-loading, because lazy-loading too many pages will cause webpack hot update too slow. so only in production use lazy-loading;
// detail: https://panjiachen.github.io/vue-element-admin-site/#/lazy-loading
Vue.use(Router)
/* Layout */
import Layout from '../views/layout/Layout'
import { getMenuList } from '../api/menulist-api'
/**
* hidden: true if `hidden:true` will not show in the sidebar(default is false)
* alwaysShow: true if set true, will always show the root menu, whatever its child routes length
* if not set alwaysShow, only more than one route under the children
* it will becomes nested mode, otherwise not show the root menu
* redirect: noredirect if `redirect:noredirect` will no redirct in the breadcrumb
* name:'router-name' the name is used by <keep-alive> (must set!!!)
* meta : {
title: 'title' the name show in submenu and breadcrumb (recommend set)
icon: 'svg-name' the icon show in the sidebar,
}
**/
// 全局路由
const globalRouter = [
{ path: '/login', component: () => import('@/views/login/index'), hidden: true },
{ path: '/404', component: () => import('@/views/404'), hidden: true }
]
// 主页路由
const mainRouter = {
path: '/',
component: Layout,
redirect: '/dashboard',
hidden: true,
children: [{
path: 'dashboard',
component: () => import('@/views/dashboard/index'),
name: 'Dashboard',
meta: { title: 'Dashboard', icon: 'dashboard', noCache: true }
}]
}
// 菜单路由
const menuRouter = []
const constantRouterMap = globalRouter.concat(mainRouter).concat(menuRouter)
const router = new Router({
// mode: 'history', //后端支持可开
scrollBehavior: () => ({ y: 0 }),
hasLoadedDynamicRoutes: false, // 动态路由已加载
routes: constantRouterMap
})
router.beforeEach((to, from, next) => {
if (router.options.hasLoadedDynamicRoutes) {
next()
} else {
getMenuList().then(response => {
const menuList = initDynamicRouters(response.items)
router.options.routes.push(...menuList)
router.addRoutes(menuList)
router.addRoutes([{ path: '*', redirect: '/404', hidden: true }])
router.options.hasLoadedDynamicRoutes = true
next({ ...to, replace: true })
})
}
})
function getMenuResource(resource) {
let menuresource = resource
if (menuresource && menuresource.startsWith('/views/')) {
menuresource = menuresource.substring(6)
}
return menuresource
}
function getChildren(menus) {
const children = []
for (const menu of menus) {
const menuresource = getMenuResource(menu.resource)
const route = {
path: menu.path,
name: menu.code,
component: () => import('@/views' + menuresource),
meta: menu.meta,
children: menu.children ? getChildren(menu.children) : null
}
children.push(route)
}
return children.length > 0 ? children : null
}
function initDynamicRouters(menus) {
const menuList = []
if (menus && menus.length > 0) {
for (const menu of menus) {
const route = {
path: menu.path,
component: Layout,
// alwaysShow: true,
redirect: menu.path + '/' + ((menu.children && menu.children.length > 0) ? menu.children[0].path : null),
name: menu.code,
meta: menu.meta,
children: menu.children ? getChildren(menu.children) : null
}
menuList.push(route)
}
}
return menuList
}
export default router