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 相关文章推荐
深入了解Vue3模板编译原理
Nov 19 Vue.js
vue $router和$route的区别详解
Dec 02 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
vue 动态生成拓扑图的示例
Jan 03 Vue.js
vue3弹出层V3Popup实例详解
Jan 04 Vue.js
解决vue项目本地启动时无法携带cookie的问题
Feb 06 Vue.js
vue+spring boot实现校验码功能
May 27 Vue.js
vue-cli4.5.x快速搭建项目
May 30 Vue.js
解决Vue+SpringBoot+Shiro跨域问题
Jun 09 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 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
curl实现站外采集的方法和技巧
2014/01/31 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
Symfony查询方法实例小结
2017/06/28 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
用JS控制回车事件的代码
2011/02/20 Javascript
Js四则运算函数代码
2012/07/21 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
javascript获取选中的文本的方法代码
2013/10/30 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
js实现开启密码大写提示
2016/12/21 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
如何获取某个日期是当月的最后一天
2013/12/05 面试题
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
镇政府副镇长群众路线专题民主生活会对照检查材料
2014/09/19 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
用人单位聘用意向书
2015/05/11 职场文书
张丽莉观后感
2015/06/16 职场文书
市直属机关2016年主题党日活动总结
2016/04/05 职场文书
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL