Переглянути джерело

fix(短信日志、短信配置、短信模板、租户套餐、日志切面)
feat(存储配置)

18339543638 2 роки тому
батько
коміт
f8a8355a90
52 змінених файлів з 854 додано та 193 видалено
  1. 47 0
      tr-framework/src/main/java/cn/tr/core/utils/ValidationUtils.java
  2. 1 1
      tr-modules/tr-module-gen/src/main/resources/backend/PO.java.btl
  3. 1 2
      tr-modules/tr-module-gen/src/main/resources/backend/QueryDTO.java.btl
  4. 2 3
      tr-modules/tr-module-gen/src/main/resources/backend/ServiceImpl.java.btl
  5. 1 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/job/dto/SysJobQueryDTO.java
  6. 1 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/jobLog/dto/SysJobLogQueryDTO.java
  7. 0 3
      tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/jobLog/service/impl/SysJobLogServiceImpl.java
  8. 6 0
      tr-modules/tr-module-system/pom.xml
  9. 0 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/file/package-info.java
  10. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/log/dto/SysLogQueryDTO.java
  11. 24 11
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/monitor/controller/SysUserOnlineController.java
  12. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/numStrategy/dto/SysNumberingStrategyQueryDTO.java
  13. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsChannelDTO.java
  14. 8 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsLogDTO.java
  15. 2 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsLogQueryDTO.java
  16. 3 5
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempDTO.java
  17. 4 8
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/dto/SysSmsTempQueryDTO.java
  18. 1 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/po/SysSmsLogPO.java
  19. 0 4
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/po/SysSmsTempPO.java
  20. 7 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/repository/SysSmsLogRepository.java
  21. 8 1
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/repository/SysSmsTempRepository.java
  22. 1 2
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SmsSendServiceImpl.java
  23. 2 15
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsLogServiceImpl.java
  24. 16 14
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/sms/service/impl/SysSmsTempServiceImpl.java
  25. 80 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageConfigController.java
  26. 50 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageConfigDTO.java
  27. 22 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/dto/SysStorageConfigQueryDTO.java
  28. 32 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/mapper/SysStorageConfigMapper.java
  29. 55 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/po/SysStorageConfigPO.java
  30. 16 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/repository/SysStorageConfigRepository.java
  31. 54 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/ISysStorageConfigService.java
  32. 127 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/service/impl/SysStorageConfigServiceImpl.java
  33. 23 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/controller/SysTenantPackageController.java
  34. 10 12
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantAddDTO.java
  35. 10 9
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantCommonDTO.java
  36. 21 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/dto/SysTenantPackageMenuAssignDTO.java
  37. 4 3
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/ISysTenantPackageMenuService.java
  38. 24 14
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantPackageMenuServiceImpl.java
  39. 4 0
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/tenant/service/impl/SysTenantServiceImpl.java
  40. 1 10
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/controller/SysRoleController.java
  41. 5 6
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/ISysRoleMenuService.java
  42. 17 10
      tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysRoleMenuServiceImpl.java
  43. 68 0
      tr-modules/tr-module-system/src/main/resources/mapper/sms/SysSmsLogMapper.xml
  44. 65 0
      tr-modules/tr-module-system/src/main/resources/mapper/sms/SysSmsTempMapper.xml
  45. 7 3
      tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java
  46. 0 4
      tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/FileClientConfig.java
  47. 6 0
      tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/ali/AliFileClientConfig.java
  48. 5 5
      tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/enums/FileStorageEnum.java
  49. 0 19
      tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/pojo/BetweenQuery.java
  50. 7 3
      tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/config/OperateLogAspect.java
  51. 1 0
      tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/handler/GlobalExceptionHandler.java
  52. 2 0
      tr-test/src/main/resources/application.yml

