前言
最近一直在忙着一个用vue来做的权限管理的项目,其实在此之前,我也研究过vue的权限如何实现,并且也为之写过一篇博客,但当真正应用在项目中的时候,还是发现了许多问题,所以此篇也会就着我在项目中遇到的一些问题,拿出来和大家分享一下,当然示例代码还是我的github仓库中的ant-design-vue-ms (本地下载)。
权限问题解决思路
对于一个前后端分离的项目而言,权限不再是仅仅靠后端来控制,后端只能控制接口的权限,前台的页面显示还是需要我们来控制,针对vue的项目,首先我想的是当权限不多,并且都是单个权限的情况下,我们完全没有必要使用vue中提供的addRoutes的方法,可
Vue权限管理是一个重要的议题,尤其在前后端分离的项目中,前端需要负责处理页面的展示权限,而不仅仅是依赖后端接口的控制。本文主要探讨了在Vue项目中解决权限问题的策略,包括动态组件和动态路由的使用。
对于权限不多且单一的场景,动态组件是一个简单有效的解决方案。Vue的`<component :is="currentComponent"/>`可以用来根据后端返回的角色信息动态加载不同的组件,避免了使用Vuex和复杂的路由配置。然而,这种方案在面对复杂权限(如混合角色)时,其局限性就显现出来了。例如,若角色间存在共享页面,需要根据不同角色跳转至页面的不同部分,此时大量的判断逻辑会让代码变得冗余和难以维护。
因此,作者提出了使用`addRoutes`方法来动态添加路由,作为更完善的解决方案。动态路由的优势在于,一旦配置完成,无论后续添加多少权限,都可以自动适应,无需修改现有代码,只需增加对应角色的模块。对于混合角色,可以通过自定义指令来决定显示哪些模块,避免了因角色多而导致的大量判断逻辑。
具体实施步骤如下:
1. 配置全局导航守卫。这一步主要用于在页面刷新时恢复角色信息,避免Vuex状态丢失。通过导航守卫,在每次刷新时重新请求后台接口获取角色数据,然后动态生成并添加路由。
```javascript
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(() => router.addRoutes(store.getters.addRouters));
})
.catch(() => {
store.dispatch('Logout').then(() => {
next({ path: '/user/login', query: { redirect: to.fullPath } });
});
});
} else {
next();
}
```
2. 在Vuex的action中编写`GenerateRoutes`方法,该方法会对所有路由进行遍历和过滤,只保留当前角色有权访问的路由,然后将这些动态路由与静态路由合并,通过`router.addRoutes`添加到路由表中。
```javascript
const permissionRoute = routes.filter(route => {
// 过滤条件,例如检查route.meta.roles是否包含当前角色
return route.meta && route.meta.roles.includes(role);
});
// 将动态路由添加到静态路由的前面
const newRoutes = staticRoutes.concat(permissionRoute);
```
这样的设计既解决了角色权限的灵活性问题,也保证了页面路由的正确跳转,使得权限管理更加高效和可控。同时,通过全局导航守卫,确保了用户登录状态的持久化,即使页面刷新,也能快速恢复权限信息。
总结来说,Vue项目的权限管理可以通过动态组件和动态路由结合的方式来实现,特别是在处理复杂角色和权限混合的情况时,动态路由的解决方案更具优势。不过,每个项目都有其特定需求,选择哪种方案应根据实际情况来确定,以达到最佳效果。