请求拦截Code
Yann authored at 2025-07-01 14:00:58 Yann committed at 2025-07-01 15:20:51
3.10 KiB
cube-front
/**
 * 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);
  }
}