使用了花裤衩
大佬的vue-admin-template
做后台权限管理生成动态路由时,经过addRoutes后,页面侧边栏没有渲染出我添加的路由组件。
查阅了一些资料后,都说addRoutes不会添加到router的$options的routes里面,但是大佬的手摸手系列我看着是这么写的额,然后又看了看大佬的sidebar里面的路由数据来源,也是 $router.$options.routes额,那这个数据是如何渲染上去的呢,自己懵逼了,所以上来问问大家~
下面是我的代码
需要异步添加的路由表
// router.js
export const asyncRoutes = [
{
path: '/excel',
component: Layout,
redirect: '/excel/export-excel',
name: 'excel',
meta: {
title: 'excel',
icon: 'excel'
},
children: [
{ path: 'export-excel', component: () => import('@/views/excel/exportExcel/index'), name: 'exportExcel', meta: { title: 'exportExcel', role: ['editor'] }},
{ path: 'upload-excel', component: () => import('@/views/excel/uploadExcel/index'), name: 'uploadExcel', meta: { title: 'uploadExcel', role: ['admin'] }}
]
},
{ path: '*', redirect: '/404', hidden: true }
]
然后是获取到动态路由之后将添加动态路由的 permissions.js
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
const info = await store.dispatch('user/getInfo')
// 在这里存储roles,然后进到store中进行权限校验
const { roles } = info
store.dispatch('user/GenerateRoutes', roles).then(res => {
// console.log(res)
router.addRoutes(store.getters.addRouters)
console.log(store.getters.addRouters)//这里可以打印出路由
next({ ...to, replace: true })
}).catch(err => {
console.log(err)
})
} 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()
}
}
})
希望各位大神能救救孩子~
额,其实是我把 404 的路由写到前面去了...