Vue3创建项目(四)axios封装及接口配置

news2024/9/25 1:25:49

项目结构: 

目录

 🍉🍉🍉index.ts

 🍉🍉🍉 api.ts

看完需要预计花费10分钟。

请求拦截器与响应拦截器 

阅读下面代码需先了解以下内容:

   

    请求拦截器:

    请求拦截器的作用是在请求发送前进行一些操作,例如在每个请求体里加上token,每次请求携带token传给后端,统一做处理。

    响应拦截器:

    响应拦截器的作用是在接收到响应后进行一些操作,例如在服务器返回登录状态token失效,需要重新登录的时候,跳转到登录页,对不同状态码做不同处理。

 🍉🍉🍉index.ts

 

 先检查package.json文件是否已安装axios,没安装先安装。。。

安装命令如下: 

npm i axios -S
import axios from "axios";
//创建axios实例
const service = axios.create({
	baseURL: "https://www.xxxxxxx.site/mock/xxxxx/api",
	timeout: 5000,//超时时间
	headers: {//编译语言
		"Content-type": "application/json;charset=utf-8"
	}
})
//请求拦截
//就是你请求接口的时候,我会先拦截下来,对你的数据做一个判断,或者携带个token给你
service.interceptors.request.use((config) => {//请求的数据
	config.headers = config.headers || {}  // 没有数据的话就设置为空设置为数据
	if (localStorage.getItem("token")) {//先确保登录
		config.headers.token = localStorage.getItem("token") || ""
	}
	return config//必须返回出去,不然请求发不出去
}, error => {
	//处理错误请求
	return Promise.reject(error)
})
//响应拦截:后端返回来的结果
service.interceptors.response.use((res) => {
	const code: number = res.data.code//code是后端的状态码
	if (code !== 200) {
		//请求失败(包括token失效,302,404...根据和后端约定好的状态码做出不同的处理)
		return Promise.reject(res)
	} else {
		//请求成功
		console.log(res, '成功----')
		return Promise.resolve(res.data)
	}
}, (err) => {
	console.log(err, '错误信息的处理')//错误信息的处理
	//处理错误响应
	return Promise.reject(err)
})
//因为别的地方要用,所以就把实例暴露出去,导出
export default service

 🍉🍉🍉 api.ts

//我要用到的一些接口
import service from "@/request/index";
import {ILoginData} from "@/type/login";  //引入接口

// 登录接口
export function login(data: ILoginData) {//接口ILoginData接口的变量名
    return service({
        url: "/login",
        method: "POST",
        data
    })
}

// 商品列表接口
export function getGoodsList(){
    return service({
        url: "/getGoodsList",
        method: "GET"
    })
}

// 用户列表接口
export function getUserList(){
    return service({
        url: "/getUserList",
        method: "GET"
    })
}

// 角色列表接口
export function getRoleList(){
    return service({
        url: "/getRoleList",
        method: "GET"
    })
}

// 权限列表接口
export function getAuthorityList(){
    return service({
        url: "/getAuthorityList",
      method: "GET",
    })
}

 调用封装好的axios方法,下面有个Login登录调用接口示例:

	login(data.ruleForm).then((res) => {
	    console.log(res,'111')
		//使用 localStorage.setItem,将token保存到localStorage
		// res.data.token是后端返回的信息
		localStorage.setItem("token", res.data.token);
		// 并且跳转到首页
		router.push('/')
		}).catch((err)=>{
			console.log(err,'err')
		});

 🍉🍉🍉 看完整示例:

<template>
	<div class="login-box">
		<div>
			<el-form ref="ruleFormRef" :model="ruleForm" status-icon :rules="rules" label-width="70px">
				<el-form-item style="width:400px" label="用户名:" prop="username">
					<el-input v-model="ruleForm.username" type="text" autocomplete="off" />
				</el-form-item>
				<el-form-item style="width:400px" label="密码:" prop="password">
					<el-input v-model="ruleForm.password" type="password" autocomplete="off" />
				</el-form-item>
				<el-form-item>
					<el-button class="login-btn" type="primary" @click="submitForm(ruleFormRef)">登录</el-button>
					<el-button class="login-btn" @click="resetForm()">重置</el-button>
				</el-form-item>
			</el-form>
		</div>
	</div>
</template>
<script lang="ts">
	//ts中有一个类型推断
	// ref有个value属性,可以获取值
	import {
		defineComponent,
		reactive,
		toRefs,
		ref
	} from 'vue'
	import {LoginData} from '../type/login'
	import type {FormInstance} from 'element-plus'
	import {login} from '../request/api'
	import {useRouter} from 'vue-router'

	export default defineComponent({
		setup() {
			const data = reactive(new LoginData()); //调用这个类,然后实例化对象
			const router = useRouter(); //  等于$router

			// 表单输入规则
			const rules = {
				username: [{
						required: true, //是否必须字段
						message: "请输入用户名", // 触发的提示信息
						trigger: "blur" // 触发时机: 当失去焦点时(光标不显示的时候),触发此提示
					},
					{
						min: 3, // 最小字符书
						max: 5, // 最大字符数
						message: "用户名长度需要在3-5个字符之间", // 触发的提示信息
						trigger: "blur"
					}
				],
				password: [{
						required: true, //是否必须字段
						message: "请输入密码", // 触发的提示信息
						trigger: "blur" // 触发时机: 当失去焦点时(光标不显示的时候),触发此提示,就会进行校验
					},
					{
						min: 3, // 最小字符书
						max: 6, // 最大字符数
						message: "密码长度需要在3-5个字符之间", // 触发的提示信息
						trigger: "blur"
					}
				]
			}
			//登录
			const ruleFormRef = ref < FormInstance > () //ref获取这个表单的所有值
			// formEl获取到的是一整个原型,里面有很多方法和属性
			// 比如 formEl.resetFields()就可以直接清空表单,具体可以看element的文档
			const submitForm = (formEl: FormInstance | undefined) => {
				if (!formEl) return //没有就返回
				// 验证表单,valid是一个布尔类型
				formEl.validate((valid) => {
					if (valid) { //如果为true,则调用接口,完成登录
						login(data.ruleForm).then((res) => {
							console.log(res,'111')
							//使用 localStorage.setItem,将token保存到localStorage
							// res.data.token是后端返回的信息
							localStorage.setItem("token", res.data.token);
							// 并且跳转到首页
							router.push('/')
						}).catch((err)=>{
							console.log(err,'err')
						});
					} else {
						console.log('error submit!')
						return false
					}
				})
			}


			// 重置
			const resetForm = () => {
				data.ruleForm.username = "";
				data.ruleForm.password = "";
			};
			return {
				...toRefs(data),
				rules,
				ruleFormRef,
				submitForm,
				resetForm
			} //要用到的数据都要导出来
		}
	})
</script>

小提示: vue 请求报错 Uncaught (in promise) 的解决方法 :

 

如果promise中 reject的错误没有被捕获到就会报这个错误,只要在

Function(data).then(res => {.......})

后面加上.catch((e) => {}),就不会报错了 

 

🍓结束语🏆

       后续新出会陆续补充...

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows搭建机器学习环境

一、环境介绍Anaconda&#xff1a;Anaconda offers the easiest way to perform Python/R data science and machine learning on a single machine. Start working with thousands of open-source packages and libraries today.Anaconda包括Conda、Python以及一大堆安装好的工…

Qt信号与槽机制——新手友好

目录 一 为什么会有这个机制 二 信号与槽是什么 三 信号 四 槽 五 使用 1 最简单的 2 函数指针 3 用Lambda表达式实现 一 为什么会有这个机制 我们平时的一个网页&#xff0c;如果点击网页上不同的部分会有不同的相应动作。比如点击超链接就会实现网页的跳转&#xff0c…

Code Virtualizer 3.1.4 Crack

Code Virtualizer 是一个强大的 Windows 应用程序代码混淆系统&#xff0c;它可以帮助开发人员保护他们的敏感代码区域免受逆向工程的影响&#xff0c;基于代码虚拟化的非常强大的混淆代码。 Code Virtualizer 会将您的原始代码&#xff08;Intel x86/x64 指令&#xff09;转换…

剑指 Offer day3, day4

剑指 Offer day3, day4 字符串和数组的操作。 剑指 Offer 05. 替换空格 剑指 Offer 05. 替换空格 - 力扣&#xff08;Leetcode&#xff09; 方法二&#xff1a;原地修改 在 C 语言中&#xff0c; string 被设计成「可变」的类型&#xff08;参考资料&#xff09;&#xff…

python海龟绘图

一、基础 &#xff08;一&#xff09;介绍 海龟绘图&#xff08;Turtle Graphics&#xff09;&#xff1a;“小海龟”turtle是Python语言中一个很流行的绘制图像的函数库&#xff0c;想象一个小乌龟&#xff0c;在一个横轴为x、纵轴为y的坐标系原点&#xff0c;(0,0)位置开始…

Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议

Git分支的合并策略有哪些&#xff1f;Merge和Rebase有什么区别&#xff1f;关于Merge和Rebase的使用建议1. 关于Git的一些基本原理1.1 Git的工作流程原理2. Git的分支合并方式浅析2.1 分支是什么2.2 分支的合并策略2.2.1 Three-way-merge&#xff08;三向合并原理&#xff09;2…

前端已死?我看未必,但「低代码」已剑指前端程序员

本文笔者会从以下几个方面分享&#xff0c;希望能够帮助正在迷茫的前端小伙伴提供一点思路&#xff01; 逛技术博客 不局限框架 全栈工程师兴起 关注前沿 写技术文章 录制前端视频 总结 2023第一季度快过去了&#xff0c;没工作的找到工作了吗&#xff1f;有工作的加薪了…

Hbase的基本概念与架构

一、Hbase的概念 HBase是Hadoop的生态系统&#xff0c;是建立在Hadoop文件系统&#xff08;HDFS&#xff09;之上的分布式、面向列的数据库&#xff0c;通过利用Hadoop的文件系统提供容错能力。如果你需要进行实时读写或者随机访问大规模的数据集的时候&#xff0c;请考虑使用H…

Canal数据同步配置

文章目录Canal数据同步配置0.canal工作原理1.**检查binlog功能是否有开启**2.如果显示状态为OFF表示该功能未开启&#xff0c;开启binlog功能3.**在mysql里面添加以下的相关用户和权限**4.下载安装Canal服务5.修改配置文件6.进入bin目录下启动7.idea中配置Canal数据同步配置 c…

记录第一次接口上线过程

新入职一家公司后&#xff0c;前三天一直在学习公司内部各种制度文化以及考试。 一直到第三天组长突然叫我过去&#xff0c;给了一个需求的思维导图&#xff0c;按照这个需求写这样一个接口&#xff0c; 其实还不错&#xff0c;不用自己去分析需求&#xff0c;按照这上面直接开…

工业机器人有哪些类型?如何利用工业网关集中监测管理?

工业机器人在制造业中的应用与日俱增&#xff0c;使用工业机器人&#xff0c;不仅提高了设备和场地的利用率&#xff0c;还能保持稳定的产品水平。随着工业机器人的大规模部署&#xff0c;对于数量众多、类型各异、功能不一的机器人的监测、管理和维护&#xff0c;也成为企业面…

Java 异常

文章目录1. 异常概述2. JVM 的默认处理方案3. 异常处理之 try...catch4. Throwable 的成员方法5. 编译异常和运行异常的区别6. 异常处理之 throws7. 自定义异常8. throws 和 throw 的区别1. 异常概述 异常就是程序出现了不正常的情况。 ① Error&#xff1a;严重问题&#xff…

Nessus: 漏洞扫描器-网络取证工具

Nessue 要理解网络漏洞攻击&#xff0c;应该理解攻击者不是单独攻击&#xff0c;而是组合攻击。因此&#xff0c;本文介绍了关于Nessus历史的研究&#xff0c;它是什么以及它如何与插件一起工作。研究了Nessus的特点&#xff0c;使其成为网络取证中非常推荐的网络漏洞扫描工具…

maven高级知识。

目录 一、分模块开发 1、分模块开发设计 2、依赖管理 二、继承和聚合 1、聚合 2、继承 三、属性 1、基本介绍 2、版本管理 四、多环境配置与应用 1、多环境开发 2、跳过测试 五、私服 1、私服安装 2、私服仓库分类 一、分模块开发 1、分模块开发设计 ▶ 示意图 …

【测绘程序设计】——计算卫星位置

本文分享了根据广播星历计算卫星于瞬时地固系下位置的计算程序(C#版)(注:瞬时地球坐标系坐标经极移改正即可获得协议地球坐标系坐标),相关源代码(完整工程,直接运行;包含实验数据)及使用示例如下。 目录 Part.Ⅰ 使用示例Part.Ⅱ 代码分析Chap.Ⅰ 数据结构Chap.Ⅱ 计…

原生javascript手写一个丝滑的轮播图

通过本文&#xff0c;你将学到: htmlcssjs 没错&#xff0c;就是html&#xff0c;css,js,现在是框架盛行的时代&#xff0c;所以很少会有人在意原生三件套&#xff0c;通过本文实现一个丝滑的轮播图&#xff0c;带你重温html,css和js基础知识。 为什么选用轮播图做示例&…

网络运维和网络安全运维有什么区别?就业前景如何?

随着互联网的高速发展&#xff0c;运维安全已经成了大多数企业安全保障的基石。在如今的信息时代&#xff0c;无论是网络运维还是网络安全运维都成了不可缺少的一部分。因此导致很多人都容易把两者弄混淆。首先我们来了解一下网络运维和网络安全运维有什么区别呢&#xff1f;网…

Linux vi/vim教程

所有的 Unix Like 系统都会内建 vi 文本编辑器&#xff0c;其他的文本编辑器则不一定会存在。 但是目前我们使用比较多的是 vim 编辑器。 vim 具有程序编辑的能力&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 ** 什么是 vim&#xff1f;** Vim…

将vue-devtools打包成edge插件

文章目录一、从github拉vue-devtools源码二、用npm安装yarn三、使用yarn安装并编译源码四、将vue-devtools打包成edge插件五、离线安装edge插件一、从github拉vue-devtools源码 目前最新的版本是v6.5.0&#xff0c;地址&#xff1a;https://github.com/vuejs/devtools 二、用n…

第四阶段17-关于Redis中的list类型,缓存预热,关于Mybatis中的`#{}`和`${}`这2种格式的占位符

关于Redis中的list类型 Redis中的list是一种先进后出、后进先出的栈结构的数据。 在使用Redis时&#xff0c;应该将list想像为以上图例中翻转了90度的样子&#xff0c;例如&#xff1a; 在Redis中的list数据&#xff0c;不仅可以从左侧压入&#xff0c;也可以选择从右侧压入…