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
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
|
|
|