import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; import { message } from 'ant-design-vue'; import axios, { AxiosError } from 'axios'; export interface ResopnseType { reason: string; message: string; data: T; ts: string; } // export const YCODE_BASEURL: string = import.meta.env.VITE_YCODE_BASEURL; // https://custom-chart-pre-api.shiyue.com export const YCODE_BASEURL: string = 'https://custom-chart-pre-api.shiyue.com'; const requestType = { base: YCODE_BASEURL, }; const baseAxios: AxiosInstance = axios.create({ baseURL: '', timeout: 100_000, withCredentials: true, }); const errorHandle = (error: AxiosError) => { if (error.response) { const status = error.response?.status; switch (status) { case 401: { message.warning('请先登录'); window.location.href = `${YCODE_BASEURL}/login?redirect=${encodeURIComponent(window.location.href)}`; break; } case 403: { message.warning('权限不足'); break; } case 500: { message.warning('服务器出错了…… (>_<)'); break; } default: { message.warning('服务器出错了…… (>_<)'); break; } } return Promise.reject(error); } message.error(error.message); return Promise.reject(error); }; // 响应拦截器 baseAxios.interceptors.response.use((response: AxiosResponse) => { const { data, status } = response; if (status !== 200) { return Promise.reject(data); } if (data.code) { if (data.code === 200) { return data; } else { message.warning(data.message); return Promise.reject(data); } } }, errorHandle); type RequestConfig = Omit & { baseURL?: keyof typeof requestType; }; const request = (config: RequestConfig) => { const host = requestType[config.baseURL || 'base']; return new Promise((resolve, reject) => { baseAxios .request({ ...config, baseURL: host }) .then((res: T) => { resolve(res); }) .catch((error: unknown) => { reject(error); }); }); }; const get = (config?: RequestConfig) => { return request>({ ...config, method: 'GET', }); }; const post = (config?: RequestConfig) => request>({ ...config, method: 'POST', }); const put = (config?: RequestConfig) => request>({ ...config, method: 'PUT', headers: { 'Content-Type': 'application/json', }, }); const del = (config?: { url: string }) => request>({ ...config, method: 'DELETE' }); export { baseAxios, del, get, post, put, request };