From e1221dd1f918a6c8e8c319fe33cf6ae08c3d1205 Mon Sep 17 00:00:00 2001 From: weitang Date: Thu, 5 Jun 2025 09:48:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=93=E5=B1=95=E4=B8=80=E4=B8=AA=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=99=A8=E6=96=B9=E6=B3=95=EF=BC=8C=E6=9A=82=E6=97=B6?= =?UTF-8?q?=E4=B8=8D=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stdproject/common/FilterCondition.java | 12 +++ .../common/QueryWrapperBuilder.java | 92 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 backend/src/main/java/com/stdproject/common/FilterCondition.java create mode 100644 backend/src/main/java/com/stdproject/common/QueryWrapperBuilder.java diff --git a/backend/src/main/java/com/stdproject/common/FilterCondition.java b/backend/src/main/java/com/stdproject/common/FilterCondition.java new file mode 100644 index 0000000..ca9b61f --- /dev/null +++ b/backend/src/main/java/com/stdproject/common/FilterCondition.java @@ -0,0 +1,12 @@ +package com.stdproject.common; + +import lombok.Data; + +@Data +public class FilterCondition { + + private String field; + private String operator; // eq, ne, gt, ge, lt, le + private Object value; + +} diff --git a/backend/src/main/java/com/stdproject/common/QueryWrapperBuilder.java b/backend/src/main/java/com/stdproject/common/QueryWrapperBuilder.java new file mode 100644 index 0000000..e230d79 --- /dev/null +++ b/backend/src/main/java/com/stdproject/common/QueryWrapperBuilder.java @@ -0,0 +1,92 @@ +package com.stdproject.common; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.util.StringUtils; + +import java.util.Collection; +import java.util.Set; + +/** + * @Date: 2025/6/5 9:21 + * @Description: + */ +public class QueryWrapperBuilder { + + public static QueryWrapper buildQueryWrapper(PageRequest pageRequest) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + // 过滤条件 + if (pageRequest.getFilters() != null && !pageRequest.getFilters().isEmpty()) { + for (FilterCondition condition : pageRequest.getFilters()) { + String field = condition.getField(); + String op = condition.getOperator(); + Object val = condition.getValue(); + + if (!StringUtils.hasText(field) || ObjectUtil.isEmpty(val)) continue; + switch (op.toLowerCase()) { + case "eq": + queryWrapper.eq(field, val); + break; + case "like": + queryWrapper.like(field, val); + break; + case "left_like": + queryWrapper.likeLeft(field, val); + break; + case "right_like": + queryWrapper.likeRight(field, val); + break; + case "ne": + queryWrapper.ne(field, val); + break; + case "gt": + queryWrapper.gt(field, val); + break; + case "ge": + queryWrapper.ge(field, val); + break; + case "lt": + queryWrapper.lt(field, val); + break; + case "le": + queryWrapper.le(field, val); + break; + case "in": + if (val instanceof Collection) { + queryWrapper.in(field, (Collection) val); + } + break; + case "notin": + if (val instanceof Collection) { + queryWrapper.notIn(field, (Collection) val); + } + break; + default: + // 忽略不支持的操作符 + break; + } + } + } + + // 排序字段白名单校验 +// String orderBy = pageRequest.getOrderBy(); +// if (StringUtils.hasText(orderBy) && isAllowedOrderField(orderBy)) { +// if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) { +// queryWrapper.orderByAsc(orderBy); +// } else { +// queryWrapper.orderByDesc(orderBy); +// } +// } + return queryWrapper; + } + + private static final Set ALLOWED_ORDER_FIELDS = Set.of( + "username", "nickname", "email", "phone", "lastmodifydate", "age" + ); + + private static boolean isAllowedOrderField(String field) { + return ALLOWED_ORDER_FIELDS.contains(field); + } + +}