2019-05-08 14:19:58 2173浏览
今天千锋扣丁学堂HTML5培训老师给大家分享一篇关于vue权限问题的解决方案,首先最近HTML5线下班在忙着一个用vue来做的权限管理的项目,其实在此之前,我也研究过vue的权限如何实现,并且也为之写过一篇博客,但当真正应用在项目中的时候,还是发现了许多问题,所以此篇也会就着我在项目中遇到的一些问题,拿出来和大家分享一下,当然示例代码还是我的github仓库中的ant-design-vue-ms(本地下载)。<component :is="currentComponent"/>
if (store.getters.roles.length === 0) { store .dispatch('GetInfo') .then(res => { const roles = res.data.resultData && res.data.resultData.roles store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表 // 动态添加可访问路由表 router.addRoutes(store.getters.addRouters) }) }) .catch(() => { store.dispatch('Logout').then(() => { next({ path: '/user/login', query: { redirect: to.fullPath } }) }) }) } else { next() }
const permission = { state: { routers: constRouterMap, addRouters: [] }, mutations: { SET_ROUTERS: (state, routers) => { state.addRouters = routers state.routers = constRouterMap.concat(routers) } }, actions: { GenerateRoutes({ commit }, data) { //略 } } }
export const constRouterMap = [ { path: '/', redirect: '/index', component: BasicLayout, children: [ { path: '/index', name: 'index', // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '@/views/About.vue'), meta: { title: '仪表盘' } }, { path: '/home', name: 'home', component: () => import(/* webpackChunkName: "home" */ '@/views/Home.vue'), meta: { title: '表单页' } }, { path: '/pattern', name: 'pattern', component: () => import(/* webpackChunkName: "pattern" */ '@/views/DesignPattern.vue') }, { path: '/map', name: 'map', component: () => import(/* webpackChunkName: "map" */ '@/views/DataMap.vue'), meta: { title: '地图组件' } }, ] }, { path: '/user', redirect: '/login', component: UserLayout, children: [ { path: '/login', name: 'login', component: () => import(/* webpackChunkName: "login" */ '@/views/user/Login.vue') }, { path: '/register', name: 'register', component: () => import(/* webpackChunkName: "login" */ '@/views/user/Register.vue') } ] }, //需要注意这里,404的路由一定要写在静态路由中 { path: '/404', component: () => import(/* webpackChunkName: "not_found" */ '@/views/NotFound.vue') } ] export const asyncRouterMap = [ { path: '/', redirect: '/index', component: BasicLayout, children: [ { path: '/controls', name: 'controls', component: () => import(/* webpackChunkName: "controls" */ '@/views/Controls.vue'), meta: { title: '权限设置', permission: ['admin'] } } ] }, //捕获未定义的路由配置 { path: '*', redirect: '/404', hidden: true } ]
上面关于404页面的定义顺序非常重要,如果在静态路由中定义了捕获的路由path:"*",而在动态路由中定义了404路由的话,则当导航钩子中判断比较复杂的话,会出现一些意想不到的错误,我就是当时写反了顺序,并且还在导航钩子中做了一些复杂的面包屑的判断,一旦刷新页面的话,则会出现以下错误
window.location.reload(); this.$router.push({name: 'login'});
想要了解更多关于HTML5开发方面内容的小伙伴,请关注扣丁学堂HTML5培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的HTML5讲师为您指导,此外扣丁学堂老师精心推出的HTML5视频教程定能让你快速掌握HTML5从入门到精通开发实战技能。扣丁学堂H5技术交流群:673883249。
【关注微信公众号获取更多学习资料】 【扫码进入HTML5前端开发VIP免费公开课】