vue动态设置路由权限的主要思路


Posted in Vue.js onJanuary 13, 2021

之前看到网上有些动态设置路由的,但是跟目前的项目不是很匹配,就自己动手实现了一种。主要思路就是:

1.配置路由的时候绑定好id,可后端开发完成后,与后端同步id就行,这id唯一不变,根据此id可找到路由地址及icon。

const routerArr = [
 {
 path: '',
 name: '',
 component: () => import( /* webpackChunkName: "strategiesMaintain" */ '@/components/Layout/Index'),
 meta: {
 requireAuth: true,
 id: 1,
 icon: 'iconzhanghuguanli',
 title: '路由1'
 },
 children: [{ 
 path: '/verificationLog',
 name: 'VerificationLog',
 component: () => import( /* webpackChunkName: "verificationLog" */ '@/views/auditManage/verificationLog'),
 meta: {
 requireAuth: true,
 id: 101,
 icon: 'icon-disanfangyanzhengrizhi',
 title: '路由11'
 }
 }, {
 path: '/systemLog',
 name: 'SystemLog',
 component: () => import( /* webpackChunkName: "systemLog" */ '@/views/auditManage/systemLog'),
 meta: {
 requireAuth: true,
 id: 102,
 icon: 'icon-xitongcaozuorizhi',
 title: '路由12'
 }
 }]
 }
];

export default routerArr;

2.设置本地路由与后端传来的路由的联系,主要是根据id绑定路由地址及iconClass

import routerModules from "@/router/modules";
import {http} from '@/utils/http'
import store from '@/store';
import { Message } from 'element-ui'

const formateResData = (val) =>{ // 格式化路由数据
 const obj = {};
 const fn = (arr)=>{
  for(let i = 0,item;item = arr[i++];){
  obj[item['meta']['id']] = {
   path: item['path'],
   iconClass: item['meta']['icon']
  };
  if(item.children && item.children.length > 0){
   fn(item.children);
  }
  }
 }
 fn(val);
 return obj;
};

const MAPOBJ = formateResData(routerModules);
const dealWithData = (navData) => { // 处理菜单数据
 let firstLink = "";
 const navIdArr = [];
 const fn = (arr) => {
  for (let i = 0,item;item = arr[i++];) {
  item['iconClass'] = MAPOBJ[item.id].iconClass;
  item['linkAction'] = MAPOBJ[item.id].path;
  navIdArr.push(item.id);
  if (!firstLink && !item.subMenu) { // 设置默认跳转
   firstLink = item['linkAction'];
  }
  if (item.subMenu && item.subMenu.length > 0) {
   fn(item.subMenu);
  }
  }
 }
 fn(navData);
 return {navData,navIdArr,firstLink};
};

let navIds = [];

const getNav = async (to={},from={},next=()=>{})=>{ // 获取导航数据
 const {code,data} = await http("/menu/list", {}, "GET"); // 获取菜单数据
 // const data = require("@/mock/api/menuData"); // 使用mock数据
 const {navData,navIdArr,firstLink} = dealWithData(data);
 store.commit('setNavData', navData);
 navIds = navIdArr;
 if(to.fullPath == '/index'){ // 从登录过来 或者是回首页
 next(firstLink);
 }else { // 刷新
 if(navIds.indexOf(to.meta.id) == -1){ // 后端没有返回该菜单
  Message.error('菜单不存在或者没有权限');
  return;
 }
 next();
 }
}

export const setGuard = (to={},from={},next=()=>{}) =>{ // 设置权限
 if(navIds.length === 0){ // 还没有获取菜单数据
 getNav(to,from,next);
 }else { // 获取到菜单数据
 if(navIds.indexOf(to.meta.id) == -1){ // 后端没有返回该菜单
  Message.error('菜单不存在或者没有权限');
  return;
 }
 next();
 }
}

3.在mainjs中引入配置

router.beforeEach((to, from, next) => {
 let token = wlhStorage.get("authorization");
 if (to.path == "/login") {
 storage.clear();// 清空缓存
 next();
 } else {
 if (to.meta.requireAuth && token) { // 登陆
  setGuard(to,from,next);
 } else { // 没有登录
  next("/login");
 }
 }
})

总结

到此这篇关于vue动态设置路由权限的文章就介绍到这了,更多相关vue动态设置路由权限内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
Vue实现点击当前行变色
Dec 14 Vue.js
如何在vue中使用kindeditor富文本编辑器
Dec 19 Vue.js
vue自定义组件实现双向绑定
Jan 13 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
vue实现同时设置多个倒计时
May 20 Vue.js
Vue h函数的使用详解
Feb 18 Vue.js
Vue中使用import进行路由懒加载的原理分析
Apr 01 Vue.js
Vue OpenLayer测距功能的实现
Apr 20 Vue.js
vue组件是如何解析及渲染的?
Jan 13 #Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 #Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 #Vue.js
基于VUE实现简单的学生信息管理系统
Jan 13 #Vue.js
详解为什么Vue中的v-if和v-for不建议一起用
Jan 13 #Vue.js
vue自定义组件实现双向绑定
Jan 13 #Vue.js
Vue页面渲染中key的应用实例教程
Jan 12 #Vue.js
You might like
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
PHP定义字符串的四种方式详解
2018/02/06 PHP
让焦点自动跳转
2006/07/01 Javascript
jQuery隔行变色与普通JS写法的对比
2013/04/21 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
c#+jquery实现获取radio和checkbox的值
2020/09/12 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
js Array.slice的8种不同用法示例
2019/07/10 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
[46:37]LGD vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
socket + select 完成伪并发操作的实例
2017/08/15 Python
速记Python布尔值
2017/11/09 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
英国票务网站:Ticketmaster英国
2018/08/27 全球购物
英国高级健康和美容产品零售商:Life and Looks
2019/08/01 全球购物
乐观大学生的自我评价
2014/01/10 职场文书
列车长先进事迹材料
2014/01/25 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
文明生主要事迹
2014/05/25 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
离婚起诉书范本
2015/05/18 职场文书
2016高考感言
2015/08/01 职场文书
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android