Skip to content

3.1.3 #27

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Oct 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 26 additions & 3 deletions docs/wiki/springboot-starter-data-fast.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public interface DemoRepository extends FastRepository<Demo,Integer> {
```
动态FastRepository的能力展示

```java
```

// 重写findAll,通过Example查询
@Test
Expand All @@ -90,7 +90,7 @@ public interface DemoRepository extends FastRepository<Demo,Integer> {

// pageRequest 自定义条件查询
@Test
void pageRequest() {
void pageRequest1() {
demoRepository.deleteAll();
Demo demo1 = new Demo();
demo1.setName("123");
Expand All @@ -104,10 +104,33 @@ public interface DemoRepository extends FastRepository<Demo,Integer> {
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<Demo> 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<Demo> page = demoRepository.pageRequest(request);
assertEquals(1, page.getTotalElements());
}


// 动态sql的List查询
Expand Down
22 changes: 15 additions & 7 deletions docs/wiki/springboot-starter-security-jwt.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) {

}
};
}
```

## 获取当前用户
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import java.util.List;

@NoRepositoryBean
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T,ID> {
public interface FastRepository<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T>, DynamicRepository<T, ID> {

default Page<T> findAll(PageRequest request) {
if (request.hasFilter()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -24,7 +26,8 @@ public QueryRequest(PageRequest request, Class<?> clazz) {
}

public <T> Example<T> getExample() {
if (!request.hasFilter()) {
RequestFilter requestFilter = request.getRequestFilter();
if (!requestFilter.hasFilter()) {
return null;
}
Object entity = null;
Expand All @@ -36,7 +39,7 @@ public <T> Example<T> 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()));
Expand All @@ -48,6 +51,16 @@ public <T> Example<T> getExample() {
}


private List<String> getClazzProperties() {
List<String> properties = new ArrayList<>();
PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz);
for (PropertyDescriptor descriptor : descriptors) {
properties.add(descriptor.getName());
}
return properties;
}


public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
List<Order> orderList = new ArrayList<>();
request.getSort().forEach(sort -> {
Expand All @@ -60,88 +73,135 @@ public <T> List<Order> getOrder(Root<T> root, CriteriaBuilder criteriaBuilder) {
return orderList;
}

public <T> List<Predicate> getPredicate(Root<T> root, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
for (String key : request.getFilters().keySet()) {
PageRequest.Filter filter = request.getFilters().get(key);

private <T> Predicate toPredicate(Filter filter, CriteriaBuilder criteriaBuilder, Root<T> root, List<String> 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<Object> in = criteriaBuilder.in(root.get(key));
for (Object item : value) {
in.value(item);
}
return in;
}

if (filter.isOrFilters()) {
Filter[] orFilters = (Filter[]) filter.getValue();
List<Predicate> 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<Predicate> 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 <T> List<Predicate> getPredicate(Root<T> root, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
List<String> 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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {

Expand Down Expand Up @@ -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<Demo> 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<Demo> 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<Demo> page = demoRepository.pageRequest(request);
log.info("demo:{}", page.getContent());
assertEquals(2, page.getTotalElements());
}

@Test
void dynamicListQuery() {
demoRepository.deleteAll();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading