gaoluyang
4 小时以前 e449a5408265e4bd1f6c66f5be28a42efac444ee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
 * 列表响应解包工具
 *
 * 后端各 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;
}