yanjinhui
10 天以前 c5de0d98241f8c8349fa38851b77efcfc61e4d26
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import axios, { AxiosError } from 'axios'
import { defaultRequestInterceptors, defaultResponseInterceptors } from './config'
 
import { AxiosInstance, InternalAxiosRequestConfig, RequestConfig, AxiosResponse } from './types'
import { ElMessage } from 'element-plus'
import { REQUEST_TIMEOUT } from '@/constants'
import router from '@/router'
// import { useUserStore } from '@/store/modules/user'
 
// const userStore = useUserStore()
 
export const PATH_URL = import.meta.env.VITE_API_BASE_PATH
// const router = useRouter()
const abortControllerMap: Map<string, AbortController> = new Map()
 
const axiosInstance: AxiosInstance = axios.create({
  timeout: REQUEST_TIMEOUT,
  baseURL: 'http://127.0.0.1:1596'
})
// 'http://192.168.1.103:9090' //上线地址
// 'http://192.168.0.80:1596'
axiosInstance.interceptors.request.use((res: InternalAxiosRequestConfig) => {
  const controller = new AbortController()
  const url = res.url || ''
  res.signal = controller.signal
  abortControllerMap.set(
    import.meta.env.VITE_USE_MOCK === 'true' ? url.replace('/mock', '') : url,
    controller
  )
  const token =
    JSON.parse(localStorage.getItem('user')) && JSON.parse(localStorage.getItem('user')).userInfo
      ? JSON.parse(localStorage.getItem('user')).userInfo.token
      : ''
  if (token) {
    // 将 token 添加到请求头
    res.headers['Authorization'] = `Bearer ${token}`
  }
  return res
})
 
axiosInstance.interceptors.response.use(
  (res: AxiosResponse) => {
    const url = res.config.url || ''
    abortControllerMap.delete(url)
    // 这里不能做任何处理,否则后面的 interceptors 拿不到完整的上下文了
    return res.data || res
  },
  (error: AxiosError) => {
    console.log(error, 'error.response')
    let httpMessage = ''
    if (error.response) {
      if (error.response.status == '401') {
        if (error.response.data && error.response.data.code == 401) {
          if (!localStorage.getItem('user')) {
            Message.error({
              showClose: true,
              message: '登录已过期,请重新登录',
              type: 'error'
            })
          }
          // 登录过期,跳转到登录页面
          ElMessage.error('登录已过期,请重新登录')
          setTimeout(() => {
            router.replace('/login')
          }, 1000)
 
          return
        }
      }
    } else {
      httpMessage = '服务器处理异常'
    }
    return Promise.reject(error.response || {})
  }
)
 
axiosInstance.interceptors.request.use(defaultRequestInterceptors)
axiosInstance.interceptors.response.use(defaultResponseInterceptors)
 
const service = {
  request: (config: RequestConfig) => {
    return new Promise((resolve, reject) => {
      if (config.interceptors?.requestInterceptors) {
        config = config.interceptors.requestInterceptors(config as any)
      }
 
      axiosInstance
        .request(config)
        .then((res) => {
          console.log(res, 'res')
 
          resolve(res)
        })
        .catch((err: any) => {
          reject(err)
        })
    })
  },
  cancelRequest: (url: string | string[]) => {
    const urlList = Array.isArray(url) ? url : [url]
    for (const _url of urlList) {
      abortControllerMap.get(_url)?.abort()
      abortControllerMap.delete(_url)
    }
  },
  cancelAllRequest() {
    for (const [_, controller] of abortControllerMap) {
      controller.abort()
    }
    abortControllerMap.clear()
  }
}
 
export default service