Pārlūkot izejas kodu

分页、排序参数构建

wanggaokun 1 mēnesi atpakaļ
vecāks
revīzija
521ae55629

+ 7 - 1
eco-bom/pom.xml

@@ -19,7 +19,6 @@
         <maven.compiler.source>${java.version}</maven.compiler.source>
         <maven.compiler.target>${java.version}</maven.compiler.target>
         <flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
-
         <lombok.version>1.18.36</lombok.version>
         <mybatis-flex.version>1.10.9</mybatis-flex.version>
         <HikariCP.version>6.2.1</HikariCP.version>
@@ -27,6 +26,7 @@
         <easy-trans.version>3.0.6</easy-trans.version>
         <jackson.version>2.18.3</jackson.version>
         <jakarta.version>6.1.0</jakarta.version>
+        <mapstruct-plus.version>1.4.8</mapstruct-plus.version>
         <easy-trans.version>3.0.6</easy-trans.version>
         <deepseek4j.version>1.4.5</deepseek4j.version>
         <milvus.version>2.5.5</milvus.version>
@@ -54,6 +54,12 @@
                 <version>${jakarta.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>io.github.linpeilie</groupId>
+                <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
+                <version>${mapstruct-plus.version}</version>
+            </dependency>
+
             <!-- com-web -->
             <dependency>
                 <groupId>org.eco.vip</groupId>

+ 16 - 0
eco-common/com-core/pom.xml

@@ -55,5 +55,21 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+        </dependency>
+
+        <!-- SpringWeb模块 -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.github.linpeilie</groupId>
+            <artifactId>mapstruct-plus-spring-boot-starter</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 68 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/pojo/OrderDomain.java

@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.orm.pojo;
+
+
+import lombok.Getter;
+import lombok.Setter;
+import org.eco.vip.orm.utils.ServletUtils;
+import org.eco.vip.orm.utils.StrUtils;
+
+/**
+ * @description OrderDomain
+ *
+ * @author GaoKunW
+ * @date 2025/7/1 21:44
+ */
+public class OrderDomain {
+
+    /**
+     * 排序列
+     */
+    public static final String ORDER_BY_COLUMN = "orderByColumn";
+
+    /**
+     * 排序的方向 "desc" 或者 "asc".
+     */
+    public static final String IS_ASC = "isAsc";
+    /**
+     * 排序列
+     */
+    @Setter
+    @Getter
+    private String orderByColumn;
+
+    /**
+     * 排序的方向desc或者asc
+     */
+    @Getter
+    private String isAsc = "asc";
+
+    public void setIsAsc(String isAsc) {
+        if (StrUtils.isNotEmpty(isAsc)) {
+            // 兼容前端排序类型
+            if ("ascending".equals(isAsc)) {
+                isAsc = "asc";
+            } else if ("descending".equals(isAsc)) {
+                isAsc = "desc";
+            }
+            this.isAsc = isAsc;
+        }
+    }
+
+    public String getOrderBy() {
+        if (StrUtils.isEmpty(orderByColumn)) {
+            return "";
+        }
+        return StrUtils.toUnderlineCase(orderByColumn) + " " + isAsc;
+    }
+
+    public static OrderDomain buildOrderRequest() {
+        OrderDomain orderDomain = new OrderDomain();
+        orderDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
+        orderDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
+        return orderDomain;
+    }
+}

+ 61 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/pojo/PageResult.java

@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.orm.pojo;
+
+
+import com.mybatisflex.core.paginate.Page;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description PageResult
+ *
+ * @author GaoKunW
+ * @date 2025/7/1 21:49
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class PageResult<T> implements Serializable {
+
+    private List<T> list;
+    private Long total;
+    private Long pageNum;
+    private Long pageSize;
+
+    public PageResult(Long total) {
+        this.list = new ArrayList<>();
+        this.total = total;
+    }
+
+    public PageResult(List<T> list, Long total) {
+        this.list = list;
+        this.total = total;
+    }
+
+    /**
+     * @param page 分页参数
+     * @param <T>  结果泛型信息
+     * @return 分页结果
+     */
+    public static <T> PageResult<T> build(Page<T> page) {
+        PageResult<T> result = new PageResult<>();
+        result.setList(page.getRecords()).setTotal(page.getTotalRow()).setPageNum(page.getPageNumber()).setPageSize(page.getPageSize());
+        return result;
+    }
+
+    public static <T> PageResult<T> empty() {
+        return new PageResult<>(0L);
+    }
+
+    public static <T> PageResult<T> empty(Long total) {
+        return new PageResult<>(total);
+    }
+}

+ 41 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/ServletUtils.java

@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ *
+ */
+
+package org.eco.vip.orm.utils;
+
+
+import cn.hutool.extra.servlet.JakartaServletUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+/**
+ * @description ServletUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/1 21:32
+ */
+public class ServletUtils extends JakartaServletUtil {
+
+    /**
+     * 获取String参数
+     */
+    public static String getParameter(String name) {
+        return getRequest().getParameter(name);
+    }
+
+    /**
+     * 获取request
+     */
+    public static HttpServletRequest getRequest() {
+        return getRequestAttributes().getRequest();
+    }
+
+    public static ServletRequestAttributes getRequestAttributes() {
+        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
+        return (ServletRequestAttributes) attributes;
+    }
+}

+ 49 - 0
eco-common/com-core/src/main/java/org/eco/vip/orm/utils/SqlUtils.java

@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.orm.utils;
+
+
+/**
+ * @description SqlUtils
+ *
+ * @author GaoKunW
+ * @date 2025/7/1 22:09
+ */
+public class SqlUtils {
+    /**
+     * 定义常用的 sql关键字
+     */
+    public static String SQL_REGEX = "and |extractvalue|updatexml|exec |insert |select |delete |update |drop |count |chr |mid |master |truncate |char |declare |or |+|user()";
+
+    /**
+     * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)
+     */
+    public static String SQL_PATTERN = "[a-zA-Z0-9_ ,.]+";
+
+    /**
+     * 限制orderBy最大长度
+     */
+    private static final int ORDER_BY_MAX_LENGTH = 500;
+
+    /**
+     * 检查字符,防止注入绕过
+     */
+    public static String escapeOrderBySql(String value) {
+        if (StrUtils.isNotEmpty(value) && !isValidOrderBySql(value)) {
+            throw new IllegalArgumentException("参数不符合规范,不能进行查询");
+        }
+        if (StrUtils.length(value) > ORDER_BY_MAX_LENGTH) {
+            throw new IllegalArgumentException("参数已超过最大限制,不能进行查询");
+        }
+        return value;
+    }
+
+    /**
+     * 验证 order by 语法是否符合规范
+     */
+    public static boolean isValidOrderBySql(String value) {
+        return value.matches(SQL_PATTERN);
+    }
+}

+ 66 - 0
eco-common/com-orm/src/main/java/org/eco/vip/orm/domain/PageQuery.java

@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2025 GaoKunW
+ */
+
+package org.eco.vip.orm.domain;
+
+
+import cn.hutool.core.convert.Convert;
+import com.mybatisflex.core.paginate.Page;
+import org.eco.vip.orm.utils.ServletUtils;
+
+/**
+ * @description PageQuery
+ *
+ * @author GaoKunW
+ * @date 2025/7/1 22:37
+ */
+public class PageQuery {
+
+    /**
+     * 当前记录起始索引
+     */
+    public static final String PAGE_NUM = "pageNum";
+    /**
+     * 每页显示记录数
+     */
+    public static final String PAGE_SIZE = "pageSize";
+    /**
+     * 当前记录起始索引 默认值
+     */
+    public static final int DEFAULT_PAGE_NUM = 1;
+    /**
+     * 每页显示记录数 默认值 默认查全部
+     */
+    public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;
+    /**
+     * 分页大小
+     */
+    private Integer pageSize;
+    /**
+     * 当前页数
+     */
+    private Integer pageNum;
+    /**
+     * 排序列
+     */
+    private String orderByColumn;
+    /**
+     * 排序的方向desc或者asc
+     */
+    private String isAsc;
+
+    /**
+     * 构造分页查询参数
+     *
+     * @return res
+     */
+    public static <T> Page<T> build() {
+        Integer pageNum = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), DEFAULT_PAGE_NUM);
+        Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), DEFAULT_PAGE_SIZE);
+        if (pageNum <= 0) {
+            pageNum = DEFAULT_PAGE_NUM;
+        }
+        return new Page<>(pageNum, pageSize);
+    }
+}

+ 9 - 1
eco-common/com-orm/src/main/java/org/eco/vip/orm/service/BaseService.java

@@ -9,6 +9,9 @@ package org.eco.vip.orm.service;
 import com.mybatisflex.core.BaseMapper;
 import com.mybatisflex.core.query.QueryWrapper;
 import com.mybatisflex.spring.service.impl.ServiceImpl;
+import org.eco.vip.orm.pojo.OrderDomain;
+import org.eco.vip.orm.utils.SqlUtils;
+import org.eco.vip.orm.utils.StrUtils;
 
 /**
  * @description BaseService
@@ -22,8 +25,13 @@ public class BaseService<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> i
      * 构造基本查询条件
      * @return QueryWrapper
      */
-    protected QueryWrapper buildBaseQueryWrapper(){
+    protected QueryWrapper buildBaseQueryWrapper() {
         QueryWrapper queryWrapper = query();
+        OrderDomain orderDomain = OrderDomain.buildOrderRequest();
+        if (StrUtils.isNotEmpty(orderDomain.getOrderBy())) {
+            String orderBy = SqlUtils.escapeOrderBySql(orderDomain.getOrderBy());
+            queryWrapper.orderBy(orderBy);
+        }
         return queryWrapper;
     }
 }