You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.5 KiB

import { constantRoutes } from '@/router'
import { permissions } from '@/api/me'
import Layout from '@/layout'
import Nested from '@/layout/nested.vue'
import Wujie from '@/views/wujie'
import SiderbarLayout from '@/layout/SiderbarLayout.vue'
const loadView = (view) => {
return (resolve) => require([`@/views${view}`], resolve)
}
const componentHandle = (path, route) => {
if (/^#+/.test(path) && route.pid === 0 && route.children.length <= 1) {
return Layout
} else if (/^#+/.test(path) && route.pid === 0 && route.children.length > 1) {
return SiderbarLayout
} else if (/^#+/.test(path) && route.pid !== 0) {
return Nested
} else if (/^\/./.test(path)) {
return loadView(path)
} else {
return Wujie
}
}
export function filterAsyncRoutes(routes) {
const res = []
routes.forEach(route => {
if (!route.visible) return
const tmp = {
key: `key-${route.id}`,
path: route.path === '#' ? '' : route.path,
component: componentHandle(route.path, route),
name: route.name,
hidden: !route.visible,
meta: {
id: route.id,
title: route.title,
icon: route.icon,
guard: route.guard_name,
folder: route.folder,
isModule: !/^\/./.test(route.path),
// TODO:修改地址
// moduleUri: /^\/./.test(route.path) ? '' : `https://cz-hjjc.115.langye.net/${route.path}`,
moduleUri: /^\/./.test(route.path) ? '' : `/${route.path}`,
moduleName: /^\/./.test(route.path) ? '' : route.path
}
}
if (route.children && route.children instanceof Array && route.children.length > 0) {
tmp.children = filterAsyncRoutes(route.children)
}
res.push(tmp)
})
return res
}
const state = {
routes: [],
addRoutes: []
}
const mutations = {
SET_ROUTES: (state, routes) => {
state.addRoutes = routes
state.routes = constantRoutes.concat(routes)
},
RESET_ADD_ROUTES: (state) => {
state.addRoutes = []
}
}
const actions = {
generateRoutes({ commit }, roles) {
return new Promise(async(resolve, reject) => {
try {
const routes = await permissions()
const accessedRoutes = filterAsyncRoutes(routes)
// 把404拦截放在最后匹配
accessedRoutes.push({ path: '*', redirect: '/404', hidden: true })
commit('SET_ROUTES', accessedRoutes)
resolve(accessedRoutes)
} catch (err) {
reject(err)
}
})
}
}
export default {
namespaced: true,
state,
mutations,
actions
}