Skip to content

Commit bed97b2

Browse files
authored
Merge pull request #27 from codingapi/3.x
3.1.3
2 parents 8cee298 + c40ca24 commit bed97b2

File tree

17 files changed

+469
-173
lines changed

17 files changed

+469
-173
lines changed

docs/wiki/springboot-starter-data-fast.md

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public interface DemoRepository extends FastRepository<Demo,Integer> {
6464
```
6565
动态FastRepository的能力展示
6666

67-
```java
67+
```
6868
6969
// 重写findAll,通过Example查询
7070
@Test
@@ -90,7 +90,7 @@ public interface DemoRepository extends FastRepository<Demo,Integer> {
9090
9191
// pageRequest 自定义条件查询
9292
@Test
93-
void pageRequest() {
93+
void pageRequest1() {
9494
demoRepository.deleteAll();
9595
Demo demo1 = new Demo();
9696
demo1.setName("123");
@@ -104,10 +104,33 @@ public interface DemoRepository extends FastRepository<Demo,Integer> {
104104
request.setCurrent(1);
105105
request.setPageSize(10);
106106
request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%");
107+
//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 ?
107108
108109
Page<Demo> page = demoRepository.pageRequest(request);
109110
assertEquals(1, page.getTotalElements());
110-
}
111+
}
112+
113+
// pageRequest 自定义条件查询
114+
@Test
115+
void pageRequest2() {
116+
demoRepository.deleteAll();
117+
Demo demo1 = new Demo();
118+
demo1.setName("123");
119+
demoRepository.save(demo1);
120+
121+
Demo demo2 = new Demo();
122+
demo2.setName("456");
123+
demoRepository.save(demo2);
124+
125+
PageRequest request = new PageRequest();
126+
request.setCurrent(1);
127+
request.setPageSize(10);
128+
request.orFilters(Filter.as("name","123"),Filter.as("name","456"));
129+
//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 ?
130+
131+
Page<Demo> page = demoRepository.pageRequest(request);
132+
assertEquals(1, page.getTotalElements());
133+
}
111134
112135
113136
// 动态sql的List查询

docs/wiki/springboot-starter-security-jwt.md

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,22 @@ security默认的账户密码为admin/admin,可以通过重写UserDetailsServi
5151
也可以通过数据库账户获取账户数据,请自己实现UserDetailsService接口
5252

5353
## 登录拦截
54-
可以通过重写SecurityLoginHandler来实现自定义登录拦截
55-
```java
54+
可以通过重写SecurityLoginHandler来实现自定义登录拦截,preHandle登录前的拦截处理,postHandle登录后的拦截处理
55+
```
5656
@Bean
57-
public SecurityLoginHandler securityLoginHandler(){
58-
return (request, response, handler) -> {
59-
//TODO 自定义登录拦截
60-
};
61-
}
57+
public SecurityLoginHandler securityLoginHandler() {
58+
return new SecurityLoginHandler() {
59+
@Override
60+
public void preHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler) throws Exception {
61+
62+
}
63+
64+
@Override
65+
public void postHandle(HttpServletRequest request, HttpServletResponse response, LoginRequest handler, Token token) {
66+
67+
}
68+
};
69+
}
6270
```
6371

6472
## 获取当前用户

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/FastRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import java.util.List;
1515

1616
@NoRepositoryBean
17-
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T,ID> {
17+
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T, ID> {
1818

1919
default Page<T> findAll(PageRequest request) {
2020
if (request.hasFilter()) {

springboot-starter-data-fast/src/main/java/com/codingapi/springboot/fast/query/QueryRequest.java

Lines changed: 84 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.codingapi.springboot.fast.query;
22

3+
import com.codingapi.springboot.framework.dto.request.Filter;
34
import com.codingapi.springboot.framework.dto.request.PageRequest;
5+
import com.codingapi.springboot.framework.dto.request.RequestFilter;
46
import jakarta.persistence.criteria.CriteriaBuilder;
57
import jakarta.persistence.criteria.Order;
68
import jakarta.persistence.criteria.Predicate;
@@ -24,7 +26,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
2426
}
2527

2628
public <T> Example<T> getExample() {
27-
if (!request.hasFilter()) {
29+
RequestFilter requestFilter = request.getRequestFilter();
30+
if (!requestFilter.hasFilter()) {
2831
return null;
2932
}
3033
Object entity = null;
@@ -36,7 +39,7 @@ public <T> Example<T> getExample() {
3639
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
3740
for (PropertyDescriptor descriptor : descriptors) {
3841
String name = descriptor.getName();
39-
PageRequest.Filter value = request.getFilters().get(name);
42+
Filter value = requestFilter.getFilter(name);
4043
if (value != null) {
4144
try {
4245
descriptor.getWriteMethod().invoke(entity, value.getFilterValue(descriptor.getPropertyType()));
@@ -48,6 +51,16 @@ public <T> Example<T> getExample() {
4851
}
4952

5053

54+
private List<String> getClazzProperties() {
55+
List<String> properties = new ArrayList<>();
56+
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
57+
for (PropertyDescriptor descriptor : descriptors) {
58+
properties.add(descriptor.getName());
59+
}
60+
return properties;
61+
}
62+
63+
5164
public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
5265
List<Order> orderList = new ArrayList<>();
5366
request.getSort().forEach(sort -> {
@@ -60,88 +73,135 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
6073
return orderList;
6174
}
6275

63-
public <T> List<Predicate> getPredicate(Root<T> root, CriteriaBuilder criteriaBuilder) {
64-
List<Predicate> predicates = new ArrayList<>();
65-
for (String key : request.getFilters().keySet()) {
66-
PageRequest.Filter filter = request.getFilters().get(key);
76+
77+
private <T> Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root<T> root, List<String> properties) {
78+
String key = filter.getKey();
79+
if (filter.isAndFilters() || filter.isOrFilters() || properties.contains(key)) {
80+
6781
if (filter.isEqual()) {
68-
predicates.add(criteriaBuilder.equal(root.get(key), filter.getValue()[0]));
82+
return criteriaBuilder.equal(root.get(key), filter.getValue()[0]);
6983
}
7084

7185
if (filter.isLike()) {
7286
String matchValue = (String) filter.getValue()[0];
73-
predicates.add(criteriaBuilder.like(root.get(key), "%" + matchValue + "%"));
87+
return criteriaBuilder.like(root.get(key), "%" + matchValue + "%");
7488
}
7589

7690
if (filter.isBetween()) {
7791
Object value1 = filter.getValue()[0];
7892
Object value2 = filter.getValue()[2];
7993
if (value1 instanceof Integer && value2 instanceof Integer) {
80-
predicates.add(criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2));
94+
return criteriaBuilder.between(root.get(key), (Integer) value1, (Integer) value2);
8195
}
8296

8397
if (value1 instanceof Long && value2 instanceof Long) {
84-
predicates.add(criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2));
98+
return criteriaBuilder.between(root.get(key), (Long) value1, (Long) value2);
8599
}
86100

87101
if (value1 instanceof Date && value2 instanceof Date) {
88-
predicates.add(criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2));
102+
return criteriaBuilder.between(root.get(key), (Date) value1, (Date) value2);
89103
}
90104
}
91105

92106
if (filter.isGreaterThan()) {
93107
Object value = filter.getValue()[0];
94108
if (value instanceof Integer) {
95-
predicates.add(criteriaBuilder.greaterThan(root.get(key), (Integer) value));
109+
return criteriaBuilder.greaterThan(root.get(key), (Integer) value);
96110
}
97111
if (value instanceof Long) {
98-
predicates.add(criteriaBuilder.greaterThan(root.get(key), (Long) value));
112+
return criteriaBuilder.greaterThan(root.get(key), (Long) value);
99113
}
100114
if (value instanceof Date) {
101-
predicates.add(criteriaBuilder.greaterThan(root.get(key), (Date) value));
115+
return criteriaBuilder.greaterThan(root.get(key), (Date) value);
102116
}
103117
}
104118

105119
if (filter.isGreaterThanEqual()) {
106120
Object value = filter.getValue()[0];
107121
if (value instanceof Integer) {
108-
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value));
122+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Integer) value);
109123
}
110124
if (value instanceof Long) {
111-
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value));
125+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Long) value);
112126
}
113127
if (value instanceof Date) {
114-
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value));
128+
return criteriaBuilder.greaterThanOrEqualTo(root.get(key), (Date) value);
115129
}
116130
}
117131

118132
if (filter.isLessThan()) {
119133
Object value = filter.getValue()[0];
120134
if (value instanceof Integer) {
121-
predicates.add(criteriaBuilder.lessThan(root.get(key), (Integer) value));
135+
return criteriaBuilder.lessThan(root.get(key), (Integer) value);
122136
}
123137
if (value instanceof Long) {
124-
predicates.add(criteriaBuilder.lessThan(root.get(key), (Long) value));
138+
return criteriaBuilder.lessThan(root.get(key), (Long) value);
125139
}
126140
if (value instanceof Date) {
127-
predicates.add(criteriaBuilder.lessThan(root.get(key), (Date) value));
141+
return criteriaBuilder.lessThan(root.get(key), (Date) value);
128142
}
129143
}
130144

131145
if (filter.isLessThanEqual()) {
132146
Object value = filter.getValue()[0];
133147
if (value instanceof Integer) {
134-
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value));
148+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Integer) value);
135149
}
136150
if (value instanceof Long) {
137-
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value));
151+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Long) value);
138152
}
139153
if (value instanceof Date) {
140-
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value));
154+
return criteriaBuilder.lessThanOrEqualTo(root.get(key), (Date) value);
155+
}
156+
}
157+
158+
if (filter.isIn()) {
159+
Object[] value = filter.getValue();
160+
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(key));
161+
for (Object item : value) {
162+
in.value(item);
141163
}
164+
return in;
165+
}
166+
167+
if (filter.isOrFilters()) {
168+
Filter[] orFilters = (Filter[]) filter.getValue();
169+
List<Predicate> orPredicates = new ArrayList<>();
170+
for (Filter orFilter : orFilters) {
171+
Predicate predicate = toPredicate(orFilter, criteriaBuilder, root, properties);
172+
if (predicate != null) {
173+
orPredicates.add(predicate);
174+
}
175+
}
176+
return criteriaBuilder.or(orPredicates.toArray(new Predicate[0]));
177+
}
178+
179+
if (filter.isAndFilters()) {
180+
Filter[] orFilters = (Filter[]) filter.getValue();
181+
List<Predicate> addPredicates = new ArrayList<>();
182+
for (Filter orFilter : orFilters) {
183+
Predicate predicate = toPredicate(orFilter, criteriaBuilder, root, properties);
184+
if (predicate != null) {
185+
addPredicates.add(predicate);
186+
}
187+
}
188+
return criteriaBuilder.and(addPredicates.toArray(new Predicate[0]));
142189
}
143190
}
191+
return null;
192+
}
193+
144194

