| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- import layoutHeaderAside from '@/layout/header-aside'
- import menuUtil from '@/utils/menu'
- // 由于懒加载页面太多的话会造成webpack热更新太慢,所以开发环境不使用懒加载,只有生产环境使用懒加载
- const _import = require('@/utils/util.import.' + process.env.NODE_ENV)
- const meta = { auth: true }
- /**
- * 动态布局
- */
- function getLayout() {
- return layoutHeaderAside
- }
- /**
- * 错误页面
- */
- const errorPage = {
- path: '*',
- redirect: '/404',
- hidden: true
- }
- const errorUrl = '/system/error/404'
- const idKey = menuUtil.ID_KEY
- const labelKey = menuUtil.LABEL_KEY
- const nameKey = menuUtil.NAME_KEY
- const iconKey = menuUtil.ICON_KEY
- const parentIdKey = menuUtil.PARENT_KEY
- const childrenKey = menuUtil.CHILD_KEY
- const urlKey = menuUtil.URL_KEY
- const layoutKey = 'layout'
- const defaultRouterAlias = '/router-alias/'
- // 异步挂载的路由
- // 动态需要根据权限加载的路由表 该路由表通过后台获取
- export function generateRoutes(menus) {
- const asyncRouterMap = []
- for (const menu of menus) {
- asyncRouterMap.push(generateTopRoute(menu))
- }
- asyncRouterMap.push(errorPage)
- return asyncRouterMap
- }
- /**
- * 构建第一级路由
- * @param {*} menu
- */
- function generateTopRoute(menu) {
- const router = {
- id: menu[idKey],
- parentId: menu[parentIdKey],
- path: '/' + menu[nameKey],
- alias: defaultRouterAlias + menu[nameKey],
- name: menu[nameKey],
- component: getLayout(menu[layoutKey]),
- meta: {
- title: menu[labelKey],
- icon: menu[iconKey] || 'file-o',
- name: menu[nameKey],
- defaultUrl: menu[urlKey],
- ...meta
- }
- }
- if (menu[childrenKey] && menu[childrenKey].length > 0) {
- router.children = generateSubRoutes(menu[childrenKey])
- } else { // 添加顶部默认节点
- router.children = [{
- id: menu[idKey],
- parentId: menu[parentIdKey],
- path: 'index',
- name: menu[nameKey] + 'index',
- alias: defaultRouterAlias + menu[nameKey],
- component: getComputedUrl(menu[urlKey]),
- meta: {
- title: menu[labelKey],
- icon: menu[iconKey] || 'file-o',
- name: menu[nameKey],
- defaultUrl: menu[urlKey],
- ...meta
- }
- }]
- }
- return router
- }
- /**
- * 构建子路由
- * @param {*} menus
- */
- function generateSubRoutes(menus) {
- const pool = []
- const push = function(menus, namePrefix = []) {
- menus.forEach(menu => {
- const router = {
- id: menu[idKey],
- parentId: menu[parentIdKey],
- path: [...namePrefix, menu[nameKey]].join('/'),
- name: [...namePrefix, menu[nameKey]].join('-'),
- alias: defaultRouterAlias + menu[nameKey],
- component: getComputedUrl(menu[urlKey]),
- meta: {
- title: menu[labelKey],
- icon: menu[iconKey] || 'file-o',
- name: menu[nameKey],
- defaultUrl: menu[urlKey],
- ...meta
- }
- }
- if (menu[childrenKey] && menu[childrenKey].length > 0) {
- push(menu[childrenKey], [...namePrefix, menu[nameKey]])
- } else {
- pool.push({
- ...router
- })
- }
- })
- }
- push(menus)
- return pool
- }
- /**
- * 是否是iframe
- * @param {*} url
- */
- function isHttp(url) {
- if (url === null || url === undefined || url === '') return false
- return !!(url.indexOf('http') !== -1 || url.indexOf('https') !== -1)
- }
- /**
- * 获取 组件url
- * @param {*} menu
- */
- function getComputedUrl(url) {
- if (!url) return _import(errorUrl)
- try {
- if (isHttp(url)) {
- return _import('/system/iframe/index')
- } else if (url.indexOf('/d/') > -1) { // 数据模版
- return _import('/platform/data/dataTemplate/template-list')
- } else {
- return _import(convertUrl(url)) || _import(errorUrl)
- }
- } catch (error) {
- // console.warn(error)
- return _import(errorUrl)
- }
- }
- /**
- * 转换url 避免多余‘/’
- * @param {*} url
- */
- function convertUrl(url) {
- const newUrl = '/' + url
- return newUrl === '/' ? '/' : newUrl.replace(/\/\//g, '/').replace(/\/$/, '')
- }
|