package com.vincent.rsf.server.common.domain; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Map; /** * 通用游标分页参数。 * *

这个类在现有 {@link BaseParam} 的基础上只增加一个 {@code cursor} 字段, * 用来表示“下一页从哪里继续查”。

* *

当前项目里的普通分页接口大多还是 {@code current + pageSize} 模式, * 但游标分页只依赖:

* * *

这里仍然继承 {@link BaseParam},目的是继续复用原有的:

* * *

注意:前端即使继续传 {@code current},这里也不会报错; * {@link BaseParam#syncMap(Map)} 会正常解析它,但后续通用游标分页逻辑不会使用它。

*/ @Data @EqualsAndHashCode(callSuper = true) public class CursorPageParam extends BaseParam { /** * 当前页的起始游标。 * *

约定含义是:只查询“比这个游标更旧”的数据, * 例如按 {@code id desc} 翻页时,会生成 {@code id < cursor} 的条件。

*/ private Long cursor; @Override public void syncMap(Map 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"); } }