拿來即用,自己封裝的 axios

文章目錄

    • 一、需求
    • 二、分析
      • 1. 安裝axios
      • 2. 新建一個 ts 文件,封裝 axios
      • 3. store 存放 token 信息
      • 4. 使用
      • 5. 文件 type.js

一、需求

在日常開發中,我們會經常用到 axios ,那么如何在自己的項目中自己封裝 axios

二、分析

1. 安裝axios

npm install axios

2. 新建一個 ts 文件,封裝 axios

手寫一個TS文件: src\utils\request.ts,我的習慣把它放在 utils 目錄下,源碼如下

import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { useUserStoreHook } from "@/store/modules/user";// 創建 axios 實例
const service = axios.create({baseURL: import.meta.env.VITE_APP_BASE_API,timeout: 50000,headers: { "Content-Type": "application/json;charset=utf-8" },
});// 請求攔截器
service.interceptors.request.use((config: InternalAxiosRequestConfig) => {const userStore = useUserStoreHook();if (userStore.token) {config.headers.Authorization = userStore.token;}return config;},(error: any) => {return Promise.reject(error);}
);// 響應攔截器
service.interceptors.response.use((response: AxiosResponse) => {const { code, msg } = response.data;if (code === "00000") {return response.data;}// 響應數據為二進制流處理(Excel導出)if (response.data instanceof ArrayBuffer) {return response;}ElMessage.error(msg || "系統出錯");return Promise.reject(new Error(msg || "Error"));},(error: any) => {if (error.response.data) {const { code, msg } = error.response.data;// token 過期,重新登錄if (code === "A0230") {ElMessageBox.confirm("當前頁面已失效,請重新登錄", "提示", {confirmButtonText: "確定",type: "warning",}).then(() => {localStorage.clear();window.location.href = "/";});} else {ElMessage.error(msg || "系統出錯");}}return Promise.reject(error.message);}
);// 導出 axios 實例
export default service;

3. store 存放 token 信息

我的 store 中存放了用戶的登錄信息,在封裝 axios 時只用到了 token,因此下方代碼可做參考

import { defineStore } from "pinia";import { loginApi, logoutApi } from "@/api/auth";
import { getUserInfo } from "@/api/user";
import { resetRouter } from "@/router";
import { store } from "@/store";import { LoginData } from "@/api/auth/types";
import { UserInfo } from "@/api/user/types";import { useStorage } from "@vueuse/core";export const useUserStore = defineStore("user", () => {// stateconst userId = ref();const token = useStorage("accessToken", "");const nickname = ref("");const avatar = ref("");const roles = ref<Array<string>>([]); // 用戶角色編碼集合 → 判斷路由權限const perms = ref<Array<string>>([]); // 用戶權限編碼集合 → 判斷按鈕權限/*** 登錄調用** @param {LoginData}* @returns*/function login(loginData: LoginData) {return new Promise<void>((resolve, reject) => {loginApi(loginData).then((response) => {const { tokenType, accessToken } = response.data;token.value = tokenType + " " + accessToken; // Bearer eyJhbGciOiJIUzI1NiJ9.xxx.xxxresolve();}).catch((error) => {reject(error);});});}// 獲取信息(用戶昵稱、頭像、角色集合、權限集合)function getInfo() {return new Promise<UserInfo>((resolve, reject) => {getUserInfo().then(({ data }) => {if (!data) {return reject("Verification failed, please Login again.");}if (!data.roles || data.roles.length <= 0) {reject("getUserInfo: roles must be a non-null array!");}userId.value = data.userId;nickname.value = data.nickname;avatar.value = data.avatar;roles.value = data.roles;perms.value = data.perms;resolve(data);}).catch((error) => {reject(error);});});}// 注銷function logout() {return new Promise<void>((resolve, reject) => {logoutApi().then(() => {resetRouter();resetToken();location.reload(); // 清空路由resolve();}).catch((error) => {reject(error);});});}// 重置function resetToken() {token.value = "";nickname.value = "";avatar.value = "";roles.value = [];perms.value = [];}return {token,nickname,avatar,roles,perms,login,getInfo,logout,resetToken,/*** 當前登錄用戶ID*/userId,};
});// 非setup
export function useUserStoreHook() {return useUserStore(store);
}

4. 使用

import request from "@/utils/request";
import { AxiosPromise } from "axios";
import { UserForm, UserInfo, UserQuery } from "./types";/*** 登錄成功后獲取用戶信息(昵稱、頭像、權限集合和角色集合)*/
export function getUserInfo(): AxiosPromise<UserInfo> {return request({url: "/api/v1/users/me",method: "get",});
}/*** 添加用戶** @param data*/
export function addUser(data: any) {return request({url: "/api/v1/users",method: "post",data: data,});
}
/*** 修改用戶** @param id* @param data*/
export function updateUser(id: number, data: UserForm) {return request({url: "/api/v1/users/" + id,method: "put",data: data,});
}
/*** 修改用戶狀態** @param id* @param status*/
export function updateUserStatus(id: number, status: number) {return request({url: "/api/v1/users/" + id + "/status",method: "patch",params: { status: status },});
}
/*** 刪除用戶** @param ids*/
export function deleteUsers(ids: string) {return request({url: "/api/v1/users/" + ids,method: "delete",});
}
/*** 下載用戶導入模板** @returns*/
export function downloadTemplateApi() {return request({url: "/api/v1/users/template",method: "get",responseType: "arraybuffer",});
}/*** 導出用戶** @param queryParams* @returns*/
export function exportUser(queryParams: UserQuery) {return request({url: "/api/v1/users/_export",method: "get",params: queryParams,responseType: "arraybuffer",});
}/*** 導入用戶** @param file*/
export function importUser(deptId: number, file: File) {const formData = new FormData();formData.append("file", file);return request({url: "/api/v1/users/_import",method: "post",params: { deptId: deptId },data: formData,headers: {"Content-Type": "multipart/form-data",},});
}

5. 文件 type.js

/*** 用戶查詢對象類型*/
export interface UserQuery {keywords?: string;status?: number;deptId?: number;
}/*** 登錄用戶信息*/
export interface UserInfo {userId: number;nickname: string;avatar: string;roles: string[];perms: string[];
}/*** 用戶表單類型*/
export interface UserForm {/*** 用戶頭像*/avatar?: string;/*** 部門ID*/deptId?: number;/*** 郵箱*/email?: string;/*** 性別*/gender?: number;/*** 用戶ID*/id?: number;mobile?: string;/*** 昵稱*/nickname?: string;/*** 角色ID集合*/roleIds?: number[];/*** 用戶狀態(1:正常;0:禁用)*/status?: number;/*** 用戶名*/username?: string;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40292.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jenkins使用

安裝插件 maven publish over ssh publish over ssh 會將打包后的jar包&#xff0c;通過ssh推送到指定的服務器上&#xff0c;&#xff0c;在jenkins中設置&#xff0c;推送后腳本&#xff0c;實現自動部署jar包&#xff0c;&#xff0c; 裝了這個插件之后&#xff0c;可以在項…

非計算機科班背景者順利轉碼計算機領域:策略與前景展望

方向一&#xff1a;如何規劃才能實現轉碼&#xff1f; 對于非計算機科班背景的人想要順利轉碼進入計算機領域&#xff0c;規劃是至關重要的。以下是一些建議&#xff0c;可以幫助你在轉碼過程中更加順利&#xff1a; 自我評估和目標設定&#xff1a; 首先&#xff0c;你需要明…

Weak Session IDs (弱會話)

Weak Session IDs (弱會話) 當用戶登錄后&#xff0c;在服務器就會創建一個會話(session)&#xff0c;叫做會話控制&#xff0c;接著訪問頁面的時候就不用登錄&#xff0c;只需要攜帶Sesion去訪問。 sessionID作為特定用戶訪問站點所需要的唯一內容。如果能夠計算或輕易猜到該…

深入理解 Flutter 圖片加載原理

作者&#xff1a;京東零售 徐宏偉 來源&#xff1a;京東云開發者社區 前言 隨著Flutter穩定版本逐步迭代更新&#xff0c;京東APP內部的Flutter業務也日益增多&#xff0c;Flutter開發為我們提供了高效的開發環境、優秀的跨平臺適配、豐富的功能組件及動畫、接近原生的交互體驗…

用對角線去遍歷矩陣

聲明 該系列文章僅僅展示個人的解題思路和分析過程&#xff0c;并非一定是優質題解&#xff0c;重要的是通過分析和解決問題能讓我們逐漸熟練和成長&#xff0c;從新手到大佬離不開一個磨練的過程&#xff0c;加油&#xff01; 原題鏈接 用對角線遍歷矩陣https://leetcode.c…

wsl2(debian)安裝python的不同版本例如3.8

要在Debian上安裝 Python 3.8&#xff0c;可以按照以下步驟操作&#xff1a; 1.確保你的 Debian 系統已經更新到最新版本&#xff0c;可以使用以下命令更新&#xff1a; sudo apt update sudo apt upgrade2.安裝 Python 3.8 的依賴項&#xff0c;以及構建 Python 時需要的工具…

django中實現事務的幾種方式

1.實現事務的三種方式 1.1 全局開啟事務---> 全局開啟事務&#xff0c;綁定的是http請求響應整個過程 DATABASES {default: {#全局開啟事務&#xff0c;綁定的是http請求響應整個過程ATOMIC_REQUESTS: True, }} from django.db import transaction# 局部禁用事務 transac…

數據結構——棧(C語言)

需求&#xff1a;無 棧的概念&#xff1a; 棧&#xff1a;一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。進行數據插入和刪除操作的一端稱為棧頂&#xff0c;另一端為棧底。棧中的數據元素遵守后進先出&#xff08;LIFO&#xff09;原則。壓棧&…

GPIO 配置 和 PINCTRL有啥區別

GPIO&#xff08;通用輸入/輸出&#xff09;和 PINCTRL&#xff08;引腳控制器&#xff09;是在嵌入式系統中用于管理和控制硬件引腳的關鍵概念。它們在硬件層面上起著不同的作用。 GPIO配置&#xff1a; GPIO 是一種通用的硬件接口&#xff0c;用于控制和讀取數字信號。每個 …

自動駕駛——駛向未來的革命性技術

自動駕駛——駛向未來的革命性技術 自動駕駛的組件自動駕駛的優勢自動駕駛的應用自動駕駛的未來中國的自動駕駛 自動駕駛是一種技術&#xff0c;它允許車輛在沒有人類駕駛員的情況下自主地進行行駛。它利用各種傳感器、計算機視覺、人工智能和機器學習算法來感知和理解周圍環境…

.net連接mysql,提示找不到請求的 .Net Framework Data Provider。可能沒有安裝

開發完成的.net程序需要連接mysql數據庫&#xff0c;在個人電腦上運行沒問題&#xff0c;別人運行時提示“提示找不到請求的 .Net Framework Data Provider。可能沒有安裝”。經過查詢&#xff0c;安裝Connector/NET 8.1.0&#xff0c;下載地址如下所示&#xff1a; https://d…

Linux touch 命令指南大全

1. 概述 在本教程中,我們將學習touch命令。簡而言之,這個命令允許我們更新文件或目錄的最后修改時間和最后訪問時間。 因此,我們將重點關注如何使用該命令及其各種選項。 請注意,我們使用 Bash 測試了此處顯示的所有命令;但是,它們應該與任何兼容 POSIX 的 shell 一起使…

使用騰訊云輕量服務器Matomo應用模板建網站流量統計系統

騰訊云百科分享使用騰訊云輕量應用服務器Matomo應用模板搭建網站流量統計系統&#xff0c;Matomo 是一款開源的網站數據統計軟件&#xff0c;可以用于跟蹤、分析您的網站的流量&#xff0c;同時充分保障數據安全性、隱私性。該鏡像基于 CentOS 7.6 64位操作系統&#xff0c;已預…

postgresql字段被截斷問題

前言 最近遇到一個問題就是字段名過長&#xff0c;會被pg給截斷&#xff0c;導致原始字段和下游用的的字段不一樣&#xff0c;就會報錯。當然&#xff0c;小伙伴可能會說為什么會用那么長的字段名&#xff0c;每個應用程序里面處理不一樣&#xff0c;我們數據字段每次被使用就…

06-加密算法

加密算法 一、前言知識1、加密解密2、MD5&#xff08;最常見&#xff09;3、SHA4、進制5、時間戳6、URL編碼7、base64編碼8、unescape編碼9、AES加密10、DES&#xff08;類似于base64&#xff09; 二、常見加密形式算法解析三、演示案例1、某 CTF 比賽題目解析2、某 CMS 密碼加…

爆肝整理,Python自動化測試-Pytest參數化實戰封裝,一篇打通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 參數化&#xff1…

uniapp案例30余種實戰項目

uniapp案例30余種實戰項目 mpvue框架仿滴滴出行didi-masteruni-app自定義導航欄title-customvue-mpvue-ChatRobot聊天機器人vue-mpvue-ChatRobot-master一款播課類小程序, 基于 mpvue 構建mp-podcast-mpvue-mastermpVue高仿美團小程序教程mpvue-meituan-masteruni-app 二維碼生…

【RS485 - 為什么要接收端計算時間偏移量】

我以前一直以為計算機等的信號傳輸速率都是非常快的&#xff0c;不用計算時間差。 然而在實際應用中發現信息是需要傳輸時間的&#xff0c;而這些時間somehow是可以計算的。 前提信息 波特率 9600&#xff1b; 控制器和執行器通過RS485通信&#xff1b; 控制器發出同步的命令…

spring框架,以及和spring框架相關的Java面試題和spring ioc的注入方式

目錄 一.spring來源&#xff0c;以及介紹 1.spring誕生的背景 2.spring框架 介紹 3.spring框架在使用中的優點以及不足 3.1優點 3.2不足 3.3總結 4.為什么要使用spring 二.將spring框架部署在IDEA中 1.替換pom.xml 2.構建spring所需要的xml文件 三.spring的三種注入…

網絡通信原理IP頭部格式(第四十二課)

字段作用解析:1)版本: 指的IP地址的版本 (IPv4 或 IPV6)2)首部長度: 次數據包的首部長度一共是多少,沒有加可選項3)優先級與服務類型:表示****數據包是否需要優選傳遞4)總長度: 表示的是整個數據包的大小,也就****是首部+數據5)標識符、標志、段偏移量:的作用將拆開的…