|
@@ -1,11 +1,10 @@
|
|
|
import axios, { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
|
|
import axios, { AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
|
|
|
import { useUserStore } from '@/store/modules/user'
|
|
import { useUserStore } from '@/store/modules/user'
|
|
|
import { ApiStatus } from './status'
|
|
import { ApiStatus } from './status'
|
|
|
-import { HttpError, handleError, showError, showSuccess } from './error'
|
|
|
|
|
|
|
+import { HttpError, handleError, showError, showSuccess } from './server.error'
|
|
|
import { $t } from '@/locales'
|
|
import { $t } from '@/locales'
|
|
|
|
|
|
|
|
/** 请求配置常量 */
|
|
/** 请求配置常量 */
|
|
|
-const REQUEST_TIMEOUT = 15000
|
|
|
|
|
const LOGOUT_DELAY = 500
|
|
const LOGOUT_DELAY = 500
|
|
|
const MAX_RETRIES = 0
|
|
const MAX_RETRIES = 0
|
|
|
const RETRY_DELAY = 1000
|
|
const RETRY_DELAY = 1000
|
|
@@ -25,7 +24,7 @@ const { VITE_API_URL, VITE_WITH_CREDENTIALS } = import.meta.env
|
|
|
|
|
|
|
|
/** Axios实例 */
|
|
/** Axios实例 */
|
|
|
const axiosInstance = axios.create({
|
|
const axiosInstance = axios.create({
|
|
|
- timeout: REQUEST_TIMEOUT,
|
|
|
|
|
|
|
+ timeout: 5000,
|
|
|
baseURL: VITE_API_URL,
|
|
baseURL: VITE_API_URL,
|
|
|
withCredentials: VITE_WITH_CREDENTIALS === 'true',
|
|
withCredentials: VITE_WITH_CREDENTIALS === 'true',
|
|
|
validateStatus: (status) => status >= 200 && status < 300,
|
|
validateStatus: (status) => status >= 200 && status < 300,
|
|
@@ -115,20 +114,11 @@ function logOut() {
|
|
|
|
|
|
|
|
/** 是否需要重试 */
|
|
/** 是否需要重试 */
|
|
|
function shouldRetry(statusCode: number) {
|
|
function shouldRetry(statusCode: number) {
|
|
|
- return [
|
|
|
|
|
- ApiStatus.requestTimeout,
|
|
|
|
|
- ApiStatus.internalServerError,
|
|
|
|
|
- ApiStatus.badGateway,
|
|
|
|
|
- ApiStatus.serviceUnavailable,
|
|
|
|
|
- ApiStatus.gatewayTimeout
|
|
|
|
|
- ].includes(statusCode)
|
|
|
|
|
|
|
+ return [ApiStatus.requestTimeout, ApiStatus.internalServerError, ApiStatus.badGateway, ApiStatus.serviceUnavailable, ApiStatus.gatewayTimeout].includes(statusCode)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/** 请求重试逻辑 */
|
|
/** 请求重试逻辑 */
|
|
|
-async function retryRequest<T>(
|
|
|
|
|
- config: ExtendedAxiosRequestConfig,
|
|
|
|
|
- retries: number = MAX_RETRIES
|
|
|
|
|
-): Promise<T> {
|
|
|
|
|
|
|
+async function retryRequest<T>(config: ExtendedAxiosRequestConfig, retries: number = MAX_RETRIES): Promise<T> {
|
|
|
try {
|
|
try {
|
|
|
return await request<T>(config)
|
|
return await request<T>(config)
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
@@ -148,11 +138,7 @@ function delay(ms: number) {
|
|
|
/** 请求函数 */
|
|
/** 请求函数 */
|
|
|
async function request<T = any>(config: ExtendedAxiosRequestConfig): Promise<T> {
|
|
async function request<T = any>(config: ExtendedAxiosRequestConfig): Promise<T> {
|
|
|
// POST | PUT 参数自动填充
|
|
// POST | PUT 参数自动填充
|
|
|
- if (
|
|
|
|
|
- ['POST', 'PUT'].includes(config.method?.toUpperCase() || '') &&
|
|
|
|
|
- config.params &&
|
|
|
|
|
- !config.data
|
|
|
|
|
- ) {
|
|
|
|
|
|
|
+ if (['POST', 'PUT'].includes(config.method?.toUpperCase() || '') && config.params && !config.data) {
|
|
|
config.data = config.params
|
|
config.data = config.params
|
|
|
config.params = undefined
|
|
config.params = undefined
|
|
|
}
|
|
}
|
|
@@ -192,11 +178,7 @@ const api = {
|
|
|
request<T>(config: ExtendedAxiosRequestConfig): Promise<T> {
|
|
request<T>(config: ExtendedAxiosRequestConfig): Promise<T> {
|
|
|
return retryRequest<T>({ ...config })
|
|
return retryRequest<T>({ ...config })
|
|
|
},
|
|
},
|
|
|
- upload<T = any>(
|
|
|
|
|
- url: string,
|
|
|
|
|
- data: Record<string, any> & { file: Blob | File },
|
|
|
|
|
- config?: ExtendedAxiosRequestConfig
|
|
|
|
|
- ): Promise<T> {
|
|
|
|
|
|
|
+ upload<T = any>(url: string, data: Record<string, any> & { file: Blob | File }, config?: ExtendedAxiosRequestConfig): Promise<T> {
|
|
|
const formData = new FormData()
|
|
const formData = new FormData()
|
|
|
|
|
|
|
|
Object.entries(data).forEach(([key, value]) => {
|
|
Object.entries(data).forEach(([key, value]) => {
|
|
@@ -211,10 +193,7 @@ const api = {
|
|
|
|
|
|
|
|
const finalConfig: ExtendedAxiosRequestConfig = {
|
|
const finalConfig: ExtendedAxiosRequestConfig = {
|
|
|
...config,
|
|
...config,
|
|
|
- headers: {
|
|
|
|
|
- 'Content-Type': 'multipart/form-data',
|
|
|
|
|
- ...config?.headers
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ headers: { 'Content-Type': 'multipart/form-data', ...config?.headers }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return retryRequest({
|
|
return retryRequest({
|