vue-admin-template 权限篇
- https://juejin.cn/post/6844903478880370701
- https://blog.csdn.net/qq_36050563/article/details/112990775
- 不同权限对应不同的路由
- 侧边栏也需要根据不同的权限,异步生成
- 用户名和密码校验是否正确
- 正确返回token,存储到cookie(记住用户登录状态)
- 带着token向后端发请求,获取用户信息userInfo
- userInfo包含'用户权限'信息
- 即通过token获取到role,再根据role算出其对应有权限的路由
最后通过router.addRoutes动态挂载这些路由
- 上述所有的数据和操作都是通过vuex全局管理控制的(补充说明:刷新页面后 vuex的内容也会丢失,所以需要重复上述的那些操作)
- 创建vue实例的时候挂载vue-router(挂载一些不用权限的公用的页面,比如登录页,后台首页)
- 当用户登录后,通过请求userInfo获取role,将role和路由表每个页面的需要的权限作比较,生成最终用户可访问的路由表
- 调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由
- 使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件
import Vue from 'vue';
import Router from 'vue-router';
import Login from '../views/login/';
const dashboard = resolve => require(['../views/dashboard/index'], resolve);
](https:
export const constantRouterMap = [
{ path: '/login', component: Login },
{
path: '/',
component: Layout,
redirect: '/dashboard',
name: '首页',
children: [{ path: 'dashboard', component: dashboard }]
},
]
export default new Router({
routes: constantRouterMap
});
export const asyncRouterMap = [
{
path: '/permission',
component: Layout,
name: '权限测试',
meta: { role: ['admin','super_editor'] },
children: [
{
path: 'index',
component: Permission,
name: '权限测试页',
meta: { role: ['admin','super_editor'] }
}]
},
{ path: '*', redirect: '/404', hidden: true }
];
- 注意事项: meta标签,用来标识有哪些权限可以访问该页面,如meta: { role: ['admin','super_editor'] }表示该页面只有admin和超级编辑才能有资格进入
- 因此,只要获取到后端的role列表,对比一下,该用户的权限就出来了,再匹配一下路由,从而生成最终的权限范围页面
router.beforeEach((to, from, next) => {
if (store.getters.token) {
if (to.path === '/login') {
next({ path: '/' });
} else {
if (store.getters.roles.length === 0) {
store.dispatch('GetInfo').then(res => {
const roles = res.data.role;
store.dispatch('GenerateRoutes', { roles }).then(() => {
router.addRoutes(store.getters.addRouters)
next({ ...to, replace: true })
})
}).catch(err => {
console.log(err);
});
} else {
next()
}
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next();
} else {
next('/login');
}
}
});
import { asyncRouterMap, constantRouterMap } from 'src/router';
function hasPermission(roles, route) {
if (route.meta && route.meta.role) {
return roles.some(role => route.meta.role.indexOf(role) >= 0)
} else {
return true
}
}
const permission = {
state: {
routers: constantRouterMap,
addRouters: []
},
mutations: {
SET_ROUTERS: (state, routers) => {
state.addRouters = routers;
state.routers = constantRouterMap.concat(routers);
}
},
actions: {
GenerateRoutes({ commit }, data) {
return new Promise(resolve => {
const { roles } = data;
const accessedRouters = asyncRouterMap.filter(v => {
if (roles.indexOf('admin') >= 0) return true;
if (hasPermission(roles, v)) {
if (v.children && v.children.length > 0) {
v.children = v.children.filter(child => {
if (hasPermission(roles, child)) {
return child
}
return false;
});
return v
} else {
return v
}
}
return false;
});
commit('SET_ROUTERS', accessedRouters);
resolve();
})
}
}
};
export default permission;
- main.js 引入 router.js 和 permission.js
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY