123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*
- * @Author: fxs bjnsfxs@163.com
- * @Date: 2024-08-20 17:18:52
- * @LastEditors: fxs bjnsfxs@163.com
- * @LastEditTime: 2024-10-15 11:53:42
- * @FilePath: \Game-Backstage-Management-System\src\utils\axios\axiosInstance.ts
- * @Description:
- *
- */
- // 引入axios
- import { ElMessage } from 'element-plus'
- import { useRequest } from '@/hooks/useRequest'
- import { MessageType } from '@/types/res'
- import { getToken, refreshToken, setToken, removeAllToeken } from '../token/token'
- import { setLoginState } from '../localStorage/localStorage'
- import axios from 'axios'
- import router from '@/router'
- const { baseURL } = useRequest()
- const errorCodeMsg: {
- [key: number]: string
- } = {
- 422: '请求缺少参数,请检查后重试'
- }
- // 创建axios实例
- const axiosInstance = axios.create({
- baseURL,
- headers: {
- Authorization: `${getToken()}`
- }
- })
- let isRefreshing = false // 是否正在刷新token
- let requestQueue: any[] = [] // 存储请求队列
- /**
- * @description: 未登录的情况下展示的信息
- * @param {*} ElMessage
- * @return {*}
- */
- const showUnloginInfo = (msg: string = '请先登录') => {
- ElMessage({
- type: MessageType.Warning,
- message: msg,
- duration: 1500
- })
- removeAllToeken()
- setLoginState(false)
- router.push('/login')
- }
- // 添加响应拦截器
- axiosInstance.interceptors.response.use(
- async function (response) {
- const { code } = response.data
- // -2是token为空的情况
- if (code === -2) {
- showUnloginInfo()
- }
- // -1是token过期的情况
- if (code === -1) {
- const config = response.config // 保存一下这一次的请求,等token刷新成功之后重新请求
- if (!isRefreshing) {
- isRefreshing = true
- return await refreshToken()
- .then((res) => {
- if (res.data.code === 0) {
- const token = JSON.parse(JSON.stringify(res.data.data.token))
- setToken(token)
- config.headers.Authorization = token // 将本次请求的token替换成新的token
- requestQueue.forEach((cb) => cb(token)) // 将队列中的请求重新发起
- requestQueue = []
- return axiosInstance(config)
- } else {
- showUnloginInfo('登录已过期,请重新登陆')
- }
- })
- .catch((err) => {
- console.log(err)
- showUnloginInfo('登录已过期,请重新登陆')
- })
- .finally(() => {
- isRefreshing = false
- })
- } else {
- // 如果正在刷新token,将本次请求加入队列,等token刷新成功之后重新发起请求
- return new Promise((resolve) => {
- requestQueue.push((token: string) => {
- config.headers.Authorization = token
- resolve(axiosInstance(config))
- })
- })
- }
- }
- return response.data
- },
- function (error) {
- let code = error.response.data.code
- let msg = errorCodeMsg[code] ?? '服务器错误,请稍后再试'
- // 对响应错误做点什么
- ElMessage({
- type: MessageType.Error,
- message: msg,
- duration: 1500
- })
- // console.log(error)
- // setLoginState(false)
- // router.push('/login')
- return Promise.reject(error)
- }
- )
- // 导出实例
- export default axiosInstance
|