qa_portal_vue/app/composables/useRequest.ts

117 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 请求封装 - 基于 useFetch 二次封装
* 提供统一的请求配置、错误处理、Loading 状态等
*/
import type { UseFetchOptions } from "nuxt/app";
/**
* 请求配置选项 - 继承 Nuxt UseFetchOptions 并添加自定义选项
*/
export type RequestOptions<DataT = any> = UseFetchOptions<DataT, DataT> & {
/** 是否显示加载状态 */
showLoading?: boolean
/** 成功提示信息 */
successMsg?: string
/** 错误提示信息 */
errorMsg?: string
/** 是否手动触发 */
manual?: boolean
}
/**
* 封装后的请求方法
* @param url - 请求地址
* @param options - 请求配置
*/
export function useRequest<DataT = any, ErrorT = any>(url: string, options: RequestOptions<DataT> = {}) {
const config = useRuntimeConfig();
const {
// showLoading = false,
successMsg = "",
errorMsg = "",
manual = false,
...restOptions
} = options;
// 计算完整 URL
const fullUrl = computed(() => config.public.apiBaseUrl + url);
// 显示成功提示
const showSuccessTip = (msg: string) => {
if (msg) {
console.log(`[Success] ${msg}`);
}
};
// 显示错误提示
const showErrorTip = (msg: string, err?: any) => {
if (msg || errorMsg) {
const tip = msg || errorMsg || (err as Error)?.message || "请求失败";
console.error(`[Error] ${tip}`, err);
}
};
// 使用 useFetch 发起请求
const { data, error, execute, ...rest } = useFetch<DataT, ErrorT>(fullUrl, {
...restOptions,
// 请求完成后的回调
onResponse({ response }: any) {
if (showSuccessTip && response.ok) {
showSuccessTip(successMsg);
}
},
// 请求出错后的回调
onResponseError({ error }: any) {
showErrorTip(errorMsg, error);
},
} as any);
// 手动执行函数
const run = async () => {
await execute();
return { data: data.value, error: error.value };
};
// 立即执行(如果 manual 为 false
if (!manual) {
void execute();
}
return {
data,
error,
execute: run,
...rest,
};
}
/**
* GET 请求
*/
export function useGet<DataT = any, ErrorT = any>(url: string, options: RequestOptions<DataT> = {}) {
return useRequest<DataT, ErrorT>(url, { ...options, method: "get" });
}
/**
* POST 请求
*/
export function usePost<DataT = any, ErrorT = any>(url: string, options: RequestOptions<DataT> = {}) {
return useRequest<DataT, ErrorT>(url, { ...options, method: "post" });
}
/**
* PUT 请求
*/
export function usePut<DataT = any, ErrorT = any>(url: string, options: RequestOptions<DataT> = {}) {
return useRequest<DataT, ErrorT>(url, { ...options, method: "put" });
}
/**
* DELETE 请求
*/
export function useDelete<DataT = any, ErrorT = any>(url: string, options: RequestOptions<DataT> = {}) {
return useRequest<DataT, ErrorT>(url, { ...options, method: "delete" });
}