From 83a41539cef1c4a0a1859f4c9305e1f5ab0957f9 Mon Sep 17 00:00:00 2001 From: lorne <1991wangliang@gmail.com> Date: Wed, 11 Oct 2023 22:51:11 +0800 Subject: [PATCH 01/10] fix version --- .../springboot/security/controller/VersionController.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/controller/VersionController.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/controller/VersionController.java index 7d2385a8..03e8445d 100644 --- a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/controller/VersionController.java +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/controller/VersionController.java @@ -1,5 +1,6 @@ package com.codingapi.springboot.security.controller; +import com.codingapi.springboot.framework.dto.response.SingleResponse; import lombok.AllArgsConstructor; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; @@ -14,7 +15,7 @@ public class VersionController { private final Environment env; @GetMapping("/version") - public String version(){ - return env.getProperty("application.version","-"); + public SingleResponse version() { + return SingleResponse.of(env.getProperty("application.version", "-")); } } From fba18668bc0617b0fc76a9ec0c630c0901e0c14d Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Thu, 26 Oct 2023 23:58:45 +0800 Subject: [PATCH 02/10] add or search --- .../springboot/fast/query/QueryRequest.java | 188 +++++++++++------- .../framework/dto/request/PageRequest.java | 14 ++ 2 files changed, 127 insertions(+), 75 deletions(-) diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java index 73a8c834..66a4faaa 100644 --- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java +++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java @@ -48,6 +48,16 @@ public Example getExample() { } + private List getClazzProperties() { + List properties = new ArrayList<>(); + PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz); + for (PropertyDescriptor descriptor : descriptors) { + properties.add(descriptor.getName()); + } + return properties; + } + + public List getOrder(Root root, CriteriaBuilder criteriaBuilder) { List orderList = new ArrayList<>(); request.getSort().forEach(sort -> { @@ -62,86 +72,114 @@ public List getOrder(Root root, CriteriaBuilder criteriaBuilder) { public List getPredicate(Root root, CriteriaBuilder criteriaBuilder) { List predicates = new ArrayList<>(); + List properties = getClazzProperties(); for (String key : request.getFilters().keySet()) { PageRequest.Filter filter = request.getFilters().get(key); - if (filter.isEqual()) { - predicates.add(criteriaBuilder.equal(root.get(key), filter.getValue()[0])); - } - - if (filter.isLike()) { - String matchValue = (String) filter.getValue()[0]; - predicates.add(criteriaBuilder.like(root.get(key), "%" + matchValue + "%")); - } - - if (filter.isBetween()) { - Object value1 = filter.getValue()[0]; - Object value2 = filter.getValue()[2]; - if (value1 instanceof Integer && value2 instanceof Integer) { - predicates.add(criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2)); - } - - if (value1 instanceof Long && value2 instanceof Long) { - predicates.add(criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2)); - } - - if (value1 instanceof Date && value2 instanceof Date) { - predicates.add(criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2)); - } - } - - if (filter.isGreaterThan()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Date) value)); - } - } - - if (filter.isGreaterThanEqual()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value)); - } - } - - if (filter.isLessThan()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Date) value)); - } - } - - if (filter.isLessThanEqual()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value)); + if (filter.isOr() || properties.contains(key)) { + if (filter.isEqual()) { + predicates.add(criteriaBuilder.equal(root.get(key), filter.getValue()[0])); + } + + if (filter.isLike()) { + String matchValue = (String) filter.getValue()[0]; + predicates.add(criteriaBuilder.like(root.get(key), "%" + matchValue + "%")); + } + + if (filter.isBetween()) { + Object value1 = filter.getValue()[0]; + Object value2 = filter.getValue()[2]; + if (value1 instanceof Integer && value2 instanceof Integer) { + predicates.add(criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2)); + } + + if (value1 instanceof Long && value2 instanceof Long) { + predicates.add(criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2)); + } + + if (value1 instanceof Date && value2 instanceof Date) { + predicates.add(criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2)); + } + } + + if (filter.isGreaterThan()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + predicates.add(criteriaBuilder.greaterThan(root.get(key), (Integer) value)); + } + if (value instanceof Long) { + predicates.add(criteriaBuilder.greaterThan(root.get(key), (Long) value)); + } + if (value instanceof Date) { + predicates.add(criteriaBuilder.greaterThan(root.get(key), (Date) value)); + } + } + + if (filter.isGreaterThanEqual()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value)); + } + if (value instanceof Long) { + predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value)); + } + if (value instanceof Date) { + predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value)); + } + } + + if (filter.isLessThan()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + predicates.add(criteriaBuilder.lessThan(root.get(key), (Integer) value)); + } + if (value instanceof Long) { + predicates.add(criteriaBuilder.lessThan(root.get(key), (Long) value)); + } + if (value instanceof Date) { + predicates.add(criteriaBuilder.lessThan(root.get(key), (Date) value)); + } + } + + if (filter.isLessThanEqual()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value)); + } + if (value instanceof Long) { + predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value)); + } + if (value instanceof Date) { + predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value)); + } + } + + if (filter.isIn()) { + Object[] value = filter.getValue(); + predicates.add(criteriaBuilder.in(root.get(key)).value(value)); + } + + if (filter.isOr()) { + if(key.equals("OR")) { + Object[] value = filter.getValue(); + + // 创建Predicate的列表,用于收集所有的OR条件 + List orPredicates = new ArrayList<>(); + + // 循环遍历value数组,每两个为一组 + for (int i = 0; i < value.length; i += 2) { + orPredicates.add(criteriaBuilder.equal(root.get((String) value[i]), value[i + 1])); + } + + // 使用or方法连接所有的Predicate + predicates.add(criteriaBuilder.or(orPredicates.toArray(new Predicate[0]))); + }else{ + Object[] value = filter.getValue(); + predicates.add(criteriaBuilder.equal(root.get(key), value[0])); + } } } } return predicates; } -} +} \ No newline at end of file diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java index 00097951..d760d9f6 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java @@ -205,6 +205,15 @@ public PageRequest addFilter(String key, Object... value) { return this.addFilter(key, FilterRelation.EUQAL, value); } + public PageRequest addOrFilters(Object... value) { + // 检查value数组是否为偶数长度,因为我们需要成对处理它 + if (value.length % 2 != 0) { + throw new IllegalArgumentException("Invalid number of elements in value array."); + } + + return this.addFilter("OR", FilterRelation.OR, value); + } + public boolean hasFilter() { return !this.filters.isEmpty(); } @@ -233,6 +242,10 @@ public boolean isIn() { return relation == FilterRelation.IN; } + public boolean isOr() { + return relation == FilterRelation.OR; + } + public boolean isGreaterThan() { return relation == FilterRelation.GREATER_THAN; } @@ -287,6 +300,7 @@ public enum FilterRelation { LESS_THAN, GREATER_THAN_EQUAL, LESS_THAN_EQUAL, + OR, } From c901b429fced6a6cd2f850c7e6ab2fdbfa4f4d15 Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Fri, 27 Oct 2023 17:19:38 +0800 Subject: [PATCH 03/10] add postHandle --- .../springboot/security/AutoConfiguration.java | 16 ++++++++++++++-- .../security/filter/MyLoginFilter.java | 2 ++ .../security/filter/SecurityLoginHandler.java | 6 ++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java index ba56c691..525b480a 100644 --- a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java @@ -2,9 +2,12 @@ import com.codingapi.springboot.security.configurer.HttpSecurityConfigurer; import com.codingapi.springboot.security.controller.VersionController; +import com.codingapi.springboot.security.dto.request.LoginRequest; import com.codingapi.springboot.security.filter.*; import com.codingapi.springboot.security.jwt.Jwt; import com.codingapi.springboot.security.properties.SecurityJwtProperties; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -57,8 +60,17 @@ public PasswordEncoder passwordEncoder() { @Bean @ConditionalOnMissingBean public SecurityLoginHandler securityLoginHandler(){ - return (request, response, handler) -> { - }; + return new SecurityLoginHandler() { + @Override + public void preHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler) throws Exception { + + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler) { + + } + }; } diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyLoginFilter.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyLoginFilter.java index f472ed99..33908dc6 100644 --- a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyLoginFilter.java +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyLoginFilter.java @@ -84,7 +84,9 @@ protected void successfulAuthentication(HttpServletRequest request, HttpServletR String content = JSONObject.toJSONString(SingleResponse.of(login)); IOUtils.write(content, response.getOutputStream(), StandardCharsets.UTF_8); + loginHandler.postHandle(request,response,loginRequest); LoginRequestContext.getInstance().clean(); + } diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/SecurityLoginHandler.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/SecurityLoginHandler.java index 5ad14115..0c1fa9fd 100644 --- a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/SecurityLoginHandler.java +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/SecurityLoginHandler.java @@ -1,11 +1,13 @@ package com.codingapi.springboot.security.filter; import com.codingapi.springboot.security.dto.request.LoginRequest; - import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; public interface SecurityLoginHandler { - void preHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler) throws Exception; + void preHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler) throws Exception; + + void postHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler); + } From bf554856ff4d12c637feabfb35243ac7d74c6d41 Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Fri, 27 Oct 2023 17:40:09 +0800 Subject: [PATCH 04/10] add AuthenticationTokenFilter --- .../springboot/security/AutoConfiguration.java | 16 +++++++++++++--- .../configurer/HttpSecurityConfigurer.java | 4 +++- .../filter/AuthenticationTokenFilter.java | 10 ++++++++++ .../security/filter/MyAuthenticationFilter.java | 7 +++++-- .../security/filter/MyLoginFilter.java | 2 +- .../security/filter/SecurityLoginHandler.java | 3 ++- 6 files changed, 34 insertions(+), 8 deletions(-) create mode 100644 springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/AuthenticationTokenFilter.java diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java index 525b480a..b449746a 100644 --- a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/AutoConfiguration.java @@ -5,7 +5,9 @@ import com.codingapi.springboot.security.dto.request.LoginRequest; import com.codingapi.springboot.security.filter.*; import com.codingapi.springboot.security.jwt.Jwt; +import com.codingapi.springboot.security.jwt.Token; import com.codingapi.springboot.security.properties.SecurityJwtProperties; +import jakarta.servlet.FilterChain; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -67,17 +69,25 @@ public void preHandle(HttpServletRequest request, HttpServletResponse response, } @Override - public void postHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler) { + public void postHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler, Token token) { } }; } + @Bean + @ConditionalOnMissingBean + public AuthenticationTokenFilter authenticationTokenFilter(){ + return (request, response, chain) -> { + + }; + } + @Bean @ConditionalOnMissingBean public SecurityFilterChain filterChain(HttpSecurity security, Jwt jwt,SecurityLoginHandler loginHandler, - SecurityJwtProperties properties) throws Exception { + SecurityJwtProperties properties,AuthenticationTokenFilter authenticationTokenFilter) throws Exception { //disable basic auth security.httpBasic().disable(); @@ -86,7 +96,7 @@ public SecurityFilterChain filterChain(HttpSecurity security, Jwt jwt,SecurityLo if(properties.isDisableCsrf() ){ security.csrf().disable(); } - security.apply(new HttpSecurityConfigurer(jwt,loginHandler,properties)); + security.apply(new HttpSecurityConfigurer(jwt,loginHandler,properties,authenticationTokenFilter)); security .exceptionHandling() .authenticationEntryPoint(new MyUnAuthenticationEntryPoint()) diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/configurer/HttpSecurityConfigurer.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/configurer/HttpSecurityConfigurer.java index d46a3a0b..c95ec34e 100644 --- a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/configurer/HttpSecurityConfigurer.java +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/configurer/HttpSecurityConfigurer.java @@ -1,5 +1,6 @@ package com.codingapi.springboot.security.configurer; +import com.codingapi.springboot.security.filter.AuthenticationTokenFilter; import com.codingapi.springboot.security.filter.MyAuthenticationFilter; import com.codingapi.springboot.security.filter.MyLoginFilter; import com.codingapi.springboot.security.filter.SecurityLoginHandler; @@ -17,11 +18,12 @@ public class HttpSecurityConfigurer extends AbstractHttpConfigurer Date: Sat, 28 Oct 2023 00:09:44 +0800 Subject: [PATCH 05/10] fix Filter --- .../springboot/fast/query/FastRepository.java | 4 +- .../springboot/fast/query/QueryRequest.java | 221 +++++++++--------- .../springboot/fast/DemoRepositoryTest.java | 52 ++++- .../springboot/fast/entity/Demo.java | 2 + .../framework/dto/request/Filter.java | 95 ++++++++ .../framework/dto/request/PageRequest.java | 157 ++----------- .../framework/dto/request/Relation.java | 13 ++ .../framework/dto/request/RequestFilter.java | 94 ++++++++ 8 files changed, 384 insertions(+), 254 deletions(-) create mode 100644 springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java create mode 100644 springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Relation.java create mode 100644 springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java index aeaa080b..81056219 100644 --- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java +++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java @@ -17,7 +17,7 @@ public interface FastRepository extends JpaRepository, JpaSpecificationExecutor, DynamicRepository { default Page findAll(PageRequest request) { - if (request.hasFilter()) { + if (request.getRequestFilter().hasFilter()) { Class clazz = getDomainClass(); QueryRequest queryRequest = new QueryRequest(request, clazz); return findAll(queryRequest.getExample(), request); @@ -34,7 +34,7 @@ default Class getDomainClass() { default Page pageRequest(PageRequest request) { - if (request.hasFilter()) { + if (request.getRequestFilter().hasFilter()) { Class clazz = getDomainClass(); Specification specification = (root, query, criteriaBuilder) -> { QueryRequest queryRequest = new QueryRequest(request, clazz); diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java index 66a4faaa..11133429 100644 --- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java +++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java @@ -1,6 +1,8 @@ package com.codingapi.springboot.fast.query; +import com.codingapi.springboot.framework.dto.request.Filter; import com.codingapi.springboot.framework.dto.request.PageRequest; +import com.codingapi.springboot.framework.dto.request.RequestFilter; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Order; import jakarta.persistence.criteria.Predicate; @@ -24,7 +26,8 @@ public QueryRequest(PageRequest request, Class clazz) { } public Example getExample() { - if (!request.hasFilter()) { + RequestFilter requestFilter = request.getRequestFilter(); + if (!requestFilter.hasFilter()) { return null; } Object entity = null; @@ -36,7 +39,7 @@ public Example getExample() { PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz); for (PropertyDescriptor descriptor : descriptors) { String name = descriptor.getName(); - PageRequest.Filter value = request.getFilters().get(name); + Filter value = requestFilter.getFilter(name); if (value != null) { try { descriptor.getWriteMethod().invoke(entity, value.getFilterValue(descriptor.getPropertyType())); @@ -70,116 +73,120 @@ public List getOrder(Root root, CriteriaBuilder criteriaBuilder) { return orderList; } + + private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root root, List properties) { + String key = filter.getKey(); + if (filter.isOr() || properties.contains(key)) { + + if (filter.isEqual()) { + return criteriaBuilder.equal(root.get(key), filter.getValue()[0]); + } + + if (filter.isLike()) { + String matchValue = (String) filter.getValue()[0]; + return criteriaBuilder.like(root.get(key), "%" + matchValue + "%"); + } + + if (filter.isBetween()) { + Object value1 = filter.getValue()[0]; + Object value2 = filter.getValue()[2]; + if (value1 instanceof Integer && value2 instanceof Integer) { + return criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2); + } + + if (value1 instanceof Long && value2 instanceof Long) { + return criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2); + } + + if (value1 instanceof Date && value2 instanceof Date) { + return criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2); + } + } + + if (filter.isGreaterThan()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + return criteriaBuilder.greaterThan(root.get(key), (Integer) value); + } + if (value instanceof Long) { + return criteriaBuilder.greaterThan(root.get(key), (Long) value); + } + if (value instanceof Date) { + return criteriaBuilder.greaterThan(root.get(key), (Date) value); + } + } + + if (filter.isGreaterThanEqual()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value); + } + if (value instanceof Long) { + return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value); + } + if (value instanceof Date) { + return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value); + } + } + + if (filter.isLessThan()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + return criteriaBuilder.lessThan(root.get(key), (Integer) value); + } + if (value instanceof Long) { + return criteriaBuilder.lessThan(root.get(key), (Long) value); + } + if (value instanceof Date) { + return criteriaBuilder.lessThan(root.get(key), (Date) value); + } + } + + if (filter.isLessThanEqual()) { + Object value = filter.getValue()[0]; + if (value instanceof Integer) { + return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value); + } + if (value instanceof Long) { + return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value); + } + if (value instanceof Date) { + return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value); + } + } + + if (filter.isIn()) { + Object[] value = filter.getValue(); + CriteriaBuilder.In in = criteriaBuilder.in(root.get(key)); + for (Object item : value) { + in.value(item); + } + return in; + } + + if (filter.isOr()) { + Filter[] orFilters = (Filter[]) filter.getValue(); + List orPredicates = new ArrayList<>(); + for (Filter orFilter : orFilters) { + orPredicates.add(toPredicate(orFilter, criteriaBuilder, root, properties)); + } + return criteriaBuilder.or(orPredicates.toArray(new Predicate[0])); + } + } + return null; + } + + public List getPredicate(Root root, CriteriaBuilder criteriaBuilder) { List predicates = new ArrayList<>(); List properties = getClazzProperties(); - for (String key : request.getFilters().keySet()) { - PageRequest.Filter filter = request.getFilters().get(key); - if (filter.isOr() || properties.contains(key)) { - if (filter.isEqual()) { - predicates.add(criteriaBuilder.equal(root.get(key), filter.getValue()[0])); - } - - if (filter.isLike()) { - String matchValue = (String) filter.getValue()[0]; - predicates.add(criteriaBuilder.like(root.get(key), "%" + matchValue + "%")); - } - - if (filter.isBetween()) { - Object value1 = filter.getValue()[0]; - Object value2 = filter.getValue()[2]; - if (value1 instanceof Integer && value2 instanceof Integer) { - predicates.add(criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2)); - } - - if (value1 instanceof Long && value2 instanceof Long) { - predicates.add(criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2)); - } - - if (value1 instanceof Date && value2 instanceof Date) { - predicates.add(criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2)); - } - } - - if (filter.isGreaterThan()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Date) value)); - } - } - - if (filter.isGreaterThanEqual()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value)); - } - } - - if (filter.isLessThan()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Date) value)); - } - } - - if (filter.isLessThanEqual()) { - Object value = filter.getValue()[0]; - if (value instanceof Integer) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value)); - } - if (value instanceof Long) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value)); - } - if (value instanceof Date) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value)); - } - } - - if (filter.isIn()) { - Object[] value = filter.getValue(); - predicates.add(criteriaBuilder.in(root.get(key)).value(value)); - } - - if (filter.isOr()) { - if(key.equals("OR")) { - Object[] value = filter.getValue(); - - // 创建Predicate的列表,用于收集所有的OR条件 - List orPredicates = new ArrayList<>(); - - // 循环遍历value数组,每两个为一组 - for (int i = 0; i < value.length; i += 2) { - orPredicates.add(criteriaBuilder.equal(root.get((String) value[i]), value[i + 1])); - } - - // 使用or方法连接所有的Predicate - predicates.add(criteriaBuilder.or(orPredicates.toArray(new Predicate[0]))); - }else{ - Object[] value = filter.getValue(); - predicates.add(criteriaBuilder.equal(root.get(key), value[0])); - } - } + RequestFilter requestFilter = request.getRequestFilter(); + for (Filter filter : requestFilter.getFilters()) { + Predicate predicate = toPredicate(filter, criteriaBuilder, root, properties); + if (predicate != null) { + predicates.add(predicate); } } - return predicates; } } \ No newline at end of file diff --git a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java index c1e74ebb..8b65a65a 100644 --- a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java +++ b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java @@ -2,7 +2,10 @@ import com.codingapi.springboot.fast.entity.Demo; import com.codingapi.springboot.fast.repository.DemoRepository; +import com.codingapi.springboot.framework.dto.request.Filter; import com.codingapi.springboot.framework.dto.request.PageRequest; +import com.codingapi.springboot.framework.dto.request.Relation; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -16,6 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +@Slf4j @SpringBootTest public class DemoRepositoryTest { @@ -68,13 +72,59 @@ void pageRequest() { PageRequest request = new PageRequest(); request.setCurrent(1); request.setPageSize(10); - request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%"); + request.addFilter("name", Relation.LIKE, "%2%"); Page page = demoRepository.pageRequest(request); assertEquals(1, page.getTotalElements()); } + @Test + void customInSearch() { + demoRepository.deleteAll(); + Demo demo1 = new Demo(); + demo1.setName("123"); + demoRepository.save(demo1); + + Demo demo2 = new Demo(); + demo2.setName("456"); + demoRepository.save(demo2); + + PageRequest request = new PageRequest(); + request.setCurrent(1); + request.setPageSize(10); + + request.addFilter("id", Relation.IN, 1, 2, 3); + + Page page = demoRepository.pageRequest(request); + log.info("demo:{}", page.getContent()); + assertEquals(2, page.getTotalElements()); + } + + + @Test + void customOrSearch() { + demoRepository.deleteAll(); + Demo demo1 = new Demo(); + demo1.setName("123"); + demoRepository.save(demo1); + + Demo demo2 = new Demo(); + demo2.setName("456"); + demoRepository.save(demo2); + + PageRequest request = new PageRequest(); + request.setCurrent(1); + request.setPageSize(10); + + + request.orFilters(Filter.as("id", Relation.IN, 1, 2, 3), Filter.as("name", "123")); + + Page page = demoRepository.pageRequest(request); + log.info("demo:{}", page.getContent()); + assertEquals(2, page.getTotalElements()); + } + @Test void dynamicListQuery() { demoRepository.deleteAll(); diff --git a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/entity/Demo.java b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/entity/Demo.java index 6e4fe6e3..b4d02d16 100644 --- a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/entity/Demo.java +++ b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/entity/Demo.java @@ -5,11 +5,13 @@ import lombok.Setter; import jakarta.persistence.*; +import lombok.ToString; @Setter @Getter @Entity @Table(name = "t_demo") +@ToString public class Demo implements ISort { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java new file mode 100644 index 00000000..0332c30d --- /dev/null +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java @@ -0,0 +1,95 @@ +package com.codingapi.springboot.framework.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Filter { + + private String key; + private Object[] value; + private Relation relation; + + public Filter(String key, Relation relation, Object... value) { + this.key = key; + this.value = value; + this.relation = relation; + } + + public Filter(String key, Object... value) { + this(key, Relation.EQUAL, value); + } + + public Filter(Filter... value) { + this(null, null, value); + } + + public static Filter as(String key, Relation relation, Object... value) { + return new Filter(key, relation, value); + } + + public static Filter as(String key, Object... value) { + return new Filter(key, value); + } + + public static Filter as(Filter... value) { + return new Filter(value); + } + + public boolean isEqual() { + return relation == Relation.EQUAL; + } + + public boolean isLike() { + return relation == Relation.LIKE; + } + + public boolean isBetween() { + return relation == Relation.BETWEEN; + } + + public boolean isIn() { + return relation == Relation.IN; + } + + public boolean isOr() { + return value != null && value.length > 0 && value[0] instanceof Filter; + } + + public boolean isGreaterThan() { + return relation == Relation.GREATER_THAN; + } + + public boolean isLessThan() { + return relation == Relation.LESS_THAN; + } + + public boolean isGreaterThanEqual() { + return relation == Relation.GREATER_THAN_EQUAL; + } + + public boolean isLessThanEqual() { + return relation == Relation.LESS_THAN_EQUAL; + } + + public Object getFilterValue(Class clazz) { + Object val = value[0]; + if (val instanceof String) { + if (clazz == Integer.class) { + return Integer.parseInt((String) val); + } + if (clazz == Long.class) { + return Long.parseLong((String) val); + } + if (clazz == Double.class) { + return Double.parseDouble((String) val); + } + if (clazz == Float.class) { + return Float.parseFloat((String) val); + } + } + return value[0]; + } + +} diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java index d760d9f6..bd520810 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java @@ -2,16 +2,11 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.Getter; -import lombok.Setter; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.util.StringUtils; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; public class PageRequest extends org.springframework.data.domain.PageRequest { @@ -21,7 +16,7 @@ public class PageRequest extends org.springframework.data.domain.PageRequest { private int pageSize; @Getter - private final Map filters = new HashMap<>(); + private final RequestFilter requestFilter = new RequestFilter(); @Getter private HttpServletRequest servletRequest; @@ -37,23 +32,12 @@ public PageRequest(int current, int pageSize, Sort sort) { try { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); this.servletRequest = attributes.getRequest(); - this.syncParameter(); + requestFilter.syncParameter(servletRequest); } catch (Exception e) { } } - private void syncParameter() { - Enumeration enumeration = servletRequest.getParameterNames(); - while (enumeration.hasMoreElements()) { - String key = enumeration.nextElement(); - String value = servletRequest.getParameter(key); - if (StringUtils.hasText(value)) { - addFilter(key, value); - } - } - } - public PageRequest() { this(0, 20, Sort.unsorted()); } @@ -80,44 +64,22 @@ public int getIntParameter(String key, int defaultValue) { return result == null ? defaultValue : Integer.parseInt(result); } - public String getStringFilter(String key) { - Filter filter = (Filter) filters.get(key); - if (filter != null) { - return (String) filter.getValue()[0]; - } - return null; + return requestFilter.getStringFilter(key); } public String getStringFilter(String key, String defaultValue) { - String value = getStringFilter(key); - if (!StringUtils.hasText(value)) { - return defaultValue; - } - return value; + return requestFilter.getStringFilter(key, defaultValue); } public int getIntFilter(String key) { - Filter filter = (Filter) filters.get(key); - if (filter != null) { - String value = (String) filter.getValue()[0]; - if (StringUtils.hasText(value)) { - return Integer.parseInt(value); - } - return 0; - } - return 0; + return requestFilter.getIntFilter(key); } public int getIntFilter(String key, int defaultValue) { - int value = getIntFilter(key); - if (value == 0) { - return defaultValue; - } - return value; + return requestFilter.getIntFilter(key, defaultValue); } - @Override public int getPageSize() { return pageSize; @@ -196,114 +158,21 @@ public void addSort(Sort sort) { } } - public PageRequest addFilter(String key, FilterRelation relation, Object... value) { - putFilter(key, relation, value); + public PageRequest addFilter(String key, Relation relation, Object... value) { + requestFilter.addFilter(key, relation, value); return this; } public PageRequest addFilter(String key, Object... value) { - return this.addFilter(key, FilterRelation.EUQAL, value); - } - - public PageRequest addOrFilters(Object... value) { - // 检查value数组是否为偶数长度,因为我们需要成对处理它 - if (value.length % 2 != 0) { - throw new IllegalArgumentException("Invalid number of elements in value array."); - } - - return this.addFilter("OR", FilterRelation.OR, value); - } - - public boolean hasFilter() { - return !this.filters.isEmpty(); - } - - @Setter - @Getter - public static class Filter { - private String key; - private Object[] value; - - private FilterRelation relation; - - public boolean isEqual() { - return relation == FilterRelation.EUQAL; - } - - public boolean isLike() { - return relation == FilterRelation.LIKE; - } - - public boolean isBetween() { - return relation == FilterRelation.BETWEEN; - } - - public boolean isIn() { - return relation == FilterRelation.IN; - } - - public boolean isOr() { - return relation == FilterRelation.OR; - } - - public boolean isGreaterThan() { - return relation == FilterRelation.GREATER_THAN; - } - - public boolean isLessThan() { - return relation == FilterRelation.LESS_THAN; - } - - public boolean isGreaterThanEqual() { - return relation == FilterRelation.GREATER_THAN_EQUAL; - } - - public boolean isLessThanEqual() { - return relation == FilterRelation.LESS_THAN_EQUAL; - } - - public Object getFilterValue(Class clazz) { - Object val = value[0]; - if (val instanceof String) { - if (clazz == Integer.class) { - return Integer.parseInt((String) val); - } - if (clazz == Long.class) { - return Long.parseLong((String) val); - } - if (clazz == Double.class) { - return Double.parseDouble((String) val); - } - if (clazz == Float.class) { - return Float.parseFloat((String) val); - } - } - return value[0]; - } - - } - - private void putFilter(String key, FilterRelation relation, Object... val) { - Filter filter = new Filter(); - filter.setKey(key); - filter.setValue(val); - filter.setRelation(relation); - this.filters.put(key, filter); + requestFilter.addFilter(key, value); + return this; } - public enum FilterRelation { - EUQAL, - LIKE, - BETWEEN, - IN, - GREATER_THAN, - LESS_THAN, - GREATER_THAN_EQUAL, - LESS_THAN_EQUAL, - OR, + public PageRequest orFilters(Filter... filters) { + requestFilter.orFilters(filters); + return this; } - public static PageRequest of(int page, int size) { return new PageRequest(page, size, Sort.unsorted()); } diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Relation.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Relation.java new file mode 100644 index 00000000..a5b3eaa0 --- /dev/null +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Relation.java @@ -0,0 +1,13 @@ +package com.codingapi.springboot.framework.dto.request; + +public enum Relation { + + EQUAL, + LIKE, + BETWEEN, + IN, + GREATER_THAN, + LESS_THAN, + GREATER_THAN_EQUAL, + LESS_THAN_EQUAL, +} diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java new file mode 100644 index 00000000..ffccf5b8 --- /dev/null +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java @@ -0,0 +1,94 @@ +package com.codingapi.springboot.framework.dto.request; + +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.util.StringUtils; + +import java.util.*; + +public class RequestFilter { + + private final Map filterMap = new HashMap<>(); + private final List filterList = new ArrayList<>(); + + public RequestFilter addFilter(String key, Relation relation, Object... value) { + this.pushFilter(new Filter(key, relation, value)); + return this; + } + + public RequestFilter addFilter(String key, Object... value) { + this.pushFilter(new Filter(key, value)); + return this; + } + + public RequestFilter orFilters(Filter... value) { + this.pushFilter(new Filter(value)); + return this; + } + + public List getFilters() { + return filterList; + } + + public void pushFilter(Filter filter) { + filterList.add(filter); + filterMap.put(filter.getKey(), filter); + } + + public void syncParameter(HttpServletRequest servletRequest) { + Enumeration enumeration = servletRequest.getParameterNames(); + while (enumeration.hasMoreElements()) { + String key = enumeration.nextElement(); + String value = servletRequest.getParameter(key); + if (StringUtils.hasText(value)) { + addFilter(key, value); + } + } + } + + + public String getStringFilter(String key) { + Filter filter = filterMap.get(key); + if (filter != null) { + return (String) filter.getValue()[0]; + } + return null; + } + + public String getStringFilter(String key, String defaultValue) { + String value = getStringFilter(key); + if (!StringUtils.hasText(value)) { + return defaultValue; + } + return value; + } + + public int getIntFilter(String key) { + Filter filter = filterMap.get(key); + if (filter != null) { + String value = (String) filter.getValue()[0]; + if (StringUtils.hasText(value)) { + return Integer.parseInt(value); + } + return 0; + } + return 0; + } + + public int getIntFilter(String key, int defaultValue) { + int value = getIntFilter(key); + if (value == 0) { + return defaultValue; + } + return value; + } + + + public boolean hasFilter() { + return !this.filterMap.isEmpty(); + } + + + public Filter getFilter(String name) { + return this.filterMap.get(name); + } +} From c98188061c117d525d2d709eb1b1f77af0b763d3 Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Sat, 28 Oct 2023 00:16:42 +0800 Subject: [PATCH 06/10] fix Filter --- .../com/codingapi/springboot/fast/query/FastRepository.java | 6 +++--- .../springboot/framework/dto/request/PageRequest.java | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java index 81056219..f0476355 100644 --- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java +++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java @@ -14,10 +14,10 @@ import java.util.List; @NoRepositoryBean -public interface FastRepository extends JpaRepository, JpaSpecificationExecutor, DynamicRepository { +public interface FastRepository extends JpaRepository, JpaSpecificationExecutor, DynamicRepository { default Page findAll(PageRequest request) { - if (request.getRequestFilter().hasFilter()) { + if (request.hasFilter()) { Class clazz = getDomainClass(); QueryRequest queryRequest = new QueryRequest(request, clazz); return findAll(queryRequest.getExample(), request); @@ -34,7 +34,7 @@ default Class getDomainClass() { default Page pageRequest(PageRequest request) { - if (request.getRequestFilter().hasFilter()) { + if (request.hasFilter()) { Class clazz = getDomainClass(); Specification specification = (root, query, criteriaBuilder) -> { QueryRequest queryRequest = new QueryRequest(request, clazz); diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java index bd520810..a827f9c8 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java @@ -80,6 +80,10 @@ public int getIntFilter(String key, int defaultValue) { return requestFilter.getIntFilter(key, defaultValue); } + public boolean hasFilter() { + return requestFilter.hasFilter(); + } + @Override public int getPageSize() { return pageSize; From e33afcc505c4eb600a35265bdf3b4f0630d0d368 Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Sat, 28 Oct 2023 00:32:36 +0800 Subject: [PATCH 07/10] fix Filter --- .../com/codingapi/springboot/fast/query/QueryRequest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java index 11133429..9f15595d 100644 --- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java +++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java @@ -168,7 +168,10 @@ private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder Filter[] orFilters = (Filter[]) filter.getValue(); List orPredicates = new ArrayList<>(); for (Filter orFilter : orFilters) { - orPredicates.add(toPredicate(orFilter, criteriaBuilder, root, properties)); + Predicate predicate = toPredicate(orFilter, criteriaBuilder, root, properties); + if (predicate != null) { + orPredicates.add(predicate); + } } return criteriaBuilder.or(orPredicates.toArray(new Predicate[0])); } From 22593353647743bb32c0bac905563dd03c781da5 Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Sat, 28 Oct 2023 01:53:58 +0800 Subject: [PATCH 08/10] fix Filter --- .../springboot/fast/query/QueryRequest.java | 16 +++++++++++-- .../framework/dto/request/Filter.java | 23 ++++++++++++++----- .../framework/dto/request/RequestFilter.java | 7 +++++- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java index 9f15595d..d0945ed6 100644 --- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java +++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java @@ -76,7 +76,7 @@ public List getOrder(Root root, CriteriaBuilder criteriaBuilder) { private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root root, List properties) { String key = filter.getKey(); - if (filter.isOr() || properties.contains(key)) { + if (filter.isAddFilters() || filter.isOrFilters() || properties.contains(key)) { if (filter.isEqual()) { return criteriaBuilder.equal(root.get(key), filter.getValue()[0]); @@ -164,7 +164,7 @@ private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder return in; } - if (filter.isOr()) { + if (filter.isOrFilters()) { Filter[] orFilters = (Filter[]) filter.getValue(); List orPredicates = new ArrayList<>(); for (Filter orFilter : orFilters) { @@ -175,6 +175,18 @@ private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder } return criteriaBuilder.or(orPredicates.toArray(new Predicate[0])); } + + if (filter.isAddFilters()) { + Filter[] orFilters = (Filter[]) filter.getValue(); + List addPredicates = new ArrayList<>(); + for (Filter orFilter : orFilters) { + Predicate predicate = toPredicate(orFilter, criteriaBuilder, root, properties); + if (predicate != null) { + addPredicates.add(predicate); + } + } + return criteriaBuilder.and(addPredicates.toArray(new Predicate[0])); + } } return null; } diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java index 0332c30d..fc818f63 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java @@ -7,6 +7,9 @@ @Getter public class Filter { + public static final String FILTER_OR_KEY = "FILTER_OR_KEY"; + public static final String FILTER_ADD_KEY = "FILTER_ADD_KEY"; + private String key; private Object[] value; private Relation relation; @@ -21,8 +24,8 @@ public Filter(String key, Object... value) { this(key, Relation.EQUAL, value); } - public Filter(Filter... value) { - this(null, null, value); + public Filter(String key, Filter... value) { + this(key, null, value); } public static Filter as(String key, Relation relation, Object... value) { @@ -33,8 +36,12 @@ public static Filter as(String key, Object... value) { return new Filter(key, value); } - public static Filter as(Filter... value) { - return new Filter(value); + public static Filter and(Filter... value) { + return new Filter(FILTER_ADD_KEY, value); + } + + public static Filter or(Filter... value) { + return new Filter(FILTER_OR_KEY, value); } public boolean isEqual() { @@ -53,8 +60,12 @@ public boolean isIn() { return relation == Relation.IN; } - public boolean isOr() { - return value != null && value.length > 0 && value[0] instanceof Filter; + public boolean isOrFilters() { + return FILTER_OR_KEY.equals(key); + } + + public boolean isAddFilters() { + return FILTER_ADD_KEY.equals(key); } public boolean isGreaterThan() { diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java index ffccf5b8..7f1ff8e4 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java @@ -20,8 +20,13 @@ public RequestFilter addFilter(String key, Object... value) { return this; } + public RequestFilter addFilters(Filter... value) { + this.pushFilter(new Filter(Filter.FILTER_ADD_KEY, value)); + return this; + } + public RequestFilter orFilters(Filter... value) { - this.pushFilter(new Filter(value)); + this.pushFilter(new Filter(Filter.FILTER_OR_KEY, value)); return this; } From ba3eb8865a820dc774cb17532bbd3016e6f5a535 Mon Sep 17 00:00:00 2001 From: lorne <1991wangliang@gmail.com> Date: Sat, 28 Oct 2023 12:28:11 +0800 Subject: [PATCH 09/10] update 3.1.3 --- .../com/codingapi/springboot/fast/query/QueryRequest.java | 4 ++-- .../com/codingapi/springboot/fast/DemoRepositoryTest.java | 4 ++-- .../springboot/framework/dto/request/Filter.java | 8 ++++---- .../springboot/framework/dto/request/PageRequest.java | 7 ++++++- .../springboot/framework/dto/request/RequestFilter.java | 4 ++-- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java index d0945ed6..9bf11b71 100644 --- a/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java +++ b/springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java @@ -76,7 +76,7 @@ public List getOrder(Root root, CriteriaBuilder criteriaBuilder) { private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root root, List properties) { String key = filter.getKey(); - if (filter.isAddFilters() || filter.isOrFilters() || properties.contains(key)) { + if (filter.isAndFilters() || filter.isOrFilters() || properties.contains(key)) { if (filter.isEqual()) { return criteriaBuilder.equal(root.get(key), filter.getValue()[0]); @@ -176,7 +176,7 @@ private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder return criteriaBuilder.or(orPredicates.toArray(new Predicate[0])); } - if (filter.isAddFilters()) { + if (filter.isAndFilters()) { Filter[] orFilters = (Filter[]) filter.getValue(); List addPredicates = new ArrayList<>(); for (Filter orFilter : orFilters) { diff --git a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java index 8b65a65a..433e83c7 100644 --- a/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java +++ b/springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java @@ -72,7 +72,7 @@ void pageRequest() { PageRequest request = new PageRequest(); request.setCurrent(1); request.setPageSize(10); - request.addFilter("name", Relation.LIKE, "%2%"); + request.andFilter("name", Relation.LIKE, "%2%"); Page page = demoRepository.pageRequest(request); assertEquals(1, page.getTotalElements()); @@ -94,7 +94,7 @@ void customInSearch() { request.setCurrent(1); request.setPageSize(10); - request.addFilter("id", Relation.IN, 1, 2, 3); + request.andFilter("id", Relation.IN, 1, 2, 3); Page page = demoRepository.pageRequest(request); log.info("demo:{}", page.getContent()); diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java index fc818f63..db6c5477 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java @@ -8,7 +8,7 @@ public class Filter { public static final String FILTER_OR_KEY = "FILTER_OR_KEY"; - public static final String FILTER_ADD_KEY = "FILTER_ADD_KEY"; + public static final String FILTER_AND_KEY = "FILTER_AND_KEY"; private String key; private Object[] value; @@ -37,7 +37,7 @@ public static Filter as(String key, Object... value) { } public static Filter and(Filter... value) { - return new Filter(FILTER_ADD_KEY, value); + return new Filter(FILTER_AND_KEY, value); } public static Filter or(Filter... value) { @@ -64,8 +64,8 @@ public boolean isOrFilters() { return FILTER_OR_KEY.equals(key); } - public boolean isAddFilters() { - return FILTER_ADD_KEY.equals(key); + public boolean isAndFilters() { + return FILTER_AND_KEY.equals(key); } public boolean isGreaterThan() { diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java index a827f9c8..4dc92fb9 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/PageRequest.java @@ -162,7 +162,7 @@ public void addSort(Sort sort) { } } - public PageRequest addFilter(String key, Relation relation, Object... value) { + public PageRequest andFilter(String key, Relation relation, Object... value) { requestFilter.addFilter(key, relation, value); return this; } @@ -172,6 +172,11 @@ public PageRequest addFilter(String key, Object... value) { return this; } + public PageRequest andFilter(Filter... value) { + requestFilter.andFilters(value); + return this; + } + public PageRequest orFilters(Filter... filters) { requestFilter.orFilters(filters); return this; diff --git a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java index 7f1ff8e4..e28c6ffa 100644 --- a/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java @@ -20,8 +20,8 @@ public RequestFilter addFilter(String key, Object... value) { return this; } - public RequestFilter addFilters(Filter... value) { - this.pushFilter(new Filter(Filter.FILTER_ADD_KEY, value)); + public RequestFilter andFilters(Filter... value) { + this.pushFilter(new Filter(Filter.FILTER_AND_KEY, value)); return this; } From 9591872595507d4587ccdf34af91a59afd4f9ad6 Mon Sep 17 00:00:00 2001 From: xlorne <1991wangliang@gmail.com> Date: Sat, 28 Oct 2023 13:26:48 +0800 Subject: [PATCH 10/10] add wiki --- docs/wiki/springboot-starter-data-fast.md | 29 ++++++++++++++++++-- docs/wiki/springboot-starter-security-jwt.md | 22 ++++++++++----- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/docs/wiki/springboot-starter-data-fast.md b/docs/wiki/springboot-starter-data-fast.md index 154795dc..cd631789 100644 --- a/docs/wiki/springboot-starter-data-fast.md +++ b/docs/wiki/springboot-starter-data-fast.md @@ -64,7 +64,7 @@ public interface DemoRepository extends FastRepository { ``` 动态FastRepository的能力展示 -```java +``` // 重写findAll,通过Example查询 @Test @@ -90,7 +90,7 @@ public interface DemoRepository extends FastRepository { // pageRequest 自定义条件查询 @Test - void pageRequest() { + void pageRequest1() { demoRepository.deleteAll(); Demo demo1 = new Demo(); demo1.setName("123"); @@ -104,10 +104,33 @@ public interface DemoRepository extends FastRepository { request.setCurrent(1); request.setPageSize(10); request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%"); + //sql: select demo0_.id as id1_0_, demo0_.name as name2_0_, demo0_.sort as sort3_0_ from t_demo demo0_ where demo0_.name like ? limit ? Page page = demoRepository.pageRequest(request); assertEquals(1, page.getTotalElements()); - } + } + + // pageRequest 自定义条件查询 + @Test + void pageRequest2() { + demoRepository.deleteAll(); + Demo demo1 = new Demo(); + demo1.setName("123"); + demoRepository.save(demo1); + + Demo demo2 = new Demo(); + demo2.setName("456"); + demoRepository.save(demo2); + + PageRequest request = new PageRequest(); + request.setCurrent(1); + request.setPageSize(10); + request.orFilters(Filter.as("name","123"),Filter.as("name","456")); + //sql: select demo0_.id as id1_0_, demo0_.name as name2_0_, demo0_.sort as sort3_0_ from t_demo demo0_ where demo0_.name=? or demo0_.name=? limit ? + + Page page = demoRepository.pageRequest(request); + assertEquals(1, page.getTotalElements()); + } // 动态sql的List查询 diff --git a/docs/wiki/springboot-starter-security-jwt.md b/docs/wiki/springboot-starter-security-jwt.md index dd984683..2cad32e0 100644 --- a/docs/wiki/springboot-starter-security-jwt.md +++ b/docs/wiki/springboot-starter-security-jwt.md @@ -51,14 +51,22 @@ security默认的账户密码为admin/admin,可以通过重写UserDetailsServi 也可以通过数据库账户获取账户数据,请自己实现UserDetailsService接口 ## 登录拦截 -可以通过重写SecurityLoginHandler来实现自定义登录拦截 -```java +可以通过重写SecurityLoginHandler来实现自定义登录拦截,preHandle登录前的拦截处理,postHandle登录后的拦截处理 +``` @Bean - public SecurityLoginHandler securityLoginHandler(){ - return (request, response, handler) -> { - //TODO 自定义登录拦截 - }; - } + public SecurityLoginHandler securityLoginHandler() { + return new SecurityLoginHandler() { + @Override + public void preHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler) throws Exception { + + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler, Token token) { + + } + }; +} ``` ## 获取当前用户