竹简文档
数据传输对象

PageDTO

分页数据传输对象,用于标准化分页查询结果

PageDTO

PageDTO<T> 是筱工具(Java) 的分页数据传输对象,位于 com.xlf.utility.models.dto 包下。用于标准化分页查询的响应格式,支持泛型以适配任意类型的数据记录。

类定义

PageDTO.java
package com.xlf.utility.models.dto;

import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;

@Data
@Accessors(chain = true)  // 支持链式调用
@AllArgsConstructor
public class PageDTO<T> {
    private List<T> records;  // 数据记录列表
    private Long total;       // 总记录数
    private Long size;        // 每页大小
    private Long current;     // 当前页码
}

字段说明

字段

类型

构造方法

空构造方法

PageDTO.java
public PageDTO() {
    this.total = 0L;
    this.size = 0L;
    this.current = 0L;
    this.records = new ArrayList<>();
}

创建空的分页对象,所有字段初始化为默认值。

指定总数和大小

PageDTO.java
public PageDTO(long total, long size) {
    this.total = total;
    this.size = size;
    this.records = new ArrayList<>();
}

创建指定总数和每页大小的分页对象,记录列表初始化为空。

全参构造

PageDTO.java
public PageDTO(List<T> records, Long total, Long size, Long current)

通过 Lombok @AllArgsConstructor 生成,指定所有字段值。

使用示例

在 Service 中构建

UserService.java
import com.xlf.utility.models.dto.PageDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

@Service
public class UserService {

    public PageDTO<UserDTO> getUserList(int pageNum, int pageSize) {
        // 使用 MyBatis-Plus 分页查询
        Page<UserDO> page = userMapper.selectPage(
            new Page<>(pageNum, pageSize),
            new LambdaQueryWrapper<UserDO>()
                .eq(UserDO::getStatus, 1)
                .orderByDesc(UserDO::getCreatedAt)
        );

        // 转换为 PageDTO
        PageDTO<UserDTO> result = new PageDTO<>();
        result.setRecords(convertToDTO(page.getRecords()));
        result.setTotal(page.getTotal());
        result.setSize(page.getSize());
        result.setCurrent(page.getCurrent());

        return result;
    }
}

链式调用

UserService.java
import com.xlf.utility.models.dto.PageDTO;

public PageDTO<UserDTO> getUserList(int pageNum, int pageSize) {
    List<UserDTO> users = userMapper.selectList(pageNum, pageSize);
    long total = userMapper.selectCount();

    // 使用链式调用
    return new PageDTO<UserDTO>()
        .setRecords(users)
        .setTotal(total)
        .setSize((long) pageSize)
        .setCurrent((long) pageNum);
}

在 Controller 中返回

UserController.java
import com.xlf.utility.BaseResponse;
import com.xlf.utility.models.dto.PageDTO;

@RestController
@RequestMapping("/api/v1/user")
public class UserController {

    @GetMapping("/list")
    public BaseResponse<PageDTO<UserDTO>> getUserList(
        @RequestParam(defaultValue = "1") int pageNum,
        @RequestParam(defaultValue = "10") int pageSize
    ) {
        PageDTO<UserDTO> pageData = userService.getUserList(pageNum, pageSize);

        return new BaseResponse<>(
            null,
            "Success",
            200,
            "获取成功",
            null,
            null,
            pageData
        );
    }
}

JSON 响应示例

response.json
{
  "context": "550e8400-e29b-41d4-a716-446655440000",
  "output": "Success",
  "code": 200,
  "message": "获取成功",
  "duration": 25,
  "data": {
    "records": [
      { "id": 1, "username": "user1", "email": "user1@example.com" },
      { "id": 2, "username": "user2", "email": "user2@example.com" }
    ],
    "total": 100,
    "size": 10,
    "current": 1
  }
}

从 JSON 设置记录

Example.java
import com.xlf.utility.models.dto.PageDTO;

// 从 JSON 字符串设置记录(依赖 hutool-json)
String jsonRecords = "[{\"id\":1,\"name\":\"test\"}]";
PageDTO<UserDTO> page = new PageDTO<>(100L, 10L);
page.setRecords(jsonRecords, UserDTO.class);

前端分页计算

前端可根据 PageDTO 的字段计算分页信息:

pagination.js
// 总页数
const totalPages = Math.ceil(pageData.total / pageData.size);

// 是否有上一页
const hasPrevious = pageData.current > 1;

// 是否有下一页
const hasNext = pageData.current < totalPages;

// 起始记录号
const startRecord = (pageData.current - 1) * pageData.size + 1;

// 结束记录号
const endRecord = Math.min(pageData.current * pageData.size, pageData.total);

下一步

On this page