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); + } + +}