You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

124 lines
3.4 KiB

import axios from 'axios'
import { ElMessage } from 'element-plus'
import store from '@/stores'
const mode = import.meta.env.MODE
console.log('mode',mode)
let app_base_api = import.meta.env.VITE_API_BASE_URL
if(mode == 'prod'){
app_base_api = systemConfig.baseUrl
}
// create an axios instance
const service = axios.create({
baseURL: app_base_api, // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 120 * 1000 // request timeout
})
// request interceptor
service.interceptors.request.use(
(config) => {
// do something before request is sent
let userStore=store.userStore();
if (userStore.state.token) {
// let each request carry token
// ['X-Token'] is a custom headers key
// please modify it according to the actual situation
config.headers['Authorization'] ="Bearer "+ userStore.state.token
config.headers['X-Authorization'] ="Bearer "+ userStore.state.refreshToken
}
return config
},
(error) => {
// do something with request error
console.log(error) // for debug
return Promise.reject(error)
}
)
// 是否在刷新Token标记
let isRefreshingToken=false
// 刷新时后续的请求队列
let requestList = []
// response interceptor
service.interceptors.response.use(
/**
* If you want to get http information such as headers or status
* Please return response => response
*/
/**
* Determine the request status by custom code
* Here is just an example
* You can also judge the status by HTTP Status Code
*/
async (response) => {
if (response.status === 200) {
const res = response.data
//下载文件
if(res instanceof Blob){
return response
}
// 1 是正确 .
if (res.code != 1) {
//报错
ElMessage({
message: res.message || 'Error',
type: 'error',
duration: 5 * 1000
})
return Promise.reject(new Error(res.message || 'Error'))
} else {
return res
}
} else {
return Promise.reject(new Error(response.statusText || 'Error'))
}
},
async (error) => {
if(error.status===401){
if(!isRefreshingToken){
// 修改isRefreshing状态
isRefreshingToken = true
await store.userStore().reLogin()
.catch(async err=>{
debugger
//重新到登录页
store.userStore().resetAllToken()
window.location.href="/login"
return Promise.reject(err)
})
// 重置状态
isRefreshingToken = false
// token 刷新后将数组里的请求队列方法重新执行
requestList.forEach((it) => it())
// 重新请求完清空
requestList = []
// 继续未完成的请求
const resp = await service.request(error.config)
// 返回请求结果
return Promise.resolve(resp)
}else{
// 后面的请求走这里排队
// 返回未执行 resolve 的 Promise
return new Promise(resolve => {
// 用函数形式将 resolve 存入,等待获取新token后再执行
requestList.push(() => {
resolve(service(error.config))
})
})
}
}else{
console.log('err' + error) // for debug
ElMessage({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
}
)
export default service