Skip to content

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

每一次的积累,每一次的学习,每一次在个人项目中对难点的突破,都是我们在这片海洋中留下的印记。这些印记见证了我们的成长,也激励着我们不断前进。