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) { + + } + }; +} ``` ## 获取当前用户 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..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,7 +14,7 @@ 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.hasFilter()) { 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..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 @@ -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())); @@ -48,6 +51,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 -> { @@ -60,88 +73,135 @@ public List getOrder(Root root, CriteriaBuilder criteriaBuilder) { return orderList; } - public List getPredicate(Root root, CriteriaBuilder criteriaBuilder) { - List predicates = new ArrayList<>(); - for (String key : request.getFilters().keySet()) { - PageRequest.Filter filter = request.getFilters().get(key); + + private Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root root, List properties) { + String key = filter.getKey(); + if (filter.isAndFilters() || filter.isOrFilters() || properties.contains(key)) { + if (filter.isEqual()) { - predicates.add(criteriaBuilder.equal(root.get(key), filter.getValue()[0])); + return 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 + "%")); + 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) { - predicates.add(criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2)); + return 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)); + return 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)); + return 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)); + return criteriaBuilder.greaterThan(root.get(key), (Integer) value); } if (value instanceof Long) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Long) value)); + return criteriaBuilder.greaterThan(root.get(key), (Long) value); } if (value instanceof Date) { - predicates.add(criteriaBuilder.greaterThan(root.get(key), (Date) value)); + return 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)); + return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value); } if (value instanceof Long) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value)); + return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value); } if (value instanceof Date) { - predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value)); + return 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)); + return criteriaBuilder.lessThan(root.get(key), (Integer) value); } if (value instanceof Long) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Long) value)); + return criteriaBuilder.lessThan(root.get(key), (Long) value); } if (value instanceof Date) { - predicates.add(criteriaBuilder.lessThan(root.get(key), (Date) value)); + return 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)); + return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value); } if (value instanceof Long) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value)); + return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value); } if (value instanceof Date) { - predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value)); + 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.isOrFilters()) { + Filter[] orFilters = (Filter[]) filter.getValue(); + List orPredicates = new ArrayList<>(); + for (Filter orFilter : orFilters) { + Predicate predicate = toPredicate(orFilter, criteriaBuilder, root, properties); + if (predicate != null) { + orPredicates.add(predicate); + } + } + return criteriaBuilder.or(orPredicates.toArray(new Predicate[0])); + } + + if (filter.isAndFilters()) { + 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; + } + + public List getPredicate(Root root, CriteriaBuilder criteriaBuilder) { + List predicates = new ArrayList<>(); + List properties = getClazzProperties(); + 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..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 @@ -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.andFilter("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.andFilter("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-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..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 @@ -2,9 +2,14 @@ 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.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; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -57,7 +62,24 @@ 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, Token token) { + + } + }; + } + + @Bean + @ConditionalOnMissingBean + public AuthenticationTokenFilter authenticationTokenFilter(){ + return (request, response, chain) -> { + }; } @@ -65,7 +87,7 @@ public SecurityLoginHandler securityLoginHandler(){ @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(); @@ -74,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 version() { + return SingleResponse.of(env.getProperty("application.version", "-")); } } diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/AuthenticationTokenFilter.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/AuthenticationTokenFilter.java new file mode 100644 index 00000000..b114f7e6 --- /dev/null +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/AuthenticationTokenFilter.java @@ -0,0 +1,10 @@ +package com.codingapi.springboot.security.filter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +public interface AuthenticationTokenFilter { + + void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain); +} diff --git a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyAuthenticationFilter.java b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyAuthenticationFilter.java index 09562919..e00964b3 100644 --- a/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyAuthenticationFilter.java +++ b/springboot-starter-security-jwt/src/main/java/com/codingapi/springboot/security/filter/MyAuthenticationFilter.java @@ -17,7 +17,6 @@ import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; import org.springframework.util.AntPathMatcher; import org.springframework.util.StringUtils; -import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -30,12 +29,15 @@ public class MyAuthenticationFilter extends BasicAuthenticationFilter { private final Jwt jwt; private final SecurityJwtProperties securityJwtProperties; + private final AuthenticationTokenFilter authenticationTokenFilter; private final AntPathMatcher antPathMatcher = new AntPathMatcher(); - public MyAuthenticationFilter(AuthenticationManager manager, SecurityJwtProperties securityJwtProperties, Jwt jwt) { + + public MyAuthenticationFilter(AuthenticationManager manager, SecurityJwtProperties securityJwtProperties, Jwt jwt,AuthenticationTokenFilter authenticationTokenFilter) { super(manager); this.jwt = jwt; this.securityJwtProperties = securityJwtProperties; + this.authenticationTokenFilter = authenticationTokenFilter; } @@ -65,6 +67,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse } SecurityContextHolder.getContext().setAuthentication(token.getAuthenticationToken()); + authenticationTokenFilter.doFilter(request, response, chain); } } chain.doFilter(request, response); 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..eb7e02ab 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,token); 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..25611828 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,14 @@ package com.codingapi.springboot.security.filter; import com.codingapi.springboot.security.dto.request.LoginRequest; - +import com.codingapi.springboot.security.jwt.Token; 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, Token token); + } 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..db6c5477 --- /dev/null +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/Filter.java @@ -0,0 +1,106 @@ +package com.codingapi.springboot.framework.dto.request; + +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter +public class Filter { + + public static final String FILTER_OR_KEY = "FILTER_OR_KEY"; + public static final String FILTER_AND_KEY = "FILTER_AND_KEY"; + + 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(String key, Filter... value) { + this(key, 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 and(Filter... value) { + return new Filter(FILTER_AND_KEY, value); + } + + public static Filter or(Filter... value) { + return new Filter(FILTER_OR_KEY, 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 isOrFilters() { + return FILTER_OR_KEY.equals(key); + } + + public boolean isAndFilters() { + return FILTER_AND_KEY.equals(key); + } + + 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 00097951..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 @@ -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,43 +64,25 @@ 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); } + public boolean hasFilter() { + return requestFilter.hasFilter(); + } @Override public int getPageSize() { @@ -196,100 +162,26 @@ public void addSort(Sort sort) { } } - public PageRequest addFilter(String key, FilterRelation relation, Object... value) { - putFilter(key, relation, value); + public PageRequest andFilter(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 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 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]; - } - + requestFilter.addFilter(key, value); + return this; } - 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); + public PageRequest andFilter(Filter... value) { + requestFilter.andFilters(value); + return this; } - public enum FilterRelation { - EUQAL, - LIKE, - BETWEEN, - IN, - GREATER_THAN, - LESS_THAN, - GREATER_THAN_EQUAL, - LESS_THAN_EQUAL, + 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..e28c6ffa --- /dev/null +++ b/springboot-starter/src/main/java/com/codingapi/springboot/framework/dto/request/RequestFilter.java @@ -0,0 +1,99 @@ +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 andFilters(Filter... value) { + this.pushFilter(new Filter(Filter.FILTER_AND_KEY, value)); + return this; + } + + public RequestFilter orFilters(Filter... value) { + this.pushFilter(new Filter(Filter.FILTER_OR_KEY, 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); + } +}