Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

zsl 2 лет назад
Родитель
Сommit
839018aea8
100 измененных файлов с 1894 добавлено и 697 удалено
  1. 15 7
      tr-dependencies/pom.xml
  2. 1 1
      tr-framework/src/main/java/cn/tr/core/enums/CreateEnum.java
  3. 47 0
      tr-framework/src/main/java/cn/tr/core/utils/ValidationUtils.java
  4. 1 1
      tr-modules/pom.xml
  5. 5 0
      tr-modules/tr-module-export/pom.xml
  6. 1 1
      tr-modules/tr-module-gen/src/main/resources/backend/PO.java.btl
  7. 1 2
      tr-modules/tr-module-gen/src/main/resources/backend/QueryDTO.java.btl
  8. 2 3
      tr-modules/tr-module-gen/src/main/resources/backend/ServiceImpl.java.btl
  9. 1 2
      tr-modules/tr-module-quartz/pom.xml
  10. 0 18
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/QuartzMqConfig.java
  11. 0 45
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/consumer/QuartzConsumer.java
  12. 0 22
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzDelMessage.java
  13. 0 24
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobChangeStatusMessage.java
  14. 0 21
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobRefreshMessage.java
  15. 0 39
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/producer/QuartzProducer.java
  16. 2 0
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/controller/SysJobController.java
  17. 3 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/dto/SysJobDTO.java
  18. 1 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/dto/SysJobQueryDTO.java
  19. 0 13
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/ISysJobService.java
  20. 69 36
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/impl/SysJobServiceImpl.java
  21. 1 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/jobLog/dto/SysJobLogQueryDTO.java
  22. 0 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/jobLog/service/impl/SysJobLogServiceImpl.java
  23. 10 4
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/utils/ScheduleUtils.java
  24. 7 2
      tr-modules/tr-module-system/pom.xml
  25. 0 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/constant/dto/SysConstantConfigQueryDTO.java
  26. 0 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/constant/service/impl/SysConstantConfigServiceImpl.java
  27. 0 15
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/SysMqConfig.java
  28. 0 28
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/consumer/sms/SmsChannelRefreshConsumer.java
  29. 0 42
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/consumer/sms/SmsConsumer.java
  30. 0 29
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/consumer/sms/SmsTemplateRefreshConsumer.java
  31. 0 22
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/message/sms/SmsChannelRefreshMessage.java
  32. 0 23
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/message/sms/SmsTemplateRefreshMessage.java
  33. 0 30
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/producer/sms/SmsProducer.java
  34. 0 45
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/producer/sms/SmsSupplier.java
  35. 0 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/file/package-info.java
  36. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysLogQueryDTO.java
  37. 24 11
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/monitor/controller/SysUserOnlineController.java
  38. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyQueryDTO.java
  39. 4 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CurrentUserController.java
  40. 0 15
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/properties/TrOAuth2Properties.java
  41. 0 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/properties/TrOAuth2PswClientProperties.java
  42. 13 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java
  43. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/controller/SysSmsTempController.java
  44. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SmsSendMessageDTO.java
  45. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsChannelDTO.java
  46. 8 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsLogDTO.java
  47. 2 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsLogQueryDTO.java
  48. 3 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempDTO.java
  49. 4 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempQueryDTO.java
  50. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/po/SysSmsLogPO.java
  51. 0 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/po/SysSmsTempPO.java
  52. 7 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/repository/SysSmsLogRepository.java
  53. 8 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/repository/SysSmsTempRepository.java
  54. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/ISmsSendService.java
  55. 31 7
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SmsSendServiceImpl.java
  56. 8 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsChannelServiceImpl.java
  57. 2 15
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsLogServiceImpl.java
  58. 25 20
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsTempServiceImpl.java
  59. 86 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/FileDownloadController.java
  60. 62 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/StorageFileController.java
  61. 90 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageConfigController.java
  62. 80 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageRecordController.java
  63. 23 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/FileUploadDTO.java
  64. 54 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageConfigDTO.java
  65. 24 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageConfigQueryDTO.java
  66. 53 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageRecordDTO.java
  67. 25 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageRecordQueryDTO.java
  68. 37 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/mapper/SysStorageConfigMapper.java
  69. 28 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/mapper/SysStorageRecordMapper.java
  70. 65 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/po/SysStorageConfigPO.java
  71. 34 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/po/SysStorageFilePO.java
  72. 56 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/po/SysStorageRecordPO.java
  73. 20 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/properties/TrStorageProperties.java
  74. 16 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/repository/SysStorageConfigRepository.java
  75. 16 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/repository/SysStorageFileRepository.java
  76. 23 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/repository/SysStorageRecordRepository.java
  77. 50 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/IStorageFileService.java
  78. 75 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/ISysStorageConfigService.java
  79. 71 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/ISysStorageRecordService.java
  80. 46 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/DbClientImpl.java
  81. 138 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/StorageFileServiceImpl.java
  82. 184 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/SysStorageConfigServiceImpl.java
  83. 99 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/SysStorageRecordServiceImpl.java
  84. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantController.java
  85. 21 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantPackageController.java
  86. 10 12
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantAddDTO.java
  87. 10 9
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantCommonDTO.java
  88. 21 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageMenuAssignDTO.java
  89. 4 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantPackageMenuService.java
  90. 24 14
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageMenuServiceImpl.java
  91. 5 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java
  92. 9 13
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java
  93. 2 12
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysRoleController.java
  94. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalDTO.java
  95. 2 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalQueryDTO.java
  96. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysPortalPO.java
  97. 2 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysRolePO.java
  98. 3 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPortalMenuService.java
  99. 5 6
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleMenuService.java
  100. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysMenuServiceImpl.java

+ 15 - 7
tr-dependencies/pom.xml

@@ -70,6 +70,8 @@
         <stream-rabbit.version>3.2.6</stream-rabbit.version>
 
         <bus-rabbit.version>3.1.2</bus-rabbit.version>
+
+        <easy-captcha.version>1.6.2</easy-captcha.version>
     </properties>
 
 
@@ -261,6 +263,12 @@
                 <version>${javassist.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>com.github.whvcse</groupId>
+                <artifactId>easy-captcha</artifactId>
+                <version>${easy-captcha.version}</version>
+            </dependency>
+
             <!--flink 组件-->
             <dependency>
                 <groupId>org.apache.flink</groupId>
@@ -399,6 +407,13 @@
                 <version>${revision}</version>
             </dependency>
 
+            <!--导入导出-->
+            <dependency>
+                <groupId>cn.tr</groupId>
+                <artifactId>tr-spring-boot-starter-plugin-import-export</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
             <!--websocket插件-->
             <dependency>
                 <groupId>cn.tr</groupId>
@@ -441,13 +456,6 @@
                 <version>${revision}</version>
             </dependency>
 
-            <!--消息总线模块-->
-            <dependency>
-                <groupId>cn.tr</groupId>
-                <artifactId>tr-spring-boot-starter-plugin-bus</artifactId>
-                <version>${revision}</version>
-            </dependency>
-
             <!--短信模块-->
             <dependency>
                 <groupId>cn.tr</groupId>

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/enums/CreateEnum.java → tr-framework/src/main/java/cn/tr/core/enums/CreateEnum.java

@@ -1,4 +1,4 @@
-package cn.tr.module.sys.user.enums;
+package cn.tr.core.enums;
 
 /**
  * @ClassName : CreateEnum

+ 47 - 0
tr-framework/src/main/java/cn/tr/core/utils/ValidationUtils.java

@@ -0,0 +1,47 @@
+package cn.tr.core.utils;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.util.StringUtils;
+
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.Validator;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+/**
+ * 校验工具类
+ *
+ * @author 芋道源码
+ */
+public class ValidationUtils {
+
+    private static final Pattern PATTERN_MOBILE = Pattern.compile("^(?:(?:\\+|00)86)?1(?:(?:3[\\d])|(?:4[0,1,4-9])|(?:5[0-3,5-9])|(?:6[2,5-7])|(?:7[0-8])|(?:8[\\d])|(?:9[0-3,5-9]))\\d{8}$");
+
+    private static final Pattern PATTERN_URL = Pattern.compile("^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]");
+
+    private static final Pattern PATTERN_XML_NCNAME = Pattern.compile("[a-zA-Z_][\\-_.0-9_a-zA-Z$]*");
+
+    public static boolean isMobile(String mobile) {
+        return StringUtils.hasText(mobile)
+                && PATTERN_MOBILE.matcher(mobile).matches();
+    }
+
+    public static boolean isURL(String url) {
+        return StringUtils.hasText(url)
+                && PATTERN_URL.matcher(url).matches();
+    }
+
+    public static boolean isXmlNCName(String str) {
+        return StringUtils.hasText(str)
+                && PATTERN_XML_NCNAME.matcher(str).matches();
+    }
+
+    public static void validate(Validator validator, Object object, Class<?>... groups) {
+        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
+        if (CollUtil.isNotEmpty(constraintViolations)) {
+            throw new ConstraintViolationException(constraintViolations);
+        }
+    }
+
+}

+ 1 - 1
tr-modules/pom.xml

@@ -15,7 +15,7 @@
     <modules>
         <module>tr-module-system</module>
         <module>tr-module-gen</module>
-        <module>tr-module-export</module>
+        <module>tr-module-import-export</module>
         <module>tr-module-quartz</module>
     </modules>
 

+ 5 - 0
tr-modules/tr-module-export/pom.xml

@@ -20,5 +20,10 @@
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-eventbus</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>cn.tr</groupId>
+            <artifactId>tr-spring-boot-starter-plugin-biz-excel</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 1 - 1
tr-modules/tr-module-gen/src/main/resources/backend/PO.java.btl

@@ -17,7 +17,7 @@ import java.util.*;
  * @date ${genTime}
  **/
 @Data
-@TableName("${dbTable}")
+@TableName(value="${dbTable}",autoResultMap = true)
 @EqualsAndHashCode(callSuper = true)
 @ToString
 public class ${className}PO extends <% if(isTenant) { %>TenantPO<% } else { %>BasePO<% } %> {

+ 1 - 2
tr-modules/tr-module-gen/src/main/resources/backend/QueryDTO.java.btl

@@ -4,7 +4,6 @@ import lombok.ToString;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
 import java.util.*;
 /**
  * ${functionName}查询参数
@@ -20,7 +19,7 @@ public class ${className}QueryDTO  {
     <% for(var i = 0; i < configList.~size; i++) { %>
     <% if(configList[i].queryWhether!=null && configList[i].queryWhether ) { %>
     @ApiModelProperty(value = "${configList[i].fieldRemark}", position = ${i + 1})
-    private <% if(configList[i].queryType == "BETWEEN"){ %>BetweenQuery<${configList[i].fieldJavaType}><% }else { %>${configList[i].fieldJavaType}<%}%> ${configList[i].fieldNameCamelCase};
+    private <% if(configList[i].queryType == "BETWEEN"){ %>List<${configList[i].fieldJavaType}><% }else { %>${configList[i].fieldJavaType}<%}%> ${configList[i].fieldNameCamelCase};
 
     <% } %>
     <% } %>

+ 2 - 3
tr-modules/tr-module-gen/src/main/resources/backend/ServiceImpl.java.btl

@@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.*;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
 import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import ${packageName}.${backendModuleName}.${busName}.repository.${className}Repository;
@@ -64,8 +63,8 @@ query.get${configList[i].fieldNameCamelCaseFirstUpper}())
                         .le(Objects.nonNull(query.get${configList[i].fieldNameCamelCaseFirstUpper}()),${className}PO::get${configList[i].fieldNameCamelCaseFirstUpper},query.get${configList[i].fieldNameCamelCaseFirstUpper}())
                         <% }  %>
                         <% if(configList[i].queryType == "BETWEEN"){  %>
-                        .le(Objects.nonNull(query.get${configList[i].fieldNameCamelCaseFirstUpper}())&&Objects.nonNull(query.get${configList[i].fieldNameCamelCaseFirstUpper}().getMax()),${className}PO::get${configList[i].fieldNameCamelCaseFirstUpper},query.get${configList[i].fieldNameCamelCaseFirstUpper}().getMax())
-                        .ge(Objects.nonNull(query.get${configList[i].fieldNameCamelCaseFirstUpper}())&&Objects.nonNull(query.get${configList[i].fieldNameCamelCaseFirstUpper}().getMin()),${className}PO::get${configList[i].fieldNameCamelCaseFirstUpper},query.get${configList[i].fieldNameCamelCaseFirstUpper}().getMin())
+                        .le(CollectionUtil.isNotEmpty(query.get${configList[i].fieldNameCamelCaseFirstUpper}()),${className}PO::get${configList[i].fieldNameCamelCaseFirstUpper},CollectionUtil.query.get${configList[i].fieldNameCamelCaseFirstUpper}(),0))
+                        .ge(CollectionUtil.size(query.get${configList[i].fieldNameCamelCaseFirstUpper}())>1,${className}PO::get${configList[i].fieldNameCamelCaseFirstUpper},CollectionUtil.get(query.get${configList[i].fieldNameCamelCaseFirstUpper}(),1))
                         <% }  %>
                     <% }  %>
                     <% }  %>

+ 1 - 2
tr-modules/tr-module-quartz/pom.xml

@@ -53,9 +53,8 @@
 
         <dependency>
             <groupId>cn.tr</groupId>
-            <artifactId>tr-spring-boot-starter-plugin-bus</artifactId>
+            <artifactId>tr-spring-boot-starter-plugin-eventbus</artifactId>
         </dependency>
-
         <!-- 定时任务 -->
         <!-- 引入 Quartz 依赖-->
         <dependency>

+ 0 - 18
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/QuartzMqConfig.java

@@ -1,18 +0,0 @@
-package cn.tr.module.quartz.core.mq;
-
-import cn.tr.module.quartz.core.mq.message.job.QuartzDelMessage;
-import cn.tr.module.quartz.core.mq.message.job.QuartzJobChangeStatusMessage;
-import cn.tr.module.quartz.core.mq.message.job.QuartzJobRefreshMessage;
-import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @ClassName : QuartzMqConfig
- * @Description :
- * @Author : LF
- * @Date: 2023年05月06日
- */
-@Configuration
-@RemoteApplicationEventScan(basePackageClasses = {QuartzDelMessage.class, QuartzJobRefreshMessage.class, QuartzJobChangeStatusMessage.class})
-public class QuartzMqConfig {
-}

+ 0 - 45
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/consumer/QuartzConsumer.java

@@ -1,45 +0,0 @@
-package cn.tr.module.quartz.core.mq.consumer;
-
-import cn.tr.module.quartz.core.mq.message.job.QuartzDelMessage;
-import cn.tr.module.quartz.core.mq.message.job.QuartzJobChangeStatusMessage;
-import cn.tr.module.quartz.core.mq.message.job.QuartzJobRefreshMessage;
-import cn.tr.module.quartz.exception.TaskException;
-import cn.tr.module.quartz.job.dto.SysJobDTO;
-import cn.tr.module.quartz.job.service.ISysJobService;
-import lombok.AllArgsConstructor;
-import org.quartz.SchedulerException;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.event.EventListener;
-
-import java.util.Collection;
-
-/**
- * @ClassName : QuartzConsumer
- * @Description :
- * @Author : LF
- * @Date: 2023年05月06日
- */
-@Configuration
-@AllArgsConstructor
-public class QuartzConsumer {
-    private final ISysJobService jobService;
-    @EventListener
-    public void quartzDelListener(QuartzDelMessage message) throws SchedulerException {
-        Collection<SysJobDTO> jobs = message.getJobs();
-        for (SysJobDTO job : jobs) {
-            jobService.delCacheJob(job);
-        }
-
-    }
-
-    @EventListener
-    public void quartRefreshListener(QuartzJobRefreshMessage message) throws TaskException, SchedulerException {
-        String jobId = message.getJobId();
-        jobService.refreshCacheJob(jobId);
-    }
-
-    @EventListener
-    public void quartChangeStatusListener(QuartzJobChangeStatusMessage message) throws SchedulerException {
-        jobService.changeStatus(message.getJobId(),message.getStatus());
-    }
-}

+ 0 - 22
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzDelMessage.java

@@ -1,22 +0,0 @@
-package cn.tr.module.quartz.core.mq.message.job;
-
-import cn.tr.module.quartz.job.dto.SysJobDTO;
-import lombok.Getter;
-import org.springframework.cloud.bus.event.RemoteApplicationEvent;
-import java.util.*;
-/**
- * @ClassName : QuartzJobRefreshMessage
- * @Description : 任务调度刷新
- * @Author : LF
- * @Date: 2023年05月06日
- */
-
-public class QuartzDelMessage extends RemoteApplicationEvent {
-    @Getter
-    private Collection<SysJobDTO> jobs;
-
-    public QuartzDelMessage(Object source,Collection<SysJobDTO> jobs, String originService, String destinationService) {
-        super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
-        this.jobs=jobs;
-    }
-}

+ 0 - 24
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobChangeStatusMessage.java

@@ -1,24 +0,0 @@
-package cn.tr.module.quartz.core.mq.message.job;
-
-import lombok.Getter;
-import org.springframework.cloud.bus.event.RemoteApplicationEvent;
-
-/**
- * @ClassName : QuartzJobRefreshMessage
- * @Description : 任务调度刷新
- * @Author : LF
- * @Date: 2023年05月06日
- */
-
-public class QuartzJobChangeStatusMessage extends RemoteApplicationEvent {
-    @Getter
-    private String jobId;
-    @Getter
-    private String status;
-
-    public QuartzJobChangeStatusMessage(Object source, String jobId, String status,String originService, String destinationService) {
-        super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
-        this.jobId=jobId;
-        this.status=status;
-    }
-}

+ 0 - 21
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/message/job/QuartzJobRefreshMessage.java

@@ -1,21 +0,0 @@
-package cn.tr.module.quartz.core.mq.message.job;
-
-import lombok.Getter;
-import org.springframework.cloud.bus.event.RemoteApplicationEvent;
-
-/**
- * @ClassName : QuartzJobRefreshMessage
- * @Description : 任务调度刷新
- * @Author : LF
- * @Date: 2023年05月06日
- */
-
-public class QuartzJobRefreshMessage extends RemoteApplicationEvent {
-    @Getter
-    private String jobId;
-
-    public QuartzJobRefreshMessage(Object source,String jobId, String originService, String destinationService) {
-        super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
-        this.jobId=jobId;
-    }
-}

+ 0 - 39
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/core/mq/producer/QuartzProducer.java

@@ -1,39 +0,0 @@
-package cn.tr.module.quartz.core.mq.producer;
-
-import cn.tr.module.quartz.core.mq.message.job.QuartzDelMessage;
-import cn.tr.module.quartz.core.mq.message.job.QuartzJobChangeStatusMessage;
-import cn.tr.module.quartz.core.mq.message.job.QuartzJobRefreshMessage;
-import cn.tr.module.quartz.job.dto.SysJobDTO;
-import cn.tr.plugin.bus.AbstractBusProducer;
-import org.springframework.stereotype.Component;
-import java.util.*;
-/**
- * @ClassName : SmsProducer
- * @Description :
- * @Author : LF
- * @Date: 2023年04月25日
- */
-@Component
-public class QuartzProducer extends AbstractBusProducer {
-
-    /**
-     * 发送 {@link QuartzJobRefreshMessage} 消息
-     */
-    public void sendQuartzJobChangeStatusMessage(String jobId,String status) {
-        publishEvent(new QuartzJobChangeStatusMessage(this,jobId,status, getBusId(), selfDestinationService()));
-    }
-
-    /**
-     * 发送 {@link QuartzJobRefreshMessage} 消息
-     */
-    public void sendQuartzJobRefreshMessage(String jobId) {
-        publishEvent(new QuartzJobRefreshMessage(this,jobId, getBusId(), selfDestinationService()));
-    }
-
-    /**
-     * 发送 {@link QuartzDelMessage} 消息
-     */
-    public void sendQuartzDelMessage(Collection<SysJobDTO> jobs) {
-        publishEvent(new QuartzDelMessage(this,jobs, getBusId(), selfDestinationService()));
-    }
-}

+ 2 - 0
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/controller/SysJobController.java

@@ -1,6 +1,7 @@
 package cn.tr.module.quartz.job.controller;
 
 import cn.hutool.core.util.StrUtil;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.quartz.constant.Constants;
@@ -67,6 +68,7 @@ public class SysJobController extends BaseController{
     @SaCheckPermission("quartz:job:add")
     public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysJobDTO source) throws SchedulerException, TaskException {
         validateSource(source);
+        source.setJobGroup(CreateEnum.custom.name());
         return CommonResult.success(sysJobService.insertSysJob(source));
     }
 

+ 3 - 3
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/dto/SysJobDTO.java

@@ -40,11 +40,11 @@ public class SysJobDTO extends BaseDTO  {
     @NotBlank  (message = "cron执行表达式不能为空",groups = {Update.class,Insert.class})
     private String cronExpression;
 
-    @ApiModelProperty(value = "计划执行错误策略(1立即执行 2执行一次 3放弃执行)", position = 6,required = true)
-    @NotNull  (message = "计划执行错误策略不能为空",groups = {Update.class,Insert.class})
+    @ApiModelProperty(value = "补偿机制(1立即执行 2执行一次 3放弃执行)", position = 6,required = true)
+    @NotNull  (message = "补偿机制不能为空",groups = {Update.class,Insert.class})
     private String misfirePolicy;
 
-    @ApiModelProperty(value = "是否并发执行(0允许 1禁止)", position = 7,required = true)
+    @ApiModelProperty(value = "是否并发执行(1允许 0禁止)", position = 7,required = true)
     @NotNull  (message = "并发设置不能为空",groups = {Update.class,Insert.class})
     private Boolean concurrent;
 

+ 1 - 3
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/dto/SysJobQueryDTO.java

@@ -2,10 +2,8 @@ package cn.tr.module.quartz.job.dto;
 
 import lombok.ToString;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
-import java.util.*;
+
 /**
  * 定时任务调度表查询参数
  *

+ 0 - 13
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/ISysJobService.java

@@ -4,7 +4,6 @@ import cn.tr.module.quartz.exception.TaskException;
 import cn.tr.module.quartz.job.dto.SysJobDTO;
 import cn.tr.module.quartz.job.dto.SysJobQueryDTO;
 import org.quartz.SchedulerException;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 
@@ -81,18 +80,6 @@ public interface ISysJobService{
      */
     boolean changeStatus(String id, String status) throws SchedulerException;
 
-    /**
-     * 删除缓存中调度任务
-     * @param job 任务
-     */
-    void delCacheJob(SysJobDTO job) throws SchedulerException;
-
-    /**
-     * 更新缓存中调度任务
-     * @param jobId 任务id
-     */
-    void refreshCacheJob(String jobId) throws TaskException, SchedulerException;
-
     /**
      * 恢复任务
      * @param jobId 任务id

+ 69 - 36
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/service/impl/SysJobServiceImpl.java

@@ -1,12 +1,14 @@
 package cn.tr.module.quartz.job.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.quartz.constant.ScheduleConstants;
-import cn.tr.module.quartz.core.mq.producer.QuartzProducer;
 import cn.tr.module.quartz.exception.TaskException;
 import cn.tr.module.quartz.utils.CronUtils;
 import cn.tr.module.quartz.utils.ScheduleUtils;
+import cn.tr.plugin.eventbus.annotation.Subscribe;
+import cn.tr.plugin.eventbus.config.EventBus;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -38,8 +40,25 @@ import javax.annotation.PostConstruct;
 @Service
 @AllArgsConstructor
 public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> implements ISysJobService {
+    /**
+     * 任务更新主题
+     */
+    private final String JOB_UPDATE_TOPIC="/quartz/job/update";
+    /**
+     * 任务状态刷新主题
+     */
+    private final String JOB_STATUS_TOPIC="/quartz/job/status";
+    /**
+     * 任务新增主题
+     */
+    private final String JOB_INSERT_TOPIC="/quartz/job/insert";
+    /**
+     * 任务删除主题
+     */
+    private final String JOB_REMOVE_TOPIC="/quartz/job/remove";
+
     private final Scheduler scheduler;
-    private final QuartzProducer quartzProducer;
+    private final EventBus eventBus;
     @PostConstruct
     @Override
     public void initLocal() throws TaskException, SchedulerException {
@@ -86,11 +105,10 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
      */
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public boolean updateSysJobById(SysJobDTO source) throws SchedulerException, TaskException {
-        SysJobDTO properties = selectSysJobById(source.getJobId());
+    public boolean updateSysJobById(SysJobDTO source){
         int rows = baseMapper.updateById(SysJobMapper.INSTANCE.convertPO(source));
         if (rows > 0) {
-            updateSchedulerJob(source, properties.getJobGroup());
+            eventBus.publishShare(JOB_UPDATE_TOPIC,source.getJobId());
         }
         return rows!=0;
     };
@@ -103,13 +121,12 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean insertSysJob(SysJobDTO source) throws SchedulerException, TaskException {
+    public boolean insertSysJob(SysJobDTO source) {
         source.setStatus(ScheduleConstants.Status.PAUSE.getValue());
         SysJobPO po = SysJobMapper.INSTANCE.convertPO(source);
         int rows = baseMapper.insert(po);
         if (rows > 0) {
-            source.setJobId(po.getJobId());
-            ScheduleUtils.createScheduleJob(scheduler, source);
+            eventBus.publishShare(JOB_INSERT_TOPIC,po.getJobId());
         }
         return rows!=0;
     };
@@ -122,14 +139,15 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int removeSysJobByIds(Collection<String> ids) throws SchedulerException {
+    public int removeSysJobByIds(Collection<String> ids) {
         List<SysJobPO> jobs = this.listByIds(ids);
         if(CollectionUtil.isEmpty(jobs)){
             return CollectionUtil.size(ids);
         }
-        int result = baseMapper.deleteBatchIds(ids);
-        removeJobs(SysJobMapper.INSTANCE.convertDtoList(jobs));
-        return result;
+        for (SysJobDTO sysJobDTO : SysJobMapper.INSTANCE.convertDtoList(jobs)) {
+            eventBus.publishShare(JOB_REMOVE_TOPIC,sysJobDTO);
+        }
+        return baseMapper.deleteBatchIds(ids);
     }
 
     @Override
@@ -155,40 +173,29 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean changeStatus(String id, String status) throws SchedulerException {
-        quartzProducer.sendQuartzJobChangeStatusMessage(id,status);
+        SysJobPO job = this.baseMapper.selectById(id);
         if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) {
-            return resumeJob(id);
+            job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
         }
         else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) {
-            return pauseJob(id);
+            job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
         }
-        return false;
-    }
-
-    @Override
-    public void delCacheJob(SysJobDTO job) throws SchedulerException {
-        removeJobs(Collections.singleton(job));
-    }
-
-    @Override
-    public void refreshCacheJob(String jobId) throws TaskException, SchedulerException {
-        SysJobDTO job = selectSysJobById(jobId);
-        updateSchedulerJob(job,job.getJobGroup());
+        this.baseMapper.updateById(job);
+        this.eventBus.publishShare(JOB_STATUS_TOPIC,id);
+        return true;
     }
 
 
     /**
      * 删除调度器中的任务
-     * @param jobs
+     * @param job
      * @throws SchedulerException
      */
-    private void removeJobs(Collection<SysJobDTO> jobs) throws SchedulerException {
-        for (SysJobDTO job : jobs) {
-            String jobId = job.getJobId();
-            String jobGroup = job.getJobGroup();
-            scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
-        }
-        quartzProducer.sendQuartzDelMessage(jobs);
+    private void removeJobs(SysJobDTO job) throws SchedulerException {
+        String jobId = job.getJobId();
+        String jobGroup = job.getJobGroup();
+        scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
+
     }
 
     /**
@@ -206,7 +213,6 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
             scheduler.deleteJob(jobKey);
         }
         ScheduleUtils.createScheduleJob(scheduler, job);
-        quartzProducer.sendQuartzJobRefreshMessage(jobId);
     }
 
     /**
@@ -250,4 +256,31 @@ public class SysJobServiceImpl extends ServiceImpl<SysJobRepository,SysJobPO> im
         }
         return rows!=0;
     }
+
+    @Subscribe(JOB_STATUS_TOPIC)
+    public void jobStatusChange(String jobId) throws SchedulerException {
+        SysJobDTO job = selectSysJobById(jobId);
+        if(StrUtil.equals(ScheduleConstants.Status.NORMAL.getValue(),job.getStatus())){
+            scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, job.getJobGroup()));
+        }else {
+            scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, job.getJobGroup()));
+        }
+    }
+
+    @Subscribe(JOB_REMOVE_TOPIC)
+    public void jobRemove(SysJobDTO job) throws SchedulerException {
+        removeJobs(job);
+    }
+
+    @Subscribe(JOB_INSERT_TOPIC)
+    public void jobCreate(String jobId) throws TaskException, SchedulerException {
+        SysJobDTO job = selectSysJobById(jobId);
+        ScheduleUtils.createScheduleJob(scheduler, job);
+    }
+
+    @Subscribe(JOB_UPDATE_TOPIC)
+    public void jobUpdate(String jobId) throws TaskException, SchedulerException {
+        SysJobDTO job = selectSysJobById(jobId);
+        updateSchedulerJob(job, job.getJobGroup());
+    }
 }

+ 1 - 3
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/jobLog/dto/SysJobLogQueryDTO.java

@@ -2,10 +2,8 @@ package cn.tr.module.quartz.jobLog.dto;
 
 import lombok.ToString;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
-import java.util.*;
+
 /**
  * 定时任务调度日志表查询参数
  *

+ 0 - 3
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/jobLog/service/impl/SysJobLogServiceImpl.java

@@ -4,9 +4,6 @@ import cn.tr.module.quartz.strategy.QuartzStrategy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.util.*;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
 import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import cn.tr.module.quartz.jobLog.repository.SysJobLogRepository;

+ 10 - 4
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/utils/ScheduleUtils.java

@@ -11,6 +11,7 @@ import cn.tr.module.quartz.execution.QuartzDisallowConcurrentExecution;
 import cn.tr.module.quartz.execution.QuartzJobExecution;
 import cn.tr.module.quartz.job.dto.SysJobDTO;
 import org.quartz.*;
+import org.springframework.beans.BeansException;
 
 /**
  * 定时任务工具类
@@ -120,9 +121,14 @@ public class ScheduleUtils
         if (count > 1) {
             return StrUtil.containsAnyIgnoreCase(invokeTarget, Constants.JOB_WHITELIST_STR);
         }
-        Object obj = SpringUtil.getBean(CollectionUtil.getFirst(StrUtil.split(invokeTarget, ".")));
-        String beanPackageName = obj.getClass().getPackage().getName();
-        return StrUtil.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR)
-                && !StrUtil.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR);
+        String beanName = CollectionUtil.getFirst(StrUtil.split(invokeTarget, "."));
+        try {
+            Object obj = SpringUtil.getBean(beanName);
+            String beanPackageName = obj.getClass().getPackage().getName();
+            return StrUtil.containsAnyIgnoreCase(beanPackageName, Constants.JOB_WHITELIST_STR)
+                    && !StrUtil.containsAnyIgnoreCase(beanPackageName, Constants.JOB_ERROR_STR);
+        }catch (BeansException e){
+            throw new NullPointerException("beanName:{"+beanName+"}不存在");
+        }
     }
 }

+ 7 - 2
tr-modules/tr-module-system/pom.xml

@@ -36,6 +36,12 @@
         <dependency>
             <groupId>cn.tr</groupId>
             <artifactId>tr-spring-boot-starter-plugin-mybatis</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>log4j-to-slf4j</artifactId>
+                    <groupId>org.apache.logging.log4j</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
         <dependency>
@@ -95,13 +101,12 @@
 
         <dependency>
             <groupId>cn.tr</groupId>
-            <artifactId>tr-spring-boot-starter-plugin-bus</artifactId>
+            <artifactId>tr-spring-boot-starter-plugin-eventbus</artifactId>
         </dependency>
 
         <dependency>
             <groupId>com.github.whvcse</groupId>
             <artifactId>easy-captcha</artifactId>
-            <version>1.6.2</version>
         </dependency>
 
     </dependencies>

+ 0 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/constant/dto/SysConstantConfigQueryDTO.java

@@ -2,9 +2,7 @@ package cn.tr.module.sys.constant.dto;
 
 import lombok.ToString;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
 import java.util.*;
 /**
  * 常量配置查询参数

+ 0 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/constant/service/impl/SysConstantConfigServiceImpl.java

@@ -4,7 +4,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.*;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
 import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import cn.tr.module.sys.constant.repository.SysConstantConfigRepository;

+ 0 - 15
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/SysMqConfig.java

@@ -1,15 +0,0 @@
-package cn.tr.module.sys.core.mq;
-
-import org.springframework.cloud.bus.jackson.RemoteApplicationEventScan;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * @ClassName : QuartzMqConfig
- * @Description :
- * @Author : LF
- * @Date: 2023年05月06日
- */
-@Configuration
-@RemoteApplicationEventScan(basePackages = {"cn.tr.module.sys.core.mq.message.*"})
-public class SysMqConfig {
-}

+ 0 - 28
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/consumer/sms/SmsChannelRefreshConsumer.java

@@ -1,28 +0,0 @@
-package cn.tr.module.sys.core.mq.consumer.sms;
-
-import cn.tr.module.sys.core.mq.message.sms.SmsChannelRefreshMessage;
-import cn.tr.module.sys.sms.service.ISysSmsChannelService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.event.EventListener;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-
-/**
- * 针对 {@link SmsChannelRefreshMessage} 的消费者
- *
- * @author 芋道源码
- */
-@Component
-@Slf4j
-public class SmsChannelRefreshConsumer {
-
-    @Resource
-    private ISysSmsChannelService smsChannelService;
-
-    @EventListener
-    public void execute(SmsChannelRefreshMessage message) {
-        log.info("[execute][收到 SmsChannel 刷新消息]");
-        smsChannelService.initLocalCache();
-    }
-}

+ 0 - 42
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/consumer/sms/SmsConsumer.java

@@ -1,42 +0,0 @@
-package cn.tr.module.sys.core.mq.consumer.sms;
-
-import cn.tr.module.sys.core.mq.message.sms.SmsSendMessage;
-import cn.tr.module.sys.core.mq.producer.sms.SmsSupplier;
-import cn.tr.module.sys.sms.service.ISmsSendService;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-
-import java.util.function.Function;
-
-/**
- * 针对 {@link SmsSendMessage} 的消费者
- * @see  {https://docs.spring.io/spring-cloud-stream/docs/3.1.0/reference/html/spring-cloud-stream.html#_suppliers_sources}
- *
- * provider {@link SmsSupplier}
- * 默认的主题名称是通过
- * 输入:    <方法名> + -in- + <index>
- * 输出:    <方法名> + -out- + <index>
- * @author lf
- */
-@Component
-@Slf4j
-@AllArgsConstructor
-public class SmsConsumer implements Function<Flux<SmsSendMessage>, Mono<Void>> {
-    private final ISmsSendService smsSendService;
-
-    @Override
-    public Mono<Void> apply(Flux<SmsSendMessage> flux) {
-        return flux
-                .log("smsConsumer")
-                .doOnNext(smsSendService::doSendSms)
-                .onErrorContinue((t,m)->{
-                    if(t!=null){
-                        log.error("[SmsConsumer] 信息发送失败,",t);
-                    }
-                })
-                .then();
-    }
-}

+ 0 - 29
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/consumer/sms/SmsTemplateRefreshConsumer.java

@@ -1,29 +0,0 @@
-package cn.tr.module.sys.core.mq.consumer.sms;
-
-import cn.tr.module.sys.core.mq.message.sms.SmsTemplateRefreshMessage;
-import cn.tr.module.sys.sms.service.ISysSmsTempService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.context.event.EventListener;
-import org.springframework.stereotype.Component;
-
-import javax.annotation.Resource;
-
-/**
- * 针对 {@link SmsTemplateRefreshMessage} 的消费者
- *
- * @author 芋道源码
- */
-@Component
-@Slf4j
-public class SmsTemplateRefreshConsumer {
-
-    @Resource
-    private ISysSmsTempService smsTemplateService;
-
-    @EventListener
-    public void execute(SmsTemplateRefreshMessage message) {
-        log.info("[execute][收到 SmsTemplate 刷新消息]");
-        smsTemplateService.initLocalCache();
-    }
-
-}

+ 0 - 22
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/message/sms/SmsChannelRefreshMessage.java

@@ -1,22 +0,0 @@
-package cn.tr.module.sys.core.mq.message.sms;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springframework.cloud.bus.event.RemoteApplicationEvent;
-
-/**
- * 短信渠道的数据刷新 Message
- *
- * @author 芋道源码
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class SmsChannelRefreshMessage extends RemoteApplicationEvent {
-
-    public SmsChannelRefreshMessage() {
-    }
-    public SmsChannelRefreshMessage(Object source, String originService, String destinationService) {
-        super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
-    }
-
-}

+ 0 - 23
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/message/sms/SmsTemplateRefreshMessage.java

@@ -1,23 +0,0 @@
-package cn.tr.module.sys.core.mq.message.sms;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.springframework.cloud.bus.event.RemoteApplicationEvent;
-
-/**
- * 短信模板的数据刷新 Message
- *
- * @author 芋道源码
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-public class SmsTemplateRefreshMessage extends RemoteApplicationEvent {
-
-    public SmsTemplateRefreshMessage() {
-    }
-
-    public SmsTemplateRefreshMessage(Object source, String originService, String destinationService) {
-        super(source, originService, DEFAULT_DESTINATION_FACTORY.getDestination(destinationService));
-    }
-
-}

+ 0 - 30
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/producer/sms/SmsProducer.java

@@ -1,30 +0,0 @@
-package cn.tr.module.sys.core.mq.producer.sms;
-
-import cn.tr.module.sys.core.mq.message.sms.SmsChannelRefreshMessage;
-import cn.tr.module.sys.core.mq.message.sms.SmsTemplateRefreshMessage;
-import cn.tr.plugin.bus.AbstractBusProducer;
-import org.springframework.stereotype.Component;
-
-/**
- * @ClassName : SmsProducer
- * @Description :
- * @Author : LF
- * @Date: 2023年04月25日
- */
-@Component
-public class SmsProducer extends AbstractBusProducer {
-
-    /**
-     * 发送 {@link SmsChannelRefreshMessage} 消息
-     */
-    public void sendSmsChannelRefreshMessage() {
-        publishEvent(new SmsChannelRefreshMessage(this, getBusId(), selfDestinationService()));
-    }
-
-    /**
-     * 发送 {@link SmsTemplateRefreshMessage} 消息
-     */
-    public void sendSmsTemplateRefreshMessage() {
-        publishEvent(new SmsTemplateRefreshMessage(this, getBusId(), selfDestinationService()));
-    }
-}

+ 0 - 45
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/producer/sms/SmsSupplier.java

@@ -1,45 +0,0 @@
-package cn.tr.module.sys.core.mq.producer.sms;
-
-import cn.tr.core.pojo.KeyValue;
-import cn.tr.module.sys.core.mq.message.sms.SmsSendMessage;
-import cn.tr.plugin.bus.AbstractBusProducer;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Sinks;
-import java.util.List;
-import java.util.function.Supplier;
-
-/**
- * Sms 短信相关消息的 Producer
- *
- * @author zzf
- * @date 2021/3/9 16:35
- */
-@Slf4j
-@Component
-public class SmsSupplier extends AbstractBusProducer implements Supplier<Flux<SmsSendMessage>> {
-    private Sinks.Many<SmsSendMessage> sink = Sinks.many().unicast().onBackpressureBuffer();
-    /**
-     * 发送 {@link SmsSendMessage} 消息
-     *
-     * @param logId 短信日志编号
-     * @param mobile 手机号
-     * @param channelId 渠道编号
-     * @param apiTemplateId 短信模板编号
-     * @param templateParams 短信模板参数
-     */
-    public void sendSmsSendMessage(String logId, String mobile,
-                                   String channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
-        SmsSendMessage message = new SmsSendMessage().setLogId(logId).setMobile(mobile);
-        message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
-        sink.tryEmitNext(message);
-    }
-
-    @Override
-    public Flux<SmsSendMessage> get() {
-        return sink.asFlux().log();
-    }
-
-
-}

+ 0 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/file/package-info.java

@@ -1,2 +0,0 @@
-package cn.tr.module.sys.file;
-//文件相关包

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysLogQueryDTO.java

@@ -4,8 +4,7 @@ import lombok.ToString;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
-import java.util.*;
+
 /**
  * 系统日志查询参数
  *

+ 24 - 11
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/monitor/controller/SysUserOnlineController.java

@@ -76,23 +76,36 @@ public class SysUserOnlineController extends BaseController {
     @ApiOperation(value = "强退用户",notes = "权限 - monitor:online:forceLogout")
     @PostMapping("/forceLogout")
     public CommonResult forceLogout(@RequestBody @Validated OnlineUserOperationDTO source) {
+        String currentTokenValue = SaTokenUtils.getStpUtil().getTokenValue();
         StpLogic stpLogic = SaTokenUtils.getStpUtil(source.getLoginType());
         SaSession saSession = stpLogic.getSessionBySessionId(source.getSessionId());
         if (CollectionUtil.isNotEmpty(source.getTokenValues())) {
-            OnlineUserSessionDTO userSession = SaTokenUtils.getValue(saSession, SecurityConstant.SESSION_USER, OnlineUserSessionDTO.class);
-            List<OnlineUserTokenSessionDTO> tokenSessionList = userSession.getTokenSessionList();
-            source.getTokenValues().forEach(stpLogic::logoutByTokenValue);
-            List<OnlineUserTokenSessionDTO> result = tokenSessionList.stream()
-                    .filter(tokenSession -> !source.getTokenValues().contains(tokenSession.getTokenValue()))
-                    .collect(Collectors.toList());
-            userSession.setTokenSessionList(result);
-            SaTokenUtils.set(saSession, SecurityConstant.SESSION_USER,userSession);
+            List<String> forceLogoutValues = source.getTokenValues();
+            forceLogoutValues.remove(currentTokenValue);
+            forceLogoutTokenValues(stpLogic,saSession,forceLogoutValues);
         }else {
-            saSession.getTokenSignList().stream()
+            List<String> tokens = saSession.getTokenSignList().stream()
                     .map(TokenSign::getValue)
-                    .forEach(stpLogic::logoutByTokenValue);
-            saSession.logout();
+                    .collect(Collectors.toList());
+            boolean result = tokens.remove(currentTokenValue);
+            forceLogoutTokenValues(stpLogic,saSession,tokens);
+            if(!result){
+                saSession.logout();
+            }
         }
         return CommonResult.success();
     }
+
+
+    private void forceLogoutTokenValues(StpLogic stpLogic,SaSession saSession,List<String> forceLogoutValues){
+        OnlineUserSessionDTO userSession = SaTokenUtils.getValue(saSession, SecurityConstant.SESSION_USER, OnlineUserSessionDTO.class);
+        forceLogoutValues
+                .forEach(stpLogic::logoutByTokenValue);
+        List<OnlineUserTokenSessionDTO> tokenSessionList = userSession.getTokenSessionList();
+        List<OnlineUserTokenSessionDTO> result = tokenSessionList.stream()
+                .filter(tokenSession -> !CollectionUtil.contains(forceLogoutValues,tokenSession.getTokenValue()))
+                .collect(Collectors.toList());
+        userSession.setTokenSessionList(result);
+        SaTokenUtils.set(saSession, SecurityConstant.SESSION_USER,userSession);
+    }
 }

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyQueryDTO.java

@@ -4,8 +4,7 @@ import lombok.ToString;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
-import java.util.*;
+
 /**
  * 编号策略查询参数
  *

+ 4 - 4
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/controller/CurrentUserController.java

@@ -7,7 +7,6 @@ import cn.tr.core.utils.TreeUtil;
 import cn.tr.module.sys.oauth2.psw.operator.AbstractOAuth2PswUserOperator;
 import cn.tr.module.sys.oauth2.psw.operator.OAuth2PswUserOperatorManager;
 import cn.tr.module.sys.oauth2.service.CurrentUserService;
-import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.vo.RouteItemVO;
 import cn.tr.plugin.security.context.LoginUserContextHolder;
@@ -16,6 +15,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import java.util.Collection;
@@ -53,11 +53,11 @@ public class CurrentUserController {
         return CommonResult.success(currentUserService.currentUserPermission());
     }
 
-    @GetMapping("/listMenus")
+    @GetMapping("/listMenus-{portalId}")
     @ApiOperation("获得登录用户的菜单列表")
-    public CommonResult<List<RouteItemVO>> getMenus() {
+    public CommonResult<List<RouteItemVO>> getMenus(@PathVariable(value = "portalId",required = false) String portalId) {
         SaTokenUtils.getStpUtil().checkLogin();
-        return CommonResult.success(TreeUtil.buildTree(currentUserService.currentUserMenus()));
+        return CommonResult.success(TreeUtil.buildTree(currentUserService.currentUserMenus(portalId)));
     }
 
     @GetMapping("/listPortal")

+ 0 - 15
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/properties/TrOAuth2Properties.java

@@ -1,15 +0,0 @@
-package cn.tr.module.sys.oauth2.properties;
-
-import lombok.Data;
-
-/**
- * @ClassName : TrOAuthProperties
- * @Description :
- * @Author : LF
- * @Date: 2023年03月31日
- */
-
-@Data
-public class TrOAuth2Properties {
-
-}

+ 0 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/psw/properties/TrOAuth2PswClientProperties.java

@@ -1,6 +1,5 @@
 package cn.tr.module.sys.oauth2.psw.properties;
 
-import cn.dev33.satoken.oauth2.model.SaClientModel;
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 

+ 13 - 4
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/oauth2/service/CurrentUserService.java

@@ -7,7 +7,6 @@ import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
-import cn.tr.module.sys.user.dto.SysPortalDTO;
 import cn.tr.module.sys.user.dto.SysUserPortalListDTO;
 import cn.tr.module.sys.user.enums.MenuEnum;
 import cn.tr.module.sys.user.service.ISysMenuService;
@@ -52,12 +51,22 @@ public class CurrentUserService {
      * 获取当前用户菜单
      * @return
      */
-    public List<RouteItemVO> currentUserMenus(){
+    public List<RouteItemVO> currentUserMenus(String portalId){
         String currentUserId = String.valueOf(SaTokenUtils.getStpUtil().getLoginId());
         Set<SysMenuDTO> tenantMenus = tenantService.currentTenantMenus();
         Set<SysMenuDTO> roleMenus = menuService.findUserMenus(currentUserId);
-        //门面菜单
-        Set<SysMenuDTO> portalMenus =new HashSet<>(portalMenuService.findAllMenusByPortalId("1"));
+        //当未传门户id时,使用默认门户
+        if(StrUtil.isEmpty(portalId)){
+            List<SysUserPortalListDTO> portalList = currentUserPortals();
+            if (CollectionUtil.isNotEmpty(portalList)) {
+                portalId=portalList.stream()
+                        .filter(portal->Boolean.TRUE.equals(portal.getIsDefault()))
+                        .map(SysUserPortalListDTO::getId)
+                        .findFirst()
+                        .orElse(CollectionUtil.getFirst(portalList).getId());
+            }
+        }
+        Set<SysMenuDTO> portalMenus =StrUtil.isEmpty(portalId)?Collections.emptySet():new HashSet<>(portalMenuService.findAllMenusByPortalId(portalId));
         // 交集(门面菜单,租户菜单,角色菜单)
         Collection<SysMenuDTO> allMenus = CollectionUtil.intersection(tenantMenus, roleMenus,portalMenus);
         if(CollectionUtil.isEmpty(allMenus)){

+ 1 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/controller/SysSmsTempController.java

@@ -10,7 +10,7 @@ import cn.tr.module.sys.sms.dto.SysSmsTempDTO;
 import cn.tr.module.sys.sms.dto.SysSmsTempQueryDTO;
 import cn.tr.module.sys.sms.service.ISmsSendService;
 import cn.tr.module.sys.sms.service.ISysSmsTempService;
-import cn.tr.module.sys.user.enums.CreateEnum;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.plugin.mybatis.base.BaseController;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -22,7 +22,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.util.Collection;
-import java.util.List;
 
 /**
  * 短信模板控制器

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/core/mq/message/sms/SmsSendMessage.java → tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SmsSendMessageDTO.java

@@ -1,4 +1,4 @@
-package cn.tr.module.sys.core.mq.message.sms;
+package cn.tr.module.sys.sms.dto;
 
 import cn.tr.core.pojo.KeyValue;
 import lombok.Data;
@@ -14,7 +14,7 @@ import java.util.List;
  */
 @Data
 @Accessors(chain = true)
-public class SmsSendMessage {
+public class SmsSendMessageDTO {
 
     /**
      * 短信日志编号

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsChannelDTO.java

@@ -48,7 +48,7 @@ public class SysSmsChannelDTO extends BaseDTO  {
 
     @ApiModelProperty(value = "短信 API 的秘钥", position = 6)
     @NotBlank(message = "短信 API 的秘钥不能为空",groups = {Update.class,Insert.class})
-    @PasswordDesensitize(prefixKeep = 3,suffixKeep = 3)
+//    @PasswordDesensitize(prefixKeep = 3,suffixKeep = 3)
     private String apiSecret;
 
     @ApiModelProperty(value = "短信发送回调 URL", position = 7)

+ 8 - 4
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsLogDTO.java

@@ -1,13 +1,11 @@
 package cn.tr.module.sys.sms.dto;
 
 import cn.tr.plugin.mybatis.pojo.BaseDTO;
-import lombok.Builder;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
+import lombok.*;
 import cn.tr.core.validation.Update;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
+
 import javax.validation.constraints.NotNull;
 import java.util.*;
 /**
@@ -21,6 +19,8 @@ import java.util.*;
 @EqualsAndHashCode(callSuper = true)
 @ToString
 @Builder
+@AllArgsConstructor
+@NoArgsConstructor
 public class SysSmsLogDTO extends BaseDTO  {
     private static final long serialVersionUID = 1L;
     @ApiModelProperty(value = "id", position = 1)
@@ -28,10 +28,14 @@ public class SysSmsLogDTO extends BaseDTO  {
     private String id;
     @ApiModelProperty(value = "渠道id", position = 2)
     private String channelId;
+    @ApiModelProperty(value = "渠道名称",readOnly = true)
+    private String channelName;
     @ApiModelProperty(value = "模板id", position = 3)
     private String templateId;
     @ApiModelProperty(value = "模板编码", position = 4)
     private String templateCode;
+    @ApiModelProperty(value = "模板名称",readOnly = true)
+    private String templateName;
     @ApiModelProperty(value = "模板类型", position = 5)
     private String templateType;
     @ApiModelProperty(value = "模板参数", position = 6)

+ 2 - 8
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsLogQueryDTO.java

@@ -4,7 +4,7 @@ import lombok.ToString;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import cn.tr.plugin.mybatis.pojo.BetweenQuery;
+
 import java.util.*;
 /**
  * 短信日志查询参数
@@ -17,12 +17,6 @@ import java.util.*;
 @ToString
 public class SysSmsLogQueryDTO  {
     private static final long serialVersionUID = 1L;
-    @ApiModelProperty(value = "渠道id", position = 2)
-    private String channelId;
-
-    @ApiModelProperty(value = "模板id", position = 3)
-    private String templateId;
-
     @ApiModelProperty(value = "模板编码", position = 4)
     private String templateCode;
 
@@ -33,7 +27,7 @@ public class SysSmsLogQueryDTO  {
     private String sendStatus;
 
     @ApiModelProperty(value = "发送时间", position = 13)
-    private BetweenQuery<Date> sendTime;
+    private List<Date> sendTime;
 
     @ApiModelProperty(value = "接收状态", position = 20)
     private String receiveStatus;

+ 3 - 5
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempDTO.java

@@ -36,6 +36,9 @@ public class SysSmsTempDTO extends BaseDTO  {
     @NotBlank(message = "短信渠道不能为空",groups = {Update.class,Insert.class})
     private String channelId;
 
+    @ApiModelProperty(value = "短信渠道名称", position = 2,readOnly = true)
+    private String channelName;
+
     @ApiModelProperty(value = "创建类型", position = 3,readOnly = true)
     private String createType;
 
@@ -46,7 +49,6 @@ public class SysSmsTempDTO extends BaseDTO  {
     @ApiModelProperty(value = "模板内容", position = 5)
     private String content;
 
-
     @ApiModelProperty(value = "模板编码", position = 6,required = true)
     @NotBlank(message = "模板编码不能为空",groups = {Update.class,Insert.class})
     private String code;
@@ -59,10 +61,6 @@ public class SysSmsTempDTO extends BaseDTO  {
     @NotBlank(message = "短信 API 模板编号不能为空",groups = {Update.class,Insert.class})
     private String apiTempCode;
 
-    @ApiModelProperty(value = "状态", position = 9,required = true)
-    @NotNull(message = "状态不能为空",groups = {Update.class,Insert.class})
-    private Boolean disable;
-
     @ApiModelProperty(value = "备注", position = 10)
     private String remark;
 

+ 4 - 8
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempQueryDTO.java

@@ -16,16 +16,12 @@ import lombok.ToString;
 @ToString
 public class SysSmsTempQueryDTO  {
     private static final long serialVersionUID = 1L;
-    @ApiModelProperty(value = "创建类型", position = 3)
-    private String createType;
+    @ApiModelProperty(value = "渠道id", position = 2)
+    private String channelId;
 
-    @ApiModelProperty(value = "模板类型", position = 4)
+    @ApiModelProperty(value = "模板类型", position = 2)
     private String tempType;
 
-    @ApiModelProperty(value = "模板编码", position = 5)
+    @ApiModelProperty(value = "模板编码", position = 3)
     private String code;
-
-    @ApiModelProperty(value = "状态", position = 8)
-    private Boolean disable;
-
 }

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/po/SysSmsLogPO.java

@@ -18,7 +18,7 @@ import java.util.*;
  * @date  2023/04/21 17:06
  **/
 @Data
-@TableName("sys_sms_log")
+@TableName(value = "sys_sms_log",autoResultMap = true)
 @EqualsAndHashCode(callSuper = true)
 @ToString
 public class SysSmsLogPO extends BasePO {

+ 0 - 4
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/po/SysSmsTempPO.java

@@ -53,10 +53,6 @@ public class SysSmsTempPO extends BasePO {
     @ApiModelProperty(value = "短信 API 模板编号", position = 8)
     private String apiTempCode;
 
-    /** 状态 */
-    @ApiModelProperty(value = "状态", position = 9)
-    private Boolean disable;
-
     /** 备注 */
     @ApiModelProperty(value = "备注", position = 10)
     private String remark;

+ 7 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/repository/SysSmsLogRepository.java

@@ -1,8 +1,12 @@
 package cn.tr.module.sys.sms.repository;
 
+import cn.tr.module.sys.sms.dto.SysSmsLogDTO;
+import cn.tr.module.sys.sms.dto.SysSmsLogQueryDTO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
+import java.util.*;
 import cn.tr.module.sys.sms.po.SysSmsLogPO;
 /**
  * 短信日志Mapper接口
@@ -13,4 +17,7 @@ import cn.tr.module.sys.sms.po.SysSmsLogPO;
 @Repository
 @Mapper
 public interface SysSmsLogRepository extends BaseMapper<SysSmsLogPO> {
+    List<SysSmsLogDTO> stdSelectList(@Param("query") SysSmsLogQueryDTO query);
+
+    SysSmsLogDTO stdSelectById(@Param("id") String id);
 }

+ 8 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/repository/SysSmsTempRepository.java

@@ -1,10 +1,13 @@
 package cn.tr.module.sys.sms.repository;
 
+import cn.tr.module.sys.sms.dto.SysSmsTempDTO;
+import cn.tr.module.sys.sms.dto.SysSmsTempQueryDTO;
 import cn.tr.module.sys.sms.po.SysSmsTempPO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
-
+import java.util.*;
 /**
  * 短信模板Mapper接口
  *
@@ -14,4 +17,8 @@ import org.springframework.stereotype.Repository;
 @Repository
 @Mapper
 public interface SysSmsTempRepository extends BaseMapper<SysSmsTempPO> {
+
+    List<SysSmsTempDTO> stdSelectList(@Param("query") SysSmsTempQueryDTO query);
+
+    SysSmsTempDTO stdSelectById(@Param("tempId") String tempId);
 }

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/ISmsSendService.java

@@ -1,6 +1,6 @@
 package cn.tr.module.sys.sms.service;
 
-import cn.tr.module.sys.core.mq.message.sms.SmsSendMessage;
+import cn.tr.module.sys.sms.dto.SmsSendMessageDTO;
 
 import java.util.Map;
 
@@ -67,7 +67,7 @@ public interface ISmsSendService {
      *
      * @param message 短信
      */
-    void doSendSms(SmsSendMessage message);
+    void doSendSms(SmsSendMessageDTO message);
 
     /**
      * 接收短信的接收结果

+ 31 - 7
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SmsSendServiceImpl.java

@@ -7,8 +7,8 @@ import cn.tr.core.enums.UserTypeEnum;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.core.pojo.KeyValue;
-import cn.tr.module.sys.core.mq.message.sms.SmsSendMessage;
-import cn.tr.module.sys.core.mq.producer.sms.SmsSupplier;
+import cn.tr.core.utils.JsonUtils;
+import cn.tr.module.sys.sms.dto.SmsSendMessageDTO;
 import cn.tr.module.sys.sms.dto.SysSmsChannelDTO;
 import cn.tr.module.sys.sms.dto.SysSmsTempDTO;
 import cn.tr.module.sys.sms.service.ISmsSendService;
@@ -17,6 +17,8 @@ import cn.tr.module.sys.sms.service.ISysSmsLogService;
 import cn.tr.module.sys.sms.service.ISysSmsTempService;
 import cn.tr.module.sys.user.dto.SysUserDTO;
 import cn.tr.module.sys.user.service.ISysUserService;
+import cn.tr.plugin.eventbus.annotation.Subscribe;
+import cn.tr.plugin.eventbus.config.EventBus;
 import cn.tr.plugin.sms.bo.SmsCommonResult;
 import cn.tr.plugin.sms.bo.SmsReceiveRespBO;
 import cn.tr.plugin.sms.bo.SmsSendRespBO;
@@ -50,7 +52,7 @@ public class SmsSendServiceImpl implements ISmsSendService {
 
     private final SmsClientFactory smsClientFactory;
 
-    private final SmsSupplier smsSupplier;
+    private final EventBus eventBus;
     @Override
     public String sendSingleSmsToAdmin(String mobile, String userId, String templateCode, Map<String, Object> templateParams) {
         if (StrUtil.isEmpty(mobile)) {
@@ -83,21 +85,20 @@ public class SmsSendServiceImpl implements ISmsSendService {
         List<KeyValue<String, Object>> newTemplateParams = buildTemplateParams(template, templateParams);
 
         // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志
-        boolean isSend =Boolean.FALSE.equals(template.getDisable())
-                &&  Boolean.FALSE.equals(smsChannel.getDisable());
+        boolean isSend = Boolean.FALSE.equals(smsChannel.getDisable());
 
         String content = smsTempService.formatSmsTemplateContent(template.getContent(), templateParams);
         String sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
         // 发送 MQ 消息,异步执行发送短信
         if (isSend) {
-            smsSupplier.sendSmsSendMessage(sendLogId, mobile, template.getChannelId(),
+            sendSmsSendMessage(sendLogId, mobile, template.getChannelId(),
                     template.getApiTempCode(), newTemplateParams);
         }
         return sendLogId;
     }
 
     @Override
-    public void doSendSms(SmsSendMessage message) {
+    public void doSendSms(SmsSendMessageDTO message) {
         // 获得渠道对应的 SmsClient 客户端
         SmsClient smsClient = smsClientFactory.getSmsClientByChannelId(message.getChannelId());
         if (Objects.isNull(smsClient)) {
@@ -173,5 +174,28 @@ public class SmsSendServiceImpl implements ISmsSendService {
         }).collect(Collectors.toList());
     }
 
+    @Subscribe("/sms/send")
+    public void subscribeSendMsg(SmsSendMessageDTO sendMessage){
+        if(log.isDebugEnabled()){
+            log.debug("发送短信消息:{}", JsonUtils.toJsonString(sendMessage));
+        }
+        doSendSms(sendMessage);
+    }
+
+    /**
+     * 发送 {@link SmsSendMessageDTO} 消息
+     *
+     * @param logId 短信日志编号
+     * @param mobile 手机号
+     * @param channelId 渠道编号
+     * @param apiTemplateId 短信模板编号
+     * @param templateParams 短信模板参数
+     */
+    public void sendSmsSendMessage(String logId, String mobile,
+                                   String channelId, String apiTemplateId, List<KeyValue<String, Object>> templateParams) {
+        SmsSendMessageDTO message = new SmsSendMessageDTO().setLogId(logId).setMobile(mobile);
+        message.setChannelId(channelId).setApiTemplateId(apiTemplateId).setTemplateParams(templateParams);
+        eventBus.publishEx("/sms/send",message);
+    }
 
 }

+ 8 - 5
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsChannelServiceImpl.java

@@ -1,7 +1,8 @@
 package cn.tr.module.sys.sms.service.impl;
 
 import cn.tr.core.utils.JsonUtils;
-import cn.tr.module.sys.core.mq.producer.sms.SmsProducer;
+import cn.tr.plugin.eventbus.annotation.Subscribe;
+import cn.tr.plugin.eventbus.config.EventBus;
 import cn.tr.plugin.sms.config.SmsClientFactory;
 import cn.tr.plugin.sms.properties.SmsChannelProperties;
 import lombok.extern.slf4j.Slf4j;
@@ -28,6 +29,7 @@ import javax.annotation.PostConstruct;
 @Service
 @Slf4j
 public class SysSmsChannelServiceImpl implements ISysSmsChannelService {
+    private final String CHANNEL_REFRESH_TOPIC="/sms/channel/refresh";
     @Autowired
     private SysSmsChannelRepository baseRepository;
 
@@ -35,10 +37,11 @@ public class SysSmsChannelServiceImpl implements ISysSmsChannelService {
     private SmsClientFactory smsClientFactory;
 
     @Autowired
-    private SmsProducer smsProducer;
+    private EventBus eventBus;
 
     @Override
     @PostConstruct
+    @Subscribe(CHANNEL_REFRESH_TOPIC)
     public void initLocalCache() {
         // 第一步:查询数据
         List<SysSmsChannelPO> channels = baseRepository.selectList(new LambdaQueryWrapper<>());
@@ -95,7 +98,7 @@ public class SysSmsChannelServiceImpl implements ISysSmsChannelService {
     public boolean updateSysSmsChannelById(SysSmsChannelDTO source){
         boolean result = baseRepository.updateById(SysSmsChannelMapper.INSTANCE.convertPO(source)) != 0;
         if(result){
-            smsProducer.sendSmsChannelRefreshMessage();
+            eventBus.publishShare(CHANNEL_REFRESH_TOPIC,new Object());
         }
         return result;
     };
@@ -111,7 +114,7 @@ public class SysSmsChannelServiceImpl implements ISysSmsChannelService {
     public boolean insertSysSmsChannel(SysSmsChannelDTO source){
         boolean result = baseRepository.insert(SysSmsChannelMapper.INSTANCE.convertPO(source)) != 0;
         if(result){
-            smsProducer.sendSmsChannelRefreshMessage();
+            eventBus.publishShare(CHANNEL_REFRESH_TOPIC,new Object());
         }
         return result;
     };
@@ -126,7 +129,7 @@ public class SysSmsChannelServiceImpl implements ISysSmsChannelService {
     @Transactional(rollbackFor = Exception.class)
     public int removeSysSmsChannelByIds(Collection<String> ids){
         int result = baseRepository.deleteBatchIds(ids);
-        smsProducer.sendSmsChannelRefreshMessage();
+        eventBus.publishShare(CHANNEL_REFRESH_TOPIC,new Object());
         return result;
     };
 }

+ 2 - 15
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsLogServiceImpl.java

@@ -8,7 +8,6 @@ import cn.tr.module.sys.sms.enums.SmsSendStatusEnum;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import cn.tr.module.sys.sms.repository.SysSmsLogRepository;
 import cn.tr.module.sys.sms.po.SysSmsLogPO;
 import cn.tr.module.sys.sms.dto.SysSmsLogDTO;
@@ -36,19 +35,7 @@ public class SysSmsLogServiceImpl implements ISysSmsLogService {
      */
     @Override
     public List<SysSmsLogDTO> selectSysSmsLogList(SysSmsLogQueryDTO query){
-        return SysSmsLogMapper.INSTANCE.convertDtoList(
-                baseRepository.selectList(new LambdaQueryWrapper<SysSmsLogPO>()
-                        .eq(Objects.nonNull(query.getChannelId()),SysSmsLogPO::getChannelId,query.getChannelId())
-                        .eq(Objects.nonNull(query.getTemplateId()),SysSmsLogPO::getTemplateId,query.getTemplateId())
-                        .eq(Objects.nonNull(query.getTemplateCode()),SysSmsLogPO::getTemplateCode,query.getTemplateCode())
-                        .like(Objects.nonNull(query.getMobile()),SysSmsLogPO::getMobile,
-                                query.getMobile())
-                        .eq(Objects.nonNull(query.getSendStatus()),SysSmsLogPO::getSendStatus,query.getSendStatus())
-                        .le(Objects.nonNull(query.getSendTime())&&Objects.nonNull(query.getSendTime().getMax()),SysSmsLogPO::getSendTime,query.getSendTime().getMax())
-                        .ge(Objects.nonNull(query.getSendTime())&&Objects.nonNull(query.getSendTime().getMin()),SysSmsLogPO::getSendTime,query.getSendTime().getMin())
-                        .eq(Objects.nonNull(query.getReceiveStatus()),SysSmsLogPO::getReceiveStatus,query.getReceiveStatus())
-                )
-        );
+        return baseRepository.stdSelectList(query);
     };
 
     /**
@@ -59,7 +46,7 @@ public class SysSmsLogServiceImpl implements ISysSmsLogService {
      */
     @Override
     public SysSmsLogDTO selectSysSmsLogById(String id){
-        return SysSmsLogMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+        return baseRepository.stdSelectById(id);
     };
 
     /**

+ 25 - 20
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsTempServiceImpl.java

@@ -4,24 +4,24 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
-import cn.tr.module.sys.core.mq.producer.sms.SmsProducer;
 import cn.tr.module.sys.sms.mapper.SysSmsTempMapper;
 import cn.tr.module.sys.sms.dto.SysSmsTempDTO;
 import cn.tr.module.sys.sms.dto.SysSmsTempQueryDTO;
 import cn.tr.module.sys.sms.po.SysSmsTempPO;
 import cn.tr.module.sys.sms.repository.SysSmsTempRepository;
 import cn.tr.module.sys.sms.service.ISysSmsTempService;
-import cn.tr.module.sys.user.enums.CreateEnum;
+import cn.tr.core.enums.CreateEnum;
+import cn.tr.plugin.eventbus.annotation.Subscribe;
+import cn.tr.plugin.eventbus.config.EventBus;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.PropertyPlaceholderHelper;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import javax.annotation.PostConstruct;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
@@ -34,17 +34,22 @@ import java.util.stream.Collectors;
 @Service
 @Slf4j
 public class SysSmsTempServiceImpl implements ISysSmsTempService {
+    private final String TEMP_REFRESH_TOPIC="/sms/temp/refresh";
     @Autowired
     private SysSmsTempRepository baseRepository;
 
     @Autowired
-    private SmsProducer smsProducer;
+    private EventBus eventBus;
+
+    private final PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}");
     /**
      * 根据编码对模板进行缓存操作
      */
     private volatile  Map<String,SysSmsTempPO> tempMapByCode=new ConcurrentHashMap<>();
 
     @Override
+    @PostConstruct
+    @Subscribe(TEMP_REFRESH_TOPIC)
     public void initLocalCache() {
         List<SysSmsTempPO> temps = baseRepository.selectList(new LambdaQueryWrapper<>());
         log.info("[initLocalCache][缓存短信模版,数量为:{}]", temps.size());
@@ -60,14 +65,7 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
      */
     @Override
     public List<SysSmsTempDTO> selectSysSmsTempList(SysSmsTempQueryDTO query){
-        return SysSmsTempMapper.INSTANCE.convertDtoList(
-                baseRepository.selectList(new LambdaQueryWrapper<SysSmsTempPO>()
-                        .eq(Objects.nonNull(query.getCreateType()), SysSmsTempPO::getCreateType,query.getCreateType())
-                        .eq(Objects.nonNull(query.getTempType()), SysSmsTempPO::getTempType,query.getTempType())
-                        .like(Objects.nonNull(query.getCode()), SysSmsTempPO::getCode, query.getCode())
-                        .eq(Objects.nonNull(query.getDisable()), SysSmsTempPO::getDisable,query.getDisable())
-                )
-        );
+        return baseRepository.stdSelectList(query);
     };
 
     /**
@@ -78,7 +76,7 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
      */
     @Override
     public SysSmsTempDTO selectSysSmsTempById(String id){
-        return SysSmsTempMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+        return baseRepository.stdSelectById(id);
     };
 
     /**
@@ -93,7 +91,7 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
         validateSmsTempSource(source);
         boolean result = baseRepository.updateById(SysSmsTempMapper.INSTANCE.convertPO(source)) != 0;
         if(result){
-            smsProducer.sendSmsTemplateRefreshMessage();
+            eventBus.publishShare(TEMP_REFRESH_TOPIC,new Object());
         }
         return result;
     };
@@ -110,7 +108,7 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
         validateSmsTempSource(source);
         boolean result = baseRepository.insert(SysSmsTempMapper.INSTANCE.convertPO(source)) != 0;
         if(result){
-            smsProducer.sendSmsTemplateRefreshMessage();
+            eventBus.publishShare(TEMP_REFRESH_TOPIC,new Object());
         }
         return result;
     };
@@ -131,13 +129,20 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
             }
         }
         int result = baseRepository.deleteBatchIds(ids);
-        smsProducer.sendSmsTemplateRefreshMessage();
+        eventBus.publishShare(TEMP_REFRESH_TOPIC,new Object());
         return result;
     }
 
     @Override
     public String formatSmsTemplateContent(String content, Map<String, Object> templateParams) {
-        return StrUtil.format(content, templateParams);
+        Set<String> keys = templateParams.keySet();
+        for (String key : keys) {
+            Object value = templateParams.get(key);
+            Properties p = new Properties();
+            p.setProperty(key,String.valueOf(value));
+            content=propertyPlaceholderHelper.replacePlaceholders(content,p);
+        }
+        return content;
     }
 
     @Override

+ 86 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/FileDownloadController.java

@@ -0,0 +1,86 @@
+package cn.tr.module.sys.storage.controller;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.core.utils.JsonUtils;
+import cn.tr.module.sys.storage.dto.SysStorageConfigDTO;
+import cn.tr.module.sys.storage.service.ISysStorageConfigService;
+import cn.tr.plugin.file.config.FileClient;
+import cn.tr.plugin.file.config.FileClientConfig;
+import cn.tr.plugin.file.config.FileClientFactory;
+import cn.tr.plugin.file.config.FileContent;
+import cn.tr.plugin.file.config.local.LocalFileClientConfig;
+import cn.tr.plugin.file.enums.FileStorageEnum;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+/**
+ * @ClassName : FileDownloadController
+ * @Description : 文件下载
+ * @Author : LF
+ * @Date: 2023年05月11日
+ */
+@Api(tags = "本地、DB文件下载")
+@RestController
+@RequestMapping("/download/file")
+@AllArgsConstructor
+public class FileDownloadController {
+    private final ISysStorageConfigService storageConfigService;
+    private final FileClientFactory fileClientFactory;
+    @GetMapping("/local/{configId}/**")
+    @ApiOperation(value = "获取本地存储文件",notes = "权限:无")
+    public void localFile(HttpServletRequest request, HttpServletResponse response, @PathVariable("configId") String configId) throws IOException {
+        String servletPath = request.getServletPath();
+        String bizPath= StrUtil.subAfter(servletPath,configId+"/",false);
+        SysStorageConfigDTO storageConfig = storageConfigService.selectSysStorageConfigById(configId);
+        Map<String, Object> config = storageConfig.getConfig();
+        LocalFileClientConfig localFileClientConfig = JsonUtils.parseObject(JsonUtils.toJsonString(config), LocalFileClientConfig.class);
+        File file = FileUtil.file(localFileClientConfig.getLocalBasePath() + File.separator + configId + File.separator + bizPath);
+        if(!file.exists()){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0404,"文件不存在");
+        }
+        writeFile(response,FileUtil.getInputStream(file));
+    }
+
+    @GetMapping("/db/{configId}/**")
+    @ApiOperation(value = "获取DB存储文件",notes = "权限:无")
+    public void dbFile(HttpServletRequest request, HttpServletResponse response, @PathVariable("configId") String configId) throws Exception {
+        String servletPath = request.getServletPath();
+        String bizPath= StrUtil.subAfter(servletPath,configId+"/",false);
+        SysStorageConfigDTO storageConfig = storageConfigService.selectSysStorageConfigById(configId);
+        FileClient fileClient = fileClientFactory.createOrUpdateFileClient(storageConfig.getId(), storageConfig.getType(),parseClientConfig(storageConfig.getType(), storageConfig.getConfig()));
+        FileContent fileContent = fileClient.getContent(bizPath);
+        if(fileContent.getContent()==null){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0404,"文件不存在");
+        }
+        writeFile(response,IoUtil.toStream(fileContent.getContent()));
+    }
+
+
+    private void writeFile(HttpServletResponse response, InputStream in) throws IOException {
+        response.setContentType("application/octet-stream");
+        IoUtil.copy(in,response.getOutputStream());
+    }
+
+    private FileClientConfig parseClientConfig(String storage, Map<String, Object> config) {
+        Class<? extends FileClientConfig> configClass = FileStorageEnum.getByStorage(storage)
+                .getConfigClass();
+        config.put("@Clazz",configClass.getName());
+        return  JsonUtils.parseObject(JsonUtils.toJsonString(config), configClass);
+    }
+}

+ 62 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/StorageFileController.java

@@ -0,0 +1,62 @@
+package cn.tr.module.sys.storage.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.io.IoUtil;
+import cn.tr.core.pojo.CommonResult;
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+import cn.tr.module.sys.storage.service.IStorageFileService;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.Collection;
+
+/**
+ * @ClassName : 文件上传下载操作
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月10日
+ */
+@Api(tags = "文件上传下载操作")
+@RestController
+@RequestMapping("/sys/storage/file")
+@AllArgsConstructor
+public class StorageFileController {
+    private final IStorageFileService fileService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @PostMapping("/upload")
+    @ApiOperation( value = "上传文件",notes = "权限:无")
+    public CommonResult<SysStorageRecordDTO> uploadFile(@RequestParam MultipartFile file,
+                                                        @RequestParam(required = false) String configId,
+                                                        @RequestParam(required = false) String cateId) throws Exception {
+        return CommonResult.success(fileService.upload(cateId,configId,file.getOriginalFilename(), IoUtil.readBytes(file.getInputStream())));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @PostMapping("/removeByIds")
+    @ApiOperation( value = "删除文件",notes = "权限:storage:file:remove")
+    @SaCheckPermission("storage:file:remove")
+    public CommonResult<Boolean> deleteFile(@RequestBody Collection<String> ids) throws Exception {
+        fileService.remove(ids);
+        return CommonResult.success(true);
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @GetMapping("/download/{recordId}")
+    @ApiOperation(value = "获取文件下载路径",notes = "权限:无")
+    public  CommonResult<String> download(@PathVariable("recordId") String recordId) throws Exception {
+        return CommonResult.success(fileService.obtainDownloadPath(recordId));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @GetMapping("/preview/{recordId}")
+    @ApiOperation(value = "获取文件预览路径",notes = "权限:无")
+    public  CommonResult<String> preview(@PathVariable("recordId") String recordId) throws Exception {
+        return CommonResult.success(fileService.obtainPreviewPath(recordId));
+    }
+
+
+}

+ 90 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageConfigController.java

@@ -0,0 +1,90 @@
+package cn.tr.module.sys.storage.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.sys.storage.dto.SysStorageConfigDTO;
+import cn.tr.module.sys.storage.service.ISysStorageConfigService;
+import cn.tr.module.sys.storage.dto.SysStorageConfigQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.plugin.operatelog.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 文件存储配置控制器
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ */
+@Api(tags = "文件存储配置")
+@RestController
+@RequestMapping("/sys/storage/config")
+@AllArgsConstructor
+public class SysStorageConfigController extends BaseController{
+
+    private final ISysStorageConfigService sysStorageConfigService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询文件存储配置",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<SysStorageConfigDTO> selectList(@RequestBody SysStorageConfigQueryDTO query) {
+        startPage();
+        return getDataTable(sysStorageConfigService.selectSysStorageConfigList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询文件存储配置",notes = "权限: storage:config:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("storage:config:query")
+    public CommonResult<SysStorageConfigDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(sysStorageConfigService.selectSysStorageConfigById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加文件存储配置",notes = "权限: storage:config:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("storage:config:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysStorageConfigDTO source) {
+        return CommonResult.success(sysStorageConfigService.insertSysStorageConfig(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑文件存储配置",notes = "权限: storage:config:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("storage:config:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysStorageConfigDTO source) {
+        return CommonResult.success(sysStorageConfigService.updateSysStorageConfigById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除文件存储配置",notes = "权限: storage:config:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("storage:config:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(sysStorageConfigService.removeSysStorageConfigByIds(ids));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 6)
+    @ApiOperation(value="设置主存储配置",notes = "权限: storage:config:edit")
+    @PostMapping("/master/{configId}")
+    @OperateLog
+    @SaCheckPermission("storage:config:edit")
+    public CommonResult<Boolean> master(@PathVariable("configId") String configId) {
+        sysStorageConfigService.setMasterConfig(configId);
+        return CommonResult.success(true);
+    }
+}

+ 80 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageRecordController.java

@@ -0,0 +1,80 @@
+package cn.tr.module.sys.storage.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import cn.tr.core.pojo.CommonResult;
+import lombok.AllArgsConstructor;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+import cn.tr.module.sys.storage.service.ISysStorageRecordService;
+import cn.tr.module.sys.storage.dto.SysStorageRecordQueryDTO;
+import java.util.*;
+import cn.tr.plugin.mybatis.base.BaseController;
+import org.springframework.web.bind.annotation.*;
+import cn.tr.plugin.operatelog.annotation.OperateLog;
+import cn.tr.core.pojo.TableDataInfo;
+/**
+ * 存储记录控制器
+ *
+ * @author lf
+ * @date  2023/05/10 14:55
+ */
+@Api(tags = "存储记录")
+@RestController
+@RequestMapping("/sys/storage/record")
+@AllArgsConstructor
+public class SysStorageRecordController extends BaseController{
+
+    private final ISysStorageRecordService sysStorageRecordService;
+
+    @ApiOperationSupport(author = "lf",order = 1)
+    @ApiOperation(value="根据条件查询存储记录",notes = "权限: 无")
+    @PostMapping("/query/page")
+    public TableDataInfo<SysStorageRecordDTO> selectList(@RequestBody SysStorageRecordQueryDTO query) {
+        startPage();
+        return getDataTable(sysStorageRecordService.selectSysStorageRecordList(query));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 2)
+    @ApiOperation(value = "根据id查询存储记录",notes = "权限: storage:record:query")
+    @GetMapping("/detail/{id}")
+    @SaCheckPermission("storage:record:query")
+    public CommonResult<SysStorageRecordDTO> findById(@PathVariable("id") String id){
+        return CommonResult.success(sysStorageRecordService.selectSysStorageRecordById(id));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 3)
+    @ApiOperation(value="添加存储记录",notes = "权限: storage:record:add")
+    @PostMapping("/add")
+    @OperateLog
+    @SaCheckPermission("storage:record:add")
+    public CommonResult<Boolean> add(@RequestBody@Validated(Insert.class) SysStorageRecordDTO source) {
+        return CommonResult.success(sysStorageRecordService.insertSysStorageRecord(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 4)
+    @ApiOperation(value="通过主键id编辑存储记录",notes = "权限: storage:record:edit")
+    @PostMapping("/edit")
+    @OperateLog
+    @SaCheckPermission("storage:record:edit")
+    public CommonResult<Boolean> edit(@RequestBody@Validated(Update.class) SysStorageRecordDTO source) {
+        return CommonResult.success(sysStorageRecordService.updateSysStorageRecordById(source));
+    }
+
+    @ApiOperationSupport(author = "lf",order = 5)
+    @ApiOperation(value="删除存储记录",notes = "权限: storage:record:remove")
+    @PostMapping("/removeByIds")
+    @OperateLog
+    @SaCheckPermission("storage:record:remove")
+    public CommonResult<Integer> delete(@RequestBody Collection<String> ids) {
+        return CommonResult.success(sysStorageRecordService.removeSysStorageRecordByIds(ids));
+    }
+}

+ 23 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/FileUploadDTO.java

@@ -0,0 +1,23 @@
+package cn.tr.module.sys.storage.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @ClassName : FileUploadDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月11日
+ */
+@Data
+@ApiModel("文件上传")
+public class FileUploadDTO {
+    @ApiModelProperty("文件上传")
+    private MultipartFile file;
+    @ApiModelProperty("文件所属目录id")
+    private String cateId;
+    @ApiModelProperty("文件存储配置id")
+    private String configId;
+}

+ 54 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageConfigDTO.java

@@ -0,0 +1,54 @@
+package cn.tr.module.sys.storage.dto;
+
+import cn.tr.plugin.file.config.FileClientConfig;
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import cn.tr.core.validation.Insert;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import javax.validation.constraints.*;
+import java.util.Map;
+
+/**
+ * 文件存储配置传输对象
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ **/
+@Data
+@ApiModel("文件存储配置传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class SysStorageConfigDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "文件配置主键", position = 1)
+    @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String id;
+
+    @ApiModelProperty(value = "文件配置名称", position = 2)
+    @NotBlank  (message = "文件配置名称不能为空",groups = {Update.class,Insert.class})
+    private String name;
+
+    @ApiModelProperty(value = "主配置", position = 3)
+    @NotNull  (message = "主配置不能为空",groups = {Update.class,Insert.class})
+    private Boolean master;
+
+    /**
+     * 存储器类型
+     * {@link cn.tr.plugin.file.enums.FileStorageEnum}
+     */
+    @ApiModelProperty(value = "存储器类型", position = 4,example = "ali")
+    @NotBlank  (message = "存储器类型不能为空",groups = {Update.class,Insert.class})
+    private String type;
+
+    @ApiModelProperty(value = "文件配置", position = 5)
+    @NotNull  (message = "文件配置不能为空",groups = {Update.class,Insert.class})
+    private Map<String, Object> config;
+
+    @ApiModelProperty(value = "备注", position = 6)
+    private String remark;
+
+}

+ 24 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageConfigQueryDTO.java

@@ -0,0 +1,24 @@
+package cn.tr.module.sys.storage.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 文件存储配置查询参数
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ **/
+@Data
+@ApiModel("文件存储配置查询参数")
+@ToString
+public class SysStorageConfigQueryDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "文件配置名称", position = 1)
+    private String name;
+    @ApiModelProperty(value = "文件配置类型", position = 2)
+    private String type;
+
+}

+ 53 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageRecordDTO.java

@@ -0,0 +1,53 @@
+package cn.tr.module.sys.storage.dto;
+
+import cn.tr.plugin.mybatis.pojo.BaseDTO;
+import lombok.*;
+import cn.tr.core.validation.Update;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.*;
+
+/**
+ * 存储记录传输对象
+ *
+ * @author lf
+ * @date  2023/05/10 14:55
+ **/
+@Data
+@ApiModel("存储记录传输对象")
+@EqualsAndHashCode(callSuper = true)
+@ToString
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class SysStorageRecordDTO extends BaseDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "存储记录id", position = 1)
+    @NotBlank  (message = "主键不能为空",groups = {Update.class})
+    private String id;
+
+    @ApiModelProperty(value = "文件真实名称", position = 2)
+    private String realName;
+
+    @ApiModelProperty(value = "文件业务名称", readOnly = true,position = 3)
+    private String bizName;
+
+    @ApiModelProperty(value = "绝对路径", position = 4)
+    private String absolutePath;
+
+    @ApiModelProperty(value = "存储配置id", position = 5)
+    private String configId;
+
+    @ApiModelProperty(value = "文件大小(KB)", position = 6)
+    private Integer size;
+
+    @ApiModelProperty(value = "文件后缀", position = 7)
+    private String suffix;
+
+    @ApiModelProperty(value = "所属目录id", position = 9)
+    private String cateId;
+
+    @ApiModelProperty(value = "存储配置名称", position = 10,readOnly = true)
+    private String configName;
+}

+ 25 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageRecordQueryDTO.java

@@ -0,0 +1,25 @@
+package cn.tr.module.sys.storage.dto;
+
+import lombok.ToString;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 存储记录查询参数
+ *
+ * @author lf
+ * @date  2023/05/10 14:55
+ **/
+@Data
+@ApiModel("存储记录查询参数")
+@ToString
+public class SysStorageRecordQueryDTO  {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "配置id", position = 1)
+    private String configId;
+    @ApiModelProperty(value = "文件名称", position = 2)
+    private String realName;
+
+
+}

+ 37 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/mapper/SysStorageConfigMapper.java

@@ -0,0 +1,37 @@
+package cn.tr.module.sys.storage.mapper;
+
+import cn.tr.module.sys.storage.po.SysStorageConfigPO;
+import cn.tr.module.sys.storage.dto.SysStorageConfigDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.Mappings;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 文件存储配置映射工具
+*
+* @author lf
+* @date  2023/05/09 14:29
+**/
+@Mapper
+public interface SysStorageConfigMapper {
+    SysStorageConfigMapper INSTANCE = Mappers.getMapper(SysStorageConfigMapper.class);
+
+    @Mapping(target = "config", ignore = true)
+    SysStorageConfigPO convertPO(SysStorageConfigDTO source);
+
+    @Mappings(
+            {
+                    @Mapping(target = "config", source ="configMap" ),
+            }
+    )
+
+    SysStorageConfigDTO convertDto(SysStorageConfigPO source);
+
+    List<SysStorageConfigDTO> convertDtoList(List<SysStorageConfigPO> source);
+
+    List<SysStorageConfigPO> convertPOList(List<SysStorageConfigDTO> source);
+
+}

+ 28 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/mapper/SysStorageRecordMapper.java

@@ -0,0 +1,28 @@
+package cn.tr.module.sys.storage.mapper;
+
+import cn.tr.module.sys.storage.po.SysStorageRecordPO;
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+* 存储记录映射工具
+*
+* @author lf
+* @date  2023/05/10 14:55
+**/
+@Mapper
+public interface SysStorageRecordMapper {
+    SysStorageRecordMapper INSTANCE = Mappers.getMapper(SysStorageRecordMapper.class);
+
+    SysStorageRecordPO convertPO(SysStorageRecordDTO source);
+
+    SysStorageRecordDTO convertDto(SysStorageRecordPO source);
+
+    List<SysStorageRecordDTO> convertDtoList(List<SysStorageRecordPO> source);
+
+    List<SysStorageRecordPO> convertPOList(List<SysStorageRecordDTO> source);
+
+}

+ 65 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/po/SysStorageConfigPO.java

@@ -0,0 +1,65 @@
+package cn.tr.module.sys.storage.po;
+
+
+import cn.tr.core.utils.JsonUtils;
+import cn.tr.plugin.file.config.FileClientConfig;
+import cn.tr.plugin.mybatis.pojo.BasePO;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.Map;
+
+/**
+ * 文件存储配置实体
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ **/
+@Data
+@TableName(value = "sys_storage_config",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+@Accessors(chain = true)
+public class SysStorageConfigPO extends BasePO {
+
+    /** 文件配置主键 */
+    @TableId
+    @ApiModelProperty(value = "文件配置主键", position = 1)
+    private String id;
+
+    /** 文件配置名称 */
+    @ApiModelProperty(value = "文件配置名称", position = 2)
+    private String name;
+
+    /** 主配置 */
+    @ApiModelProperty(value = "主配置", position = 3)
+    private Boolean master;
+
+    /**
+     * 存储器类型
+     * {@link cn.tr.plugin.file.enums.FileStorageEnum}
+     */
+    @ApiModelProperty(value = "存储器类型", position = 4)
+    private String type;
+
+    /** 文件配置 */
+    @ApiModelProperty(value = "文件配置", position = 5)
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private FileClientConfig config;
+
+    /** 备注 */
+    @ApiModelProperty(value = "备注", position = 6)
+    private String remark;
+
+
+    public Map<String,Object> getConfigMap() {
+        return JsonUtils.parseMap(JsonUtils.toJsonString(this.config));
+    }
+}

+ 34 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/po/SysStorageFilePO.java

@@ -0,0 +1,34 @@
+package cn.tr.module.sys.storage.po;
+
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+/**
+ * db类型文件存储实体
+ *
+ * @author lf
+ * @date  2023/05/11 16:14
+ **/
+@Data
+@TableName(value="sys_storage_file",autoResultMap = true)
+@ToString
+public class SysStorageFilePO {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** content */
+    @ApiModelProperty(value = "文件存储内容", position = 2)
+    private byte[] content;
+
+    @ApiModelProperty(value = "文件存储配置id", position = 3)
+    private String configId;
+
+    @ApiModelProperty(value = "文件业务路径", position = 4)
+    private String bizName;
+}

+ 56 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/po/SysStorageRecordPO.java

@@ -0,0 +1,56 @@
+package cn.tr.module.sys.storage.po;
+
+import cn.tr.plugin.mybatis.pojo.TenantPO;   
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 存储记录实体
+ *
+ * @author lf
+ * @date  2023/05/10 14:55
+ **/
+@Data
+@TableName(value="sys_storage_record",autoResultMap = true)
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class SysStorageRecordPO extends TenantPO {
+
+    /** 存储记录id */
+    @TableId
+    @ApiModelProperty(value = "存储记录id", position = 1)
+    private String id;
+
+    /** 文件真实名称 */
+    @ApiModelProperty(value = "文件真实名称", position = 2)
+    private String realName;
+
+    /** 文件业务名称 */
+    @ApiModelProperty(value = "文件业务名称", position = 2)
+    private String bizName;
+
+    /** 绝对路径 */
+    @ApiModelProperty(value = "绝对路径", position = 3)
+    private String absolutePath;
+
+    /** 存储配置id */
+    @ApiModelProperty(value = "存储配置id", position = 6)
+    private String configId;
+
+    /** 文件大小 */
+    @ApiModelProperty(value = "文件大小", position = 7)
+    private Integer size;
+
+    /** 文件后缀 */
+    @ApiModelProperty(value = "文件后缀", position = 8)
+    private String suffix;
+
+    /** 所属目录id */
+    @ApiModelProperty(value = "所属目录id", position = 9)
+    private String cateId;
+
+}

+ 20 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/properties/TrStorageProperties.java

@@ -0,0 +1,20 @@
+package cn.tr.module.sys.storage.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @ClassName : TrStorageProperties
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月12日
+ */
+@Data
+@ConfigurationProperties(prefix = "tr.storage")
+public class TrStorageProperties {
+    /**
+     * 预览路径
+     */
+    private String previewUrl;
+}

+ 16 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/repository/SysStorageConfigRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.sys.storage.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.sys.storage.po.SysStorageConfigPO;
+/**
+ * 文件存储配置Mapper接口
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ **/
+@Repository
+@Mapper
+public interface SysStorageConfigRepository extends BaseMapper<SysStorageConfigPO> {
+}

+ 16 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/repository/SysStorageFileRepository.java

@@ -0,0 +1,16 @@
+package cn.tr.module.sys.storage.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.sys.storage.po.SysStorageFilePO;
+/**
+ * db类型文件存储Mapper接口
+ *
+ * @author lf
+ * @date  2023/05/11 16:14
+ **/
+@Repository
+@Mapper
+public interface SysStorageFileRepository extends BaseMapper<SysStorageFilePO> {
+}

+ 23 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/repository/SysStorageRecordRepository.java

@@ -0,0 +1,23 @@
+package cn.tr.module.sys.storage.repository;
+
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+import cn.tr.module.sys.storage.dto.SysStorageRecordQueryDTO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import cn.tr.module.sys.storage.po.SysStorageRecordPO;
+import java.util.*;
+/**
+ * 存储记录Mapper接口
+ *
+ * @author lf
+ * @date  2023/05/10 14:55
+ **/
+@Repository
+@Mapper
+public interface SysStorageRecordRepository extends BaseMapper<SysStorageRecordPO> {
+    List<SysStorageRecordDTO> stdSelectList(@Param("query") SysStorageRecordQueryDTO query);
+
+    SysStorageRecordDTO stdSelectById(@Param("recordId") String recordId);
+}

+ 50 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/IStorageFileService.java

@@ -0,0 +1,50 @@
+package cn.tr.module.sys.storage.service;
+
+
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+
+import java.util.*;
+
+/**
+ * @ClassName : IStorageFileService
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月10日
+ */
+
+public interface IStorageFileService {
+    /**
+     * 初始化默认配置
+     */
+    void initDefaultConfig();
+
+    /**
+     * 上传文件
+     * @param configId 存储配置id 当configId为空时,使用默认主存储配置
+     * @param cateId 文件所属目录id
+     * @param filename 文件名称
+     * @param content 文件内容
+     * @return
+     */
+    SysStorageRecordDTO upload(String configId, String cateId, String filename, byte[] content) throws Exception;
+
+    /**
+     * 删除文件
+     * @param recordIds
+     */
+    void remove(Collection<String> recordIds);
+
+    /**
+     * 获取下载路径
+     * @param recordId 文件存储id
+     * @return
+     */
+    String obtainDownloadPath(String recordId) throws Exception;
+
+    /**
+     * 获取预览路径
+     * @param recordId 文件存储id
+     * @return
+     */
+    String obtainPreviewPath(String recordId) throws Exception;
+}

+ 75 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/ISysStorageConfigService.java

@@ -0,0 +1,75 @@
+package cn.tr.module.sys.storage.service;
+
+import cn.tr.module.sys.storage.dto.SysStorageConfigDTO;
+import cn.tr.module.sys.storage.dto.SysStorageConfigQueryDTO;
+import java.util.*;
+
+/**
+ * 文件存储配置Service接口
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ **/
+public interface ISysStorageConfigService{
+
+    /**
+     * 根据条件查询文件存储配置
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2023/05/09 14:29
+     */
+    List<SysStorageConfigDTO> selectSysStorageConfigList(SysStorageConfigQueryDTO query);
+
+    /**
+     * 根据id查询文件存储配置
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/05/09 14:29
+     */
+    SysStorageConfigDTO selectSysStorageConfigById(String id);
+
+
+    /**
+     * 根据id查询文件存储配置
+     * @param    ids 主键id
+     * @author   lf
+     * @date      2023/05/09 14:29
+     */
+    List<SysStorageConfigDTO> selectSysStorageConfigByIds(Collection<String> ids);
+
+    /**
+     * 编辑文件存储配置
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2023/05/09 14:29
+     */
+    boolean updateSysStorageConfigById(SysStorageConfigDTO source);
+
+    /**
+     * 新增文件存储配置
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/05/09 14:29
+     */
+    boolean insertSysStorageConfig(SysStorageConfigDTO source);
+
+    /**
+     * 删除文件存储配置详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2023/05/09 14:29
+     */
+    int removeSysStorageConfigByIds(Collection<String> ids);
+
+    /**
+     * 设置主配置
+     * @param configId
+     */
+    void setMasterConfig(String configId);
+
+    /**
+     * 查询默认配置
+     * @return
+     */
+    SysStorageConfigDTO selectDefault();
+}

+ 71 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/ISysStorageRecordService.java

@@ -0,0 +1,71 @@
+package cn.tr.module.sys.storage.service;
+
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+import cn.tr.module.sys.storage.dto.SysStorageRecordQueryDTO;
+import java.util.*;
+
+/**
+ * 存储记录Service接口
+ *
+ * @author lf
+ * @date  2023/05/10 14:55
+ **/
+public interface ISysStorageRecordService{
+
+    /**
+     * 根据条件查询存储记录
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2023/05/10 14:55
+     */
+    List<SysStorageRecordDTO> selectSysStorageRecordList(SysStorageRecordQueryDTO query);
+
+    /**
+     * 根据id查询存储记录
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/05/10 14:55
+     */
+    SysStorageRecordDTO selectSysStorageRecordById(String id);
+
+
+    /**
+     * 根据id查询存储记录
+     * @param    ids 主键集合
+     * @author   lf
+     * @date      2023/05/10 14:55
+     */
+    List<SysStorageRecordDTO>  selectSysStorageRecordByIds(Collection<String> ids);
+
+    /**
+     * 编辑存储记录
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2023/05/10 14:55
+     */
+    boolean updateSysStorageRecordById(SysStorageRecordDTO source);
+
+    /**
+     * 新增存储记录
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/05/10 14:55
+     */
+    boolean insertSysStorageRecord(SysStorageRecordDTO source);
+
+    /**
+     * 新增存储记录
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/05/10 14:55
+     */
+    String insertSysStorageRecordReturnId(SysStorageRecordDTO source);
+
+    /**
+     * 删除存储记录详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2023/05/10 14:55
+     */
+    int removeSysStorageRecordByIds(Collection<String> ids);
+}

+ 46 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/DbClientImpl.java

@@ -0,0 +1,46 @@
+package cn.tr.module.sys.storage.service.impl;
+
+import cn.tr.plugin.file.config.db.DbClientDAO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import cn.tr.module.sys.storage.repository.SysStorageFileRepository;
+import cn.tr.module.sys.storage.po.SysStorageFilePO;
+
+import java.util.Objects;
+
+/**
+ * db类型文件存储Service接口实现类
+ *
+ * @author lf
+ * @date  2023/05/11 16:14
+ **/
+@Service
+public class DbClientImpl implements  DbClientDAO {
+    @Autowired
+    private SysStorageFileRepository fileRepository;
+
+    @Override
+    public void upload(String clientId, String bizPath, String contentType, byte[] content) {
+        SysStorageFilePO storageFile = new SysStorageFilePO();
+        storageFile.setContent(content);
+        storageFile.setBizName(bizPath);
+        storageFile.setConfigId(clientId);
+        fileRepository.insert(storageFile);
+    }
+
+    @Override
+    public void delete(String clientId, String bizPath) {
+        fileRepository.delete(new LambdaQueryWrapper<SysStorageFilePO>()
+                .eq(SysStorageFilePO::getBizName,bizPath)
+                .eq(SysStorageFilePO::getConfigId,clientId));
+    }
+
+    @Override
+    public byte[] getContent(String clientId, String bizPath) {
+        SysStorageFilePO file = fileRepository.selectOne(new LambdaQueryWrapper<SysStorageFilePO>()
+                .eq(SysStorageFilePO::getBizName, bizPath)
+                .eq(SysStorageFilePO::getConfigId, clientId));
+        return Objects.isNull(file)?null:file.getContent();
+    }
+}

+ 138 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/StorageFileServiceImpl.java

@@ -0,0 +1,138 @@
+package cn.tr.module.sys.storage.service.impl;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.util.URLUtil;
+import cn.tr.core.utils.JsonUtils;
+import cn.tr.module.sys.storage.dto.SysStorageConfigDTO;
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+import cn.tr.module.sys.storage.properties.TrStorageProperties;
+import cn.tr.module.sys.storage.service.IStorageFileService;
+import cn.tr.module.sys.storage.service.ISysStorageConfigService;
+import cn.tr.module.sys.storage.service.ISysStorageRecordService;
+import cn.tr.plugin.eventbus.annotation.Subscribe;
+import cn.tr.plugin.file.config.FileClient;
+import cn.tr.plugin.file.config.FileClientConfig;
+import cn.tr.plugin.file.config.FileClientFactory;
+import cn.tr.plugin.file.enums.FileStorageEnum;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.PostConstruct;
+import java.io.File;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : StorageFileServiceImpl
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年05月10日
+ */
+@Service
+@EnableConfigurationProperties(TrStorageProperties.class)
+public class StorageFileServiceImpl implements IStorageFileService {
+
+    //默认配置
+    private SysStorageConfigDTO defaultConfig;
+
+    @Autowired
+    private TrStorageProperties storageProperties;
+
+    @Autowired
+    private FileClientFactory fileClientFactory;
+
+    @Autowired
+    @Lazy
+    private ISysStorageConfigService storageConfigService;
+
+    @Autowired
+    @Lazy
+    private ISysStorageRecordService storageRecordService;
+    @Override
+    @PostConstruct
+    public void initDefaultConfig() {
+        defaultConfig=storageConfigService.selectDefault();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public SysStorageRecordDTO upload(String configId,String cateId,String filename, byte[] content) throws Exception {
+        SysStorageConfigDTO config=defaultConfig;
+        if(StrUtil.isNotEmpty(configId)){
+            config=storageConfigService.selectSysStorageConfigById(configId);
+        }
+        String bizName = createBizName(filename);
+        String suffix = FileUtil.extName(filename);
+        FileClient fileClient = getClient(config);
+        fileClient.upload(content,bizName);
+        String downUrl = fileClient.downUrl(bizName);
+        SysStorageRecordDTO record = SysStorageRecordDTO.builder()
+                .realName(filename)
+                .bizName(bizName)
+                .absolutePath(downUrl)
+                .suffix(suffix)
+                .cateId(cateId)
+                .configId(defaultConfig.getId())
+                .size(content.length/1024)
+                .build();
+        String recordId = storageRecordService.insertSysStorageRecordReturnId(record);
+        record.setId(recordId);
+        return record;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void remove(Collection<String> recordIds) {
+        List<SysStorageRecordDTO> records = storageRecordService.selectSysStorageRecordByIds(recordIds);
+        Map<String, List<SysStorageRecordDTO>> recordByConfigId = records.stream()
+                .collect(Collectors.groupingBy(SysStorageRecordDTO::getConfigId));
+        List<SysStorageConfigDTO> configs = storageConfigService.selectSysStorageConfigByIds(recordByConfigId.keySet());
+        configs.stream()
+                .map(config->getClient(config))
+                .forEach(client->{
+                    List<SysStorageRecordDTO> storageRecords = recordByConfigId.get(client.getId());
+                    for (SysStorageRecordDTO storageRecord : storageRecords) {
+                        client.delete(storageRecord.getBizName());
+                    }
+                });
+    }
+
+    @Override
+    public String obtainDownloadPath(String recordId) throws Exception {
+        SysStorageRecordDTO record = storageRecordService.selectSysStorageRecordById(recordId);
+        SysStorageConfigDTO config = storageConfigService.selectSysStorageConfigById(record.getConfigId());
+        FileClient fileClient = getClient(config);
+        return fileClient.downUrl(record.getBizName());
+    }
+
+    @Override
+    public String obtainPreviewPath(String recordId) throws Exception {
+        return   storageProperties.getPreviewUrl()+URLUtil.encode(Base64.encode(obtainDownloadPath(recordId)));
+    }
+
+
+    private FileClient getClient(SysStorageConfigDTO storageConfig){
+        return fileClientFactory.createOrUpdateFileClient(storageConfig.getId(), storageConfig.getType(),parseClientConfig(storageConfig.getType(), storageConfig.getConfig()));
+    }
+
+    private FileClientConfig parseClientConfig(String storage, Map<String, Object> config) {
+        Class<? extends FileClientConfig> configClass = FileStorageEnum.getByStorage(storage)
+                .getConfigClass();
+        config.put("@Clazz",configClass.getName());
+        return  JsonUtils.parseObject(JsonUtils.toJsonString(config), configClass);
+    }
+
+
+    private String createBizName(String realName){
+        return DateUtil.today() +"/"+ RandomUtil.randomString(4)+"-"+realName;
+    }
+}

+ 184 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/SysStorageConfigServiceImpl.java

@@ -0,0 +1,184 @@
+package cn.tr.module.sys.storage.service.impl;
+
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
+import cn.tr.core.utils.JsonUtils;
+import cn.tr.core.utils.ValidationUtils;
+import cn.tr.module.sys.storage.service.IStorageFileService;
+import cn.tr.plugin.eventbus.annotation.Subscribe;
+import cn.tr.plugin.eventbus.config.EventBus;
+import cn.tr.plugin.file.config.FileClientConfig;
+import cn.tr.plugin.file.enums.FileStorageEnum;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.tr.module.sys.storage.repository.SysStorageConfigRepository;
+import cn.tr.module.sys.storage.po.SysStorageConfigPO;
+import cn.tr.module.sys.storage.dto.SysStorageConfigDTO;
+import cn.tr.module.sys.storage.dto.SysStorageConfigQueryDTO;
+import java.util.*;
+import cn.tr.module.sys.storage.service.ISysStorageConfigService;
+import cn.tr.module.sys.storage.mapper.SysStorageConfigMapper;
+import javax.validation.Validator;
+
+/**
+ * 文件存储配置Service接口实现类
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ **/
+@Service
+public class SysStorageConfigServiceImpl implements ISysStorageConfigService {
+    private final String STORAGE_DEFAULT_TOPIC="/storage/default/refresh";
+    @Autowired
+    private SysStorageConfigRepository baseRepository;
+
+    @Autowired
+    private  Validator validator;
+
+    @Autowired
+    private  EventBus eventBus;
+
+    @Autowired
+    @Lazy
+    private IStorageFileService storageFileService;
+
+    @Subscribe(STORAGE_DEFAULT_TOPIC)
+    public void storageUpdate(){
+        storageFileService.initDefaultConfig();
+    }
+
+    /**
+     * 根据条件查询文件存储配置
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2023/05/09 14:29
+     */
+    @Override
+    public List<SysStorageConfigDTO> selectSysStorageConfigList(SysStorageConfigQueryDTO query){
+        return SysStorageConfigMapper.INSTANCE.convertDtoList(
+                baseRepository.selectList(new LambdaQueryWrapper<SysStorageConfigPO>()
+                        .like(Objects.nonNull(query.getName()),SysStorageConfigPO::getName, query.getName())
+                        .eq(Objects.nonNull(query.getType()),SysStorageConfigPO::getType, query.getType())
+                )
+        );
+    };
+
+    /**
+     * 根据id查询文件存储配置
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/05/09 14:29
+     */
+    @Override
+    public SysStorageConfigDTO selectSysStorageConfigById(String id){
+        return SysStorageConfigMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+    }
+
+    @Override
+    public List<SysStorageConfigDTO> selectSysStorageConfigByIds(Collection<String> ids) {
+        return SysStorageConfigMapper.INSTANCE.convertDtoList(baseRepository.selectBatchIds(ids));
+    }
+
+    ;
+
+    /**
+     * 编辑文件存储配置
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2023/05/09 14:29
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateSysStorageConfigById(SysStorageConfigDTO source){
+        SysStorageConfigPO config = SysStorageConfigMapper.INSTANCE.convertPO(source);
+        config
+                .setConfig(parseClientConfig(config.getType(), source.getConfig()));
+        return baseRepository.updateById(config)!=0;
+    };
+
+    /**
+     * 新增文件存储配置
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/05/09 14:29
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertSysStorageConfig(SysStorageConfigDTO source){
+        Long count = baseRepository.selectCount(new LambdaQueryWrapper<>());
+        boolean master=count==0;
+        SysStorageConfigPO config = SysStorageConfigMapper.INSTANCE.convertPO(source);
+        config
+                .setConfig(parseClientConfig(config.getType(), source.getConfig()))
+                // 默认非 master
+                .setMaster(master);
+        return baseRepository.insert(config)!=0;
+    };
+
+    /**
+     * 删除文件存储配置详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2023/05/09 14:29
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeSysStorageConfigByIds(Collection<String> ids){
+        Long count = baseRepository.selectCount(new LambdaQueryWrapper<SysStorageConfigPO>()
+                .eq(SysStorageConfigPO::getMaster, true)
+                .in(SysStorageConfigPO::getId, ids));
+        if(count>0){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"不可删除主配置");
+        }
+        return baseRepository.deleteBatchIds(ids);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void setMasterConfig(String configId) {
+        //将主配置设置为副配置
+        baseRepository.update(null,new LambdaUpdateWrapper<SysStorageConfigPO>()
+                .eq(SysStorageConfigPO::getMaster,true)
+                .set(SysStorageConfigPO::getMaster,false));
+
+        //设置主配置
+        baseRepository.update(null,new LambdaUpdateWrapper<SysStorageConfigPO>()
+                .eq(SysStorageConfigPO::getId,configId)
+                .set(SysStorageConfigPO::getMaster,true));
+
+        eventBus.publishShare(STORAGE_DEFAULT_TOPIC,new Object());
+    }
+
+    @Override
+    public SysStorageConfigDTO selectDefault() {
+        return SysStorageConfigMapper.INSTANCE.convertDto(baseRepository.selectOne(new LambdaQueryWrapper<SysStorageConfigPO>()
+                .eq(SysStorageConfigPO::getMaster,true)
+                .last("limit 1")));
+    }
+
+    ;
+
+
+    private FileClientConfig parseClientConfig(String storage, Map<String, Object> config) {
+        if(config==null||config.size()==0){
+            throw new ServiceException(TRExcCode.USER_ERROR_A0400,"存储配置不能为空");
+        }
+        // 获取配置类
+        Class<? extends FileClientConfig> configClass = FileStorageEnum.getByStorage(storage)
+                .getConfigClass();
+        if(configClass==null){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,String.format("存储类型{%s}不存在",storage));
+        }
+        config.put("@Clazz",configClass.getName());
+        FileClientConfig clientConfig = JsonUtils.parseObject(JsonUtils.toJsonString(config), configClass);
+        // 参数校验
+        ValidationUtils.validate(validator, clientConfig);
+        // 设置参数
+        return clientConfig;
+    }
+
+}

+ 99 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/SysStorageRecordServiceImpl.java

@@ -0,0 +1,99 @@
+package cn.tr.module.sys.storage.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import cn.tr.module.sys.storage.repository.SysStorageRecordRepository;
+import cn.tr.module.sys.storage.po.SysStorageRecordPO;
+import cn.tr.module.sys.storage.dto.SysStorageRecordDTO;
+import cn.tr.module.sys.storage.dto.SysStorageRecordQueryDTO;
+import java.util.*;
+import cn.tr.module.sys.storage.service.ISysStorageRecordService;
+import cn.tr.module.sys.storage.mapper.SysStorageRecordMapper;
+/**
+ * 存储记录Service接口实现类
+ *
+ * @author lf
+ * @date  2023/05/10 14:55
+ **/
+@Service
+public class SysStorageRecordServiceImpl implements ISysStorageRecordService {
+    @Autowired
+    private SysStorageRecordRepository baseRepository;
+
+
+    /**
+     * 根据条件查询存储记录
+     * @param    query 查询参数
+     * @author   lf
+     * @date      2023/05/10 14:55
+     */
+    @Override
+    public List<SysStorageRecordDTO> selectSysStorageRecordList(SysStorageRecordQueryDTO query){
+        return baseRepository.stdSelectList(query);
+    };
+
+    /**
+     * 根据id查询存储记录
+     * @param    id 主键id
+     * @author   lf
+     * @date      2023/05/10 14:55
+     */
+    @Override
+    public SysStorageRecordDTO selectSysStorageRecordById(String id){
+        return baseRepository.stdSelectById(id);
+    }
+
+    @Override
+    public List<SysStorageRecordDTO> selectSysStorageRecordByIds(Collection<String> ids) {
+        return SysStorageRecordMapper.INSTANCE.convertDtoList(baseRepository.selectBatchIds(ids));
+    }
+
+    ;
+
+    /**
+     * 编辑存储记录
+     * @param   source 编辑实体类
+     * @author  lf
+     * @date     2023/05/10 14:55
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean updateSysStorageRecordById(SysStorageRecordDTO source){
+        return baseRepository.updateById(SysStorageRecordMapper.INSTANCE.convertPO(source))!=0;
+    };
+
+    /**
+     * 新增存储记录
+     * @param   source 新增实体类
+     * @author lf
+     * @date  2023/05/10 14:55
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertSysStorageRecord(SysStorageRecordDTO source){
+        SysStorageRecordPO record = SysStorageRecordMapper.INSTANCE.convertPO(source);
+        return baseRepository.insert(record)!=0;
+    }
+
+    @Override
+    public String insertSysStorageRecordReturnId(SysStorageRecordDTO source) {
+        SysStorageRecordPO record = SysStorageRecordMapper.INSTANCE.convertPO(source);
+        baseRepository.insert(record);
+        return record.getId();
+    }
+
+    ;
+
+    /**
+     * 删除存储记录详情
+     * @param  ids 删除主键集合
+     * @author lf
+     * @date    2023/05/10 14:55
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int removeSysStorageRecordByIds(Collection<String> ids){
+        return baseRepository.deleteBatchIds(ids);
+    };
+}

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantController.java

@@ -2,7 +2,7 @@ package cn.tr.module.sys.tenant.controller;
 
 import cn.tr.module.sys.tenant.dto.SysTenantAddDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
-import cn.tr.module.sys.user.enums.CreateEnum;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import cn.dev33.satoken.annotation.SaCheckPermission;

+ 21 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantPackageController.java

@@ -1,7 +1,10 @@
 package cn.tr.module.sys.tenant.controller;
 
 import cn.tr.core.pojo.TableDataInfo;
-import cn.tr.module.sys.user.enums.CreateEnum;
+import cn.tr.module.sys.tenant.dto.SysTenantPackageMenuAssignDTO;
+import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
+import cn.tr.module.sys.user.dto.SysMenuDTO;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import cn.dev33.satoken.annotation.SaCheckPermission;
@@ -35,6 +38,23 @@ import org.springframework.web.bind.annotation.*;
 public class SysTenantPackageController extends BaseController{
 
     private final ISysTenantPackageService sysTenantPackageService;
+    private final ISysTenantPackageMenuService sysTenantPackageMenuService;
+
+    @GetMapping("/menu/list/{packageId}")
+    @ApiOperation(value = "查询套餐下的权限信息",notes = "权限: 无")
+    public CommonResult<Set<SysMenuDTO>> listMenu(@PathVariable("packageId") String packageId) {
+        return CommonResult.success(sysTenantPackageMenuService.findMenuIdByPackageId(packageId));
+    }
+
+    @PostMapping("/assign")
+    @ApiOperationSupport(author = "lf")
+    @ApiOperation(value = "为套餐分配权限",notes = "权限: sys:tenantPackage:assign")
+    @SaCheckPermission("sys:tenantPackage:assign")
+    @OperateLog
+    public CommonResult<Boolean> selectList(@RequestBody@Validated SysTenantPackageMenuAssignDTO source){
+        sysTenantPackageMenuService.assignPackageMenu(source.getPackageId(),source.getMenuIds());
+        return CommonResult.success(true);
+    }
 
     @ApiOperationSupport(author = "lf",order = 1)
     @ApiOperation(value="根据条件查询租户套餐",notes = "权限:无")

+ 10 - 12
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantAddDTO.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.tenant.dto;
 
 
+import cn.tr.core.validation.Update;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -20,35 +21,32 @@ import java.io.Serializable;
 public class SysTenantAddDTO implements Serializable {
     private static final long serialVersionUID = 1841053739406204228L;
     @ApiModelProperty(value = "租户名称",required = true)
-    @NotEmpty(message = "extends不能为空")
+    @NotEmpty(message = "名称不能为空",groups = {Integer.class, Update.class})
     private String name;
 
     @ApiModelProperty(value = "租户套餐id",required = true)
-    @NotEmpty(message = "租户套餐不能为空")
+    @NotEmpty(message = "套餐不能为空",groups = {Integer.class, Update.class})
     private String packageId;
 
     @ApiModelProperty(value = "租户联系人",required = true)
-    @NotEmpty(message = "租户联系人不能为空")
+    @NotEmpty(message = "联系人不能为空",groups = {Integer.class, Update.class})
     private String contractUser;
 
     @ApiModelProperty(value = "租户类型",hidden = true)
     private String type;
 
-    @ApiModelProperty(value = "用户名称",required = true)
-    @NotEmpty(message = "用户名称不能为空")
+    @ApiModelProperty(value = "管理账号",required = true)
+    @NotEmpty(message = "管理账号不能为空",groups = {Integer.class, Update.class})
     private String username;
 
-    @ApiModelProperty(value = "用户密码",required = true)
-    @NotEmpty(message = "用户密码不能为空")
-    private String password;
-
-    @ApiModelProperty("租户联系人电话")
+    @ApiModelProperty("联系人电话")
+    @NotEmpty(message = "联系人电话不能为空",groups = {Integer.class, Update.class})
     private String contactMobile;
 
     @ApiModelProperty("租户备注")
     private String remark;
 
-    @ApiModelProperty(value = "租户状态 0、开启 1、关闭",required = true)
-    @NotNull(message = "租户状态不能为空")
+    @ApiModelProperty(value = "状态 0、开启 1、关闭",required = true)
+    @NotNull(message = "状态不能为空",groups = {Integer.class, Update.class})
     private Boolean disable;
 }

+ 10 - 9
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantCommonDTO.java

@@ -27,12 +27,12 @@ public class SysTenantCommonDTO extends BaseDTO {
     @NotEmpty(message = "租户id不能为空",groups = {Update.class})
     private String id;
 
-    @ApiModelProperty(value = "租户名称",required = true)
-    @NotEmpty(message = "租户名称不能为空",groups = {Insert.class,Update.class})
+    @ApiModelProperty(value = "名称",required = true)
+    @NotEmpty(message = "名称不能为空",groups = {Insert.class,Update.class})
     private String name;
 
-    @ApiModelProperty(value = "租户套餐id",required = true)
-    @NotEmpty(message = "租户套餐不能为空",groups = {Insert.class,Update.class})
+    @ApiModelProperty(value = "套餐id",required = true)
+    @NotEmpty(message = "套餐不能为空",groups = {Insert.class,Update.class})
     private String packageId;
 
     @ApiModelProperty(value = "租户套餐名称",readOnly = true)
@@ -44,17 +44,18 @@ public class SysTenantCommonDTO extends BaseDTO {
     @ApiModelProperty(value = "租户类型")
     private String type;
 
-    @ApiModelProperty(value = "租户联系人",required = true)
-    @NotEmpty(message = "租户联系人不能为空",groups = {Insert.class,Update.class})
+    @ApiModelProperty(value = "联系人",required = true)
+    @NotEmpty(message = "联系人不能为空",groups = {Insert.class,Update.class})
     private String contractUser;
 
-    @ApiModelProperty("租户联系人电话")
+    @ApiModelProperty("联系人电话")
+    @NotEmpty(message = "联系人电话不能为空",groups = {Insert.class,Update.class})
     private String contactMobile;
 
     @ApiModelProperty("租户备注")
     private String remark;
 
-    @ApiModelProperty(value = "租户状态 0、开启 1、关闭",required = true)
-    @NotNull(message = "租户状态不能为空",groups = {Update.class})
+    @ApiModelProperty(value = "状态 0、开启 1、关闭",required = true)
+    @NotNull(message = "状态不能为空",groups = {Update.class})
     private Boolean disable;
 }

+ 21 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageMenuAssignDTO.java

@@ -0,0 +1,21 @@
+package cn.tr.module.sys.tenant.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @ClassName : SysTenantPackageMenuAssignDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年04月11日
+ */
+@Data
+public class SysTenantPackageMenuAssignDTO {
+    @NotNull(message = "套餐id不能为空")
+    private String packageId;
+
+    @NotNull(message = "菜单id不能为空")
+    private List<String> menuIds;
+}

+ 4 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantPackageMenuService.java

@@ -16,10 +16,11 @@ import java.util.*;
 public interface ISysTenantPackageMenuService {
     /**
      * 为租户套餐分配菜单
-     * @param source 租户套餐菜单关联信息
+     * @param packageId 套餐id
+     * @param
      * @return
      */
-    void assignPackageMenu(List<SysTenantPackageMenuDTO> source);
+    void assignPackageMenu(String packageId,List<String> menuIds);
 
     /**
      * 通过菜单id找到所有持有该菜单的套餐
@@ -31,7 +32,7 @@ public interface ISysTenantPackageMenuService {
 
     /**
      * 删除套餐缓存
-     * {@link ISysTenantPackageMenuService#assignPackageMenu(List)}
+     * {@link ISysTenantPackageMenuService#assignPackageMenu(String,List)}
      * {@link cn.tr.module.sys.user.service.ISysMenuService#deleteSysMenuByIds(Collection)}
      * {@link cn.tr.module.sys.user.service.ISysMenuService#updateSysMenuById(SysMenuDTO)}
      * @param packageId

+ 24 - 14
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageMenuServiceImpl.java

@@ -2,9 +2,9 @@ package cn.tr.module.sys.tenant.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.StrUtil;
-import cn.tr.module.sys.tenant.mapper.SysTenantPackageMenuMapper;
+import cn.tr.core.exception.ServiceException;
+import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.tenant.dto.SysTenantPackageDTO;
-import cn.tr.module.sys.tenant.dto.SysTenantPackageMenuDTO;
 import cn.tr.module.sys.tenant.enums.PackageEnum;
 import cn.tr.module.sys.tenant.po.SysTenantPackageMenuPO;
 import cn.tr.module.sys.tenant.repository.SysTenantPackageMenuRepository;
@@ -12,6 +12,7 @@ import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageService;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysRoleDTO;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.module.sys.user.service.ISysMenuService;
 import cn.tr.module.sys.user.service.ISysRoleService;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -48,19 +49,28 @@ public class SysTenantPackageMenuServiceImpl  extends ServiceImpl<SysTenantPacka
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void assignPackageMenu(List<SysTenantPackageMenuDTO> source) {
-        List<SysTenantPackageMenuPO> packageMenus = SysTenantPackageMenuMapper.INSTANCE.toPOList(source);
+    public void assignPackageMenu(String packageId,List<String> menuIds) {
+        SysTenantPackageDTO tenantPackage = tenantPackageService.selectSysTenantPackageById(packageId);
+        if(StrUtil.equals(tenantPackage.getType(), CreateEnum.sys.name())){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统套餐进行操作");
+        }
         Collection<SysRoleDTO> sysRoles = roleService.findAllSysRoles();
-        Map<String, List<SysTenantPackageMenuPO>> groupByPackageIdMap = packageMenus
-                .stream()
-                .collect(Collectors.groupingBy(SysTenantPackageMenuPO::getPackageId));
-        groupByPackageIdMap.forEach((packageId,pms)->{
-            baseMapper.delete(
-                    new LambdaQueryWrapper<SysTenantPackageMenuPO>().eq(SysTenantPackageMenuPO::getPackageId,packageId)
-            );
-            self.delCacheMenuIdByPackageId(packageId);
-        });
-        this.saveBatch(packageMenus);
+        baseMapper.delete(
+                new LambdaQueryWrapper<SysTenantPackageMenuPO>().eq(SysTenantPackageMenuPO::getPackageId,packageId)
+        );
+        self.delCacheMenuIdByPackageId(packageId);
+        if(CollectionUtil.isNotEmpty(menuIds)){
+            List<SysTenantPackageMenuPO> packageMenus = menuIds
+                    .stream()
+                    .map(menuId -> {
+                        SysTenantPackageMenuPO result = new SysTenantPackageMenuPO();
+                        result.setMenuId(menuId);
+                        result.setPackageId(packageId);
+                        return result;
+                    })
+                    .collect(Collectors.toList());
+            this.saveBatch(packageMenus);
+        }
         sysRoles.forEach(role->menuService.delRoleMenusCache(role.getId()));
     }
 

+ 5 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java

@@ -2,6 +2,7 @@ package cn.tr.module.sys.tenant.service.impl;
 
 
 import cn.hutool.core.util.StrUtil;
+import cn.tr.core.annotation.TenantIgnore;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.sys.config.SysConfigManager;
@@ -11,7 +12,7 @@ import cn.tr.module.sys.tenant.dto.SysTenantCommonDTO;
 import cn.tr.module.sys.tenant.dto.SysTenantQueryDTO;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
 import cn.tr.module.sys.user.dto.*;
-import cn.tr.module.sys.user.enums.CreateEnum;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.module.sys.user.enums.UserStatusEnum;
 import cn.tr.module.sys.tenant.po.SysTenantPO;
 import cn.tr.module.sys.tenant.repository.SysTenantRepository;
@@ -64,12 +65,15 @@ public class SysTenantServiceImpl implements ISysTenantService {
     @Autowired
     @Lazy
     private ISysTenantPackageMenuService tenantPackageMenuService;
+
     @Override
+    @TenantIgnore
     public List<SysTenantCommonDTO> selectSysTenantList(SysTenantQueryDTO query) {
         return tenantRepository.stdSelectList(query);
     }
 
     @Override
+    @TenantIgnore
     public SysTenantCommonDTO selectSysTenantById(String id) {
         return tenantRepository.stdSelectById(id);
     }

+ 9 - 13
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysPortalController.java

@@ -5,10 +5,7 @@ import cn.tr.core.pojo.CommonResult;
 import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
-import cn.tr.module.sys.user.dto.SysPortalDTO;
-import cn.tr.module.sys.user.dto.SysPortalMenuAssignDTO;
-import cn.tr.module.sys.user.dto.SysPortalMenuDTO;
-import cn.tr.module.sys.user.dto.SysPortalQueryDTO;
+import cn.tr.module.sys.user.dto.*;
 import cn.tr.module.sys.user.service.ISysPortalMenuService;
 import cn.tr.module.sys.user.service.ISysPortalService;
 import cn.tr.plugin.mybatis.base.BaseController;
@@ -36,20 +33,19 @@ import java.util.stream.Collectors;
 public class SysPortalController extends BaseController {
     private final ISysPortalService portalService;
     private final ISysPortalMenuService portalMenuService;
+
+    @GetMapping("/menu/list/{portalId}")
+    @ApiOperation(value = "查询门户下的权限信息",notes = "权限: 无")
+    public CommonResult<List<SysMenuDTO>> listMenu(@PathVariable("portalId") String portalId) {
+        return CommonResult.success(portalMenuService.findAllMenusByPortalId(portalId));
+    }
+
     @PostMapping("/assign")
     @ApiOperationSupport(author = "lf")
     @ApiOperation(value = "为门户分配菜单",notes = "权限: sys:portal:assign")
     @SaCheckPermission("sys:portal:assign")
     public CommonResult<Boolean> selectList(@RequestBody@Validated SysPortalMenuAssignDTO source){
-        portalMenuService.assignPortalMenu(source.getMenuIds()
-                .stream()
-                .map(menuId->{
-                    SysPortalMenuDTO result = new SysPortalMenuDTO();
-                    result.setMenuId(menuId);
-                    result.setPortalId(source.getPortalId());
-                    return result;
-                })
-                .collect(Collectors.toList()));
+        portalMenuService.assignPortalMenu(source.getPortalId(),source.getMenuIds());
         return CommonResult.success(true);
     }
 

+ 2 - 12
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysRoleController.java

@@ -6,7 +6,7 @@ import cn.tr.core.pojo.TableDataInfo;
 import cn.tr.core.validation.Insert;
 import cn.tr.core.validation.Update;
 import cn.tr.module.sys.user.dto.*;
-import cn.tr.module.sys.user.enums.CreateEnum;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.module.sys.user.service.ISysRoleMenuService;
 import cn.tr.module.sys.user.service.ISysRoleService;
 import cn.tr.plugin.mybatis.base.BaseController;
@@ -20,7 +20,6 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * @ClassName : SysRoleController
@@ -56,16 +55,7 @@ public class SysRoleController extends BaseController {
     @SaCheckPermission("sys:role:assign")
     @OperateLog
     public CommonResult<Boolean> selectList(@RequestBody@Validated SysRoleMenuAssignDTO source){
-        List<String> menuIds = source.getMenuIds();
-        roleMenuService.assignRoleMenu(menuIds
-                .stream()
-                .map(menuId->{
-                    SysRoleMenuDTO result = new SysRoleMenuDTO();
-                    result.setMenuId(menuId);
-                    result.setRoleId(source.getRoleId());
-                    return result;
-                })
-                .collect(Collectors.toList()));
+        roleMenuService.assignRoleMenu(source.getRoleId(),source.getMenuIds());
         return CommonResult.success(true);
     }
 

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalDTO.java

@@ -1,5 +1,6 @@
 package cn.tr.module.sys.user.dto;
 
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.core.validation.Update;
 import cn.tr.plugin.mybatis.pojo.BaseDTO;
 import io.swagger.annotations.ApiModelProperty;
@@ -26,7 +27,7 @@ public class SysPortalDTO  extends BaseDTO {
     private String name;
 
     /**
-     * {@link cn.tr.module.sys.user.enums.CreateEnum}
+     * {@link CreateEnum}
      */
     @ApiModelProperty(value = "门户类型 sys、系统门户 custom、自定义门户",readOnly = true)
     private String type;

+ 2 - 2
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/dto/SysPortalQueryDTO.java

@@ -17,9 +17,9 @@ import java.io.Serializable;
 public class SysPortalQueryDTO implements Serializable {
     private static final long serialVersionUID = -262693810220247854L;
     @ApiModelProperty(value = "门户编码")
-    private String portalCode;
+    private String code;
 
     @ApiModelProperty(value = "门户名称")
-    private String portalName;
+    private String name;
 
 }

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysPortalPO.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.user.po;
 
 import cn.tr.core.annotation.Comment;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.plugin.mybatis.pojo.TenantPO;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -28,7 +29,7 @@ public class SysPortalPO extends TenantPO {
     @Comment("门户首页菜单id")
     private String indexMenuId;
     /**
-     * {@link cn.tr.module.sys.user.enums.CreateEnum}
+     * {@link CreateEnum}
      */
     @Comment("门户类型 sys、系统门户 custom、自定义门户")
     private String type;

+ 2 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/po/SysRolePO.java

@@ -1,6 +1,7 @@
 package cn.tr.module.sys.user.po;
 
 import cn.tr.core.annotation.Comment;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.plugin.mybatis.config.handler.StringListTypeHandler;
 import cn.tr.plugin.mybatis.pojo.TenantPO;
 import cn.tr.plugin.numbering.strategy.core.annotation.Numbering;
@@ -39,7 +40,7 @@ public class SysRolePO extends TenantPO {
     private List<String> orgIds;
 
     /**
-     * {@link cn.tr.module.sys.user.enums.CreateEnum}
+     * {@link CreateEnum}
      */
     @Comment("角色类型 sys、系统角色 custom、自定义角色")
     private String type;

+ 3 - 3
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysPortalMenuService.java

@@ -20,10 +20,10 @@ public interface ISysPortalMenuService {
 
     /**
      * 为门户分配菜单
-     * @param source 门户菜单关联信息
+     * @param portalId 门户id
      * @return
      */
-    void assignPortalMenu(List<SysPortalMenuDTO> source);
+    void assignPortalMenu(String portalId,List<String> menuIds);
 
     /**
      * 找到所给门户下的所有菜单
@@ -35,7 +35,7 @@ public interface ISysPortalMenuService {
 
     /**
      * 删除门户菜单缓存
-     * {@link ISysPortalMenuService#assignPortalMenu(List)} (List)} /
+     * {@link ISysPortalMenuService#assignPortalMenu(String,List)} (List)} /
      * @param portalId
      */
     @CacheEvict(value = "sys:portal:menu",key = "#portalId")

+ 5 - 6
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleMenuService.java

@@ -1,7 +1,6 @@
 package cn.tr.module.sys.user.service;
 
 import cn.tr.module.sys.user.dto.SysMenuDTO;
-import cn.tr.module.sys.user.dto.SysRoleMenuDTO;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 
@@ -15,18 +14,18 @@ import java.util.*;
  */
 
 public interface ISysRoleMenuService {
-
     /**
      * 为角色分配菜单
-     * @param source 角色菜单关联信息
+     * @param roleId 角色id
+     * @param menuIds 菜单id
      * @return
      */
-    void assignRoleMenu(List<SysRoleMenuDTO> source);
+    void assignRoleMenu(String roleId,List<String> menuIds);
 
     /**
      * 找到角色id下的所有菜单信息
      * 使用{@link Cacheable} 对role相应数据进行缓存
-     * {@link ISysRoleMenuService#assignRoleMenu(List)}
+     * {@link ISysRoleMenuService#assignRoleMenu(String,List)}
      * @param roleId
      * @return
      */
@@ -37,7 +36,7 @@ public interface ISysRoleMenuService {
     /**
      * 删除缓存
      * 当调用
-     {@link ISysRoleMenuService#assignRoleMenu(List)} /
+     {@link ISysRoleMenuService#assignRoleMenu(String,List)} /
      {@link ISysMenuService#insertSysMenu(SysMenuDTO)} /
      {@link ISysMenuService#updateSysMenuById(SysMenuDTO)} /
      {@link ISysMenuService#deleteSysMenuByIds(Collection)}

+ 1 - 1
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysMenuServiceImpl.java

@@ -13,7 +13,7 @@ import cn.tr.module.sys.tenant.service.ISysTenantService;
 import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.dto.SysMenuQueryDTO;
 import cn.tr.module.sys.user.dto.SysRoleDTO;
-import cn.tr.module.sys.user.enums.CreateEnum;
+import cn.tr.core.enums.CreateEnum;
 import cn.tr.module.sys.user.po.SysMenuPO;
 import cn.tr.module.sys.user.repository.SysMenuRepository;
 import cn.tr.module.sys.user.service.*;

Некоторые файлы не были показаны из-за большого количества измененных файлов