import axios, { AxiosInstance, AxiosError, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from "axios"; import { showFailToast } from 'vant' import type { IResultData } from '@/types/api/index' import { getStorage } from './authStorage' enum RequestEnums { TIME_OUT = 20000, SUCCESS = 200, CODE = 0 } const baseConfig = { baseURL: import.meta.env.VITE_BASE_URL, timeout: RequestEnums.TIME_OUT, withCredentials: true } interface IRequestClass { service: AxiosInstance } class RequestHttp implements IRequestClass { service: AxiosInstance; constructor(config: AxiosRequestConfig) { this.service = axios.create(config) this.service.interceptors.request.use((config: InternalAxiosRequestConfig) => { if (!!config.headers!.isToken && getStorage()) { config.headers!['X-token'] = getStorage() } if (!config.headers['Content-Type']) { config.headers['Content-Type'] = 'application/x-www-form-urlencoded' } return Promise.resolve(config) }, (error: AxiosError) => { showFailToast(error) // 请求报错 Promise.reject(error) }) this.service.interceptors.response.use((response: AxiosResponse) => { const { msg, code, error } = response.data console.log(response.data) if (response.status === 302) { window.localStorage.clear() window.location.href = `/login?redirect=${window.location.pathname}` return Promise.reject(msg) } if (response.status === 404) { showFailToast(error) return Promise.reject(msg) } if (code !== RequestEnums.CODE) { showFailToast(msg) return Promise.reject(msg) } return Promise.resolve(response.data) }, (error: AxiosError) => { showFailToast(error) return Promise.reject(error) }) } get(url: string, params?: Object): Promise> { return this.service.get(url, { params }) } post(url: string, data: object): Promise> { return this.service.post(url, data); } put(url: string, data?: object): Promise> { return this.service.put(url, data); } delete(url: string, data?: object): Promise> { return this.service.delete(url, data); } } export default new RequestHttp(baseConfig)