mirror of
https://github.com/fantastic-admin/basic.git
synced 2026-10-07 13:48:38 +08:00
208 lines
6.1 KiB
JavaScript
208 lines
6.1 KiB
JavaScript
import Vue from 'vue'
|
|
import Router from 'vue-router'
|
|
import store from '@/store/index'
|
|
import NProgress from 'nprogress'
|
|
import 'nprogress/nprogress.css' // progress bar style
|
|
|
|
Vue.use(Router)
|
|
|
|
import Layout from '@/layout'
|
|
import EmptyLayout from '@/layout/empty'
|
|
|
|
const constantRoutes = [
|
|
{
|
|
path: '/login',
|
|
name: 'login',
|
|
component: () => import('@/views/login'),
|
|
meta: {
|
|
title: '登录'
|
|
}
|
|
},
|
|
{
|
|
path: '/',
|
|
component: Layout,
|
|
redirect: '/dashboard',
|
|
children: [
|
|
{
|
|
path: 'dashboard',
|
|
name: 'dashboard',
|
|
component: () => import('@/views/index'),
|
|
meta: {
|
|
title: store.state.settings.dashboardTitle
|
|
}
|
|
},
|
|
{
|
|
path: 'personal',
|
|
component: EmptyLayout,
|
|
redirect: '/personal/setting',
|
|
meta: {
|
|
title: '个人中心',
|
|
breadcrumb: false
|
|
},
|
|
children: [
|
|
{
|
|
path: 'setting',
|
|
name: 'personalSetting',
|
|
component: () => import('@/views/personal/setting'),
|
|
meta: {
|
|
title: '个人设置'
|
|
}
|
|
},
|
|
{
|
|
path: 'edit/password',
|
|
name: 'personalEditPassword',
|
|
component: () => import('@/views/personal/edit.password'),
|
|
meta: {
|
|
title: '修改密码'
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
path: 'reload',
|
|
name: 'reload',
|
|
component: () => import('@/views/reload')
|
|
}
|
|
]
|
|
}
|
|
]
|
|
|
|
import MultilevelMenuExample from './modules/multilevel.menu.example'
|
|
import BreadcrumbExample from './modules/breadcrumb.example'
|
|
import KeepAliveExample from './modules/keep.alive.example'
|
|
import ComponentExample from './modules/component.example'
|
|
import PermissionExample from './modules/permission.example'
|
|
import MockExample from './modules/mock.example'
|
|
import VideosExample from './modules/videos.example'
|
|
import ExTernalLinkExample from './modules/external.link.example'
|
|
|
|
// 当 children 不为空的主导航只有一项时,则隐藏
|
|
let asyncRoutes = [
|
|
{
|
|
meta: {
|
|
title: '默认',
|
|
icon: 'sidebar-default'
|
|
},
|
|
children: [
|
|
MultilevelMenuExample,
|
|
BreadcrumbExample,
|
|
KeepAliveExample,
|
|
ComponentExample,
|
|
PermissionExample,
|
|
MockExample
|
|
]
|
|
},
|
|
{
|
|
meta: {
|
|
title: '教程',
|
|
icon: 'sidebar-videos'
|
|
},
|
|
children: [
|
|
...VideosExample
|
|
]
|
|
},
|
|
{
|
|
meta: {
|
|
title: '其它',
|
|
icon: 'sidebar-other'
|
|
},
|
|
children: [
|
|
ExTernalLinkExample
|
|
]
|
|
}
|
|
]
|
|
|
|
const lastRoute = [{
|
|
path: '*',
|
|
component: () => import('@/views/404'),
|
|
meta: {
|
|
title: '404',
|
|
sidebar: false
|
|
}
|
|
}]
|
|
|
|
const router = new Router({
|
|
routes: constantRoutes
|
|
})
|
|
|
|
// 解决路由在 push/replace 了相同地址报错的问题
|
|
const originalPush = Router.prototype.push
|
|
Router.prototype.push = function push(location) {
|
|
return originalPush.call(this, location).catch(err => err)
|
|
}
|
|
const originalReplace = Router.prototype.replace
|
|
Router.prototype.replace = function replace(location) {
|
|
return originalReplace.call(this, location).catch(err => err)
|
|
}
|
|
|
|
router.beforeEach(async(to, from, next) => {
|
|
store.state.settings.enableProgress && NProgress.start()
|
|
// 已经登录,但还没根据权限动态挂载路由
|
|
if (store.getters['user/isLogin'] && !store.state.menu.isGenerate) {
|
|
/**
|
|
* 重置 matcher
|
|
* https://blog.csdn.net/baidu_28647571/article/details/101711682
|
|
*/
|
|
router.matcher = new Router({
|
|
routes: constantRoutes
|
|
}).matcher
|
|
const accessRoutes = await store.dispatch('menu/generateRoutes', {
|
|
asyncRoutes,
|
|
currentPath: to.path
|
|
})
|
|
router.addRoutes(accessRoutes)
|
|
router.addRoutes(lastRoute)
|
|
next({ ...to, replace: true })
|
|
}
|
|
if (store.state.menu.isGenerate) {
|
|
store.commit('menu/setHeaderActived', to.path)
|
|
}
|
|
to.meta.title && store.commit('settings/setTitle', to.meta.title)
|
|
if (store.getters['user/isLogin']) {
|
|
if (to.name) {
|
|
if (to.matched.length !== 0) {
|
|
// 如果已登录状态下,进入登录页会强制跳转到控制台页面
|
|
if (to.name == 'login') {
|
|
next({
|
|
name: 'dashboard',
|
|
replace: true
|
|
})
|
|
} else if (!store.state.settings.enableDashboard && to.name == 'dashboard') {
|
|
// 如果未开启控制台页面,则默认进入侧边栏导航第一个模块
|
|
next({
|
|
name: store.getters['menu/sidebarRoutes'][0].name,
|
|
replace: true
|
|
})
|
|
}
|
|
} else {
|
|
// 如果是通过 name 跳转,并且 name 对应的路由没有权限时,需要做这步处理,手动指向到 404 页面
|
|
next({
|
|
path: '/404'
|
|
})
|
|
}
|
|
}
|
|
} else {
|
|
if (to.name != 'login') {
|
|
next({
|
|
name: 'login',
|
|
query: {
|
|
redirect: to.fullPath
|
|
}
|
|
})
|
|
}
|
|
}
|
|
// 百度统计代码
|
|
if (process.env.VUE_APP_TYPE == 'example') {
|
|
if (window._hmt) {
|
|
window._hmt.push(['_trackPageview', location.pathname + '#' + to.fullPath])
|
|
}
|
|
}
|
|
next()
|
|
})
|
|
|
|
router.afterEach(() => {
|
|
store.state.settings.enableProgress && NProgress.done()
|
|
})
|
|
|
|
export default router
|