+ 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/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 - 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.*;
+
 /**
  * 定时任务调度表查询参数
  *

+ 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;

+ 6 - 0
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>

+ 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.*;
+
 /**
  * 编号策略查询参数
  *

+ 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);
 }

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

@@ -83,8 +83,7 @@ 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);

+ 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);
     };
 
     /**

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

@@ -17,11 +17,10 @@ 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;
 
@@ -39,12 +38,15 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
 
     @Autowired
     private SmsProducer smsProducer;
+
+    private final PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}");
     /**
      * 根据编码对模板进行缓存操作
      */
     private volatile  Map<String,SysSmsTempPO> tempMapByCode=new ConcurrentHashMap<>();
 
     @Override
+    @PostConstruct
     public void initLocalCache() {
         List<SysSmsTempPO> temps = baseRepository.selectList(new LambdaQueryWrapper<>());
         log.info("[initLocalCache][缓存短信模版,数量为:{}]", temps.size());
@@ -60,14 +62,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 +73,7 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
      */
     @Override
     public SysSmsTempDTO selectSysSmsTempById(String id){
-        return SysSmsTempMapper.INSTANCE.convertDto(baseRepository.selectById(id));
+        return baseRepository.stdSelectById(id);
     };
 
     /**
@@ -137,7 +132,14 @@ public class SysSmsTempServiceImpl implements ISysSmsTempService {
 
     @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

+ 80 - 0
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/storage/controller/SysStorageConfigController.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.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));
+    }
+}

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

@@ -0,0 +1,50 @@
+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;
+
+    @ApiModelProperty(value = "存储器类型", position = 4)
+    @NotBlank  (message = "存储器类型不能为空",groups = {Update.class,Insert.class})
+    private String type;
+
+    @ApiModelProperty(value = "文件配置", position = 5)
+    @NotBlank  (message = "文件配置不能为空",groups = {Update.class,Insert.class})
+    private Map<String, Object> config;
+
+    @ApiModelProperty(value = "备注", position = 6)
+    private String remark;
+
+}

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

@@ -0,0 +1,22 @@
+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 = 2)
+    private String name;
+
+}

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

@@ -0,0 +1,32 @@
+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);
+
+    @Mapping(target = "config", ignore = true)
+    SysStorageConfigDTO convertDto(SysStorageConfigPO source);
+
+    List<SysStorageConfigDTO> convertDtoList(List<SysStorageConfigPO> source);
+
+    List<SysStorageConfigPO> convertPOList(List<SysStorageConfigDTO> source);
+
+}

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

@@ -0,0 +1,55 @@
+package cn.tr.module.sys.storage.po;
+
+
+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;
+
+/**
+ * 文件存储配置实体
+ *
+ * @author lf
+ * @date  2023/05/09 14:29
+ **/
+@Data
+@TableName("sys_storage_config")
+@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;
+
+    /** 存储器类型 */
+    @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;
+
+}

+ 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> {
+}

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

