package cn.exrick.xboot.core.common.utils;
|
|
import cn.exrick.xboot.core.common.exception.XbootException;
|
import cn.exrick.xboot.core.common.vo.PageVo;
|
import cn.hutool.core.util.StrUtil;
|
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import org.springframework.data.domain.PageRequest;
|
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Sort;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
* @author Exrickx
|
*/
|
public class PageUtil {
|
|
private final static String[] KEYWORDS = {"master", "truncate", "insert", "select",
|
"delete", "update", "declare", "alter", "drop", "sleep"};
|
|
private PageUtil() {
|
throw new IllegalStateException("Utility class");
|
}
|
|
/**
|
* JPA分页封装
|
* @param page
|
* @return
|
*/
|
public static Pageable initPage(PageVo page) {
|
|
Pageable pageable = null;
|
int pageNumber = page.getPageNumber();
|
int pageSize = page.getPageSize();
|
String sort = page.getSort();
|
String order = page.getOrder();
|
|
if (pageNumber < 1) {
|
pageNumber = 1;
|
}
|
if (pageSize < 1) {
|
pageSize = 10;
|
}
|
if (pageSize > 100) {
|
pageSize = 100;
|
}
|
if (StrUtil.isNotBlank(sort)) {
|
Sort.Direction d;
|
if (StrUtil.isBlank(order)) {
|
d = Sort.Direction.DESC;
|
} else {
|
d = Sort.Direction.valueOf(order.toUpperCase());
|
}
|
Sort s = Sort.by(d, sort);
|
pageable = PageRequest.of(pageNumber - 1, pageSize, s);
|
} else {
|
pageable = PageRequest.of(pageNumber - 1, pageSize);
|
}
|
return pageable;
|
}
|
|
/**
|
* Mybatis-Plus分页封装
|
* @param page
|
* @return
|
*/
|
public static Page initMpPage(PageVo page) {
|
|
Page p = null;
|
int pageNumber = page.getPageNumber();
|
int pageSize = page.getPageSize();
|
String sort = page.getSort();
|
String order = page.getOrder();
|
|
SQLInject(sort);
|
|
if (pageNumber < 1) {
|
pageNumber = 1;
|
}
|
if (pageSize < 1) {
|
pageSize = 10;
|
}
|
if (pageSize > 100) {
|
pageSize = 100;
|
}
|
if (StrUtil.isNotBlank(sort)) {
|
Boolean isAsc = false;
|
if (StrUtil.isBlank(order)) {
|
isAsc = false;
|
} else {
|
if ("desc".equals(order.toLowerCase())) {
|
isAsc = false;
|
} else if ("asc".equals(order.toLowerCase())) {
|
isAsc = true;
|
}
|
}
|
p = new Page(pageNumber, pageSize);
|
if (isAsc) {
|
p.addOrder(OrderItem.asc(camel2Underline(sort)));
|
} else {
|
p.addOrder(OrderItem.desc(camel2Underline(sort)));
|
}
|
|
} else {
|
p = new Page(pageNumber, pageSize);
|
}
|
return p;
|
}
|
|
/**
|
* List 手动分页
|
* @param page
|
* @param list
|
* @return
|
*/
|
public static List listToPage(PageVo page, List list) {
|
|
int pageNumber = page.getPageNumber() - 1;
|
int pageSize = page.getPageSize();
|
|
if (pageNumber < 0) {
|
pageNumber = 0;
|
}
|
if (pageSize < 1) {
|
pageSize = 10;
|
}
|
if (pageSize > 100) {
|
pageSize = 100;
|
}
|
|
int fromIndex = pageNumber * pageSize;
|
int toIndex = pageNumber * pageSize + pageSize;
|
|
if (fromIndex > list.size()) {
|
return new ArrayList();
|
} else if (toIndex >= list.size()) {
|
return list.subList(fromIndex, list.size());
|
} else {
|
return list.subList(fromIndex, toIndex);
|
}
|
}
|
|
/**
|
* 驼峰法转下划线
|
*/
|
public static String camel2Underline(String str) {
|
|
if (StrUtil.isBlank(str)) {
|
return "";
|
}
|
if (str.length() == 1) {
|
return str.toLowerCase();
|
}
|
StringBuilder sb = new StringBuilder();
|
for (int i = 1; i < str.length(); i++) {
|
if (Character.isUpperCase(str.charAt(i))) {
|
sb.append("_" + Character.toLowerCase(str.charAt(i)));
|
} else {
|
sb.append(str.charAt(i));
|
}
|
}
|
return (str.charAt(0) + sb.toString()).toLowerCase();
|
}
|
|
/**
|
* 防Mybatis-Plus order by注入
|
* @param param
|
*/
|
public static void SQLInject(String param) {
|
|
if (StrUtil.isBlank(param)) {
|
return;
|
}
|
|
// 转换成小写
|
param = param.toLowerCase();
|
// 判断是否包含非法字符
|
for (String keyword : KEYWORDS) {
|
if (param.equals(keyword)) {
|
throw new XbootException(param + "包含非法字符");
|
}
|
}
|
}
|
}
|