#
zhou zhou
2 天以前 523365960513f297024a419f94b2b42eccd9456f
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package com.vincent.rsf.server.common.domain;
 
import lombok.Data;
import lombok.EqualsAndHashCode;
 
import java.util.Map;
 
/**
 * 通用游标分页参数。
 *
 * <p>这个类在现有 {@link BaseParam} 的基础上只增加一个 {@code cursor} 字段,
 * 用来表示“下一页从哪里继续查”。</p>
 *
 * <p>当前项目里的普通分页接口大多还是 {@code current + pageSize} 模式,
 * 但游标分页只依赖:</p>
 * <ul>
 *     <li>{@code pageSize}:每页大小</li>
 *     <li>{@code cursor}:上一页最后一条记录的游标值</li>
 * </ul>
 *
 * <p>这里仍然继承 {@link BaseParam},目的是继续复用原有的:</p>
 * <ul>
 *     <li>筛选条件解析</li>
 *     <li>{@code condition / timeStart / timeEnd} 等通用参数</li>
 *     <li>和 {@link com.vincent.rsf.server.common.domain.PageParam} 的协作能力</li>
 * </ul>
 *
 * <p>注意:前端即使继续传 {@code current},这里也不会报错;
 * {@link BaseParam#syncMap(Map)} 会正常解析它,但后续通用游标分页逻辑不会使用它。</p>
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class CursorPageParam extends BaseParam {
 
    /**
     * 当前页的起始游标。
     *
     * <p>约定含义是:只查询“比这个游标更旧”的数据,
     * 例如按 {@code id desc} 翻页时,会生成 {@code id < cursor} 的条件。</p>
     */
    private Long cursor;
 
    @Override
    public void syncMap(Map<String, Object> map) {
        // 先复用 BaseParam 的通用参数解析能力,
        // 保证 pageSize、condition、timeStart、timeEnd 等字段照常工作。
        super.syncMap(map);
        if (map == null) {
            return;
        }
        Object cursorValue = map.get("cursor");
        if (cursorValue == null) {
            return;
        }
        String normalizedValue = String.valueOf(cursorValue).trim();
        if (normalizedValue.isEmpty()) {
            // 空字符串游标等价于“首屏没有游标”,这里直接移除,避免后续误参与 SQL。
            map.remove("cursor");
            return;
        }
        // 目前通用方案统一把游标约束为 Long,
        // 这样可以覆盖当前按主键/数字字段倒序翻页的业务场景。
        this.cursor = Long.parseLong(normalizedValue);
        // 解析完成后要从 map 中移除,避免 PageParam.buildWrapper(true)
        // 把 cursor 当成普通筛选字段再次拼进 where 条件。
        map.remove("cursor");
    }
}