/** * 列表响应解包工具 * * 后端各 controller 的分页返回结构不统一,实测至少有这几种: * { code, data: { records, total } } * { code, data: [ ... ] } (纯数组) * { code, records, total } (ruoyi 风格,records 在外层) * { code, rows, total } (ruoyi 风格) * 集中在这里兜底,避免每个页面各写一遍 `res?.data?.records || res?.records || []`。 */ function pickArray(source) { if (!source) return null; if (Array.isArray(source)) return source; const candidates = ["records", "list", "rows", "data", "content", "items"]; for (const key of candidates) { if (Array.isArray(source[key])) return source[key]; } return null; } /** * 从任意结构的分页响应里取出列表数组,取不到返回 [] */ export function unwrapList(res) { if (!res) return []; return pickArray(res.data) || pickArray(res) || []; } /** * 取出总条数,取不到返回 0 */ export function unwrapTotal(res) { if (!res) return 0; const outer = Number(res.total); if (Number.isFinite(outer) && outer > 0) return outer; const inner = Number(res.data?.total); if (Number.isFinite(inner) && inner > 0) return inner; return 0; } /** * 取出单条详情,取不到返回 null */ export function unwrapData(res) { if (!res) return null; return res.data ?? null; }