(系列十一)Vue3框架中路由守卫及请求拦截(实现前后端交互)

news/2024/11/13 15:47:20/文章来源:https://www.cnblogs.com/cyzf/p/18531946

说明

    该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发)。

    该系统文章,我会尽量说的非常详细,做到不管新手、老手都能看懂。

    说明:OverallAuth2.0 是一个简单、易懂、功能强大的权限+可视化流程管理系统。

友情提醒:本篇文章是属于系列文章,看该文章前,建议先看之前文章,可以更好理解项目结构。

qq群:801913255

有兴趣的朋友,请关注我吧(*^▽^*)。

关注我,学不会你来打我

前言

这篇文章有点长,内容丰富,如果你对该文章感兴趣,请耐心观看。

一、什么是路由守卫,它的作用是什么

什么是路由守卫:它是控制路由菜单访问的一种机制,当一个用户点击一个路由菜单时,那么路由守卫就会对其进行“保护”,常见的守卫方式有

beforeEach:路由菜单访问前守卫。

afterEach:路由菜单访问后守卫。

路由守卫的作用:了解什么是路由守卫后,其实我们大致可以得出它大致有以下作用。

  1、身份认证:在进入模块之前,验证用户身份是否正确,列如:登录是否过期,用户是否登录等。

  2、权限控制:控制用户、角色对应模块的访问权限。

  3、日志记录:由于路由守卫能监控到用户对于模块访问前和访问后的动作,那么我们可以用来记录用户的访问日志等。

  4、数据预加载:在很多时候,些许数据需要在我们访问页面前,加载完成。

  5、路由动画:可以在路由访问前后,加载一个过渡动画,提高用户体验。

二、路由守卫的使用

在使用之前,我们需要安装状态管理库和状态持久化插件以及路由加载进度条。它可以共享程序中的一些状态。

  1:安装npm install pinia  状态存储库

  2:安装npm install pinia-plugin-persistedstate  状态持久化插件

  3:安装 npm install nprogress  进度条插件

  4:安装 npm install @types/nprogress

书接上一篇:Vue3中菜单和路由的结合使用,实现菜单的动态切换

创建一个路由文件index.ts,存放在指定文件夹下,由于我写的是从0到1搭建框架,我放在了以下目录中

内容如下:

