From 90e4966420567a33c7e371f8071f5399df5627e2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 28 Apr 2021 13:59:28 +0800 Subject: [PATCH] 项目结构调整 x 3 --- pom.xml | 14 +------------- yudao-admin-server/pom.xml | 25 +++++++++++++++++++++++++ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java | 5 +++-- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogCreateReqVO.java | 13 ------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java | 7 +++++++ yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java | 1 + yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java | 4 ++-- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java | 39 --------------------------------------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java | 14 +++++++------- yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java | 4 ++-- yudao-admin-server/src/test/java/cn/iocoder/dashboard/framework/package-info.java | 1 - yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java | 4 ++-- yudao-dependencies/pom.xml | 355 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-framework/pom.xml | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/core/ConfigConsts.java | 4 ++++ yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/ConfigFrameworkDAO.java | 8 ++++++-- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/DBConfigRepository.java | 14 +++++++------- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/dto/ConfigRespDTO.java | 33 +++++++++++++++++++++++++++++++++ yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/dto/DictDataRespDTO.java | 33 +++++++++++++++++++++++++++++++++ yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/service/DictDataFrameworkService.java | 8 ++++---- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/util/DictUtils.java | 6 +++--- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/excel/core/convert/DictConvert.java | 8 ++++---- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java | 3 +-- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java | 84 ++++++++++++++++++++++++++++++++++++++++++------------------------------------------ yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/dto/OperateLogCreateReqDTO.java | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java | 4 ++-- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java | 3 +-- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/filter/JwtAuthenticationTokenFilter.java | 4 ++-- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/service/SecurityPermissionFrameworkService.java | 4 +--- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java | 224 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java | 43 ------------------------------------------- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java | 202 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java | 43 ------------------------------------------- yudao-framework/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-framework/src/main/java/cn/iocoder/dashboard/util/RandomUtils.java | 6 ------ yudao-framework/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java | 13 +++++++++++++ yudao-framework/src/test/java/cn/iocoder/dashboard/framework/package-info.java | 1 + yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/package-info.java | 1 + yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java | 1 + yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/package-info.java | 1 + yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/package-info.java | 1 + yudao-framework/src/test/java/cn/iocoder/dashboard/package-info.java | 1 + 46 files changed, 1003 insertions(+), 1029 deletions(-) delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogCreateReqVO.java delete mode 100644 yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java delete mode 100644 yudao-admin-server/src/test/java/cn/iocoder/dashboard/framework/package-info.java create mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/dto/ConfigRespDTO.java create mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/dto/DictDataRespDTO.java create mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/dto/OperateLogCreateReqDTO.java delete mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java delete mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java delete mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java delete mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java create mode 100644 yudao-framework/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/package-info.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/package-info.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/package-info.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/package-info.java create mode 100644 yudao-framework/src/test/java/cn/iocoder/dashboard/package-info.java diff --git a/pom.xml b/pom.xml index c4540b5..c2a18de 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ ${revision} pom - yudao-dependencies + yudao-admin-server yudao-framework @@ -23,16 +23,4 @@ 1.0.0 - - - - cn.iocoder.boot - yudao-dependencies - ${revision} - pom - import - - - - diff --git a/yudao-admin-server/pom.xml b/yudao-admin-server/pom.xml index 5c9ba30..4785c31 100644 --- a/yudao-admin-server/pom.xml +++ b/yudao-admin-server/pom.xml @@ -7,12 +7,37 @@ cn.iocoder.boot yudao-admin-server ${revision} + jar yudao-admin-server 管理后台 Server,提供其 API 接口 https://github.com/YunaiV/ruoyi-vue-pro + + 1.0.0 + + + + + cn.iocoder.boot + yudao-framework + ${revision} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java index 58a4f1e..48f44bd 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/infra/dal/mysql/config/InfConfigDAOImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.dashboard.modules.infra.dal.mysql.config; import cn.iocoder.dashboard.framework.apollo.internals.ConfigFrameworkDAO; +import cn.iocoder.dashboard.framework.apollo.internals.dto.ConfigRespDTO; import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; @@ -32,8 +33,8 @@ public class InfConfigDAOImpl implements ConfigFrameworkDAO { } @Override - public List selectList() { - return jdbcTemplate.query("SELECT `key`, `value`, update_time, deleted FROM inf_config", new BeanPropertyRowMapper<>(InfConfigDO.class)); + public List selectList() { + return jdbcTemplate.query("SELECT `key`, `value`, update_time, deleted FROM inf_config", new BeanPropertyRowMapper<>(ConfigRespDTO.class)); } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogCreateReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogCreateReqVO.java deleted file mode 100644 index 5cb8490..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/operatelog/SysOperateLogCreateReqVO.java +++ /dev/null @@ -1,13 +0,0 @@ -package cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog; - -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@ApiModel(value = "操作日志创建 Request VO", description = "暂时提供给前端,仅仅后端切面记录操作日志时,进行使用") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class SysOperateLogCreateReqVO extends SysOperateLogBaseVO { -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java index af8fda2..90551d6 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictDataConvert.java @@ -1,11 +1,14 @@ package cn.iocoder.dashboard.modules.system.convert.dict; import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.dict.core.dto.DictDataRespDTO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.*; import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; +import java.util.Collection; import java.util.List; @Mapper @@ -25,4 +28,8 @@ public interface SysDictDataConvert { List convertList02(List bean); + DictDataRespDTO convert02(SysDictDataDO bean); + + List convertList03(Collection list); + } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java index d0ae1a3..6465e67 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/dict/SysDictTypeConvert.java @@ -1,6 +1,7 @@ package cn.iocoder.dashboard.modules.system.convert.dict; import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.dict.core.dto.DictDataRespDTO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.*; import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; import org.mapstruct.Mapper; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java index 92a83ad..7eca70d 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysOperateLogConvert.java @@ -1,7 +1,7 @@ package cn.iocoder.dashboard.modules.system.convert.logger; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; +import cn.iocoder.dashboard.framework.logger.operatelog.core.dto.OperateLogCreateReqDTO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogRespVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; @@ -21,7 +21,7 @@ public interface SysOperateLogConvert { SysOperateLogConvert INSTANCE = Mappers.getMapper(SysOperateLogConvert.class); - SysOperateLogDO convert(SysOperateLogCreateReqVO bean); + SysOperateLogDO convert(OperateLogCreateReqDTO bean); PageResult convertPage(PageResult page); diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java deleted file mode 100644 index 59e6d0d..0000000 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java +++ /dev/null @@ -1,39 +0,0 @@ -package cn.iocoder.dashboard.modules.system.enums.dict; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 字典类型的类型枚举 - */ -@Getter -@AllArgsConstructor -public enum SysDictTypeEnum { - - USER_TYPE("user_type"), // 用户类型 - - SYS_USER_SEX("sys_user_sex"), // 用户性别 - SYS_COMMON_STATUS("sys_common_status"), // 系统状态 - SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型 - SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果 - SYS_CONFIG_TYPE("sys_config_type"), // 参数配置类型 - SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型 - SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码 - SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型 - SYS_SMS_SEND_STATUS("sys_sms_send_status"), // 短信发送状态 - SYS_SMS_RECEIVE_STATUS("sys_sms_receive_status"), // 短信接收状态 - SYS_ERROR_CODE_TYPE("inf_error_code_type"), // 错误码的类型枚举 - - INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型 - INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举 - INF_JOB_LOG_STATUS("inf_job_log_status"), // 定时任务日志状态的枚举 - INF_API_ERROR_LOG_PROCESS_STATUS("inf_api_error_log_process_status"), // API 错误日志的处理状态的枚举 - ; - - - /** - * 值 - */ - private final String value; - -} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java index 7f24cbf..1a2b19c 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.service.dict.impl; import cn.hutool.core.collection.CollUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.pojo.PageResult; +import cn.iocoder.dashboard.framework.dict.core.dto.DictDataRespDTO; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataCreateReqVO; import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.SysDictDataExportReqVO; @@ -23,7 +24,6 @@ import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; -import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -239,18 +239,18 @@ public class SysDictDataServiceImpl implements SysDictDataService { } @Override - public SysDictDataDO getDictDataFromCache(String type, String value) { - return valueDictDataCache.get(type, value); + public DictDataRespDTO getDictDataFromCache(String type, String value) { + return SysDictDataConvert.INSTANCE.convert02(valueDictDataCache.get(type, value)); } @Override - public SysDictDataDO parseDictDataFromCache(String type, String label) { - return labelDictDataCache.get(type, label); + public DictDataRespDTO parseDictDataFromCache(String type, String label) { + return SysDictDataConvert.INSTANCE.convert02(labelDictDataCache.get(type, label)); } @Override - public List listDictDatasFromCache(String type) { - return new ArrayList<>(labelDictDataCache.row(type).values()); + public List listDictDatasFromCache(String type) { + return SysDictDataConvert.INSTANCE.convertList03(labelDictDataCache.row(type).values())); } } diff --git a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java index 5251dfe..f92d8b1 100644 --- a/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java +++ b/yudao-admin-server/src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java @@ -3,7 +3,7 @@ package cn.iocoder.dashboard.modules.system.service.logger.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.pojo.PageResult; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; +import cn.iocoder.dashboard.framework.logger.operatelog.core.dto.OperateLogCreateReqDTO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert; @@ -40,7 +40,7 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { @Override @Async - public Future createOperateLogAsync(SysOperateLogCreateReqVO reqVO) { + public Future createOperateLogAsync(OperateLogCreateReqDTO reqVO) { boolean success = false; try { SysOperateLogDO logDO = SysOperateLogConvert.INSTANCE.convert(reqVO); diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/framework/package-info.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/framework/package-info.java deleted file mode 100644 index 0274647..0000000 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/framework/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package cn.iocoder.dashboard.framework; diff --git a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java index 67f99e3..b1529b6 100644 --- a/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java +++ b/yudao-admin-server/src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java @@ -7,7 +7,7 @@ import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; import cn.iocoder.dashboard.common.pojo.PageResult; import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; +import cn.iocoder.dashboard.framework.logger.operatelog.core.dto.OperateLogCreateReqDTO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO; @@ -48,7 +48,7 @@ public class SysOperateLogServiceImplTest extends BaseDbUnitTest { @Test public void testCreateOperateLogAsync() throws InterruptedException, ExecutionException { String traceId = TracerUtils.getTraceId(); - SysOperateLogCreateReqVO reqVO = RandomUtils.randomPojo(SysOperateLogCreateReqVO.class, o -> { + OperateLogCreateReqDTO reqVO = RandomUtils.randomPojo(OperateLogCreateReqDTO.class, o -> { o.setTraceId(traceId); o.setUserId(randomLongId()); o.setExts(MapUtil.builder("orderId", randomLongId()).build()); diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml index c7c5c3d..829d674 100644 --- a/yudao-dependencies/pom.xml +++ b/yudao-dependencies/pom.xml @@ -13,359 +13,4 @@ 基础 bom 文件,管理整个项目的依赖版本 https://github.com/YunaiV/ruoyi-vue-pro - - 1.0.0 - UTF-8 - UTF-8 - @ - 1.8 - ${java.version} - ${java.version} - 3.8.0 - - - 2.4.4 - - 3.0.2 - 1.5.22 - - 5.1.46 - 1.2.4 - 3.4.2 - 3.3.2 - 3.15.1 - - 1.7.0 - - 2.2.0 - 1.7.0 - - 8.5.0 - 6.1 - 2.3.1 - - 1.16.14 - 1.4.1.Final - 5.6.1 - 2.2.7 - 2.2 - 1.0.5 - 7.2.6.RELEASE - 0.1.16 - - 4.5.18 - 2.1.0 - 1.2.7 - - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - - - cn.iocoder.boot - yudao-dependencies - ${revision} - - - - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.springframework.boot - spring-boot-starter-aop - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-security - - - - org.springframework.boot - spring-boot-starter-validation - - - - com.github.xiaoymin - knife4j-spring-boot-starter - ${knife4j.version} - - - mapstruct - org.mapstruct - - - guava - com.google.guava - - - swagger-annotations - io.swagger - - - - - io.swagger - swagger-annotations - ${swagger-annotations.version} - - - - - mysql - mysql-connector-java - ${mysql-connector-java.version} - - - com.alibaba - druid-spring-boot-starter - ${druid.version} - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - com.baomidou - dynamic-datasource-spring-boot-starter - ${dynamic-datasource.version} - - - - org.redisson - redisson-spring-boot-starter - ${redisson.version} - - - - - com.ctrip.framework.apollo - apollo-client - ${apollo.version} - - - - - org.springframework.boot - spring-boot-starter-quartz - - - - - com.baomidou - lock4j-redisson-spring-boot-starter - ${lock4j.version} - - - redisson-spring-boot-starter - org.redisson - - - - - - io.github.resilience4j - resilience4j-spring-boot2 - ${resilience4j.version} - - - - - org.apache.skywalking - apm-toolkit-trace - ${skywalking.version} - - - org.apache.skywalking - apm-toolkit-logback-1.x - ${skywalking.version} - - - org.apache.skywalking - apm-toolkit-opentracing - ${skywalking.version} - - - - de.codecentric - spring-boot-admin-starter-server - ${spring-boot-admin.version} - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - - - org.springframework.boot - spring-boot-starter-test - test - - - asm - org.ow2.asm - - - - - - com.h2database - h2 - test - - - - com.github.fppt - jedis-mock - ${jedis-mock.version} - test - - - - uk.co.jemos.podam - podam - ${podam.version} - test - - - - - org.projectlombok - lombok - ${lombok.version} - - - - org.mapstruct - mapstruct - ${mapstruct.version} - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - true - - - org.mapstruct - mapstruct-jdk8 - ${mapstruct.version} - - - - cn.hutool - hutool-all - ${hutool.version} - - - - com.alibaba - easyexcel - ${easyexcel.verion} - - - - org.apache.velocity - velocity-engine-core - ${velocity.version} - - - - cn.smallbun.screw - screw-core - ${screw.version} - - - - - - - com.yunpian.sdk - yunpian-java-sdk - ${yunpian-java-sdk.version} - - - - com.aliyun - aliyun-java-sdk-core - ${aliyun-java-sdk-core.version} - - - com.aliyun - aliyun-java-sdk-dysmsapi - ${aliyun-java-sdk-dysmsapi.version} - - - - - - - - ${project.artifactId} - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring.boot.version} - - true - - - - - repackage - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - - - org.projectlombok - lombok - ${lombok.version} - - - - - - - diff --git a/yudao-framework/pom.xml b/yudao-framework/pom.xml index b26ecfb..6278c53 100644 --- a/yudao-framework/pom.xml +++ b/yudao-framework/pom.xml @@ -11,12 +11,70 @@ yudao-framework + + UTF-8 + UTF-8 + @ + 1.8 + ${java.version} + ${java.version} + 3.8.0 + + 2.4.4 + + 3.0.2 + 1.5.22 + + 5.1.46 + 1.2.4 + 3.4.2 + 3.3.2 + 3.15.1 + + 1.7.0 + + 2.2.0 + 1.7.0 + + 8.5.0 + 6.1 + 2.3.1 + + 1.16.14 + 1.4.1.Final + 5.6.1 + 2.2.7 + 2.2 + 1.0.5 + 7.2.6.RELEASE + 0.1.16 + + 4.5.18 + 2.1.0 + 1.2.7 + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring.boot.version} + pom + import + + + + org.springframework.boot spring-boot-configuration-processor + true @@ -43,39 +101,61 @@ com.github.xiaoymin knife4j-spring-boot-starter + ${knife4j.version} + + + mapstruct + org.mapstruct + + + guava + com.google.guava + + + swagger-annotations + io.swagger + + io.swagger swagger-annotations + ${swagger-annotations.version} mysql mysql-connector-java + ${mysql-connector-java.version} com.alibaba druid-spring-boot-starter + ${druid.version} com.baomidou mybatis-plus-boot-starter + ${mybatis-plus.version} com.baomidou dynamic-datasource-spring-boot-starter + ${dynamic-datasource.version} org.redisson redisson-spring-boot-starter + ${redisson.version} com.ctrip.framework.apollo apollo-client + ${apollo.version} @@ -88,41 +168,55 @@ com.baomidou lock4j-redisson-spring-boot-starter + ${lock4j.version} + + + redisson-spring-boot-starter + org.redisson + + io.github.resilience4j resilience4j-spring-boot2 + ${resilience4j.version} org.apache.skywalking apm-toolkit-trace + ${skywalking.version} org.apache.skywalking apm-toolkit-logback-1.x + ${skywalking.version} org.apache.skywalking apm-toolkit-opentracing + ${skywalking.version} de.codecentric spring-boot-admin-starter-server + ${spring-boot-admin.version} de.codecentric spring-boot-admin-starter-client + ${spring-boot-admin.version} org.springframework.boot spring-boot-starter-test - test + + true asm @@ -140,53 +234,64 @@ com.github.fppt jedis-mock + ${jedis-mock.version} test uk.co.jemos.podam podam - test + ${podam.version} + + true org.projectlombok lombok + ${lombok.version} org.mapstruct mapstruct + ${mapstruct.version} org.mapstruct mapstruct-processor + ${mapstruct.version} true org.mapstruct mapstruct-jdk8 + ${mapstruct.version} cn.hutool hutool-all + ${hutool.version} com.alibaba easyexcel + ${easyexcel.verion} org.apache.velocity velocity-engine-core + ${velocity.version} cn.smallbun.screw screw-core + ${screw.version} @@ -195,18 +300,67 @@ com.yunpian.sdk yunpian-java-sdk + ${yunpian-java-sdk.version} com.aliyun aliyun-java-sdk-core + ${aliyun-java-sdk-core.version} com.aliyun aliyun-java-sdk-dysmsapi + ${aliyun-java-sdk-dysmsapi.version} + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + true + + + + + repackage + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + org.mapstruct + mapstruct-processor + ${mapstruct.version} + + + org.projectlombok + lombok + ${lombok.version} + + + + + + + diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/core/ConfigConsts.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/core/ConfigConsts.java index 2d83836..8e0fe57 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/core/ConfigConsts.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/core/ConfigConsts.java @@ -9,6 +9,10 @@ package cn.iocoder.dashboard.framework.apollo.core; */ public class ConfigConsts { + /** + * {@link cn.iocoder.dashboard.framework.apollo.internals.ConfigFrameworkDAO} 的实现类 + */ + public static final String APOLLO_JDBC_DAO = "apollo.jdbc.dao"; public static final String APOLLO_JDBC_URL = "apollo.jdbc.url"; public static final String APOLLO_JDBC_USERNAME = "apollo.jdbc.username"; public static final String APOLLO_JDBC_PASSWORD = "apollo.jdbc.password"; diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/ConfigFrameworkDAO.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/ConfigFrameworkDAO.java index 3e0d4c7..8f46b2d 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/ConfigFrameworkDAO.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/ConfigFrameworkDAO.java @@ -1,12 +1,16 @@ package cn.iocoder.dashboard.framework.apollo.internals; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; +import cn.iocoder.dashboard.framework.apollo.internals.dto.ConfigRespDTO; import java.util.Date; import java.util.List; /** * 配置 Framework DAO 接口 + * + * 注意,实现类必须提供 (String jdbcUrl, String username, String password) 构造方法 + * + * @author 芋道源码 */ public interface ConfigFrameworkDAO { @@ -23,6 +27,6 @@ public interface ConfigFrameworkDAO { * * @return 配置列表 */ - List selectList(); + List selectList(); } diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/DBConfigRepository.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/DBConfigRepository.java index 78d8fe9..3117769 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/DBConfigRepository.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/DBConfigRepository.java @@ -2,9 +2,8 @@ package cn.iocoder.dashboard.framework.apollo.internals; import cn.hutool.core.collection.CollUtil; import cn.iocoder.dashboard.framework.apollo.core.ConfigConsts; +import cn.iocoder.dashboard.framework.apollo.internals.dto.ConfigRespDTO; import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.dashboard.modules.infra.dal.mysql.config.InfConfigDAOImpl; -import cn.iocoder.dashboard.modules.infra.dal.dataobject.config.InfConfigDO; import com.ctrip.framework.apollo.Apollo; import com.ctrip.framework.apollo.build.ApolloInjector; import com.ctrip.framework.apollo.core.utils.ApolloThreadFactory; @@ -59,6 +58,7 @@ public class DBConfigRepository extends AbstractConfigRepository { this.propertiesFactory = ApolloInjector.getInstance(PropertiesFactory.class); this.m_configUtil = ApolloInjector.getInstance(ConfigUtil.class); // 初始化 DB + cn.iocoder.dashboard.modules.infra.dal.mysql.config this.configFrameworkDAO = new InfConfigDAOImpl(System.getProperty(ConfigConsts.APOLLO_JDBC_URL), System.getProperty(ConfigConsts.APOLLO_JDBC_USERNAME), System.getProperty(ConfigConsts.APOLLO_JDBC_PASSWORD)); @@ -84,7 +84,7 @@ public class DBConfigRepository extends AbstractConfigRepository { @Override protected void sync() { // 第一步,尝试获取配置 - List configs = this.loadConfigIfUpdate(this.maxUpdateTime); + List configs = this.loadConfigIfUpdate(this.maxUpdateTime); if (CollUtil.isEmpty(configs)) { // 如果没有更新,则返回 return; } @@ -94,7 +94,7 @@ public class DBConfigRepository extends AbstractConfigRepository { this.m_configCache = newProperties; // 第三步,获取最大的配置时间 assert configs.size() > 0; // 断言,避免告警 - this.maxUpdateTime = configs.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); + this.maxUpdateTime = configs.stream().max(Comparator.comparing(ConfigRespDTO::getUpdateTime)).get().getUpdateTime(); // 第四部,触发配置刷新!重要!!!! super.fireRepositoryChange(m_namespace, newProperties); log.info("[sync][缓存配置,数量为:{}]", configs.size()); @@ -120,9 +120,9 @@ public class DBConfigRepository extends AbstractConfigRepository { return ConfigSourceType.REMOTE; } - private Properties buildProperties(List configs) { + private Properties buildProperties(List configs) { Properties properties = propertiesFactory.getPropertiesInstance(); - configs.stream().filter(BaseDO::getDeleted) // 过滤掉被删除的配置 + configs.stream().filter(ConfigRespDTO::getDeleted) // 过滤掉被删除的配置 .forEach(config -> properties.put(config.getKey(), config.getValue())); return properties; } @@ -153,7 +153,7 @@ public class DBConfigRepository extends AbstractConfigRepository { * @param maxUpdateTime 当前配置的最大更新时间 * @return 配置列表 */ - private List loadConfigIfUpdate(Date maxUpdateTime) { + private List loadConfigIfUpdate(Date maxUpdateTime) { // 第一步,判断是否要更新。 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 log.info("[loadConfigIfUpdate][首次加载全量配置]"); diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/dto/ConfigRespDTO.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/dto/ConfigRespDTO.java new file mode 100644 index 0000000..3945dfb --- /dev/null +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/apollo/internals/dto/ConfigRespDTO.java @@ -0,0 +1,33 @@ +package cn.iocoder.dashboard.framework.apollo.internals.dto; + +import lombok.Data; + +import java.util.Date; + +/** + * 配置 Response DTO + * + * @author 芋道源码 + */ +@Data +public class ConfigRespDTO { + + /** + * 参数键名 + */ + private String key; + /** + * 参数键值 + */ + private String value; + + /** + * 是否删除 + */ + private Boolean deleted; + /** + * 更新时间 + */ + private Date updateTime; + +} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/dto/DictDataRespDTO.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/dto/DictDataRespDTO.java new file mode 100644 index 0000000..bfbcee7 --- /dev/null +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/dto/DictDataRespDTO.java @@ -0,0 +1,33 @@ +package cn.iocoder.dashboard.framework.dict.core.dto; + +import cn.iocoder.dashboard.common.enums.CommonStatusEnum; +import lombok.Data; + +/** + * 字典数据 Response DTO + * + * @author 芋道源码 + */ +@Data +public class DictDataRespDTO { + + /** + * 字典标签 + */ + private String label; + /** + * 字典值 + */ + private String value; + /** + * 字典类型 + */ + private String dictType; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + +} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/service/DictDataFrameworkService.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/service/DictDataFrameworkService.java index c6e7d41..e312411 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/service/DictDataFrameworkService.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/service/DictDataFrameworkService.java @@ -1,6 +1,6 @@ package cn.iocoder.dashboard.framework.dict.core.service; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; +import cn.iocoder.dashboard.framework.dict.core.dto.DictDataRespDTO; import java.util.List; @@ -13,7 +13,7 @@ public interface DictDataFrameworkService { * @param value 字典数据值 * @return 字典数据 */ - SysDictDataDO getDictDataFromCache(String type, String value); + DictDataRespDTO getDictDataFromCache(String type, String value); /** * 解析获得指定的字典数据,从缓存中 @@ -22,7 +22,7 @@ public interface DictDataFrameworkService { * @param label 字典数据标签 * @return 字典数据 */ - SysDictDataDO parseDictDataFromCache(String type, String label); + DictDataRespDTO parseDictDataFromCache(String type, String label); /** * 获得指定类型的字典数据,从缓存中 @@ -30,6 +30,6 @@ public interface DictDataFrameworkService { * @param type 字典类型 * @return 字典数据列表 */ - List listDictDatasFromCache(String type); + List listDictDatasFromCache(String type); } diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/util/DictUtils.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/util/DictUtils.java index 5b03200..b80f742 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/util/DictUtils.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/dict/core/util/DictUtils.java @@ -1,7 +1,7 @@ package cn.iocoder.dashboard.framework.dict.core.util; +import cn.iocoder.dashboard.framework.dict.core.dto.DictDataRespDTO; import cn.iocoder.dashboard.framework.dict.core.service.DictDataFrameworkService; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; import lombok.extern.slf4j.Slf4j; /** @@ -17,11 +17,11 @@ public class DictUtils { log.info("[init][初始化 DictUtils 成功]"); } - public static SysDictDataDO getDictDataFromCache(String type, String value) { + public static DictDataRespDTO getDictDataFromCache(String type, String value) { return service.getDictDataFromCache(type, value); } - public static SysDictDataDO parseDictDataFromCache(String type, String label) { + public static DictDataRespDTO parseDictDataFromCache(String type, String label) { return service.getDictDataFromCache(type, label); } diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/excel/core/convert/DictConvert.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/excel/core/convert/DictConvert.java index 2bda65d..90e13c3 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/excel/core/convert/DictConvert.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/excel/core/convert/DictConvert.java @@ -2,9 +2,9 @@ package cn.iocoder.dashboard.framework.excel.core.convert; import cn.hutool.core.convert.Convert; +import cn.iocoder.dashboard.framework.dict.core.dto.DictDataRespDTO; import cn.iocoder.dashboard.framework.dict.core.util.DictUtils; import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat; -import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; import cn.iocoder.dashboard.modules.system.enums.dict.SysDictTypeEnum; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.enums.CellDataTypeEnum; @@ -14,7 +14,7 @@ import com.alibaba.excel.metadata.property.ExcelContentProperty; import lombok.extern.slf4j.Slf4j; /** - * Excel {@link SysDictDataDO} 数据字典转换器 + * Excel {@link DictDataRespDTO} 数据字典转换器 * * @author 芋道源码 */ @@ -37,7 +37,7 @@ public class DictConvert implements Converter { // 使用字典解析 SysDictTypeEnum type = getType(contentProperty); String label = cellData.getStringValue(); - SysDictDataDO dictData = DictUtils.parseDictDataFromCache(type.getValue(), label); + DictDataRespDTO dictData = DictUtils.parseDictDataFromCache(type.getValue(), label); if (dictData == null) { log.error("[convertToJavaData][type({}) 解析不掉 label({})]", type, label); return null; @@ -58,7 +58,7 @@ public class DictConvert implements Converter { // 使用字典格式化 SysDictTypeEnum type = getType(contentProperty); String value = String.valueOf(object); - SysDictDataDO dictData = DictUtils.getDictDataFromCache(type.getValue(), value); + DictDataRespDTO dictData = DictUtils.getDictDataFromCache(type.getValue(), value); if (dictData == null) { log.error("[convertToExcelData][type({}) 转换不了 label({})]", type, value); return new CellData<>(""); diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java index 4018f44..318a97f 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/file/config/FileProperties.java @@ -1,6 +1,5 @@ package cn.iocoder.dashboard.framework.file.config; -import cn.iocoder.dashboard.modules.infra.controller.file.InfFileController; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; @@ -13,7 +12,7 @@ import javax.validation.constraints.NotNull; public class FileProperties { /** - * 对应 {@link InfFileController#} + * 对应 InfFileController 的 getFile 方法 */ @NotNull(message = "基础文件路径不能为空") private String basePath; diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java index d7d3e59..91412eb 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/aop/OperateLogAspect.java @@ -6,11 +6,11 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.extra.servlet.ServletUtil; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; +import cn.iocoder.dashboard.framework.logger.operatelog.core.dto.OperateLogCreateReqDTO; import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum; import cn.iocoder.dashboard.framework.logger.operatelog.core.service.OperateLogFrameworkService; import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; import cn.iocoder.dashboard.util.json.JsonUtils; import cn.iocoder.dashboard.util.servlet.ServletUtils; import com.google.common.collect.Maps; @@ -55,13 +55,13 @@ public class OperateLogAspect { /** * 用于记录操作内容的上下文 * - * @see SysOperateLogCreateReqVO#getContent() + * @see OperateLogCreateReqDTO#getContent() */ private static final ThreadLocal CONTENT = new ThreadLocal<>(); /** * 用于记录拓展字段的上下文 * - * @see SysOperateLogCreateReqVO#getExts() + * @see OperateLogCreateReqDTO#getExts() */ private static final ThreadLocal> EXTS = new ThreadLocal<>(); @@ -130,106 +130,106 @@ public class OperateLogAspect { private void log0(ProceedingJoinPoint joinPoint, OperateLog operateLog, ApiOperation apiOperation, Date startTime, Object result, Throwable exception) { - SysOperateLogCreateReqVO operateLogVO = new SysOperateLogCreateReqVO(); + OperateLogCreateReqDTO operateLogDTO = new OperateLogCreateReqDTO(); // 补全通用字段 - operateLogVO.setTraceId(TracerUtils.getTraceId()); - operateLogVO.setStartTime(startTime); + operateLogDTO.setTraceId(TracerUtils.getTraceId()); + operateLogDTO.setStartTime(startTime); // 补充用户信息 - fillUserFields(operateLogVO); + fillUserFields(operateLogDTO); // 补全模块信息 - fillModuleFields(operateLogVO, joinPoint, operateLog, apiOperation); + fillModuleFields(operateLogDTO, joinPoint, operateLog, apiOperation); // 补全请求信息 - fillRequestFields(operateLogVO); + fillRequestFields(operateLogDTO); // 补全方法信息 - fillMethodFields(operateLogVO, joinPoint, operateLog, startTime, result, exception); + fillMethodFields(operateLogDTO, joinPoint, operateLog, startTime, result, exception); // 异步记录日志 - operateLogFrameworkService.createOperateLogAsync(operateLogVO); + operateLogFrameworkService.createOperateLogAsync(operateLogDTO); } - private static void fillUserFields(SysOperateLogCreateReqVO operateLogVO) { - operateLogVO.setUserId(SecurityFrameworkUtils.getLoginUserId()); + private static void fillUserFields(OperateLogCreateReqDTO operateLogDTO) { + operateLogDTO.setUserId(SecurityFrameworkUtils.getLoginUserId()); } - private static void fillModuleFields(SysOperateLogCreateReqVO operateLogVO, + private static void fillModuleFields(OperateLogCreateReqDTO operateLogDTO, ProceedingJoinPoint joinPoint, OperateLog operateLog, ApiOperation apiOperation) { // module 属性 if (operateLog != null) { - operateLogVO.setModule(operateLog.module()); + operateLogDTO.setModule(operateLog.module()); } - if (StrUtil.isEmpty(operateLogVO.getModule())) { + if (StrUtil.isEmpty(operateLogDTO.getModule())) { Api api = getClassAnnotation(joinPoint, Api.class); if (api != null) { // 优先读取 @API 的 name 属性 if (StrUtil.isNotEmpty(api.value())) { - operateLogVO.setModule(api.value()); + operateLogDTO.setModule(api.value()); } // 没有的话,读取 @API 的 tags 属性 - if (StrUtil.isEmpty(operateLogVO.getModule()) && ArrayUtil.isNotEmpty(api.tags())) { - operateLogVO.setModule(api.tags()[0]); + if (StrUtil.isEmpty(operateLogDTO.getModule()) && ArrayUtil.isNotEmpty(api.tags())) { + operateLogDTO.setModule(api.tags()[0]); } } } // name 属性 if (operateLog != null) { - operateLogVO.setName(operateLog.name()); + operateLogDTO.setName(operateLog.name()); } - if (StrUtil.isEmpty(operateLogVO.getName()) && apiOperation != null) { - operateLogVO.setName(apiOperation.value()); + if (StrUtil.isEmpty(operateLogDTO.getName()) && apiOperation != null) { + operateLogDTO.setName(apiOperation.value()); } // type 属性 if (operateLog != null && ArrayUtil.isNotEmpty(operateLog.type())) { - operateLogVO.setType(operateLog.type()[0].getType()); + operateLogDTO.setType(operateLog.type()[0].getType()); } - if (operateLogVO.getType() == null) { + if (operateLogDTO.getType() == null) { RequestMethod requestMethod = obtainFirstMatchRequestMethod(obtainRequestMethod(joinPoint)); OperateTypeEnum operateLogType = convertOperateLogType(requestMethod); - operateLogVO.setType(operateLogType != null ? operateLogType.getType() : null); + operateLogDTO.setType(operateLogType != null ? operateLogType.getType() : null); } // content 和 exts 属性 - operateLogVO.setContent(CONTENT.get()); - operateLogVO.setExts(EXTS.get()); + operateLogDTO.setContent(CONTENT.get()); + operateLogDTO.setExts(EXTS.get()); } - private static void fillRequestFields(SysOperateLogCreateReqVO operateLogVO) { + private static void fillRequestFields(OperateLogCreateReqDTO operateLogDTO) { // 获得 Request 对象 HttpServletRequest request = ServletUtils.getRequest(); if (request == null) { return; } // 补全请求信息 - operateLogVO.setRequestMethod(request.getMethod()); - operateLogVO.setRequestUrl(request.getRequestURI()); - operateLogVO.setUserIp(ServletUtil.getClientIP(request)); - operateLogVO.setUserAgent(ServletUtils.getUserAgent(request)); + operateLogDTO.setRequestMethod(request.getMethod()); + operateLogDTO.setRequestUrl(request.getRequestURI()); + operateLogDTO.setUserIp(ServletUtil.getClientIP(request)); + operateLogDTO.setUserAgent(ServletUtils.getUserAgent(request)); } - private static void fillMethodFields(SysOperateLogCreateReqVO operateLogVO, + private static void fillMethodFields(OperateLogCreateReqDTO operateLogDTO, ProceedingJoinPoint joinPoint, OperateLog operateLog, Date startTime, Object result, Throwable exception) { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); - operateLogVO.setJavaMethod(methodSignature.toString()); + operateLogDTO.setJavaMethod(methodSignature.toString()); if (operateLog == null || operateLog.logArgs()) { - operateLogVO.setJavaMethodArgs(obtainMethodArgs(joinPoint)); + operateLogDTO.setJavaMethodArgs(obtainMethodArgs(joinPoint)); } if (operateLog == null || operateLog.logResultData()) { - operateLogVO.setResultData(obtainResultData(result)); + operateLogDTO.setResultData(obtainResultData(result)); } - operateLogVO.setDuration((int) (System.currentTimeMillis() - startTime.getTime())); + operateLogDTO.setDuration((int) (System.currentTimeMillis() - startTime.getTime())); // (正常)处理 resultCode 和 resultMsg 字段 if (result != null) { if (result instanceof CommonResult) { CommonResult commonResult = (CommonResult) result; - operateLogVO.setResultCode(commonResult.getCode()); - operateLogVO.setResultMsg(commonResult.getMsg()); + operateLogDTO.setResultCode(commonResult.getCode()); + operateLogDTO.setResultMsg(commonResult.getMsg()); } else { - operateLogVO.setResultCode(SUCCESS.getCode()); + operateLogDTO.setResultCode(SUCCESS.getCode()); } } // (异常)处理 resultCode 和 resultMsg 字段 if (exception != null) { - operateLogVO.setResultCode(INTERNAL_SERVER_ERROR.getCode()); - operateLogVO.setResultMsg(ExceptionUtil.getRootCauseMessage(exception)); + operateLogDTO.setResultCode(INTERNAL_SERVER_ERROR.getCode()); + operateLogDTO.setResultMsg(ExceptionUtil.getRootCauseMessage(exception)); } } diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/dto/OperateLogCreateReqDTO.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/dto/OperateLogCreateReqDTO.java new file mode 100644 index 0000000..37eeb0c --- /dev/null +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/dto/OperateLogCreateReqDTO.java @@ -0,0 +1,84 @@ +package cn.iocoder.dashboard.framework.logger.operatelog.core.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.Map; + +/** + * 操作日志创建 Request DTO + */ +@Data +public class OperateLogCreateReqDTO { + + @ApiModelProperty(value = "链路追踪编号", required = true, example = "89aca178-a370-411c-ae02-3f0d672be4ab") + @NotEmpty(message = "链路追踪编号不能为空") + private String traceId; + + @ApiModelProperty(value = "用户编号", required = true, example = "1024") + @NotNull(message = "用户编号不能为空") + private Long userId; + + @ApiModelProperty(value = "操作模块", required = true, example = "订单") + @NotEmpty(message = "操作模块不能为空") + private String module; + + @ApiModelProperty(value = "操作名", required = true, example = "创建订单") + @NotEmpty(message = "操作名") + private String name; + + @ApiModelProperty(value = "操作分类", required = true, example = "1", notes = "参见 SysOperateLogTypeEnum 枚举类") + @NotNull(message = "操作分类不能为空") + private Integer type; + + @ApiModelProperty(value = "操作明细", example = "修改编号为 1 的用户信息,将性别从男改成女,将姓名从芋道改成源码。") + private String content; + + @ApiModelProperty(value = "拓展字段", example = "{'orderId': 1}") + private Map exts; + + @ApiModelProperty(value = "请求方法名", required = true, example = "GET") + @NotEmpty(message = "请求方法名不能为空") + private String requestMethod; + + @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy") + @NotEmpty(message = "请求地址不能为空") + private String requestUrl; + + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1") + @NotEmpty(message = "用户 IP 不能为空") + private String userIp; + + @ApiModelProperty(value = "浏览器 UserAgent", required = true, example = "Mozilla/5.0") + @NotEmpty(message = "浏览器 UserAgent 不能为空") + private String userAgent; + + @ApiModelProperty(value = "Java 方法名", required = true, example = "cn.iocoder.dashboard.UserController.save(...)") + @NotEmpty(message = "Java 方法名不能为空") + private String javaMethod; + + @ApiModelProperty(value = "Java 方法的参数") + private String javaMethodArgs; + + @ApiModelProperty(value = "开始时间", required = true) + @NotNull(message = "开始时间不能为空") + private Date startTime; + + @ApiModelProperty(value = "执行时长,单位:毫秒", required = true) + @NotNull(message = "执行时长不能为空") + private Integer duration; + + @ApiModelProperty(value = "结果码", required = true) + @NotNull(message = "结果码不能为空") + private Integer resultCode; + + @ApiModelProperty(value = "结果提示") + private String resultMsg; + + @ApiModelProperty(value = "结果数据") + private String resultData; + +} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java index d16ecf8..02489e8 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/logger/operatelog/core/service/OperateLogFrameworkService.java @@ -1,6 +1,6 @@ package cn.iocoder.dashboard.framework.logger.operatelog.core.service; -import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO; +import cn.iocoder.dashboard.framework.logger.operatelog.core.dto.OperateLogCreateReqDTO; import java.util.concurrent.Future; @@ -12,6 +12,6 @@ public interface OperateLogFrameworkService { * @param reqVO 操作日志请求 * @return true: 记录成功,false: 记录失败 */ - Future createOperateLogAsync(SysOperateLogCreateReqVO reqVO); + Future createOperateLogAsync(OperateLogCreateReqDTO reqVO); } diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java index 32524b5..4532cfa 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/mybatis/core/type/JsonLongSetTypeHandler.java @@ -1,6 +1,5 @@ package cn.iocoder.dashboard.framework.mybatis.core.type; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import cn.iocoder.dashboard.util.json.JsonUtils; import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; import com.fasterxml.jackson.core.type.TypeReference; @@ -11,7 +10,7 @@ import java.util.Set; * 参考 {@link com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler} 实现 * 在我们将字符串反序列化为 Set 并且泛型为 Long 时,如果每个元素的数值太小,会被处理成 Integer 类型,导致可能存在隐性的 BUG。 * - * 例如说哦,{@link SysUserDO#getPostIds()} 属性 + * 例如说哦,SysUserDO 的 postIds 属性 * * @author 芋道源码 */ diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/filter/JwtAuthenticationTokenFilter.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/filter/JwtAuthenticationTokenFilter.java index b4dcf67..3914583 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/filter/JwtAuthenticationTokenFilter.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/filter/JwtAuthenticationTokenFilter.java @@ -4,9 +4,9 @@ import cn.hutool.core.util.StrUtil; import cn.iocoder.dashboard.common.pojo.CommonResult; import cn.iocoder.dashboard.framework.security.config.SecurityProperties; import cn.iocoder.dashboard.framework.security.core.LoginUser; +import cn.iocoder.dashboard.framework.security.core.service.SecurityAuthFrameworkService; import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.dashboard.framework.web.core.handler.GlobalExceptionHandler; -import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; import cn.iocoder.dashboard.util.servlet.ServletUtils; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -30,7 +30,7 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Resource private SecurityProperties securityProperties; @Resource - private SysAuthService authService; + private SecurityAuthFrameworkService authService; @Resource private GlobalExceptionHandler globalExceptionHandler; diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/service/SecurityPermissionFrameworkService.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/service/SecurityPermissionFrameworkService.java index aef27a1..2209871 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/service/SecurityPermissionFrameworkService.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/security/core/service/SecurityPermissionFrameworkService.java @@ -1,7 +1,5 @@ package cn.iocoder.dashboard.framework.security.core.service; -import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; - /** * Security 框架 Permission Service 接口,定义 security 组件需要的功能 * @@ -28,7 +26,7 @@ public interface SecurityPermissionFrameworkService { /** * 判断是否有角色 * - * 注意,角色使用的是 {@link SysRoleDO#getCode()} 标识 + * 注意,角色使用的是 SysRoleDO 的 code 标识 * * @param role 角色 * @return 是否 diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java deleted file mode 100644 index a544d03..0000000 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java +++ /dev/null @@ -1,224 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; - -import cn.hutool.core.util.ReflectUtil; -import cn.iocoder.dashboard.BaseMockitoUnitTest; -import cn.iocoder.dashboard.common.core.KeyValue; -import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsReceiveRespDTO; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; -import cn.iocoder.dashboard.framework.sms.core.enums.SmsTemplateAuditStatusEnum; -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; -import cn.iocoder.dashboard.util.collection.MapUtils; -import cn.iocoder.dashboard.util.date.DateUtils; -import com.aliyuncs.AcsRequest; -import com.aliyuncs.IAcsClient; -import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest; -import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateResponse; -import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; -import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; -import com.aliyuncs.exceptions.ClientException; -import com.google.common.collect.Lists; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentMatcher; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.List; -import java.util.function.Function; - -import static cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR; -import static cn.iocoder.dashboard.util.RandomUtils.*; -import static cn.iocoder.dashboard.util.json.JsonUtils.toJsonString; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.when; - -/** - * {@link AliyunSmsClient} 的单元测试 - * - * @author 芋道源码 - */ -public class AliyunSmsClientTest extends BaseMockitoUnitTest { - - private final SmsChannelProperties properties = new SmsChannelProperties() - .setApiKey(randomString()) // 随机一个 apiKey,避免构建报错 - .setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错 - .setSignature("芋道源码"); - - @InjectMocks - private final AliyunSmsClient smsClient = new AliyunSmsClient(properties); - - @Mock - private IAcsClient client; - - @Test - public void testDoInit() { - // 准备参数 - // mock 方法 - - // 调用 - smsClient.doInit(); - // 断言 - assertNotSame(client, ReflectUtil.getFieldValue(smsClient, "acsClient")); - } - - @Test - @SuppressWarnings("unchecked") - public void testDoSendSms() throws ClientException { - // 准备参数 - Long sendLogId = randomLongId(); - String mobile = randomString(); - String apiTemplateId = randomString(); - List> templateParams = Lists.newArrayList( - new KeyValue<>("code", 1234), new KeyValue<>("op", "login")); - // mock 方法 - SendSmsResponse response = randomPojo(SendSmsResponse.class, o -> o.setCode("OK")); - when(client.getAcsResponse(argThat((ArgumentMatcher) acsRequest -> { - assertEquals(mobile, acsRequest.getPhoneNumbers()); - assertEquals(properties.getSignature(), acsRequest.getSignName()); - assertEquals(apiTemplateId, acsRequest.getTemplateCode()); - assertEquals(toJsonString(MapUtils.convertMap(templateParams)), acsRequest.getTemplateParam()); - assertEquals(sendLogId.toString(), acsRequest.getOutId()); - return true; - }))).thenReturn(response); - - // 调用 - SmsCommonResult result = smsClient.doSendSms(sendLogId, mobile, - apiTemplateId, templateParams); - // 断言 - assertEquals(response.getCode(), result.getApiCode()); - assertEquals(response.getMessage(), result.getApiMsg()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); - assertEquals(response.getRequestId(), result.getApiRequestId()); - // 断言结果 - assertEquals(response.getBizId(), result.getData().getSerialNo()); - } - - @Test - public void testDoTParseSmsReceiveStatus() throws Throwable { - // 准备参数 - String text = "[\n" + - " {\n" + - " \"phone_number\" : \"13900000001\",\n" + - " \"send_time\" : \"2017-01-01 11:12:13\",\n" + - " \"report_time\" : \"2017-02-02 22:23:24\",\n" + - " \"success\" : true,\n" + - " \"err_code\" : \"DELIVERED\",\n" + - " \"err_msg\" : \"用户接收成功\",\n" + - " \"sms_size\" : \"1\",\n" + - " \"biz_id\" : \"12345\",\n" + - " \"out_id\" : \"67890\"\n" + - " }\n" + - "]"; - // mock 方法 - - // 调用 - List statuses = smsClient.doParseSmsReceiveStatus(text); - // 断言 - assertEquals(1, statuses.size()); - assertTrue(statuses.get(0).getSuccess()); - assertEquals("DELIVERED", statuses.get(0).getErrorCode()); - assertEquals("用户接收成功", statuses.get(0).getErrorMsg()); - assertEquals("13900000001", statuses.get(0).getMobile()); - assertEquals(DateUtils.buildTime(2017, 2, 2, 22, 23, 24), statuses.get(0).getReceiveTime()); - assertEquals("12345", statuses.get(0).getSerialNo()); - assertEquals(67890L, statuses.get(0).getLogId()); - } - - @Test - public void testDoGetSmsTemplate() throws ClientException { - // 准备参数 - String apiTemplateId = randomString(); - // mock 方法 - QuerySmsTemplateResponse response = randomPojo(QuerySmsTemplateResponse.class, o -> { - o.setCode("OK"); - o.setTemplateStatus(1); // 设置模板通过 - }); - when(client.getAcsResponse(argThat((ArgumentMatcher) acsRequest -> { - assertEquals(apiTemplateId, acsRequest.getTemplateCode()); - return true; - }))).thenReturn(response); - - // 调用 - SmsCommonResult result = smsClient.doGetSmsTemplate(apiTemplateId); - // 断言 - assertEquals(response.getCode(), result.getApiCode()); - assertEquals(response.getMessage(), result.getApiMsg()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); - assertEquals(response.getRequestId(), result.getApiRequestId()); - // 断言结果 - assertEquals(response.getTemplateCode(), result.getData().getId()); - assertEquals(response.getTemplateContent(), result.getData().getContent()); - assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); - assertEquals(response.getReason(), result.getData().getAuditReason()); - } - - @Test - public void testConvertSmsTemplateAuditStatus() { - assertEquals(SmsTemplateAuditStatusEnum.CHECKING.getStatus(), - smsClient.convertSmsTemplateAuditStatus(0)); - assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), - smsClient.convertSmsTemplateAuditStatus(1)); - assertEquals(SmsTemplateAuditStatusEnum.FAIL.getStatus(), - smsClient.convertSmsTemplateAuditStatus(2)); - assertThrows(IllegalArgumentException.class, () -> smsClient.convertSmsTemplateAuditStatus(3), - "未知审核状态(3)"); - } - - @Test - @SuppressWarnings("unchecked") - public void testInvoke_throwable() throws ClientException { - // 准备参数 - QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); - // mock 方法 - ClientException ex = new ClientException("isv.INVALID_PARAMETERS", "参数不正确", randomString()); - when(client.getAcsResponse(any(AcsRequest.class))).thenThrow(ex); - - // 调用,并断言异常 - SmsCommonResult result = smsClient.invoke(request,null); - // 断言 - assertEquals(ex.getErrCode(), result.getApiCode()); - assertEquals(ex.getErrMsg(), result.getApiMsg()); - assertEquals(SMS_API_PARAM_ERROR.getCode(), result.getCode()); - assertEquals(SMS_API_PARAM_ERROR.getMsg(), result.getMsg()); - assertEquals(ex.getRequestId(), result.getApiRequestId()); - } - - @Test - public void testInvoke_success() throws ClientException { - // 准备参数 - QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); - Function responseConsumer = response -> { - SmsTemplateRespDTO data = new SmsTemplateRespDTO(); - data.setId(response.getTemplateCode()).setContent(response.getTemplateContent()); - data.setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason(response.getReason()); - return data; - }; - // mock 方法 - QuerySmsTemplateResponse response = randomPojo(QuerySmsTemplateResponse.class, o -> { - o.setCode("OK"); - o.setTemplateStatus(1); // 设置模板通过 - }); - when(client.getAcsResponse(any(AcsRequest.class))).thenReturn(response); - - // 调用 - SmsCommonResult result = smsClient.invoke(request, responseConsumer); - // 断言 - assertEquals(response.getCode(), result.getApiCode()); - assertEquals(response.getMessage(), result.getApiMsg()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); - assertEquals(response.getRequestId(), result.getApiRequestId()); - // 断言结果 - assertEquals(response.getTemplateCode(), result.getData().getId()); - assertEquals(response.getTemplateContent(), result.getData().getContent()); - assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); - assertEquals(response.getReason(), result.getData().getAuditReason()); - } - -} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java deleted file mode 100644 index 54dba07..0000000 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; - -import cn.iocoder.dashboard.BaseMockitoUnitTest; -import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link AliyunSmsCodeMapping} 的单元测试 - * - * @author 芋道源码 - */ -public class AliyunSmsCodeMappingTest extends BaseMockitoUnitTest { - - @InjectMocks - private AliyunSmsCodeMapping codeMapping; - - @Test - public void testApply() { - assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply("OK")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("MissingAccessKeyId")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_NOT_EXISTS")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_ABNORMAL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL, codeMapping.apply("isv.DAY_LIMIT_CONTROL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID, codeMapping.apply("isv.SMS_CONTENT_ILLEGAL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGN_ILLEGAL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SIGN_NAME_ILLEGAL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("isp.RAM_PERMISSION_DENY")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.OUT_OF_SERVICE")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.AMOUNT_NOT_ENOUGH")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply("isv.SMS_TEMPLATE_ILLEGAL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGNATURE_ILLEGAL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_PARAMETERS")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_JSON_PARAM")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID, codeMapping.apply("isv.MOBILE_NUMBER_ILLEGAL")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply("isv.TEMPLATE_MISSING_PARAMETERS")); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply("isv.BUSINESS_LIMIT_CONTROL")); - } - -} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java deleted file mode 100644 index 3e4190c..0000000 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java +++ /dev/null @@ -1,202 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian; - -import cn.hutool.core.util.ReflectUtil; -import cn.iocoder.dashboard.BaseMockitoUnitTest; -import cn.iocoder.dashboard.common.core.KeyValue; -import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsReceiveRespDTO; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; -import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; -import cn.iocoder.dashboard.framework.sms.core.enums.SmsTemplateAuditStatusEnum; -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; -import cn.iocoder.dashboard.util.date.DateUtils; -import com.google.common.collect.Lists; -import com.yunpian.sdk.YunpianClient; -import com.yunpian.sdk.api.SmsApi; -import com.yunpian.sdk.api.TplApi; -import com.yunpian.sdk.constant.YunpianConstant; -import com.yunpian.sdk.model.Result; -import com.yunpian.sdk.model.SmsSingleSend; -import com.yunpian.sdk.model.Template; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Supplier; - -import static cn.iocoder.dashboard.util.RandomUtils.*; -import static com.yunpian.sdk.constant.Code.OK; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -/** - * 对 {@link YunpianSmsClient} 的单元测试 - * - * @author 芋道源码 - */ -public class YunpianSmsClientTest extends BaseMockitoUnitTest { - - private final SmsChannelProperties properties = new SmsChannelProperties() - .setApiKey(randomString()); // 随机一个 apiKey,避免构建报错 - - @InjectMocks - private final YunpianSmsClient smsClient = new YunpianSmsClient(properties); - - @Mock - private YunpianClient client; - - @Test - public void testDoInit() { - // 准备参数 - // mock 方法 - - // 调用 - smsClient.doInit(); - // 断言 - assertNotEquals(client, ReflectUtil.getFieldValue(smsClient, "client")); - verify(client, times(1)).close(); - } - - @Test - @SuppressWarnings("unchecked") - public void testDoSendSms() throws Throwable { - // 准备参数 - Long sendLogId = randomLongId(); - String mobile = randomString(); - String apiTemplateId = randomString(); - List> templateParams = Lists.newArrayList( - new KeyValue<>("code", 1234), new KeyValue<>("op", "login")); - // mock sms 方法 - SmsApi smsApi = mock(SmsApi.class); - when(client.sms()).thenReturn(smsApi); - // mock tpl_single_send 方法 - Map request = new HashMap<>(); - request.put(YunpianConstant.MOBILE, mobile); - request.put(YunpianConstant.TPL_ID, apiTemplateId); - request.put(YunpianConstant.TPL_VALUE, "#code#=1234&#op#=login"); - request.put(YunpianConstant.UID, String.valueOf(sendLogId)); - request.put(YunpianConstant.CALLBACK_URL, properties.getCallbackUrl()); - Result responseResult = randomPojo(Result.class, SmsSingleSend.class, - o -> o.setCode(OK)); // API 发送成功的 code - when(smsApi.tpl_single_send(eq(request))).thenReturn(responseResult); - - // 调用 - SmsCommonResult result = smsClient.doSendSms(sendLogId, mobile, - apiTemplateId, templateParams); - // 断言 - assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); - assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); - assertNull(result.getApiRequestId()); - // 断言结果 - assertEquals(String.valueOf(responseResult.getData().getSid()), result.getData().getSerialNo()); - } - - @Test - public void testDoParseSmsReceiveStatus() throws Throwable { - // 准备参数 - String text = "[{\"sid\":9527,\"uid\":1024,\"user_receive_time\":\"2014-03-17 22:55:21\",\"error_msg\":\"\",\"mobile\":\"15205201314\",\"report_status\":\"SUCCESS\"}]"; - // mock 方法 - - // 调用 - - // 断言 - // 调用 - List statuses = smsClient.doParseSmsReceiveStatus(text); - // 断言 - assertEquals(1, statuses.size()); - assertTrue(statuses.get(0).getSuccess()); - assertEquals("", statuses.get(0).getErrorCode()); - assertNull(statuses.get(0).getErrorMsg()); - assertEquals("15205201314", statuses.get(0).getMobile()); - assertEquals(DateUtils.buildTime(2014, 3, 17, 22, 55, 21), statuses.get(0).getReceiveTime()); - assertEquals("9527", statuses.get(0).getSerialNo()); - assertEquals(1024L, statuses.get(0).getLogId()); - } - - @Test - @SuppressWarnings("unchecked") - public void testDoGetSmsTemplate() throws Throwable { - // 准备参数 - String apiTemplateId = randomString(); - // mock tpl 方法 - TplApi tplApi = mock(TplApi.class); - when(client.tpl()).thenReturn(tplApi); - // mock get 方法 - Map request = new HashMap<>(); - request.put(YunpianConstant.APIKEY, properties.getApiKey()); - request.put(YunpianConstant.TPL_ID, apiTemplateId); - Result> responseResult = randomPojo(Result.class, List.class, o -> { - o.setCode(OK); // API 发送成功的 code - o.setData(randomPojoList(Template.class, t -> t.setCheck_status("SUCCESS"))); - }); - when(tplApi.get(eq(request))).thenReturn(responseResult); - - // 调用 - SmsCommonResult result = smsClient.doGetSmsTemplate(apiTemplateId); - // 断言 - assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); - assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); - assertNull(result.getApiRequestId()); - // 断言结果 - Template template = responseResult.getData().get(0); - assertEquals(template.getTpl_id().toString(), result.getData().getId()); - assertEquals(template.getTpl_content(), result.getData().getContent()); - assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); - assertEquals(template.getReason(), result.getData().getAuditReason()); - } - - @Test - public void testConvertSmsTemplateAuditStatus() { - assertEquals(SmsTemplateAuditStatusEnum.CHECKING.getStatus(), - smsClient.convertSmsTemplateAuditStatus("CHECKING")); - assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), - smsClient.convertSmsTemplateAuditStatus("SUCCESS")); - assertEquals(SmsTemplateAuditStatusEnum.FAIL.getStatus(), - smsClient.convertSmsTemplateAuditStatus("FAIL")); - assertThrows(IllegalArgumentException.class, () -> smsClient.convertSmsTemplateAuditStatus("test"), - "未知审核状态(test)"); - } - - @Test - public void testInvoke_throwable() { - // 准备参数 - Supplier> requestConsumer = - () -> new Result<>().setThrowable(new NullPointerException()); - // mock 方法 - - // 调用,并断言异常 - assertThrows(NullPointerException.class, - () -> smsClient.invoke(requestConsumer, null)); - } - - @Test - @SuppressWarnings("unchecked") - public void testInvoke_success() throws Throwable { - // 准备参数 - Result responseResult = randomPojo(Result.class, SmsSingleSend.class, o -> o.setCode(OK)); - Supplier> requestConsumer = () -> responseResult; - Function responseConsumer = - smsSingleSend -> new SmsSendRespDTO().setSerialNo(String.valueOf(responseResult.getData().getSid())); - // mock 方法 - - // 调用 - SmsCommonResult result = smsClient.invoke(requestConsumer, responseConsumer); - // 断言 - assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); - assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); - assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); - assertNull(result.getApiRequestId()); - assertEquals(String.valueOf(responseResult.getData().getSid()), result.getData().getSerialNo()); - } - -} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java deleted file mode 100644 index de6e464..0000000 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian; - -import cn.iocoder.dashboard.BaseMockitoUnitTest; -import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; -import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -import static com.yunpian.sdk.constant.Code.*; -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * {@link YunpianSmsCodeMapping} 的单元测试 - * - * @author 芋道源码 - */ -class YunpianSmsCodeMappingTest extends BaseMockitoUnitTest { - - @InjectMocks - private YunpianSmsCodeMapping codeMapping; - - @Test - public void testApply() { - assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply(String.valueOf(OK))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply(String.valueOf(ARGUMENT_MISSING))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply(String.valueOf(BAD_ARGUMENT_FORMAT))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply(String.valueOf(MONEY_NOT_ENOUGH))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_FOUND))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_VALID))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DUP_IN_SHORT_TIME))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(TOO_MANY_TIME_IN_5))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DAY_LIMIT_PER_MOBILE))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(HOUR_LIMIT_PER_MOBILE))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_BLACK, codeMapping.apply(String.valueOf(BLACK_PHONE_FILTER))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_MATCH))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_VALID))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(BAD_SIGN_FORMAT))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply(String.valueOf(BAD_API_KEY))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply(String.valueOf(API_NOT_ALLOWED))); - assertEquals(SmsFrameworkErrorCodeConstants.SMS_IP_DENY, codeMapping.apply(String.valueOf(IP_NOT_ALLOWED))); - } - -} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java new file mode 100644 index 0000000..59e6d0d --- /dev/null +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java @@ -0,0 +1,39 @@ +package cn.iocoder.dashboard.modules.system.enums.dict; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 字典类型的类型枚举 + */ +@Getter +@AllArgsConstructor +public enum SysDictTypeEnum { + + USER_TYPE("user_type"), // 用户类型 + + SYS_USER_SEX("sys_user_sex"), // 用户性别 + SYS_COMMON_STATUS("sys_common_status"), // 系统状态 + SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型 + SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果 + SYS_CONFIG_TYPE("sys_config_type"), // 参数配置类型 + SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型 + SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码 + SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型 + SYS_SMS_SEND_STATUS("sys_sms_send_status"), // 短信发送状态 + SYS_SMS_RECEIVE_STATUS("sys_sms_receive_status"), // 短信接收状态 + SYS_ERROR_CODE_TYPE("inf_error_code_type"), // 错误码的类型枚举 + + INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型 + INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举 + INF_JOB_LOG_STATUS("inf_job_log_status"), // 定时任务日志状态的枚举 + INF_API_ERROR_LOG_PROCESS_STATUS("inf_api_error_log_process_status"), // API 错误日志的处理状态的枚举 + ; + + + /** + * 值 + */ + private final String value; + +} diff --git a/yudao-framework/src/main/java/cn/iocoder/dashboard/util/RandomUtils.java b/yudao-framework/src/main/java/cn/iocoder/dashboard/util/RandomUtils.java index 717f6d4..51cd61f 100644 --- a/yudao-framework/src/main/java/cn/iocoder/dashboard/util/RandomUtils.java +++ b/yudao-framework/src/main/java/cn/iocoder/dashboard/util/RandomUtils.java @@ -3,7 +3,6 @@ package cn.iocoder.dashboard.util; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.RandomUtil; import cn.iocoder.dashboard.common.enums.CommonStatusEnum; -import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; @@ -72,11 +71,6 @@ public class RandomUtils { } @SafeVarargs - public static SysUserDO randomUserDO(Consumer... consumers) { - return randomPojo(SysUserDO.class, consumers); - } - - @SafeVarargs public static T randomPojo(Class clazz, Consumer... consumers) { T pojo = PODAM_FACTORY.manufacturePojo(clazz); // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理 diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java new file mode 100644 index 0000000..4a595b2 --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/BaseMockitoUnitTest.java @@ -0,0 +1,13 @@ +package cn.iocoder.dashboard; + +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; + +/** + * 纯 Mockito 的单元测试 + * + * @author 芋道源码 + */ +@ExtendWith(MockitoExtension.class) +public class BaseMockitoUnitTest { +} diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/package-info.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/package-info.java new file mode 100644 index 0000000..0274647 --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.framework; diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java new file mode 100644 index 0000000..a544d03 --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsClientTest.java @@ -0,0 +1,224 @@ +package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; + +import cn.hutool.core.util.ReflectUtil; +import cn.iocoder.dashboard.BaseMockitoUnitTest; +import cn.iocoder.dashboard.common.core.KeyValue; +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsReceiveRespDTO; +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; +import cn.iocoder.dashboard.util.collection.MapUtils; +import cn.iocoder.dashboard.util.date.DateUtils; +import com.aliyuncs.AcsRequest; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest; +import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateResponse; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.exceptions.ClientException; +import com.google.common.collect.Lists; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentMatcher; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.List; +import java.util.function.Function; + +import static cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR; +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static cn.iocoder.dashboard.util.json.JsonUtils.toJsonString; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.when; + +/** + * {@link AliyunSmsClient} 的单元测试 + * + * @author 芋道源码 + */ +public class AliyunSmsClientTest extends BaseMockitoUnitTest { + + private final SmsChannelProperties properties = new SmsChannelProperties() + .setApiKey(randomString()) // 随机一个 apiKey,避免构建报错 + .setApiSecret(randomString()) // 随机一个 apiSecret,避免构建报错 + .setSignature("芋道源码"); + + @InjectMocks + private final AliyunSmsClient smsClient = new AliyunSmsClient(properties); + + @Mock + private IAcsClient client; + + @Test + public void testDoInit() { + // 准备参数 + // mock 方法 + + // 调用 + smsClient.doInit(); + // 断言 + assertNotSame(client, ReflectUtil.getFieldValue(smsClient, "acsClient")); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoSendSms() throws ClientException { + // 准备参数 + Long sendLogId = randomLongId(); + String mobile = randomString(); + String apiTemplateId = randomString(); + List> templateParams = Lists.newArrayList( + new KeyValue<>("code", 1234), new KeyValue<>("op", "login")); + // mock 方法 + SendSmsResponse response = randomPojo(SendSmsResponse.class, o -> o.setCode("OK")); + when(client.getAcsResponse(argThat((ArgumentMatcher) acsRequest -> { + assertEquals(mobile, acsRequest.getPhoneNumbers()); + assertEquals(properties.getSignature(), acsRequest.getSignName()); + assertEquals(apiTemplateId, acsRequest.getTemplateCode()); + assertEquals(toJsonString(MapUtils.convertMap(templateParams)), acsRequest.getTemplateParam()); + assertEquals(sendLogId.toString(), acsRequest.getOutId()); + return true; + }))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.doSendSms(sendLogId, mobile, + apiTemplateId, templateParams); + // 断言 + assertEquals(response.getCode(), result.getApiCode()); + assertEquals(response.getMessage(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getBizId(), result.getData().getSerialNo()); + } + + @Test + public void testDoTParseSmsReceiveStatus() throws Throwable { + // 准备参数 + String text = "[\n" + + " {\n" + + " \"phone_number\" : \"13900000001\",\n" + + " \"send_time\" : \"2017-01-01 11:12:13\",\n" + + " \"report_time\" : \"2017-02-02 22:23:24\",\n" + + " \"success\" : true,\n" + + " \"err_code\" : \"DELIVERED\",\n" + + " \"err_msg\" : \"用户接收成功\",\n" + + " \"sms_size\" : \"1\",\n" + + " \"biz_id\" : \"12345\",\n" + + " \"out_id\" : \"67890\"\n" + + " }\n" + + "]"; + // mock 方法 + + // 调用 + List statuses = smsClient.doParseSmsReceiveStatus(text); + // 断言 + assertEquals(1, statuses.size()); + assertTrue(statuses.get(0).getSuccess()); + assertEquals("DELIVERED", statuses.get(0).getErrorCode()); + assertEquals("用户接收成功", statuses.get(0).getErrorMsg()); + assertEquals("13900000001", statuses.get(0).getMobile()); + assertEquals(DateUtils.buildTime(2017, 2, 2, 22, 23, 24), statuses.get(0).getReceiveTime()); + assertEquals("12345", statuses.get(0).getSerialNo()); + assertEquals(67890L, statuses.get(0).getLogId()); + } + + @Test + public void testDoGetSmsTemplate() throws ClientException { + // 准备参数 + String apiTemplateId = randomString(); + // mock 方法 + QuerySmsTemplateResponse response = randomPojo(QuerySmsTemplateResponse.class, o -> { + o.setCode("OK"); + o.setTemplateStatus(1); // 设置模板通过 + }); + when(client.getAcsResponse(argThat((ArgumentMatcher) acsRequest -> { + assertEquals(apiTemplateId, acsRequest.getTemplateCode()); + return true; + }))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.doGetSmsTemplate(apiTemplateId); + // 断言 + assertEquals(response.getCode(), result.getApiCode()); + assertEquals(response.getMessage(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getTemplateCode(), result.getData().getId()); + assertEquals(response.getTemplateContent(), result.getData().getContent()); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); + assertEquals(response.getReason(), result.getData().getAuditReason()); + } + + @Test + public void testConvertSmsTemplateAuditStatus() { + assertEquals(SmsTemplateAuditStatusEnum.CHECKING.getStatus(), + smsClient.convertSmsTemplateAuditStatus(0)); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), + smsClient.convertSmsTemplateAuditStatus(1)); + assertEquals(SmsTemplateAuditStatusEnum.FAIL.getStatus(), + smsClient.convertSmsTemplateAuditStatus(2)); + assertThrows(IllegalArgumentException.class, () -> smsClient.convertSmsTemplateAuditStatus(3), + "未知审核状态(3)"); + } + + @Test + @SuppressWarnings("unchecked") + public void testInvoke_throwable() throws ClientException { + // 准备参数 + QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); + // mock 方法 + ClientException ex = new ClientException("isv.INVALID_PARAMETERS", "参数不正确", randomString()); + when(client.getAcsResponse(any(AcsRequest.class))).thenThrow(ex); + + // 调用,并断言异常 + SmsCommonResult result = smsClient.invoke(request,null); + // 断言 + assertEquals(ex.getErrCode(), result.getApiCode()); + assertEquals(ex.getErrMsg(), result.getApiMsg()); + assertEquals(SMS_API_PARAM_ERROR.getCode(), result.getCode()); + assertEquals(SMS_API_PARAM_ERROR.getMsg(), result.getMsg()); + assertEquals(ex.getRequestId(), result.getApiRequestId()); + } + + @Test + public void testInvoke_success() throws ClientException { + // 准备参数 + QuerySmsTemplateRequest request = new QuerySmsTemplateRequest(); + Function responseConsumer = response -> { + SmsTemplateRespDTO data = new SmsTemplateRespDTO(); + data.setId(response.getTemplateCode()).setContent(response.getTemplateContent()); + data.setAuditStatus(SmsTemplateAuditStatusEnum.SUCCESS.getStatus()).setAuditReason(response.getReason()); + return data; + }; + // mock 方法 + QuerySmsTemplateResponse response = randomPojo(QuerySmsTemplateResponse.class, o -> { + o.setCode("OK"); + o.setTemplateStatus(1); // 设置模板通过 + }); + when(client.getAcsResponse(any(AcsRequest.class))).thenReturn(response); + + // 调用 + SmsCommonResult result = smsClient.invoke(request, responseConsumer); + // 断言 + assertEquals(response.getCode(), result.getApiCode()); + assertEquals(response.getMessage(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertEquals(response.getRequestId(), result.getApiRequestId()); + // 断言结果 + assertEquals(response.getTemplateCode(), result.getData().getId()); + assertEquals(response.getTemplateContent(), result.getData().getContent()); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); + assertEquals(response.getReason(), result.getData().getAuditReason()); + } + +} diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java new file mode 100644 index 0000000..54dba07 --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/aliyun/AliyunSmsCodeMappingTest.java @@ -0,0 +1,43 @@ +package cn.iocoder.dashboard.framework.sms.core.client.impl.aliyun; + +import cn.iocoder.dashboard.BaseMockitoUnitTest; +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * {@link AliyunSmsCodeMapping} 的单元测试 + * + * @author 芋道源码 + */ +public class AliyunSmsCodeMappingTest extends BaseMockitoUnitTest { + + @InjectMocks + private AliyunSmsCodeMapping codeMapping; + + @Test + public void testApply() { + assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply("OK")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("MissingAccessKeyId")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_NOT_EXISTS")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply("isv.ACCOUNT_ABNORMAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_DAY_LIMIT_CONTROL, codeMapping.apply("isv.DAY_LIMIT_CONTROL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_CONTENT_INVALID, codeMapping.apply("isv.SMS_CONTENT_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGN_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SIGN_NAME_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply("isp.RAM_PERMISSION_DENY")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.OUT_OF_SERVICE")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply("isv.AMOUNT_NOT_ENOUGH")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply("isv.SMS_TEMPLATE_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply("isv.SMS_SIGNATURE_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_PARAMETERS")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply("isv.INVALID_JSON_PARAM")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_INVALID, codeMapping.apply("isv.MOBILE_NUMBER_ILLEGAL")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply("isv.TEMPLATE_MISSING_PARAMETERS")); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply("isv.BUSINESS_LIMIT_CONTROL")); + } + +} diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/package-info.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/package-info.java new file mode 100644 index 0000000..42e9b06 --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.framework.sms.core.client.impl; diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java new file mode 100644 index 0000000..3e4190c --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsClientTest.java @@ -0,0 +1,202 @@ +package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian; + +import cn.hutool.core.util.ReflectUtil; +import cn.iocoder.dashboard.BaseMockitoUnitTest; +import cn.iocoder.dashboard.common.core.KeyValue; +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsReceiveRespDTO; +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsSendRespDTO; +import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsTemplateAuditStatusEnum; +import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; +import cn.iocoder.dashboard.util.date.DateUtils; +import com.google.common.collect.Lists; +import com.yunpian.sdk.YunpianClient; +import com.yunpian.sdk.api.SmsApi; +import com.yunpian.sdk.api.TplApi; +import com.yunpian.sdk.constant.YunpianConstant; +import com.yunpian.sdk.model.Result; +import com.yunpian.sdk.model.SmsSingleSend; +import com.yunpian.sdk.model.Template; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; + +import static cn.iocoder.dashboard.util.RandomUtils.*; +import static com.yunpian.sdk.constant.Code.OK; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +/** + * 对 {@link YunpianSmsClient} 的单元测试 + * + * @author 芋道源码 + */ +public class YunpianSmsClientTest extends BaseMockitoUnitTest { + + private final SmsChannelProperties properties = new SmsChannelProperties() + .setApiKey(randomString()); // 随机一个 apiKey,避免构建报错 + + @InjectMocks + private final YunpianSmsClient smsClient = new YunpianSmsClient(properties); + + @Mock + private YunpianClient client; + + @Test + public void testDoInit() { + // 准备参数 + // mock 方法 + + // 调用 + smsClient.doInit(); + // 断言 + assertNotEquals(client, ReflectUtil.getFieldValue(smsClient, "client")); + verify(client, times(1)).close(); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoSendSms() throws Throwable { + // 准备参数 + Long sendLogId = randomLongId(); + String mobile = randomString(); + String apiTemplateId = randomString(); + List> templateParams = Lists.newArrayList( + new KeyValue<>("code", 1234), new KeyValue<>("op", "login")); + // mock sms 方法 + SmsApi smsApi = mock(SmsApi.class); + when(client.sms()).thenReturn(smsApi); + // mock tpl_single_send 方法 + Map request = new HashMap<>(); + request.put(YunpianConstant.MOBILE, mobile); + request.put(YunpianConstant.TPL_ID, apiTemplateId); + request.put(YunpianConstant.TPL_VALUE, "#code#=1234&#op#=login"); + request.put(YunpianConstant.UID, String.valueOf(sendLogId)); + request.put(YunpianConstant.CALLBACK_URL, properties.getCallbackUrl()); + Result responseResult = randomPojo(Result.class, SmsSingleSend.class, + o -> o.setCode(OK)); // API 发送成功的 code + when(smsApi.tpl_single_send(eq(request))).thenReturn(responseResult); + + // 调用 + SmsCommonResult result = smsClient.doSendSms(sendLogId, mobile, + apiTemplateId, templateParams); + // 断言 + assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); + assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertNull(result.getApiRequestId()); + // 断言结果 + assertEquals(String.valueOf(responseResult.getData().getSid()), result.getData().getSerialNo()); + } + + @Test + public void testDoParseSmsReceiveStatus() throws Throwable { + // 准备参数 + String text = "[{\"sid\":9527,\"uid\":1024,\"user_receive_time\":\"2014-03-17 22:55:21\",\"error_msg\":\"\",\"mobile\":\"15205201314\",\"report_status\":\"SUCCESS\"}]"; + // mock 方法 + + // 调用 + + // 断言 + // 调用 + List statuses = smsClient.doParseSmsReceiveStatus(text); + // 断言 + assertEquals(1, statuses.size()); + assertTrue(statuses.get(0).getSuccess()); + assertEquals("", statuses.get(0).getErrorCode()); + assertNull(statuses.get(0).getErrorMsg()); + assertEquals("15205201314", statuses.get(0).getMobile()); + assertEquals(DateUtils.buildTime(2014, 3, 17, 22, 55, 21), statuses.get(0).getReceiveTime()); + assertEquals("9527", statuses.get(0).getSerialNo()); + assertEquals(1024L, statuses.get(0).getLogId()); + } + + @Test + @SuppressWarnings("unchecked") + public void testDoGetSmsTemplate() throws Throwable { + // 准备参数 + String apiTemplateId = randomString(); + // mock tpl 方法 + TplApi tplApi = mock(TplApi.class); + when(client.tpl()).thenReturn(tplApi); + // mock get 方法 + Map request = new HashMap<>(); + request.put(YunpianConstant.APIKEY, properties.getApiKey()); + request.put(YunpianConstant.TPL_ID, apiTemplateId); + Result> responseResult = randomPojo(Result.class, List.class, o -> { + o.setCode(OK); // API 发送成功的 code + o.setData(randomPojoList(Template.class, t -> t.setCheck_status("SUCCESS"))); + }); + when(tplApi.get(eq(request))).thenReturn(responseResult); + + // 调用 + SmsCommonResult result = smsClient.doGetSmsTemplate(apiTemplateId); + // 断言 + assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); + assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertNull(result.getApiRequestId()); + // 断言结果 + Template template = responseResult.getData().get(0); + assertEquals(template.getTpl_id().toString(), result.getData().getId()); + assertEquals(template.getTpl_content(), result.getData().getContent()); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), result.getData().getAuditStatus()); + assertEquals(template.getReason(), result.getData().getAuditReason()); + } + + @Test + public void testConvertSmsTemplateAuditStatus() { + assertEquals(SmsTemplateAuditStatusEnum.CHECKING.getStatus(), + smsClient.convertSmsTemplateAuditStatus("CHECKING")); + assertEquals(SmsTemplateAuditStatusEnum.SUCCESS.getStatus(), + smsClient.convertSmsTemplateAuditStatus("SUCCESS")); + assertEquals(SmsTemplateAuditStatusEnum.FAIL.getStatus(), + smsClient.convertSmsTemplateAuditStatus("FAIL")); + assertThrows(IllegalArgumentException.class, () -> smsClient.convertSmsTemplateAuditStatus("test"), + "未知审核状态(test)"); + } + + @Test + public void testInvoke_throwable() { + // 准备参数 + Supplier> requestConsumer = + () -> new Result<>().setThrowable(new NullPointerException()); + // mock 方法 + + // 调用,并断言异常 + assertThrows(NullPointerException.class, + () -> smsClient.invoke(requestConsumer, null)); + } + + @Test + @SuppressWarnings("unchecked") + public void testInvoke_success() throws Throwable { + // 准备参数 + Result responseResult = randomPojo(Result.class, SmsSingleSend.class, o -> o.setCode(OK)); + Supplier> requestConsumer = () -> responseResult; + Function responseConsumer = + smsSingleSend -> new SmsSendRespDTO().setSerialNo(String.valueOf(responseResult.getData().getSid())); + // mock 方法 + + // 调用 + SmsCommonResult result = smsClient.invoke(requestConsumer, responseConsumer); + // 断言 + assertEquals(String.valueOf(responseResult.getCode()), result.getApiCode()); + assertEquals(responseResult.getMsg() + " => " + responseResult.getDetail(), result.getApiMsg()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getCode(), result.getCode()); + assertEquals(GlobalErrorCodeConstants.SUCCESS.getMsg(), result.getMsg()); + assertNull(result.getApiRequestId()); + assertEquals(String.valueOf(responseResult.getData().getSid()), result.getData().getSerialNo()); + } + +} diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java new file mode 100644 index 0000000..de6e464 --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/impl/yunpian/YunpianSmsCodeMappingTest.java @@ -0,0 +1,43 @@ +package cn.iocoder.dashboard.framework.sms.core.client.impl.yunpian; + +import cn.iocoder.dashboard.BaseMockitoUnitTest; +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; +import cn.iocoder.dashboard.framework.sms.core.enums.SmsFrameworkErrorCodeConstants; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; + +import static com.yunpian.sdk.constant.Code.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link YunpianSmsCodeMapping} 的单元测试 + * + * @author 芋道源码 + */ +class YunpianSmsCodeMappingTest extends BaseMockitoUnitTest { + + @InjectMocks + private YunpianSmsCodeMapping codeMapping; + + @Test + public void testApply() { + assertEquals(GlobalErrorCodeConstants.SUCCESS, codeMapping.apply(String.valueOf(OK))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_API_PARAM_ERROR, codeMapping.apply(String.valueOf(ARGUMENT_MISSING))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_PARAM_ERROR, codeMapping.apply(String.valueOf(BAD_ARGUMENT_FORMAT))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_MONEY_NOT_ENOUGH, codeMapping.apply(String.valueOf(MONEY_NOT_ENOUGH))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_FOUND))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_TEMPLATE_INVALID, codeMapping.apply(String.valueOf(TPL_NOT_VALID))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DUP_IN_SHORT_TIME))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(TOO_MANY_TIME_IN_5))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(DAY_LIMIT_PER_MOBILE))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SEND_BUSINESS_LIMIT_CONTROL, codeMapping.apply(String.valueOf(HOUR_LIMIT_PER_MOBILE))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_MOBILE_BLACK, codeMapping.apply(String.valueOf(BLACK_PHONE_FILTER))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_MATCH))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(SIGN_NOT_VALID))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_SIGN_INVALID, codeMapping.apply(String.valueOf(BAD_SIGN_FORMAT))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_ACCOUNT_INVALID, codeMapping.apply(String.valueOf(BAD_API_KEY))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_PERMISSION_DENY, codeMapping.apply(String.valueOf(API_NOT_ALLOWED))); + assertEquals(SmsFrameworkErrorCodeConstants.SMS_IP_DENY, codeMapping.apply(String.valueOf(IP_NOT_ALLOWED))); + } + +} diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java new file mode 100644 index 0000000..037ce8c --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/client/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.framework.sms.core.client; diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/package-info.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/package-info.java new file mode 100644 index 0000000..ec8f3ea --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/core/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.framework.sms.core; diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/package-info.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/package-info.java new file mode 100644 index 0000000..ba591dc --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/framework/sms/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard.framework.sms; diff --git a/yudao-framework/src/test/java/cn/iocoder/dashboard/package-info.java b/yudao-framework/src/test/java/cn/iocoder/dashboard/package-info.java new file mode 100644 index 0000000..f49464f --- /dev/null +++ b/yudao-framework/src/test/java/cn/iocoder/dashboard/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.dashboard; -- libgit2 0.21.4