package cn.lili.mybatis.util; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.CharSequenceUtil; import cn.lili.common.utils.BeanUtil; import cn.lili.common.utils.StringUtils; import cn.lili.common.vo.PageVO; import cn.lili.common.vo.SearchVO; import cn.lili.modules.search.utils.SqlFilter; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 分页工具 * * @author Chopper * @version v4.0 * @since 2020/11/26 15:23 */ @Slf4j public class PageUtil { //有order by 注入风险,限制长度 static final Integer orderByLengthLimit = 20; /** * Mybatis-Plus分页封装 * * @param page 分页VO * @param 范型 * @return 分页响应 */ public static Page initPage(PageVO page) { 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; } Page p = new Page<>(pageNumber, pageSize); if (CharSequenceUtil.isNotBlank(sort)) { if (sort.length() > orderByLengthLimit || SqlFilter.hit(sort)) { log.error("排序字段长度超过限制或包含sql关键字,请关注:{}", sort); return p; } boolean isAsc = false; if (!CharSequenceUtil.isBlank(order)) { if ("desc".equals(order.toLowerCase())) { isAsc = false; } else if ("asc".equals(order.toLowerCase())) { isAsc = true; } } if (isAsc) { p.addOrder(OrderItem.asc(sort)); } else { p.addOrder(OrderItem.desc(sort)); } } return p; } private void orderByHandler() { } /** * 生成条件搜索 全对象对比 equals * 如果需要like 需要另行处理 * * @param object 对象(根据对象构建查询条件) * @return 查询wrapper */ public static QueryWrapper initWrapper(Object object) { return initWrapper(object, null); } /** * 生成条件搜索 全对象对比 * * @param object 对象 * @param searchVo 查询条件 * @return 查询wrapper */ public static QueryWrapper initWrapper(Object object, SearchVO searchVo) { QueryWrapper queryWrapper = new QueryWrapper<>(); //创建时间区间判定 if (searchVo != null && CharSequenceUtil.isNotBlank(searchVo.getStartDate()) && CharSequenceUtil.isNotBlank(searchVo.getEndDate())) { Date start = DateUtil.parse(searchVo.getStartDate()); Date end = DateUtil.parse(searchVo.getEndDate()); queryWrapper.between("create_time", start, DateUtil.endOfDay(end)); } if (object != null) { String[] fieldNames = BeanUtil.getFiledName(object); //遍历所有属性 for (int j = 0; j < fieldNames.length; j++) { //获取属性的名字 String key = fieldNames[j]; //获取值 Object value = BeanUtil.getFieldValueByName(key, object); //如果值不为空才做查询处理 if (value != null && !"".equals(value)) { //字段数据库中,驼峰转下划线 queryWrapper.eq(StringUtils.camel2Underline(key), value); } } } return queryWrapper; } /** * 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); } } /** * 转换分页类型 * * @param originPage 原分页 * @param records 新分页数据 * @param 新类型 * @return 新类型分页 */ public static IPage convertPage(IPage originPage, List records) { IPage resultPage = new Page<>(); if (originPage != null) { resultPage.setCurrent(originPage.getCurrent()); resultPage.setPages(originPage.getPages()); resultPage.setTotal(originPage.getTotal()); resultPage.setSize(originPage.getSize()); resultPage.setRecords(records); } return resultPage; } }