Appearance
PageHelper分页扩展排序
为了更方便的进行各字段的排序,下面对分页注解进行改进
1、修改NeedPage
java
package com.xx.page.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author: xueqimiao
* @Date: 2023/11/8 15:54
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedPage {
/**
* pageNo:页码
* pageSize:每页显示条数
* countFlag:是否进行count查询
*/
// orderByOnly=true 启用仅排序模式
// 默认false表示正常分页+排序
boolean orderByOnly() default false;
}
2、修改PageDataUtil
java
package com.xx.utils;
/**
* @Author: xueqimiao
* @Date: 2023/11/8 16:06
*/
public class PageDataUtil {
/**
* 当前页码
*/
public static final String PAGE_CURRENT_PAGE_NO_STR = "pageNo";
/**
* 每页条数
*/
public static final String PAGE_SIZE_STR = "pageSize";
/**
* 是否统计总条数标识 1、统计,0、不统计
*/
public static final String COUNT_FLAG = "countFlag";
/**
* 排序字段
*/
public static final String ORDER_BY = "orderBy";
/**
* 是否仅排序 不分页 1、仅排序 0、排序加分页
*/
public static final String ORDER_BY_ONLY = "orderByOnly";
}
3、修改拦截器
注解也加入的配置字段,如果注解配置了 以注解配置为准 ,如果注解未配置,以前端传为准
java
// 是否仅排序 不分页 1、仅排序 0、排序加分页
int orderByOnly = ServletUtil.getParameterToInt(PageDataUtil.ORDER_BY_ONLY, 0);
Page<Object> page = PageHelper.startPage(currentPage, pageSize, count == 1);
// 支持注解直接配置
Method method = ((MethodSignature) proJoinPoint.getSignature()).getMethod();
if (method.isAnnotationPresent(NeedPage.class)) {
page.setOrderByOnly(method.getAnnotation(NeedPage.class).orderByOnly());
}
// 支持前端传
if (!ValidationUtil.isEmpty(orderBy)) {
// 如果为 true 说明 注解指定了 注解指定了就以注解为准 为 false 才以 前端为准
if(!page.isOrderByOnly()){
page.setOrderByOnly(orderByOnly == 1);
page.setOrderBy(orderBy);
}
}
4、完整版拦截器
java
package com.xx.page.interceptor;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xx.page.annotation.NeedPage;
import com.xx.page.context.PageData;
import com.xx.result.Result;
import com.xx.utils.PageDataUtil;
import com.xx.utils.ServletUtil;
import com.xx.utils.ValidationUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.List;
/**
* @Author: xueqimiao
* @Date: 2023/11/8 15:58
*/
@Component
@Aspect
public class PageDataInterceptor {
public Logger log = LoggerFactory.getLogger(PageDataInterceptor.class);
// 切入点
@Pointcut("@annotation(com.xx.page.annotation.NeedPage)")
public void controllerAspect() {
}
@Around("controllerAspect()")
public Result controllerAround(ProceedingJoinPoint proJoinPoint) throws Throwable {
log.info("==========> 开始执行PageHelper");
// 1、获取请求参数
int currentPage = ServletUtil.getParameterToInt(PageDataUtil.PAGE_CURRENT_PAGE_NO_STR, 1);
int pageSize = ServletUtil.getParameterToInt(PageDataUtil.PAGE_SIZE_STR, 10);
// 是否进行count查询
int count = ServletUtil.getParameterToInt(PageDataUtil.COUNT_FLAG, 1);
// 排序字段
String orderBy = ServletUtil.getParameter(PageDataUtil.ORDER_BY);
// 是否仅排序 不分页 1、仅排序 0、排序加分页
int orderByOnly = ServletUtil.getParameterToInt(PageDataUtil.ORDER_BY_ONLY, 0);
Page<Object> page = PageHelper.startPage(currentPage, pageSize, count == 1);
// 支持注解直接配置
Method method = ((MethodSignature) proJoinPoint.getSignature()).getMethod();
if (method.isAnnotationPresent(NeedPage.class)) {
page.setOrderByOnly(method.getAnnotation(NeedPage.class).orderByOnly());
}
// 支持前端传
if (!ValidationUtil.isEmpty(orderBy)) {
// 如果为 true 说明 注解指定了 注解指定了就以注解为准 为 false 才以 前端为准
if(!page.isOrderByOnly()){
page.setOrderByOnly(orderByOnly == 1);
page.setOrderBy(orderBy);
}
}
try {
return handlePage(proJoinPoint, page);
} finally {
PageHelper.clearPage(); // 清除分页信息
}
}
private Result handlePage(ProceedingJoinPoint proJoinPoint, Page<Object> page) throws Throwable {
Object retVal = proJoinPoint.proceed();
if (retVal == null || !(retVal instanceof Result)
|| !((Result) retVal).isSuccess()) {
return Result.ok(retVal);
}
Result returnResult = (Result) retVal;
if (!(returnResult.getResult() instanceof List)) {
return returnResult;
}
PageData pageData = new PageData();
Object result = returnResult.getResult();
pageData.setRecords(result);
PageInfo pageInfo = new PageInfo<>(page);
pageData.setSize(pageInfo.getPageSize());
pageData.setTotal(pageInfo.getTotal());
pageData.setPages(pageInfo.getPages());
pageData.setCurrent(pageInfo.getPageNum());
returnResult.setResult(pageData);
return returnResult;
}
private static int getParameterToInt(HttpServletRequest request, String paramName, Integer defaultVal) {
String paramValue = request.getParameter(paramName);
if (ValidationUtil.isEmpty(paramValue)) {
return defaultVal;
}
return Integer.parseInt(paramValue);
}
}
5、前端调用示例
sh
# 是否仅排序 默认为0
orderByOnly=0或者1
# 一个字段
orderBy=id asc
# 多个字段
orderBy=create_time asc,id desc
写在最后
博客官网: https://xiaoxueblog.com
每一次的积累,每一次的学习,每一次在个人项目中对难点的突破,都是我们在这片海洋中留下的印记。这些印记见证了我们的成长,也激励着我们不断前进。