import { createRouter, createWebHashHistory, NavigationGuardNext, RouteLocationNormalized } from 'vue-router'
import { routes } from './module/base-routes'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'NProgress.configure({ showSpinner: false })const router = createRouter({history: createWebHashHistory(), //开发环境
  routes
})/**
路由守卫,访问路由菜单前拦截* @param to 目标* @param from 来至 */
router.beforeEach((to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => {NProgress.start();if (to.meta.requireAuth) {next();} else if (to.matched.length == 0) {next({ path: '/panel' })} else {next();}
})router.afterEach(() => {NProgress.done();
})export default router

代码解释:

router.beforeEach:就是每次在访问路由前,都会进入的方法,在该方法中,我添加了一个进度条和路由访问后的拍断。
router.afterEach:就是每次在访问路由后,都会进入的方法,在该方法中,添加了一个进度条结束的方法。

然后我们在main中,全局注册路由和状态管理

做好以上这些,路由守卫就完成。

如果,你是按照我的系列文章所搭建的前端框架,那么你要在以下2个文件中,做出改动(没有,请忽略)。

  1、在HelloWorld.vue文件中把import router, { routes } from "../router/module/base-routes";替换成import  { routes } from "../router/module/base-routes"; 并加入import router from "../router/index";

  2、在base-routes.ts文件中删除以下代码

//创建路由,并且暴露出去
const router = createRouter({history: createWebHashHistory(), //开发环境//history:createWebHistory(), //正式环境
  routes
})
export default router

做好这些,我们启动项目,检查每次点击路由菜单,是否进入路由守护拦截中。

明白的伙伴,请抓紧去填充你的内容吧。

三、请求拦截、响应拦截

  我们OverallAuth2.0使用的是Vue3+.net8 WebApi创建的项目,所以我们会使用到后端接口。那么我们前端该如何和后端建立数据交互关系?建立关系会该如何处理返回信息?不要着急,耐心往下看。

 首先要安装组合式api请求插件axios

安装命令:npm install axios

然后按照下图,新建文件及文件夹

http.ts文件内容如下

import axios, { AxiosResponse, InternalAxiosRequestConfig } from 'axios';//声明模型参数
type TAxiosOption = {timeout: number;baseURL: string;
}//配置赋值
const config: TAxiosOption = {timeout: 5000,baseURL: "https://localhost:44327/",    // 本地api接口地址
}class Http {service;constructor(config: TAxiosOption) {this.service = axios.create(config)/* 请求拦截 */this.service.interceptors.request.use((config: InternalAxiosRequestConfig) => {//可以在这里做请求拦截处理   如:请求接口前,需要传入的token
            debugger;return config}, (error: any) => {return Promise.reject(error);})/* 响应拦截 */this.service.interceptors.response.use((response: AxiosResponse<any>) => {debugger;switch (response.data.code) {case 200:return response.data;case 500://这里面可以写错误提示,反馈给前端return response.data;case 99991:return response.data;case 99992:return response.data;case 99998:return response.data;default:break;}}, (error: any) => {return Promise.reject(error)})}/* GET 方法 */get<T>(url: string, params?: object, _object = {}): Promise<any> {return this.service.get(url, { params, ..._object })}/* POST 方法 */post<T>(url: string, params?: object, _object = {}): Promise<any> {return this.service.post(url, params, _object)}/* PUT 方法 */put<T>(url: string, params?: object, _object = {}): Promise<any> {return this.service.put(url, params, _object)}/* DELETE 方法 */delete<T>(url: string, params?: any, _object = {}): Promise<any> {return this.service.delete(url, { params, ..._object })}
}export default new Http(config)

以上代码关键点都有注释说明

user.ts中的内容如下

import Http from '../http';export const TestAutofac = function () {return Http.get('/api/SysUser/TestAutofac');
}

这个就是我们之前搭建后端框架,演示示例的接口地址。

做完以上工作,整个响应拦截和请求拦截的基本代码编写完成,接下来就是测试。

四、测试

  在用户界面添加以下代码(也可以新建vue页面)

<template><div>用户</div>
</template><script lang="ts">
import { defineComponent, onMounted } from "vue";
import { TestAutofac } from "../../api/module/user";
export default defineComponent({setup() {//初始加载onMounted(() => {TestAutofacMsg();});//调用接口const TestAutofacMsg = async () => {var result = await TestAutofac();console.log(result);};return {};},components: {},
});
</script>

点击用户菜单,测试请求拦截是否成功

拦截成功,但出现如下错误(跨域问题)

上面问题是跨域问题导致,我们要在接口端配置跨域地址。

打开之前我们的后端框架,创建如下文件CrossDomainPlugIn.cs,路径和jwt鉴权,全局异常捕获插件放在同一个位置。

 /// <summary>/// 跨域配置插件/// </summary>public static class CrossDomainPlugIn{/// <summary>/// 跨域/// </summary>/// <param name="services"></param>public static void InitCors(this IServiceCollection services){//允许一个或多个来源可以跨域services.AddCors(options =>{options.AddPolicy("Access-Control-Allow-Origin", policy =>{var result = AppSettingsPlugIn.GetNode("CustomCorsPolicy:WhiteList").Split(',');// 设定允许跨域的来源,有多个可以用','隔开
                 policy.WithOrigins(result).AllowAnyHeader().AllowAnyMethod().AllowCredentials();});});}}

然后再Program.cs文件中,添加

//跨域配置
builder.Services.InitCors();和app.UseCors("Access-Control-Allow-Origin");代码

appsettings.json配置中添加如下配置,地址是前端访问地址

/*跨越设置*/
"AllowedHosts": "*",
"CustomCorsPolicy": {
"WhiteList": "http://localhost:8080"
},

启动后端接口,在测试下

以上就是本篇文章的全部内容,感谢耐心观看

后端WebApi 预览地址:http://139.155.137.144:8880/swagger/index.html

前端vue 预览地址:http://139.155.137.144:8881

关注公众号:发送【权限】,获取前后端代码

有兴趣的朋友,请关注我微信公众号吧(*^▽^*)。

关注我:一个全栈多端的宝藏博主,定时分享技术文章,不定时分享开源项目。关注我,带你认识不一样的程序世界

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/832994.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MIGO DUMP LCX_RAP_EVENT_RUNTIME CL_RAP_EVENT_MANAGER==========CP

