import type { $Fetch } from "ofetch"; import { useRuntimeConfig, useRouter } from "#app"; // 引入 useRouter import { ofetch } from "ofetch"; type RequestStatusErrorHandler = (message: string, statusCode: number) => void; let requestStatusErrorHandler: RequestStatusErrorHandler; let request: $Fetch; export function setupRequest() { if (request) return request; const config = useRuntimeConfig(); const baseURL = config.public.apiBase as string; request = ofetch.create({ baseURL, headers: { "Content-Type": "application/json" }, async onRequest({ options }) { const token = useCookie("token").value; if (token) { options.headers = { ...options.headers, ...(token && { Authorization: `${token}` }), // 确保 token 被添加到 headers } } }, async onResponseError({ response }) { const { message } = response._data; console.log(response._data) if (response._data.statusCode == 500) { const router = useRouter(); router.push('/login'); // 跳转到登录页面 showFailToast('连接失败,请联系在线客服') } // 检查状态码并处理跳转 if (Array.isArray(message)) { message.forEach((item) => { requestStatusErrorHandler?.(item, response.status); }); } else { requestStatusErrorHandler?.(message, response.status); } return Promise.reject(response._data); }, retry: 3, retryDelay: 1000, }); } export function injectRequestStatusErrorHandler( handler: RequestStatusErrorHandler ) { requestStatusErrorHandler = handler; } export function getRequest() { if (!request) { throw new Error("Request client not initialized. Call setupRequest first."); } return request; } // 封装 GET 请求 export const get = async (url: string, params: Record<string, any> = {}) => { const response = await getRequest()(url, { method: "GET", params, }); return handleResponse(response); }; // 封装 POST 请求 export const post = async (url: string, data: Record<string, any> = {}) => { const response = await getRequest()(url, { method: "POST", body: data, }); return handleResponse(response); }; // 封装 PUT 请求 export const put = async (url: string, data: Record<string, any> = {}) => { const response = await getRequest()(url, { method: "PUT", body: data, }); return handleResponse(response); }; // 封装 DELETE 请求 export const del = async (url: string, data: Record<string, any> = {}) => { const response = await getRequest()(url, { method: "DELETE", body: data, }); return handleResponse(response); }; // 处理响应对象 const handleResponse = (response) => { if (response.code === 401) { const router = useRouter(); router.push('/login'); // 跳转到登录页面 } if (response && response.data) { return response; // 返回处理后的数据 } return response; // 如果没有数据,直接返回响应 }; export default request;