Ver código fonte

优化树结构

zhou-hao 5 anos atrás
pai
commit
9838e2b7d6

+ 29 - 8
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java

@@ -2,7 +2,7 @@ package org.hswebframework.web.crud.service;
 
 import org.hswebframework.ezorm.core.param.QueryParam;
 import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult;
-import org.hswebframework.web.api.crud.entity.QueryParamEntity;
+import org.hswebframework.utils.RandomUtil;
 import org.hswebframework.web.api.crud.entity.TreeSortSupportEntity;
 import org.hswebframework.web.api.crud.entity.TreeSupportEntity;
 import org.hswebframework.web.id.IDGenerator;
@@ -18,12 +18,22 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
         extends ReactiveCrudService<E, K> {
 
     default Mono<List<E>> queryResultToTree(Mono<? extends QueryParam> paramEntity) {
+        return paramEntity.flatMap(this::queryResultToTree);
+    }
+
+    default Mono<List<E>> queryResultToTree(QueryParam paramEntity) {
         return query(paramEntity)
                 .collectList()
                 .map(list -> TreeSupportEntity.list2tree(list, this::setChildren, this::isRootNode));
     }
 
-    default Flux<E> findIncludeChildren(Collection<K> idList) {
+    default Mono<List<E>> queryIncludeChildrenTree(QueryParam paramEntity) {
+        return queryIncludeChildren(paramEntity)
+                .collectList()
+                .map(list -> TreeSupportEntity.list2tree(list, this::setChildren, this::isRootNode));
+    }
+
+    default Flux<E> queryIncludeChildren(Collection<K> idList) {
         return findById(idList)
                 .flatMap(e -> createQuery()
                         .where()
@@ -31,7 +41,7 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
                         .fetch());
     }
 
-    default Flux<E> findIncludeChildren(QueryParam queryParam) {
+    default Flux<E> queryIncludeChildren(QueryParam queryParam) {
         return query(queryParam)
                 .flatMap(e -> createQuery()
                         .where()
@@ -50,24 +60,35 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
                 .insertBatch(Flux.from(entityPublisher)
                         .flatMap(Flux::fromIterable)
                         .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator())))
+                        .flatMap(this::applyTreeProperty)
                         .collectList());
     }
 
+    default Mono<E> applyTreeProperty(E ele) {
+        if (StringUtils.hasText(ele.getPath()) ||
+                StringUtils.isEmpty(ele.getParentId())) {
+            return Mono.just(ele);
+        }
+        return findById(ele.getParentId())
+                .doOnNext(parent -> ele.setPath(parent.getPath() + "-" + RandomUtil.randomChar(4)))
+                .thenReturn(ele);
+    }
+
     @Override
     default Mono<SaveResult> save(Publisher<E> entityPublisher) {
         return this.getRepository()
                 .save(Flux.from(entityPublisher)
                         //把树结构平铺
-                        .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator()))));
+                        .flatMap(e -> Flux.fromIterable(TreeSupportEntity.expandTree2List(e, getIDGenerator())))
+                        .flatMap(this::applyTreeProperty)
+                );
     }
 
     @Override
     default Mono<Integer> updateById(K id, Mono<E> entityPublisher) {
         return save(entityPublisher
-                .map(e -> {
-                    e.setId(id);
-                    return e;
-                })).map(SaveResult::getTotal);
+                .doOnNext(e -> e.setId(id)))
+                .map(SaveResult::getTotal);
     }
 
     @Override

+ 37 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/web/reactive/ReactiveTreeServiceQueryController.java