195+
public <T> List<Predicate> getPredicate(Root<T> root, CriteriaBuilder criteriaBuilder) {
196+
List<Predicate> predicates = new ArrayList<>();
197+
List<String> properties = getClazzProperties();
198+
RequestFilter requestFilter = request.getRequestFilter();
199+
for (Filter filter : requestFilter.getFilters()) {
200+
Predicate predicate = toPredicate(filter, criteriaBuilder, root, properties);
201+
if (predicate != null) {
202+
predicates.add(predicate);
203+
}
204+
}
145205
return predicates;
146206
}
147-
}
207+
}

springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/DemoRepositoryTest.java

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import com.codingapi.springboot.fast.entity.Demo;
44
import com.codingapi.springboot.fast.repository.DemoRepository;
5+
import com.codingapi.springboot.framework.dto.request.Filter;
56
import com.codingapi.springboot.framework.dto.request.PageRequest;
7+
import com.codingapi.springboot.framework.dto.request.Relation;
8+
import lombok.extern.slf4j.Slf4j;
69
import org.junit.jupiter.api.Test;
710
import org.springframework.beans.factory.annotation.Autowired;
811
import org.springframework.boot.test.context.SpringBootTest;
@@ -16,6 +19,7 @@
1619
import static org.junit.jupiter.api.Assertions.assertEquals;
1720
import static org.junit.jupiter.api.Assertions.assertTrue;
1821