@@ -0,0 +1,54 @@
+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);
+
+    /**
+     * 编辑文件存储配置
+     * @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);
+}

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

@@ -0,0 +1,127 @@
+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.plugin.file.config.FileClientConfig;
+import cn.tr.plugin.file.enums.FileStorageEnum;
+import lombok.AllArgsConstructor;
+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.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
+@AllArgsConstructor
+public class SysStorageConfigServiceImpl implements ISysStorageConfigService {
+
+    private final SysStorageConfigRepository baseRepository;
+
+    private final Validator validator;
+
+    /**
+     * 根据条件查询文件存储配置
+     * @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())
+                )
+        );
+    };
+
+    /**
+     * 根据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));
+    };
+
+    /**
+     * 编辑文件存储配置
+     * @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){
+        SysStorageConfigPO config = SysStorageConfigMapper.INSTANCE.convertPO(source);
+        config
+                .setConfig(parseClientConfig(config.getType(), source.getConfig()))
+                // 默认非 master
+                .setMaster(false);
+        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);
+    };
+
+
+    private FileClientConfig parseClientConfig(String storage, Map<String, Object> config) {
+        // 获取配置类
+        Class<? extends FileClientConfig> configClass = FileStorageEnum.getByStorage(storage)
+                .getConfigClass();
+        FileClientConfig clientConfig = JsonUtils.parseObject(JsonUtils.toJsonString(config), configClass);
+        // 参数校验
+        ValidationUtils.validate(validator, clientConfig);
+        // 设置参数
+        return clientConfig;
+    }
+
+}

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

@@ -1,6 +1,10 @@
 package cn.tr.module.sys.tenant.controller;
 
 import cn.tr.core.pojo.TableDataInfo;
+import cn.tr.module.sys.tenant.dto.SysTenantPackageMenuAssignDTO;
+import cn.tr.module.sys.tenant.dto.SysTenantPackageMenuDTO;
+import cn.tr.module.sys.tenant.service.ISysTenantPackageMenuService;
+import cn.tr.module.sys.user.dto.SysMenuDTO;
 import cn.tr.module.sys.user.enums.CreateEnum;
 import cn.tr.plugin.operatelog.annotation.OperateLog;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -20,6 +24,8 @@ import cn.tr.module.sys.tenant.dto.SysTenantPackageDTO;
 import cn.tr.module.sys.tenant.service.ISysTenantPackageService;
 import cn.tr.module.sys.tenant.dto.SysTenantPackageQueryDTO;
 import java.util.*;
+import java.util.stream.Collectors;
+
 import cn.tr.plugin.mybatis.base.BaseController;
 import org.springframework.web.bind.annotation.*;
 /**
@@ -35,6 +41,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.module.sys.user.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()));
     }
 

+ 4 - 0
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;
@@ -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);
     }

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

@@ -56,16 +56,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);
     }
 

+ 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)}

+ 17 - 10
tr-modules/tr-module-system/src/main/java/cn/tr/module/sys/user/service/impl/SysRoleMenuServiceImpl.java

@@ -55,18 +55,25 @@ public class SysRoleMenuServiceImpl extends ServiceImpl<SysRoleMenuRepository,Sy
     private ISysRoleMenuService self;
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void assignRoleMenu(List<SysRoleMenuDTO> source) {
-        List<SysRoleMenuPO> roleMenus = SysRoleMenuMapper.INSTANCE.toSysRoleMenuPOList(source);
-        Map<String, List<SysRoleMenuPO>> roleIdMap = roleMenus.stream()
-                .collect(Collectors.groupingBy(SysRoleMenuPO::getRoleId));
-        List<SysRolePO> sysRoles = roleRepository.selectList(new LambdaQueryWrapper<SysRolePO>().in(SysRolePO::getId, roleIdMap.keySet())
-                .eq(SysRolePO::getType, CreateEnum.sys.name()));
-        if(CollectionUtil.isNotEmpty(sysRoles)){
+    public void assignRoleMenu(String roleId, List<String> menuIds) {
+        SysRolePO role = roleRepository.selectById(roleId);
+        if(StrUtil.equals(role.getType(),CreateEnum.sys.name())){
             throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"无法对系统角色进行操作");
         }
-        baseMapper.delete(new LambdaQueryWrapper<SysRoleMenuPO>().in(SysRoleMenuPO::getRoleId,roleIdMap.keySet()));
-        saveBatch(roleMenus);
-        roleIdMap.keySet().forEach(self::delRoleMenusCache);
+        baseMapper.delete(new LambdaQueryWrapper<SysRoleMenuPO>().eq(SysRoleMenuPO::getRoleId,roleId));
+        if (CollectionUtil.isNotEmpty(menuIds)) {
+            List<SysRoleMenuPO> roleMenus = menuIds
+                    .stream()
+                    .map(menuId -> {
+                        SysRoleMenuPO result = new SysRoleMenuPO();
+                        result.setMenuId(menuId);
+                        result.setRoleId(roleId);
+                        return result;
+                    })
+                    .collect(Collectors.toList());
+            saveBatch(roleMenus);
+        }
+        self.delRoleMenusCache(roleId);
     }
 
     @Override

+ 68 - 0
tr-modules/tr-module-system/src/main/resources/mapper/sms/SysSmsLogMapper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.tr.module.sys.sms.repository.SysSmsLogRepository">
+
+    <resultMap id="stdResult" type="cn.tr.module.sys.sms.dto.SysSmsLogDTO">
+        <result column="id" property="id"/>
+        <result column="channel_id" property="channelId"/>
+        <result column="channel_name" property="channelName"/>
+        <result column="template_id" property="templateId"/>
+        <result column="template_code" property="templateCode"/>
+        <result column="temp_name" property="templateName"/>
+        <result column="template_type" property="templateType"/>
+        <result column="template_params" property="templateParams" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
+        <result column="template_content" property="templateContent"/>
+        <result column="api_template_id" property="apiTemplateId"/>
+        <result column="mobile" property="mobile"/>
+        <result column="user_id" property="userId"/>
+        <result column="user_type" property="userType"/>
+        <result column="send_status" property="sendStatus"/>
+        <result column="send_time" property="sendTime"/>
+        <result column="send_code" property="sendCode"/>
+        <result column="send_msg" property="sendMsg"/>
+        <result column="api_send_code" property="apiSendCode"/>
+        <result column="api_send_msg" property="apiSendMsg"/>
+        <result column="api_request_id" property="apiRequestId"/>
+        <result column="api_serial_no" property="apiSerialNo"/>
+        <result column="receive_status" property="receiveStatus"/>
+        <result column="receive_time" property="receiveTime"/>
+        <result column="api_receive_code" property="apiReceiveCode"/>
+        <result column="api_receive_msg" property="apiReceiveMsg"/>
+    </resultMap>
+
+    <select id="stdSelectList" resultMap="stdResult" parameterType="cn.tr.module.sys.sms.dto.SysSmsLogQueryDTO">
+        select sl.*,sc.name as channel_name,st.name as temp_name from sys_sms_log as sl
+        LEFT JOIN
+        sys_sms_channel as sc on sl.channel_id=sc.id
+        LEFT JOIN
+        sys_sms_temp as st on sl.template_id=st.id
+        <where>
+            <if test="query.templateCode != null">
+                and sl.template_code like concat('%',#{query.templateCode},'%')
+            </if>
+            <if test="query.mobile != null">
+                and sl.mobile like concat('%',#{query.mobile},'%')
+            </if>
+            <if test="query.sendStatus != null">
+                and sl.send_status = #{query.sendStatus}
+            </if>
+            <if test="query.sendTime != null and query.sendTime.size>0">
+                and sl.send_time &gt; #{query.sendTime[0]} and  sl.send_time &lt;= #{query.sendTime[1]}
+            </if>
+            <if test="query.receiveStatus != null">
+                and sl.receive_status = #{query.receiveStatus}
+            </if>
+        </where>
+    </select>
+
+    <select id="stdSelectById" resultMap="stdResult">
+       select sl.*,sc.name as channel_name,st.name as temp_name from sys_sms_log as sl
+        LEFT JOIN
+        sys_sms_channel as sc on sl.channel_id=sc.id
+        LEFT JOIN
+        sys_sms_temp as st on sl.template_id=st.id
+        where sl.id=#{id}
+    </select>
+ </mapper>

+ 65 - 0
tr-modules/tr-module-system/src/main/resources/mapper/sms/SysSmsTempMapper.xml

@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.tr.module.sys.sms.repository.SysSmsTempRepository">
+
+    <resultMap id="stdResult" type="cn.tr.module.sys.sms.dto.SysSmsTempDTO">
+        <result property="id" column="id"/>
+        <result property="channelId" column="channel_id"/>
+        <result property="channelName" column="channel_name"/>
+        <result property="createType" column="create_type"/>
+        <result property="tempType" column="temp_type"/>
+        <result property="content" column="content"/>
+        <result property="code" column="code"/>
+        <result property="name" column="name"/>
+        <result property="apiTempCode" column="api_temp_code"/>
+        <result property="remark" column="remark"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <select id="stdSelectList" resultMap="stdResult">
+            select st.id as id,
+            st.channel_id as channel_id,
+            st.create_type as create_type,
+            st.temp_type as temp_type,
+            st.content as content,
+            st.code as code,
+            st.name as name,
+            st.api_temp_code as api_temp_code,
+            st.remark as remark,
+            st.create_time as create_time,
+            st.update_time as update_time,
+            sc.`name`  as channel_name
+            from sys_sms_temp as st LEFT JOIN sys_sms_channel as sc on st.channel_id = sc.id
+            <where>
+                <if test="query.channelId != null">
+                    and st.channel_id = #{query.channelId}
+                </if>
+                <if test="query.tempType != null">
+                   and st.temp_type = #{query.tempType}
+                </if>
+                <if test="query.code != null">
+                  and st.code like concat('%',#{query.tempType},'%')
+                </if>
+            </where>
+    </select>
+
+    <select id="stdSelectById" resultMap="stdResult">
+        select st.id as id,
+        st.channel_id as channel_id,
+        st.create_type as create_type,
+        st.temp_type as temp_type,
+        st.content as content,
+        st.code as code,
+        st.name as name,
+        st.api_temp_code as api_temp_code,
+        st.remark as remark,
+        st.create_time as create_time,
+        st.update_time as update_time,
+        sc.`name`  as channel_name
+        from sys_sms_temp as st LEFT JOIN sys_sms_channel as sc on st.channel_id = sc.id
+        where st.id = #{tempId}
+    </select>
+ </mapper>

+ 7 - 3
tr-plugins/tr-spring-boot-starter-plugin-biz-tenant/src/main/java/cn/tr/plugin/biz/tenant/config/web/TenantContextWebFilter.java

@@ -33,9 +33,13 @@ public class TenantContextWebFilter extends OncePerRequestFilter {
             chain.doFilter(request, response);
         } else {
             // 设置
-            String tenantId = LoginUserStrategy.tr.getTenantId();
-            TenantContextHolder.setTenantId(tenantId);
-            TenantContextHolder.setIgnore(false);
+            try {
+                String tenantId = LoginUserStrategy.tr.getTenantId();
+                TenantContextHolder.setTenantId(tenantId);
+                TenantContextHolder.setIgnore(false);
+            }catch (Exception ex){
+
+            }
             chain.doFilter(request, response);
         }
     }

+ 0 - 4
tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/FileClientConfig.java

@@ -11,8 +11,4 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
 public interface FileClientConfig{
 
-    default void validate(){
-        
-    }
-
 }

+ 6 - 0
tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/config/ali/AliFileClientConfig.java

@@ -3,6 +3,8 @@ package cn.tr.plugin.file.config.ali;
 import cn.tr.plugin.file.config.FileClientConfig;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * @ClassName : AliFileClientConfig
  * @Description :
@@ -14,21 +16,25 @@ public class AliFileClientConfig implements FileClientConfig {
     /**
      * accessKey
      */
