赞
踩
很多时候我们在项目的路由都是在前端配置好的,但是有的时候为了进行全面的权限控制,会需要后台给出路由表,前端再渲染。不用在前端配置。
vue项目实现动态路由的方式大体可分为两种:
1.前端这边把路由写好,登录的时候根据用户的角色权限来动态展示路由,(前端控制路由)
2.后台传来当前用户对应权限的路由表,前端通过调接口拿到后处理(后端处理路由)
大体步骤:拦截路由->后台取到路由->保存路由到localStorage(用户登录进来只会从后台取一次,其余都从本地取,所以用户,只有退出在登录路由才会更新)
先设置路由规则:
const roles1 = [ { path: '/home', name: 'Home', component: 'Home', }, { path: '/about', name: 'About', component: 'About', }, ]; const roles2 = [ { path: '/home1', name: 'Home1', component: 'Home1', }, { path: '/about1', name: 'About1', component: 'About1', }, ];
后端返回数据:
app.post('/login', (req, res) => { // 一般在项目里面是判断角色,角色是分配权限的,一般一个项目里面只有几个角色,不同角色能看到的路由页面也不一样 // 比如 校长(50) + 教学总监(40) + 导师(30) + 班主任(20) + 学生(10) if (req.body.roler === 'xiaozhang') { res.send({ msg: '登录成功', token: 'Bearea sdfa.sfdssf.sdfsdf', ROLE: 'admin/xiaozhang/banzhur/xuesheng', roles: [...roles1, ...roles2], //※※※ }); } else if (req.body.roler=== 'xuesheng') { res.send({ msg: '登录成功', token: 'Bearea sdfa.sfdssf.sdfsdf', roles: roles1, //※※※ }); } });
登录获取路由
async login() {
const { data: res } = await axios.post('/api/login', { roler: 'xiaozhang'});
// 给需要权限的接口 添加 token属性到 Authrization 这个字段; 需要到请求拦截器里面添加
// 登录成功以后,还需要根据返回值,动态添加路由;因为不同的人登录系统,不同的权限,返回的内容也不一样
this.setToken(res.token);
// 现在我们要将字符串Home,转换为 函数 () => import('../views/Home.vue'),
res.roles.forEach((item) => {
item.component = this.transformFn(item.component);
});
this.$router.addRoutes(res.roles); //※※※
this.$router.push('/home');
},
封装将路由home字符串形式转为路由的函数
transformFn(componentName) {
return () => import('@/views/' + componentName + '.vue');
},
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。