axiosInstance.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*
  2. * @Author: fxs bjnsfxs@163.com
  3. * @Date: 2024-08-20 17:18:52
  4. * @LastEditors: fxs bjnsfxs@163.com
  5. * @LastEditTime: 2024-10-15 11:53:42
  6. * @FilePath: \Game-Backstage-Management-System\src\utils\axios\axiosInstance.ts
  7. * @Description:
  8. *
  9. */
  10. // 引入axios
  11. import { ElMessage } from 'element-plus'
  12. import { useRequest } from '@/hooks/useRequest'
  13. import { MessageType } from '@/types/res'
  14. import { getToken, refreshToken, setToken, removeAllToeken } from '../token/token'
  15. import { setLoginState } from '../localStorage/localStorage'
  16. import axios from 'axios'
  17. import router from '@/router'
  18. const { baseURL } = useRequest()
  19. const errorCodeMsg: {
  20. [key: number]: string
  21. } = {
  22. 422: '请求缺少参数,请检查后重试'
  23. }
  24. // 创建axios实例
  25. const axiosInstance = axios.create({
  26. baseURL,
  27. headers: {
  28. Authorization: `${getToken()}`
  29. }
  30. })
  31. let isRefreshing = false // 是否正在刷新token
  32. let requestQueue: any[] = [] // 存储请求队列
  33. /**
  34. * @description: 未登录的情况下展示的信息
  35. * @param {*} ElMessage
  36. * @return {*}
  37. */
  38. const showUnloginInfo = (msg: string = '请先登录') => {
  39. ElMessage({
  40. type: MessageType.Warning,
  41. message: msg,
  42. duration: 1500
  43. })
  44. removeAllToeken()
  45. setLoginState(false)
  46. router.push('/login')
  47. }
  48. // 添加响应拦截器
  49. axiosInstance.interceptors.response.use(
  50. async function (response) {
  51. const { code } = response.data
  52. // -2是token为空的情况
  53. if (code === -2) {
  54. showUnloginInfo()
  55. }
  56. // -1是token过期的情况
  57. if (code === -1) {
  58. const config = response.config // 保存一下这一次的请求,等token刷新成功之后重新请求
  59. if (!isRefreshing) {
  60. isRefreshing = true
  61. return await refreshToken()
  62. .then((res) => {
  63. if (res.data.code === 0) {
  64. const token = JSON.parse(JSON.stringify(res.data.data.token))
  65. setToken(token)
  66. config.headers.Authorization = token // 将本次请求的token替换成新的token
  67. requestQueue.forEach((cb) => cb(token)) // 将队列中的请求重新发起
  68. requestQueue = []
  69. return axiosInstance(config)
  70. } else {
  71. showUnloginInfo('登录已过期,请重新登陆')
  72. }
  73. })
  74. .catch((err) => {
  75. console.log(err)
  76. showUnloginInfo('登录已过期,请重新登陆')
  77. })
  78. .finally(() => {
  79. isRefreshing = false
  80. })
  81. } else {
  82. // 如果正在刷新token,将本次请求加入队列,等token刷新成功之后重新发起请求
  83. return new Promise((resolve) => {
  84. requestQueue.push((token: string) => {
  85. config.headers.Authorization = token
  86. resolve(axiosInstance(config))
  87. })
  88. })
  89. }
  90. }
  91. return response.data
  92. },
  93. function (error) {
  94. let code = error.response.data.code
  95. let msg = errorCodeMsg[code] ?? '服务器错误,请稍后再试'
  96. // 对响应错误做点什么
  97. ElMessage({
  98. type: MessageType.Error,
  99. message: msg,
  100. duration: 1500
  101. })
  102. // console.log(error)
  103. // setLoginState(false)
  104. // router.push('/login')
  105. return Promise.reject(error)
  106. }
  107. )
  108. // 导出实例
  109. export default axiosInstance