zhou-hao 5 年之前
父节点
当前提交
0ea5e0a82b
共有 63 个文件被更改,包括 565 次插入181 次删除
  1. 19 7
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java
  2. 10 0
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Dimension.java
  3. 7 0
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionType.java
  4. 3 0
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/User.java
  5. 3 2
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultAuthorizationAutoConfiguration.java
  6. 7 4
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenReactiveAuthenticationSupplier.java
  7. 13 3
      hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/AuthenticationTests.java
  8. 34 0
      hsweb-commons/hsweb-commons-api/pom.xml
  9. 1 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/Entity.java
  10. 1 2
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/EntityFactory.java
  11. 2 2
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/GenericEntity.java
  12. 1 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/GenericTreeSortSupportEntity.java
  13. 1 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/annotation/ImplementFor.java
  14. 3 2
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/QueryParamEntity.java
  15. 4 5
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/RecordCreationEntity.java
  16. 3 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/RecordModifierEntity.java
  17. 1 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/SortSupportEntity.java
  18. 2 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/TermExpressionParser.java
  19. 1 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/TreeSortSupportEntity.java
  20. 1 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/TreeSupportEntity.java
  21. 6 0
      hsweb-commons/hsweb-commons-crud/pom.xml
  22. 1 0
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/annotation/Reactive.java
  23. 18 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/AutoDDLProcessor.java
  24. 18 19
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyOrmConfiguration.java
  25. 32 16
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormRepositoryRegistrar.java
  26. 20 0
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EntityInfo.java
  27. 1 0
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/MapperEntityFactory.java
  28. 23 0
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/MD5Generator.java
  29. 24 0
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/SnowFlakeStringIdGenerator.java
  30. 1 1
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericReactiveCrudService.java
  31. 1 0
      hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveCrudService.java
  32. 4 2
      hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/CrudTests.java
  33. 1 1
      hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/TestApplication.java
  34. 7 2
      hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/entity/TestEntity.java
  35. 2 0
      hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/service/TestEntityService.java
  36. 1 0
      hsweb-commons/pom.xml
  37. 1 7
      hsweb-starter/src/main/java/org/hswebframework/web/starter/HswebAutoConfiguration.java
  38. 1 1
      hsweb-starter/src/main/java/org/hswebframework/web/starter/jackson/CustomTypeFactory.java
  39. 30 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/pom.xml
  40. 0 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/PasswordEncoder.java
  41. 0 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/PermissionDimension.java
  42. 0 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/PermissionDimensionProvider.java
  43. 24 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/User.java
  44. 0 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/UserPermissionDimensionProvider.java
  45. 4 7
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/enums/UserState.java
  46. 27 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/reactive/ReactiveUserService.java
  47. 22 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/request/SaveUserRequest.java
  48. 28 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/pom.xml
  49. 2 2
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/ActionEntity.java
  50. 2 2
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/AuthorizationSettingEntity.java
  51. 1 1
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/DataAccessEntity.java
  52. 40 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionEntity.java
  53. 58 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionUserEntity.java
  54. 2 2
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/OptionalField.java
  55. 2 2
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/ParentPermission.java
  56. 2 2
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/PermissionEntity.java
  57. 4 6
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/UserEntity.java
  58. 15 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/pom.xml
  59. 15 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-web/pom.xml
  60. 8 7
      hsweb-system/hsweb-system-authorization/pom.xml
  61. 0 19
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/api/UserService.java
  62. 0 39
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/DimensionEntity.java
  63. 0 7
      hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/service/DefaultReactiveUserService.java

+ 19 - 7
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Authentication.java

