/**
|
* 列表响应解包工具
|
*
|
* 后端各 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;
|
}
|