From 5ef117cfae09313aab7d2af653b83b518696a4d0 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Tue, 7 Dec 2021 10:06:10 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=AE=A1=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flyfish/framework/domain/base/IUser.java | 4 + .../ReactiveQueryModelExecutor.java | 94 +++++++++++++++++++ .../impl/DefaultReactiveRepositoryImpl.java | 4 + .../framework/controller/UserController.java | 16 ++++ .../framework/domain/AdminUserDetails.java | 1 + .../domain/authorized/AuthorizedDomain.java | 2 + .../domain/authorized/AuthorizedQo.java | 26 +++-- .../service/impl/BaseReactiveServiceImpl.java | 47 +++++++++- 8 files changed, 182 insertions(+), 12 deletions(-) create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/repository/ReactiveQueryModelExecutor.java create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultReactiveRepositoryImpl.java diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/IUser.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/base/IUser.java index 6d0f0f0..0a92356 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/IUser.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/base/IUser.java @@ -67,6 +67,10 @@ public interface IUser { void setOpenId(String openId); + String getAuthority(); + + void setAuthority(String authority); + Object getDetail(); void setDetail(Object detail); 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 new file mode 100644 index 0000000..28be1ac --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/ReactiveQueryModelExecutor.java @@ -0,0 +1,94 @@ +package com.flyfish.framework.repository; + +import com.flyfish.framework.domain.base.Qo; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; +import java.util.Optional; + +/** + * 查询模型支持 + * + * @author wangyu + * 基于repo的公共扩展 + */ +public interface ReactiveQueryModelExecutor { + + /** + * 通过名称查找一个 + * + * @param name 名称 + * @return 结果 + */ + Mono findByName(String name); + + /** + * 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 org.springframework.dao.IncorrectResultSizeDataAccessException if the Qo yields more than one + * result. + */ + Mono findOne(Qo query); + + /** + * 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}. + */ + Flux findAll(Qo query); + + /** + * 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 + */ + Flux findAll(Qo query, Sort sort); + + /** + * 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}. + */ + Page findAll(Qo query, Pageable pageable); + + /** + * 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}. + */ + long count(Qo query); + + /** + * 通过特定键的集合查询 + * + * @param key 键 + * @param values 集合 + * @return 结果 + */ + List findAllByValues(String key, List values); + + /** + * 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}. + */ + boolean exists(Qo query); +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultReactiveRepositoryImpl.java b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultReactiveRepositoryImpl.java new file mode 100644 index 0000000..29913b2 --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/repository/impl/DefaultReactiveRepositoryImpl.java @@ -0,0 +1,4 @@ +package com.flyfish.framework.repository.impl; + +public class DefaultReactiveRepositoryImpl { +} 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 cd75dbc..893c975 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 @@ -9,6 +9,7 @@ import com.flyfish.framework.domain.base.IUser; 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; @@ -85,4 +86,19 @@ public class UserController extends BaseController { .map(context -> (IUser) context.getAuthentication().getPrincipal()) .map(Result::ok); } + + @PatchMapping("/status") + public Mono> updateStatus(String authorize) { + ReactiveUserService reactiveService = (ReactiveUserService) this.reactiveService; + return ReactiveSecurityContextHolder.getContext() + .map(context -> (IUser) context.getAuthentication().getPrincipal()) + .flatMap(user -> { + user.setAuthority(authorize); + User updating = new User(); + updating.setId(user.getId()); + updating.setAuthority(user.getAuthority()); + return reactiveService.updateSelectiveById(updating); + }) + .map(Result::ok); + } } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/domain/AdminUserDetails.java b/flyfish-user/src/main/java/com/flyfish/framework/domain/AdminUserDetails.java index 33ed8f4..ac15c78 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/domain/AdminUserDetails.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/domain/AdminUserDetails.java @@ -146,6 +146,7 @@ public class AdminUserDetails implements UserDetails, IUser { return CopyUtils.copyProps(this, new User()); } + @Override public String getAuthority() { if (StringUtils.isBlank(authority) && null != departments) { authority = departments.stream().findFirst().map(Domain::getId).orElse(null); diff --git a/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedDomain.java b/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedDomain.java index 01db983..ab0cae3 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedDomain.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedDomain.java @@ -1,5 +1,6 @@ package com.flyfish.framework.domain.authorized; +import com.flyfish.framework.annotations.Property; import com.flyfish.framework.context.UserContext; import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.domain.po.Department; @@ -18,6 +19,7 @@ public abstract class AuthorizedDomain extends AuditDomain { // 作用域id,一般是部门。用户存储时插入 @NotBlank(message = "请选择当前部") + @Property(readonly = true) private String authorizeId; public String getAuthorizeId() { diff --git a/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedQo.java b/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedQo.java index ee209f4..b76edf9 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedQo.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/domain/authorized/AuthorizedQo.java @@ -4,15 +4,15 @@ import com.flyfish.framework.builder.CriteriaBuilder; import com.flyfish.framework.context.SpringContext; import com.flyfish.framework.domain.base.NameLikeQo; import com.flyfish.framework.domain.po.Department; -import com.flyfish.framework.domain.po.User; +import com.flyfish.framework.enums.UserType; import com.flyfish.framework.service.DepartmentService; import lombok.Getter; import lombok.Setter; -import org.springframework.security.core.parameters.P; +import lombok.val; +import org.apache.commons.collections4.CollectionUtils; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; /** @@ -33,11 +33,21 @@ public abstract class AuthorizedQo extends NameLikeQ * @return 结果 */ public List getAuthorizedIds() { - return Optional.ofNullable(this.user) - .map(User::getDepartments) - .map(departs -> departs.stream().map(Department::getId).collect(Collectors.toList())) - .map(this::getSubAuthorities) - .orElse(Collections.singletonList(Department.PUBLIC)); + if (null != user) { + // 是超级管理员,放行,返回null + if (user.getType() == UserType.SUPER_ADMIN) { + return null; + } + if (CollectionUtils.isNotEmpty(user.getDepartments())) { + val departs = user.getDepartments().stream().map(Department::getId) + .collect(Collectors.toList()); + val result = getSubAuthorities(departs); + if (CollectionUtils.isNotEmpty(result)) { + return result; + } + } + } + return Collections.singletonList(Department.PUBLIC); } @Override 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 13b7e49..3ff5bf7 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 @@ -1,5 +1,8 @@ package com.flyfish.framework.service.impl; +import com.flyfish.framework.auditor.BeanAuditor; +import com.flyfish.framework.auditor.BeanPoster; +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; @@ -28,6 +31,13 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe @Autowired protected DefaultReactiveRepository repository; + @Autowired(required = false) + protected BeanAuditor auditor; + @Autowired(required = false) + protected BeanPoster poster; + @Autowired + private BeanAuditor operationAuditor; + /** * 查询 @@ -213,10 +223,9 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe @Override public Mono updateSelectiveById(T entity) { Assert.hasText(entity.getId(), "更新的主键不可为空!"); - Mono saved = repository.findById(entity.getId()); -// Assert.isTrue(saved.isPresent(), "要更新的信息不存在!"); - return repository.saveAll(saved.filter(Objects::nonNull) - .map(t -> CopyUtils.copyProps(entity, t)).flux()).single(); + return repository.findById(entity.getId()) + .map(saved -> CopyUtils.copyProps(entity, saved)) + .flatMap(this::updateById); } /** @@ -250,5 +259,35 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe // .collect(Collectors.toList()); return repository.saveAll(entities); } + + /** + * 对象审查 + * + * @param entity 实体 + */ + protected void audit(T entity) { + // 用户审查 + if (entity instanceof AuditDomain) { + operationAuditor.audit((AuditDomain) entity); + } + // 自定义审查 + if (auditor != null) { + auditor.audit(entity); + } + } + + /** + * 后置审查 + * + * @param entity 实体 + * @return 结果 + */ + protected T post(T entity) { + if (null != poster) { + poster.post(entity); + } + return entity; + } + }