@@ -0,0 +1,37 @@
+package org.hswebframework.web.crud.web.reactive;
+
+import org.hswebframework.web.api.crud.entity.QueryParamEntity;
+import org.hswebframework.web.api.crud.entity.TreeSortSupportEntity;
+import org.hswebframework.web.authorization.annotation.Authorize;
+import org.hswebframework.web.authorization.annotation.QueryAction;
+import org.hswebframework.web.crud.service.ReactiveTreeSortEntityService;
+import org.springframework.web.bind.annotation.GetMapping;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+public interface ReactiveTreeServiceQueryController<E extends TreeSortSupportEntity<K>, K> {
+
+    @Authorize(ignore = true)
+    ReactiveTreeSortEntityService<E, K> getService();
+
+    @GetMapping("/_query/tree")
+    @QueryAction
+    default Mono<List<E>> findAllTree(QueryParamEntity paramEntity) {
+        return getService().queryResultToTree(paramEntity);
+    }
+
+    @GetMapping("/_query/_children")
+    @QueryAction
+    default Flux<E> findAllChildren(QueryParamEntity paramEntity) {
+        return getService().queryIncludeChildren(paramEntity);
+    }
+
+    @GetMapping("/_query/_children/tree")
+    @QueryAction
+    default Mono<List<E>> findAllChildrenTree(QueryParamEntity paramEntity) {
+        return getService().queryIncludeChildrenTree(paramEntity);
+    }
+
+}

+ 1 - 4
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionService.java

@@ -4,7 +4,6 @@ import org.hswebframework.ezorm.rdb.mapping.ReactiveDelete;
 import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
 import org.hswebframework.ezorm.rdb.mapping.ReactiveUpdate;
 import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult;
-import org.hswebframework.web.authorization.Dimension;
 import org.hswebframework.web.authorization.DimensionProvider;
 import org.hswebframework.web.authorization.DimensionType;
 import org.hswebframework.web.crud.service.GenericReactiveCrudService;
@@ -18,12 +17,10 @@ import org.hswebframework.web.system.authorization.api.event.ClearUserAuthorizat
 import org.reactivestreams.Publisher;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.util.StringUtils;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
 import java.util.List;
-import java.util.Set;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -73,7 +70,7 @@ public class DefaultDimensionService
                                 .collectList()
                                 .flatMapMany(list -> {
                                     //查询所有的维度
-                                    return this.findIncludeChildren(list.stream()
+                                    return this.queryIncludeChildren(list.stream()
                                             .map(DimensionUserEntity::getDimensionId)
                                             .collect(Collectors.toSet()))
                                             .map(dimension ->

+ 3 - 14
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/webflux/WebFluxDimensionController.java

@@ -1,37 +1,26 @@
 package org.hswebframework.web.system.authorization.defaults.webflux;
 
-import org.hswebframework.web.api.crud.entity.QueryParamEntity;
-import org.hswebframework.web.authorization.DimensionProvider;
-import org.hswebframework.web.authorization.DimensionType;
 import org.hswebframework.web.authorization.annotation.Authorize;
-import org.hswebframework.web.authorization.annotation.QueryAction;
 import org.hswebframework.web.authorization.annotation.Resource;
 import org.hswebframework.web.crud.web.reactive.ReactiveServiceCrudController;
+import org.hswebframework.web.crud.web.reactive.ReactiveTreeServiceQueryController;
 import org.hswebframework.web.system.authorization.api.entity.DimensionEntity;
 import org.hswebframework.web.system.authorization.defaults.service.DefaultDimensionService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
-import reactor.core.publisher.Mono;
-
-import java.util.List;
 
 @RestController
 @RequestMapping("/dimension")
 @Authorize
 @Resource(id = "dimension", name = "权限维度管理", group = "system")
-public class WebFluxDimensionController implements ReactiveServiceCrudController<DimensionEntity, String> {
+public class WebFluxDimensionController implements ReactiveServiceCrudController<DimensionEntity, String>
+        , ReactiveTreeServiceQueryController<DimensionEntity, String> {
 
 
     @Autowired
     private DefaultDimensionService defaultDimensionService;
 
-    @GetMapping("/_query/tree")
-    @QueryAction
-    public Mono<List<DimensionEntity>> findAllTree(QueryParamEntity paramEntity) {
-        return defaultDimensionService.queryResultToTree(Mono.just(paramEntity));
-    }
 
     @Override
     public DefaultDimensionService getService() {