request.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. // src/utils/request.ts
  2. import axios from 'axios'
  3. import { ElMessage } from 'element-plus'
  4. import type { AxiosInstance, AxiosResponse } from 'axios'
  5. // 创建 axios 实例
  6. const service: AxiosInstance = axios.create({
  7. baseURL: import.meta.env.VITE_API_BASE_URL || '', // 从环境变量中读取
  8. timeout: 100000000, // 超时时间
  9. withCredentials: true // 是否允许携带 cookie
  10. })
  11. // 请求拦截器
  12. service.interceptors.request.use(
  13. (config) => {
  14. // 可在此添加 token 到 headers 中
  15. const token = localStorage.getItem('token')
  16. if (token) {
  17. config.headers!['Authorization'] = `${token}`
  18. }
  19. return config
  20. },
  21. (error) => {
  22. // 请求错误处理
  23. console.error('请求错误:', error)
  24. return Promise.reject(error)
  25. }
  26. )
  27. // 响应拦截器
  28. service.interceptors.response.use(
  29. (response: AxiosResponse) => {
  30. const res = response.data
  31. if(res.code !== 200){
  32. if(res.code == 406 && res.data.message){
  33. ElMessage.warning(res.data.message)
  34. }else{
  35. ElMessage.warning(res.msg)
  36. }
  37. }
  38. /*
  39. if (res.code !== 200) {
  40. ElMessage({
  41. message: res.msg || '请求失败',
  42. type: 'error',
  43. duration: 5 * 1000,
  44. })
  45. // 特殊状态码处理,如 token 失效等
  46. if (res.code === 401) {
  47. // 跳转登录页
  48. // window.location.href = '/'
  49. }
  50. return Promise.reject(res.msg || '请求失败')
  51. }
  52. */
  53. return res
  54. },
  55. (error) => {
  56. // 网络错误、超时等处理
  57. let message = ''
  58. if (axios.isCancel(error)) {
  59. console.log(axios.isCancel(error))
  60. message = ''
  61. }else{
  62. message = error.message.includes('timeout') ? '请求超时' : '网络异常'
  63. }
  64. if(message){
  65. ElMessage({
  66. message,
  67. type: 'error',
  68. })
  69. }
  70. return Promise.reject(error)
  71. }
  72. )
  73. export default service