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 24 Vue.js
Vue与React的区别和优势对比
Dec 18 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
vue实现倒计时功能
Mar 24 Vue.js
vue首次渲染全过程
Apr 21 Vue.js
简单聊聊Vue中的计算属性和属性侦听
Oct 05 Vue.js
vue+iview实现手机号分段输入框
Mar 25 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue-cli3.x配置全局的scss的时候报错问题及解决
Apr 30 Vue.js
vue如何在data中引入图片的正确路径
Jun 05 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 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新手上路(二)
2006/10/09 PHP
php生成文件
2007/01/15 PHP
php GD绘制24小时柱状图
2008/06/28 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php读取mysql的简单实例
2014/01/15 PHP
PHP多线程类及用法实例
2014/12/03 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
Js操作Select大全(取值、设置选中等等)
2013/10/29 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
浅谈JavaScript数据类型及转换
2015/02/28 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
2016/06/13 Javascript
JavaScript你不知道的一些数组方法
2017/08/18 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
使用python实现快速搭建简易的FTP服务器
2018/09/12 Python
python实现事件驱动
2018/11/21 Python
基于python实现KNN分类算法
2020/04/23 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
html5简介_动力节点Java学院整理
2017/07/07 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
保时捷设计:Porsche Design
2019/03/30 全球购物
人力资源管理专业自荐书
2014/07/07 职场文书
党支部先进事迹材料
2014/12/24 职场文书
地球一小时活动总结
2015/02/27 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript