import axios, { type AxiosInstance, } from 'axios' import type { ErrorResponse,ErrorResponseList } from '@/model/base' import { MessagePlugin } from 'tdesign-vue-next' import { useAppStore } from '@/stores/app' const client: AxiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_PREFIX, timeout: 1000 }) const handleError = (errorResponse: ErrorResponse) => { if (errorResponse.code === 401) { useAppStore().logout() MessagePlugin.error('登录信息失效,请重新登录') } else { MessagePlugin.error(errorResponse.message) } } client.interceptors.response.use( (response) => { return response }, (error) => { let errorResponse: ErrorResponse; if (Array.isArray(error.response.data)) { const errorResponseList = error.response.data as ErrorResponseList; errorResponse = errorResponseList[0]; } else { // 否则,将其视为单个 ErrorResponse errorResponse = error.response.data as ErrorResponse; } handleError(errorResponse) return Promise.reject(errorResponse) } ) client.interceptors.request.use((config) => { const appStore = useAppStore() config.headers.set('Authorization', 'Bearer ' + appStore.token) return config }) export default { get: async (url: string, params?: any) => { const response = await client.get(url, { params }) return response.data as T }, post: async (url: string, data: Record) => { const response = await client.post(url, data) return response.data as T }, delete: async (url: string,params?:any) => { await client.delete(url,{params}) }, put: async (url: string, data: Record = {}) => { const response = await client.put(url, data) return response.data as T }, // 增加文件上传的方法 uploadFile: async (url: string, file: File, data?: Record) => { const formData = new FormData() formData.append('file', file) // 如果有其他参数,添加到 FormData 中 if (data) { Object.keys(data).forEach((key) => { formData.append(key, data[key]) }) } const response = await client.post(url, formData, { headers: { 'Content-Type': 'multipart/form-data' } }) return response.data as T } }