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 router传递参数并解决刷新页面参数丢失问题
Dec 02 Vue.js
对vue生命周期的深入理解
Dec 03 Vue.js
详解Vue中的自定义指令
Dec 07 Vue.js
vue中如何添加百度统计代码
Dec 19 Vue.js
Vue组件简易模拟实现购物车
Dec 21 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
Vue实现图书管理案例
Jan 20 Vue.js
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 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数据采集之单页面采集函数get_html的使用
2013/04/28 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
php 中phar包的使用教程详解
2018/10/26 PHP
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
chorme 浏览器记住密码后input黄色背景处理方法(两种)
2017/11/22 Javascript
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
jquery实现左右轮播切换效果
2018/01/01 jQuery
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
python引用DLL文件的方法
2015/05/11 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
Python利用Beautiful Soup模块创建对象详解
2017/03/27 Python
Python探索之pLSA实现代码
2017/10/25 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
2018/01/24 Python
python OpenCV学习笔记之绘制直方图的方法
2018/02/08 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
keras自定义损失函数并且模型加载的写法介绍
2020/06/15 Python
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
打架检讨书400字
2014/01/17 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
软件售后服务方案
2014/05/29 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
python glom模块的使用简介
2021/04/13 Python
ubuntu20.04虚拟机无法上网的问题及解决
2022/12/24 Servers