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使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
Vue实现小购物车功能
Dec 21 Vue.js
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
vue中watch的用法汇总
Dec 28 Vue.js
vue 计算属性和侦听器的使用小结
Jan 25 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
vue-router路由懒加载及实现的3种方式
Feb 28 Vue.js
vue实现可移动的悬浮按钮
Mar 04 Vue.js
Vue vee-validate插件的简单使用
Jun 22 Vue.js
Vue鼠标滚轮滚动切换路由效果的实现方法
Aug 04 Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
Vue Element plus使用方法梳理
Dec 24 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
深入php数据采集的详解
2013/06/02 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
JavaScript数据类型检测代码分享
2015/01/26 Javascript
js去除浏览器默认底图的方法
2015/06/08 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
jQuery实现文件编码成base64并通过AJAX上传的方法
2018/04/12 jQuery
QRCode.js二维码生成并能长按识别
2018/10/16 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
JavaScript获取页面元素的常用方法详解
2019/09/28 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
Python实现Linux下守护进程的编写方法
2014/08/22 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
Python之循环结构
2019/01/15 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
Fox Racing英国官网:越野摩托车和山地自行车服装
2020/02/26 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
物业保安员岗位职责
2014/03/14 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
英语复习计划
2015/01/19 职场文书
教师个人学习总结
2015/02/11 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
go设置多个GOPATH的方式
2021/05/05 Golang
原生JS实现飞机大战小游戏
2021/06/09 Javascript
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
Mysql 文件配置解析介绍
2022/05/06 MySQL