From b83b7edaa35483dc8c025ca524a8886c0d9a7af3 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Tue, 7 Dec 2021 17:02:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A1=86=E6=9E=B6=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=85=A8=E9=9D=A2=E5=8D=87=E7=BA=A7webflux=EF=BC=8C=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E5=8E=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flyfish-data/pom.xml | 5 + .../annotations/EnableMongoRepo.java | 2 +- .../annotations/EnableReactiveMongoRepo.java | 29 +++ .../repository/DefaultReactiveRepository.java | 2 +- .../repository/QueryModelExecutor.java | 2 +- .../ReactiveQueryModelExecutor.java | 16 +- .../DefaultReactiveRepositoryFactory.java | 26 +++ .../DefaultReactiveRepositoryFactoryBean.java | 26 +++ .../DefaultRepositoryFactory.java | 11 +- .../DefaultRepositoryFactoryBean.java | 6 +- .../impl/DefaultReactiveRepositoryImpl.java | 178 +++++++++++++++++- .../impl/DefaultRepositoryImpl.java | 85 +++------ .../repository/impl/QueryBuildUtils.java | 43 +++++ .../impl/ReactivePageableExecutionUtils.java | 69 +++++++ .../dict/config/DictionaryProcessor.java | 4 +- .../controller/AutoCompleteController.java | 4 +- .../dict/controller/DictionaryController.java | 4 +- .../repository/AutoCompleteRepository.java | 4 +- .../dict/repository/DictionaryRepository.java | 4 +- .../dict/service/AutoCompleteService.java | 4 +- .../dict/service/DictionaryService.java | 5 +- .../file/controller/AttachmentController.java | 4 +- .../AttachmentUploadController.java | 2 +- .../file/repository/AttachmentRepository.java | 4 +- .../file/service/AttachmentService.java | 6 +- .../form/controller/OnlineFormController.java | 4 +- .../form/repository/OnlineFormRepository.java | 4 +- .../form/service/OnlineFormService.java | 4 +- .../logging/controller/LogController.java | 4 +- .../logging/repository/LogRepository.java | 4 +- .../framework/logging/service/LogService.java | 4 +- .../service/SimpleAuthenticationLogger.java | 32 ++-- .../annotations/EnableAutoSecurity.java | 2 +- .../config/AuthenticationAuditorImpl.java | 46 +++-- .../framework/config/WebSecurityConfig.java | 14 +- .../config/audit/ReactiveUserAuditor.java | 33 ++++ .../framework/config/audit}/UserAuditor.java | 2 +- .../framework/controller/RoleController.java | 2 +- .../framework/controller/UserController.java | 20 +- .../repository/DepartmentRepository.java | 2 +- .../repository/PermissionRepository.java | 2 +- .../framework/repository/RoleRepository.java | 2 +- .../framework/service/DepartmentService.java | 4 +- .../service/MongoUserDetailsServiceImpl.java | 2 +- .../framework/service/PermissionService.java | 4 +- .../service/ReactiveUserService.java | 3 +- .../framework/service/RoleService.java | 42 +++-- .../framework/service/UserService.java | 16 +- .../beans/excel/ExcelMappingController.java | 3 +- .../beans/excel/ExcelMappingRepository.java | 4 +- .../beans/excel/ExcelMappingService.java | 4 +- .../framework/beans/meta/RestBean.java | 14 +- .../framework/controller/BaseController.java | 39 ---- .../controller/ReactiveBaseController.java | 103 ++++++++++ .../service/AuthenticationLogger.java | 11 +- .../service/BaseReactiveService.java | 64 ++++++- .../framework/service/UserFindService.java | 3 +- .../service/impl/BaseReactiveServiceImpl.java | 149 ++++++++++++--- .../service/impl/BaseServiceImpl.java | 9 +- .../framework/utils/RedisOperations.java | 9 +- pom.xml | 4 +- 61 files changed, 918 insertions(+), 295 deletions(-) create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableReactiveMongoRepo.java create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactory.java create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactoryBean.java rename flyfish-data/src/main/java/com/flyfish/framework/repository/{impl => factory}/DefaultRepositoryFactory.java (61%) rename flyfish-data/src/main/java/com/flyfish/framework/repository/{impl => factory}/DefaultRepositoryFactoryBean.java (80%) create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/repository/impl/QueryBuildUtils.java create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/repository/impl/ReactivePageableExecutionUtils.java create mode 100644 flyfish-user/src/main/java/com/flyfish/framework/config/audit/ReactiveUserAuditor.java rename {flyfish-data/src/main/java/com/flyfish/framework/auditor => flyfish-user/src/main/java/com/flyfish/framework/config/audit}/UserAuditor.java (94%) create mode 100644 flyfish-web/src/main/java/com/flyfish/framework/controller/ReactiveBaseController.java diff --git a/flyfish-data/pom.xml b/flyfish-data/pom.xml index 8efde45..288685e 100644 --- a/flyfish-data/pom.xml +++ b/flyfish-data/pom.xml @@ -23,6 +23,11 @@ spring-data-mongodb + + org.springframework.security + spring-security-core + + org.springframework.boot spring-boot-starter-data-mongodb-reactive diff --git a/flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableMongoRepo.java b/flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableMongoRepo.java index ce23b87..ce3d182 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableMongoRepo.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableMongoRepo.java @@ -1,6 +1,6 @@ package com.flyfish.framework.annotations; -import com.flyfish.framework.repository.impl.DefaultRepositoryFactoryBean; +import com.flyfish.framework.repository.factory.DefaultRepositoryFactoryBean; import com.flyfish.framework.repository.impl.DefaultRepositoryImpl; import org.springframework.core.annotation.AliasFor; import org.springframework.data.mongodb.config.EnableMongoAuditing; diff --git a/flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableReactiveMongoRepo.java b/flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableReactiveMongoRepo.java new file mode 100644 index 0000000..87f9024 --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/annotations/EnableReactiveMongoRepo.java @@ -0,0 +1,29 @@ +package com.flyfish.framework.annotations; + +import com.flyfish.framework.repository.factory.DefaultReactiveRepositoryFactoryBean; +import com.flyfish.framework.repository.impl.DefaultReactiveRepositoryImpl; +import org.springframework.core.annotation.AliasFor; +import org.springframework.data.mongodb.config.EnableReactiveMongoAuditing; +import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; + +import java.lang.annotation.*; + +@EnableReactiveMongoRepositories( + repositoryFactoryBeanClass = DefaultReactiveRepositoryFactoryBean.class, + repositoryBaseClass = DefaultReactiveRepositoryImpl.class +) +@EnableReactiveMongoAuditing +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface EnableReactiveMongoRepo { + + /** + * 扫描的基本路径 + * + * @return 结果 + */ + @AliasFor(annotation = EnableReactiveMongoRepositories.class) + String[] basePackages() default "com.flyfish.framework"; +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/DefaultReactiveRepository.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/DefaultReactiveRepository.java index 5a66618..ed11f2d 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/repository/DefaultReactiveRepository.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/DefaultReactiveRepository.java @@ -10,6 +10,6 @@ import org.springframework.data.repository.NoRepositoryBean; * @param 泛型 */ @NoRepositoryBean -public interface DefaultReactiveRepository extends ReactiveMongoRepository { +public interface DefaultReactiveRepository extends ReactiveMongoRepository, ReactiveQueryModelExecutor { } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/QueryModelExecutor.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/QueryModelExecutor.java index 438328a..0f5b7c8 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/repository/QueryModelExecutor.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/QueryModelExecutor.java @@ -80,7 +80,7 @@ public interface QueryModelExecutor { * @param values 集合 * @return 结果 */ - List findAllByValues(String key, List values); + List findAllByValues(String key, List values); /** * Checks whether the data store contains elements that match the given {@link Qo}. diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/ReactiveQueryModelExecutor.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/ReactiveQueryModelExecutor.java index 28be1ac..ff30e7e 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/repository/ReactiveQueryModelExecutor.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/ReactiveQueryModelExecutor.java @@ -65,7 +65,7 @@ public interface ReactiveQueryModelExecutor { * @param pageable may be {@link Pageable#unpaged()}, must not be {@literal null}. * @return a {@link Page} of entities matching the given {@link Qo}. */ - Page findAll(Qo query, Pageable pageable); + Mono> findAll(Qo query, Pageable pageable); /** * Returns the number of instances matching the given {@link Qo}. @@ -73,7 +73,7 @@ public interface ReactiveQueryModelExecutor { * @param query the {@link Qo} to count instances for, must not be {@literal null}. * @return the number of instances matching the {@link Qo}. */ - long count(Qo query); + Mono count(Qo query); /** * 通过特定键的集合查询 @@ -82,7 +82,7 @@ public interface ReactiveQueryModelExecutor { * @param values 集合 * @return 结果 */ - List findAllByValues(String key, List values); + Flux findAllByValues(String key, List values); /** * Checks whether the data store contains elements that match the given {@link Qo}. @@ -90,5 +90,13 @@ public interface ReactiveQueryModelExecutor { * @param query the {@link Qo} to use for the existence check, must not be {@literal null}. * @return {@literal true} if the data store contains elements that match the given {@link Qo}. */ - boolean exists(Qo query); + Mono exists(Qo query); + + /** + * 删除全部 + * + * @param qo 查询实体 + * @return 结果 + */ + Mono deleteAll(Qo qo); } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactory.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactory.java new file mode 100644 index 0000000..0a2ef72 --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactory.java @@ -0,0 +1,26 @@ +package com.flyfish.framework.repository.factory; + +import com.flyfish.framework.repository.impl.DefaultReactiveRepositoryImpl; +import org.springframework.data.mongodb.core.ReactiveMongoOperations; +import org.springframework.data.mongodb.repository.support.ReactiveMongoRepositoryFactory; +import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.lang.NonNull; + +public class DefaultReactiveRepositoryFactory extends ReactiveMongoRepositoryFactory { + + /** + * Creates a new {@link ReactiveMongoRepositoryFactory} with the given {@link ReactiveMongoOperations}. + * + * @param mongoOperations must not be {@literal null}. + */ + public DefaultReactiveRepositoryFactory(ReactiveMongoOperations mongoOperations) { + super(mongoOperations); + this.setRepositoryBaseClass(DefaultReactiveRepositoryImpl.class); + } + + @Override + @NonNull + protected Class getRepositoryBaseClass(@NonNull RepositoryMetadata metadata) { + return DefaultReactiveRepositoryImpl.class; + } +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactoryBean.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactoryBean.java new file mode 100644 index 0000000..74c90e7 --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultReactiveRepositoryFactoryBean.java @@ -0,0 +1,26 @@ +package com.flyfish.framework.repository.factory; + +import org.springframework.data.mongodb.core.ReactiveMongoOperations; +import org.springframework.data.mongodb.repository.support.ReactiveMongoRepositoryFactoryBean; +import org.springframework.data.repository.Repository; +import org.springframework.data.repository.core.support.RepositoryFactorySupport; +import org.springframework.lang.NonNull; + +public class DefaultReactiveRepositoryFactoryBean, S> + extends ReactiveMongoRepositoryFactoryBean { + + /** + * Creates a new {@link ReactiveMongoRepositoryFactoryBean} for the given repository interface. + * + * @param repositoryInterface must not be {@literal null}. + */ + public DefaultReactiveRepositoryFactoryBean(Class repositoryInterface) { + super(repositoryInterface); + } + + @Override + @NonNull + protected RepositoryFactorySupport getFactoryInstance(@NonNull ReactiveMongoOperations operations) { + return new DefaultReactiveRepositoryFactory(operations); + } +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryFactory.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultRepositoryFactory.java similarity index 61% rename from flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryFactory.java rename to flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultRepositoryFactory.java index 76ffb5a..4f34969 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryFactory.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultRepositoryFactory.java @@ -1,8 +1,10 @@ -package com.flyfish.framework.repository.impl; +package com.flyfish.framework.repository.factory; +import com.flyfish.framework.repository.impl.DefaultRepositoryImpl; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.repository.support.MongoRepositoryFactory; import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.lang.NonNull; public class DefaultRepositoryFactory extends MongoRepositoryFactory { @@ -13,11 +15,12 @@ public class DefaultRepositoryFactory extends MongoRepositoryFactory { */ public DefaultRepositoryFactory(MongoOperations mongoOperations) { super(mongoOperations); - this.setRepositoryBaseClass(DefaultRepositoryFactory.class); + this.setRepositoryBaseClass(DefaultRepositoryImpl.class); } @Override - protected Class getRepositoryBaseClass(RepositoryMetadata metadata) { - return DefaultRepositoryFactory.class; + @NonNull + protected Class getRepositoryBaseClass(@NonNull RepositoryMetadata metadata) { + return DefaultRepositoryImpl.class; } } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryFactoryBean.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultRepositoryFactoryBean.java similarity index 80% rename from flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryFactoryBean.java rename to flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultRepositoryFactoryBean.java index 7d293b9..09967a4 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryFactoryBean.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/factory/DefaultRepositoryFactoryBean.java @@ -1,9 +1,10 @@ -package com.flyfish.framework.repository.impl; +package com.flyfish.framework.repository.factory; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.repository.support.MongoRepositoryFactoryBean; import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.support.RepositoryFactorySupport; +import org.springframework.lang.NonNull; public class DefaultRepositoryFactoryBean, S> extends MongoRepositoryFactoryBean { @@ -18,7 +19,8 @@ public class DefaultRepositoryFactoryBean 泛型 + */ +public class DefaultReactiveRepositoryImpl extends SimpleReactiveMongoRepository + implements DefaultReactiveRepository { + + private final MongoEntityInformation entityInformation; + + private final ReactiveMongoOperations mongoOperations; + + public DefaultReactiveRepositoryImpl(@NonNull MongoEntityInformation entityInformation, + @NonNull ReactiveMongoOperations mongoOperations) { + super(entityInformation, mongoOperations); + this.mongoOperations = mongoOperations; + this.entityInformation = entityInformation; + } + + /** + * 通过名称查找一个 + * + * @param name 名称 + * @return 结果 + */ + @Override + public Mono findByName(String name) { + if (StringUtils.isNotBlank(name)) { + return mongoOperations.findOne(Query.query(Criteria.where("name").is(name)), + entityInformation.getJavaType(), entityInformation.getCollectionName()); + } + return Mono.empty(); + } + + /** + * Returns a single entity matching the given {@link Qo} or {@link Optional#empty()} if none was found. + * + * @param query must not be {@literal null}. + * @return a single entity matching the given {@link Qo} or {@link Optional#empty()} if none was found. + * @throws IncorrectResultSizeDataAccessException if the Qo yields more than one + * result. + */ + @Override + public Mono findOne(Qo query) { + return Mono.justOrEmpty(QueryBuildUtils.getQuery(query)) + .flatMap(querying -> mongoOperations.findOne(querying, entityInformation.getJavaType(), + entityInformation.getCollectionName())); + } + + /** + * Returns all entities matching the given {@link Qo}. In case no match could be found an empty + * {@link Iterable} is returned. + * + * @param query must not be {@literal null}. + * @return all entities matching the given {@link Qo}. + */ + @Override + public Flux findAll(Qo query) { + return Mono.justOrEmpty(QueryBuildUtils.getQuery(query)) + .flatMapMany(querying -> mongoOperations.find(querying, + entityInformation.getJavaType(), + entityInformation.getCollectionName())); + } + + /** + * Returns all entities matching the given {@link Qo} applying the given {@link Sort}. In case no match could + * be found an empty {@link Iterable} is returned. + * + * @param query must not be {@literal null}. + * @param sort the {@link Sort} specification to sort the results by, may be {@link Sort#empty()}, must not be + * {@literal null}. + * @return all entities matching the given {@link Qo}. + * @since 1.10 + */ + @Override + public Flux findAll(Qo query, Sort sort) { + return Mono.justOrEmpty(QueryBuildUtils.getQuery(query)) + .flatMapMany(querying -> mongoOperations.find(querying.with(sort), + entityInformation.getJavaType(), + entityInformation.getCollectionName())); + } + + /** + * Returns a {@link Page} of entities matching the given {@link Qo}. In case no match could be found, an empty + * {@link Page} is returned. + * + * @param query must not be {@literal null}. + * @param pageable may be {@link Pageable#unpaged()}, must not be {@literal null}. + * @return a {@link Page} of entities matching the given {@link Qo}. + */ + @Override + public Mono> findAll(Qo query, Pageable pageable) { + return Mono.justOrEmpty(QueryBuildUtils.getQuery(query)) + .flatMap(querying -> mongoOperations.find(querying.with(pageable), + entityInformation.getJavaType(), entityInformation.getCollectionName()) + .collectList() + .flatMap(list -> ReactivePageableExecutionUtils.getPage(list, pageable, this.count(query)))) + .defaultIfEmpty(Page.empty()); + } + + /** + * Returns the number of instances matching the given {@link Qo}. + * + * @param query the {@link Qo} to count instances for, must not be {@literal null}. + * @return the number of instances matching the {@link Qo}. + */ + @Override + public Mono count(Qo query) { + return Mono.justOrEmpty(QueryBuildUtils.getQuery(query)) + .flatMap(querying -> this.mongoOperations.count(querying, entityInformation.getJavaType(), + entityInformation.getCollectionName())) + .defaultIfEmpty(0L); + } + + /** + * 通过特定键的集合查询 + * + * @param key 键 + * @param values 集合 + * @return 结果 + */ + @Override + public Flux findAllByValues(String key, List values) { + Criteria criteria = Criteria.where(key).in(values); + Query query = new Query(criteria); + return mongoOperations.find(query, + entityInformation.getJavaType(), + entityInformation.getCollectionName()); + } + + /** + * Checks whether the data store contains elements that match the given {@link Qo}. + * + * @param query the {@link Qo} to use for the existence check, must not be {@literal null}. + * @return {@literal true} if the data store contains elements that match the given {@link Qo}. + */ + @Override + public Mono exists(Qo query) { + return Mono.justOrEmpty(QueryBuildUtils.getQuery(query)) + .flatMap(querying -> mongoOperations.exists(querying, + entityInformation.getJavaType(), entityInformation.getCollectionName())) + .defaultIfEmpty(false); + } + + /** + * 删除全部 + * + * @param qo 查询实体 + * @return 结果 + */ + @Override + public Mono deleteAll(Qo qo) { + return Mono.justOrEmpty(QueryBuildUtils.getQuery(qo)) + .flatMap(querying -> mongoOperations.remove(querying, entityInformation.getJavaType(), + entityInformation.getCollectionName())) + .then(Mono.empty()); + } } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryImpl.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryImpl.java index 1a36a30..91059c1 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryImpl.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultRepositoryImpl.java @@ -3,10 +3,8 @@ package com.flyfish.framework.repository.impl; import com.flyfish.framework.domain.base.Domain; import com.flyfish.framework.domain.base.Qo; import com.flyfish.framework.repository.DefaultRepository; -import com.flyfish.framework.utils.CopyUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.dao.IncorrectResultSizeDataAccessException; -import org.springframework.data.domain.Example; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -16,7 +14,7 @@ import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.repository.query.MongoEntityInformation; import org.springframework.data.mongodb.repository.support.SimpleMongoRepository; -import org.springframework.data.repository.support.PageableExecutionUtils; +import org.springframework.data.support.PageableExecutionUtils; import java.util.Collections; import java.util.List; @@ -71,14 +69,10 @@ public class DefaultRepositoryImpl extends SimpleMongoReposito */ @Override public Optional findOne(Qo query) { - Query querying = getQuery(query); - if (null != querying) { - return Optional - .ofNullable(mongoOperations.findOne(querying, - entityInformation.getJavaType(), - entityInformation.getCollectionName())); - } - return Optional.empty(); + return QueryBuildUtils.getQuery(query) + .map(querying -> mongoOperations.findOne(querying, + entityInformation.getJavaType(), + entityInformation.getCollectionName())); } /** @@ -90,13 +84,11 @@ public class DefaultRepositoryImpl extends SimpleMongoReposito */ @Override public Iterable findAll(Qo query) { - Query querying = getQuery(query); - if (null != querying) { - return mongoOperations.find(querying, - entityInformation.getJavaType(), - entityInformation.getCollectionName()); - } - return Collections.emptyList(); + return QueryBuildUtils.getQuery(query) + .map(querying -> mongoOperations.find(querying, + entityInformation.getJavaType(), + entityInformation.getCollectionName())) + .orElse(Collections.emptyList()); } /** @@ -111,7 +103,11 @@ public class DefaultRepositoryImpl extends SimpleMongoReposito */ @Override public Iterable findAll(Qo query, Sort sort) { - return Collections.emptyList(); + return QueryBuildUtils.getQuery(query) + .map(querying -> mongoOperations.find(querying.with(sort), + entityInformation.getJavaType(), + entityInformation.getCollectionName())) + .orElse(Collections.emptyList()); } /** @@ -124,14 +120,11 @@ public class DefaultRepositoryImpl extends SimpleMongoReposito */ @Override public Page findAll(Qo query, Pageable pageable) { - Query querying = getQuery(query); - if (null != querying) { - querying.with(pageable); - List queryResult = mongoOperations.find(querying, + return QueryBuildUtils.getQuery(query).map(querying -> { + List queryResult = mongoOperations.find(querying.with(pageable), entityInformation.getJavaType(), entityInformation.getCollectionName()); return PageableExecutionUtils.getPage(queryResult, pageable, () -> count(query)); - } - return Page.empty(); + }).orElse(Page.empty()); } /** @@ -142,8 +135,9 @@ public class DefaultRepositoryImpl extends SimpleMongoReposito */ @Override public long count(Qo query) { - Query q = getQuery(query); - return this.mongoOperations.count(q, entityInformation.getJavaType(), entityInformation.getCollectionName()); + return QueryBuildUtils.getQuery(query) + .map(q -> this.mongoOperations.count(q, entityInformation.getJavaType(), entityInformation.getCollectionName())) + .orElse(0L); } /** @@ -154,7 +148,7 @@ public class DefaultRepositoryImpl extends SimpleMongoReposito * @return 结果 */ @Override - public List findAllByValues(String key, List values) { + public List findAllByValues(String key, List values) { Criteria criteria = Criteria.where(key).in(values); Query query = new Query(criteria); return mongoOperations.find(query, @@ -170,38 +164,9 @@ public class DefaultRepositoryImpl extends SimpleMongoReposito */ @Override public boolean exists(Qo query) { - return false; - } - - /** - * 从查询实体抽取内部查询信息 - * - * @param qo 查询实体 - * @return 结果 - */ - private Query getQuery(Qo qo) { - Criteria criteria = null; - if (null != qo.getCriteria()) { - criteria = qo.getCriteria(); - } else if (null != qo.getExample()) { - criteria = new Criteria().alike(qo.getExample()); - } else { - Class type = qo.pojoType(); - if (null != type && !Object.class.equals(type)) { - try { - T pojo = CopyUtils.copyQueryProps(qo, qo.pojoType().newInstance()); - criteria = new Criteria().alike(Example.of(pojo)); - } catch (InstantiationException | IllegalAccessException e) { - e.printStackTrace(); - } - } - } - if (criteria != null) { - // 针对删除状态全局筛选 - return new Query(Criteria.where("delete").ne(true).andOperator(criteria)) - .with(qo.sorts()); - } - return null; + return QueryBuildUtils.getQuery(query).map(querying -> mongoOperations.exists(querying, + entityInformation.getJavaType(), entityInformation.getCollectionName())) + .orElse(false); } } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/QueryBuildUtils.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/QueryBuildUtils.java new file mode 100644 index 0000000..84f4522 --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/QueryBuildUtils.java @@ -0,0 +1,43 @@ +package com.flyfish.framework.repository.impl; + +import com.flyfish.framework.domain.base.Qo; +import com.flyfish.framework.utils.CopyUtils; +import org.springframework.data.domain.Example; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; + +import java.util.Optional; + +abstract class QueryBuildUtils { + + /** + * 从查询实体抽取内部查询信息 + * + * @param qo 查询实体 + * @return 结果 + */ + static Optional getQuery(Qo qo) { + Criteria criteria = null; + if (null != qo.getCriteria()) { + criteria = qo.getCriteria(); + } else if (null != qo.getExample()) { + criteria = new Criteria().alike(qo.getExample()); + } else { + Class type = qo.pojoType(); + if (null != type && !Object.class.equals(type)) { + try { + T pojo = CopyUtils.copyQueryProps(qo, qo.pojoType().newInstance()); + criteria = new Criteria().alike(Example.of(pojo)); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + } + } + if (criteria != null) { + // 针对删除状态全局筛选 + return Optional.of(new Query(Criteria.where("delete").ne(true).andOperator(criteria)) + .with(qo.sorts())); + } + return Optional.empty(); + } +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/ReactivePageableExecutionUtils.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/ReactivePageableExecutionUtils.java new file mode 100644 index 0000000..28b94e0 --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/ReactivePageableExecutionUtils.java @@ -0,0 +1,69 @@ +/* + * Copyright 2021 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.flyfish.framework.repository.impl; + +import reactor.core.publisher.Mono; + +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.util.Assert; + +/** + * Support for query execution using {@link Pageable}. Using {@link ReactivePageableExecutionUtils} assumes that data + * queries are cheaper than {@code COUNT} queries and so some cases can take advantage of optimizations. + * + * @author Mark Paluch + * @since 3.3 + */ +abstract class ReactivePageableExecutionUtils { + + private ReactivePageableExecutionUtils() {} + + /** + * Constructs a {@link Page} based on the given {@code content}, {@link Pageable} and {@link Mono} applying + * optimizations. The construction of {@link Page} omits a count query if the total can be determined based on the + * result size and {@link Pageable}. + * + * @param content must not be {@literal null}. + * @param pageable must not be {@literal null}. + * @param totalSupplier must not be {@literal null}. + * @return the {@link Page}. + */ + public static Mono> getPage(List content, Pageable pageable, Mono totalSupplier) { + + Assert.notNull(content, "Content must not be null!"); + Assert.notNull(pageable, "Pageable must not be null!"); + Assert.notNull(totalSupplier, "TotalSupplier must not be null!"); + + if (pageable.isUnpaged() || pageable.getOffset() == 0) { + + if (pageable.isUnpaged() || pageable.getPageSize() > content.size()) { + return Mono.just(new PageImpl<>(content, pageable, content.size())); + } + + return totalSupplier.map(total -> new PageImpl<>(content, pageable, total)); + } + + if (!content.isEmpty() && pageable.getPageSize() > content.size()) { + return Mono.just(new PageImpl<>(content, pageable, pageable.getOffset() + content.size())); + } + + return totalSupplier.map(total -> new PageImpl<>(content, pageable, total)); + } +} diff --git a/flyfish-dict/src/main/java/com/flyfish/framework/dict/config/DictionaryProcessor.java b/flyfish-dict/src/main/java/com/flyfish/framework/dict/config/DictionaryProcessor.java index 8816e81..e91b9da 100644 --- a/flyfish-dict/src/main/java/com/flyfish/framework/dict/config/DictionaryProcessor.java +++ b/flyfish-dict/src/main/java/com/flyfish/framework/dict/config/DictionaryProcessor.java @@ -11,7 +11,7 @@ import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.reflections.Reflections; -import org.reflections.scanners.FieldAnnotationsScanner; +import org.reflections.scanners.Scanners; import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; import org.springframework.beans.factory.InitializingBean; @@ -45,7 +45,7 @@ public class DictionaryProcessor implements InitializingBean { .collect(Collectors.toList()); Reflections reflections = new Reflections(new ConfigurationBuilder() .setUrls(urls) - .setScanners(new FieldAnnotationsScanner())); + .setScanners(Scanners.FieldsAnnotated)); Set fields = reflections.getFieldsAnnotatedWith(DictValue.class); if (CollectionUtils.isNotEmpty(fields)) { // 查找是否存在,不存在插入,存在无视 diff --git a/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/AutoCompleteController.java b/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/AutoCompleteController.java index 5ad7d9c..e4ec11e 100644 --- a/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/AutoCompleteController.java +++ b/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/AutoCompleteController.java @@ -1,10 +1,10 @@ package com.flyfish.framework.dict.controller; import com.flyfish.framework.beans.annotations.RestMapping; -import com.flyfish.framework.controller.BaseController; +import com.flyfish.framework.controller.ReactiveBaseController; import com.flyfish.framework.dict.domain.AutoComplete; import com.flyfish.framework.domain.base.NameLikeQo; @RestMapping("auto-completes") -public class AutoCompleteController extends BaseController> { +public class AutoCompleteController extends ReactiveBaseController> { } diff --git a/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/DictionaryController.java b/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/DictionaryController.java index 543d1ba..5d67493 100644 --- a/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/DictionaryController.java +++ b/flyfish-dict/src/main/java/com/flyfish/framework/dict/controller/DictionaryController.java @@ -2,7 +2,7 @@ package com.flyfish.framework.dict.controller; import com.flyfish.framework.beans.annotations.RestMapping; -import com.flyfish.framework.controller.BaseController; +import com.flyfish.framework.controller.ReactiveBaseController; import com.flyfish.framework.dict.domain.Dictionary; import com.flyfish.framework.dict.domain.DictionaryQo; @@ -12,6 +12,6 @@ import com.flyfish.framework.dict.domain.DictionaryQo; * @author wangyu */ @RestMapping("dictionaries") -public class DictionaryController extends BaseController { +public class DictionaryController extends ReactiveBaseController { } diff --git a/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/AutoCompleteRepository.java b/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/AutoCompleteRepository.java index 10efbb6..8e68103 100644 --- a/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/AutoCompleteRepository.java +++ b/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/AutoCompleteRepository.java @@ -1,7 +1,7 @@ package com.flyfish.framework.dict.repository; import com.flyfish.framework.dict.domain.AutoComplete; -import com.flyfish.framework.repository.DefaultRepository; +import com.flyfish.framework.repository.DefaultReactiveRepository; -public interface AutoCompleteRepository extends DefaultRepository { +public interface AutoCompleteRepository extends DefaultReactiveRepository { } diff --git a/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/DictionaryRepository.java b/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/DictionaryRepository.java index adc8350..d201379 100644 --- a/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/DictionaryRepository.java +++ b/flyfish-dict/src/main/java/com/flyfish/framework/dict/repository/DictionaryRepository.java @@ -1,7 +1,7 @@ package com.flyfish.framework.dict.repository; import com.flyfish.framework.dict.domain.Dictionary; -import com.flyfish.framework.repository.DefaultRepository; +import com.flyfish.framework.repository.DefaultReactiveRepository; import java.util.Optional; @@ -10,7 +10,7 @@ import java.util.Optional; * * @author wangyu */ -public interface DictionaryRepository extends DefaultRepository { +public interface DictionaryRepository extends DefaultReactiveRepository { /** * 通过code查找 diff --git a/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/AutoCompleteService.java b/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/AutoCompleteService.java index bd81b9a..2ae6e26 100644 --- a/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/AutoCompleteService.java +++ b/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/AutoCompleteService.java @@ -1,9 +1,9 @@ package com.flyfish.framework.dict.service; import com.flyfish.framework.dict.domain.AutoComplete; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.stereotype.Service; @Service -public class AutoCompleteService extends BaseServiceImpl { +public class AutoCompleteService extends BaseReactiveServiceImpl { } diff --git a/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/DictionaryService.java b/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/DictionaryService.java index acbf0ae..c4f208b 100644 --- a/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/DictionaryService.java +++ b/flyfish-dict/src/main/java/com/flyfish/framework/dict/service/DictionaryService.java @@ -3,7 +3,8 @@ package com.flyfish.framework.dict.service; import com.flyfish.framework.dict.domain.Dictionary; import com.flyfish.framework.dict.repository.DictionaryRepository; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.stereotype.Service; import java.util.Optional; @@ -14,7 +15,7 @@ import java.util.Optional; * @author wangyu */ @Service -public class DictionaryService extends BaseServiceImpl { +public class DictionaryService extends BaseReactiveServiceImpl { /** * 通过code查询 diff --git a/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentController.java b/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentController.java index c99a176..30a2ab7 100644 --- a/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentController.java +++ b/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentController.java @@ -1,7 +1,7 @@ package com.flyfish.framework.file.controller; -import com.flyfish.framework.controller.BaseController; +import com.flyfish.framework.controller.ReactiveBaseController; import com.flyfish.framework.file.domain.Attachment; import com.flyfish.framework.file.domain.AttachmentQo; import org.springframework.web.bind.annotation.RequestMapping; @@ -9,6 +9,6 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/attachments") -public class AttachmentController extends BaseController { +public class AttachmentController extends ReactiveBaseController { } diff --git a/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentUploadController.java b/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentUploadController.java index 7ef3de2..ed0233c 100644 --- a/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentUploadController.java +++ b/flyfish-file/src/main/java/com/flyfish/framework/file/controller/AttachmentUploadController.java @@ -57,7 +57,7 @@ public class AttachmentUploadController { @GetMapping("/downloads/{id}") public Mono downloadAttachment(@PathVariable String id, ServerHttpResponse response) { - return Mono.justOrEmpty(attachmentService.getById(id)) + return attachmentService.getById(id) .flatMap(attachment -> DownloadUtils.download(configuration.getLocalPath() + attachment.getPath(), response)); } diff --git a/flyfish-file/src/main/java/com/flyfish/framework/file/repository/AttachmentRepository.java b/flyfish-file/src/main/java/com/flyfish/framework/file/repository/AttachmentRepository.java index 8fcbbcf..a4f19e4 100644 --- a/flyfish-file/src/main/java/com/flyfish/framework/file/repository/AttachmentRepository.java +++ b/flyfish-file/src/main/java/com/flyfish/framework/file/repository/AttachmentRepository.java @@ -2,7 +2,7 @@ package com.flyfish.framework.file.repository; import com.flyfish.framework.file.domain.Attachment; -import com.flyfish.framework.repository.DefaultRepository; +import com.flyfish.framework.repository.DefaultReactiveRepository; -public interface AttachmentRepository extends DefaultRepository { +public interface AttachmentRepository extends DefaultReactiveRepository { } diff --git a/flyfish-file/src/main/java/com/flyfish/framework/file/service/AttachmentService.java b/flyfish-file/src/main/java/com/flyfish/framework/file/service/AttachmentService.java index c1dfe5d..aef6087 100644 --- a/flyfish-file/src/main/java/com/flyfish/framework/file/service/AttachmentService.java +++ b/flyfish-file/src/main/java/com/flyfish/framework/file/service/AttachmentService.java @@ -3,7 +3,7 @@ package com.flyfish.framework.file.service; import com.flyfish.framework.file.domain.Attachment; import com.flyfish.framework.file.utils.FileSizeUtils; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.apache.commons.lang3.StringUtils; import org.springframework.http.codec.multipart.FilePart; import org.springframework.stereotype.Service; @@ -12,7 +12,7 @@ import reactor.core.publisher.Mono; import javax.annotation.Resource; @Service -public class AttachmentService extends BaseServiceImpl { +public class AttachmentService extends BaseReactiveServiceImpl { private static String URL = "/api/attachment/"; @Resource @@ -36,7 +36,7 @@ public class AttachmentService extends BaseServiceImpl { */ public Mono upload(FilePart part, String name) { return fileService.saveLocal(part) - .map(path -> { + .flatMap(path -> { Attachment attachment = Attachment.builder() .size(FileSizeUtils.size(part.headers().getContentLength())) .path(path) diff --git a/flyfish-form/src/main/java/com/flyfish/framework/form/controller/OnlineFormController.java b/flyfish-form/src/main/java/com/flyfish/framework/form/controller/OnlineFormController.java index ccd871c..5a860ad 100644 --- a/flyfish-form/src/main/java/com/flyfish/framework/form/controller/OnlineFormController.java +++ b/flyfish-form/src/main/java/com/flyfish/framework/form/controller/OnlineFormController.java @@ -1,6 +1,6 @@ package com.flyfish.framework.form.controller; -import com.flyfish.framework.controller.BaseController; +import com.flyfish.framework.controller.ReactiveBaseController; import com.flyfish.framework.domain.base.NameLikeQo; import com.flyfish.framework.form.domain.OnlineForm; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,5 +13,5 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequestMapping("online-forms") -public class OnlineFormController extends BaseController> { +public class OnlineFormController extends ReactiveBaseController> { } diff --git a/flyfish-form/src/main/java/com/flyfish/framework/form/repository/OnlineFormRepository.java b/flyfish-form/src/main/java/com/flyfish/framework/form/repository/OnlineFormRepository.java index 12d8c34..49b683b 100644 --- a/flyfish-form/src/main/java/com/flyfish/framework/form/repository/OnlineFormRepository.java +++ b/flyfish-form/src/main/java/com/flyfish/framework/form/repository/OnlineFormRepository.java @@ -1,10 +1,10 @@ package com.flyfish.framework.form.repository; import com.flyfish.framework.form.domain.OnlineForm; -import com.flyfish.framework.repository.DefaultRepository; +import com.flyfish.framework.repository.DefaultReactiveRepository; /** * 在线表单 */ -public interface OnlineFormRepository extends DefaultRepository { +public interface OnlineFormRepository extends DefaultReactiveRepository { } diff --git a/flyfish-form/src/main/java/com/flyfish/framework/form/service/OnlineFormService.java b/flyfish-form/src/main/java/com/flyfish/framework/form/service/OnlineFormService.java index 847d2eb..132c70e 100644 --- a/flyfish-form/src/main/java/com/flyfish/framework/form/service/OnlineFormService.java +++ b/flyfish-form/src/main/java/com/flyfish/framework/form/service/OnlineFormService.java @@ -1,7 +1,7 @@ package com.flyfish.framework.form.service; import com.flyfish.framework.form.domain.OnlineForm; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.stereotype.Service; /** @@ -9,5 +9,5 @@ import org.springframework.stereotype.Service; * @author wangyu */ @Service -public class OnlineFormService extends BaseServiceImpl { +public class OnlineFormService extends BaseReactiveServiceImpl { } diff --git a/flyfish-logging/src/main/java/com/flyfish/framework/logging/controller/LogController.java b/flyfish-logging/src/main/java/com/flyfish/framework/logging/controller/LogController.java index 7495aa2..8e1343b 100644 --- a/flyfish-logging/src/main/java/com/flyfish/framework/logging/controller/LogController.java +++ b/flyfish-logging/src/main/java/com/flyfish/framework/logging/controller/LogController.java @@ -1,7 +1,7 @@ package com.flyfish.framework.logging.controller; import com.flyfish.framework.beans.annotations.RestMapping; -import com.flyfish.framework.controller.BaseController; +import com.flyfish.framework.controller.ReactiveBaseController; import com.flyfish.framework.logging.domain.Log; import com.flyfish.framework.logging.domain.LogQo; @@ -11,6 +11,6 @@ import com.flyfish.framework.logging.domain.LogQo; * @author wangyu */ @RestMapping("logs") -public class LogController extends BaseController { +public class LogController extends ReactiveBaseController { } diff --git a/flyfish-logging/src/main/java/com/flyfish/framework/logging/repository/LogRepository.java b/flyfish-logging/src/main/java/com/flyfish/framework/logging/repository/LogRepository.java index ce905bc..2d4ba23 100644 --- a/flyfish-logging/src/main/java/com/flyfish/framework/logging/repository/LogRepository.java +++ b/flyfish-logging/src/main/java/com/flyfish/framework/logging/repository/LogRepository.java @@ -1,11 +1,11 @@ package com.flyfish.framework.logging.repository; import com.flyfish.framework.logging.domain.Log; -import com.flyfish.framework.repository.DefaultRepository; +import com.flyfish.framework.repository.DefaultReactiveRepository; /** * 日志仓库 * @author wangyu */ -public interface LogRepository extends DefaultRepository { +public interface LogRepository extends DefaultReactiveRepository { } diff --git a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogService.java b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogService.java index e951323..a321be7 100644 --- a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogService.java +++ b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogService.java @@ -1,7 +1,7 @@ package com.flyfish.framework.logging.service; import com.flyfish.framework.logging.domain.Log; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.stereotype.Service; /** @@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; * @author wangyu */ @Service -public class LogService extends BaseServiceImpl { +public class LogService extends BaseReactiveServiceImpl { } diff --git a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/SimpleAuthenticationLogger.java b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/SimpleAuthenticationLogger.java index 86750c2..be28ad4 100644 --- a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/SimpleAuthenticationLogger.java +++ b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/SimpleAuthenticationLogger.java @@ -6,13 +6,12 @@ import com.flyfish.framework.logging.config.LoggingTextRegistry; import com.flyfish.framework.logging.domain.Log; import com.flyfish.framework.logging.domain.LogType; import com.flyfish.framework.service.AuthenticationLogger; -import com.flyfish.framework.service.UserFindService; import com.flyfish.framework.utils.AuthenticationMessages; import com.flyfish.framework.utils.UserUtils; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; -import org.springframework.util.MultiValueMap; +import reactor.core.publisher.Mono; import javax.annotation.Resource; import java.util.Date; @@ -29,8 +28,6 @@ public class SimpleAuthenticationLogger implements AuthenticationLogger { @Resource private LogService logService; @Resource - private UserFindService userService; - @Resource private LoggingTextRegistry registry; /** @@ -39,19 +36,19 @@ public class SimpleAuthenticationLogger implements AuthenticationLogger { * @param user 用户 */ @Override - public void success(UserDetails user) { - saveSuccess("LOGIN", "登录成功", user); + public Mono success(UserDetails user) { + return saveSuccess("LOGIN", "登录成功", user); } /** * 记录失败 * - * @param form 表单 + * @param user 表单用户 * @param exception 错误异常 */ @Override - public void failure(MultiValueMap form, AuthenticationException exception) { - saveError("LOGIN", "登录失败", form.getFirst("username"), AuthenticationMessages.message(exception)); + public Mono failure(User user, AuthenticationException exception) { + return saveError("LOGIN", "登录失败", user, AuthenticationMessages.message(exception)); } /** @@ -60,8 +57,8 @@ public class SimpleAuthenticationLogger implements AuthenticationLogger { * @param user 用户 */ @Override - public void logout(UserDetails user) { - saveSuccess("LOGOUT", "退出成功", user); + public Mono logout(UserDetails user) { + return saveSuccess("LOGOUT", "退出成功", user); } /** @@ -71,7 +68,7 @@ public class SimpleAuthenticationLogger implements AuthenticationLogger { * @param message 信息 * @param user 用户 */ - private void saveSuccess(String business, String message, UserDetails user) { + private Mono saveSuccess(String business, String message, UserDetails user) { User raw = UserUtils.toUser(user); Log log = new Log(); log.setType(LogType.AUTHENTICATION); @@ -85,7 +82,7 @@ public class SimpleAuthenticationLogger implements AuthenticationLogger { log.setPeriod(0L); log.setStartTime(new Date()); // 写入日志 - logService.create(log); + return logService.create(log).then(); } /** @@ -93,24 +90,23 @@ public class SimpleAuthenticationLogger implements AuthenticationLogger { * * @param business 业务 * @param message 消息 - * @param username 用户名 * @param error 错误 */ - private void saveError(String business, String message, String username, String error) { + private Mono saveError(String business, String message, User user, String error) { Log log = new Log(); log.setType(LogType.AUTHENTICATION); log.setSignature(business); log.setSuccess(false); - log.setBody("某人尝试使用用户名'" + username + "',密码:******,进行登录"); + log.setBody("某人尝试使用用户名'" + user.getUsername() + "',密码:******,进行登录"); log.setModule("登录模块"); log.setBusiness(registry.text(business)); log.setError(error); log.setResponse(message); - log.setOperator(userService.findByUsername(username).map(Domain::getName).orElse("未知")); + log.setOperator(user.getName()); log.setPeriod(0L); log.setStartTime(new Date()); // 写入日志 - logService.create(log); + return logService.create(log).then(); } } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/annotations/EnableAutoSecurity.java b/flyfish-user/src/main/java/com/flyfish/framework/annotations/EnableAutoSecurity.java index 52a20f7..8a9617e 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/annotations/EnableAutoSecurity.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/annotations/EnableAutoSecurity.java @@ -16,7 +16,7 @@ import java.lang.annotation.*; @Target({ElementType.TYPE}) @Documented @Import(WebSecurityConfig.class) -@EnableReactiveMongoRepositories(basePackages = "com.flyfish.framework") +@EnableReactiveMongoRepo @EnableReactiveRedis public @interface EnableAutoSecurity { } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/config/AuthenticationAuditorImpl.java b/flyfish-user/src/main/java/com/flyfish/framework/config/AuthenticationAuditorImpl.java index 53b6dea..26276d0 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/config/AuthenticationAuditorImpl.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/config/AuthenticationAuditorImpl.java @@ -40,8 +40,7 @@ public class AuthenticationAuditorImpl extends ResultDataTransformer implements updating.setId(details.getId()); updating.setErrorCount(0); updating.setLastTime(new Date()); - return reactiveUserService.updateSelectiveById(updating) - .then(Mono.fromRunnable(() -> authenticationLogger.success(user))); + return reactiveUserService.updateSelectiveById(updating).then(authenticationLogger.success(user)); } /** @@ -56,27 +55,40 @@ public class AuthenticationAuditorImpl extends ResultDataTransformer implements return webFilterExchange.getExchange() .getFormData() .flatMap(data -> { + String username = data.getFirst("username"); + Mono userMono = reactiveUserService.findByUsername(username).defaultIfEmpty(emptyUser(username)); // 当且仅当为凭据错误,尝试 if (exception instanceof BadCredentialsException) { - return reactiveUserService.findByUsername(data.getFirst("username")) - .flatMap(user -> { - User updating = new User(); - updating.setId(user.getId()); - updating.setErrorCount(user.getErrorCount() + 1); - if (updating.getErrorCount() >= 5) { - updating.setStatus(UserStatus.LOCKED); - } - return reactiveUserService.updateSelectiveById(updating); - }) - .map(user -> data); + userMono = userMono.flatMap(user -> { + User updating = new User(); + updating.setId(user.getId()); + updating.setErrorCount(user.getErrorCount() + 1); + if (updating.getErrorCount() >= 5) { + updating.setStatus(UserStatus.LOCKED); + } + return reactiveUserService.updateSelectiveById(updating); + }); } - return Mono.just(data); - }) - .flatMap(data -> Mono.fromRunnable(() -> authenticationLogger.failure(data, exception))); + return userMono.flatMap(user -> authenticationLogger.failure(user, exception)); + }); } @Override public Mono logout(UserDetails userDetails) { - return Mono.fromRunnable(() -> authenticationLogger.logout(userDetails)); + return authenticationLogger.logout(userDetails); } + + /** + * 构造空用户 + * + * @param username 用户名 + * @return 结果 + */ + private User emptyUser(String username) { + User user = new User(); + user.setUsername(username); + user.setName("未知"); + return user; + } + } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/config/WebSecurityConfig.java b/flyfish-user/src/main/java/com/flyfish/framework/config/WebSecurityConfig.java index c6adea6..d02efcb 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/config/WebSecurityConfig.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/config/WebSecurityConfig.java @@ -36,7 +36,7 @@ import org.springframework.security.web.server.SecurityWebFilterChain; import org.springframework.security.web.server.authentication.HttpStatusServerEntryPoint; import org.springframework.security.web.server.context.ServerSecurityContextRepository; import org.springframework.security.web.server.context.WebSessionServerSecurityContextRepository; -import org.springframework.util.MultiValueMap; +import reactor.core.publisher.Mono; import java.util.stream.Stream; @@ -74,18 +74,18 @@ public class WebSecurityConfig { public AuthenticationLogger authenticationLogger() { return new AuthenticationLogger() { @Override - public void success(UserDetails user) { - + public Mono success(UserDetails user) { + return Mono.empty(); } @Override - public void failure(MultiValueMap form, AuthenticationException exception) { - + public Mono failure(User user, AuthenticationException exception) { + return Mono.empty(); } @Override - public void logout(UserDetails user) { - + public Mono logout(UserDetails user) { + return Mono.empty(); } }; } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/config/audit/ReactiveUserAuditor.java b/flyfish-user/src/main/java/com/flyfish/framework/config/audit/ReactiveUserAuditor.java new file mode 100644 index 0000000..2736dcb --- /dev/null +++ b/flyfish-user/src/main/java/com/flyfish/framework/config/audit/ReactiveUserAuditor.java @@ -0,0 +1,33 @@ +package com.flyfish.framework.config.audit; + +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.utils.UserUtils; +import org.springframework.data.domain.ReactiveAuditorAware; +import org.springframework.lang.NonNull; +import org.springframework.security.core.context.ReactiveSecurityContextHolder; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +/** + * 用户上下文审查工具 + * + * @author wangyu + */ +@Component +public class ReactiveUserAuditor implements ReactiveAuditorAware { + + /** + * 在异步上下文中获取结果 + * + * @return 结果 + */ + @Override + @NonNull + public Mono getCurrentAuditor() { + return ReactiveSecurityContextHolder.getContext() + .map(UserUtils::extractUser) + .map(Domain::getName) + .defaultIfEmpty("匿名用户"); + } + +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/auditor/UserAuditor.java b/flyfish-user/src/main/java/com/flyfish/framework/config/audit/UserAuditor.java similarity index 94% rename from flyfish-data/src/main/java/com/flyfish/framework/auditor/UserAuditor.java rename to flyfish-user/src/main/java/com/flyfish/framework/config/audit/UserAuditor.java index 44db7d3..9e424eb 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/auditor/UserAuditor.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/config/audit/UserAuditor.java @@ -1,4 +1,4 @@ -package com.flyfish.framework.auditor; +package com.flyfish.framework.config.audit; import com.flyfish.framework.context.UserContext; import com.flyfish.framework.domain.base.Domain; diff --git a/flyfish-user/src/main/java/com/flyfish/framework/controller/RoleController.java b/flyfish-user/src/main/java/com/flyfish/framework/controller/RoleController.java index a563a04..300139c 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/controller/RoleController.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/controller/RoleController.java @@ -12,6 +12,6 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequestMapping("/roles") -public class RoleController extends BaseController { +public class RoleController extends ReactiveBaseController { } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/controller/UserController.java b/flyfish-user/src/main/java/com/flyfish/framework/controller/UserController.java index 893c975..62a304f 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/controller/UserController.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/controller/UserController.java @@ -10,7 +10,6 @@ import com.flyfish.framework.domain.po.Role; import com.flyfish.framework.domain.po.User; import com.flyfish.framework.enums.UserStatus; import com.flyfish.framework.service.ReactiveUserService; -import com.flyfish.framework.service.UserService; import com.flyfish.framework.utils.Assert; import com.flyfish.framework.utils.StrengthUtils; import org.springframework.security.core.context.ReactiveSecurityContextHolder; @@ -24,7 +23,7 @@ import java.util.Optional; @RestController @RequestMapping("/users") -public class UserController extends BaseController { +public class UserController extends ReactiveBaseController { @Resource private PasswordEncoder passwordEncoder; @@ -38,7 +37,7 @@ public class UserController extends BaseController { */ @PutMapping("{id}/passwords") @Operation("重置密码") - public Result resetPassword(@PathVariable String id, @RequestBody User body, @CurrentUser User user) { + public Mono> resetPassword(@PathVariable String id, @RequestBody User body, @CurrentUser User user) { Assert.hasText(body.getPassword(), "重置密码必需携带密码!"); Assert.isTrue(Optional.ofNullable(user.getRoles()).map(roles -> roles.stream().anyMatch(Role::getAdmin)) .orElse(false), "您没有管理员权限,无法重置密码!"); @@ -48,8 +47,7 @@ public class UserController extends BaseController { updating.setStatus(UserStatus.NORMAL); updating.setErrorCount(0); updating.setPassword(passwordEncoder.encode(body.getPassword())); - service.updateSelectiveById(updating); - return Result.ok(); + return reactiveService.updateSelectiveById(updating).thenReturn(Result.ok()); } /** @@ -61,7 +59,7 @@ public class UserController extends BaseController { */ @PutMapping("/passwords") @Operation("修改密码") - public Result changePassword(@Valid @RequestBody UserPasswordDto passwordDto, @CurrentUser User user) { + public Mono> changePassword(@Valid @RequestBody UserPasswordDto passwordDto, @CurrentUser User user) { // 检查原密码 Assert.isTrue(passwordEncoder.matches(passwordDto.getOldPassword(), user.getPassword()), "原密码不正确!"); Assert.isTrue(!passwordEncoder.matches(passwordDto.getPassword(), user.getPassword()), "新密码和旧密码一致,输入个新的吧!"); @@ -70,8 +68,7 @@ public class UserController extends BaseController { User updating = new User(); updating.setId(user.getId()); updating.setPassword(passwordEncoder.encode(passwordDto.getPassword())); - service.updateSelectiveById(updating); - return Result.ok(); + return reactiveService.updateSelectiveById(updating).thenReturn(Result.ok()); } /** @@ -81,12 +78,17 @@ public class UserController extends BaseController { */ @GetMapping("/current") public Mono> getCurrentUser() { - UserService userService = getService(); return ReactiveSecurityContextHolder.getContext() .map(context -> (IUser) context.getAuthentication().getPrincipal()) .map(Result::ok); } + /** + * 更新用户状态,主要更新部门 + * + * @param authorize 鉴权 + * @return 结果 + */ @PatchMapping("/status") public Mono> updateStatus(String authorize) { ReactiveUserService reactiveService = (ReactiveUserService) this.reactiveService; diff --git a/flyfish-user/src/main/java/com/flyfish/framework/repository/DepartmentRepository.java b/flyfish-user/src/main/java/com/flyfish/framework/repository/DepartmentRepository.java index 9894d2d..06ac535 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/repository/DepartmentRepository.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/repository/DepartmentRepository.java @@ -7,5 +7,5 @@ import com.flyfish.framework.domain.po.Department; * * @author wybab */ -public interface DepartmentRepository extends DefaultRepository { +public interface DepartmentRepository extends DefaultReactiveRepository { } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/repository/PermissionRepository.java b/flyfish-user/src/main/java/com/flyfish/framework/repository/PermissionRepository.java index 3b1d234..a59bfac 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/repository/PermissionRepository.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/repository/PermissionRepository.java @@ -8,5 +8,5 @@ import com.flyfish.framework.domain.po.Permission; * * @author wybab */ -public interface PermissionRepository extends DefaultRepository { +public interface PermissionRepository extends DefaultReactiveRepository { } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/repository/RoleRepository.java b/flyfish-user/src/main/java/com/flyfish/framework/repository/RoleRepository.java index 56a1367..1b80238 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/repository/RoleRepository.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/repository/RoleRepository.java @@ -7,5 +7,5 @@ import com.flyfish.framework.domain.po.Role; * * @author wybab */ -public interface RoleRepository extends DefaultRepository { +public interface RoleRepository extends DefaultReactiveRepository { } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java index bf5bdd6..9b49e67 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/DepartmentService.java @@ -1,7 +1,7 @@ package com.flyfish.framework.service; import com.flyfish.framework.domain.po.Department; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; @@ -17,7 +17,7 @@ import java.util.stream.Collectors; * @author wangyu */ @Service -public class DepartmentService extends BaseServiceImpl { +public class DepartmentService extends BaseReactiveServiceImpl { @Resource private MongoOperations mongoOperations; diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/MongoUserDetailsServiceImpl.java b/flyfish-user/src/main/java/com/flyfish/framework/service/MongoUserDetailsServiceImpl.java index 2c0fb10..4357067 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/MongoUserDetailsServiceImpl.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/MongoUserDetailsServiceImpl.java @@ -80,7 +80,7 @@ public class MongoUserDetailsServiceImpl implements MongoUserDetailsService { public Mono findByUsername(String s) { String key = UserCacheKeys.get(s); // 优先从缓存读取,如果缓存不存在,查询转换后放入缓存 - return reactiveRedisOperations.hasKey(key).flatMap(exists -> exists ? reactiveRedisOperations.get(key) : + return reactiveRedisOperations.hasKey(key).flatMap(exists -> Boolean.TRUE.equals(exists) ? reactiveRedisOperations.get(key) : userService.findByUsername(s).flatMap(this::validate).map(this::mapToUserDetails) .flatMap(detail -> reactiveRedisOperations.set(key, detail).thenReturn(detail)) ) diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java index 5181222..9e7ad98 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/PermissionService.java @@ -2,10 +2,10 @@ package com.flyfish.framework.service; import com.flyfish.framework.domain.po.Permission; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.stereotype.Service; @Service -public class PermissionService extends BaseServiceImpl { +public class PermissionService extends BaseReactiveServiceImpl { } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/ReactiveUserService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/ReactiveUserService.java index 0ae3814..6ebf3de 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/ReactiveUserService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/ReactiveUserService.java @@ -12,7 +12,7 @@ import reactor.core.publisher.Mono; * @author wangyu */ @Service -public class ReactiveUserService extends BaseReactiveServiceImpl { +public class ReactiveUserService extends BaseReactiveServiceImpl implements UserFindService { /** * 获取用户数据 @@ -20,6 +20,7 @@ public class ReactiveUserService extends BaseReactiveServiceImpl { * @param username 用户 * @return 结果 */ + @Override public Mono findByUsername(String username) { return ((ReactiveUserRepository) repository).findByUsername(username); } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java index 6d9b1dd..76be54a 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/RoleService.java @@ -5,39 +5,45 @@ import com.flyfish.framework.domain.PermissionQo; import com.flyfish.framework.domain.po.Permission; import com.flyfish.framework.domain.po.Role; import com.flyfish.framework.enums.RoleType; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.BooleanUtils; import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; -import java.util.List; +import java.util.Collections; @Service @RequiredArgsConstructor -public class RoleService extends BaseServiceImpl { +public class RoleService extends BaseReactiveServiceImpl { private final PermissionService permissionService; /** * 如果是管理员,设置拥有所有权限 * - * @param entity 实体 + * @param role 实体 * @return 结果 */ @Override - public Role create(Role entity) { - if (entity.isSystem()) { - entity.setPermissions(permissionService.getAll()); - } else if (BooleanUtils.isTrue(entity.getAdmin())) { - // 如果是管理员,拥有所有权限 - PermissionQo qo = new PermissionQo(); - qo.setAdmin(false); - List permissions = permissionService.getList(qo); - entity.setPermissions(permissions); - } - if (null == entity.getType()) { - entity.setType(RoleType.PC); - } - return super.create(entity); + public Mono create(Role role) { + return Mono.defer(() -> { + if (role.isSystem()) { + return permissionService.getAll().collectList(); + } else if (BooleanUtils.isTrue(role.getAdmin())) { + // 如果是管理员,拥有所有权限 + PermissionQo qo = new PermissionQo(); + qo.setAdmin(false); + return permissionService.getList(qo).collectList(); + } + return Mono.just(Collections.emptyList()); + }) + .flatMap(permissions -> { + role.setPermissions(permissions); + if (null == role.getType()) { + role.setType(RoleType.PC); + } + return super.create(role); + }); } } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/service/UserService.java b/flyfish-user/src/main/java/com/flyfish/framework/service/UserService.java index 0366e3d..bc56af1 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/service/UserService.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/service/UserService.java @@ -1,24 +1,10 @@ package com.flyfish.framework.service; import com.flyfish.framework.domain.po.User; -import com.flyfish.framework.repository.UserRepository; import com.flyfish.framework.service.impl.BaseServiceImpl; import org.springframework.stereotype.Service; -import java.util.Optional; - @Service -public class UserService extends BaseServiceImpl implements UserFindService { +public class UserService extends BaseServiceImpl { - - /** - * 获取用户数据 - * - * @param username 用户 - * @return 结果 - */ - @Override - public Optional findByUsername(String username) { - return ((UserRepository) repository).findByUsername(username); - } } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingController.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingController.java index 1d725bc..d566dd5 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingController.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingController.java @@ -2,6 +2,7 @@ package com.flyfish.framework.beans.excel; import com.flyfish.framework.controller.BaseController; +import com.flyfish.framework.controller.ReactiveBaseController; import com.flyfish.framework.domain.base.NameLikeQo; import com.flyfish.framework.domain.po.ExcelMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,5 +14,5 @@ import org.springframework.web.bind.annotation.RestController; */ @RestController @RequestMapping("/excel-mappings") -public class ExcelMappingController extends BaseController> { +public class ExcelMappingController extends ReactiveBaseController> { } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingRepository.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingRepository.java index 5e2d512..fb24385 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingRepository.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingRepository.java @@ -1,13 +1,13 @@ package com.flyfish.framework.beans.excel; import com.flyfish.framework.domain.po.ExcelMapping; -import com.flyfish.framework.repository.DefaultRepository; +import com.flyfish.framework.repository.DefaultReactiveRepository; /** * excel导入方案 * * @author wangyu */ -public interface ExcelMappingRepository extends DefaultRepository { +public interface ExcelMappingRepository extends DefaultReactiveRepository { } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingService.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingService.java index 156cbfb..0ac03c3 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingService.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/excel/ExcelMappingService.java @@ -1,9 +1,9 @@ package com.flyfish.framework.beans.excel; import com.flyfish.framework.domain.po.ExcelMapping; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.stereotype.Service; @Service -public class ExcelMappingService extends BaseServiceImpl { +public class ExcelMappingService extends BaseReactiveServiceImpl { } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/RestBean.java b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/RestBean.java index d8d12e1..3b600ae 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/RestBean.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/beans/meta/RestBean.java @@ -1,13 +1,13 @@ package com.flyfish.framework.beans.meta; -import com.flyfish.framework.controller.BaseController; +import com.flyfish.framework.controller.ReactiveBaseController; import com.flyfish.framework.controller.SafeController; import com.flyfish.framework.domain.base.NameLikeQo; import com.flyfish.framework.domain.base.Qo; import com.flyfish.framework.domain.base.Vo; -import com.flyfish.framework.repository.DefaultRepository; -import com.flyfish.framework.service.BaseService; -import com.flyfish.framework.service.impl.BaseServiceImpl; +import com.flyfish.framework.repository.DefaultReactiveRepository; +import com.flyfish.framework.service.BaseReactiveService; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; import org.springframework.core.annotation.AliasFor; import org.springframework.data.mongodb.core.mapping.Document; @@ -79,19 +79,19 @@ public @interface RestBean { * * @return 结果 */ - Class repoClass() default DefaultRepository.class; + Class repoClass() default DefaultReactiveRepository.class; /** * 服务类,动态生成服务 * * @return 结果 */ - Class serviceClass() default BaseServiceImpl.class; + Class serviceClass() default BaseReactiveServiceImpl.class; /** * controller的类,支持自定义 * * @return 结果 */ - Class controllerClass() default BaseController.class; + Class controllerClass() default ReactiveBaseController.class; } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/controller/BaseController.java b/flyfish-web/src/main/java/com/flyfish/framework/controller/BaseController.java index ba54c96..5ec5a66 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/controller/BaseController.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/controller/BaseController.java @@ -114,20 +114,6 @@ public abstract class BaseController> implemen return Result.accept(service.getList(qo)); } - /** - * reactive接口 - */ - @PostMapping(value = "", headers = ReactiveConstants.USE_REACTIVE) - public Mono> reactiveCreate(@ValidRequestBody T entity) { - return reactiveService.create(entity).map(Result::accept); - } - - @GetMapping(value = "{id}", headers = ReactiveConstants.USE_REACTIVE) - public Mono> reactiveGet(@PathVariable String id) { - return reactiveService.getById(id) - .map(Result::accept) - .defaultIfEmpty(Result.notFound()); - } @PutMapping(value = "{id}", headers = ReactiveConstants.USE_REACTIVE) public Mono> reactiveUpdate(@ValidRequestBody T entity) { @@ -136,29 +122,4 @@ public abstract class BaseController> implemen .defaultIfEmpty(Result.notFound()); } - @DeleteMapping(value = "{id}", headers = ReactiveConstants.USE_REACTIVE) - public Mono> reactiveRemove(@PathVariable String id) { - return reactiveService.deleteById(id).map(item -> Result.ok()); - } - - @GetMapping(value = "/all", headers = ReactiveConstants.USE_REACTIVE) - public Mono>> reactiveAll() { - return reactiveService.getAll() - .collectList() - .map(Result::accept) - .defaultIfEmpty(Result.emptyList()); - } - - @GetMapping(value = "", headers = ReactiveConstants.USE_REACTIVE) - public Mono>> reactiveList(@PagedQuery Q qo) { - if (null != qo.getPageable()) { - return reactiveService.getPageList(qo) - .map(Result::accept) - .defaultIfEmpty(Result.emptyPage()); - } - return reactiveService.getList(qo).collectList() - .map(Result::accept) - .defaultIfEmpty(Result.emptyList()); - } - } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/controller/ReactiveBaseController.java b/flyfish-web/src/main/java/com/flyfish/framework/controller/ReactiveBaseController.java new file mode 100644 index 0000000..35088ec --- /dev/null +++ b/flyfish-web/src/main/java/com/flyfish/framework/controller/ReactiveBaseController.java @@ -0,0 +1,103 @@ +package com.flyfish.framework.controller; + +import com.flyfish.framework.annotations.Operation; +import com.flyfish.framework.bean.Result; +import com.flyfish.framework.bean.SyncVo; +import com.flyfish.framework.configuration.annotations.PagedQuery; +import com.flyfish.framework.configuration.annotations.ValidRequestBody; +import com.flyfish.framework.context.UserContext; +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.domain.base.Qo; +import com.flyfish.framework.service.BaseReactiveService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.util.CastUtils; +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Mono; + +import java.util.List; + +/** + * 通用RESTful的控制器,用于动态提供基础的RESTful接口 + * 基于最新知识架构出品 + * + * @author wangyu + * @create 2021-12-7 + */ +public abstract class ReactiveBaseController> implements SafeController { + + @Autowired + protected BaseReactiveService reactiveService; + @Autowired + protected UserContext userContext; + + public > S getService() { + return CastUtils.cast(reactiveService); + } + + @GetMapping("/exists") + public Mono> exists(@PagedQuery Q qo) { + return reactiveService.exists(qo).map(Result::accept); + } + + @GetMapping("/count") + public Mono> count(@PagedQuery Q qo) { + return reactiveService.count(qo).map(Result::accept); + } + + @PostMapping("") + @Operation.Create + public Mono> create(@ValidRequestBody T entity) { + return reactiveService.create(entity).map(Result::accept); + } + + @GetMapping("{id}") + public Mono> get(@PathVariable String id) { + return reactiveService.getById(id).map(Result::accept).defaultIfEmpty(Result.notFound()); + } + + @PutMapping("{id}") + @Operation.Update + public Mono> update(@ValidRequestBody T entity) { + return reactiveService.updateSelectiveById(entity).map(Result::accept).defaultIfEmpty(Result.notFound()); + } + + @PatchMapping("{id}") + @Operation.Update + public Mono> patch(@RequestBody T entity) { + return reactiveService.updateSelectiveById(entity).map(Result::accept).defaultIfEmpty(Result.notFound()); + } + + @PutMapping("") + @Operation.UpdateAll + public Mono>> updateList(@RequestBody List list) { + return reactiveService.updateBatch(list).collectList().map(Result::accept).defaultIfEmpty(Result.emptyList()); + } + + @PutMapping("/sync") + @Operation.Sync + public Mono>> syncList(@RequestBody List list) { + return reactiveService.sync(list).map(Result::accept).defaultIfEmpty(Result.accept(SyncVo.builder().build())); + } + + @DeleteMapping("{id}") + @Operation.Delete + public Mono> remove(@PathVariable List id) { + return reactiveService.deleteBatchByIds(id).thenReturn(Result.ok()); + } + + @GetMapping("/all") + public Mono>> all(@PagedQuery Q qo) { + if (qo.isEmpty()) { + return reactiveService.getAll().collectList().map(Result::accept).defaultIfEmpty(Result.emptyList()); + } + return reactiveService.getList(qo).collectList().map(Result::accept).defaultIfEmpty(Result.emptyList()); + } + + @GetMapping("") + public Mono>> list(@PagedQuery Q qo) { + if (null != qo.getPageable() && qo.getPageable().isPaged()) { + return reactiveService.getPageList(qo).map(Result::accept).defaultIfEmpty(Result.emptyPage()); + } + return reactiveService.getList(qo).collectList().map(Result::accept).defaultIfEmpty(Result.emptyList()); + } +} diff --git a/flyfish-web/src/main/java/com/flyfish/framework/service/AuthenticationLogger.java b/flyfish-web/src/main/java/com/flyfish/framework/service/AuthenticationLogger.java index 61b4290..112fee0 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/service/AuthenticationLogger.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/service/AuthenticationLogger.java @@ -1,8 +1,9 @@ package com.flyfish.framework.service; +import com.flyfish.framework.domain.po.User; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.util.MultiValueMap; +import reactor.core.publisher.Mono; /** * 认证日志者 @@ -16,20 +17,20 @@ public interface AuthenticationLogger { * * @param user 用户 */ - void success(UserDetails user); + Mono success(UserDetails user); /** * 记录失败 * - * @param form 表单 + * @param user 表单 * @param exception 错误异常 */ - void failure(MultiValueMap form, AuthenticationException exception); + Mono failure(User user, AuthenticationException exception); /** * 记录退出 * * @param user 用户 */ - void logout(UserDetails user); + Mono logout(UserDetails user); } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/service/BaseReactiveService.java b/flyfish-web/src/main/java/com/flyfish/framework/service/BaseReactiveService.java index 2bcd3ba..2fc3977 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/service/BaseReactiveService.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/service/BaseReactiveService.java @@ -1,5 +1,7 @@ package com.flyfish.framework.service; +import com.flyfish.framework.bean.SyncVo; +import com.flyfish.framework.domain.base.Domain; import com.flyfish.framework.domain.base.Qo; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -14,7 +16,7 @@ import java.util.List; * * @author wybab */ -public interface BaseReactiveService { +public interface BaseReactiveService { /** * 查询 @@ -40,6 +42,14 @@ public interface BaseReactiveService { */ Mono getById(String id); + /** + * 通过实体名称访问 + * + * @param name 名称 + * @return 结果 + */ + Mono getByName(String name); + /** * 根据ID集合来查询 * @@ -48,6 +58,15 @@ public interface BaseReactiveService { */ Flux getByIds(List ids); + /** + * 通过某个字段的集合包含查询 + * + * @param key 键 + * @param values 值 + * @return 结果 + */ + Flux getByValues(String key, List values); + /** * 查询列表 * @@ -102,6 +121,22 @@ public interface BaseReactiveService { */ Mono count(T entity); + /** + * 查询总记录数 + * + * @param query 查询实体 + * @return 结果 + */ + Mono count(Qo query); + + /** + * 查询是否存在 + * + * @param query 查询 + * @return 结果 + */ + Mono exists(Qo query); + /** * 插入新记录 * @@ -151,10 +186,37 @@ public interface BaseReactiveService { */ Mono deleteBatchByIds(List ids); + /** + * 通过某一个键删除所有 + * + * @param qo 查询实体 + */ + Mono deleteAll(Qo qo); + + /** + * 通过某一个键删除所有 + * + * @param entity 查询 + */ + Mono deleteAll(T entity); + + /** + * 删除全部实体,危险! + */ + Mono deleteAll(); + /** * 批量更新 * * @param entities 要批量更新的集合 */ Flux updateBatch(List entities); + + /** + * 同步数据 + * + * @param entities 数据们 + * @return 结果 + */ + Mono> sync(List entities); } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/service/UserFindService.java b/flyfish-web/src/main/java/com/flyfish/framework/service/UserFindService.java index 1a51eed..92f57c5 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/service/UserFindService.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/service/UserFindService.java @@ -2,6 +2,7 @@ package com.flyfish.framework.service; import com.flyfish.framework.domain.po.User; +import reactor.core.publisher.Mono; import java.util.Optional; @@ -16,5 +17,5 @@ public interface UserFindService { * @param username 用户名 * @return 结果 */ - Optional findByUsername(String username); + Mono findByUsername(String username); } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java index 3ff5bf7..4b4bd68 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java @@ -2,13 +2,16 @@ package com.flyfish.framework.service.impl; import com.flyfish.framework.auditor.BeanAuditor; import com.flyfish.framework.auditor.BeanPoster; +import com.flyfish.framework.bean.SyncVo; import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.domain.base.Domain; import com.flyfish.framework.domain.base.Qo; +import com.flyfish.framework.exception.biz.InvalidBusinessException; import com.flyfish.framework.repository.DefaultReactiveRepository; import com.flyfish.framework.service.BaseReactiveService; import com.flyfish.framework.utils.Assert; import com.flyfish.framework.utils.CopyUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Example; import org.springframework.data.domain.Page; @@ -20,10 +23,11 @@ import reactor.core.publisher.Mono; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * 基础的Service,继承常用的全部Crud操作,基于JPARepository - * TODO 此方法在更新和查询存在不完善,后续完善底层支持,用于性能优化 + * 已完全实现全部webflux功能,提供全异步支持,系统性能最大化 * * @param 实体泛型 */ @@ -38,7 +42,6 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe @Autowired private BeanAuditor operationAuditor; - /** * 查询 * @@ -58,7 +61,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe */ @Override public Mono getOne(Qo query) { - return Mono.empty(); + return repository.findOne(query); } /** @@ -72,6 +75,17 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe return repository.findById(id); } + /** + * 通过实体名称访问 + * + * @param name 名称 + * @return 结果 + */ + @Override + public Mono getByName(String name) { + return repository.findByName(name); + } + /** * 根据ID集合来查询 * @@ -83,6 +97,18 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe return repository.findAllById(ids); } + /** + * 通过某个字段的集合包含查询 + * + * @param key 键 + * @param values 值 + * @return 结果 + */ + @Override + public Flux getByValues(String key, List values) { + return repository.findAllByValues(key, values); + } + /** * 查询列表 * @@ -102,7 +128,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe */ @Override public Flux getList(Qo query) { - return Flux.empty(); + return repository.findAll(query); } /** @@ -131,7 +157,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe */ @Override public Mono> getPageList(Qo query) { - return Mono.empty(); + return repository.findAll(query, query.getPageable()); } /** @@ -165,6 +191,28 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe return repository.count(Example.of(entity)); } + /** + * 查询总记录数 + * + * @param query 查询实体 + * @return 结果 + */ + @Override + public Mono count(Qo query) { + return repository.count(query); + } + + /** + * 查询是否存在 + * + * @param query 查询 + * @return 结果 + */ + @Override + public Mono exists(Qo query) { + return repository.exists(query); + } + /** * 插入新记录 * @@ -172,7 +220,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe */ @Override public Mono create(T entity) { - return repository.insert(entity); + return repository.insert(audit(entity)).map(this::post); } /** @@ -182,7 +230,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe */ @Override public Mono createSelective(T entity) { - return repository.insert(entity); + return repository.insert(audit(entity)).map(this::post); } /** @@ -212,7 +260,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe */ @Override public Mono updateById(T entity) { - return repository.save(entity); + return repository.save(audit(entity)).map(this::post); } /** @@ -225,7 +273,8 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe Assert.hasText(entity.getId(), "更新的主键不可为空!"); return repository.findById(entity.getId()) .map(saved -> CopyUtils.copyProps(entity, saved)) - .flatMap(this::updateById); + .flatMap(this::updateById) + .switchIfEmpty(Mono.defer(() -> Mono.error(new InvalidBusinessException("要更新的信息不存在")))); } /** @@ -240,6 +289,34 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe .single(); } + /** + * 通过某一个键删除所有 + * + * @param qo 查询实体 + */ + @Override + public Mono deleteAll(Qo qo) { + return repository.deleteAll(qo); + } + + /** + * 通过某一个键删除所有 + * + * @param entity 查询 + */ + @Override + public Mono deleteAll(T entity) { + return repository.delete(entity); + } + + /** + * 删除全部实体,危险! + */ + @Override + public Mono deleteAll() { + return repository.deleteAll(); + } + /** * 批量更新 * @@ -247,17 +324,42 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe */ @Override public Flux updateBatch(List entities) { -// Assert.notEmpty(entities, "数据不可为空!"); -// entities.forEach(item -> Assert.hasText(item.getId(), "每个对象的id必须附带!")); -// // 过滤不存在的记录 -// Map savedMap = ((List) repository.findAllById(entities.stream() -// .map(Domain::getId).collect(Collectors.toList()))).stream() -// .collect(Collectors.toMap(Domain::getId, t -> t)); -// List updating = entities.stream() -// .filter(t -> savedMap.containsKey(t.getId())) -// .map(t -> CopyUtils.copyProps(savedMap.get(t.getId()), t)) -// .collect(Collectors.toList()); - return repository.saveAll(entities); + if (CollectionUtils.isNotEmpty(entities)) { + // 带有id的集合 + List ids = entities.stream() + .filter(Objects::nonNull) + .map(Domain::getId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + return Mono.just(ids) + .filter(CollectionUtils::isNotEmpty) + .flatMapMany(list -> repository.findAllById(list)) + .collectMap(Domain::getId, t -> t) + .map(map -> entities.stream() + // 补全已保存信息 + .map(t -> map.containsKey(t.getId()) ? CopyUtils.copyProps(t, map.get(t.getId())) : t) + .map(this::audit) + .collect(Collectors.toList())) + .flatMapMany(list -> repository.saveAll(list)) + .map(this::post); + } + return Flux.fromIterable(entities); + } + + /** + * 同步数据 + * + * @param entities 数据们 + * @return 结果 + */ + @Override + public Mono> sync(List entities) { + return this.updateBatch(entities) + .collectList() + .map(list -> SyncVo.builder() + .success(list.size()) + .list(list) + .build()); } /** @@ -265,7 +367,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe * * @param entity 实体 */ - protected void audit(T entity) { + protected T audit(T entity) { // 用户审查 if (entity instanceof AuditDomain) { operationAuditor.audit((AuditDomain) entity); @@ -274,6 +376,7 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe if (auditor != null) { auditor.audit(entity); } + return entity; } /** @@ -289,5 +392,9 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe return entity; } + @SuppressWarnings("unchecked") + public > R getRepository() { + return (R) repository; + } } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java index 780e987..9f61bbc 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java @@ -6,6 +6,7 @@ import com.flyfish.framework.bean.SyncVo; import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.domain.base.Domain; import com.flyfish.framework.domain.base.Qo; +import com.flyfish.framework.repository.DefaultReactiveRepository; import com.flyfish.framework.repository.DefaultRepository; import com.flyfish.framework.service.BaseService; import com.flyfish.framework.utils.Assert; @@ -91,9 +92,8 @@ public class BaseServiceImpl implements BaseService { } @Override - @SuppressWarnings("unchecked") public List getByValues(String key, List values) { - return repository.findAllByValues(key, (List) values); + return repository.findAllByValues(key, values); } /** @@ -276,8 +276,7 @@ public class BaseServiceImpl implements BaseService { */ @Override public void deleteAll(T entity) { - Iterable list = repository.findAll(Example.of(entity)); - repository.deleteAll(list); + repository.delete(entity); } /** @@ -366,7 +365,7 @@ public class BaseServiceImpl implements BaseService { } @SuppressWarnings("unchecked") - public > R getRepository() { + public > R getRepository() { return (R) repository; } } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/utils/RedisOperations.java b/flyfish-web/src/main/java/com/flyfish/framework/utils/RedisOperations.java index a597dec..07fb166 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/utils/RedisOperations.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/utils/RedisOperations.java @@ -3,8 +3,8 @@ package com.flyfish.framework.utils; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.util.CollectionUtils; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; @@ -71,13 +71,12 @@ public class RedisOperations { * * @param key 可以传一个值 或多个 */ - @SuppressWarnings("unchecked") public void del(String... key) { if (key != null && key.length > 0) { if (key.length == 1) { redisTemplate.delete(key[0]); } else { - redisTemplate.delete(CollectionUtils.arrayToList(key)); + redisTemplate.delete(Arrays.asList(key)); } } } @@ -175,7 +174,7 @@ public class RedisOperations { * 递增 * * @param key 键 - * @param by 要增加几(大于0) + * @param delta 要增加几(大于0) * @return */ public long incr(String key, long delta) { @@ -189,7 +188,7 @@ public class RedisOperations { * 递减 * * @param key 键 - * @param by 要减少几(小于0) + * @param delta 要减少几(小于0) * @return */ public long decr(String key, long delta) { diff --git a/pom.xml b/pom.xml index cef8f62..82d0e4c 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ org.springframework.boot spring-boot-starter-parent - 2.2.4.RELEASE + 2.6.1 @@ -25,7 +25,7 @@ 3.0.3 Finchley.SR1 0.11.0 - 0.9.11 + 0.10.2