From b9f9cb2612b58ae4e5518c9ea0d414efe26e1f31 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Wed, 8 Dec 2021 21:52:02 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/domain/po/Department.java | 2 +- .../framework/domain/po/Permission.java | 2 +- .../framework/domain/tree/RootTreeNode.java | 27 ++++++++++ .../domain/{base => tree}/TreeDomain.java | 3 +- .../domain/{base => tree}/TreeQo.java | 4 +- .../framework/logging/advice/LogAdvice.java | 51 +++++++++++-------- .../framework/logging/service/LogContext.java | 3 +- .../framework/logging/service/LogManager.java | 2 +- .../framework/domain/DepartmentQo.java | 2 +- .../framework/domain/PermissionQo.java | 2 +- .../framework/controller/TreeController.java | 7 +-- .../reactive/ReactiveTreeController.java | 22 +++++++- 12 files changed, 94 insertions(+), 33 deletions(-) create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/domain/tree/RootTreeNode.java rename flyfish-data/src/main/java/com/flyfish/framework/domain/{base => tree}/TreeDomain.java (84%) rename flyfish-data/src/main/java/com/flyfish/framework/domain/{base => tree}/TreeQo.java (86%) diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Department.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Department.java index 67bc247..7f258c1 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Department.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Department.java @@ -1,6 +1,6 @@ package com.flyfish.framework.domain.po; -import com.flyfish.framework.domain.base.TreeDomain; +import com.flyfish.framework.domain.tree.TreeDomain; import lombok.*; import org.springframework.data.mongodb.core.mapping.Document; diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Permission.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Permission.java index 3036a0a..5e66786 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Permission.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Permission.java @@ -1,6 +1,6 @@ package com.flyfish.framework.domain.po; -import com.flyfish.framework.domain.base.TreeDomain; +import com.flyfish.framework.domain.tree.TreeDomain; import com.flyfish.framework.enums.NamedEnum; import lombok.AllArgsConstructor; import lombok.Data; diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/tree/RootTreeNode.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/tree/RootTreeNode.java new file mode 100644 index 0000000..8cd6dec --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/tree/RootTreeNode.java @@ -0,0 +1,27 @@ +package com.flyfish.framework.domain.tree; + +import org.springframework.data.util.CastUtils; + +import java.util.Collections; + +/** + * 根节点表示 + * + * @param + */ +public class RootTreeNode> extends TreeDomain { + + private static final RootTreeNode INSTANCE = new RootTreeNode<>(); + + static { + INSTANCE.setDepth(0); + INSTANCE.setName("根节点"); + INSTANCE.setParentIds(Collections.emptyList()); + INSTANCE.setId("0"); + INSTANCE.setCode("0"); + } + + public static > T instance() { + return CastUtils.cast(INSTANCE); + } +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/TreeDomain.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/tree/TreeDomain.java similarity index 84% rename from flyfish-data/src/main/java/com/flyfish/framework/domain/base/TreeDomain.java rename to flyfish-data/src/main/java/com/flyfish/framework/domain/tree/TreeDomain.java index d9ed037..8cb7af2 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/TreeDomain.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/tree/TreeDomain.java @@ -1,5 +1,6 @@ -package com.flyfish.framework.domain.base; +package com.flyfish.framework.domain.tree; +import com.flyfish.framework.domain.base.AuditDomain; import lombok.Getter; import lombok.Setter; import org.springframework.data.annotation.Transient; diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/TreeQo.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/tree/TreeQo.java similarity index 86% rename from flyfish-data/src/main/java/com/flyfish/framework/domain/base/TreeQo.java rename to flyfish-data/src/main/java/com/flyfish/framework/domain/tree/TreeQo.java index cfae550..aef807d 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/TreeQo.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/tree/TreeQo.java @@ -1,6 +1,8 @@ -package com.flyfish.framework.domain.base; +package com.flyfish.framework.domain.tree; import com.flyfish.framework.builder.CriteriaBuilder; +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.domain.base.NameLikeQo; import lombok.Getter; import lombok.Setter; import org.apache.commons.lang3.BooleanUtils; diff --git a/flyfish-logging/src/main/java/com/flyfish/framework/logging/advice/LogAdvice.java b/flyfish-logging/src/main/java/com/flyfish/framework/logging/advice/LogAdvice.java index d55d127..36a519a 100644 --- a/flyfish-logging/src/main/java/com/flyfish/framework/logging/advice/LogAdvice.java +++ b/flyfish-logging/src/main/java/com/flyfish/framework/logging/advice/LogAdvice.java @@ -45,43 +45,54 @@ public class LogAdvice { LogContext context = LogContext.of(joinPoint); // 结果信息 Object result = null; + // 是否是publisher + boolean reactive = false; try { - return result = joinPoint.proceed(joinPoint.getArgs()); + // 执行方法 + result = joinPoint.proceed(joinPoint.getArgs()); + // 判断是否异步 + reactive = result instanceof Publisher; + // 异步需特殊处理,否则直接返回 + return reactive ? handleResult(result, context) : result; } catch (Throwable throwable) { context.setError(throwable); throw throwable; } finally { - if (context.isValid()) { - handleResult(result, context); - logManager.tryLog(context); + if (!reactive && context.isValid()) { + context.setResult(result); + logManager.tryLog(context.end()); } } } + /** * 处理结果,支持webflux * * @param result 结果 * @param context 上下文 */ - private void handleResult(Object result, LogContext context) { - if (null != result) { - // 判断结果是否是publisher - if (result instanceof Publisher) { - if (result instanceof Mono) { - ((Mono) result).subscribe(context::setResult, context::setError, context::end); - } else if (result instanceof Flux) { - ((Flux) result).collectList().subscribe(context::setResult, context::setError, context::end); - } else { - ((Publisher) result).subscribe(new LogSubscriber(context)); - } - } else { - context.setResult(result); - context.end(); + private Object handleResult(Object result, LogContext context) { + Runnable runnable = () -> { + if (context.isValid()) { + logManager.tryLog(context.end()); } + }; + if (result instanceof Mono) { + return ((Mono) result) + .doOnSuccess(context::setResult) + .doOnError(context::setError) + .doOnTerminate(runnable); + } else if (result instanceof Flux) { + return ((Flux) result) + .collectList() + .doOnSuccess(context::setResult) + .doOnError(context::setError) + .doOnTerminate(runnable) + .flatMapIterable(list -> list); } else { - // 为空,直接标记结束 - context.end(); + // 未知,不监听 + return result; } } diff --git a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogContext.java b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogContext.java index f673c60..2c01c07 100644 --- a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogContext.java +++ b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogContext.java @@ -123,8 +123,9 @@ public class LogContext { return null == error; } - public void end() { + public LogContext end() { this.user = UserContext.sharedContext().map(UserContext::currentUser).map(Domain::getName).orElse("未知"); this.endTime = System.currentTimeMillis(); + return this; } } diff --git a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogManager.java b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogManager.java index 9073859..8fb97cf 100644 --- a/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogManager.java +++ b/flyfish-logging/src/main/java/com/flyfish/framework/logging/service/LogManager.java @@ -57,7 +57,7 @@ public class LogManager implements DisposableBean { // 先不拼接 log.setUri(null); // 写入日志 - logService.create(log); + logService.create(log).subscribe(); }); } diff --git a/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java b/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java index 7988262..4498165 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/domain/DepartmentQo.java @@ -1,6 +1,6 @@ package com.flyfish.framework.domain; -import com.flyfish.framework.domain.base.TreeQo; +import com.flyfish.framework.domain.tree.TreeQo; import com.flyfish.framework.domain.po.Department; import lombok.Getter; import lombok.Setter; diff --git a/flyfish-user/src/main/java/com/flyfish/framework/domain/PermissionQo.java b/flyfish-user/src/main/java/com/flyfish/framework/domain/PermissionQo.java index 24f91e4..eb22574 100644 --- a/flyfish-user/src/main/java/com/flyfish/framework/domain/PermissionQo.java +++ b/flyfish-user/src/main/java/com/flyfish/framework/domain/PermissionQo.java @@ -2,7 +2,7 @@ package com.flyfish.framework.domain; import com.flyfish.framework.builder.CriteriaBuilder; -import com.flyfish.framework.domain.base.TreeQo; +import com.flyfish.framework.domain.tree.TreeQo; import com.flyfish.framework.domain.po.Permission; import lombok.Getter; import lombok.Setter; diff --git a/flyfish-web/src/main/java/com/flyfish/framework/controller/TreeController.java b/flyfish-web/src/main/java/com/flyfish/framework/controller/TreeController.java index 9595980..553cfb9 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/controller/TreeController.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/controller/TreeController.java @@ -1,8 +1,8 @@ package com.flyfish.framework.controller; import com.flyfish.framework.bean.Result; -import com.flyfish.framework.domain.base.Qo; -import com.flyfish.framework.domain.base.TreeDomain; +import com.flyfish.framework.domain.tree.TreeDomain; +import com.flyfish.framework.domain.tree.TreeQo; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.GetMapping; @@ -18,7 +18,7 @@ import java.util.stream.Collectors; * @param * @param */ -public abstract class TreeController, Q extends Qo> extends BaseController { +public abstract class TreeController, Q extends TreeQo> extends BaseController { /** * 获取权限树 @@ -27,6 +27,7 @@ public abstract class TreeController, Q extends Qo> e */ @GetMapping("tree") public Result> getTree(Q qo) { + qo.setRecursive(true); // 第一步,查询全部,并根据条件筛选 List filtered = service.getList(qo); // 第二步,根据父id组成map diff --git a/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java b/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java index 8ea28dc..3002837 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/controller/reactive/ReactiveTreeController.java @@ -1,11 +1,13 @@ package com.flyfish.framework.controller.reactive; import com.flyfish.framework.bean.Result; -import com.flyfish.framework.domain.base.TreeDomain; -import com.flyfish.framework.domain.base.TreeQo; +import com.flyfish.framework.domain.tree.RootTreeNode; +import com.flyfish.framework.domain.tree.TreeDomain; +import com.flyfish.framework.domain.tree.TreeQo; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -22,6 +24,22 @@ import java.util.stream.Collectors; */ public abstract class ReactiveTreeController, Q extends TreeQo> extends ReactiveBaseController { + /** + * 重写树查询,允许查询根节点 + * + * @param id 主键 + * @return 结果 + */ + @GetMapping("{id}") + @Override + public Mono> get(@PathVariable String id) { + if (TreeDomain.ROOT.equals(id)) { + T root = RootTreeNode.instance(); + return Mono.just(Result.accept(root)); + } + return reactiveService.getById(id).map(Result::accept).defaultIfEmpty(Result.notFound()); + } + /** * 获取权限树 *