From d3c988d86af48b930dfce3d9ace6655df9abe15b Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Wed, 24 Apr 2024 11:00:29 +0800 Subject: [PATCH] #44 --- pom.xml | 2 +- springboot-starter-data-fast/pom.xml | 2 +- springboot-starter-security/pom.xml | 2 +- springboot-starter/pom.xml | 2 +- .../framework/dto/request/SearchRequest.java | 81 +++++++++++++++---- 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 6bcb044d..631d99da 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ com.codingapi.springboot springboot-parent - 2.8.0 + 2.8.1 https://github.com/codingapi/springboot-framewrok springboot-parent diff --git a/springboot-starter-data-fast/pom.xml b/springboot-starter-data-fast/pom.xml index 027c6057..d2ff620f 100644 --- a/springboot-starter-data-fast/pom.xml +++ b/springboot-starter-data-fast/pom.xml @@ -5,7 +5,7 @@ springboot-parent com.codingapi.springboot - 2.8.0 + 2.8.1 4.0.0 diff --git a/springboot-starter-security/pom.xml b/springboot-starter-security/pom.xml index f7f43525..b850a475 100644 --- a/springboot-starter-security/pom.xml +++ b/springboot-starter-security/pom.xml @@ -6,7 +6,7 @@ springboot-parent com.codingapi.springboot - 2.8.0 + 2.8.1 springboot-starter-security diff --git a/springboot-starter/pom.xml b/springboot-starter/pom.xml index 386380dd..cc8b7b28 100644 --- a/springboot-starter/pom.xml +++ b/springboot-starter/pom.xml @@ -5,7 +5,7 @@ com.codingapi.springboot springboot-parent - 2.8.0 + 2.8.1 springboot-starter diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/SearchRequest.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/SearchRequest.java index 07c53bdd..2e95c80f 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/SearchRequest.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/SearchRequest.java @@ -3,6 +3,8 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import lombok.Getter; +import lombok.Setter; import org.springframework.data.domain.Sort; import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; @@ -12,9 +14,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Base64; -import java.util.Enumeration; import java.util.List; -import java.util.stream.Collectors; /** * HttpServletRequest 请求参数解析成 PageRequest对象 @@ -46,17 +46,21 @@ public void setPageSize(int pageSize) { this.removeKeys.add("pageSize"); } - private String decode(String value) { - return new String(Base64.getDecoder().decode(value)); - } - - public void addSort(Sort sort) { pageRequest.addSort(sort); } public void removeFilter(String key) { pageRequest.removeFilter(key); + this.removeKeys.add(key); + } + + public String getParameter(String key) { + return request.getParameter(key); + } + + public String[] getParameterValues(String key) { + return request.getParameterValues(key); } public PageRequest addFilter(String key, Relation relation, Object... value) { @@ -75,6 +79,12 @@ public PageRequest orFilters(Filter... filters) { return pageRequest.orFilters(filters); } + + private String decode(String value) { + return new String(Base64.getDecoder().decode(value)); + } + + static class ClassContent { private final Class clazz; @@ -85,6 +95,12 @@ public ClassContent(Class clazz, PageRequest pageRequest) { this.pageRequest = pageRequest; } + public void addFilter(String key, Relation relation, String value) { + Class keyClass = getKeyType(key); + Object v = parseObject(value, keyClass); + pageRequest.addFilter(key, relation, v); + } + public void addFilter(String key, String value) { Class keyClass = getKeyType(key); Object v = parseObject(value, keyClass); @@ -92,7 +108,7 @@ public void addFilter(String key, String value) { } private Object parseObject(String value, Class keyClass) { - if(value.getClass().equals(keyClass)) { + if (value.getClass().equals(keyClass)) { return value; } return JSON.parseObject(value, keyClass); @@ -124,12 +140,37 @@ private Class getKeyType(String key) { } + @Setter + @Getter + static class ParamOperation { + private String key; + private String type; + + public Relation getOperation() { + return Relation.valueOf(type); + } + } + + private List loadParamOperations() { + String params = request.getParameter("params"); + if (StringUtils.hasLength(params)) { + params = decode(params); + if (JSON.isValid(params)) { + removeKeys.add("params"); + return JSON.parseArray(params, ParamOperation.class); + } + } + return null; + } + public PageRequest toPageRequest(Class clazz) { pageRequest.setCurrent(current); pageRequest.setPageSize(pageSize); ClassContent content = new ClassContent(clazz, pageRequest); + List loadParams = loadParamOperations(); + String sort = request.getParameter("sort"); if (StringUtils.hasLength(sort)) { sort = decode(sort); @@ -157,24 +198,34 @@ public PageRequest toPageRequest(Class clazz) { for (String key : jsonObject.keySet()) { JSONArray value = jsonObject.getJSONArray(key); if (value != null && !value.isEmpty()) { - List values = value.stream().map(Object::toString).collect(Collectors.toList()); + List values = value.stream().map(Object::toString).toList(); content.addFilter(key, values); } } } } - Enumeration enumeration = request.getParameterNames(); - while (enumeration.hasMoreElements()) { - String key = enumeration.nextElement(); + + request.getParameterNames().asIterator().forEachRemaining(key -> { if (!removeKeys.contains(key)) { String value = request.getParameter(key); if (StringUtils.hasLength(value)) { - content.addFilter(key, value); + if (loadParams != null) { + ParamOperation operation = loadParams.stream() + .filter(paramOperation -> paramOperation.getKey().equals(key)) + .findFirst() + .orElse(null); + if (operation != null) { + content.addFilter(key, operation.getOperation(), value); + } else { + content.addFilter(key, value); + } + } else { + content.addFilter(key, value); + } } } - } - + }); return pageRequest; }