1.router/index.js 保留基本路由
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
/* Layout */
import Layout from '@/layout'
export const constantRoutes = [
{
path: '/login',
component: () => import('@/views/login/index'),
hidden: true
},
{
path: '/404',
component: () => import('@/views/404'),
hidden: true
},
{
path: '/',
component: Layout,
redirect: '/',
name: 'Home',
hidden: true,
children: [
{
path: '/',
name: 'Home',
component: () => import('@/views/home/index'),
meta: { title: '首页' },
},
{
path: 'info',
name: 'info',
component: () => import('@/views/home/info'),
meta: { title: '个人信息' },
},
{
path: 'resivepsd',
name: 'resivepsd',
component: () => import('@/views/home/resivepsd'),
meta: { title: '修改密码' },
},
]
},
]
const createRouter = () => new Router({
// mode: 'history', // require service support
scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes
})
const router = createRouter()
export function resetRouter() {
const newRouter = createRouter()
router.matcher = newRouter.matcher // reset router
}
export default router
2.获取用户菜单(从后台请求来的数据),请求来的数据格式如dataaa这种json数组类型,通过addRoutes动态添加路由
getMenu({ commit, state }) {
return new Promise((resolve, reject) => {
getMenu(state.token).then(response => {
console.log(response)
const { data } = response
// console.log(data)
var dataaa =[
{
"path": "/users",
"component": "Layout",
"title": "首页2",
"name":'usr',
"children": [
{
"path": "Form",
"component": "/usermanage/RolesManage",
"title": "表单1",
"name":'RolesManage',
"children":[],
},
{
"path": "dashboard",
"component": "/usermanage/UserManage",
"title": "首页1",
"children":[],
"name":'UserManage',
},
]
},
{
"path": "/users",
"component": "Layout",
"title": "首页2",
"name":'usr',
"children": [
{
"path": "Form",
"component": "/usermanage/RolesManage",
"title": "表单1",
"name":'RolesManage',
"children":[],
},
]
}]
const routers = filterAsyncRouter(dataaa)
console.log(routers)
router.addRoutes(routers)
// console.log(router)
var ggg = router.options.routes.concat(routers)
// console.log(ggg)
router.options.routes = ggg
router.options.routes.push(
{ path: '*', redirect: '/404', hidden: true },
)
if (!data) {
Message({
message: response.message,
type: 'error',
duration: 5 * 1000
})
}
commit('SET_MENULIST', data)
resolve(data)
}).catch(error => {
reject(error)
})
})
},
3.遍历后台传来的路由字符串,转换为组件对象,import导出不接受变量,所以要用字符串拼接的形式
// 遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter(asyncRouterMap) {
const accessedRouters = asyncRouterMap.filter(route => {
if (route.component) {
route.meta = {title: route.title}
if (route.component === 'Layout') {
route.component = Layout
} else {
var aa = route.component // 先输出再在导入里使用
route.component = () => import(`@/views${aa}`)
}
}
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children)
}
return true
})
return accessedRouters
}
4.核心在src目录下的permission.js中,路由注册时候加上 next({ …to, replace: true }) // hack方法 确保addRoutes已完成 ,否则刷新会出现空白。
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
// const _import = require('./router/_import_' + process.env.NODE_ENV) // 获取组件的方法
NProgress.configure({ showSpinner: false }) // NProgress Configuration
const whiteList = ['/login'] // no redirect whitelist
router.beforeEach(async(to, from, next) => {
// start progress bar
NProgress.start()
// set page title
document.title = getPageTitle(to.meta.title)
// determine whether the user has logged in
const hasToken = getToken()
if (hasToken) {
if (to.path === '/login') {
// if is logged in, redirect to the home page
next({ path: '/' })
NProgress.done()
} else {
const hasGetUserInfo = store.getters.name
if (hasGetUserInfo) {
next()
} else {
try {
// get user info
await store.dispatch('user/getInfo')
// get user menu
await store.dispatch('user/getMenu')
next({
...to,
replace: true
}) // hack方法 确保addRoutes已完成 ,set the replace
// next()
} catch (error) {
// remove token and go to login page to re-login
await store.dispatch('user/resetToken')
Message.error(error || 'Has Error')
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
}
} else {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly
next()
} else {
// other pages that do not have permission to access are redirected to the login page.
next(`/login?redirect=${to.path}`)
NProgress.done()
}
}
})
router.afterEach(() => {
// finish progress bar
NProgress.done()
})