Explorar o código

优化维度获取

zhou-hao %!s(int64=5) %!d(string=hai) anos
pai
achega
881a58571b

+ 21 - 4
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveCrudService.java

@@ -32,6 +32,18 @@ public interface ReactiveCrudService<E, K> {
         return getRepository().createDelete();
     }
 
+    @Transactional(readOnly = true)
+    default Mono<E> findById(K publisher) {
+        return getRepository()
+                .findById(publisher);
+    }
+
+    @Transactional(readOnly = true)
+    default Flux<E> findById(Collection<K> publisher) {
+        return getRepository()
+                .findById(publisher);
+    }
+
     @Transactional(readOnly = true)
     default Mono<E> findById(Mono<K> publisher) {
         return getRepository()
@@ -77,10 +89,15 @@ public interface ReactiveCrudService<E, K> {
     @Transactional(readOnly = true)
     default Flux<E> query(Mono<? extends QueryParam> queryParamMono) {
         return queryParamMono
-                .flatMapMany(param -> getRepository()
-                        .createQuery()
-                        .setParam(param)
-                        .fetch());
+                .flatMapMany(this::query);
+    }
+
+    @Transactional(readOnly = true)
+    default Flux<E> query(QueryParam param) {
+        return getRepository()
+                .createQuery()
+                .setParam(param)
+                .fetch();
     }
 
     @Transactional(readOnly = true)

+ 16 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveTreeSortEntityService.java

@@ -23,6 +23,22 @@ public interface ReactiveTreeSortEntityService<E extends TreeSortSupportEntity<K
                 .map(list -> TreeSupportEntity.list2tree(list, this::setChildren, this::isRootNode));
     }
 
+    default Flux<E> findIncludeChildren(Collection<K> idList) {
+        return findById(idList)
+                .flatMap(e -> createQuery()
+                        .where()
+                        .like$("path", e.getPath())
+                        .fetch());
+    }
+
+    default Flux<E> findIncludeChildren(QueryParam queryParam) {
+        return query(queryParam)
+                .flatMap(e -> createQuery()
+                        .where()
+                        .like$("path", e.getPath())
+                        .fetch());
+    }
+
     @Override
     default Mono<Integer> insert(Publisher<E> entityPublisher) {
         return insertBatch(Flux.from(entityPublisher).collectList());

+ 4 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/event/ClearUserAuthorizationCacheEvent.java

@@ -28,6 +28,10 @@ public class ClearUserAuthorizationCacheEvent {
         return event;
     }
 
+    public static ClearUserAuthorizationCacheEvent all() {
+        return ClearUserAuthorizationCacheEvent.of((String[]) null);
+    }
+
     public static ClearUserAuthorizationCacheEvent of(String... userId) {
 
         return of(userId == null ? null : Arrays.asList(userId));

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

@@ -1,6 +1,9 @@
 package org.hswebframework.web.system.authorization.defaults.service;
 
+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;
@@ -11,8 +14,10 @@ import org.hswebframework.web.system.authorization.api.entity.AuthorizationSetti
 import org.hswebframework.web.system.authorization.api.entity.DimensionEntity;
 import org.hswebframework.web.system.authorization.api.entity.DimensionTypeEntity;
 import org.hswebframework.web.system.authorization.api.entity.DimensionUserEntity;
+import org.hswebframework.web.system.authorization.api.event.ClearUserAuthorizationCacheEvent;
 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;
@@ -36,6 +41,9 @@ public class DefaultDimensionService
     @Autowired
     private ReactiveRepository<AuthorizationSettingEntity, String> settingRepository;
 
+    @Autowired
+    private ApplicationEventPublisher eventPublisher;
+
     @Override
     public IDGenerator<String> getIDGenerator() {
         return IDGenerator.MD5;
@@ -65,13 +73,12 @@ public class DefaultDimensionService
                                 .collectList()
                                 .flatMapMany(list -> {
                                     //查询所有的维度
-                                    return this.findById(Flux.fromIterable(list.stream()
+                                    return this.findIncludeChildren(list.stream()
                                             .map(DimensionUserEntity::getDimensionId)
-                                            .collect(Collectors.toSet())))
+                                            .collect(Collectors.toSet()))
                                             .map(dimension ->
                                                     DynamicDimension.of(dimension, typeGrouping.get(dimension.getTypeId()))
-                                            )
-                                            ;
+                                            );
 
                                 })
                 );
@@ -88,6 +95,30 @@ public class DefaultDimensionService
                 .map(DimensionUserEntity::getUserId);
     }
 
+    @Override
+    public Mono<SaveResult> save(Publisher<DimensionEntity> entityPublisher) {
+        return super.save(entityPublisher)
+                .doOnSuccess((r) -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.all()));
+    }
+
+    @Override
+    public Mono<Integer> updateById(String id, Mono<DimensionEntity> entityPublisher) {
+        return super.updateById(id, entityPublisher)
+                .doOnSuccess((r) -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.all()));
+    }
+
+    @Override
+    public ReactiveUpdate<DimensionEntity> createUpdate() {
+        return super.createUpdate()
+                .onExecute((update, result) -> result.doOnSuccess((r) -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.all())));
+    }
+
+    @Override
+    public ReactiveDelete createDelete() {
+        return super.createDelete()
+                .onExecute((delete, result) -> result.doOnSuccess((r) -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.all())));
+    }
+
     @Override
     public Mono<Integer> deleteById(Publisher<String> idPublisher) {
         return Flux.from(idPublisher)
@@ -105,7 +136,9 @@ public class DefaultDimensionService
                                                 .where(AuthorizationSettingEntity::getDimensionType, grouping.key())
                                                 .in(AuthorizationSettingEntity::getDimensionTarget, dimensionId).execute()))
                                 .collect(Collectors.summarizingInt(Integer::intValue))
-                        ).thenReturn(list.size()));
+                        )
+                        .doOnSuccess((r) -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.all()))
+                        .thenReturn(list.size()));
     }
 
 }