当前位置: 首页 > news >正文

Vue 项目中 根目录中router路由拦截 beforeEach 常用的写法

上代码吧
在我们的router.js文件下

	/*
	 * @Description: 路由设置
	 */
	import Vue from "vue";
	import Router from "vue-router";
	import store from '../store/store';  // 用到的vuex--store
	// 封装的路由引入进来
	import nd from './nd';
	import q from './q';
	// 按钮权限
	import {getCurrentModuleBtnPermission} from "../utils/btnPermission" // 按钮权限操作
	
	Vue.use(Router);
	
	//解决Vue-Router升级导致的没有捕获导航 Uncaught(in promise) navigation guard问题
	
	const originalPush = Router.prototype.push // 路由原型中的push
	Router.prototype.push = function push(location, onResolve, onReject) {
	  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
	  return originalPush.call(this, location).catch(err => err)
	}
	
	// 使用引入的路由
	const routes = [
		...nd, ...q, 
		{
		  path: "/",
		  redirect: "login",
		  auth: false
		}
	]
	
	const router = new Router({
	  mode: 'history',
	  routes
	});
	
	// 路由拦截操作
	router.beforeEach((to, from, next) => {
		//判断是否需要登录
	  if (to.matched.some(res => res.meta.auth)) { // 如果匹配到了信息就可以直接登录
	    if (sessionStorage['username']) { // 如果有找到以存在的 username
	    	// 权限btn
	    	// some()是对数组中每一项运行给定函数,如果该函数有一项返回true,则返回true。
	      if (to.matched.some(res => res.meta.btn)){
	      		// 权限按钮操作
	          getCurrentModuleBtnPermission(to.fullPath).then((res) => {
		            if (res.code == "SUCCESS") {
		              sessionStorage.setItem('btnPermission',res.data);
		            }
	          });
	      }
		// 提交一个commit 事件 
	      store.commit('setHistory', to);
	      next();
	    } else {// 如果没有权限btn
	      sessionStorage.clear(); // 清空 存储信息,进入登录页面
	      next({
	        path: "/login",
	        query: {
	          redirect: to.fullPath // 重定向
	        }
	      });
	    }
	  } else { // 如果没有匹配到信息
	    store.commit('setHistory', to);
	    next()
	  }
	})
	export default router

上面我们说道了权限,并且有路由里的meta标记,你一定要注意在我们路由配置里面添加meta , 并给值,如下图
在这里插入图片描述

然后继续。
我们在store文件夹下创建一个store.js文件

import Vue from 'vue'
import Vuex from 'vuex'
import { setToken } from '@/utils/storage.js'

Vue.use(Vuex)

const store = new Vuex.Store({
	// 基本数据信息
    state: {
        id_token: '', //token
        Loading: false, // loading 控制
        index: localStorage.getItem('index') || 1, // 底部导航状态
        lang: 'cn', // 语言
        history: []
    },
	//异步操作
    mutations: {
        SET_TOKEN(state, token) {
            state.id_token = token
        },
        isLoading(state) {
            state.Loading = !state.Loading;
        },
        isIndex(state, n) {
            localStorage.setItem('index', n);
            state.index = n;
        },
        setLang(state, lang) {
            localStorage.setItem('lang', lang);
            state.lang = lang;
        },
        
        setHistory(state, n) {
            // 过滤相同数据
            let arr = state.history;
            let isa = arr.filter(item => item.path == n.path);
            if (isa.length == 0) {
                // 判断是否是欢迎页
                if (n.path != '/welcome' && n.meta.name) {
                    state.history.push(n);
                }
            }
        },

        reduceHistory(state, n) {
            // 删除记录
            let arr = state.history;
            let index;
            arr.forEach((item, i) => {
                if (item.path == n.path) {
                    index = i;
                }
            })
            arr.splice(index, 1);
        },
        allHistory(state) {
            // 关闭全部
            sessionStorage.removeItem('history');
            state.history = [];
        },
        otherHistory(state, n) {
            // 关闭其他
            if (state.history.length) {
                state.history = [];
                state.history.push(n);
            }
        }
    },
    
    // 同步操作
    actions: {
        setToken({ commit }, token) {
            return new Promise((resolve, reject) => {
                commit('SET_TOKEN', token)
                setToken(token)
                resolve()
            })
        },
        editLoading(context) {
            context.commit('isLoading');
        },
        editIndex(context, n) {
            context.commit('isIndex', n);
        }
    }
});


export default store

那么我们继续写按钮权限文件,要后端配合了

import http from '../plugin/axios';

let api = {
  btnPermission: '/gateway/energy-service-ucenter/api/roles/btn/permission', // 获取按钮权限
}
/**
 * 按钮权限判断
 * @param value
 * @returns {boolean}
 */
	export function checkBtnPermission(value) {
	   const permissions = sessionStorage.getItem('btnPermission')
	    if(null == permissions){
	       return false;
	    }
	    return permissions.indexOf(value) != -1
	}

export function getCurrentModuleBtnPermission(data) {
  return http.gets(api.btnPermission, {"path":data});
}

结束。

相关文章:

  • 不同按钮模板自定义
  • react项目中没有路由守卫,需要拦截的话,只能在路径上拦截,可以自己去封装 Route
  • 跟锦数学160823-190322, 共 942 题
  • JavaScript新鲜事·第5期
  • vue 项目实战 递归
  • react 项目 tab列表 把返回的一个字段数组,全部 展示在一个字段里
  • Python语言学习 (六)1.2
  • js语法中 ?. 和 ?? 的含义以及用法说明
  • 工作中MySql常用操作
  • 命令模式-对象行为型
  • git 分支 合并 具体执行过程 详细
  • 2017届校招提前批面试回顾
  • 前端 通过id 查询详情,让form表单中某地址展示成超链接,点击跳转并查看情况
  • 运用Keil uVision新建一个工程
  • 前端 react 项目 常见的 面试题
  • 【译】JS基础算法脚本:字符串结尾
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • echarts花样作死的坑
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Kibana配置logstash,报表一体化
  • Laravel 菜鸟晋级之路
  • Mac转Windows的拯救指南
  • node和express搭建代理服务器(源码)
  • PAT A1120
  • php ci框架整合银盛支付
  • SQLServer之创建数据库快照
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Webpack 4x 之路 ( 四 )
  • 初识MongoDB分片
  • 聊聊directory traversal attack
  • 前端存储 - localStorage
  • 如何设计一个微型分布式架构?
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 微信公众号开发小记——5.python微信红包
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 用Python写一份独特的元宵节祝福
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​人工智能书单(数学基础篇)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (LeetCode) T14. Longest Common Prefix
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原)本想说脏话,奈何已放下
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET开发人员必知的八个网站
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /etc/skel 目录作用