+    @NotNull(message = "accessKey不能为空")
     private String accessKey;
 
     /**
      * accessSecret
      */
+    @NotNull(message = "accessSecret不能为空")
     private String accessSecret;
 
     /**
      * 地域节点
      */
+    @NotNull(message = "地域节点不能为空")
     private String endpoint;
 
     /**
      * 桶名
      */
+    @NotNull(message = "桶名不能为空")
     private String bucketName;
 
 }

+ 5 - 5
tr-plugins/tr-spring-boot-starter-plugin-file/src/main/java/cn/tr/plugin/file/enums/FileStorageEnum.java

@@ -30,23 +30,23 @@ public enum  FileStorageEnum {
     /**
      * minio 存储
      */
-    Minio("1", MinIoFileClientConfig.class, MinIoFileClient.class),
+    Minio("minio", MinIoFileClientConfig.class, MinIoFileClient.class),
     /**
      * 阿里云存储
      */
-    Ali("2", AliFileClientConfig.class, AliFileClient.class),
+    Ali("ali", AliFileClientConfig.class, AliFileClient.class),
     /**
      * 本地存储
      */
-    Local("3", LocalFileClientConfig.class, LocalFileClient.class),
+    Local("local", LocalFileClientConfig.class, LocalFileClient.class),
     /**
      * 七牛云存储
      */
-    QiNiu("4", QiNiuFileClientConfig.class, QiNiuFileClient.class),
+    QiNiu("qiniu", QiNiuFileClientConfig.class, QiNiuFileClient.class),
     /**
      * 数据库存储
      */
-    DB("5", DbFileClientConfig.class, DbFileClient.class)
+    DB("db", DbFileClientConfig.class, DbFileClient.class)
     ;
     private String storage;
 

+ 0 - 19
tr-plugins/tr-spring-boot-starter-plugin-mybatis/src/main/java/cn/tr/plugin/mybatis/pojo/BetweenQuery.java

@@ -1,19 +0,0 @@
-package cn.tr.plugin.mybatis.pojo;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-/**
- * @ClassName : BetweenQuery
- * @Description : 区间查询参数
- * @Author : JR
- * @Date: 2022年11月21日
- */
-@Data
-@AllArgsConstructor(staticName = "of")
-@NoArgsConstructor
-public class BetweenQuery<T> {
-    private T min;
-    private T max;
-}

+ 7 - 3
tr-plugins/tr-spring-boot-starter-plugin-operatelog/src/main/java/cn/tr/plugin/operatelog/config/OperateLogAspect.java

@@ -125,20 +125,24 @@ public class OperateLogAspect {
         if (result != null) {
             operateLogObj.setType(operateLog.loginType().name());
             if (operateLog.logResultData()) {
-                operateLogObj.setResultJson(obtainMethodArgs(joinPoint));
+                operateLogObj.setResultJson(obtainResultData(result));
             }
         }
         // (异常)处理 resultCode 和 resultMsg 字段
         if (exception != null) {
             operateLogObj.setType(LoginType.exception.name());
-            operateLogObj.setResultJson(obtainResultData( ExceptionStrategy.tr.exceptionHandle(ServletUtils.getRequest(),exception)));
+            operateLogObj.setResultJson(obtainResultErrorMsg( ExceptionStrategy.tr.exceptionHandle(ServletUtils.getRequest(),exception)));
 
         }
     }
 
     private static String obtainResultData(Object result) {
+        return JsonUtils.toJsonString(result);
+    }
+
+    private static String obtainResultErrorMsg(Object result) {
         if (result instanceof CommonResult) {
-            result = ((CommonResult<?>) result).getData();
+            return ((CommonResult<?>) result).getErrorMsg();
         }
         return JsonUtils.toJsonString(result);
     }

+ 1 - 0
tr-plugins/tr-spring-boot-starter-plugin-web/src/main/java/cn/tr/plugin/web/config/handler/GlobalExceptionHandler.java

@@ -96,6 +96,7 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler(value = Exception.class)
     public CommonResult<?> defaultExceptionHandler(HttpServletRequest req, Throwable ex) {
+        log.error("系统执行错误,",ex);
         return ExceptionStrategy.tr.exceptionHandle(req, ex);
     }
 

+ 2 - 0
tr-test/src/main/resources/application.yml

@@ -69,6 +69,8 @@ tr:
 #      任务调度模块
       - sys_job
       - sys_job_log
+#      存储模块
+      - sys_storage_config
     ignore-urls:
       - /oauth2/psw/token
 sa-token: