ソースを参照

Merge pull request #111 from hs-web/3.0.x

3.0.x
zhōuhào 6 年 前
コミット
e88e8efc63
100 ファイル変更780 行追加328 行削除
  1. 2 1
      .gitignore
  2. BIN
      .mvn/wrapper/maven-wrapper.jar
  3. 1 0
      .mvn/wrapper/maven-wrapper.properties
  4. 2 0
      .travis.yml
  5. 1 2
      CONTRIBUTING.md
  6. 0 23
      FEATURES.md
  7. 1 1
      README.md
  8. 2 0
      build.sh
  9. 0 1
      docs/CNAME
  10. 0 1
      docs/README.md
  11. 0 1
      docs/_config.yml
  12. 1 1
      hsweb-authorization/hsweb-authorization-api/pom.xml
  13. 2 0
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Permission.java
  14. 20 0
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/UserAttachEntity.java
  15. 5 1
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/RequiresDataAccess.java
  16. 7 0
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/TwoFactor.java
  17. 2 1
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessDefinition.java
  18. 2 0
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimplePermission.java
  19. 1 1
      hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleAuthenticationBuilder.java
  20. 1 1
      hsweb-authorization/hsweb-authorization-basic/pom.xml
  21. 33 31
      hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/DefaultAopMethodAuthorizeDefinitionParser.java
  22. 2 1
      hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java
  23. 3 1
      hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultDataAccessDefinition.java
  24. 3 0
      hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationProperties.java
  25. 3 5
      hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/handler/DefaultAuthorizingHandler.java
  26. 1 1
      hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/twofactor/TwoFactorHandlerInterceptorAdapter.java
  27. 1 1
      hsweb-authorization/hsweb-authorization-jwt/pom.xml
  28. 1 1
      hsweb-authorization/hsweb-authorization-oauth2/hsweb-authorization-oauth2-auth-server/pom.xml
  29. 1 1
      hsweb-authorization/hsweb-authorization-oauth2/hsweb-authorization-oauth2-client/pom.xml
  30. 1 1
      hsweb-authorization/hsweb-authorization-oauth2/hsweb-authorization-oauth2-core/pom.xml
  31. 1 1
      hsweb-authorization/hsweb-authorization-oauth2/pom.xml
  32. 1 1
      hsweb-authorization/pom.xml
  33. 1 1
      hsweb-boost/hsweb-boost-aop/pom.xml
  34. 1 1
      hsweb-boost/hsweb-boost-excel/pom.xml
  35. 1 1
      hsweb-boost/hsweb-boost-ftp/pom.xml
  36. 1 1
      hsweb-boost/pom.xml
  37. 1 1
      hsweb-commons/hsweb-commons-bean/pom.xml
  38. 10 1
      hsweb-commons/hsweb-commons-controller/pom.xml
  39. 24 2
      hsweb-commons/hsweb-commons-controller/src/main/java/org/hswebframework/web/controller/CreateController.java
  40. 34 4
      hsweb-commons/hsweb-commons-controller/src/main/java/org/hswebframework/web/controller/UpdateController.java
  41. 9 0
      hsweb-commons/hsweb-commons-controller/src/main/resources/hsweb-module.json
  42. 1 1
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-api/pom.xml
  43. 1 1
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/pom.xml
  44. 46 30
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/builder/EasyOrmSqlBuilder.java
  45. 25 25
      hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/builder/jpa/JpaAnnotationParser.java
  46. 1 1
      hsweb-commons/hsweb-commons-dao/pom.xml
  47. 1 1
      hsweb-commons/hsweb-commons-entity/pom.xml
  48. 19 0
      hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/LogicalDeleteEntity.java
  49. 25 23
      hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/PagerResult.java
  50. 29 0
      hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/RecordModifierEntity.java
  51. 1 1
      hsweb-commons/hsweb-commons-model/pom.xml
  52. 1 1
      hsweb-commons/hsweb-commons-service/hsweb-commons-service-api/pom.xml
  53. 1 1
      hsweb-commons/hsweb-commons-service/hsweb-commons-service-oauth2/pom.xml
  54. 9 2
      hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/pom.xml
  55. 12 5
      hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/DefaultQueryByEntityService.java
  56. 19 4
      hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java
  57. 8 0
      hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/resources/hsweb-module.json
  58. 1 1
      hsweb-commons/hsweb-commons-service/pom.xml
  59. 15 1
      hsweb-commons/hsweb-commons-utils/pom.xml
  60. 132 0
      hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/ModuleUtils.java
  61. 26 0
      hsweb-commons/hsweb-commons-utils/src/test/java/org/hswebframework/web/ModuleUtilsTest.java
  62. 9 0
      hsweb-commons/hsweb-commons-utils/src/test/resources/hsweb-module.json
  63. 1 1
      hsweb-commons/pom.xml
  64. 1 1
      hsweb-concurrent/hsweb-concurrent-async-job/pom.xml
  65. 1 1
      hsweb-concurrent/hsweb-concurrent-cache/pom.xml
  66. 1 1
      hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/pom.xml
  67. 1 1
      hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-redis/pom.xml
  68. 1 1
      hsweb-concurrent/hsweb-concurrent-counter/pom.xml
  69. 1 1
      hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-api/pom.xml
  70. 1 1
      hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-redis/pom.xml
  71. 1 1
      hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-starter/pom.xml
  72. 1 1
      hsweb-concurrent/hsweb-concurrent-lock/pom.xml
  73. 1 1
      hsweb-concurrent/hsweb-concurrent-rate-limiter/hsweb-concurrent-rate-limiter-api/pom.xml
  74. 1 1
      hsweb-concurrent/hsweb-concurrent-rate-limiter/hsweb-concurrent-rate-limiter-api/src/test/java/org/hswebframework/web/concurrent/GuavaRateLimiterManagerTest.java
  75. 1 1
      hsweb-concurrent/hsweb-concurrent-rate-limiter/hsweb-concurrent-rate-limiter-starter/pom.xml
  76. 1 1
      hsweb-concurrent/hsweb-concurrent-rate-limiter/pom.xml
  77. 1 1
      hsweb-concurrent/pom.xml
  78. 1 1
      hsweb-core/pom.xml
  79. 1 1
      hsweb-datasource/hsweb-datasource-api/pom.xml
  80. 4 1
      hsweb-datasource/hsweb-datasource-api/src/main/java/org/hswebframework/web/datasource/DatabaseType.java
  81. 1 1
      hsweb-datasource/hsweb-datasource-jta/pom.xml
  82. 1 1
      hsweb-datasource/hsweb-datasource-web/pom.xml
  83. 1 1
      hsweb-datasource/pom.xml
  84. 1 1
      hsweb-logging/hsweb-access-logging-aop/pom.xml
  85. 1 1
      hsweb-logging/hsweb-access-logging-api/pom.xml
  86. 1 1
      hsweb-logging/pom.xml
  87. 1 1
      hsweb-starter/hsweb-spring-boot-starter/pom.xml
  88. 11 6
      hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/SystemInitializeAutoConfiguration.java
  89. 4 1
      hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/init/SystemInitialize.java
  90. 1 1
      hsweb-starter/pom.xml
  91. 1 1
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/pom.xml
  92. 8 32
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/entity/authorization/DataAccessEntity.java
  93. 2 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/entity/authorization/ParentPermission.java
  94. 5 2
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/entity/authorization/SimplePermissionEntity.java
  95. 14 1
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/pom.xml
  96. 92 28
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/src/main/java/org/hswebframework/web/service/authorization/simple/SimpleAuthorizationSettingService.java
  97. 9 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/src/main/resources/hsweb-module.json
  98. 1 1
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/pom.xml
  99. 39 40
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/src/main/resources/hsweb-starter.js
  100. 0 0
      hsweb-system/hsweb-system-authorization/hsweb-system-authorization-web/pom.xml

+ 2 - 1
.gitignore

@@ -20,4 +20,5 @@
 hs_err_pid*
 **/transaction-logs/
 pom.xml.versionsBackup
-build/
+build/
+!maven-wrapper.jar

BIN
.mvn/wrapper/maven-wrapper.jar


+ 1 - 0
.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1 @@
+distributionUrl=http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.zip

+ 2 - 0
.travis.yml

@@ -2,6 +2,8 @@ language: java
 sudo: false
 jdk:
   - oraclejdk8
+before_install:
+  - chmod +x mvnw
 script:
   - mvn -q test
 after_success:

+ 1 - 2
CONTRIBUTING.md

@@ -7,8 +7,7 @@
 6. 合并
 
 # BUG
-如果知道导致bug的位置,你可以直接修改后`pull request`,也可以[勾出bug所在位置](docs/help/submit-code-issues.md),然后提交[issues](https://github.com/hs-web/hsweb-framework/issues/new)
-并 `@zhou-hao`,label 选择`bug`.我们会尽快解决.
+如果知道导致bug的位置,你可以直接修改后`pull request`,也可以提交[issues](https://github.com/hs-web/hsweb-framework/issues/new).我们会尽快解决.
 
 # 需求&优化
 你可以通过issues提交你希望`hsweb`增加的特性以及功能优化,并可以在 [projects](https://github.com/hs-web/hsweb-framework/projects)中查看`hsweb`的开发进展以及计划.

+ 0 - 23
FEATURES.md

@@ -1,23 +0,0 @@
-# hsweb3.0
-hsweb3.0 是模块化的,每个功能可独立使用,可选择自己需要的功能依赖即可. 
-将来还将支持使用类似dubbo,spring-cloud的服务进行分布式管理.将不同的模块分布式运行.
-全部api都通过restful+json提供,前后分离. 目前暂未提供前端实现.
-
-## 核心功能
-+ [x] 权限管理.支持基于角色的权限控制,支持行,列的数据级权限控制,可自由拓展控制方式. 
-+ [x] 动态数据源.支持多数据源管理,灵活的切换方式,支持事务中切换数据源.
-+ [x] 并发场景工具.分布式锁,计数器等实用功能
-+ [x] 消息(mq)工具. 简单的消息封装,收发消息更方便.
-+ [x] websocket.配合消息工具实现前端消息推送.
-+ [x] OAuth2.0 服务和客户端,支持使用OAuth2.0进行单点登录
-+ [x] 数据字典功能,支持自定义字典解析器,满足特定字典格式需求.
-+ [x] 菜单管理.支持菜单分组,灵活配置菜单结构.
-+ [x] 动态脚本.在线编写脚本任务,维护系统更灵活.
-+ [x] 动态表单.在线设计表单(需前端支持),提供统一CRUD接口,随建随用.
-+ [ ] 工作流引擎.配合动态表单,实现工作流灵活自定义.
-+ [x] ***组织架构.采用[地区-组织-部门-职位-人员]方式,支持灵活的数据权限控制.***
-+ [x] 定时调度.在线配置任务,使用动态脚本编写任务内容,维护更方便.
-+ [x] 文件管理. 文件上传下载统一接口,支持文件秒传.
-+ [x] 访问日志. 记录用户每次访问信息.
-+ [x] 在线数据库管理. 在线维护数据库,执行sql等操作.
-+ [x] 代码生成器.可自定义模板,各种项目结构随心所欲.

+ 1 - 1
README.md

@@ -4,7 +4,7 @@
 [![Build Status](https://travis-ci.org/hs-web/hsweb-framework.svg?branch=master)](https://travis-ci.org/hs-web/hsweb-framework)
 [![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg?style=flat-square)](https://www.apache.org/licenses/LICENSE-2.0.html)
 
-  [贡献代码](CONTRIBUTING.md)  [快速开始](https://docs.hsweb.io/framework/kuai-su-kai-shi)
+  [贡献代码](CONTRIBUTING.md)  [用户手册](https://docs.hsweb.io)
 
 ## 应用场景
 1. 完全开源的后台管理系统.

+ 2 - 0
build.sh

@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+./mvnw install -Dgit.commit.hash=$(git rev-parse HEAD) -DskipTests=true

+ 0 - 1
docs/CNAME

@@ -1 +0,0 @@
-docs.hsweb.io

+ 0 - 1
docs/README.md

@@ -1 +0,0 @@
-# 文档

+ 0 - 1
docs/_config.yml

@@ -1 +0,0 @@
-theme: jekyll-theme-leap-day

+ 1 - 1
hsweb-authorization/hsweb-authorization-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-authorization</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 2 - 0
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/Permission.java

@@ -85,6 +85,8 @@ public interface Permission extends Serializable {
      */
     String getId();
 
+    String getName();
+
     /**
      * 用户对此权限的可操作事件(按钮)
      * <p>

+ 20 - 0
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/access/UserAttachEntity.java

@@ -0,0 +1,20 @@
+package org.hswebframework.web.authorization.access;
+
+
+/**
+ * 和user关联的实体
+ *
+ * @author zhouhao
+ * @since 3.0.6
+ */
+public interface UserAttachEntity {
+    String userId = "userId";
+
+    String getUserId();
+
+    void setUserId(String userId);
+
+    default String getUserIdProperty() {
+        return userId;
+    }
+}

+ 5 - 1
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/annotation/RequiresDataAccess.java

@@ -43,7 +43,6 @@ public @interface RequiresDataAccess {
     /**
      * @return permission id ,如果为空将继承 {@link Authorize#permission()}
      * @see Permission#getId()
-     *
      */
     String permission() default "";
 
@@ -82,4 +81,9 @@ public @interface RequiresDataAccess {
      */
     boolean ignore() default false;
 
+    /**
+     * @return 进行控制的实体类类型
+     * @since 3.0.6
+     */
+    Class entityType() default Void.class;
 }

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

@@ -49,4 +49,11 @@ public @interface TwoFactor {
      * @return 关闭验证
      */
     boolean ignore() default false;
+
+    /**
+     *
+     * @return 错误提示
+     * @since 3.0.6
+     */
+    String message() default "需要进行双因子验证";
 }

+ 2 - 1
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/define/DataAccessDefinition.java

@@ -4,7 +4,6 @@ package org.hswebframework.web.authorization.define;
 import java.io.Serializable;
 
 /**
- *
  * @author zhouhao
  * @see org.hswebframework.web.authorization.annotation.RequiresDataAccess
  */
@@ -14,6 +13,8 @@ public interface DataAccessDefinition extends Serializable {
 
     String getIdParameterName();
 
+    Class getEntityType();
+
     Phased getPhased();
 
 }

+ 2 - 0
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimplePermission.java

@@ -22,6 +22,8 @@ public class SimplePermission implements Permission {
 
     private String id;
 
+    private String name;
+
     private Set<String> actions;
 
     private Set<DataAccessConfig> dataAccesses;

+ 1 - 1
hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/builder/SimpleAuthenticationBuilder.java

@@ -86,7 +86,7 @@ public class SimpleAuthenticationBuilder implements AuthenticationBuilder {
             JSONObject jsonObject = jsonArray.getJSONObject(i);
             SimplePermission permission = new SimplePermission();
             permission.setId(jsonObject.getString("id"));
-
+            permission.setName(jsonObject.getString("name"));
             JSONArray actions = jsonObject.getJSONArray("actions");
             if (actions != null) {
                 permission.setActions(new HashSet<>(actions.toJavaList(String.class)));

+ 1 - 1
hsweb-authorization/hsweb-authorization-basic/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-authorization</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 33 - 31
hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/aop/DefaultAopMethodAuthorizeDefinitionParser.java

@@ -89,48 +89,50 @@ public class DefaultAopMethodAuthorizeDefinitionParser implements AopMethodAutho
             cache.put(key, EmptyAuthorizeDefinition.instance);
             return null;
         }
-        DefaultBasicAuthorizeDefinition authorizeDefinition = new DefaultBasicAuthorizeDefinition();
-        authorizeDefinition.setTargetClass(target);
-        authorizeDefinition.setTargetMethod(method);
-        if (methodAuth == null || methodAuth.merge()) {
-            authorizeDefinition.put(classAuth);
-        }
+        synchronized (cache) {
+            DefaultBasicAuthorizeDefinition authorizeDefinition = new DefaultBasicAuthorizeDefinition();
+            authorizeDefinition.setTargetClass(target);
+            authorizeDefinition.setTargetMethod(method);
+            if (methodAuth == null || methodAuth.merge()) {
+                authorizeDefinition.put(classAuth);
+            }
 
-        authorizeDefinition.put(methodAuth);
+            authorizeDefinition.put(methodAuth);
 
-        authorizeDefinition.put(expression);
+            authorizeDefinition.put(expression);
 
-        authorizeDefinition.put(classDataAccess);
+            authorizeDefinition.put(classDataAccess);
 
-        authorizeDefinition.put(methodDataAccess);
+            authorizeDefinition.put(methodDataAccess);
 
-        if (authorizeDefinition.getPermissionDescription().length == 0) {
-            if (classAuth != null) {
-                authorizeDefinition.put(classAuth.dataAccess());
-                String[] desc = classAuth.description();
-                if (desc.length > 0) {
-                    authorizeDefinition.setPermissionDescription(desc);
+            if (authorizeDefinition.getPermissionDescription().length == 0) {
+                if (classAuth != null) {
+                    authorizeDefinition.put(classAuth.dataAccess());
+                    String[] desc = classAuth.description();
+                    if (desc.length > 0) {
+                        authorizeDefinition.setPermissionDescription(desc);
+                    }
                 }
             }
-        }
 
-        if (authorizeDefinition.getActionDescription().length == 0) {
-            if (methodAuth != null) {
-                if (methodAuth.description().length != 0) {
-                    authorizeDefinition.setActionDescription(methodAuth.description());
+            if (authorizeDefinition.getActionDescription().length == 0) {
+                if (methodAuth != null) {
+                    if (methodAuth.description().length != 0) {
+                        authorizeDefinition.setActionDescription(methodAuth.description());
+                    }
                 }
             }
-        }
 
-        log.info("parsed authorizeDefinition {}.{} => {}.{} permission:{} actions:{}",
-                target.getSimpleName(),
-                method.getName(),
-                authorizeDefinition.getPermissionDescription(),
-                authorizeDefinition.getActionDescription(),
-                authorizeDefinition.getPermissions(),
-                authorizeDefinition.getActions());
-        cache.put(key, authorizeDefinition);
-        return authorizeDefinition;
+            log.info("parsed authorizeDefinition {}.{} => {}.{} permission:{} actions:{}",
+                    target.getSimpleName(),
+                    method.getName(),
+                    authorizeDefinition.getPermissionDescription(),
+                    authorizeDefinition.getActionDescription(),
+                    authorizeDefinition.getPermissions(),
+                    authorizeDefinition.getActions());
+            cache.put(key, authorizeDefinition);
+            return authorizeDefinition;
+        }
     }
 
     public CacheKey buildCacheKey(Class target, Method method) {

+ 2 - 1
hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java

@@ -101,6 +101,7 @@ public class DefaultBasicAuthorizeDefinition implements AopAuthorizeDefinition {
         }
         actions.addAll(Arrays.asList(dataAccess.action()));
         DefaultDataAccessDefinition definition = new DefaultDataAccessDefinition();
+        definition.setEntityType(dataAccess.entityType());
         definition.setPhased(dataAccess.phased());
         if (!"".equals(dataAccess.controllerBeanName())) {
             definition.setController(dataAccess.controllerBeanName());
@@ -108,7 +109,7 @@ public class DefaultBasicAuthorizeDefinition implements AopAuthorizeDefinition {
             definition.setController(dataAccess.getClass().getName());
         }
         dataAccessDefinition = definition;
-        dataAccessControl=true;
+        dataAccessControl = true;
     }
 
 

+ 3 - 1
hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultDataAccessDefinition.java

@@ -18,7 +18,9 @@ public class DefaultDataAccessDefinition implements DataAccessDefinition {
 
     private String controller;
 
-    private String idParameterName="id";
+    private String idParameterName = "id";
+
+    private Class entityType;
 
     private Phased phased;
 }

+ 3 - 0
hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/embed/EmbedAuthenticationProperties.java

@@ -65,6 +65,8 @@ public class EmbedAuthenticationProperties {
     public static class PermissionInfo {
         private String id;
 
+        private String name;
+
         private Set<String> actions = new HashSet<>();
 
         private List<Map<String, Object>> dataAccesses = new ArrayList<>();
@@ -85,6 +87,7 @@ public class EmbedAuthenticationProperties {
                 .map(info -> {
                     SimplePermission permission = new SimplePermission();
                     permission.setId(info.getId());
+                    permission.setName(info.getName());
                     permission.setActions(info.getActions());
                     permission.setDataAccesses(info.getDataAccesses()
                             .stream().map(conf -> factory.create()

+ 3 - 5
hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/handler/DefaultAuthorizingHandler.java

@@ -160,12 +160,10 @@ public class DefaultAuthorizingHandler implements AuthorizingHandler {
         // 控制权限
         if (!definition.getPermissions().isEmpty()) {
             if (logger.isInfoEnabled()) {
-                logger.info("do permission access handle : permissions{}({}),actions{} ,definition:{}.{} ({})",
+                logger.info("执行权限控制:权限{}({}),操作{}.",
                         definition.getPermissionDescription(),
-                        permissionsDef, actionsDef
-                        , definition.getPermissions(),
-                        definition.getActions(),
-                        definition.getLogical());
+                        permissionsDef,
+                        actionsDef);
             }
             List<Permission> permissions = authentication.getPermissions().stream()
                     .filter(permission -> {

+ 1 - 1
hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/twofactor/TwoFactorHandlerInterceptorAdapter.java

@@ -45,7 +45,7 @@ public class TwoFactorHandlerInterceptorAdapter extends HandlerInterceptorAdapte
                 code = request.getHeader(factor.parameter());
             }
             if (StringUtils.isEmpty(code)) {
-                throw new NeedTwoFactorException("需要进行双重验证", factor.provider());
+                throw new NeedTwoFactorException(factor.message(), factor.provider());
             } else if (!validator.verify(code, factor.timeout())) {
                 throw new NeedTwoFactorException("验证码错误", factor.provider());
             }

+ 1 - 1
hsweb-authorization/hsweb-authorization-jwt/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-authorization</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-authorization/hsweb-authorization-oauth2/hsweb-authorization-oauth2-auth-server/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-authorization-oauth2</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-authorization/hsweb-authorization-oauth2/hsweb-authorization-oauth2-client/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-authorization-oauth2</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-authorization/hsweb-authorization-oauth2/hsweb-authorization-oauth2-core/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-authorization-oauth2</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <!--<relativePath>../../pom.xml</relativePath>-->
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-authorization/hsweb-authorization-oauth2/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-authorization</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-authorization/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-boost/hsweb-boost-aop/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-boost</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-boost/hsweb-boost-excel/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-boost</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-boost/hsweb-boost-ftp/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-boost</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-boost/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-commons/hsweb-commons-bean/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-commons</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 10 - 1
hsweb-commons/hsweb-commons-controller/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -32,6 +32,15 @@
 
     <description>通用增删改查-通用Controller模块</description>
 
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
+
     <dependencies>
         <dependency>
             <groupId>org.hswebframework.web</groupId>

+ 24 - 2
hsweb-commons/hsweb-commons-controller/src/main/java/org/hswebframework/web/controller/CreateController.java

@@ -20,8 +20,12 @@ package org.hswebframework.web.controller;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.Permission;
+import org.hswebframework.web.authorization.User;
 import org.hswebframework.web.authorization.annotation.Authorize;
+import org.hswebframework.web.commons.entity.RecordCreationEntity;
+import org.hswebframework.web.commons.entity.RecordModifierEntity;
 import org.hswebframework.web.controller.message.ResponseMessage;
 import org.hswebframework.web.logging.AccessLogger;
 import org.hswebframework.web.service.CreateEntityService;
@@ -56,8 +60,26 @@ public interface CreateController<E, PK, M> {
     @ResponseStatus(HttpStatus.CREATED)
     @ApiOperation(value = "新增")
     default ResponseMessage<PK> add(@RequestBody M data) {
-        E entity = getService().createEntity();
-        return ok(getService().insert(modelToEntity(data, entity)));
+        E entity = modelToEntity(data, getService().createEntity());
+        //自动添加创建人和创建时间
+        if (entity instanceof RecordCreationEntity) {
+            RecordCreationEntity creationEntity = (RecordCreationEntity) entity;
+            creationEntity.setCreateTimeNow();
+            creationEntity.setCreatorId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        //修改人和修改时间
+        if (entity instanceof RecordModifierEntity) {
+            RecordModifierEntity creationEntity = (RecordModifierEntity) entity;
+            creationEntity.setModifyTimeNow();
+            creationEntity.setModifierId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        return ok(getService().insert(entity));
     }
 
     @Authorize(ignore = true)

+ 34 - 4
hsweb-commons/hsweb-commons-controller/src/main/java/org/hswebframework/web/controller/UpdateController.java

@@ -21,9 +21,13 @@ package org.hswebframework.web.controller;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponses;
+import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.Permission;
+import org.hswebframework.web.authorization.User;
 import org.hswebframework.web.authorization.annotation.Authorize;
 import org.hswebframework.web.authorization.annotation.Logical;
+import org.hswebframework.web.commons.entity.RecordCreationEntity;
+import org.hswebframework.web.commons.entity.RecordModifierEntity;
 import org.hswebframework.web.controller.message.ResponseMessage;
 import org.hswebframework.web.logging.AccessLogger;
 import org.hswebframework.web.service.CreateEntityService;
@@ -45,16 +49,42 @@ public interface UpdateController<E, PK, M> {
     @PutMapping(path = "/{id}")
     @ApiOperation("修改数据")
     default ResponseMessage<Integer> updateByPrimaryKey(@PathVariable PK id, @RequestBody M data) {
-        E entity = getService().createEntity();
-        return ResponseMessage.ok(getService().updateByPk(id, modelToEntity(data, entity)));
+        E entity = modelToEntity(data, getService().createEntity());
+        if (entity instanceof RecordModifierEntity) {
+            RecordModifierEntity creationEntity = (RecordModifierEntity) entity;
+            creationEntity.setModifyTimeNow();
+            creationEntity.setModifierId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        return ResponseMessage.ok(getService().updateByPk(id, entity));
     }
 
     @Authorize(action = {Permission.ACTION_UPDATE, Permission.ACTION_ADD}, logical = Logical.AND)
     @PatchMapping
     @ApiOperation("新增或者修改")
     default ResponseMessage<PK> saveOrUpdate(@RequestBody M data) {
-        E entity = getService().createEntity();
-        return ResponseMessage.ok(getService().saveOrUpdate(modelToEntity(data, entity)));
+        E entity = modelToEntity(data, getService().createEntity());
+        //自动添加创建人和创建时间
+        if (entity instanceof RecordCreationEntity) {
+            RecordCreationEntity creationEntity = (RecordCreationEntity) entity;
+            creationEntity.setCreateTimeNow();
+            creationEntity.setCreatorId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        //修改人和修改时间
+        if (entity instanceof RecordModifierEntity) {
+            RecordModifierEntity creationEntity = (RecordModifierEntity) entity;
+            creationEntity.setModifyTimeNow();
+            creationEntity.setModifierId(Authentication.current()
+                    .map(Authentication::getUser)
+                    .map(User::getId)
+                    .orElse(null));
+        }
+        return ResponseMessage.ok(getService().saveOrUpdate(entity));
     }
 
     /**

+ 9 - 0
hsweb-commons/hsweb-commons-controller/src/main/resources/hsweb-module.json

@@ -0,0 +1,9 @@
+{
+  "groupId": "${project.groupId}",
+  "artifactId": "${project.artifactId}",
+  "path": "hsweb-commons/hsweb-commons-controller",
+
+  "gitCommitHash": "${git.commit.hash}",
+  "gitRepository": "http://github.com/hs-web/hsweb-framework",
+  "version": "${project.version}"
+}

+ 1 - 1
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-api/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons-dao</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons-dao</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 46 - 30
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/builder/EasyOrmSqlBuilder.java

@@ -28,15 +28,13 @@ import org.hswebframework.ezorm.core.param.*;
 import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
 import org.hswebframework.ezorm.rdb.meta.RDBDatabaseMetaData;
 import org.hswebframework.ezorm.rdb.meta.RDBTableMetaData;
+import org.hswebframework.ezorm.rdb.meta.converter.BooleanValueConverter;
 import org.hswebframework.ezorm.rdb.meta.converter.DateTimeConverter;
 import org.hswebframework.ezorm.rdb.meta.converter.NumberValueConverter;
 import org.hswebframework.ezorm.rdb.render.Sql;
 import org.hswebframework.ezorm.rdb.render.SqlAppender;
 import org.hswebframework.ezorm.rdb.render.SqlRender;
-import org.hswebframework.ezorm.rdb.render.dialect.Dialect;
-import org.hswebframework.ezorm.rdb.render.dialect.H2RDBDatabaseMetaData;
-import org.hswebframework.ezorm.rdb.render.dialect.MysqlRDBDatabaseMetaData;
-import org.hswebframework.ezorm.rdb.render.dialect.OracleRDBDatabaseMetaData;
+import org.hswebframework.ezorm.rdb.render.dialect.*;
 import org.hswebframework.ezorm.rdb.render.support.simple.CommonSqlRender;
 import org.hswebframework.ezorm.rdb.render.support.simple.SimpleWhereSqlBuilder;
 import org.hswebframework.web.BusinessException;
@@ -108,32 +106,30 @@ public class EasyOrmSqlBuilder {
         return javaType;
     }
 
-    private final RDBDatabaseMetaData mysql  = new MysqlMeta();
-    private final RDBDatabaseMetaData oracle = new OracleMeta();
-    private final RDBDatabaseMetaData h2     = new H2Meta();
-
-    private final ConcurrentMap<RDBDatabaseMetaData, Map<String, RDBTableMetaData>> metaCache = new ConcurrentHashMap<RDBDatabaseMetaData, Map<String, RDBTableMetaData>>() {
-        @Override
-        public Map<String, RDBTableMetaData> get(Object key) {
-            Map<String, RDBTableMetaData> map = super.get(key);
-            if (map == null) {
-                map = new ConcurrentHashMap<>();
-                put((RDBDatabaseMetaData) key, map);
-            }
-            return map;
-        }
-    };
+    private final RDBDatabaseMetaData mysql      = new MysqlMeta();
+    private final RDBDatabaseMetaData oracle     = new OracleMeta();
+    private final RDBDatabaseMetaData h2         = new H2Meta();
+    private final RDBDatabaseMetaData postgresql = new PGMeta();
+    private final RDBDatabaseMetaData mssql      = new MSSQLMeta();
+
+    private final ConcurrentMap<RDBDatabaseMetaData, Map<String, RDBTableMetaData>> metaCache = new ConcurrentHashMap<>();
 
     public RDBDatabaseMetaData getActiveDatabase() {
         DatabaseType type = DataSourceHolder.currentDatabaseType();
         switch (type) {
-            case h2:
-                return h2;
             case mysql:
                 return mysql;
             case oracle:
                 return oracle;
+            case postgresql:
+                return postgresql;
+            case h2:
+                return h2;
+            case jtds_sqlserver:
+            case sqlserver:
+                return mssql;
             default:
+                log.warn("不支持的数据库类型:[{}]", type);
                 return h2;
         }
     }
@@ -153,7 +149,8 @@ public class EasyOrmSqlBuilder {
         tableName = getRealTableName(tableName);
         RDBDatabaseMetaData active = getActiveDatabase();
         String cacheKey = tableName.concat("-").concat(resultMapId);
-        Map<String, RDBTableMetaData> cache = metaCache.get(active);
+        Map<String, RDBTableMetaData> cache = metaCache.computeIfAbsent(active, k -> new ConcurrentHashMap<>());
+
         RDBTableMetaData cached = cache.get(cacheKey);
         if (cached != null) {
             return cached;
@@ -165,7 +162,7 @@ public class EasyOrmSqlBuilder {
 
         List<ResultMapping> resultMappings = new ArrayList<>(resultMaps.getResultMappings());
         resultMappings.addAll(resultMaps.getIdResultMappings());
-        resultMappings.forEach(resultMapping -> {
+        for (ResultMapping resultMapping : resultMappings) {
             if (resultMapping.getNestedQueryId() == null) {
                 RDBColumnMetaData column = new RDBColumnMetaData();
                 column.setJdbcType(JDBCType.valueOf(resultMapping.getJdbcType().name()));
@@ -187,13 +184,16 @@ public class EasyOrmSqlBuilder {
                         }
                     };
                     column.setValueConverter(dateConvert);
+                } else if (column.getJavaType() == boolean.class || column.getJavaType() == Boolean.class) {
+                    column.setValueConverter(new BooleanValueConverter(column.getJdbcType()));
                 } else if (TypeUtils.isNumberType(column)) { //数字
+                    //数字
                     column.setValueConverter(new NumberValueConverter(column.getJavaType()));
                 }
                 rdbTableMetaData.addColumn(column);
             }
-        });
-        cache.put(cacheKey, rdbTableMetaData);
+        }
+
         if (useJpa) {
             Class type = entityFactory == null ? resultMaps.getType() : entityFactory.getInstanceType(resultMaps.getType());
             RDBTableMetaData parseResult = JpaAnnotationParser.parseMetaDataFromEntity(type);
@@ -207,6 +207,7 @@ public class EasyOrmSqlBuilder {
                 }
             }
         }
+        cache.put(cacheKey, rdbTableMetaData);
         return rdbTableMetaData;
     }
 
@@ -274,8 +275,7 @@ public class EasyOrmSqlBuilder {
         }
         RDBTableMetaData tableMetaData = createMeta(tableName, resultMapId);
         SqlRender<InsertParam> render = tableMetaData.getDatabaseMetaData().getRenderer(SqlRender.TYPE.INSERT);
-        String sql = render.render(tableMetaData, insertParam).getSql();
-        return sql;
+        return render.render(tableMetaData, insertParam).getSql();
     }
 
     public String buildUpdateSql(String resultMapId, String tableName, UpdateParam param) {
@@ -405,7 +405,7 @@ public class EasyOrmSqlBuilder {
     }
 
     class MysqlMeta extends MysqlRDBDatabaseMetaData {
-        public MysqlMeta() {
+        MysqlMeta() {
             super();
             renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
             renderMap.put(SqlRender.TYPE.UPDATE, new UpdateSqlBuilder(Dialect.MYSQL));
@@ -413,7 +413,7 @@ public class EasyOrmSqlBuilder {
     }
 
     class OracleMeta extends OracleRDBDatabaseMetaData {
-        public OracleMeta() {
+        OracleMeta() {
             super();
             renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
             renderMap.put(SqlRender.TYPE.UPDATE, new UpdateSqlBuilder(Dialect.ORACLE));
@@ -421,10 +421,26 @@ public class EasyOrmSqlBuilder {
     }
 
     class H2Meta extends H2RDBDatabaseMetaData {
-        public H2Meta() {
+        H2Meta() {
             super();
             renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
             renderMap.put(SqlRender.TYPE.UPDATE, new UpdateSqlBuilder(Dialect.H2));
         }
     }
+
+    class PGMeta extends PGRDBDatabaseMetaData {
+        PGMeta() {
+            super();
+            renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
+            renderMap.put(SqlRender.TYPE.UPDATE, new UpdateSqlBuilder(Dialect.POSTGRES));
+        }
+    }
+
+    class MSSQLMeta extends MSSQLRDBDatabaseMetaData {
+        MSSQLMeta() {
+            super();
+            renderMap.put(SqlRender.TYPE.INSERT, new InsertSqlBuilder());
+            renderMap.put(SqlRender.TYPE.UPDATE, new UpdateSqlBuilder(Dialect.MSSQL));
+        }
+    }
 }

+ 25 - 25
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/builder/jpa/JpaAnnotationParser.java

@@ -6,6 +6,7 @@ import org.apache.commons.beanutils.BeanUtilsBean;
 import org.hswebframework.ezorm.core.ValueConverter;
 import org.hswebframework.ezorm.rdb.meta.RDBColumnMetaData;
 import org.hswebframework.ezorm.rdb.meta.RDBTableMetaData;
+import org.hswebframework.ezorm.rdb.meta.converter.BooleanValueConverter;
 import org.hswebframework.ezorm.rdb.meta.converter.DateTimeConverter;
 import org.hswebframework.ezorm.rdb.meta.converter.NumberValueConverter;
 import org.hswebframework.utils.ClassUtils;
@@ -120,26 +121,25 @@ public class JpaAnnotationParser {
                 .getPropertyUtils()
                 .getPropertyDescriptors(entityClass);
         for (PropertyDescriptor descriptor : descriptors) {
-            Column column = getAnnotation(entityClass, descriptor, Column.class);
-            if (column == null) {
+            Column columnAnn = getAnnotation(entityClass, descriptor, Column.class);
+            if (columnAnn == null) {
                 continue;
             }
-            RDBColumnMetaData columnMetaData = new RDBColumnMetaData();
-            columnMetaData.setName(column.name());
-            columnMetaData.setAlias(descriptor.getName());
-            columnMetaData.setLength(column.length());
-            columnMetaData.setPrecision(column.precision());
-            columnMetaData.setJavaType(descriptor.getPropertyType());
-            if (!column.updatable()) {
-                columnMetaData.setProperty("read-only", true);
+            RDBColumnMetaData column = new RDBColumnMetaData();
+            column.setName(columnAnn.name());
+            column.setAlias(descriptor.getName());
+            column.setLength(columnAnn.length());
+            column.setPrecision(columnAnn.precision());
+            column.setJavaType(descriptor.getPropertyType());
+            if (!columnAnn.updatable()) {
+                column.setProperty("read-only", true);
             }
-            if (!column.nullable()) {
-                columnMetaData.setNotNull(true);
+            if (!columnAnn.nullable()) {
+                column.setNotNull(true);
             }
-            if (StringUtils.hasText(column.columnDefinition())) {
-                columnMetaData.setColumnDefinition(column.columnDefinition());
+            if (StringUtils.hasText(columnAnn.columnDefinition())) {
+                column.setColumnDefinition(columnAnn.columnDefinition());
             }
-
             Class propertyType = descriptor.getPropertyType();
 
             JDBCType type = jdbcTypeMapping.get(propertyType);
@@ -150,8 +150,8 @@ public class JpaAnnotationParser {
                         .findFirst()
                         .orElse(JDBCType.OTHER);
             }
-            columnMetaData.setJdbcType(type);
-            ValueConverter dateConvert = new DateTimeConverter("yyyy-MM-dd HH:mm:ss", columnMetaData.getJavaType()) {
+            column.setJdbcType(type);
+            ValueConverter dateConvert = new DateTimeConverter("yyyy-MM-dd HH:mm:ss", column.getJavaType()) {
                 @Override
                 public Object getData(Object value) {
                     if (value instanceof Number) {
@@ -161,15 +161,15 @@ public class JpaAnnotationParser {
                 }
             };
 
-            if (columnMetaData.getJdbcType() == JDBCType.DATE
-                    || columnMetaData.getJdbcType() == JDBCType.TIMESTAMP) {
-                columnMetaData.setValueConverter(dateConvert);
-            } else if (TypeUtils.isNumberType(columnMetaData)) {
-                columnMetaData.setValueConverter(new NumberValueConverter(columnMetaData.getJavaType()));
+            if (column.getJdbcType() == JDBCType.DATE
+                    || column.getJdbcType() == JDBCType.TIMESTAMP) {
+                column.setValueConverter(dateConvert);
+            } else if (column.getJavaType() == boolean.class || column.getJavaType() == Boolean.class) {
+                column.setValueConverter(new BooleanValueConverter(column.getJdbcType()));
+            } else if (TypeUtils.isNumberType(column)) {
+                column.setValueConverter(new NumberValueConverter(column.getJavaType()));
             }
-
-
-            tableMetaData.addColumn(columnMetaData);
+            tableMetaData.addColumn(column);
         }
         return tableMetaData;
     }

+ 1 - 1
hsweb-commons/hsweb-commons-dao/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-commons/hsweb-commons-entity/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 19 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/LogicalDeleteEntity.java

@@ -0,0 +1,19 @@
+package org.hswebframework.web.commons.entity;
+
+/**
+ * 逻辑删除
+ *
+ * @author zhouhao
+ * @since 3.0.6
+ */
+public interface LogicalDeleteEntity {
+
+    Boolean getDeleted();
+
+    void setDeleted(boolean deleted);
+
+    Long getDeleteTime();
+
+    void setDeleteTime(Long deleteTime);
+
+}

+ 25 - 23
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/PagerResult.java

@@ -21,51 +21,53 @@ package org.hswebframework.web.commons.entity;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.hswebframework.web.commons.entity.param.QueryParamEntity;
 
 import java.util.ArrayList;
 import java.util.List;
 
 @ApiModel(description = "分页结果")
+@Getter
+@Setter
 public class PagerResult<E> implements Entity {
     private static final long serialVersionUID = -6171751136953308027L;
 
-    public static <E> PagerResult<E> empty(){
+    public static <E> PagerResult<E> empty() {
         return new PagerResult<>(0, new ArrayList<>());
     }
 
-    public static <E> PagerResult<E> of(int total,List<E> list){
-        return new PagerResult<>(total,list);
+    public static <E> PagerResult<E> of(int total, List<E> list) {
+        return new PagerResult<>(total, list);
     }
-    private int total;
-
-    private List<E> data;
 
-    public PagerResult() {
+    public static <E> PagerResult<E> of(int total, List<E> list, QueryParamEntity entity) {
+        PagerResult pagerResult = new PagerResult<>(total, list);
+        pagerResult.setPageIndex(entity.getThinkPageIndex());
+        pagerResult.setPageSize(entity.getPageSize());
+        return pagerResult;
     }
 
-    public PagerResult(int total, List<E> data) {
-        this.total = total;
-        this.data = data;
-    }
 
-    @ApiModelProperty("数据总数量")
-    public int getTotal() {
-        return total;
-    }
+    @ApiModelProperty("当前页码")
+    private int pageIndex;
 
-    public PagerResult<E> setTotal(int total) {
-        this.total = total;
-        return this;
-    }
+    @ApiModelProperty("每页数据数量")
+    private int pageSize;
+
+    @ApiModelProperty("数据总数量")
+    private int total;
 
     @ApiModelProperty("查询结果")
-    public List<E> getData() {
-        return data;
+    private List<E> data;
+
+    public PagerResult() {
     }
 
-    public PagerResult<E> setData(List<E> data) {
+    public PagerResult(int total, List<E> data) {
+        this.total = total;
         this.data = data;
-        return this;
     }
 
 }

+ 29 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/RecordModifierEntity.java

@@ -0,0 +1,29 @@
+package org.hswebframework.web.commons.entity;
+
+/**
+ * 记录修改信息的实体类,包括修改人和修改时间。
+ *
+ * @author zhouhao
+ * @since 3.0.6
+ */
+public interface RecordModifierEntity extends Entity {
+
+    String modifierId = "modifierId";
+    String modifyTime = "modifyTime";
+
+    String getModifierId();
+
+    void setModifierId(String modifierId);
+
+    Long getModifyTime();
+
+    void setModifyTime(Long modifyTime);
+
+    default void setModifyTimeNow() {
+        setModifyTime(System.currentTimeMillis());
+    }
+
+    default String getModifierIdProperty() {
+        return modifierId;
+    }
+}

+ 1 - 1
hsweb-commons/hsweb-commons-model/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-commons/hsweb-commons-service/hsweb-commons-service-api/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons-service</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-commons/hsweb-commons-service/hsweb-commons-service-oauth2/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-commons-service</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
 
         <relativePath>../pom.xml</relativePath>
     </parent>

+ 9 - 2
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons-service</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
 
     </parent>
@@ -32,7 +32,14 @@
     <artifactId>hsweb-commons-service-simple</artifactId>
 
     <description>通用增删改查-通用服务本地实现模块</description>
-
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+    </build>
     <dependencies>
         <dependency>
             <groupId>org.slf4j</groupId>

+ 12 - 5
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/DefaultQueryByEntityService.java

@@ -25,7 +25,6 @@ import org.hswebframework.web.commons.entity.param.QueryParamEntity;
 import org.hswebframework.web.dao.dynamic.QueryByEntityDao;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collections;
 import java.util.List;
 
 public interface DefaultQueryByEntityService<E>
@@ -44,24 +43,32 @@ public interface DefaultQueryByEntityService<E>
     @Override
     default PagerResult<E> selectPager(Entity param) {
         PagerResult<E> pagerResult = new PagerResult<>();
+
         if (param instanceof QueryParamEntity) {
             QueryParamEntity entity = ((QueryParamEntity) param);
             //不分页,不进行count
             if (!entity.isPaging()) {
                 pagerResult.setData(getDao().query(param));
                 pagerResult.setTotal(pagerResult.getData().size());
+                pagerResult.setPageIndex(entity.getThinkPageIndex());
+                pagerResult.setPageSize(pagerResult.getData().size());
                 return pagerResult;
             }
         }
         int total = getDao().count(param);
         pagerResult.setTotal(total);
+
+        //根据实际记录数量重新指定分页参数
+        if (param instanceof QueryParamEntity) {
+            QueryParamEntity paramEntity = (QueryParamEntity) param;
+            paramEntity.rePaging(total);
+            pagerResult.setPageSize(paramEntity.getPageSize());
+            pagerResult.setPageIndex(paramEntity.getThinkPageIndex());
+        }
+
         if (total == 0) {
             pagerResult.setData(new java.util.ArrayList<>());
         } else {
-            //根据实际记录数量重新指定分页参数
-            if (param instanceof QueryParamEntity) {
-                ((QueryParamEntity) param).rePaging(total);
-            }
             pagerResult.setData(select(param));
         }
         return pagerResult;

+ 19 - 4
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java

@@ -19,7 +19,9 @@
 package org.hswebframework.web.service;
 
 import org.hswebframework.web.commons.entity.GenericEntity;
+import org.hswebframework.web.commons.entity.LogicalDeleteEntity;
 import org.hswebframework.web.commons.entity.RecordCreationEntity;
+import org.hswebframework.web.commons.entity.RecordModifierEntity;
 import org.hswebframework.web.dao.CrudDao;
 import org.hswebframework.web.id.IDGenerator;
 import org.hswebframework.web.validator.DuplicateKeyException;
@@ -68,23 +70,36 @@ public abstract class GenericEntityService<E extends GenericEntity<PK>, PK>
 
     @Override
     public E deleteByPk(PK pk) {
-        Assert.notNull(pk, "parameter can not be null");
         E old = selectByPk(pk);
-        getDao().deleteByPk(pk);
+        if (old == null) {
+            return null;
+        }
+        if (old instanceof LogicalDeleteEntity) {
+            LogicalDeleteEntity deleteEntity = (LogicalDeleteEntity) old;
+            deleteEntity.setDeleted(true);
+            deleteEntity.setDeleteTime(System.currentTimeMillis());
+            createUpdate()
+                    .set(deleteEntity::getDeleted)
+                    .set(deleteEntity::getDeleteTime)
+                    .where(GenericEntity.id, pk)
+                    .exec();
+        } else {
+            getDao().deleteByPk(pk);
+        }
         return old;
     }
 
     @Override
     public int updateByPk(PK pk, E entity) {
         Assert.notNull(pk, "primary key can not be null");
+        Assert.hasText(String.valueOf(pk), "primary key can not be null");
         Assert.notNull(entity, "entity can not be null");
         entity.setId(pk);
         tryValidate(entity, UpdateGroup.class);
-
         return createUpdate(entity)
                 //如果是RecordCreationEntity则不修改creator_id和creator_time
                 .when(entity instanceof RecordCreationEntity,
-                        update -> update.and().excludes(RecordCreationEntity.creatorId, RecordCreationEntity.createTime))
+                        update -> update.and().excludes(((RecordCreationEntity) entity).getCreatorIdProperty(), RecordCreationEntity.createTime))
                 .where(GenericEntity.id, pk)
                 .exec();
     }

+ 8 - 0
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/resources/hsweb-module.json

@@ -0,0 +1,8 @@
+{
+  "groupId": "${project.groupId}",
+  "artifactId": "${project.artifactId}",
+  "path": "hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple",
+  "gitCommitHash": "${git.commit.hash}",
+  "gitRepository": "http://github.com/hs-web/hsweb-framework",
+  "version": "${project.version}"
+}

+ 1 - 1
hsweb-commons/hsweb-commons-service/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
 
         <relativePath>../pom.xml</relativePath>
     </parent>

+ 15 - 1
hsweb-commons/hsweb-commons-utils/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-commons</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
@@ -32,6 +32,15 @@
 
     <description>通用模块-工具类</description>
 
+    <build>
+        <testResources>
+            <testResource>
+                <directory>src/test/resources</directory>
+                <filtering>true</filtering>
+            </testResource>
+        </testResources>
+    </build>
+
     <dependencies>
 
         <dependency>
@@ -71,5 +80,10 @@
             <artifactId>hsweb-easy-orm-core</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 132 - 0
hsweb-commons/hsweb-commons-utils/src/main/java/org/hswebframework/web/ModuleUtils.java

@@ -0,0 +1,132 @@
+package org.hswebframework.web;
+
+import com.alibaba.fastjson.JSON;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author zhouhao
+ * @since 3.0.6
+ */
+@Slf4j
+public abstract class ModuleUtils {
+
+    private ModuleUtils() {
+
+    }
+
+    private final static Map<Class, ModuleInfo> classModuleInfoRepository;
+
+    private final static Map<String, ModuleInfo> nameModuleInfoRepository;
+
+    static {
+        classModuleInfoRepository = new ConcurrentHashMap<>();
+        nameModuleInfoRepository = new ConcurrentHashMap<>();
+        try {
+            log.info("init module info");
+            Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath*:/hsweb-module.json");
+            for (Resource resource : resources) {
+                String classPath = getClassPath(resource.getURL().getPath(), "hsweb-module.json");
+                ModuleInfo moduleInfo = JSON.parseObject(resource.getInputStream(), ModuleInfo.class);
+                moduleInfo.setClassPath(classPath);
+                ModuleUtils.register(moduleInfo);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+    public static ModuleInfo getModuleByClass(Class type) {
+        return classModuleInfoRepository.computeIfAbsent(type, ModuleUtils::parse);
+    }
+
+    public static String getClassPath(Class type) {
+        String path = type.getResource("").getPath();
+        String packages = type.getPackage().getName();
+        return getClassPath(path, packages);
+    }
+
+    public static String getClassPath(String path, String packages) {
+        int pos = path.contains("!/") ? 3 : path.endsWith("/") ? 2 : 1;
+        return path.substring(0, path.length() - packages.length() - pos);
+    }
+
+    private static ModuleInfo parse(Class type) {
+        String classpath = getClassPath(type);
+        return nameModuleInfoRepository.values()
+                .stream()
+                .filter(moduleInfo -> classpath.equals(moduleInfo.classPath))
+                .findFirst()
+                .orElse(noneInfo);
+    }
+
+    public static ModuleInfo getModule(String id) {
+        return nameModuleInfoRepository.get(id);
+    }
+
+    public static void register(ModuleInfo moduleInfo) {
+        nameModuleInfoRepository.put(moduleInfo.getId(), moduleInfo);
+    }
+
+    private static final ModuleInfo noneInfo = new ModuleInfo();
+
+    @Getter
+    @Setter
+    public static class ModuleInfo {
+
+        private String classPath;
+
+        private String id;
+
+        private String groupId;
+
+        private String path;
+
+        private String artifactId;
+
+        private String gitCommitHash;
+
+        private String gitRepository;
+
+        private String comment;
+
+        private String version;
+
+        public String getGitLocation() {
+            String gitCommitHash = this.gitCommitHash;
+            if (gitCommitHash.contains("$")) {
+                gitCommitHash = "master";
+            }
+            return gitRepository + "/blob/" + gitCommitHash + "/" + path + "/";
+        }
+
+        public String getGitClassLocation(Class clazz) {
+            return getGitLocation() + "src/main/java/" + (ClassUtils.getPackageName(clazz).replace(".", "/"))
+                    + "/" + clazz.getSimpleName() + ".java";
+        }
+
+        public String getGitClassLocation(Class clazz, long line, long lineTo) {
+            return getGitLocation() + "src/main/java/" + (ClassUtils.getPackageName(clazz).replace(".", "/"))
+                    + "/" + clazz.getSimpleName() + ".java#L" + line + "-" + "L" + lineTo;
+        }
+
+        public String getId() {
+            if (StringUtils.isEmpty(id)) {
+                id = groupId + "/" + artifactId;
+            }
+            return id;
+        }
+
+        public boolean isNone() {
+            return StringUtils.isEmpty(classPath);
+        }
+    }
+}

+ 26 - 0
hsweb-commons/hsweb-commons-utils/src/test/java/org/hswebframework/web/ModuleUtilsTest.java

@@ -0,0 +1,26 @@
+package org.hswebframework.web;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+
+
+/**
+ * @author zhouhao
+ * @since 3.0.6
+ */
+public class ModuleUtilsTest {
+
+    @Test
+    public void test() {
+        ModuleUtils.ModuleInfo moduleInfo = ModuleUtils.getModuleByClass(ModuleUtilsTest.class);
+        Assert.assertNotNull(moduleInfo);
+        Assert.assertFalse(moduleInfo.isNone());
+        Assert.assertEquals(moduleInfo.getArtifactId(),"hsweb-commons-utils");
+        System.out.println(moduleInfo.getGitLocation());
+        System.out.println(moduleInfo.getGitClassLocation(Maps.class,10,12));
+        ModuleUtils.ModuleInfo noneInfo = ModuleUtils.getModuleByClass(Logger.class);
+        Assert.assertNotNull(noneInfo);
+        Assert.assertTrue(noneInfo.isNone());
+    }
+}

+ 9 - 0
hsweb-commons/hsweb-commons-utils/src/test/resources/hsweb-module.json

@@ -0,0 +1,9 @@
+{
+  "groupId": "${project.groupId}",
+  "artifactId": "${project.artifactId}",
+  "path": "hsweb-commons/hsweb-commons-utils",
+
+  "gitCommitHash": "${git.commit.hash}",
+  "gitRepository": "http://github.com/hs-web/hsweb-framework",
+  "version": "${project.version}"
+}

+ 1 - 1
hsweb-commons/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-async-job/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-cache/pom.xml

@@ -22,7 +22,7 @@
     <parent>
         <artifactId>hsweb-concurrent</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-api/pom.xml

@@ -22,7 +22,7 @@
     <parent>
         <artifactId>hsweb-concurrent-counter</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-counter/hsweb-concurrent-counter-redis/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent-counter</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-counter/pom.xml

@@ -22,7 +22,7 @@
     <parent>
         <artifactId>hsweb-concurrent</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent-lock</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-redis/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent-lock</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-lock/hsweb-concurrent-lock-starter/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent-lock</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-lock/pom.xml

@@ -22,7 +22,7 @@
     <parent>
         <artifactId>hsweb-concurrent</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-rate-limiter/hsweb-concurrent-rate-limiter-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent-rate-limiter</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-rate-limiter/hsweb-concurrent-rate-limiter-api/src/test/java/org/hswebframework/web/concurrent/GuavaRateLimiterManagerTest.java

@@ -17,7 +17,7 @@ public class GuavaRateLimiterManagerTest {
     @Test
     public void testRateLimiter() {
         RateLimiter limiter = manager.getRateLimiter("test", 1, TimeUnit.SECONDS);
-        for (int i = 0; i < 100; i++) {
+        for (int i = 0; i < 10; i++) {
             if (!limiter.tryAcquire(10, TimeUnit.SECONDS)) {
                 throw new UnsupportedOperationException();
             }

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-rate-limiter/hsweb-concurrent-rate-limiter-starter/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent-rate-limiter</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/hsweb-concurrent-rate-limiter/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-concurrent</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-concurrent/pom.xml

@@ -22,7 +22,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-core/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-datasource/hsweb-datasource-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-datasource</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
 
         <relativePath>../pom.xml</relativePath>
     </parent>

+ 4 - 1
hsweb-datasource/hsweb-datasource-api/src/main/java/org/hswebframework/web/datasource/DatabaseType.java

@@ -32,7 +32,10 @@ public enum DatabaseType {
     h2("org.h2.Driver", "org.h2.jdbcx.JdbcDataSource", "select 1", createUrlPredicate("h2")),
     oracle("oracle.jdbc.driver.OracleDriver", "oracle.jdbc.xa.client.OracleXADataSource", "select 1 from dual", createUrlPredicate("oracle")),
     jtds_sqlserver("net.sourceforge.jtds.jdbc.Driver", "net.sourceforge.jtds.jdbcx.JtdsDataSource", "select 1 t", createUrlPredicate("jtds:sqlserver")),
-    sqlserver("com.microsoft.sqlserver.jdbc.SQLServerDriver", "com.microsoft.sqlserver.jdbc.SQLServerXADataSource", "select 1 t", createUrlPredicate("sqlserver"));
+    sqlserver("com.microsoft.sqlserver.jdbc.SQLServerDriver", "com.microsoft.sqlserver.jdbc.SQLServerXADataSource", "select 1 t", createUrlPredicate("sqlserver")),
+    //beta
+    postgresql("org.postgresql.Driver", "org.postgresql.xa.PGXADataSource", "select 1 ", createUrlPredicate("postgresql"));
+
 
     static Predicate<String> createUrlPredicate(String name) {
         return url -> {

+ 1 - 1
hsweb-datasource/hsweb-datasource-jta/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-datasource</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
 
     </parent>

+ 1 - 1
hsweb-datasource/hsweb-datasource-web/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-datasource</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
 
         <relativePath>../pom.xml</relativePath>
     </parent>

+ 1 - 1
hsweb-datasource/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
 
         <relativePath>../pom.xml</relativePath>
     </parent>

+ 1 - 1
hsweb-logging/hsweb-access-logging-aop/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-logging</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-logging/hsweb-access-logging-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-logging</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-logging/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>

+ 1 - 1
hsweb-starter/hsweb-spring-boot-starter/pom.xml

@@ -23,7 +23,7 @@
     <parent>
         <artifactId>hsweb-starter</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 11 - 6
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/SystemInitializeAutoConfiguration.java

@@ -21,12 +21,8 @@ package org.hswebframework.web.starter;
 import lombok.extern.slf4j.Slf4j;
 import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
 import org.hswebframework.ezorm.rdb.meta.RDBDatabaseMetaData;
-import org.hswebframework.ezorm.rdb.meta.parser.H2TableMetaParser;
-import org.hswebframework.ezorm.rdb.meta.parser.MysqlTableMetaParser;
-import org.hswebframework.ezorm.rdb.meta.parser.OracleTableMetaParser;
-import org.hswebframework.ezorm.rdb.render.dialect.H2RDBDatabaseMetaData;
-import org.hswebframework.ezorm.rdb.render.dialect.MysqlRDBDatabaseMetaData;
-import org.hswebframework.ezorm.rdb.render.dialect.OracleRDBDatabaseMetaData;
+import org.hswebframework.ezorm.rdb.meta.parser.*;
+import org.hswebframework.ezorm.rdb.render.dialect.*;
 import org.hswebframework.ezorm.rdb.simple.SimpleDatabase;
 import org.hswebframework.expands.script.engine.DynamicScriptEngine;
 import org.hswebframework.expands.script.engine.DynamicScriptEngineFactory;
@@ -135,6 +131,15 @@ public class SystemInitializeAutoConfiguration implements CommandLineRunner, Bea
                 metaData = new OracleRDBDatabaseMetaData();
                 metaData.setParser(new OracleTableMetaParser(sqlExecutor));
                 break;
+            case postgresql:
+                metaData = new PGRDBDatabaseMetaData();
+                metaData.setParser(new PGSqlTableMetaParser(sqlExecutor));
+                break;
+            case sqlserver:
+            case jtds_sqlserver:
+                metaData = new MSSQLRDBDatabaseMetaData();
+                metaData.setParser(new SqlServer2012TableMetaParser(sqlExecutor));
+                break;
             case mysql:
                 String engine = environment.getProperty("mysql.engine");
                 if (StringUtils.hasText(engine)) {

+ 4 - 1
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/init/SystemInitialize.java

@@ -7,6 +7,7 @@ import org.hswebframework.ezorm.rdb.RDBTable;
 import org.hswebframework.ezorm.rdb.executor.SqlExecutor;
 import org.hswebframework.ezorm.rdb.meta.converter.ClobValueConverter;
 import org.hswebframework.ezorm.rdb.meta.converter.JSONValueConverter;
+import org.hswebframework.ezorm.rdb.meta.converter.NumberValueConverter;
 import org.hswebframework.ezorm.rdb.simple.wrapper.BeanWrapper;
 import org.hswebframework.expands.script.engine.DynamicScriptEngine;
 import org.hswebframework.expands.script.engine.DynamicScriptEngineFactory;
@@ -169,7 +170,9 @@ public class SystemInitialize {
                 .addColumn().name("major_version").alias(majorVersion).number(32).javaType(Integer.class).comment("主版本号").commit()
                 .addColumn().name("minor_version").alias(minorVersion).number(32).javaType(Integer.class).comment("次版本号").commit()
                 .addColumn().name("revision_version").alias(revisionVersion).number(32).javaType(Integer.class).comment("修订版").commit()
-                .addColumn().name("snapshot").number(1).javaType(Boolean.class).comment("是否快照版").commit()
+                .addColumn().name("snapshot").number(1).javaType(Boolean.class)
+                .custom(column -> column.setValueConverter(new NumberValueConverter(Boolean.class)))
+                .comment("是否快照版").commit()
                 .addColumn().name("comment").varchar(2000).comment("系统说明").commit()
                 .addColumn().name("website").varchar(2000).comment("系统网址").commit()
                 .addColumn().name("framework_version").notNull().alias(frameworkVersion).clob()

+ 1 - 1
hsweb-starter/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-framework</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 1 - 1
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/pom.xml

@@ -5,7 +5,7 @@
     <parent>
         <artifactId>hsweb-system-authorization</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 8 - 32
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/entity/authorization/DataAccessEntity.java

@@ -1,11 +1,19 @@
 package org.hswebframework.web.entity.authorization;
 
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
 import org.hswebframework.web.commons.entity.CloneableEntity;
 
 /**
  * @author zhouhao
  */
+@Getter
+@Setter
+@EqualsAndHashCode
 public class DataAccessEntity implements CloneableEntity {
+    private static final long serialVersionUID = 2198771924746804915L;
+
     private String action;
 
     private String describe;
@@ -14,38 +22,6 @@ public class DataAccessEntity implements CloneableEntity {
 
     private String config;
 
-    public String getAction() {
-        return this.action;
-    }
-
-    public void setAction(String action) {
-        this.action = action;
-    }
-
-    public String getDescribe() {
-        return this.describe;
-    }
-
-    public void setDescribe(String describe) {
-        this.describe = describe;
-    }
-
-    public String getType() {
-        return this.type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public String getConfig() {
-        return this.config;
-    }
-
-    public void setConfig(String config) {
-        this.config = config;
-    }
-
     @Override
     public DataAccessEntity clone() {
         DataAccessEntity target = new DataAccessEntity();

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

@@ -19,4 +19,6 @@ public class ParentPermission implements Entity {
     private String permission;
 
     private Set<String> actions;
+
+    private Set<String> preActions;
 }

+ 5 - 2
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/entity/authorization/SimplePermissionEntity.java

@@ -17,9 +17,9 @@ import java.util.stream.Collectors;
 @Setter
 @NoArgsConstructor
 public class SimplePermissionEntity extends SimpleGenericEntity<String> implements PermissionEntity {
-    private static final long serialVersionUID = -5505339187716888516L;
+    private static final long   serialVersionUID = -5505339187716888516L;
     @NotBlank
-    private String name;
+    private              String name;
 
     private String describe;
 
@@ -44,6 +44,9 @@ public class SimplePermissionEntity extends SimpleGenericEntity<String> implemen
         if (actions != null) {
             target.setActions(getActions().stream().map(ActionEntity::clone).collect(Collectors.toList()));
         }
+        if (parents != null) {
+            target.setParents(new ArrayList<>(getParents()));
+        }
         if (optionalFields != null) {
             target.setOptionalFields(getOptionalFields().stream().map(OptionalField::clone).collect(Collectors.toList()));
         }

+ 14 - 1
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/pom.xml

@@ -5,12 +5,25 @@
     <parent>
         <artifactId>hsweb-system-authorization</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>hsweb-system-authorization-local</artifactId>
 
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources/org</directory>
+                <filtering>false</filtering>
+            </resource>
+        </resources>
+    </build>
+
     <description>业务模块-权限管理本地实现</description>
     <dependencies>
         <dependency>

+ 92 - 28
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/src/main/java/org/hswebframework/web/service/authorization/simple/SimpleAuthorizationSettingService.java

@@ -16,6 +16,8 @@
  */
 package org.hswebframework.web.service.authorization.simple;
 
+import lombok.Getter;
+import lombok.Setter;
 import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.AuthenticationInitializeService;
 import org.hswebframework.web.authorization.Permission;
@@ -24,6 +26,7 @@ import org.hswebframework.web.authorization.simple.SimpleAuthentication;
 import org.hswebframework.web.authorization.simple.SimplePermission;
 import org.hswebframework.web.authorization.simple.SimpleRole;
 import org.hswebframework.web.authorization.simple.SimpleUser;
+import org.hswebframework.web.commons.entity.DataStatus;
 import org.hswebframework.web.commons.entity.TreeSupportEntity;
 import org.hswebframework.web.dao.authorization.AuthorizationSettingDao;
 import org.hswebframework.web.dao.authorization.AuthorizationSettingDetailDao;
@@ -358,17 +361,39 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
         return initPermission(detailList);
     }
 
+    @Getter
+    @Setter
+    static class ParentPermissionDetail extends ParentPermission {
+        private String sourcePermission;
+
+        public static Stream<ParentPermissionDetail> of(PermissionEntity entity) {
+            if (isEmpty(entity.getParents())) {
+                return Stream.empty();
+            }
+            return entity.getParents()
+                    .stream()
+                    .filter(Objects::nonNull)
+                    .map(parent -> {
+                        ParentPermissionDetail permissionDetail = new ParentPermissionDetail();
+                        permissionDetail.setActions(parent.getActions());
+                        permissionDetail.setSourcePermission(entity.getId());
+                        permissionDetail.setPreActions(parent.getPreActions());
+                        permissionDetail.setPermission(parent.getPermission());
+                        return permissionDetail;
+                    });
+        }
+    }
+
     private List<Permission> initPermission(List<AuthorizationSettingDetailEntity> detailList) {
         //权限id集合
-        List<String> permissionIds = detailList.stream()
-                .map(AuthorizationSettingDetailEntity::getPermissionId)
-                .distinct()
-                .collect(Collectors.toList());
+//        List<String> permissionIds = detailList.stream()
+//                .map(AuthorizationSettingDetailEntity::getPermissionId)
+//                .distinct()
+//                .collect(Collectors.toList());
         //权限信息缓存
-        Map<String, PermissionEntity> permissionEntityCache =
-                permissionService.selectByPk(permissionIds)
-                        .stream()
-                        .collect(Collectors.toMap(PermissionEntity::getId, Function.identity()));
+        Map<String, PermissionEntity> permissionEntityCache = permissionService.select()
+                .stream()
+                .collect(Collectors.toMap(PermissionEntity::getId, Function.identity()));
 
         //防止越权
         detailList = detailList.stream().filter(detail -> {
@@ -406,15 +431,14 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
                 .collect(Collectors.groupingBy(AuthorizationSettingDetailEntity::getPermissionId));
 
         List<Permission> permissions = new ArrayList<>();
-        //获取关联的权限信息
-        Map<String, List<ParentPermission>> parentsPermissions = permissionEntityCache.values().stream()
-                .map(PermissionEntity::getParents)
-                .filter(Objects::nonNull)
-                .flatMap(Collection::stream)
-                .collect(Collectors.groupingBy(ParentPermission::getPermission));
 
         settings.forEach((permissionId, details) -> {
+            PermissionEntity entity = permissionEntityCache.get(permissionId);
+            if (entity == null || !DataStatus.STATUS_ENABLED.equals(entity.getStatus())) {
+                return;
+            }
             SimplePermission permission = new SimplePermission();
+            permission.setName(entity.getName());
             permission.setId(permissionId);
             Set<String> actions = new HashSet<>();
             Set<DataAccessConfig> dataAccessConfigs = new HashSet<>();
@@ -427,43 +451,83 @@ public class SimpleAuthorizationSettingService extends GenericEntityService<Auth
                     dataAccessConfigs.clear();
                 }
                 // actions
-                if (null != detail.getActions()) {
+                if (isNotEmpty(detail.getActions())) {
                     actions.addAll(detail.getActions());
                 }
                 // 数据权限控制配置
-                if (null != detail.getDataAccesses()) {
+                if (isNotEmpty(detail.getDataAccesses())) {
                     dataAccessConfigs.addAll(detail.getDataAccesses()
                             .stream()
                             .map(dataAccessFactory::create)
                             .collect(Collectors.toSet()));
                 }
             }
-            //是否有其他权限关联了此权限
-            List<ParentPermission> parents = parentsPermissions.get(permissionId);
-            if (parents != null) {
-                actions.addAll(parents.stream()
-                        .map(ParentPermission::getActions)
-                        .filter(Objects::nonNull)
-                        .flatMap(Collection::stream)
-                        .collect(Collectors.toSet()));
-                parentsPermissions.remove(permissionId);
-            }
+
             permission.setActions(actions);
             permission.setDataAccesses(dataAccessConfigs);
             permissions.add(permission);
         });
 
-        //关联权限
+        /*=============================进行关联权限处理============================================*/
+        Map<String, Permission> permissionCache = permissions.stream()
+                .collect(Collectors.toMap(Permission::getId, Function.identity()));
+
+        //获取关联的权限信息
+        Map<String, List<ParentPermissionDetail>> parentsPermissions = permissionEntityCache
+                .values()
+                .stream()
+                .flatMap(ParentPermissionDetail::of)
+                .collect(Collectors.groupingBy(ParentPermission::getPermission));
+
+        //判断是否满足关联权限的条件
+        Predicate<ParentPermissionDetail> preActionPredicate = parent -> {
+            if (isEmpty(parent.getActions())) {
+                return false;
+            }
+            if (isEmpty(parent.getPreActions())) {
+                return true;
+            }
+            Permission source = permissionCache.get(parent.getSourcePermission());
+            return source != null && source.getActions().containsAll(parent.getPreActions());
+        };
+
+        for (Permission permission : permissions) {
+            //有其他权限关联了此权限
+            List<ParentPermissionDetail> parents = parentsPermissions.get(permission.getId());
+            if (parents != null) {
+                //添加action
+                permission.getActions()
+                        .addAll(parents.stream()
+                                .filter(preActionPredicate)
+                                .map(ParentPermission::getActions)
+                                .flatMap(Collection::stream)
+                                .collect(Collectors.toSet()));
+                //删除被合并的权限配置
+                parentsPermissions.remove(permission.getId());
+            }
+        }
+        //没有赋予被关联的权限时,直接关联权限
         parentsPermissions.forEach((per, all) -> {
+            PermissionEntity entity = permissionEntityCache.get(per);
+            if (entity == null || !DataStatus.STATUS_ENABLED.equals(entity.getStatus())) {
+                return;
+            }
             SimplePermission permission = new SimplePermission();
             permission.setId(per);
+            permission.setName(entity.getName());
             permission.setActions(all.stream()
+                    .filter(preActionPredicate)
                     .map(ParentPermission::getActions)
-                    .filter(Objects::nonNull)
                     .flatMap(Collection::stream)
                     .collect(Collectors.toSet()));
+            if (isEmpty(permission.getActions())) {
+                return;
+            }
             permissions.add(permission);
         });
+        parentsPermissions.clear();
+        permissionCache.clear();
+
         return permissions;
     }
 

+ 9 - 0
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-local/src/main/resources/hsweb-module.json

@@ -0,0 +1,9 @@
+{
+  "groupId": "${project.groupId}",
+  "artifactId": "${project.artifactId}",
+  "path": "hsweb-system/hsweb-system-authorization",
+  "gitCommitHash": "${git.commit.hash}",
+  "gitRepository": "http://github.com/hs-web/hsweb-framework",
+  "version": "${project.version}",
+  "comment": "权限管理"
+}

+ 1 - 1
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/pom.xml

@@ -22,7 +22,7 @@
     <parent>
         <artifactId>hsweb-system-authorization</artifactId>
         <groupId>org.hswebframework.web</groupId>
-        <version>3.0.5</version>
+        <version>3.0.6</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 

+ 39 - 40
hsweb-system/hsweb-system-authorization/hsweb-system-authorization-starter/src/main/resources/hsweb-starter.js

@@ -41,49 +41,49 @@ var JDBCType = java.sql.JDBCType;
 function install(context) {
     var database = context.database;
     database.createOrAlter("s_user")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
         .addColumn().name("name").varchar(128).notNull().comment("姓名").commit()
         .addColumn().name("username").varchar(128).notNull().comment("用户名").commit()
         .addColumn().name("password").varchar(128).notNull().comment("密码").commit()
         .addColumn().name("salt").varchar(128).notNull().comment("密码盐").commit()
         .addColumn().name("status").number(4).notNull().comment("用户状态").commit()
-        .addColumn().name("last_login_ip").varchar(128).comment("上一次登录的ip地址").commit()
-        .addColumn().name("last_login_time").number(32).comment("上一次登录时间").commit()
-        .addColumn().name("creator_id").varchar(32).comment("创建者ID").commit()
-        .addColumn().name("create_time").number(32).notNull().comment("创建时间").commit()
+        .addColumn().name("last_login_ip").alias("lasLoginIp").varchar(128).comment("上一次登录的ip地址").commit()
+        .addColumn().name("last_login_time").alias("lastLoginTime").number(32).comment("上一次登录时间").commit()
+        .addColumn().name("creator_id").alias("creatorId").varchar(32).comment("创建者ID").commit()
+        .addColumn().name("create_time").alias("createTime").number(32).notNull().comment("创建时间").commit()
         //用户名唯一索引
         .index().name("idx_user_username").column("username").unique().commit()
         .comment("用户表").commit();
 
     database.createOrAlter("s_role")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
         .addColumn().name("name").varchar(128).notNull().comment("角色名称").commit()
         .addColumn().name("describe").varchar(128).comment("说明").commit()
         .addColumn().name("status").number(4).notNull().comment("状态").commit()
         .comment("角色表").commit();
 
     database.createOrAlter("s_permission")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
         .addColumn().name("name").varchar(128).notNull().comment("角色名称").commit()
         .addColumn().name("describe").varchar(128).comment("说明").commit()
         .addColumn().name("status").number(4).notNull().comment("状态").commit()
         .addColumn().name("actions").clob().notNull().comment("可选操作(按钮)").commit()
-        .addColumn().name("spt_da_types").clob().comment("支持的数据权限类型").commit()
-        .addColumn().name("optional_fields").clob().comment("可选字段").commit()
+        .addColumn().name("spt_da_types").alias("supportDataAccessTypes").clob().comment("支持的数据权限类型").commit()
+        .addColumn().name("optional_fields").alias("optionalFields").clob().comment("可选字段").commit()
         .addColumn().name("parents").clob().comment("关联其他权限").commit()
         .addColumn().name("type").varchar(128).comment("类型").commit()
         .comment("权限表").commit();
 
     database.createOrAlter("s_permission_role")
-        .addColumn().name("role_id").varchar(32).notNull().comment("角色ID").commit()
-        .addColumn().name("permission_id").varchar(32).notNull().comment("权限ID").commit()
+        .addColumn().name("role_id").alias("roleId").varchar(32).notNull().comment("角色ID").commit()
+        .addColumn().name("permission_id").alias("permissionId").varchar(32).notNull().comment("权限ID").commit()
         .addColumn().name("actions").clob().comment("可选操作").commit()
-        .addColumn().name("data_access").clob().comment("数据级控制配置").commit()
+        .addColumn().name("data_access").alias("dataAccess").clob().comment("数据级控制配置").commit()
         .comment("权限与角色关联表").commit();
 
     database.createOrAlter("s_user_role")
-        .addColumn().name("role_id").varchar(32).notNull().comment("角色ID").commit()
-        .addColumn().name("user_id").varchar(32).notNull().comment("用户ID").commit()
+        .addColumn().name("role_id").alias("roleId").varchar(32).notNull().comment("角色ID").commit()
+        .addColumn().name("user_id").alias("userId").varchar(32).notNull().comment("用户ID").commit()
         .index().name("idx_ur_user_id").column("user_id").commit()
         .index().name("idx_ur_role_id").column("role_id").commit()
 
@@ -91,9 +91,9 @@ function install(context) {
 
     //权限设置
     database.createOrAlter("s_autz_setting")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
         .addColumn().name("type").varchar(32).notNull().comment("权限类型").commit()
-        .addColumn().name("setting_for").varchar(64).notNull().comment("设置给谁").commit()
+        .addColumn().name("setting_for").alias("settingFor").varchar(64).notNull().comment("设置给谁").commit()
         .addColumn().name("describe").varchar(256).comment("备注").commit()
         .addColumn().name("status").number(4, 0).comment("设置给谁").commit()
 
@@ -101,25 +101,25 @@ function install(context) {
         .comment("权限设置表").commit();
 
     database.createOrAlter("s_autz_detail")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
-        .addColumn().name("permission_id").varchar(32).notNull().comment("权限ID").commit()
-        .addColumn().name("setting_id").varchar(64).notNull().comment("设置ID").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("permission_id").alias("permissionId").varchar(32).notNull().comment("权限ID").commit()
+        .addColumn().name("setting_id").alias("settingId").varchar(64).notNull().comment("设置ID").commit()
         .addColumn().name("actions").clob().comment("可操作类型").commit()
-        .addColumn().name("data_accesses").clob().comment("数据权限控制").commit()
+        .addColumn().name("data_accesses").alias("dataAccesses").clob().comment("数据权限控制").commit()
         .addColumn().name("status").number(4, 0).comment("状态").commit()
         .addColumn().name("priority").number(32, 0).comment("优先级").commit()
-        .addColumn().name("is_merge").number(4, 0).comment("是否合并").commit()
+        .addColumn().name("is_merge").alias("merge").number(4, 0).comment("是否合并").commit()
         .index().name("idx_ad_setting_id").column("setting_id").commit()
 
         .comment("权限设置详情表").commit();
 
     database.createOrAlter("s_autz_menu")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
-        .addColumn().name("parent_id").varchar(32).comment("父级ID").commit()
-        .addColumn().name("menu_id").varchar(32).notNull().comment("菜单ID").commit()
-        .addColumn().name("setting_id").varchar(64).notNull().comment("设置ID").commit()
-        .addColumn().name("path").varchar(2048).notNull().comment("树编码").commit()
-        .addColumn().name("sort_index").number(32).comment("树编码").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("parent_id").alias("parentId").varchar(32).comment("父级ID").commit()
+        .addColumn().name("menu_id").alias("menuId").varchar(32).notNull().comment("菜单ID").commit()
+        .addColumn().name("setting_id").alias("settingId").varchar(64).notNull().comment("设置ID").commit()
+        .addColumn().name("path").varchar(512).notNull().comment("树编码").commit()
+        .addColumn().name("sort_index").alias("sortIndex").number(32).comment("树编码").commit()
         .addColumn().name("status").number(4, 0).comment("状态").commit()
         .addColumn().name("level").number(32, 0).comment("树深度").commit()
         .addColumn().name("config").clob().comment("其他配置").commit()
@@ -130,19 +130,18 @@ function install(context) {
 
     // 菜单
     database.createOrAlter("s_menu")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
         .addColumn().name("name").varchar(64).notNull().comment("名称").commit()
-        .addColumn().name("parent_id").varchar(32).comment("父级ID").commit()
-        .addColumn().name("permission_id").varchar(2048).comment("权限ID").commit()
-        .addColumn().name("path").varchar(2048).notNull().comment("树编码").commit()
-        .addColumn().name("sort_index").number(32).comment("树编码").commit()
+        .addColumn().name("parent_id").alias("parentId").varchar(32).comment("父级ID").commit()
+        .addColumn().name("permission_id").alias("permissionId").varchar(2048).comment("权限ID").commit()
+        .addColumn().name("path").varchar(512).notNull().comment("树编码").commit()
+        .addColumn().name("sort_index").alias("sortIndex").number(32).comment("树编码").commit()
         .addColumn().name("describe").varchar(128).comment("备注").commit()
         .addColumn().name("url").varchar(2000).comment("URL").commit()
         .addColumn().name("icon").varchar(512).comment("图标").commit()
         .addColumn().name("status").alias("status").comment("状态").jdbcType(java.sql.JDBCType.DECIMAL).length(4, 0).commit()
         .index().name("idx_menu_path").column("path").commit()
         .index().name("idx_menu_parent_id").column("parent_id").commit()
-
         .comment("系统菜单表").commit()
 
     database.createOrAlter("s_menu_group")
@@ -151,7 +150,7 @@ function install(context) {
         .addColumn().name("name").alias("name").comment("分组名称").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("describe").alias("describe").comment("分组描述").jdbcType(java.sql.JDBCType.VARCHAR).length(64).commit()
         .addColumn().name("default_group").alias("defaultGroup").comment("是否默认").jdbcType(java.sql.JDBCType.DECIMAL).length(4, 0).commit()
-        .addColumn().name("path").alias("path").comment("树路径").jdbcType(java.sql.JDBCType.VARCHAR).length(4000).commit()
+        .addColumn().name("path").alias("path").comment("树路径").jdbcType(java.sql.JDBCType.VARCHAR).length(512).commit()
         .addColumn().name("parent_id").alias("parentId").comment("父级id").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("level").alias("level").comment("树层级").jdbcType(java.sql.JDBCType.DECIMAL).length(32, 0).commit()
         .addColumn().name("sort_index").alias("sortIndex").comment("排序序号").jdbcType(java.sql.JDBCType.DECIMAL).length(32, 0).commit()
@@ -162,7 +161,7 @@ function install(context) {
         .addColumn().name("u_id").alias("id").comment("ID").jdbcType(java.sql.JDBCType.VARCHAR).length(32).primaryKey().commit()
         .addColumn().name("menu_id").alias("menuId").comment("菜单id").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("group_id").alias("groupId").comment("分组id").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
-        .addColumn().name("path").alias("path").comment("树结构编码").jdbcType(java.sql.JDBCType.VARCHAR).length(4000).commit()
+        .addColumn().name("path").alias("path").comment("树结构编码").jdbcType(java.sql.JDBCType.VARCHAR).length(512).commit()
         .addColumn().name("parent_id").alias("parentId").comment("父级id").jdbcType(java.sql.JDBCType.VARCHAR).length(32).commit()
         .addColumn().name("level").alias("level").comment("树层级").jdbcType(java.sql.JDBCType.DECIMAL).length(32, 0).commit()
         .addColumn().name("sort_index").alias("sortIndex").comment("排序序号").jdbcType(java.sql.JDBCType.DECIMAL).length(32, 0).commit()
@@ -170,15 +169,15 @@ function install(context) {
         .comment("菜单分组关联").commit();
 
     database.createOrAlter("s_user_setting")
-        .addColumn().name("u_id").varchar(32).notNull().primaryKey().comment("uid").commit()
+        .addColumn().name("u_id").alias("id").varchar(32).notNull().primaryKey().comment("uid").commit()
         .addColumn().name("name").varchar(128).comment("配置名称").commit()
         .addColumn().name("describe").varchar(512).comment("说明").commit()
-        .addColumn().name("user_id").varchar(32).notNull().comment("用户ID").commit()
+        .addColumn().name("user_id").alias("userId").varchar(32).notNull().comment("用户ID").commit()
         .addColumn().name("key").varchar(128).notNull().comment("配置标识").commit()
         .addColumn().name("setting").clob().comment("配置内容").commit()
-        .addColumn().name("setting_id").varchar(32).notNull().comment("自定义配置id").commit()
-        .addColumn().name("create_time").datetime().notNull().comment("创建时间").commit()
-        .addColumn().name("update_time").datetime().comment("创建时间").commit()
+        .addColumn().name("setting_id").alias("settingId").varchar(32).notNull().comment("自定义配置id").commit()
+        .addColumn().name("create_time").alias("createTime").datetime().notNull().comment("创建时间").commit()
+        .addColumn().name("update_time").alias("updateTime").datetime().comment("创建时间").commit()
         .index().name("idx_uset_user_id").column("user_id").commit()
         .index().name("idx_uset_user_id_key").column("user_id").column("key").commit()
         .index().name("idx_uset_user_id_key_setting").column("user_id").column("key").column("setting_id").commit()

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


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません