1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// src/api/request.js
import axios from 'axios'
import { Message } from 'element-ui'
import router from '../router'
import i18n from '../language/index'
 
// // 本地调试
// const baseURL = '/api'
 
// 生产打包
const baseURL = (() => {
  const { protocol, hostname } = window.location;
  return `${protocol}//${hostname}:8080`; // 固定后端端口
})();
 
// 创建axios实例
const service = axios.create({
  baseURL,
  timeout: 100000
})
 
// 请求拦截器
service.interceptors.request.use(
  config => {
    // 可以在这里添加token等
    let token = sessionStorage.getItem("token")
    if (token) {
      config.headers['Authorization'] = token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)
 
// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    if (res.code == 401) {
      Message.error(i18n.t('error.unauthorized'))
      // 触发登出操作
      sessionStorage.removeItem('token')
      router.push('/login')
    } else {
      return res
    }
  },
  error => {
    console.error('请求错误:', error)
    let errorMessage = i18n.t('error.networkError')
    if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
      errorMessage = i18n.t('error.timeout')
      // 触发登出操作
      sessionStorage.removeItem('token')
      router.push('/login')
    } else if (error.response) {
      const status = error.response.status
      switch (status) {
        case 500:
          errorMessage = i18n.t('error.serverError')
          // 触发登出操作
          sessionStorage.removeItem('token')
          router.push('/login')
          break
        case 404:
          errorMessage = i18n.t('error.notFound')
          break
        case 401:
          errorMessage = i18n.t('error.unauthorized')
          // 触发登出操作
          sessionStorage.removeItem('token')
          router.push('/login')
          break
        default:
          errorMessage = i18n.t('error.unknownError') + `: ${status}`
      }
 
      if (error.response.data && error.response.data.message) {
        errorMessage = error.response.data.message
      }
    } else if (error.request) {
      errorMessage = i18n.t('error.noResponse')
    }
    Message.error(errorMessage)
    return Promise.reject(error)
  }
)
 
export default service