vue-router+vuex addRoutes实现路由动态加载及菜单动态
Vue-Router与Vuex联手实现动态路由加载及菜单权限控制
在这个案例中,我们将如何在Vue实例运行时动态加载路由以及菜单权限控制。对于后台管理系统而言,这是一个至关重要的功能,因为它涉及到粗粒度的权限控制。在没有登录的情况下,我们无法确定用户的角色和权限,但登录路由又必须加载。如何解决这个问题呢?
我们的解决思路是结合vue-router和vuex。在Vue实例初始化时,我们加载了基础的路由规则,如login和404页面。在登录成功后,我们通过vuex获取用户的角色权限,然后动态生成对应的菜单权限路由规则。
在这个过程中,我们遇到了几个挑战。如何在未登录的情况下确定路由权限?如何保证路由规则和菜单的同步?
经过研究,我们发现vue-router的addRoutes方法为我们提供了解决方案。这个方法允许我们在客户端动态添加新的路由规则,特别适合服务端渲染的路由。通过这个方法,我们可以在登录成功后,根据用户的角色权限从服务端获取新的路由规则,并使用addRoutes方法将它们添加到已有的路由中。
这样,我们就可以实现路由和菜单的动态加载及权限控制。在全局路由钩子中,我们还需要进行路由拦截,以确保只有拥有相应权限的用户才能访问特定的路由。这样一来,即使用户在浏览器地址栏手动输入路由,如果没有相应的权限,也无法访问。
这个解决方案不仅简化了代码,还提高了系统的安全性和灵活性。我们可以根据用户的需求动态生成不同的菜单和路由规则,而无需手动修改代码。这对于快速开发和管理大型后台系统来说是非常有用的。
app.js
```javascript
let permission = JSON.parse(window.sessionStorage.getItem('permission'))
if (permission) {
storemit(ADD_MENU, permission) // 使用commit提交mutation来改变状态
router.addRoutes(store.state.menu.items) // 动态添加路由
}
router.beforeEach((route, redirect, next) => {
// 其他逻辑...
if (route.path === '/login') {
// 移除存储中的用户和数据权限
window.sessionStorage.removeItem('user')
window.sessionStorage.removeItem('permission')
storemit(ADD_MENU, []) // 重置菜单项
} else if (!user && route.path !== '/login') {
next({ path: '/login' }) // 未登录重定向到登录页
} else {
next() // 跳转到目标路由
}
})
```
登录组件 login.vue
```vue
import NProgress from 'nprogress' // 进度条组件
import { mapActions, mapGetters } from 'vuex' // 引入vuex的mapActions和mapGetters
export default {
data() {
return {
// 表单数据和其他状态...
}
},
computed: {
...mapGetters(['menuitems', 'isLoadRoutes']) // 使用mapGetters获取vuex中的getter
},
methods: {
...mapActions(['addMenu', 'loadRoutes']), // 使用mapActions调用vuex中的actions
handleSubmit(ev) {
// 表单提交逻辑...
// 登录成功后,将用户和数据权限存入sessionStorage,并更新菜单项和加载路由
const loginParams = { / 登录参数 / }
this.$http.post('/api/login', loginParams).then(response => {
// 处理响应,存储数据并更新菜单和路由...
})
}
}
}
```
关键点解释:
1. Vuex 状态管理:使用 Vuex 进行状态管理,通过 `mapGetters` 和 `mapActions` 来简化在组件中访问 Vuex 中的 getter 和 action。
2. 动态路由添加:通过 `router.addRoutes` 动态添加路由,使得可以根据用户的权限来动态渲染不同的菜单和页面。
3. sessionStorage 数据存储:使用 `sessionStorage` 来存储登录后的用户和数据权限,以便在刷新页面时恢复状态。在路由守卫中进行判断,如果登录状态失效则重定向到登录页。
4. mutations 和 actions:在 Vuex 中,mutations 用于更改状态,actions 用于提交 mutations 并处理异步操作(如登录请求)。
5. 路由配置:在 `router.js` 中配置路由,包括登录路由和其他基础路由。通过 `generateRoutesFromMenu` 函数根据菜单数据动态生成路由配置。
6. 登录流程:在登录组件中,处理登录请求,成功后将用户和数据权限存入 `sessionStorage`,并通过调用 Vuex 中的 actions 来更新菜单和加载路由。然后重定向到用户的主页或其他目标页面。通过路由守卫来确保未登录的用户不能访问需要权限的页面。如果未登录且访问了除登录页外的其他页面,则重定向到登录页。已经登录的用户则可以正常访问目标页面。在浩瀚的知识海洋中,我们犹如勇敢的航海家,不断、不断前行。而今天,我想和大家分享一些心得体会,希望能对大家的学习之旅有所启发。也希望大家能够支持狼蚁SEO,一起进步,共同成长。
在这个充满挑战与机遇的时代,学习已经成为了我们生活中不可或缺的一部分。不论是对于新知识的好奇,还是对于自我提升的追求,我们都在不断地学习着。在这个过程中,我们可能会遇到许多困难和挫折,但是只要我们坚持不懈,勇往直前,就一定能够收获成功。
狼蚁SEO作为一个专业的搜索引擎优化平台,一直致力于为大家提供最好的学习资源和最优质的服务。我们深知学习的重要性,因此我们不断地努力着,希望能够为大家带来更多的帮助和启示。
在我们的之旅中,我们不断地发现新的知识和技术,不断地学习和成长。我们也希望通过我们的努力,能够帮助更多的人实现他们的梦想和追求。我们相信,只要我们齐心协力,共同进步,就一定能够在学习的道路上取得更大的成就。
我们也深知学习的路上并不是一帆风顺的。我们需要不断地适应新的环境,掌握新的技能,学习新的知识。但是只要我们保持积极的心态,勇于面对挑战,就一定能够克服困难,实现我们的目标。
我希望大家能够多多支持狼蚁SEO,和我们一起学习、一起成长。我们也会继续不断地努力,为大家提供更好的学习资源和更优质的服务。让我们一起携手前行,共同知识的海洋,实现我们的梦想和追求。
我想再次感谢大家一直以来对狼蚁SEO的支持和信任。我们会一如既往地努力,为大家带来更好的服务和更多的帮助。让我们一起学习、一起进步,共同创造一个更加美好的未来。
微信营销
- vue-router+vuex addRoutes实现路由动态加载及菜单动态
- asp.net发邮件的几种方法汇总
- Yii Framework框架开发微信公众平台示例
- PhpSpreadsheet设置单元格常用操作汇总
- ASP.NET Core 导入导出Excel xlsx 文件实例
- Zend Framework创建自己的动作助手详解
- 用jQuery.ajaxSetup实现对请求和响应数据的过滤
- php分页函数完整实例代码
- Ubuntu手动安装mysql5.7.10
- 如何控制SQLServer中的跟踪标记
- pushState、replaceState、onpopstate 实现Ajax页面的前进
- Angularjs上传图片实例详解
- thinkPHP5框架中widget的功能与用法详解
- asp.net基于替换模版页的形式生成静态页的方法
- javascript实现在指定元素中垂直水平居中
- thinkPHP利用ajax异步上传图片并显示、删除的示例