|
|
|
@ -2,6 +2,7 @@ package cc.yunxi.common.domain;
|
|
|
|
|
|
|
|
|
|
import cc.yunxi.common.domain.function.SFunction;
|
|
|
|
|
import cc.yunxi.common.utils.LambdaUtil;
|
|
|
|
|
import cc.yunxi.common.utils.ObjTypeUtil;
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import com.baomidou.mybatisplus.annotation.TableField;
|
|
|
|
@ -10,14 +11,13 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
import io.swagger.annotations.ApiModel;
|
|
|
|
|
import io.swagger.annotations.ApiModelProperty;
|
|
|
|
|
import lombok.AllArgsConstructor;
|
|
|
|
|
import lombok.Data;
|
|
|
|
|
import lombok.NoArgsConstructor;
|
|
|
|
|
import lombok.*;
|
|
|
|
|
import lombok.experimental.Accessors;
|
|
|
|
|
|
|
|
|
|
import javax.validation.constraints.Min;
|
|
|
|
|
import java.io.Serializable;
|
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.LinkedHashSet;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
@ -27,7 +27,7 @@ import java.util.stream.Collectors;
|
|
|
|
|
@NoArgsConstructor
|
|
|
|
|
@AllArgsConstructor
|
|
|
|
|
@Accessors(chain = true)
|
|
|
|
|
public class PageQuery {
|
|
|
|
|
public class PageQuery<T> {
|
|
|
|
|
public static final Integer DEFAULT_PAGE_SIZE = 20;
|
|
|
|
|
public static final Integer DEFAULT_PAGE_NUM = 1;
|
|
|
|
|
@ApiModelProperty(value = "页码", required = false, example = "1")
|
|
|
|
@ -39,18 +39,44 @@ public class PageQuery {
|
|
|
|
|
private Integer pageSize = DEFAULT_PAGE_SIZE;
|
|
|
|
|
|
|
|
|
|
@ApiModelProperty(value = "排序规则", required = false)
|
|
|
|
|
@Setter(AccessLevel.NONE)
|
|
|
|
|
private LinkedHashSet<SortingField> sortingFields;
|
|
|
|
|
|
|
|
|
|
@ApiModelProperty(value = "设置排序字段", hidden = true)
|
|
|
|
|
@Setter(AccessLevel.NONE)
|
|
|
|
|
private List<OrderItem> orderItems = new ArrayList<>(10);
|
|
|
|
|
|
|
|
|
|
// 忽略构建排序
|
|
|
|
|
public <T> Page<T> getPage() {
|
|
|
|
|
return Page.of(pageNo, pageSize);
|
|
|
|
|
|
|
|
|
|
// 添加排序规则
|
|
|
|
|
public PageQuery<T> addOrderItem(SFunction<T> orderByFuc) {
|
|
|
|
|
return this.addOrderItem(orderByFuc, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public PageQuery<T> addOrderItem(SFunction<T> orderByFuc, boolean isAsc) {
|
|
|
|
|
OrderItem orderItem = new OrderItem();
|
|
|
|
|
Class<?> clazz = LambdaUtil.getClazz(orderByFuc);
|
|
|
|
|
String fieldName = LambdaUtil.getFieldName(orderByFuc);
|
|
|
|
|
try {
|
|
|
|
|
Field field = clazz.getDeclaredField(fieldName);
|
|
|
|
|
TableField annotation = field.getAnnotation(TableField.class);
|
|
|
|
|
if (annotation != null) {
|
|
|
|
|
orderItem.setColumn(annotation.value());
|
|
|
|
|
} else {
|
|
|
|
|
String column = StringUtils.camelToUnderline(fieldName);
|
|
|
|
|
orderItem.setColumn(column);
|
|
|
|
|
}
|
|
|
|
|
} catch (NoSuchFieldException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
orderItem.setAsc(isAsc);
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 构建分页排序
|
|
|
|
|
public <T> Page<T> buildPage(Class<?> clazz, OrderItem... orderItems) {
|
|
|
|
|
public Page<T> buildPage() {
|
|
|
|
|
Page<T> page = Page.of(pageNo, pageSize);
|
|
|
|
|
// 前端排序规则
|
|
|
|
|
Class<?> classT = ObjTypeUtil.getClassT(this, 0);
|
|
|
|
|
// 前端传入排序规则
|
|
|
|
|
if (!CollectionUtil.isEmpty(sortingFields)) {
|
|
|
|
|
// 防sql注入,字段判断
|
|
|
|
|
List<OrderItem> orderItemList = sortingFields.stream().filter(sortingField -> {
|
|
|
|
@ -59,7 +85,7 @@ public class PageQuery {
|
|
|
|
|
if (StrUtil.isBlank(field)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
clazz.getDeclaredField(field);
|
|
|
|
|
classT.getDeclaredField(field);
|
|
|
|
|
return true;
|
|
|
|
|
} catch (NoSuchFieldException e) {
|
|
|
|
|
return false;
|
|
|
|
@ -72,48 +98,20 @@ public class PageQuery {
|
|
|
|
|
}).collect(Collectors.toList());
|
|
|
|
|
page.addOrder(orderItemList);
|
|
|
|
|
}
|
|
|
|
|
// 手动指定排序规则
|
|
|
|
|
if (orderItems != null && orderItems.length > 0) {
|
|
|
|
|
for (OrderItem orderItem : orderItems) {
|
|
|
|
|
page.addOrder(orderItem);
|
|
|
|
|
}
|
|
|
|
|
// 设置指定排序规则
|
|
|
|
|
for (OrderItem orderItem : orderItems) {
|
|
|
|
|
page.addOrder(orderItem);
|
|
|
|
|
}
|
|
|
|
|
return page;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public <T> Page<T> buildPageByDefaultOrder(Class<?> clazz, String defaultSortBy, boolean isAsc) {
|
|
|
|
|
OrderItem orderItem = new OrderItem();
|
|
|
|
|
orderItem.setAsc(isAsc);
|
|
|
|
|
orderItem.setColumn(StringUtils.camelToUnderline(defaultSortBy));
|
|
|
|
|
return buildPage(clazz, orderItem);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public <T> Page<T> buildPageByDefaultOrder(SFunction<T> defaultSortByFuc, boolean isAsc) {
|
|
|
|
|
OrderItem orderItem = new OrderItem();
|
|
|
|
|
Class<?> clazz = LambdaUtil.getClazz(defaultSortByFuc);
|
|
|
|
|
String fieldName = LambdaUtil.getFieldName(defaultSortByFuc);
|
|
|
|
|
try {
|
|
|
|
|
Field field = clazz.getDeclaredField(fieldName);
|
|
|
|
|
TableField annotation = field.getAnnotation(TableField.class);
|
|
|
|
|
if (annotation != null) {
|
|
|
|
|
orderItem.setColumn(annotation.value());
|
|
|
|
|
} else {
|
|
|
|
|
String column = StringUtils.camelToUnderline(fieldName);
|
|
|
|
|
orderItem.setColumn(column);
|
|
|
|
|
}
|
|
|
|
|
} catch (NoSuchFieldException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
orderItem.setAsc(isAsc);
|
|
|
|
|
return buildPage(clazz, orderItem);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Data
|
|
|
|
|
@ApiModel(description = "排序规则")
|
|
|
|
|
public static class SortingField implements Serializable {
|
|
|
|
|
|
|
|
|
|
private static final long serialVersionUID = -1;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 顺序 - 升序
|
|
|
|
|
*/
|
|
|
|
|