This commit is contained in:
Looly 2023-03-17 00:35:27 +08:00
parent 569512fb56
commit ed512e3377
4 changed files with 77 additions and 34 deletions

View File

@ -1,13 +1,31 @@
package cn.hutool.core.lang.page;
/**
* 导航分页信息类<br>
* 根据提供的总页数每页记录数导航页码数等信息生成导航数组
* <pre>
* [1] 2 3 4 5 >>
* << 1 [2] 3 4 5 >>
* << 1 2 3 4 [5]
* </pre>
*
* @author 莫取网名
*/
public class NavigatePageInfo extends PageInfo {
private final int navigatePages; //导航页码数
private final int navigatePageCount; //导航页码数
private int[] navigatePageNumbers; //所有导航页号
public NavigatePageInfo(final int total, final int pageSize, int navigatePages) {
/**
* 构造
*
* @param total 总记录数
* @param pageSize 每页显示记录数
* @param navigatePageCount 导航页码数
*/
public NavigatePageInfo(final int total, final int pageSize, final int navigatePageCount) {
super(total, pageSize);
this.navigatePages = navigatePages;
this.navigatePageCount = navigatePageCount;
//基本参数设定之后进行导航页面的计算
calcNavigatePageNumbers();
@ -22,26 +40,50 @@ public class NavigatePageInfo extends PageInfo {
return navigatePageNumbers;
}
@Override
public NavigatePageInfo setFirstPageNo(final int firstPageNo) {
super.setFirstPageNo(firstPageNo);
return this;
}
@Override
public NavigatePageInfo setPageNo(final int pageNo) {
super.setPageNo(pageNo);
// 重新计算导航
calcNavigatePageNumbers();
return this;
}
@Override
public String toString() {
final StringBuilder str = new StringBuilder();
if(false == isFirstPage()){
if (false == isFirstPage()) {
str.append("<< ");
}
if (navigatePageNumbers.length > 0) {
str.append(wrap(navigatePageNumbers[0]));
str.append(wrapForDisplay(navigatePageNumbers[0]));
}
for (int i = 1; i < navigatePageNumbers.length; i++) {
str.append(" ").append(wrap(navigatePageNumbers[i]));
str.append(" ").append(wrapForDisplay(navigatePageNumbers[i]));
}
if(false == isLastPage()){
if (false == isLastPage()) {
str.append(" >>");
}
return str.toString();
}
private String wrap(final int pageNumber){
if(this.pageNo == pageNumber){
// region ----- private methods
/**
* 用于显示的包装<br>
* 当前页显示'[pageNumber]'否则直接显示
*
* @param pageNumber 页码
* @return 包装的页码
*/
private String wrapForDisplay(final int pageNumber) {
if (this.pageNo == pageNumber) {
return "[" + pageNumber + "]";
}
return String.valueOf(pageNumber);
@ -51,35 +93,36 @@ public class NavigatePageInfo extends PageInfo {
* 计算导航页
*/
private void calcNavigatePageNumbers() {
//当总页数小于或等于导航页码数时
if (pages <= navigatePages) {
navigatePageNumbers = new int[pages];
for (int i = 0; i < pages; i++) {
//当总页数小于或等于导航页码数时全部显示
if (pageCount <= navigatePageCount) {
navigatePageNumbers = new int[pageCount];
for (int i = 0; i < pageCount; i++) {
navigatePageNumbers[i] = i + 1;
}
} else { //当总页数大于导航页码数时
navigatePageNumbers = new int[navigatePages];
int startNum = pageNo - navigatePages / 2;
int endNum = pageNo + navigatePages / 2;
} else { //当总页数大于导航页码数时部分显示
navigatePageNumbers = new int[navigatePageCount];
int startNum = pageNo - navigatePageCount / 2;
int endNum = pageNo + navigatePageCount / 2;
if (startNum < 1) {
startNum = 1;
//(最前navPageCount页
for (int i = 0; i < navigatePages; i++) {
for (int i = 0; i < navigatePageCount; i++) {
navigatePageNumbers[i] = startNum++;
}
} else if (endNum > pages) {
endNum = pages;
} else if (endNum > pageCount) {
endNum = pageCount;
//最后navPageCount页
for (int i = navigatePages - 1; i >= 0; i--) {
for (int i = navigatePageCount - 1; i >= 0; i--) {
navigatePageNumbers[i] = endNum--;
}
} else {
//所有中间页
for (int i = 0; i < navigatePages; i++) {
for (int i = 0; i < navigatePageCount; i++) {
navigatePageNumbers[i] = startNum++;
}
}
}
}
// endregion
}

View File

@ -36,7 +36,7 @@ public class PageInfo {
/**
* 总页数
*/
int pages;
int pageCount;
/**
* 首页标识
*/
@ -74,7 +74,7 @@ public class PageInfo {
this.pageSize = pageSize;
// 因为总条数除以页大小的最大余数是页大小数-1
// 因此加一个最大余数保证舍弃的余数与最大余数凑1.x就是一旦有余数则+1页
this.pages = (total + pageSize - 1) / pageSize;
this.pageCount = (total + pageSize - 1) / pageSize;
}
/**
@ -100,8 +100,8 @@ public class PageInfo {
*
* @return {int}
*/
public int getPages() {
return pages;
public int getPageCount() {
return pageCount;
}
/**
@ -129,7 +129,7 @@ public class PageInfo {
* @return 是否尾页
*/
public boolean isLastPage() {
return getPageIndexBase1() == this.pages;
return getPageIndexBase1() == this.pageCount;
}
/**
@ -147,7 +147,7 @@ public class PageInfo {
* @return 是否有下一页
*/
public boolean hasNextPage() {
return getBeginIndex() < this.pages;
return getBeginIndex() < this.pageCount;
}
/**
@ -155,7 +155,7 @@ public class PageInfo {
* @return 是否可用
*/
public boolean isValidPage(){
return this.getPageIndexBase1() <= this.pages;
return this.getPageIndexBase1() <= this.pageCount;
}
/**
@ -255,7 +255,7 @@ public class PageInfo {
/**
* 下一页即当前页码+1<br>
* 当超过末页时此方法指向的页码值始终为{@link #getPages()} + 1即最后一页后的空白页
* 当超过末页时此方法指向的页码值始终为{@link #getPageCount()} + 1即最后一页后的空白页
*
* @return this
*/
@ -275,7 +275,7 @@ public class PageInfo {
public String toString() {
return "{" +
"total=" + total +
",pages=" + pages +
",pages=" + pageCount +
",pageNumber=" + pageNo +
",limit=" + pageSize +
",isFirstPage=" + isFirstPage() +

View File

@ -7,10 +7,10 @@ public class PageInfoTest {
@Test
public void pagesTest() {
PageInfo pageInfo = new PageInfo(20, 3);
Assert.assertEquals(7, pageInfo.getPages());
Assert.assertEquals(7, pageInfo.getPageCount());
pageInfo = new PageInfo(20, 4);
Assert.assertEquals(5, pageInfo.getPages());
Assert.assertEquals(5, pageInfo.getPageCount());
}
@Test

View File

@ -65,7 +65,7 @@ public class PageResult<T> extends ArrayList<T> {
this(page, pageSize);
this.total = total;
this.totalPage = PageInfo.of(total, pageSize).getPages();
this.totalPage = PageInfo.of(total, pageSize).getPageCount();
}
//---------------------------------------------------------- Constructor end