/**
* API 响应处理辅助工具
* 提供统一的数据处理方法,简化业务代码
*/
// 定义基础类型
type ApiResponseData = unknown;
type PageInfo = {
totalCount?: number;
[key: string]: unknown;
};
/**
* 处理列表数据响应
* @param data API响应数据
* @returns 处理后的列表数据和分页信息
*/
export function processListResponse<T = Record<string, unknown>>(data: ApiResponseData): {
list: T[];
total: number;
page?: PageInfo;
} {
// 处理不同的响应格式
if (data && typeof data === 'object' && data !== null && 'data' in data && 'page' in data) {
// 包含分页信息的响应
const response = data as { data: unknown; page: PageInfo };
const list = Array.isArray(response.data) ? response.data : [];
const total = response.page?.totalCount || list.length;
return { list, total, page: response.page };
} else if (Array.isArray(data)) {
// 直接返回数组的响应(无分页信息)
return { list: data, total: data.length };
} else {
// 其他格式,返回空数组
return { list: [], total: 0 };
}
}
/**
* 标准的删除操作处理
* @param apiCall API调用函数
* @param onSuccess 成功后的回调函数
* @param confirmMessage 确认消息(可选)
*/
export async function handleDeleteOperation(
apiCall: () => Promise<unknown>,
onSuccess: () => void,
confirmMessage: string = '确认删除吗?'
): Promise<void> {
const { ElMessageBox } = await import('element-plus');
try {
await ElMessageBox.confirm(confirmMessage, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
});
await apiCall();
onSuccess();
} catch (error) {
// 如果是用户取消,则什么都不做
if (error === 'cancel') {
return;
}
// 其他错误已经在 request 拦截器中处理
}
}
/**
* 标准的表单提交处理
* @param formRef 表单引用
* @param apiCall API调用函数
* @param onSuccess 成功后的回调函数
*/
export async function handleFormSubmit(
formRef: { validate: () => Promise<boolean> } | null,
apiCall: () => Promise<unknown>,
onSuccess: () => void
): Promise<void> {
if (!formRef) return;
try {
const valid = await formRef.validate();
if (valid) {
await apiCall();
onSuccess();
}
} catch {
// 验证失败或API调用失败,错误已在相应地方处理
}
}
/**
* 标准的分页加载数据方法
* @param apiCall 获取数据的API调用
* @param setData 设置数据的方法
* @param setLoading 设置加载状态的方法
* @param params 查询参数
*/
export async function loadPageData<T = Record<string, unknown>>(
apiCall: (params: Record<string, unknown>) => Promise<ApiResponseData>,
setData: (list: T[], total: number) => void,
setLoading: (loading: boolean) => void,
params: Record<string, unknown>
): Promise<void> {
setLoading(true);
try {
const data = await apiCall(params);
const { list, total } = processListResponse<T>(data);
setData(list, total);
} catch {
setData([], 0);
} finally {
setLoading(false);
}
}
|