page 分页工具

发布时间 2023-05-25 08:54:02作者: chen1777
package com.thtf.zwdsj.fangjia.utils;

import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

@Data
public class Page implements Serializable {

    // 页数(第几页)
    private int currentpage;
    // 查询数据库里面对应的数据有多少条
    private int total;// 从数据库查处的总记录数
    // 每页查5条
    private int size;
    // 下页
    private int next;
    // 数据
    private List rowData;
    // 最后一页
    private int last;
    private int lpage;
    private int rpage;
    //从哪条开始查
    private int start;
    //全局偏移量
    public int offsize = 2;
    //从哪条结束查
    private int end;
    // 动态表头
    private List<Map> head;

    public Page() {
    }

    /****
     *
     * @param list   总记录数
     * @param currentpage    当前页
     * @param pagesize    每页显示多少条
     */
    public Page(List list, int currentpage, int pagesize) {
        initPage(list, currentpage, pagesize);
    }

    /****
     * 初始化分页
     * @param list
     * @param currentpage
     * @param pagesize
     */
    public void initPage(List list, int currentpage, int pagesize) {
        //总记录数
        this.total = list.size();
        //每页显示多少条
        this.size = pagesize;
        //计算当前页和数据库查询起始值以及总页数
        setCurrentpage(currentpage, total, pagesize);
        //分页计算
        int leftcount = this.offsize,    //需要向上一页执行多少次
                rightcount = this.offsize;
        //起点页
        this.lpage = currentpage;
        //结束页
        this.rpage = currentpage;
        //2点判断
        this.lpage = currentpage - leftcount;            //正常情况下的起点
        this.rpage = currentpage + rightcount;        //正常情况下的终点
        //页差=总页数和结束页的差
        int topdiv = this.last - rpage;                //判断是否大于最大页数
        /***
         * 起点页
         * 1、页差<0  起点页=起点页+页差值
         * 2、页差>=0 起点和终点判断
         */
        this.lpage = topdiv < 0 ? this.lpage + topdiv : this.lpage;
        /***
         * 结束页
         * 1、起点页<=0   结束页=|起点页|+1
         * 2、起点页>0    结束页
         */
        this.rpage = this.lpage <= 0 ? this.rpage + (this.lpage * -1) + 1 : this.rpage;
        /***
         * 当起点页<=0  让起点页为第一页
         * 否则不管
         */
        this.lpage = this.lpage <= 0 ? 1 : this.lpage;
        /***
         * 如果结束页>总页数   结束页=总页数
         * 否则不管
         */
        this.rpage = this.rpage > last ? this.last : this.rpage;
        /**
         * 如果结束条条数
         */
        this.end = (this.start+pagesize)>total?total:(this.start+pagesize);
        /**
         * 截取分页数据
         */
        this.rowData=list.subList(start,end);
    }

    /****
     *
     * @param currentpage
     * @param total
     * @param pagesize
     */
    public void setCurrentpage(int currentpage, int total, int pagesize) {
        //可以整除的情况下
        int pagecount = total / pagesize;
        //如果整除表示正好分N页,如果不能整除在N页的基础上+1页
        int totalPages = (int) (total % pagesize == 0 ? total / pagesize : (total / pagesize) + 1);
        //总页数
        this.last = totalPages;

        //判断当前页是否越界,如果越界,我们就查最后一页
        if (currentpage > totalPages) {
            this.currentpage = totalPages;
        } else {
            this.currentpage = currentpage;
        }
        //计算start
        this.start = ((this.currentpage - 1)<0?0:(this.currentpage - 1)) * pagesize;
    }

    //上一页
    public int getUpper() {
        return currentpage > 1 ? currentpage - 1 : currentpage;
    }

    //总共有多少页,即末页
    public void setLast(int last) {
        this.last = (int) (total % size == 0 ? total / size : (total / size) + 1);
    }

    public int getNext() {
        return currentpage < last ? currentpage + 1 : last;
    }

}