22+
@Slf4j
1923
@SpringBootTest
2024
public class DemoRepositoryTest {
2125

@@ -68,13 +72,59 @@ void pageRequest() {
6872
PageRequest request = new PageRequest();
6973
request.setCurrent(1);
7074
request.setPageSize(10);
71-
request.addFilter("name", PageRequest.FilterRelation.LIKE, "%2%");
75+
request.andFilter("name", Relation.LIKE, "%2%");
7276

7377
Page<Demo> page = demoRepository.pageRequest(request);
7478
assertEquals(1, page.getTotalElements());
7579
}
7680

7781

82+
@Test
83+
void customInSearch() {
84+
demoRepository.deleteAll();
85+
Demo demo1 = new Demo();
86+
demo1.setName("123");
87+
demoRepository.save(demo1);
88+
89+
Demo demo2 = new Demo();
90+
demo2.setName("456");
91+
demoRepository.save(demo2);
92+
93+
PageRequest request = new PageRequest();
94+
request.setCurrent(1);
95+
request.setPageSize(10);
96+
97+
request.andFilter("id", Relation.IN, 1, 2, 3);
98+
99+
Page<Demo> page = demoRepository.pageRequest(request);
100+
log.info("demo:{}", page.getContent());
101+
assertEquals(2, page.getTotalElements());
102+
}
103+
104+
105+
@Test
106+
void customOrSearch() {
107+
demoRepository.deleteAll();
108+
Demo demo1 = new Demo();
109+
demo1.setName("123");
110+
demoRepository.save(demo1);
111+
112+
Demo demo2 = new Demo();
113+
demo2.setName("456");
114+
demoRepository.save(demo2);
115+
116+
PageRequest request = new PageRequest();
117+
request.setCurrent(1);
118+
request.setPageSize(10);
119+
120+
121+
request.orFilters(Filter.as("id", Relation.IN, 1, 2, 3), Filter.as("name", "123"));
122+
123+
Page<Demo> page = demoRepository.pageRequest(request);
124+
log.info("demo:{}", page.getContent());
125+
assertEquals(2, page.getTotalElements());
126+
}
127+
78128
@Test
79129
void dynamicListQuery() {
80130
demoRepository.deleteAll();

springboot-starter-data-fast/src/test/java/com/codingapi/springboot/fast/entity/Demo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import lombok.Setter;
66

77
import jakarta.persistence.*;
8+
import lombok.ToString;
89

910
@Setter
1011
@Getter
1112
@Entity
1213
@Table(name = "t_demo")
14+
@ToString
1315
public class Demo implements ISort {
1416
@Id
1517
@GeneratedValue(strategy = GenerationType.IDENTITY)

0 commit comments

Comments
 (0)