/** * API 辅助函数 * 提供类型安全的请求包装和通用错误处理 */ import type { AxiosRequestConfig } from 'axios' import type { ApiResponse } from '@/shared/types/types' import { apiClient } from './client' /** * 包装 API 请求,自动解包响应数据 */ export async function request(config: AxiosRequestConfig): Promise { const response = await apiClient.request>(config) return response.data.data } /** * GET 请求 */ export async function get(url: string, config?: AxiosRequestConfig): Promise { return request({ ...config, method: 'GET', url }) } /** * POST 请求 */ export async function post( url: string, data?: unknown, config?: AxiosRequestConfig ): Promise { return request({ ...config, method: 'POST', url, data }) } /** * PUT 请求 */ export async function put(url: string, data?: unknown, config?: AxiosRequestConfig): Promise { return request({ ...config, method: 'PUT', url, data }) } /** * DELETE 请求 */ export async function del(url: string, config?: AxiosRequestConfig): Promise { return request({ ...config, method: 'DELETE', url }) } /** * PATCH 请求 */ export async function patch( url: string, data?: unknown, config?: AxiosRequestConfig ): Promise { return request({ ...config, method: 'PATCH', url, data }) } /** * 静默请求 (不显示错误提示) */ export async function silentRequest(config: AxiosRequestConfig): Promise { return request({ ...config, silent: true }) } /** * 带重试的请求 */ export async function requestWithRetry( config: AxiosRequestConfig, maxRetries = 3, retryDelay = 1000 ): Promise { let lastError: Error | null = null for (let attempt = 0; attempt <= maxRetries; attempt++) { try { return await request(config) } catch (error) { lastError = error as Error // 最后一次尝试,不再重试 if (attempt === maxRetries) { throw error } // 等待后重试 await new Promise(resolve => setTimeout(resolve, retryDelay * (attempt + 1))) } } throw lastError } /** * 并发请求 */ export async function concurrent( requests: readonly [...{ [K in keyof T]: Promise }] ): Promise { return Promise.all(requests) as Promise } /** * 串行请求 (按顺序执行) */ export async function sequential(requestFns: Array<() => Promise>): Promise { const results: T[] = [] for (const requestFn of requestFns) { const result = await requestFn() results.push(result) } return results } /** * 导出所有辅助函数 */ export const api = { request, get, post, put, delete: del, patch, silent: silentRequest, retry: requestWithRetry, concurrent, sequential, } export default api