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");
|
}
|
}
|