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
|