MIGO 收货时发生DUMP运行事务代码:SBGRFCCONF 创建入站目标输入目标BGPF 保存即可TRANSLATE with xEnglishArabic Hebrew PolishBulgarian Hindi PortugueseCatalan Hmong Daw RomanianChinese Simplified Hungarian RussianChinese Traditional Indonesian SlovakCzech Ital…

非煤矿山算法智慧矿山一体机提升机危险区域违规闯入识别边坡监测预警系统详述

在矿山行业中,安全始终是最为关键的议题。随着智能化技术的发展,智慧矿山一体机应运而生,它专为矿山安全监控和管理设计,集成了多种智能化功能,以提升矿山的安全监管能力和生产效率。这款设备不仅能够满足矿山场景下的视频智能化建设需求,还能够通过边缘计算技术实现对矿…

全国职业院校技能大赛

老师说目前这个是省赛,预计12月参加,如果要准备的话,预计要有一个月的时间准备我看了一下往年的题目,确实是平常老师跟我们讲的那种术语什么的

Hadoop搭建集群

不知道为什么会出现这样的结果

使用idea创建Sping Boot 项目 发现不能使用JAVA版本是8或者11版本只能用17版本已经更高

接下来需要一个骚操作, 官方地址: https://start.spring.io阿里云脚手架地址:https://start.aliyun.com/

[题解]P3225 [HNOI2012] 矿场搭建

P3225 [HNOI2012] 矿场搭建 挖煤点坍塌相当于把该点和与其相连的边在图上删掉。 借用wjyyy的题解,我们定义“叶子连通块”为“只包含\(1\)个割点的点双连通分量”,“非叶子连通块”为“包含\(\ge 2\)个割点的点双连通分量”。 如下图,橙色点是割点,红色框圈出的是点双,加粗…

DDCA —— 内存架构和子系统内存控制器

Digital Design and Computer Architecture Lecture21的学习笔记,介绍内存架构和子系统、内存控制器,并详细介绍了DRAM的内部结构。1. 内存架构和子系统 1.1 如何控制访问?访问控制:存储单元的访问是通过 访问晶体管(access transistors) 进行控制的。访问晶体管像开关一…

ubuntu上安装 NVIDIA GeForce RTX 4090驱动

背景 ai服务器上安装完ubuntu系统后,需要安装NVIDIA显卡驱动 官网驱动下载https://www.nvidia.cn/drivers/details/235646/驱动安装 1.卸载原有驱动 sudo apt remove --purge nvidia*2.备份 sudo cp /etc/modprobe.d/blacklist.conf /etc/modprobe.d/blacklist.conf_bak 3.末尾…

springboot将文件处理成压缩文件

前言 在工作我们经常会出现有多个文件,为了节省资源会将多个文件放在一起进行压缩处理;为了让大家进一步了解我先将springboot处理的方法总结如下,有不到之处敬请大家批评指正! 一、文件准备:https://qnsc.oss-cn-beijing.aliyuncs.com/crmebimage/public/product/2024/11…

CMDB平台(进阶篇):CMDB的构建指南(一)

CMDB(配置管理数据库)的构建是一个复杂而细致的过程,其中组建项目团队和定义项目是至关重要的初始阶段。以下是根据高权威性来源整理的,关于这两个阶段的详细指南: 一、组建项目团队 团队角色与技能: 选择的团队必须具备相应的技能、经验、知识去解释、设计和实施一个CMD…

出差及报销问题

出差问题 报销问题 一、提交报销申请提交报销申请在应用导航的 ERP门户系统 中,选择我要报账在保障服务平台--单据管理--全部单据里选择--差旅费报账单(新)报销申请单填写选择想要报销的出差审批单上传想要报销的发票后点击下一步填写基本信息影像张数: 上传附件图片数量。…

职场效率倍增!学会这6个任务管理法则轻松完成工作

身处职场,我们每个人都在日复一日的工作中面对着不断增加的任务清单。如何有效管理、合理分配、确保准时交付,成了现代职场人最常面临的挑战之一。如果管理不当,不仅影响个人效率,整个团队也可能因此陷入无休止的混乱与低效。经过几年的职场摸索,我总结出了一些应对繁杂任…