@@ -40,15 +40,14 @@ public interface Authentication extends Serializable {
     /**
      * 获取当前登录的用户权限信息
      * <pre>
-     *
-     *   Authentication auth= Authentication.current().get();
-     *   //如果权限信息不存在将抛出{@link NoSuchElementException}建议使用下面的方式获取
-     *   Authentication auth=Authentication.current().orElse(null);
-     *   //或者
-     *   Authentication auth=Authentication.current().orElseThrow(UnAuthorizedException::new);
+     *     public Mono&lt;User&gt; getUser(){
+     *         return Authentication.currentReactive()
+     *                 .switchIfEmpty(Mono.error(new UnAuthorizedException()))
+     *                 .flatMap(autz->findUserByUserId(autz.getUser().getId()));
+     *     }
      * </pre>
      *
-     * @return 返回Optional对象进行操作
+     * @return 当前用户权限信息
      * @see ReactiveAuthenticationHolder
      */
     static Mono<Authentication> currentReactive() {
@@ -57,6 +56,14 @@ public interface Authentication extends Serializable {
 
     /**
      * 非响应式环境适用
+     * <pre>
+     *
+     *   Authentication auth= Authentication.current().get();
+     *   //如果权限信息不存在将抛出{@link NoSuchElementException}建议使用下面的方式获取
+     *   Authentication auth=Authentication.current().orElse(null);
+     *   //或者
+     *   Authentication auth=Authentication.current().orElseThrow(UnAuthorizedException::new);
+     * </pre>
      *
      * @return 当前用户权限信息
      * @see Optional
@@ -75,6 +82,11 @@ public interface Authentication extends Serializable {
      */
     List<Role> getRoles();
 
+//    /**
+//     * @return 用户所有维度
+//     */
+//    List<Dimension> getDimensions();
+
     /**
      * @return 用户持有的权限集合
      */

+ 10 - 0
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Dimension.java

@@ -0,0 +1,10 @@
+package org.hswebframework.web.authorization;
+
+public interface Dimension {
+    String getId();
+
+    String getName();
+
+    DimensionType getType();
+
+}

+ 7 - 0
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/DimensionType.java

@@ -0,0 +1,7 @@
+package org.hswebframework.web.authorization;
+
+public interface DimensionType {
+    String getId();
+
+    String getName();
+}

+ 3 - 0
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/User.java

@@ -41,5 +41,8 @@ public interface User extends Serializable {
      */
     String getName();
 
+    /**
+     * @return 用户类型
+     */
     String getType();
 }

+ 3 - 2
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/DefaultAuthorizationAutoConfiguration.java

@@ -41,8 +41,9 @@ public class DefaultAuthorizationAutoConfiguration {
 
     @Bean
     @ConditionalOnBean(AuthenticationManager.class)
-    public UserTokenReactiveAuthenticationSupplier userTokenAuthenticationSupplier(AuthenticationManager authenticationManager) {
-        UserTokenReactiveAuthenticationSupplier supplier = new UserTokenReactiveAuthenticationSupplier(authenticationManager);
+    public UserTokenReactiveAuthenticationSupplier userTokenAuthenticationSupplier(UserTokenManager userTokenManager,
+                                                                                   AuthenticationManager authenticationManager) {
+        UserTokenReactiveAuthenticationSupplier supplier = new UserTokenReactiveAuthenticationSupplier(userTokenManager, authenticationManager);
         ReactiveAuthenticationHolder.addSupplier(supplier);
         return supplier;
     }

+ 7 - 4
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/token/UserTokenReactiveAuthenticationSupplier.java

@@ -19,10 +19,13 @@ public class UserTokenReactiveAuthenticationSupplier implements ReactiveAuthenti
 
     private AuthenticationManager defaultAuthenticationManager;
 
+    private UserTokenManager userTokenManager;
+
     private Map<String, ThirdPartAuthenticationManager> thirdPartAuthenticationManager = new HashMap<>();
 
-    public UserTokenReactiveAuthenticationSupplier(AuthenticationManager defaultAuthenticationManager) {
+    public UserTokenReactiveAuthenticationSupplier(UserTokenManager userTokenManager, AuthenticationManager defaultAuthenticationManager) {
         this.defaultAuthenticationManager = defaultAuthenticationManager;
+        this.userTokenManager=userTokenManager;
     }
 
     @Autowired(required = false)
@@ -64,9 +67,9 @@ public class UserTokenReactiveAuthenticationSupplier implements ReactiveAuthenti
     public Mono<Authentication> get() {
         return ContextUtils.reactiveContext()
                 .flatMap(context ->
-                        context.get(ContextKey.of(UserToken.class))
-                                .filter(UserToken::validate)
-                                .map(token -> get(thirdPartAuthenticationManager.get(token.getType()), token.getUserId()))
+                        context.get(ContextKey.of(ParsedToken.class))
+                                .map(t -> userTokenManager.getByToken(t.getToken()))
+                                .map(tokenMono -> tokenMono.flatMap(token -> get(thirdPartAuthenticationManager.get(token.getType()), token.getUserId())))
                                 .orElseGet(Mono::empty));
 
     }

+ 13 - 3
hsweb-authorization/hsweb-authorization-api/src/test/java/org/hswebframework/web/authorization/AuthenticationTests.java

@@ -111,18 +111,28 @@ public class AuthenticationTests {
             }
 
         };
-        ReactiveAuthenticationHolder.addSupplier(new UserTokenReactiveAuthenticationSupplier(authenticationManager));
-
         //绑定用户token
         UserTokenManager userTokenManager = new DefaultUserTokenManager();
         UserToken token = userTokenManager.signIn("test", "token-test", "admin", -1).block();
 
+        ReactiveAuthenticationHolder.addSupplier(new UserTokenReactiveAuthenticationSupplier(userTokenManager, authenticationManager));
+        ParsedToken parsedToken=new ParsedToken() {
+            @Override
+            public String getToken() {
+                return token.getToken();
+            }
+
+            @Override
+            public String getType() {
+                return  token.getType();
+            }
+        };
         //获取当前登录用户
         Authentication
                 .currentReactive()
                 .map(Authentication::getUser)
                 .map(User::getId)
-                .subscriberContext(acceptContext(ctx->ctx.put(ContextKey.of(UserToken.class),token)))
+                .subscriberContext(acceptContext(ctx -> ctx.put(ContextKey.of(ParsedToken.class), parsedToken)))
                 .as(StepVerifier::create)
                 .expectNext("admin")
                 .verifyComplete();

+ 34 - 0
hsweb-commons/hsweb-commons-api/pom.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-commons</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>4.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-commons-api</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.hswebframework</groupId>
+            <artifactId>hsweb-easy-orm-rdb</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.javax.persistence</groupId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/Entity.java

@@ -16,7 +16,7 @@
  *
  */
 
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 
 import java.io.Serializable;

+ 1 - 2
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/EntityFactory.java

@@ -16,14 +16,13 @@
  *  
  */
 
-package org.hswebframework.web.crud.entity.factory;
+package org.hswebframework.web.api.crud.entity;
 
 
 /**
  * 实体工厂接口,系统各个地方使用此接口来创建实体,在实际编码中也应该使用此接口来创建实体,而不是使用new方式来创建
  *
  * @author zhouhao
- * @see MapperEntityFactory
  * @since 3.0
  */
 public interface EntityFactory {

+ 2 - 2
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/GenericEntity.java

@@ -16,14 +16,14 @@
  *
  */
 
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 import lombok.Getter;
 import lombok.Setter;
 import org.hswebframework.web.bean.ToString;
-import org.springframework.data.annotation.Id;
 
 import javax.persistence.Column;
+import javax.persistence.Id;
 
 
 /**

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/GenericTreeSortSupportEntity.java

@@ -16,7 +16,7 @@
  *
  */
 
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 
 import lombok.Getter;

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/annotation/ImplementFor.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.crud.annotation;
+package org.hswebframework.web.api.crud.entity;
 
 import java.lang.annotation.*;
 

+ 3 - 2
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/QueryParamEntity.java

@@ -1,14 +1,15 @@
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 import lombok.Getter;
+import org.apache.commons.collections.CollectionUtils;
 import org.hswebframework.ezorm.core.NestConditional;
 import org.hswebframework.ezorm.core.dsl.Query;
 import org.hswebframework.ezorm.core.param.QueryParam;
 import org.hswebframework.ezorm.core.param.Term;
 import org.hswebframework.ezorm.core.param.TermType;
-import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Consumer;

+ 4 - 5
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/RecordCreationEntity.java

@@ -1,4 +1,6 @@
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
+
+import org.hswebframework.web.api.crud.entity.Entity;
 
 /**
  * 记录创建信息的实体类,包括创建人和创建时间。
@@ -9,9 +11,6 @@ package org.hswebframework.web.crud.entity;
  */
 public interface RecordCreationEntity extends Entity {
 
-    String creatorId  = "creatorId";
-    String createTime = "createTime";
-
     String getCreatorId();
 
     void setCreatorId(String creatorId);
@@ -25,6 +24,6 @@ public interface RecordCreationEntity extends Entity {
     }
 
     default String getCreatorIdProperty() {
-        return creatorId;
+        return "creatorId";
     }
 }

+ 3 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/RecordModifierEntity.java

@@ -1,4 +1,6 @@
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
+
+import org.hswebframework.web.api.crud.entity.Entity;
 
 /**
  * 记录修改信息的实体类,包括修改人和修改时间。

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/SortSupportEntity.java

@@ -16,7 +16,7 @@
  *
  */
 
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 public interface SortSupportEntity extends Comparable<SortSupportEntity>, Entity {
 

+ 2 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/TermExpressionParser.java

@@ -1,9 +1,10 @@
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 import org.hswebframework.ezorm.core.NestConditional;
 import org.hswebframework.ezorm.core.dsl.Query;
 import org.hswebframework.ezorm.core.param.Term;
 import org.hswebframework.ezorm.core.param.TermType;
+import org.hswebframework.web.api.crud.entity.QueryParamEntity;
 
 import java.util.Arrays;
 import java.util.List;

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/TreeSortSupportEntity.java

@@ -15,7 +15,7 @@
  *
  */
 
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 /**
  * 支持树形结构,排序的实体类,要使用树形结构,排序功能的实体类直接继承该类

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/TreeSupportEntity.java

@@ -16,7 +16,7 @@
  *
  */
 
-package org.hswebframework.web.crud.entity;
+package org.hswebframework.web.api.crud.entity;
 
 
 import org.hswebframework.utils.RandomUtil;

+ 6 - 0
hsweb-commons/hsweb-commons-crud/pom.xml

@@ -84,6 +84,12 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-commons-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 1 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/annotation/Reactive.java

@@ -10,4 +10,5 @@ import java.lang.annotation.*;
 @Inherited
 @Documented
 public @interface Reactive {
+    boolean enable() default true;
 }

+ 18 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/AutoDDLProcessor.java

@@ -4,18 +4,23 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.hswebframework.ezorm.rdb.operator.DatabaseOperator;
+import org.hswebframework.web.api.crud.entity.EntityFactory;
+import org.hswebframework.web.crud.entity.factory.MapperEntityFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import reactor.core.publisher.Flux;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 @Getter
 @Setter
 @Slf4j
 public class AutoDDLProcessor {
 
-    private List<Class> entities = new ArrayList<>();
+    private Set<EntityInfo> entities = new HashSet<>();
 
     @Autowired
     private DatabaseOperator operator;
@@ -26,10 +31,22 @@ public class AutoDDLProcessor {
     @Autowired
     private EntityTableMetadataResolver resolver;
 
+    @Autowired
+    private EntityFactory entityFactory;
+
     private boolean reactive;
 
     public void init() {
+        if(entityFactory instanceof MapperEntityFactory){
+            MapperEntityFactory factory= ((MapperEntityFactory) entityFactory);
+
+            for (EntityInfo entity : entities) {
+                factory.addMapping(entity.getEntityType(),MapperEntityFactory.defaultMapper(entity.getRealType()));
+            }
+        }
+
         if (properties.isAutoDdl()) {
+            List<Class> entities = this.entities.stream().map(EntityInfo::getRealType).collect(Collectors.toList());
             if(reactive){
                 Flux.fromIterable(entities)
                         .doOnNext(type -> log.info("auto ddl for {}", type))

+ 18 - 19
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyOrmConfiguration.java

@@ -15,9 +15,11 @@ import org.hswebframework.ezorm.rdb.mapping.parser.EntityTableMetadataParser;
 import org.hswebframework.ezorm.rdb.metadata.RDBDatabaseMetadata;
 import org.hswebframework.ezorm.rdb.operator.DatabaseOperator;
 import org.hswebframework.ezorm.rdb.operator.DefaultDatabaseOperator;
+import org.hswebframework.web.crud.generator.MD5Generator;
+import org.hswebframework.web.crud.generator.SnowFlakeStringIdGenerator;
 import org.hswebframework.web.crud.sql.DefaultJdbcExecutor;
 import org.hswebframework.web.crud.annotation.EnableEasyormRepository;
-import org.hswebframework.web.crud.entity.factory.EntityFactory;
+import org.hswebframework.web.api.crud.entity.EntityFactory;
 import org.hswebframework.web.crud.sql.DefaultJdbcReactiveExecutor;
 import org.hswebframework.web.crud.sql.DefaultR2dbcExecutor;
 import org.springframework.beans.BeansException;
@@ -110,37 +112,34 @@ public class EasyOrmConfiguration {
 
     @Bean
     @ConditionalOnMissingBean
-    public EntityTableMetadataParser jpaEntityTableMetadataParser(DatabaseOperator operator) {
+    public EntityTableMetadataParser jpaEntityTableMetadataParser(RDBDatabaseMetadata metadata) {
         JpaEntityTableMetadataParser parser = new JpaEntityTableMetadataParser();
-        parser.setDatabaseMetadata(operator.getMetadata());
+        parser.setDatabaseMetadata(metadata);
 
         return parser;
     }
 
     @Bean
     @ConditionalOnMissingBean
-    public DatabaseOperator databaseOperator() {
-        RDBDatabaseMetadata metadata = properties.createDatabaseMetadata();
+    public RDBDatabaseMetadata databaseMetadata(){
+        return properties.createDatabaseMetadata();
+    }
 
+    @Bean
+    @ConditionalOnMissingBean
+    public DatabaseOperator databaseOperator(RDBDatabaseMetadata metadata, List<Feature> features) {
+        features.forEach(metadata::addFeature);
         return DefaultDatabaseOperator.of(metadata);
     }
 
     @Bean
-    public BeanPostProcessor autoRegisterFeature(DatabaseOperator operator) {
-        return new BeanPostProcessor() {
-            @Override
-            public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-                return bean;
-            }
+    public MD5Generator md5Generator(){
+        return new MD5Generator();
+    }
 
-            @Override
-            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-                if (bean instanceof Feature) {
-                    operator.getMetadata().addFeature(((Feature) bean));
-                }
-                return bean;
-            }
-        };
+    @Bean
+    public SnowFlakeStringIdGenerator snowFlakeStringIdGenerator(){
+        return new SnowFlakeStringIdGenerator();
     }
 
 }

+ 32 - 16
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormRepositoryRegistrar.java

@@ -1,14 +1,14 @@
 package org.hswebframework.web.crud.configuration;
 
-import lombok.SneakyThrows;
+import lombok.*;
 import lombok.extern.slf4j.Slf4j;
 import org.hswebframework.ezorm.rdb.mapping.defaults.DefaultReactiveRepository;
 import org.hswebframework.ezorm.rdb.mapping.defaults.DefaultSyncRepository;
 import org.hswebframework.utils.ClassUtils;
 import org.hswebframework.web.crud.annotation.EnableEasyormRepository;
-import org.hswebframework.web.crud.annotation.ImplementFor;
+import org.hswebframework.web.api.crud.entity.ImplementFor;
 import org.hswebframework.web.crud.annotation.Reactive;
-import org.hswebframework.web.crud.entity.GenericEntity;
+import org.hswebframework.web.api.crud.entity.GenericEntity;
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.beans.factory.support.BeanDefinitionRegistry;
 import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -54,7 +54,7 @@ public class EasyormRepositoryRegistrar implements ImportBeanDefinitionRegistrar
 
         Class<Annotation>[] anno = (Class[]) attr.get("annotation");
 
-        List<Class> allEntities = new ArrayList<>();
+        Set<EntityInfo> entityInfos = new HashSet<>();
 
         for (Resource resource : resourcePatternResolver.getResources(path)) {
             MetadataReader reader = metadataReaderFactory.getMetadataReader(resource);
@@ -64,7 +64,7 @@ public class EasyormRepositoryRegistrar implements ImportBeanDefinitionRegistrar
                     .noneMatch(ann -> AnnotationUtils.findAnnotation(entityType, ann) != null)) {
                 continue;
             }
-            allEntities.add(entityType);
+
             ImplementFor implementFor = AnnotationUtils.findAnnotation(entityType, ImplementFor.class);
             Reactive reactive = AnnotationUtils.findAnnotation(entityType, Reactive.class);
             Class genericType = Optional.ofNullable(implementFor)
@@ -75,6 +75,8 @@ public class EasyormRepositoryRegistrar implements ImportBeanDefinitionRegistrar
                                 .findFirst()
                                 .orElse(entityType);
                     });
+
+
             Class idType = null;
             if (implementFor == null || implementFor.idType() == Void.class) {
                 try {
@@ -91,28 +93,41 @@ public class EasyormRepositoryRegistrar implements ImportBeanDefinitionRegistrar
             } else {
                 idType = implementFor.idType();
             }
-            if(reactive!=null){
-                log.debug("register ReactiveRepository<{},{}>", genericType.getName(), idType.getSimpleName());
 
-                ResolvableType repositoryType = ResolvableType.forClassWithGenerics(DefaultReactiveRepository.class, genericType, idType);
+            EntityInfo entityInfo = new EntityInfo(genericType, entityType, idType, reactive == null || reactive.enable());
+            if (!entityInfos.contains(entityInfo) || implementFor != null) {
+                entityInfos.add(entityInfo);
+            }
+
+        }
+        boolean reactive=false;
+        for (EntityInfo entityInfo : entityInfos) {
+            Class entityType = entityInfo.getEntityType();
+            Class idType = entityInfo.getIdType();
+            Class realType = entityInfo.getRealType();
+            if (entityInfo.isReactive()) {
+                reactive=true;
+                log.debug("register ReactiveRepository<{},{}>", entityType.getName(), idType.getSimpleName());
+
+                ResolvableType repositoryType = ResolvableType.forClassWithGenerics(DefaultReactiveRepository.class, entityType, idType);
 
                 RootBeanDefinition definition = new RootBeanDefinition();
                 definition.setTargetType(repositoryType);
                 definition.setBeanClass(ReactiveRepositoryFactoryBean.class);
                 definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
-                definition.getPropertyValues().add("entityType", entityType);
-                registry.registerBeanDefinition(entityType.getSimpleName().concat("ReactiveRepository"), definition);
-            }else {
-                log.debug("register SyncRepository<{},{}>", genericType.getName(), idType.getSimpleName());
+                definition.getPropertyValues().add("entityType", realType);
+                registry.registerBeanDefinition(realType.getSimpleName().concat("ReactiveRepository"), definition);
+            } else {
+                log.debug("register SyncRepository<{},{}>", entityType.getName(), idType.getSimpleName());
 
-                ResolvableType repositoryType = ResolvableType.forClassWithGenerics(DefaultSyncRepository.class, genericType, idType);
+                ResolvableType repositoryType = ResolvableType.forClassWithGenerics(DefaultSyncRepository.class, entityType, idType);
 
                 RootBeanDefinition definition = new RootBeanDefinition();
                 definition.setTargetType(repositoryType);
                 definition.setBeanClass(SyncRepositoryFactoryBean.class);
                 definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
-                definition.getPropertyValues().add("entityType", entityType);
-                registry.registerBeanDefinition(entityType.getSimpleName().concat("SyncRepository"), definition);
+                definition.getPropertyValues().add("entityType", realType);
+                registry.registerBeanDefinition(realType.getSimpleName().concat("SyncRepository"), definition);
             }
         }
 
@@ -120,7 +135,8 @@ public class EasyormRepositoryRegistrar implements ImportBeanDefinitionRegistrar
         definition.setTargetType(AutoDDLProcessor.class);
         definition.setBeanClass(AutoDDLProcessor.class);
         definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
-        definition.getPropertyValues().add("entities", allEntities);
+        definition.getPropertyValues().add("entities", entityInfos);
+        definition.getPropertyValues().add("reactive", reactive);
         definition.setInitMethodName("init");
         registry.registerBeanDefinition(AutoDDLProcessor.class.getName(), definition);
 

+ 20 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EntityInfo.java

@@ -0,0 +1,20 @@
+package org.hswebframework.web.crud.configuration;
+
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@EqualsAndHashCode(of = "entityType")
+@AllArgsConstructor
+public class EntityInfo {
+    private Class entityType;
+
+    private Class realType;
+
+    private Class idType;
+
+    private boolean reactive;
+}

+ 1 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/entity/factory/MapperEntityFactory.java

@@ -20,6 +20,7 @@ package org.hswebframework.web.crud.entity.factory;
 
 import lombok.SneakyThrows;
 import org.hswebframework.utils.ClassUtils;
+import org.hswebframework.web.api.crud.entity.EntityFactory;
 import org.hswebframework.web.exception.NotFoundException;
 import org.hswebframework.web.bean.BeanFactory;
 import org.hswebframework.web.bean.FastBeanCopier;

+ 23 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/MD5Generator.java

@@ -0,0 +1,23 @@
+package org.hswebframework.web.crud.generator;
+
+import org.hswebframework.ezorm.core.DefaultValue;
+import org.hswebframework.ezorm.core.DefaultValueGenerator;
+import org.hswebframework.ezorm.core.RuntimeDefaultValue;
+import org.hswebframework.web.id.IDGenerator;
+
+public class MD5Generator implements DefaultValueGenerator {
+    @Override
+    public String getSortId() {
+        return "md5";
+    }
+
+    @Override
+    public DefaultValue generate() {
+        return (RuntimeDefaultValue) IDGenerator.MD5::generate;
+    }
+
+    @Override
+    public String getName() {
+        return "MD5";
+    }
+}

+ 24 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/generator/SnowFlakeStringIdGenerator.java

@@ -0,0 +1,24 @@
+package org.hswebframework.web.crud.generator;
+
+import org.hswebframework.ezorm.core.DefaultValue;
+import org.hswebframework.ezorm.core.DefaultValueGenerator;
+import org.hswebframework.ezorm.core.RuntimeDefaultValue;
+import org.hswebframework.web.id.IDGenerator;
+import org.springframework.stereotype.Component;
+
+public class SnowFlakeStringIdGenerator implements DefaultValueGenerator {
+    @Override
+    public String getSortId() {
+        return "snow_flake";
+    }
+
+    @Override
+    public DefaultValue generate() {
+        return (RuntimeDefaultValue) IDGenerator.SNOW_FLAKE_STRING::generate;
+    }
+
+    @Override
+    public String getName() {
+        return "SnowFlake";
+    }
+}

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/GenericReactiveCrudService.java

@@ -3,7 +3,7 @@ package org.hswebframework.web.crud.service;
 import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 
-public class GenericReactiveCrudService<E,K> implements ReactiveCrudService<E,K> {
+public abstract class GenericReactiveCrudService<E, K> implements ReactiveCrudService<E, K> {
 
     @Autowired
     private ReactiveRepository<E, K> repository;

+ 1 - 0
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/service/ReactiveCrudService.java

@@ -7,6 +7,7 @@ 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.crud.entity.PagerResult;
+import org.hswebframework.web.id.IDGenerator;
 import org.reactivestreams.Publisher;
 import org.springframework.transaction.annotation.Transactional;
 import reactor.core.publisher.Flux;

+ 4 - 2
hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/CrudTests.java

@@ -1,8 +1,8 @@
 package org.hswebframework.web.crud;
 
-import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
 import org.hswebframework.web.crud.entity.TestEntity;
 import org.hswebframework.web.crud.service.TestEntityService;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,10 +20,12 @@ public class CrudTests  {
 
     @Test
     public void test(){
-        Mono.just(TestEntity.of("test",100))
+        TestEntity entity = TestEntity.of("test",100);
+        Mono.just(entity)
                 .as(service::insert)
                 .as(StepVerifier::create)
                 .expectNext(1)
                 .verifyComplete();
+        Assert.assertNotNull(entity.getId());
     }
 }

+ 1 - 1
hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/TestApplication.java

@@ -1,6 +1,6 @@
 package org.hswebframework.web.crud;
 
-import org.hswebframework.web.crud.entity.factory.EntityFactory;
+import org.hswebframework.web.api.crud.entity.EntityFactory;
 import org.hswebframework.web.crud.entity.factory.MapperEntityFactory;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;

+ 7 - 2
hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/entity/TestEntity.java

@@ -4,15 +4,15 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
 import lombok.Setter;
-import org.hswebframework.web.crud.annotation.Reactive;
+import org.hswebframework.web.api.crud.entity.GenericEntity;
 
 import javax.persistence.Column;
+import javax.persistence.GeneratedValue;
 import javax.persistence.Table;
 
 @Getter
 @Setter
 @Table(name = "s_test")
-@Reactive
 @AllArgsConstructor(staticName = "of")
 @NoArgsConstructor
 public class TestEntity extends GenericEntity<String> {
@@ -23,4 +23,9 @@ public class TestEntity extends GenericEntity<String> {
     @Column
     private Integer age;
 
+    @Override
+    @GeneratedValue(generator = "md5")
+    public String getId() {
+        return super.getId();
+    }
 }

+ 2 - 0
hsweb-commons/hsweb-commons-crud/src/test/java/org/hswebframework/web/crud/service/TestEntityService.java

@@ -1,8 +1,10 @@
 package org.hswebframework.web.crud.service;
 
 import org.hswebframework.web.crud.entity.TestEntity;
+import org.hswebframework.web.id.IDGenerator;
 import org.springframework.stereotype.Service;
 
 @Service
 public class TestEntityService extends GenericReactiveCrudService<TestEntity,String> {
+
 }

+ 1 - 0
hsweb-commons/pom.xml

@@ -33,6 +33,7 @@
     <packaging>pom</packaging>
     <modules>
         <module>hsweb-commons-crud</module>
+        <module>hsweb-commons-api</module>
     </modules>
 
 </project>

+ 1 - 7
hsweb-starter/src/main/java/org/hswebframework/web/starter/HswebAutoConfiguration.java

@@ -1,17 +1,11 @@
 package org.hswebframework.web.starter;
 
-import org.hswebframework.web.crud.entity.factory.EntityFactory;
+import org.hswebframework.web.api.crud.entity.EntityFactory;
 import org.hswebframework.web.crud.entity.factory.MapperEntityFactory;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
-import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Scope;
-import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
 
-import java.util.List;
 @Configuration
 public class HswebAutoConfiguration  {
 

+ 1 - 1
hsweb-starter/src/main/java/org/hswebframework/web/starter/jackson/CustomTypeFactory.java

@@ -4,7 +4,7 @@ import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.*;
 import com.fasterxml.jackson.databind.util.ArrayBuilders;
 import com.fasterxml.jackson.databind.util.LRUMap;
-import org.hswebframework.web.crud.entity.factory.EntityFactory;
+import org.hswebframework.web.api.crud.entity.EntityFactory;
 
 public class CustomTypeFactory extends TypeFactory {
 

+ 30 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/pom.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-system-authorization</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>4.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-system-authorization-api</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.projectreactor</groupId>
+            <artifactId>reactor-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-commons-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.hibernate.javax.persistence</groupId>
+            <artifactId>hibernate-jpa-2.1-api</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/api/PasswordEncoder.java → hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/PasswordEncoder.java


hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/api/PermissionDimension.java → hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/PermissionDimension.java


hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/api/PermissionDimensionProvider.java → hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/PermissionDimensionProvider.java


+ 24 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/User.java

@@ -0,0 +1,24 @@
+package org.hswebframework.web.system.authorization.api;
+
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+
+@Getter
+@Setter
+public class User implements Serializable {
+
+    private String id;
+
+    private String username;
+
+    private String type;
+
+    private Byte status;
+
+
+}

hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/api/UserPermissionDimensionProvider.java → hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/UserPermissionDimensionProvider.java


+ 4 - 7
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/enums/UserState.java

@@ -1,15 +1,14 @@
-package org.hswebframework.web.system.authorization.enums;
+package org.hswebframework.web.system.authorization.api.enums;
 
 import lombok.AllArgsConstructor;
 import lombok.Getter;
-import org.hswebframework.web.dict.Dict;
 import org.hswebframework.web.dict.EnumDict;
 
 @Getter
 @AllArgsConstructor
-@Dict("user-state")
-public enum UserState implements EnumDict<String> {
-    enabled("正常"), disabled("已禁用");
+public enum DimensionUserFeature implements EnumDict<String> {
+    mergeChildrenPermission("合并子级维度权限")
+    ;
 
     private String text;
 
@@ -17,6 +16,4 @@ public enum UserState implements EnumDict<String> {
     public String getValue() {
         return name();
     }
-
-
 }

+ 27 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/reactive/ReactiveUserService.java

@@ -0,0 +1,27 @@
+package org.hswebframework.web.system.authorization.api.reactive;
+
+import org.hswebframework.ezorm.core.param.QueryParam;
+import org.hswebframework.web.system.authorization.api.User;
+import org.hswebframework.web.system.authorization.api.request.SaveUserRequest;
+import org.reactivestreams.Publisher;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+
+public interface ReactiveUserService {
+
+    Flux<User> save(Publisher<SaveUserRequest> userEntity);
+
+    Mono<User> getByUsername(String username);
+
+    Mono<User> getByUsernameAndPassword(String username, String plainPassword);
+
+    Mono<Integer> changeState(Publisher<String> userId, byte state);
+
+    Mono<Boolean> updatePassword(String userId, String oldPassword, String newPassword);
+
+    Flux<User> findUser(QueryParam queryParam);
+
+    Mono<Long> countUser(QueryParam queryParam);
+
+}

+ 22 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/request/SaveUserRequest.java

@@ -0,0 +1,22 @@
+package org.hswebframework.web.system.authorization.api.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+@Getter
+@Setter
+public class SaveUserRequest {
+
+    private String id;
+
+    @NotBlank
+    private String name;
+
+    private String username;
+
+    private String password;
+
+
+}

+ 28 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/pom.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-system-authorization</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>4.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-system-authorization-default</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-system-authorization-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hswebframework.web</groupId>
+            <artifactId>hsweb-commons-crud</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
+
+</project>

+ 2 - 2
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/ActionEntity.java

@@ -1,8 +1,8 @@
-package org.hswebframework.web.system.authorization.entity;
+package org.hswebframework.web.system.authorization.api.entity;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.hswebframework.web.crud.entity.Entity;
+import org.hswebframework.web.api.crud.entity.Entity;
 
 import java.util.Map;
 

+ 2 - 2
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/AuthorizationSettingEntity.java

@@ -1,11 +1,11 @@
-package org.hswebframework.web.system.authorization.entity;
+package org.hswebframework.web.system.authorization.api.entity;
 
 import lombok.Getter;
 import lombok.Setter;
 import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType;
 import org.hswebframework.ezorm.rdb.mapping.annotation.Comment;
 import org.hswebframework.ezorm.rdb.mapping.annotation.JsonCodec;
-import org.hswebframework.web.crud.entity.Entity;
+import org.hswebframework.web.api.crud.entity.Entity;
 
 import javax.persistence.Column;
 import javax.persistence.Id;

+ 1 - 1
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/DataAccessEntity.java

@@ -1,4 +1,4 @@
-package org.hswebframework.web.system.authorization.entity;
+package org.hswebframework.web.system.authorization.api.entity;
 
 import lombok.Getter;
 import lombok.Setter;

+ 40 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionEntity.java

@@ -0,0 +1,40 @@
+package org.hswebframework.web.system.authorization.api.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType;
+import org.hswebframework.ezorm.rdb.mapping.annotation.Comment;
+import org.hswebframework.ezorm.rdb.mapping.annotation.JsonCodec;
+import org.hswebframework.web.api.crud.entity.GenericTreeSortSupportEntity;
+
+import javax.persistence.Column;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import java.sql.JDBCType;
+import java.util.List;
+import java.util.Map;
+
+@Getter
+@Setter
+@Table(name = "s_dimension",indexes = {
+        @Index(name = "idx_dims_ass_id",columnList = "association_relation,association_id"),
+        @Index(name = "idx_dims_path",columnList = "path")
+})
+public class DimensionEntity extends GenericTreeSortSupportEntity<String> {
+
+    @Comment("维度名称")
+    @Column(length = 32)
+    private String name;
+
+    @Comment("描述")
+    @Column(length = 256)
+    private String describe;
+
+    @Column
+    @ColumnType(jdbcType = JDBCType.LONGVARCHAR)
+    @Comment("其他配置")
+    @JsonCodec
+    private Map<String,Object> properties;
+
+    private List<DimensionEntity> children;
+}

+ 58 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionUserEntity.java

@@ -0,0 +1,58 @@
+package org.hswebframework.web.system.authorization.api.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType;
+import org.hswebframework.ezorm.rdb.mapping.annotation.Comment;
+import org.hswebframework.ezorm.rdb.mapping.annotation.EnumCodec;
+import org.hswebframework.web.api.crud.entity.GenericEntity;
+import org.hswebframework.web.dict.EnumDict;
+import org.hswebframework.web.system.authorization.api.enums.DimensionUserFeature;
+
+import javax.persistence.Column;
+import javax.persistence.Index;
+import javax.persistence.Table;
+import java.sql.JDBCType;
+
+@Getter
+@Setter
+@Table(name = "s_dimension_user", indexes = {
+        @Index(name = "idx_dimsu_dimension_id", columnList = "dimension_id"),
+        @Index(name = "idx_dimsu_user_id", columnList = "user_id"),
+
+})
+public class DimensionUserEntity extends GenericEntity<String> {
+
+    @Comment("维度ID")
+    @Column(name = "dimension_id", nullable = false, length = 32)
+    private String dimensionId;
+
+    @Comment("维度名称")
+    @Column(name = "dimension_name", nullable = false)
+    private String dimensionName;
+
+    @Comment("用户ID")
+    @Column(name = "user_id", nullable = false, length = 32)
+    private String userId;
+
+    @Comment("用户ID")
+    @Column(name = "user_name", nullable = false)
+    private String userName;
+
+    @Comment("关系")
+    @Column(length = 32)
+    private String relation;
+
+    @Column(name = "relation_name")
+    @Comment("关系名称")
+    private String relationName;
+
+    @Column(name = "features")
+    @ColumnType(jdbcType = JDBCType.NUMERIC)
+    @EnumCodec(toMask = true)
+    private DimensionUserFeature[] features;
+
+    public boolean hasFeature(DimensionUserFeature feature) {
+        return features != null && EnumDict.in(feature, features);
+    }
+}

+ 2 - 2
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/OptionalField.java

@@ -1,9 +1,9 @@
-package org.hswebframework.web.system.authorization.entity;
+package org.hswebframework.web.system.authorization.api.entity;
 
 import lombok.Data;
 import lombok.Getter;
 import lombok.Setter;
-import org.hswebframework.web.crud.entity.Entity;
+import org.hswebframework.web.api.crud.entity.Entity;
 
 import java.util.Map;
 

+ 2 - 2
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/ParentPermission.java

@@ -1,7 +1,7 @@
-package org.hswebframework.web.system.authorization.entity;
+package org.hswebframework.web.system.authorization.api.entity;
 
 import lombok.Data;
-import org.hswebframework.web.crud.entity.Entity;
+import org.hswebframework.web.api.crud.entity.Entity;
 
 import java.util.Map;
 import java.util.Set;

+ 2 - 2
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/PermissionEntity.java

@@ -1,11 +1,11 @@
-package org.hswebframework.web.system.authorization.entity;
+package org.hswebframework.web.system.authorization.api.entity;
 
 import lombok.Getter;
 import lombok.Setter;
 import org.hswebframework.ezorm.rdb.mapping.annotation.ColumnType;
 import org.hswebframework.ezorm.rdb.mapping.annotation.Comment;
 import org.hswebframework.ezorm.rdb.mapping.annotation.JsonCodec;
-import org.hswebframework.web.crud.entity.GenericEntity;
+import org.hswebframework.web.api.crud.entity.GenericEntity;
 
 import javax.persistence.Column;
 import javax.persistence.Table;

+ 4 - 6
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/UserEntity.java

@@ -1,15 +1,13 @@
-package org.hswebframework.web.system.authorization.entity;
+package org.hswebframework.web.system.authorization.api.entity;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Getter;
 import lombok.Setter;
+import org.hswebframework.web.api.crud.entity.GenericEntity;
+import org.hswebframework.web.api.crud.entity.RecordCreationEntity;
 import org.hswebframework.web.bean.ToString;
-import org.hswebframework.web.crud.entity.Entity;
-import org.hswebframework.web.crud.entity.GenericEntity;
-import org.hswebframework.web.crud.entity.RecordCreationEntity;
 
 import javax.persistence.Column;
-import javax.persistence.Id;
 import javax.persistence.Index;
 import javax.persistence.Table;
 import javax.validation.constraints.NotBlank;
@@ -19,7 +17,7 @@ import javax.validation.constraints.NotBlank;
 @Table(name = "s_user", indexes =
 @Index(name = "user_username_idx", columnList = "username", unique = true)
 )
-public class UserEntity extends GenericEntity<String> implements RecordCreationEntity {
+public class UserEntity  extends GenericEntity<String> implements RecordCreationEntity {
 
     @Column(length = 128, nullable = false)
     @NotBlank(message = "姓名不能为空")

+ 15 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/pom.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-system-authorization</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>4.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-system-authorization-starter</artifactId>
+
+
+</project>

+ 15 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-web/pom.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>hsweb-system-authorization</artifactId>
+        <groupId>org.hswebframework.web</groupId>
+        <version>4.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>hsweb-system-authorization-web</artifactId>
+
+
+</project>

+ 8 - 7
hsweb-system/hsweb-system-authorization/pom.xml

@@ -8,16 +8,17 @@
         <version>4.0.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
+    <packaging>pom</packaging>
 
     <description>业务模块-权限管理</description>
+    <modules>
+        <module>hsweb-system-authorization-api</module>
+        <module>hsweb-system-authorization-starter</module>
+        <module>hsweb-system-authorization-web</module>
+        <module>hsweb-system-authorization-default</module>
+    </modules>
     <artifactId>hsweb-system-authorization</artifactId>
 
-    <dependencies>
-        <dependency>
-            <groupId>org.hswebframework.web</groupId>
-            <artifactId>hsweb-commons-crud</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
+
 
 </project>

+ 0 - 19
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/api/UserService.java

@@ -1,19 +0,0 @@
-package org.hswebframework.web.system.authorization.api;
-
-import org.hswebframework.web.system.authorization.entity.UserEntity;
-import org.reactivestreams.Publisher;
-import reactor.core.publisher.Mono;
-
-public interface UserService {
-
-    Mono<Boolean> save(Publisher<UserEntity> userEntity);
-
-    Mono<UserEntity> getByUsername(String username);
-
-    Mono<UserEntity> getByUsernameAndPassword(String username,String plainPassword);
-
-    Mono<Boolean> changeState(Publisher<String> userId, byte state);
-
-    Mono<Boolean> updatePassword(String userId, String oldPassword, String newPassword);
-
-}

+ 0 - 39
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/entity/DimensionEntity.java

@@ -1,39 +0,0 @@
-package org.hswebframework.web.system.authorization.entity;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.hswebframework.ezorm.rdb.mapping.annotation.Comment;
-import org.hswebframework.web.crud.entity.GenericTreeSortSupportEntity;
-
-import javax.persistence.Column;
-import javax.persistence.Table;
-import java.util.List;
-
-@Getter
-@Setter
-@Table(name = "s_dimension")
-public class DimensionEntity extends GenericTreeSortSupportEntity<String> {
-
-    @Comment("维度名称")
-    @Column(length = 32)
-    private String name;
-
-    @Comment("描述")
-    @Column(length = 256)
-    private String describe;
-
-    @Column(length = 32,name = "association_id")
-    @Comment("关联维度")
-    private String associationId;
-
-    @Column(length = 32,name = "association_relation")
-    @Comment("关联维度关系")
-    private String associationRelation;
-
-    @Column(length = 128,name = "association_relation_name")
-    @Comment("关联维度关系名称")
-    private String associationRelationName;
-
-
-    private List<DimensionEntity> children;
-}

+ 0 - 7
hsweb-system/hsweb-system-authorization/src/main/java/org/hswebframework/web/system/authorization/service/DefaultReactiveUserService.java

@@ -1,7 +0,0 @@
-package org.hswebframework.web.system.authorization.service;
-
-public class DefaultReactiveUserService {
-
-
-
-}