新增 yudao-spring-boot-starter-biz-error-code
错误码组件
This commit is contained in:
parent
ca28d791aa
commit
2bd40cfb3b
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>yudao-framework</artifactId>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<version>${revision}</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>yudao-spring-boot-starter-biz-error-code</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>${project.artifactId}</name>
|
||||
<description>
|
||||
错误码 ErrorCode 的自动配置功能,提供如下功能:
|
||||
1. 远程读取:项目启动时,从 system-server 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置;
|
||||
2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-server 服务加载最新的 ErrorCode 错误码;
|
||||
3. 自动写入:项目启动时,将项目本地的错误码写到 system-server 服务中,方便管理员在管理后台编辑;
|
||||
</description>
|
||||
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-common</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring 核心 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- RPC 远程调用相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-rpc</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!-- 业务组件 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-module-system-api</artifactId> <!-- 需要使用它,进行操作日志的记录 -->
|
||||
<version>${revision}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>jakarta.validation</groupId>
|
||||
<artifactId>jakarta.validation-api</artifactId>
|
||||
<scope>provided</scope> <!-- 设置为 provided,主要是 ErrorCodeProperties 使用到 -->
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.system.framework.errorcode.config;
|
||||
package cn.iocoder.yudao.framework.errorcode.config;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
@ -1,37 +1,37 @@
|
||||
package cn.iocoder.yudao.module.system.framework.errorcode.config;
|
||||
package cn.iocoder.yudao.framework.errorcode.config;
|
||||
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.generator.ErrorCodeAutoGenerator;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.loader.ErrorCodeLoader;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.loader.ErrorCodeLoaderImpl;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl;
|
||||
import cn.iocoder.yudao.framework.errorcode.core.generator.ErrorCodeAutoGenerator;
|
||||
import cn.iocoder.yudao.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl;
|
||||
import cn.iocoder.yudao.framework.errorcode.core.loader.ErrorCodeLoader;
|
||||
import cn.iocoder.yudao.framework.errorcode.core.loader.ErrorCodeLoaderImpl;
|
||||
import cn.iocoder.yudao.module.system.api.errorcode.ErrorCodeApi;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
|
||||
// TODO 芋艿:貌似放的位置有问题
|
||||
/**
|
||||
* 错误码配置类
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Configuration
|
||||
@EnableConfigurationProperties(ErrorCodeProperties.class)
|
||||
@EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码
|
||||
public class ErrorCodeConfiguration {
|
||||
public class YudaoErrorCodeAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName,
|
||||
ErrorCodeProperties errorCodeProperties,
|
||||
ErrorCodeFrameworkService errorCodeFrameworkService) {
|
||||
return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(),
|
||||
errorCodeFrameworkService);
|
||||
ErrorCodeApi errorCodeApi) {
|
||||
return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(), errorCodeApi);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName,
|
||||
ErrorCodeFrameworkService errorCodeFrameworkService) {
|
||||
return new ErrorCodeLoaderImpl(applicationName, errorCodeFrameworkService);
|
||||
ErrorCodeApi errorCodeApi) {
|
||||
return new ErrorCodeLoaderImpl(applicationName, errorCodeApi);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,15 @@
|
||||
package cn.iocoder.yudao.framework.errorcode.config;
|
||||
|
||||
import cn.iocoder.yudao.module.system.api.errorcode.ErrorCodeApi;
|
||||
import org.springframework.cloud.openfeign.EnableFeignClients;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
/**
|
||||
* 错误码用到 Feign 的配置项
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@EnableFeignClients(clients = ErrorCodeApi.class) // 主要是引入相关的 API 服务
|
||||
public class YudaoErrorCodeRpcAutoConfiguration {
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.system.framework.errorcode.core.generator;
|
||||
package cn.iocoder.yudao.framework.errorcode.core.generator;
|
||||
|
||||
/**
|
||||
* 错误码的自动生成器
|
@ -1,12 +1,12 @@
|
||||
package cn.iocoder.yudao.module.system.framework.errorcode.core.generator;
|
||||
package cn.iocoder.yudao.framework.errorcode.core.generator;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.exceptions.ExceptionUtil;
|
||||
import cn.hutool.core.util.ClassUtil;
|
||||
import cn.hutool.core.util.ReflectUtil;
|
||||
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService;
|
||||
import cn.iocoder.yudao.module.system.api.errorcode.ErrorCodeApi;
|
||||
import cn.iocoder.yudao.module.system.api.errorcode.dto.ErrorCodeAutoGenerateReqDTO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||
@ -36,9 +36,9 @@ public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator {
|
||||
*/
|
||||
private final List<String> constantsClassList;
|
||||
/**
|
||||
* 错误码 Service
|
||||
* 错误码 Api
|
||||
*/
|
||||
private final ErrorCodeFrameworkService errorCodeService;
|
||||
private final ErrorCodeApi errorCodeApi;
|
||||
|
||||
@Override
|
||||
@EventListener(ApplicationReadyEvent.class)
|
||||
@ -49,7 +49,7 @@ public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator {
|
||||
log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size());
|
||||
|
||||
// 第二步,写入到 system 服务
|
||||
errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs);
|
||||
errorCodeApi.autoGenerateErrorCodes(autoGenerateDTOs).checkError();
|
||||
log.info("[execute][写入到 system 组件完成]");
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package cn.iocoder.yudao.module.system.framework.errorcode.core.loader;
|
||||
package cn.iocoder.yudao.framework.errorcode.core.loader;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
|
||||
|
@ -1,9 +1,9 @@
|
||||
package cn.iocoder.yudao.module.system.framework.errorcode.core.loader;
|
||||
package cn.iocoder.yudao.framework.errorcode.core.loader;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.dto.ErrorCodeRespDTO;
|
||||
import cn.iocoder.yudao.module.system.framework.errorcode.core.service.ErrorCodeFrameworkService;
|
||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
|
||||
import cn.iocoder.yudao.module.system.api.errorcode.ErrorCodeApi;
|
||||
import cn.iocoder.yudao.module.system.api.errorcode.dto.ErrorCodeRespDTO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||
@ -34,9 +34,9 @@ public class ErrorCodeLoaderImpl implements ErrorCodeLoader {
|
||||
*/
|
||||
private final String applicationName;
|
||||
/**
|
||||
* 错误码 Service
|
||||
* 错误码 Api
|
||||
*/
|
||||
private final ErrorCodeFrameworkService errorCodeService;
|
||||
private final ErrorCodeApi errorCodeApi;
|
||||
|
||||
/**
|
||||
* 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新
|
||||
@ -55,7 +55,7 @@ public class ErrorCodeLoaderImpl implements ErrorCodeLoader {
|
||||
|
||||
private void loadErrorCodes0() {
|
||||
// 加载错误码
|
||||
List<ErrorCodeRespDTO> errorCodeRespDTOs = errorCodeService.getErrorCodeList(applicationName, maxUpdateTime);
|
||||
List<ErrorCodeRespDTO> errorCodeRespDTOs = errorCodeApi.getErrorCodeList(applicationName, maxUpdateTime).getCheckedData();
|
||||
if (CollUtil.isEmpty(errorCodeRespDTOs)) {
|
||||
return;
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
/**
|
||||
* 错误码 ErrorCode 的自动配置功能,提供如下功能:
|
||||
*
|
||||
* 1. 远程读取:项目启动时,从 system-service 服务,读取数据库中的 ErrorCode 错误码,实现错误码的提水可配置;
|
||||
* 2. 自动更新:管理员在管理后台修数据库中的 ErrorCode 错误码时,项目自动从 system-service 服务加载最新的 ErrorCode 错误码;
|
||||
* 3. 自动写入:项目启动时,将项目本地的错误码写到 system-server 服务中,方便管理员在管理后台编辑;
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
package cn.iocoder.yudao.framework.errorcode;
|
@ -0,0 +1,3 @@
|
||||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||
cn.iocoder.yudao.framework.errorcode.config.YudaoErrorCodeRpcAutoConfiguration,\
|
||||
cn.iocoder.yudao.framework.errorcode.config.YudaoErrorCodeAutoConfiguration
|
@ -46,6 +46,10 @@
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.cloud</groupId>
|
||||
<artifactId>yudao-spring-boot-starter-biz-error-code</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Web 相关 -->
|
||||
<dependency>
|
||||
|
@ -22,7 +22,7 @@ import java.util.List;
|
||||
@Api(tags = "RPC 服务 - 错误码")
|
||||
public interface ErrorCodeApi {
|
||||
|
||||
String PREFIX = ApiConstants.PREFIX + "/oauth2/token";
|
||||
String PREFIX = ApiConstants.PREFIX + "/error-code";
|
||||
|
||||
@PostMapping(PREFIX + "/auto-generate")
|
||||
@ApiOperation("自动创建错误码")
|
||||
|
@ -78,6 +78,7 @@ yudao:
|
||||
- /admin-api/system/captcha/get-image # 获取图片验证码,和租户无关
|
||||
- /admin-api/system/sms/callback/* # 短信回调接口,无法带上租户编号
|
||||
- /rpc-api/system/tenant/valid # 防止递归。避免调用 /rpc-api/system/tenant/valid 接口时,又去触发 /rpc-api/system/tenant/valid 去校验
|
||||
- /rpc-api/system/error-code/* # 错误码的自动创建与下载的接口,无法带上租户编号
|
||||
ignore-tables:
|
||||
- system_tenant
|
||||
- system_tenant_package
|
||||
|
@ -1,2 +0,0 @@
|
||||
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||
cn.iocoder.mall.system.errorcode.config.ErrorCodeAutoConfiguration
|
@ -1,106 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>system</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>system-biz</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<!-- Mall 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>system-biz-api</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring 核心 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- DB 相关 -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-tx</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>mall-spring-boot-starter-mybatis</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 短信平台 阿里云、云片 -->
|
||||
<dependency>
|
||||
<groupId>com.yunpian.sdk</groupId>
|
||||
<artifactId>yunpian-java-sdk</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>aliyun-java-sdk-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 文件服务商 -->
|
||||
<dependency>
|
||||
<groupId>com.qiniu</groupId>
|
||||
<artifactId>qiniu-java-sdk</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 工具类相关 -->
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct-jdk8</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-aop</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.servlet</groupId>
|
||||
<artifactId>servlet-api</artifactId>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@ -1,53 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.bo.smsSign;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* sms page
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:23 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ListSmsSignBO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 短信平台
|
||||
*/
|
||||
private Integer platform;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 审核状态
|
||||
* <p>
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date updateTime;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date createTime;
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.bo.smsSign;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信签名
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:30 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class SmsSignBO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 签名id 这个是第三方的
|
||||
*/
|
||||
private Integer signId;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,103 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.bo.smsTemplate;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* sms page
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:23 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ListSmsTemplateBO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 模板编号 (第三方的)
|
||||
*/
|
||||
private Integer smsSignId;
|
||||
/**
|
||||
* 短信签名 id
|
||||
*/
|
||||
private String platform;
|
||||
/**
|
||||
* 短信模板 Code
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 短信类型
|
||||
*/
|
||||
private Integer smsType;
|
||||
/**
|
||||
* 审核状态
|
||||
* <p>
|
||||
* 1、审核中
|
||||
* 2、审核成功
|
||||
* 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date updateTime;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date createTime;
|
||||
|
||||
///
|
||||
/// 关联字段
|
||||
|
||||
/**
|
||||
* 签名信息
|
||||
*/
|
||||
private Sign sign;
|
||||
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Sign {
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 签名id 这个是第三方的
|
||||
*/
|
||||
private String platformId;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 审核状态
|
||||
* <p>
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.bo.smsTemplate;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信 template
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 7:41 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class SmsTemplateBO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 模板编号 (第三方的)
|
||||
*/
|
||||
private Integer smsSignId;
|
||||
/**
|
||||
* 短信签名 id
|
||||
*/
|
||||
private String platformId;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* 1、审核中
|
||||
* 2、审核成功
|
||||
* 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.config;
|
||||
|
||||
import com.qiniu.util.Auth;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class QiniuConfiguration {
|
||||
|
||||
@Value("${qiniu.access-key}")
|
||||
private String accessKey;
|
||||
@Value("${qiniu.secret-key}")
|
||||
private String secretKey;
|
||||
|
||||
@Bean
|
||||
public Auth auth() {
|
||||
return Auth.create(accessKey, secretKey);
|
||||
}
|
||||
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.convert;
|
||||
|
||||
import cn.iocoder.mall.system.biz.bo.smsSign.ListSmsSignBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsSign.SmsSignBO;
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsSignDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 短信 签名
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:31 PM
|
||||
*/
|
||||
@Mapper
|
||||
public interface SmsSignConvert {
|
||||
|
||||
SmsSignConvert INSTANCE = Mappers.getMapper(SmsSignConvert.class);
|
||||
|
||||
@Mappings({})
|
||||
SmsSignBO convert(SmsSignDO bean);
|
||||
|
||||
@Mappings({})
|
||||
List<ListSmsSignBO> convert(List<SmsSignDO> beans);
|
||||
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.convert;
|
||||
|
||||
import cn.iocoder.mall.system.biz.bo.smsTemplate.ListSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsTemplate.SmsTemplateBO;
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsSignDO;
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsTemplateDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 短信 template
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 7:43 PM
|
||||
*/
|
||||
@Mapper
|
||||
public interface SmsTemplateConvert {
|
||||
|
||||
SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class);
|
||||
|
||||
@Mappings({})
|
||||
SmsTemplateBO convert(SmsTemplateDO smsTemplateDO);
|
||||
|
||||
@Mappings({})
|
||||
List<ListSmsTemplateBO> convert(List<SmsTemplateDO> smsTemplateDOList);
|
||||
|
||||
@Mappings({})
|
||||
List<ListSmsTemplateBO.Sign> convertTemplateSign(List<SmsSignDO> smsSignDOList);
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dao.sms;
|
||||
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsSendLogDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
* 短信
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:18 PM
|
||||
*/
|
||||
@Repository
|
||||
public interface SmsSendMapper extends BaseMapper<SmsSendLogDO> {
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dao.sms;
|
||||
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsSignDO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.ListSmsSignDTO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* 短信
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:18 PM
|
||||
*/
|
||||
@Repository
|
||||
public interface SmsSignMapper extends BaseMapper<SmsSignDO> {
|
||||
|
||||
default IPage<SmsSignDO> listSmsSign(ListSmsSignDTO queryDTO) {
|
||||
LambdaQueryWrapper<SmsSignDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||
if (queryDTO.getApplyStatus() != null) {
|
||||
queryWrapper.eq(SmsSignDO::getApplyStatus, queryDTO.getApplyStatus());
|
||||
}
|
||||
if (!StringUtils.isEmpty(queryDTO.getSign())) {
|
||||
queryWrapper.like(SmsSignDO::getSign, queryDTO.getSign());
|
||||
}
|
||||
if (!StringUtils.isEmpty(queryDTO.getId())) {
|
||||
queryWrapper.eq(SmsSignDO::getId, queryDTO.getId());
|
||||
}
|
||||
|
||||
Page<SmsSignDO> page = new Page<SmsSignDO>()
|
||||
.setSize(queryDTO.getPageSize())
|
||||
.setCurrent(queryDTO.getPageNo())
|
||||
.setDesc("create_time");
|
||||
return selectPage(page, queryWrapper);
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dao.sms;
|
||||
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsTemplateDO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsTemplate.ListSmsTemplateDTO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* 短信 template
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:18 PM
|
||||
*/
|
||||
@Repository
|
||||
public interface SmsTemplateMapper extends BaseMapper<SmsTemplateDO> {
|
||||
|
||||
default IPage<SmsTemplateDO> listSmsTemplate(ListSmsTemplateDTO listSmsTemplateDTO) {
|
||||
QueryWrapper<SmsTemplateDO> queryWrapper = new QueryWrapper<>();
|
||||
if (listSmsTemplateDTO.getApplyStatus() != null) {
|
||||
queryWrapper.eq("apply_status", listSmsTemplateDTO.getApplyStatus());
|
||||
}
|
||||
if (listSmsTemplateDTO.getSmsSignId() != null) {
|
||||
queryWrapper.eq("sms_sign_id", listSmsTemplateDTO.getSmsSignId());
|
||||
}
|
||||
if (!StringUtils.isEmpty(listSmsTemplateDTO.getTemplate())) {
|
||||
queryWrapper.like("template", listSmsTemplateDTO.getTemplate());
|
||||
}
|
||||
if (!StringUtils.isEmpty(listSmsTemplateDTO.getId())) {
|
||||
queryWrapper.eq("id", listSmsTemplateDTO.getId());
|
||||
}
|
||||
|
||||
Page<SmsTemplateDO> page = new Page<SmsTemplateDO>()
|
||||
.setSize(listSmsTemplateDTO.getPageSize())
|
||||
.setCurrent(listSmsTemplateDTO.getPageNo())
|
||||
.setDesc("create_time");
|
||||
return selectPage(page, queryWrapper);
|
||||
}
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dataobject.sms;
|
||||
|
||||
import cn.iocoder.mall.mybatis.core.dataobject.BaseDO;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信 client log
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/25 12:36 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class SmsSendLogDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private Integer templateId;
|
||||
/**
|
||||
* 短信
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 参数
|
||||
*/
|
||||
private String params;
|
||||
/**
|
||||
* 发送信息
|
||||
*/
|
||||
private String message;
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dataobject.sms;
|
||||
|
||||
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信签名
|
||||
*
|
||||
* 签名是短信发送前缀 如:【阿里云】、【小红书】
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:28 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@TableName("sms_sign")
|
||||
public class SmsSignDO extends DeletableDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 平台
|
||||
*
|
||||
* 1、云片
|
||||
* 2、阿里云
|
||||
*/
|
||||
private Integer platform;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 10、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dataobject.sms;
|
||||
|
||||
import cn.iocoder.mall.mybatis.core.dataobject.DeletableDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信 模板
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:31 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@TableName("sms_template")
|
||||
public class SmsTemplateDO extends DeletableDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 模板编号 (第三方的)
|
||||
*/
|
||||
private Integer smsSignId;
|
||||
/**
|
||||
* 模板 code(第三方平台 code)
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 短信签名 id
|
||||
*/
|
||||
private Integer platform;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 短信类型
|
||||
*
|
||||
* - 验证码类
|
||||
* - 通知类
|
||||
* - 营销类
|
||||
*/
|
||||
private Integer smsType;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* 1、审核中
|
||||
* 2、审核成功
|
||||
* 10、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dto.smsSign;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 添加 sign
|
||||
*
|
||||
* author: sin
|
||||
* time: 2020/4/20 11:10 上午
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class AddSignDTO implements Serializable {
|
||||
|
||||
private String sign;
|
||||
|
||||
private Integer platform;
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dto.smsSign;
|
||||
|
||||
import cn.iocoder.common.framework.vo.PageParam;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* page 短信模板 query
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:32 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@ApiModel("短信服务查询")
|
||||
public class ListSmsSignDTO extends PageParam {
|
||||
|
||||
@ApiModelProperty("编号")
|
||||
private Integer id;
|
||||
|
||||
@ApiModelProperty("签名")
|
||||
private String sign;
|
||||
|
||||
@ApiModelProperty("申请状态")
|
||||
private Integer applyStatus;
|
||||
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dto.smsSign;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 更新签名
|
||||
* <p>
|
||||
* author: sin
|
||||
* time: 2020/4/20 11:05 上午
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class UpdateSignDTO implements Serializable {
|
||||
|
||||
private Integer id;
|
||||
|
||||
private String sign;
|
||||
|
||||
private Integer platform;
|
||||
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.dto.smsTemplate;
|
||||
|
||||
import cn.iocoder.common.framework.vo.PageParam;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* page 短信模板 query
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:32 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ListSmsTemplateDTO extends PageParam {
|
||||
|
||||
@NotNull
|
||||
private String id;
|
||||
|
||||
@NotNull
|
||||
private Integer smsSignId;
|
||||
|
||||
@NotNull
|
||||
private String template;
|
||||
|
||||
@NotNull
|
||||
private String applyStatus;
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.enums.sms;
|
||||
|
||||
/**
|
||||
* 短信审核状态
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:48 PM
|
||||
*/
|
||||
public enum SmsApplyStatusEnum {
|
||||
|
||||
CHECKING(1, "审核中"),
|
||||
SUCCESS(2, "审核成功"),
|
||||
FAIL(10, "审核失败"),
|
||||
;
|
||||
|
||||
private final Integer value;
|
||||
private final String name;
|
||||
|
||||
SmsApplyStatusEnum(int code, String message) {
|
||||
this.value = code;
|
||||
this.name = message;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.enums.sms;
|
||||
|
||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 短信审核状态
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:48 PM
|
||||
*/
|
||||
public enum SmsPlatformEnum implements IntArrayValuable {
|
||||
|
||||
YunPian(1, "云片"),
|
||||
AliYun(2, "阿里云"),
|
||||
;
|
||||
|
||||
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsPlatformEnum::getValue).toArray();
|
||||
|
||||
private final Integer value;
|
||||
private final String name;
|
||||
|
||||
SmsPlatformEnum(Integer code, String message) {
|
||||
this.value = code;
|
||||
this.name = message;
|
||||
}
|
||||
|
||||
public Integer getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] array() {
|
||||
return ARRAYS;
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.enums.sms;
|
||||
|
||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 短信审核状态
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:48 PM
|
||||
*/
|
||||
public enum SmsTypeEnum implements IntArrayValuable {
|
||||
|
||||
VERIFICATION_CODE(1, "验证码"),
|
||||
NOTICE(2, "通知"),
|
||||
MARKETING(3, "营销"),
|
||||
;
|
||||
|
||||
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsTypeEnum::getValue).toArray();
|
||||
|
||||
private final Integer value;
|
||||
private final String name;
|
||||
|
||||
SmsTypeEnum(Integer code, String message) {
|
||||
this.value = code;
|
||||
this.name = message;
|
||||
}
|
||||
|
||||
public Integer getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] array() {
|
||||
return ARRAYS;
|
||||
}
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* @author Hccake
|
||||
* @version 1.0
|
||||
* @date 2019/10/15 18:09
|
||||
*/
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface OperationLogging {
|
||||
|
||||
/**
|
||||
* 日志信息
|
||||
* @return
|
||||
*/
|
||||
String value();
|
||||
}
|
@ -1,118 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.aspect;
|
||||
|
||||
import cn.hutool.core.util.ArrayUtil;
|
||||
import cn.hutool.core.util.URLUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import cn.iocoder.common.framework.util.HttpUtil;
|
||||
import cn.iocoder.common.framework.util.MallUtils;
|
||||
import cn.iocoder.mall.system.biz.log.operation.annotation.OperationLogging;
|
||||
import cn.iocoder.mall.system.biz.log.operation.enums.LogStatus;
|
||||
import cn.iocoder.mall.system.biz.log.operation.event.OperationLogEvent;
|
||||
import cn.iocoder.mall.system.biz.log.operation.model.dto.OperationLogDTO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.aspectj.lang.ProceedingJoinPoint;
|
||||
import org.aspectj.lang.Signature;
|
||||
import org.aspectj.lang.annotation.Around;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.reflect.MethodSignature;
|
||||
import org.springframework.context.ApplicationEventPublisher;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author Hccake
|
||||
* @version 1.0
|
||||
* @date 2019/10/15 18:16
|
||||
*/
|
||||
@Slf4j
|
||||
@Aspect
|
||||
@Order(0)
|
||||
@RequiredArgsConstructor
|
||||
public class OperationLogAspect {
|
||||
private final ApplicationEventPublisher publisher;
|
||||
|
||||
@Around("@annotation(operationLogging)")
|
||||
public Object around(ProceedingJoinPoint joinPoint, OperationLogging operationLogging) throws Throwable {
|
||||
Signature signature = joinPoint.getSignature();
|
||||
String strClassName = joinPoint.getTarget().getClass().getName();
|
||||
String strMethodName = signature.getName();
|
||||
log.debug("[类名]:{},[方法]:{}", strClassName, strMethodName);
|
||||
|
||||
// 获取日志
|
||||
OperationLogDTO operationLogDTO = prodOperationLog();
|
||||
operationLogDTO.setMsg(operationLogging.value());
|
||||
// 记录参数
|
||||
MethodSignature methodSignature = (MethodSignature) signature;
|
||||
operationLogDTO.setParams(getParams(joinPoint, methodSignature));
|
||||
// 开始时间
|
||||
long startTime = System.currentTimeMillis();
|
||||
Object result;
|
||||
try {
|
||||
result = joinPoint.proceed();
|
||||
} catch (Throwable throwable) {
|
||||
operationLogDTO.setStatus(LogStatus.FAIL.getValue());
|
||||
throw throwable;
|
||||
}
|
||||
// 结束时间
|
||||
operationLogDTO.setResponseTime((int) (System.currentTimeMillis() - startTime));
|
||||
// 发布事件
|
||||
publisher.publishEvent(new OperationLogEvent(operationLogDTO));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取方法参数
|
||||
* @param joinPoint joinPoint
|
||||
* @param methodSignature 方法签名
|
||||
* @return 方法参数的Json字符串形式
|
||||
*/
|
||||
private String getParams(ProceedingJoinPoint joinPoint, MethodSignature methodSignature) {
|
||||
String[] parameterNames = methodSignature.getParameterNames();
|
||||
Object[] args = joinPoint.getArgs();
|
||||
if(ArrayUtil.isEmpty(parameterNames)){
|
||||
return null;
|
||||
}
|
||||
Map<String, Object> paramsMap = new HashMap<>();
|
||||
for (int i = 0; i < parameterNames.length; i++) {
|
||||
paramsMap.put(parameterNames[i], args[i]);
|
||||
}
|
||||
return JSONUtil.toJsonStr(paramsMap);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据请求生成操作日志
|
||||
* @return 操作日志DTO
|
||||
*/
|
||||
private OperationLogDTO prodOperationLog() {
|
||||
HttpServletRequest request = ((ServletRequestAttributes) Objects
|
||||
.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
|
||||
|
||||
return new OperationLogDTO()
|
||||
.setTraceId(MallUtils.getTraceId())
|
||||
.setUri(URLUtil.getPath(request.getRequestURI()))
|
||||
.setUserAgent(HttpUtil.getUserAgent(request))
|
||||
.setIp(HttpUtil.getIp(request))
|
||||
.setMethod(request.getMethod())
|
||||
// TODO 获取管理员用户名 或者 用户ID
|
||||
// .setOperator(Objects.requireNonNull(LogUtils.getUsername()))
|
||||
.setStatus(LogStatus.SUCCESS.getValue());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.enums;
|
||||
|
||||
/**
|
||||
* @author Hccake
|
||||
* @version 1.0
|
||||
* @date 2020/5/15 14:47
|
||||
*/
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 操作状态
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum LogStatus {
|
||||
/**
|
||||
* 成功
|
||||
*/
|
||||
SUCCESS(1),
|
||||
/**
|
||||
* 失败
|
||||
*/
|
||||
FAIL(0);
|
||||
|
||||
private final int value;
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.event;
|
||||
|
||||
import cn.iocoder.mall.system.biz.log.operation.model.dto.OperationLogDTO;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author
|
||||
* 系统日志事件
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class OperationLogEvent {
|
||||
private final OperationLogDTO operationLogDTO;
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.event;
|
||||
|
||||
import cn.iocoder.mall.system.biz.log.operation.service.OperationLogSaveService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.event.EventListener;
|
||||
import org.springframework.core.annotation.Order;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
|
||||
/**
|
||||
* @author
|
||||
* 异步监听日志事件
|
||||
*/
|
||||
@Slf4j
|
||||
public class OperationLogListener {
|
||||
|
||||
@Autowired
|
||||
private OperationLogSaveService operationLogSaveService;
|
||||
|
||||
@Async
|
||||
@Order
|
||||
@EventListener(OperationLogEvent.class)
|
||||
public void saveSysLog(OperationLogEvent event) {
|
||||
operationLogSaveService.saveLog(event.getOperationLogDTO());
|
||||
}
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.model.dto;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 操作日志
|
||||
*
|
||||
* @author hccake
|
||||
* @date 2020-05-15 15:12:53
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@ApiModel(value = "操作日志")
|
||||
public class OperationLogDTO{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 链路追踪编号
|
||||
*/
|
||||
@ApiModelProperty(value = "链路追踪编号")
|
||||
private String traceId;
|
||||
/**
|
||||
* 账号编号
|
||||
*/
|
||||
@ApiModelProperty(value = "账号编号")
|
||||
private Integer accountId;
|
||||
/**
|
||||
* 应用名
|
||||
*/
|
||||
@ApiModelProperty(value = "应用名")
|
||||
private String applicationName;
|
||||
/**
|
||||
* 访问地址
|
||||
*/
|
||||
@ApiModelProperty(value = "访问地址")
|
||||
private String uri;
|
||||
/**
|
||||
* 参数
|
||||
*/
|
||||
@ApiModelProperty(value = "参数")
|
||||
private String params;
|
||||
/**
|
||||
* http 方法
|
||||
*/
|
||||
@ApiModelProperty(value = "http 方法")
|
||||
private String method;
|
||||
/**
|
||||
* userAgent
|
||||
*/
|
||||
@ApiModelProperty(value = "userAgent")
|
||||
private String userAgent;
|
||||
/**
|
||||
* ip
|
||||
*/
|
||||
@ApiModelProperty(value = "ip")
|
||||
private String ip;
|
||||
/**
|
||||
* 请求时间
|
||||
*/
|
||||
@ApiModelProperty(value = "请求时间")
|
||||
private LocalDateTime startTime;
|
||||
/**
|
||||
* 响应时长 -- 毫秒级
|
||||
*/
|
||||
@ApiModelProperty(value = "响应时长 -- 毫秒级")
|
||||
private Integer responseTime;
|
||||
/**
|
||||
* 日志消息
|
||||
*/
|
||||
@ApiModelProperty(value = "日志消息")
|
||||
private String msg;
|
||||
/**
|
||||
* 操作状态
|
||||
*/
|
||||
@ApiModelProperty(value = "操作状态")
|
||||
private Integer status;
|
||||
/**
|
||||
* 创建者
|
||||
*/
|
||||
@ApiModelProperty(value = "创建者")
|
||||
private String operator;
|
||||
}
|
@ -1,89 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.model.po;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.FieldFill;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.baomidou.mybatisplus.extension.activerecord.Model;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* 操作日志
|
||||
*
|
||||
* @author hccake
|
||||
* @date 2020-05-15 15:12:53
|
||||
*/
|
||||
@Data
|
||||
@TableName("operation_log")
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ApiModel(value = "操作日志")
|
||||
public class OperationLogPO extends Model<OperationLogPO> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
@TableId
|
||||
private Integer id;
|
||||
/**
|
||||
* 链路追踪编号
|
||||
*/
|
||||
private String traceId;
|
||||
/**
|
||||
* 账号编号
|
||||
*/
|
||||
private Integer accountId;
|
||||
/**
|
||||
* 应用名
|
||||
*/
|
||||
private String applicationName;
|
||||
/**
|
||||
* 访问地址
|
||||
*/
|
||||
private String uri;
|
||||
/**
|
||||
* 参数
|
||||
*/
|
||||
private String params;
|
||||
/**
|
||||
* http 方法
|
||||
*/
|
||||
private String method;
|
||||
/**
|
||||
* userAgent
|
||||
*/
|
||||
private String userAgent;
|
||||
/**
|
||||
* ip
|
||||
*/
|
||||
private String ip;
|
||||
/**
|
||||
* 请求时间
|
||||
*/
|
||||
private LocalDateTime startTime;
|
||||
/**
|
||||
* 响应时长 -- 毫秒级
|
||||
*/
|
||||
private Integer responseTime;
|
||||
/**
|
||||
* 日志消息
|
||||
*/
|
||||
private String msg;
|
||||
/**
|
||||
* 操作状态
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 创建者
|
||||
*/
|
||||
private String operator;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@TableField(fill = FieldFill.INSERT)
|
||||
private LocalDateTime createTime;
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.log.operation.service;
|
||||
|
||||
|
||||
import cn.iocoder.mall.system.biz.log.operation.model.dto.OperationLogDTO;
|
||||
|
||||
/**
|
||||
* 操作日志业务类
|
||||
* @author Hccake
|
||||
* @version 1.0
|
||||
* @date 2019/10/15 19:57
|
||||
*/
|
||||
public interface OperationLogSaveService {
|
||||
|
||||
/**
|
||||
* 保存操作日志
|
||||
* @param operationLogDTO
|
||||
* @return true/false
|
||||
*/
|
||||
boolean saveLog(OperationLogDTO operationLogDTO);
|
||||
}
|
@ -1,155 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.service.sms;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.aliyuncs.CommonRequest;
|
||||
import com.aliyuncs.CommonResponse;
|
||||
import com.aliyuncs.DefaultAcsClient;
|
||||
import com.aliyuncs.IAcsClient;
|
||||
import com.aliyuncs.exceptions.ClientException;
|
||||
import com.aliyuncs.http.MethodType;
|
||||
import com.aliyuncs.profile.DefaultProfile;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 短信 AliYun client
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/25 12:28 PM
|
||||
*/
|
||||
@Component // TODO DOME FROM 芋艿 to 小范:建议类名改成 AliYunSmsClient
|
||||
public class AliYunSmsClient implements SmsClient {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(AliYunSmsClient.class);
|
||||
|
||||
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
|
||||
private static final String SUCCESS_CODE = "OK";
|
||||
private static final String SUCCESS_MESSAGE = "OK";
|
||||
/**
|
||||
* 阿里云短信 - 批量推送最大数 500,支持 1000
|
||||
*/
|
||||
private static final int MAX_BATCH_SIZE = 500;
|
||||
|
||||
@Value("${sms.aliYun.accessKeyId?:'default_value'}")
|
||||
private String accessKeyId;
|
||||
@Value("${sms.aliYun.accessSecret?:'default_value'}")
|
||||
private String accessSecret;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Result {
|
||||
/**
|
||||
* 发送回执ID,可根据该ID在接口QuerySendDetails中查询具体的发送状态。
|
||||
*/
|
||||
private String BizId;
|
||||
/**
|
||||
* 请求状态码。
|
||||
*
|
||||
* - OK 蔡成功
|
||||
*/
|
||||
private String Code;
|
||||
/**
|
||||
* 状态码的描述。
|
||||
*/
|
||||
private String Message;
|
||||
/**
|
||||
* 请求ID。
|
||||
*/
|
||||
private String RequestId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SendResult singleSend(String mobile, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams) {
|
||||
// params
|
||||
CommonRequest request = new CommonRequest();
|
||||
request.setMethod(MethodType.POST);
|
||||
request.setDomain(DOMAIN);
|
||||
request.setVersion("2017-05-25");
|
||||
request.setAction("SendSms");
|
||||
request.putQueryParameter("PhoneNumbers", mobile);
|
||||
request.putQueryParameter("SignName", sign);
|
||||
request.putQueryParameter("TemplateCode", templateCode);
|
||||
request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParams));
|
||||
// 发送请求
|
||||
return doSend(request);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SendResult batchSend(List<String> mobileList, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams) {
|
||||
// 最大发送数为 1000,我们设置为 500 个, 分段发送
|
||||
int maxSendSize = MAX_BATCH_SIZE;
|
||||
int maxSendSizeCount = mobileList.size() % maxSendSize == 0
|
||||
? mobileList.size() / maxSendSize
|
||||
: mobileList.size() / maxSendSize + 1;
|
||||
// 处理批量
|
||||
SendResult sendResult = null;
|
||||
for (int i = 0; i < maxSendSizeCount; i++) {
|
||||
// 分批发送
|
||||
List<String> batchSendMobile = mobileList
|
||||
.subList(i * maxSendSize, (i + 1) * maxSendSize);
|
||||
// params
|
||||
CommonRequest request = new CommonRequest();
|
||||
request.setMethod(MethodType.POST);
|
||||
request.setDomain(DOMAIN);
|
||||
request.setVersion("2017-05-25");
|
||||
request.setAction("SendBatchSms");
|
||||
request.putQueryParameter("PhoneNumberJson", JSON.toJSONString(batchSendMobile));
|
||||
request.putQueryParameter("SignNameJson", JSON.toJSONString(Collections.singletonList(sign)));
|
||||
request.putQueryParameter("TemplateCode", templateCode);
|
||||
request.putQueryParameter("TemplateParamJson", JSON.toJSONString(Collections.singletonList(templateParams)));
|
||||
// 发送请求
|
||||
sendResult = doSend(request);
|
||||
}
|
||||
return sendResult;
|
||||
}
|
||||
|
||||
private SendResult doSend(CommonRequest request) {
|
||||
// 获取 client
|
||||
IAcsClient client = getClient();
|
||||
try {
|
||||
CommonResponse response = client.getCommonResponse(request);
|
||||
Result result = JSON.parseObject(response.getData(), Result.class);
|
||||
if (!SUCCESS_CODE.equals(result.getCode())) {
|
||||
LOGGER.info("发送验证码失败 params {} res {}", JSON.toJSON(request), JSON.toJSON(result));
|
||||
// 错误发送失败
|
||||
return new SendResult()
|
||||
.setIsSuccess(false)
|
||||
.setCode(SendResult.ERROR_CODE)
|
||||
.setMessage(result.getMessage());
|
||||
} else {
|
||||
LOGGER.info("发送验证码失败 params {} res", JSON.toJSON(request), JSON.toJSON(result));
|
||||
// 发送成功
|
||||
return new SendResult()
|
||||
.setIsSuccess(true)
|
||||
.setCode(SendResult.SUCCESS_CODE)
|
||||
.setMessage(result.getMessage());
|
||||
}
|
||||
} catch (ClientException e) {
|
||||
LOGGER.error("发送验证码异常 {}", ExceptionUtils.getMessage(e));
|
||||
return new SendResult()
|
||||
.setIsSuccess(false)
|
||||
.setCode(SendResult.ERROR_CODE)
|
||||
.setMessage(ExceptionUtils.getMessage(e));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 client
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private IAcsClient getClient() {
|
||||
return new DefaultAcsClient(DefaultProfile.getProfile("default", accessKeyId, accessSecret));
|
||||
}
|
||||
}
|
@ -1,64 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.service.sms;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 短信平台
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:33 PM
|
||||
*/
|
||||
public interface SmsClient {
|
||||
|
||||
/**
|
||||
* 短信发送 - 单个
|
||||
*
|
||||
* @param mobile 手机号
|
||||
* @param sign 签名
|
||||
* @param templateCode 短信模板code
|
||||
* @param template 短信模板
|
||||
* @param templateParams 短信模板 params
|
||||
* @return 发送后信息
|
||||
*/
|
||||
SendResult singleSend(String mobile, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams);
|
||||
|
||||
/**
|
||||
* 短信发送 - 批量
|
||||
*
|
||||
* @param mobileList 手机号
|
||||
* @param sign 签名
|
||||
* @param templateCode 短信模板 code
|
||||
* @param template 短信模板
|
||||
* @param templateParams 短信模板params
|
||||
* @return 发送后信息
|
||||
*/
|
||||
SendResult batchSend(List<String> mobileList, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams);
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
class SendResult {
|
||||
|
||||
public static final int SUCCESS_CODE = 0;
|
||||
public static final int ERROR_CODE = 1;
|
||||
public static final String SUCCESS_MESSAGE = "SUCCESS";
|
||||
|
||||
/**
|
||||
* 错误码
|
||||
*/
|
||||
private Integer code;
|
||||
/**
|
||||
* 错误信息
|
||||
*/
|
||||
private String message;
|
||||
/**
|
||||
* 是否成功
|
||||
*/
|
||||
private Boolean isSuccess;
|
||||
}
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.service.sms;
|
||||
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.system.biz.bo.smsSign.ListSmsSignBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsTemplate.ListSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsSign.SmsSignBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsTemplate.SmsTemplateBO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.AddSignDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.ListSmsSignDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsTemplate.ListSmsTemplateDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.UpdateSignDTO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 短信服务
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 9:54 AM
|
||||
*/
|
||||
public interface SmsService {
|
||||
|
||||
/**
|
||||
* 短信模板 - 分页
|
||||
*
|
||||
* @param listSmsSignDTO
|
||||
* @return
|
||||
*/
|
||||
PageResult<ListSmsSignBO> listSmsSign(ListSmsSignDTO listSmsSignDTO);
|
||||
|
||||
/**
|
||||
* 短信模板 - 分页
|
||||
*
|
||||
* @param listSmsTemplateDTO
|
||||
* @return
|
||||
*/
|
||||
PageResult<ListSmsTemplateBO> listSmsTemplate(ListSmsTemplateDTO listSmsTemplateDTO);
|
||||
|
||||
/**
|
||||
* 签名 - 创建
|
||||
*
|
||||
* @param addSignDTO
|
||||
*/
|
||||
void addSign(AddSignDTO addSignDTO);
|
||||
|
||||
/**
|
||||
* 签名 - 获取
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
SmsSignBO getSign(Integer id);
|
||||
|
||||
/**
|
||||
* 签名 - 更新
|
||||
*
|
||||
* @param updateSignDTO
|
||||
*/
|
||||
void updateSign(UpdateSignDTO updateSignDTO);
|
||||
|
||||
/**
|
||||
* 签名 - 更新
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
void deleteSign(Integer id);
|
||||
|
||||
/**
|
||||
* 模板 - 创建
|
||||
*
|
||||
* @param smsSignId 选用的哪个签名
|
||||
* @param templateCode 模板code
|
||||
* @param template 模板内容
|
||||
* @param platform 平台
|
||||
*/
|
||||
void addTemplate(Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType);
|
||||
|
||||
/**
|
||||
* 模板 - 获取
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
SmsTemplateBO getTemplate(Integer id, Integer platform);
|
||||
|
||||
/**
|
||||
* 模板 - 更新
|
||||
*
|
||||
* @param id 模板id
|
||||
* @param smsSignId 短期签名
|
||||
* @param template 模板内容
|
||||
* @param platform 短信平台
|
||||
*/
|
||||
void updateTemplate(Integer id, Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType);
|
||||
|
||||
/**
|
||||
* 模板 - 删除
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
void deleteTemplate(Integer id);
|
||||
|
||||
/**
|
||||
* 短信发送 - 单个
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
void singleSend(String mobile, Integer smsTemplateId, Map<String, String> params);
|
||||
|
||||
/**
|
||||
* 短信发送 - 批量
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
void batchSend(List<String> mobileList, Integer smsTemplateId, Map<String, String> params);
|
||||
}
|
@ -1,364 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.service.sms;
|
||||
|
||||
import cn.iocoder.common.framework.exception.ServiceException;
|
||||
import cn.iocoder.common.framework.util.ServiceExceptionUtil;
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.mybatis.core.enums.DeletedStatusEnum;
|
||||
import cn.iocoder.mall.system.biz.bo.smsSign.ListSmsSignBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsSign.SmsSignBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsTemplate.ListSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.biz.bo.smsTemplate.SmsTemplateBO;
|
||||
import cn.iocoder.mall.system.biz.convert.SmsSignConvert;
|
||||
import cn.iocoder.mall.system.biz.convert.SmsTemplateConvert;
|
||||
import cn.iocoder.mall.system.biz.dao.sms.SmsSendMapper;
|
||||
import cn.iocoder.mall.system.biz.dao.sms.SmsSignMapper;
|
||||
import cn.iocoder.mall.system.biz.dao.sms.SmsTemplateMapper;
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsSendLogDO;
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsSignDO;
|
||||
import cn.iocoder.mall.system.biz.dataobject.sms.SmsTemplateDO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.AddSignDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.ListSmsSignDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.UpdateSignDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsTemplate.ListSmsTemplateDTO;
|
||||
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
|
||||
import cn.iocoder.mall.system.biz.enums.sms.SmsApplyStatusEnum;
|
||||
import cn.iocoder.mall.system.biz.enums.sms.SmsPlatformEnum;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 短信
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 10:30 AM
|
||||
*/
|
||||
@Service
|
||||
public class SmsServiceImpl implements SmsService {
|
||||
|
||||
@Autowired
|
||||
private SmsSignMapper smsSignMapper;
|
||||
@Autowired
|
||||
private SmsTemplateMapper smsTemplateMapper;
|
||||
@Autowired
|
||||
private SmsSendMapper smsSendMapper;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("yunPianSmsClient")
|
||||
private SmsClient smsYunPianClient;
|
||||
@Autowired
|
||||
@Qualifier("aliYunSmsClient")
|
||||
private SmsClient smsAliYunClient;
|
||||
|
||||
@Override
|
||||
public PageResult<ListSmsSignBO> listSmsSign(ListSmsSignDTO queryDTO) {
|
||||
// TODO DOME FROM 芋艿 to 小范:mybatis-plus 的 QueryWrapper 不要到 Service 层,可以抽 Dao 方法里哈。其它的类似可以瞅瞅噢
|
||||
IPage<SmsSignDO> signPage = smsSignMapper.listSmsSign(queryDTO);
|
||||
List<ListSmsSignBO> signList = SmsSignConvert.INSTANCE.convert(signPage.getRecords());
|
||||
return new PageResult<ListSmsSignBO>().setList(signList).setTotal(signPage.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<ListSmsTemplateBO> listSmsTemplate(ListSmsTemplateDTO listSmsTemplateDTO) {
|
||||
// 获取 template
|
||||
IPage<SmsTemplateDO> signPage = smsTemplateMapper.listSmsTemplate(listSmsTemplateDTO);
|
||||
if (CollectionUtils.isEmpty(signPage.getRecords())) {
|
||||
// TODO DOME FROM 芋艿 to 小范,Collections.EMPTY_LIST =》Collections.emptyList();另外,可以考虑直接 Convert 哈
|
||||
return new PageResult<ListSmsTemplateBO>().setList(Collections.emptyList()).setTotal(signPage.getTotal());
|
||||
}
|
||||
// 转换bo
|
||||
List<ListSmsTemplateBO> templateList = SmsTemplateConvert.INSTANCE.convert(signPage.getRecords());
|
||||
// 获取 sign
|
||||
Set<Integer> smsSignIds = templateList.stream().map(
|
||||
ListSmsTemplateBO::getSmsSignId).collect(Collectors.toSet());
|
||||
|
||||
List<SmsSignDO> smsSignDOList = smsSignMapper.selectList(
|
||||
new QueryWrapper<SmsSignDO>().in("id", smsSignIds));
|
||||
|
||||
List<ListSmsTemplateBO.Sign> signList = SmsTemplateConvert.INSTANCE.convertTemplateSign(smsSignDOList);
|
||||
// sign 转换为 map
|
||||
Map<Integer, ListSmsTemplateBO.Sign> smsSignDOMap = signList
|
||||
.stream().collect(Collectors.toMap(ListSmsTemplateBO.Sign::getId, o -> o));
|
||||
// 设置 sign
|
||||
templateList.forEach(template -> {
|
||||
if (smsSignDOMap.containsKey(template.getSmsSignId())) {
|
||||
template.setSign(smsSignDOMap.get(template.getSmsSignId()));
|
||||
}
|
||||
});
|
||||
return new PageResult<ListSmsTemplateBO>().setList(templateList).setTotal(signPage.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void addSign(AddSignDTO addSignDTO) {
|
||||
// 避免重复
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>()
|
||||
.eq("platform", addSignDTO.getPlatform())
|
||||
.eq("sign", addSignDTO.getSign())
|
||||
);
|
||||
// 处理 null 情况
|
||||
if (smsSignDO != null) {
|
||||
// TODO DOME FROM 芋艿 to 小范:可以使用 ServiceExceptionUtil.exception(SystemErrorCodeEnum.SMS_SIGN_IS_EXISTENT);
|
||||
throw ServiceExceptionUtil.exception(SystemErrorCodeEnum.SMS_SIGN_IS_EXISTENT);
|
||||
}
|
||||
// 保存数据库
|
||||
smsSignMapper.insert(
|
||||
(SmsSignDO) new SmsSignDO()
|
||||
.setSign(addSignDTO.getSign())
|
||||
.setPlatform(addSignDTO.getPlatform())
|
||||
.setApplyStatus(SmsApplyStatusEnum.SUCCESS.getValue())
|
||||
.setDeleted(DeletedStatusEnum.DELETED_NO.getValue())
|
||||
.setUpdateTime(new Date())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsSignBO getSign(Integer signId) {
|
||||
// 查询数据库
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>()
|
||||
.eq("id", signId)
|
||||
.eq("deleted", DeletedStatusEnum.DELETED_NO.getValue()));
|
||||
// 处理 null
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 转换vo返回
|
||||
return SmsSignConvert.INSTANCE.convert(smsSignDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateSign(UpdateSignDTO updateSignDTO) {
|
||||
// 避免重复
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>()
|
||||
.eq("sign", updateSignDTO.getSign())
|
||||
.eq("platform", updateSignDTO.getPlatform()));
|
||||
// 处理 null
|
||||
if (smsSignDO != null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getMessage());
|
||||
}
|
||||
// 更新
|
||||
smsSignMapper.update(
|
||||
(SmsSignDO) new SmsSignDO()
|
||||
.setSign(updateSignDTO.getSign())
|
||||
.setPlatform(updateSignDTO.getPlatform())
|
||||
.setUpdateTime(new Date()),
|
||||
new QueryWrapper<SmsSignDO>().eq("id", updateSignDTO.getId())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteSign(Integer id) {
|
||||
// 根据id查询
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectById(id);
|
||||
// 处理 null
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 更新 deleted 为 YES
|
||||
smsSignMapper.delete(new UpdateWrapper<SmsSignDO>()
|
||||
.set("deleted", DeletedStatusEnum.DELETED_YES.getName())
|
||||
.eq("id", id)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void addTemplate(Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType) {
|
||||
// 根据id查询
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectById(smsSignId);
|
||||
// 处理 null
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 保存数据库
|
||||
smsTemplateMapper.insert(
|
||||
(SmsTemplateDO) new SmsTemplateDO()
|
||||
.setId(null)
|
||||
.setSmsSignId(smsSignId)
|
||||
.setTemplateCode(templateCode)
|
||||
.setTemplate(template)
|
||||
.setPlatform(platform)
|
||||
.setSmsType(smsType)
|
||||
.setApplyStatus(SmsApplyStatusEnum.SUCCESS.getValue())
|
||||
.setApplyMessage("")
|
||||
.setDeleted(DeletedStatusEnum.DELETED_NO.getValue())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsTemplateBO getTemplate(Integer id, Integer platform) {
|
||||
// 获取数据
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
|
||||
new QueryWrapper<SmsTemplateDO>()
|
||||
.eq("platform", platform)
|
||||
.eq("id", id));
|
||||
// 处理 null
|
||||
if (smsTemplateDO == null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 转换bo返回
|
||||
return SmsTemplateConvert.INSTANCE.convert(smsTemplateDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateTemplate(Integer id, Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType) {
|
||||
// 获取 template
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectById(id);
|
||||
if (smsTemplateDO == null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 获取 sign
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>().eq("id", smsTemplateDO.getSmsSignId()));
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 更新数据库
|
||||
smsTemplateMapper.update(
|
||||
(SmsTemplateDO) new SmsTemplateDO()
|
||||
.setSmsSignId(smsSignId)
|
||||
.setTemplateCode(templateCode)
|
||||
.setTemplate(template)
|
||||
.setPlatform(platform)
|
||||
.setSmsType(smsType)
|
||||
.setUpdateTime(new Date()),
|
||||
new QueryWrapper<SmsTemplateDO>().eq("id", id)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void deleteTemplate(Integer id) {
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
|
||||
new QueryWrapper<SmsTemplateDO>().eq("id", id));
|
||||
// 处理不存在情况
|
||||
if (smsTemplateDO == null
|
||||
|| smsTemplateDO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 删除 数据库模板
|
||||
SmsTemplateDO updateTemplate =new SmsTemplateDO();
|
||||
updateTemplate.setDeleted(DeletedStatusEnum.DELETED_YES.getValue());
|
||||
smsTemplateMapper.delete(
|
||||
new UpdateWrapper<SmsTemplateDO>()
|
||||
.set("deleted", DeletedStatusEnum.DELETED_YES)
|
||||
.eq("id", id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void singleSend(String mobile, Integer smsTemplateId, Map<String, String> params) {
|
||||
// 获取 template
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectById(smsTemplateId);
|
||||
if (smsTemplateDO == null
|
||||
|| smsTemplateDO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 获取 sign
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectById(smsTemplateDO.getSmsSignId());
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 获取 client
|
||||
SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform());
|
||||
// 发送短信
|
||||
SmsClient.SendResult sendResult = smsClient.singleSend(mobile, smsSignDO.getSign(),
|
||||
smsTemplateDO.getTemplateCode(), smsTemplateDO.getTemplate(), params);
|
||||
// 添加日志
|
||||
smsSendMapper.insert(
|
||||
(SmsSendLogDO) new SmsSendLogDO()
|
||||
.setTemplateId(smsTemplateDO.getId())
|
||||
.setTemplate(smsTemplateDO.getTemplate())
|
||||
.setMessage(sendResult.getMessage())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchSend(List<String> mobileList, Integer smsTemplateId, Map<String, String> params) {
|
||||
// 获取 template
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectById(smsTemplateId);
|
||||
if (smsTemplateDO == null
|
||||
|| smsTemplateDO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 获取 sign
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectById(smsTemplateDO.getSmsSignId());
|
||||
if (smsSignDO == null) {
|
||||
// 添加日志
|
||||
smsSendMapper.insert(
|
||||
(SmsSendLogDO) new SmsSendLogDO()
|
||||
.setTemplateId(smsTemplateDO.getId())
|
||||
.setTemplate(smsTemplateDO.getTemplate())
|
||||
.setMessage("发送成功!")
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
// 获取 client
|
||||
SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform());
|
||||
// 发送短信
|
||||
SmsClient.SendResult sendResult = smsClient.batchSend(mobileList, smsSignDO.getSign(),
|
||||
smsTemplateDO.getTemplateCode(), smsTemplateDO.getTemplate(), params);
|
||||
// 添加日志
|
||||
smsSendMapper.insert(
|
||||
(SmsSendLogDO) new SmsSendLogDO()
|
||||
.setTemplateId(smsTemplateDO.getId())
|
||||
.setTemplate(smsTemplateDO.getTemplate())
|
||||
.setMessage(sendResult.getMessage())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 sms 对于的 client
|
||||
*
|
||||
* @param platform
|
||||
* @return
|
||||
*/
|
||||
private SmsClient getSmsClient(Integer platform) {
|
||||
SmsClient smsClient = null;
|
||||
// 阿里云和云片
|
||||
if (SmsPlatformEnum.YunPian.getValue().equals(platform)) {
|
||||
smsClient = smsYunPianClient;
|
||||
} else if (SmsPlatformEnum.AliYun.getValue().equals(platform)) {
|
||||
smsClient = smsAliYunClient;
|
||||
}
|
||||
// 没有支持的平台
|
||||
if (smsClient == null) {
|
||||
throw new ServiceException(
|
||||
SystemErrorCodeEnum.SMS_NOT_SEND_CLIENT.getCode(),
|
||||
SystemErrorCodeEnum.SMS_NOT_SEND_CLIENT.getMessage());
|
||||
}
|
||||
return smsClient;
|
||||
}
|
||||
}
|
@ -1,232 +0,0 @@
|
||||
package cn.iocoder.mall.system.biz.service.sms;
|
||||
|
||||
import cn.iocoder.common.framework.exception.ServiceException;
|
||||
import cn.iocoder.mall.system.biz.enums.SystemErrorCodeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.message.BasicNameValuePair;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 云片 短信平台
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:34 PM
|
||||
*/
|
||||
@Component
|
||||
public class YunPianSmsClient implements SmsClient {
|
||||
|
||||
protected static final Logger LOGGER = LoggerFactory.getLogger(YunPianSmsClient.class);
|
||||
|
||||
private static final int SUCCESS_CODE = 0;
|
||||
private static final String SUCCESS_MESSAGE = "SUCCESS";
|
||||
|
||||
/**
|
||||
* 云片短信 - 批量推送最大数 500,支持 1000
|
||||
*/
|
||||
private static final int MAX_BATCH_SIZE = 500;
|
||||
/**
|
||||
* 模板 - 参数拼接
|
||||
*/
|
||||
private static final String PARAM_TEMPLATE = "#%s#";
|
||||
/**
|
||||
* 模板 - 签名拼接
|
||||
*/
|
||||
private static final String SIGN_TEMPLATE = "【%s】%s";
|
||||
|
||||
/**
|
||||
* 签名 - 添加
|
||||
*/
|
||||
private static final String URL_SIGN_ADD = "https://sms.yunpian.com/v2/sign/add.json";
|
||||
/**
|
||||
* 签名 - 获取
|
||||
*/
|
||||
private static final String URL_SIGN_GET = "https://sms.yunpian.com/v2/sign/get.json";
|
||||
/**
|
||||
* 签名 - 更新
|
||||
*/
|
||||
private static final String URL_SIGN_UPDATE = "https://sms.yunpian.com/v2/sign/update.json";
|
||||
/**
|
||||
* 模板 - 添加
|
||||
*/
|
||||
private static final String URL_TEMPLATE_ADD = "https://sms.yunpian.com/v2/tpl/add.json";
|
||||
/**
|
||||
* 模板 - 获取
|
||||
*/
|
||||
private static final String URL_TEMPLATE_GET = "https://sms.yunpian.com/v2/tpl/get.json";
|
||||
/**
|
||||
* 模板 - 更新
|
||||
*/
|
||||
private static final String URL_TEMPLATE_UPDATE = "https://sms.yunpian.com/v2/tpl/update.json";
|
||||
/**
|
||||
* 模板 - 删除
|
||||
*/
|
||||
private static final String URL_TEMPLATE_DELETE = "https://sms.yunpian.com/v2/tpl/del.json";
|
||||
/**
|
||||
* 短信发送 - 单个
|
||||
*/
|
||||
private static final String URL_SEND_SINGLE = "https://sms.yunpian.com/v2/sms/single_send.json";
|
||||
/**
|
||||
* 短信发送 - 批量
|
||||
*/
|
||||
private static final String URL_SEND_BATCH = "https://sms.yunpian.com/v2/sms/batch_send.json";
|
||||
|
||||
//编码格式。发送编码格式统一用UTF-8
|
||||
private static String ENCODING = "UTF-8";
|
||||
|
||||
@Value("${sms.yunPian.apiKey?:'default_value'}")
|
||||
private String apiKey;
|
||||
|
||||
@Override
|
||||
public SendResult singleSend(String mobile, String sign, String templateCode, String template, Map<String, String> templateParams) {
|
||||
// build 模板
|
||||
template = buildTemplate(sign, template, templateParams);
|
||||
// 请求参数
|
||||
Map<String, String> params = new LinkedHashMap<>();
|
||||
params.put("apikey", apiKey);
|
||||
params.put("mobile", mobile);
|
||||
params.put("text", template);
|
||||
// TODO: 2019/5/19 sin 运营商发送报告 回调
|
||||
// params.put("callback_url", template);
|
||||
String result = post(URL_SEND_SINGLE, params);
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
if (jsonObject.containsKey("code")
|
||||
&& !(jsonObject.getInteger("code") == SUCCESS_CODE)) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_PLATFORM_FAIL.getCode(),
|
||||
jsonObject.getString("detail"));
|
||||
}
|
||||
// 转换 result
|
||||
return new SendResult()
|
||||
.setIsSuccess(SUCCESS_CODE == jsonObject.getInteger("code"))
|
||||
.setCode(jsonObject.getInteger("code"))
|
||||
.setMessage(jsonObject.getString("detail"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public SendResult batchSend(List<String> mobileList, String sign,
|
||||
String templateCode, String template,
|
||||
Map<String, String> templateParams) {
|
||||
// build 模板
|
||||
template = buildTemplate(sign, template, templateParams);
|
||||
// 最大发送数为 1000,我们设置为 500 个, 分段发送
|
||||
int maxSendSize = MAX_BATCH_SIZE;
|
||||
int maxSendSizeCount = mobileList.size() % maxSendSize == 0
|
||||
? mobileList.size() / maxSendSize
|
||||
: mobileList.size() / maxSendSize + 1;
|
||||
int j = 0;
|
||||
int j2 = mobileList.size();
|
||||
|
||||
for (int i = 0; i < maxSendSizeCount; i++) {
|
||||
StringBuffer sendMobileStr = new StringBuffer();
|
||||
for (int k = j; k < j2; k++) {
|
||||
sendMobileStr.append(",");
|
||||
sendMobileStr.append(mobileList.get(k));
|
||||
}
|
||||
String dividedMobile = sendMobileStr.toString().substring(1);
|
||||
// 发送手机号
|
||||
Map<String, String> params = new LinkedHashMap<>();
|
||||
params.put("apikey", apiKey);
|
||||
params.put("mobile", dividedMobile);
|
||||
params.put("text", template);
|
||||
// TODO: 2019/5/19 sin 运营商发送报告 回调
|
||||
// params.put("callback_url", template);
|
||||
String result = post(URL_SEND_BATCH, params);
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
if (jsonObject.containsKey("code")
|
||||
&& !(jsonObject.getInteger("code") == SUCCESS_CODE)) {
|
||||
throw new ServiceException(SystemErrorCodeEnum.SMS_PLATFORM_FAIL.getCode(),
|
||||
jsonObject.getString("detail"));
|
||||
}
|
||||
// 用于递增 maxSendSize
|
||||
j = j2;
|
||||
j2 = j + maxSendSize;
|
||||
}
|
||||
return new SendResult()
|
||||
.setIsSuccess(true)
|
||||
.setCode(SUCCESS_CODE)
|
||||
.setMessage(SUCCESS_MESSAGE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建模板
|
||||
*
|
||||
* @param sign
|
||||
* @param template
|
||||
* @param templateParams
|
||||
* @return
|
||||
*/
|
||||
private static String buildTemplate(String sign, String template,
|
||||
Map<String, String> templateParams) {
|
||||
// 不处理 empty 数据
|
||||
if (CollectionUtils.isEmpty(templateParams)) {
|
||||
return template;
|
||||
}
|
||||
// 处理template参数
|
||||
for (Map.Entry<String, String> entry : templateParams.entrySet()) {
|
||||
String paramsKey = entry.getKey();
|
||||
String value = entry.getValue();
|
||||
String paramPlace = String.format(PARAM_TEMPLATE, paramsKey);
|
||||
template = template.replaceAll(paramPlace, value);
|
||||
}
|
||||
template = String.format(SIGN_TEMPLATE, sign, template);
|
||||
return template;
|
||||
}
|
||||
|
||||
/**
|
||||
* 基于HttpClient 4.3的通用POST方法
|
||||
*
|
||||
* @param url 提交的URL
|
||||
* @param paramsMap 提交<参数,值>Map
|
||||
* @return 提交响应
|
||||
*/
|
||||
|
||||
public static String post(String url, Map<String, String> paramsMap) {
|
||||
CloseableHttpClient client = HttpClients.createDefault();
|
||||
String responseText = "";
|
||||
CloseableHttpResponse response = null;
|
||||
try {
|
||||
HttpPost method = new HttpPost(url);
|
||||
if (paramsMap != null) {
|
||||
List<NameValuePair> paramList = new ArrayList<>();
|
||||
for (Map.Entry<String, String> param : paramsMap.entrySet()) {
|
||||
NameValuePair pair = new BasicNameValuePair(param.getKey(),
|
||||
param.getValue());
|
||||
paramList.add(pair);
|
||||
}
|
||||
method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
|
||||
}
|
||||
response = client.execute(method);
|
||||
HttpEntity entity = response.getEntity();
|
||||
if (entity != null) {
|
||||
responseText = EntityUtils.toString(entity, ENCODING);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
response.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
LOGGER.debug("云片短信平台 res: {}", responseText);
|
||||
return responseText;
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>system</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>system-rest</artifactId>
|
||||
<description>提供 system 服务的 Rest 接口的实现,提供对外调用</description>
|
||||
|
||||
<dependencies>
|
||||
<!-- Mall 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>system-biz</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Web 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>mall-spring-boot-starter-web</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>mall-spring-boot-starter-security</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>mall-spring-boot-starter-swagger</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@ -1,38 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.controller.file;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import com.qiniu.util.Auth;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* 文件模块(Admins API)
|
||||
*
|
||||
* author: sin
|
||||
* time: 2020/4/20 9:41 上午
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("admins/file")
|
||||
@Api(tags = "文件模块")
|
||||
public class AdminsFileController {
|
||||
|
||||
private Logger logger = LoggerFactory.getLogger(getClass());
|
||||
|
||||
@Autowired
|
||||
private Auth auth;
|
||||
@Value("${qiniu.bucket}")
|
||||
private String bucket;
|
||||
|
||||
@GetMapping("/get-qiniu-token")
|
||||
public CommonResult<String> getQiniuToken() {
|
||||
String token = auth.uploadToken(bucket);
|
||||
logger.info("[qiniu_token][token({}) get]", token);
|
||||
return CommonResult.success(token);
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.controller.sms;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.system.biz.bo.smsSign.ListSmsSignBO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.ListSmsSignDTO;
|
||||
import cn.iocoder.mall.system.biz.service.sms.SmsService;
|
||||
import cn.iocoder.mall.system.rest.convert.sms.AdminsSmsConvert;
|
||||
import cn.iocoder.mall.system.rest.request.sms.AddSignRequest;
|
||||
import cn.iocoder.mall.system.rest.request.sms.UpdateSignRequest;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* 短信服务
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/26 12:26 PM
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("admins/sms/sign")
|
||||
@Api("短信服务(签名)")
|
||||
public class AdminsSmsSignController {
|
||||
|
||||
@Autowired
|
||||
private SmsService smsService;
|
||||
|
||||
@GetMapping("page")
|
||||
@ApiOperation("签名-page")
|
||||
public CommonResult<PageResult<ListSmsSignBO>> pageSign(@Validated ListSmsSignDTO listSmsSignDTO) {
|
||||
return CommonResult.success(smsService.listSmsSign(listSmsSignDTO));
|
||||
}
|
||||
|
||||
@PostMapping("add")
|
||||
@ApiOperation("签名-添加")
|
||||
public CommonResult<?> addSign(@RequestBody AddSignRequest addSignRequest) {
|
||||
smsService.addSign(AdminsSmsConvert.INSTANCE.convert(addSignRequest));
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@PutMapping("update")
|
||||
@ApiOperation("签名-更新")
|
||||
public CommonResult<?> updateSign(@RequestBody UpdateSignRequest updateSignRequest) {
|
||||
smsService.updateSign(AdminsSmsConvert.INSTANCE.convert(updateSignRequest));
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@DeleteMapping("deleted")
|
||||
@ApiOperation("签名-删除")
|
||||
public CommonResult<?> deletedSign(@RequestParam("id") Integer id) {
|
||||
smsService.deleteSign(id);
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
}
|
@ -1,67 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.controller.sms;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.system.biz.bo.smsTemplate.ListSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.biz.service.sms.SmsService;
|
||||
import cn.iocoder.mall.system.rest.convert.sms.AdminsSmsConvert;
|
||||
import cn.iocoder.mall.system.rest.request.sms.AddSmsTemplateRequest;
|
||||
import cn.iocoder.mall.system.rest.request.sms.ListSmsTemplateRequest;
|
||||
import cn.iocoder.mall.system.rest.request.sms.UpdateSmsTemplateRequest;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* 短信服务
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/26 12:26 PM
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("admins/sms/template")
|
||||
@Api("短信服务(短信模板)")
|
||||
public class AdminsSmsTemplateController {
|
||||
|
||||
@Autowired
|
||||
private SmsService smsService;
|
||||
|
||||
@PostMapping("page")
|
||||
@ApiOperation("短信模板-page")
|
||||
public CommonResult<PageResult<ListSmsTemplateBO>> pageSign(@RequestBody ListSmsTemplateRequest request) {
|
||||
return CommonResult.success(smsService.listSmsTemplate(AdminsSmsConvert.INSTANCE.convert(request)));
|
||||
}
|
||||
|
||||
@PostMapping("add")
|
||||
@ApiOperation("短信模板-添加")
|
||||
public CommonResult addSign(@RequestBody AddSmsTemplateRequest smsTemplateAddPO) {
|
||||
smsService.addTemplate(
|
||||
smsTemplateAddPO.getSmsSignId(),
|
||||
smsTemplateAddPO.getTemplateCode(),
|
||||
smsTemplateAddPO.getTemplate(),
|
||||
smsTemplateAddPO.getPlatform(),
|
||||
smsTemplateAddPO.getSmsType());
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@PutMapping("update")
|
||||
@ApiOperation("短信模板-更新")
|
||||
public CommonResult updateSign(@RequestBody UpdateSmsTemplateRequest smsTemplateUpdatePO) {
|
||||
smsService.updateTemplate(
|
||||
smsTemplateUpdatePO.getId(),
|
||||
smsTemplateUpdatePO.getSmsSignId(),
|
||||
smsTemplateUpdatePO.getTemplateCode(),
|
||||
smsTemplateUpdatePO.getTemplate(),
|
||||
smsTemplateUpdatePO.getPlatform(),
|
||||
smsTemplateUpdatePO.getSmsType());
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@DeleteMapping("deleted")
|
||||
@ApiOperation("短信模板-删除")
|
||||
public CommonResult deletedSign(@RequestParam("id") Integer id) {
|
||||
smsService.deleteTemplate(id);
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.convert.sms;
|
||||
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.AddSignDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsSign.UpdateSignDTO;
|
||||
import cn.iocoder.mall.system.biz.dto.smsTemplate.ListSmsTemplateDTO;
|
||||
import cn.iocoder.mall.system.rest.request.sms.AddSignRequest;
|
||||
import cn.iocoder.mall.system.rest.request.sms.UpdateSignRequest;
|
||||
import cn.iocoder.mall.system.rest.request.sms.ListSmsTemplateRequest;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
/**
|
||||
* sms admins convert
|
||||
*
|
||||
* author: sin
|
||||
* time: 2020/4/20 11:07 上午
|
||||
*/
|
||||
@Mapper
|
||||
public interface AdminsSmsConvert {
|
||||
|
||||
AdminsSmsConvert INSTANCE = Mappers.getMapper(AdminsSmsConvert.class);
|
||||
|
||||
@Mappings({})
|
||||
AddSignDTO convert(AddSignRequest bean);
|
||||
|
||||
@Mappings({})
|
||||
UpdateSignDTO convert(UpdateSignRequest bean);
|
||||
|
||||
@Mappings({})
|
||||
ListSmsTemplateDTO convert(ListSmsTemplateRequest bean);
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.request.admin;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @Author: jiangweifan
|
||||
* @Date: 2020/5/12
|
||||
* @Description: 管理员 - 用户信息 - 更新用户信息
|
||||
*/
|
||||
@ApiModel("更新用户信息Request")
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class AdminsUserUpdateRequest {
|
||||
|
||||
@ApiModelProperty(name = "id", value = "用户编号", required = true, example = "1")
|
||||
@NotNull(message = "用户编号不能为空")
|
||||
private Integer id;
|
||||
|
||||
@ApiModelProperty(name = "nickname", value = "昵称", required = true, example = "小王")
|
||||
private String nickname;
|
||||
|
||||
@ApiModelProperty(name = "avatar", value = "头像", required = true, example = "http://www.iocoder.cn/xxx.jpg")
|
||||
private String avatar;
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.request.sms;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 添加 sign
|
||||
*
|
||||
* author: sin
|
||||
* time: 2020/4/20 11:10 上午
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class AddSignRequest implements Serializable {
|
||||
|
||||
private String sign;
|
||||
|
||||
private Integer platform;
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.request.sms;
|
||||
|
||||
import cn.iocoder.common.framework.validator.InEnum;
|
||||
import cn.iocoder.mall.system.biz.enums.sms.SmsPlatformEnum;
|
||||
import cn.iocoder.mall.system.biz.enums.sms.SmsTypeEnum;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 短信模板 add
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/26 12:37 PM
|
||||
*/
|
||||
@ApiModel("短信模板-添加")
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class AddSmsTemplateRequest implements Serializable {
|
||||
|
||||
@ApiModelProperty("短信签名id")
|
||||
@NotNull(message = "短信短信签名id不能为空!")
|
||||
private Integer smsSignId;
|
||||
|
||||
@ApiModelProperty("短信模板code")
|
||||
@NotNull
|
||||
@Size(min = 3, max = 50, message = "短信code在 3-50 之间")
|
||||
private String templateCode;
|
||||
|
||||
@ApiModelProperty("短信模板")
|
||||
@NotNull
|
||||
@Size(min = 3, max = 255, message = "短信在 3-255 之间")
|
||||
private String template;
|
||||
|
||||
@ApiModelProperty("短信模板-平台")
|
||||
@NotNull
|
||||
@InEnum(value = SmsPlatformEnum.class)
|
||||
private Integer platform;
|
||||
|
||||
@ApiModelProperty("短信模板-平台")
|
||||
@NotNull
|
||||
@InEnum(value = SmsTypeEnum.class)
|
||||
private Integer smsType;
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.request.sms;
|
||||
|
||||
import cn.iocoder.common.framework.vo.PageParam;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* page 短信模板 query
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:32 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ListSmsTemplateRequest extends PageParam {
|
||||
|
||||
@NotNull
|
||||
private String id;
|
||||
|
||||
@NotNull
|
||||
private Integer smsSignId;
|
||||
|
||||
@NotNull
|
||||
private String template;
|
||||
|
||||
@NotNull
|
||||
private String applyStatus;
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.request.sms;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 更新签名
|
||||
* <p>
|
||||
* author: sin
|
||||
* time: 2020/4/20 11:02 上午
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class UpdateSignRequest implements Serializable {
|
||||
|
||||
private Integer id;
|
||||
|
||||
private String sign;
|
||||
|
||||
private Integer platform;
|
||||
}
|
@ -1,53 +0,0 @@
|
||||
package cn.iocoder.mall.system.rest.request.sms;
|
||||
|
||||
import cn.iocoder.common.framework.validator.InEnum;
|
||||
import cn.iocoder.mall.system.biz.enums.sms.SmsPlatformEnum;
|
||||
import cn.iocoder.mall.system.biz.enums.sms.SmsTypeEnum;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Size;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 短信模板 add
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/26 12:37 PM
|
||||
*/
|
||||
@ApiModel("短信模板-添加")
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class UpdateSmsTemplateRequest implements Serializable {
|
||||
|
||||
@ApiModelProperty("短信模板id")
|
||||
@NotNull(message = "短信模板不能为空!")
|
||||
private Integer id;
|
||||
|
||||
@ApiModelProperty("短信签名id")
|
||||
@NotNull(message = "短信短信签名id不能为空!")
|
||||
private Integer smsSignId;
|
||||
|
||||
@ApiModelProperty("短信模板code")
|
||||
@NotNull
|
||||
@Size(min = 3, max = 50, message = "短信code在 3-50 之间")
|
||||
private String templateCode;
|
||||
|
||||
@ApiModelProperty("短信模板")
|
||||
@NotNull
|
||||
@Size(min = 3, max = 255, message = "短信在 3-255 之间")
|
||||
private String template;
|
||||
|
||||
@ApiModelProperty("短信模板-平台")
|
||||
@NotNull
|
||||
@InEnum(value = SmsPlatformEnum.class)
|
||||
private Integer platform;
|
||||
|
||||
@ApiModelProperty("短信模板-平台")
|
||||
@NotNull
|
||||
@InEnum(value = SmsTypeEnum.class)
|
||||
private Integer smsType;
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
# 服务器的配置项
|
||||
server:
|
||||
port: 18083
|
||||
servlet:
|
||||
context-path: /system-api/
|
||||
|
||||
# Swagger 配置项
|
||||
swagger:
|
||||
title: 管理员子系统
|
||||
description: 管理员子系统
|
||||
version: 1.0.0
|
||||
base-package: cn.iocoder.mall.system.rest.controller
|
@ -1,44 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>system</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<artifactId>system-service-api</artifactId>
|
||||
<dependencies>
|
||||
<!-- Mall 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>common-framework</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Web 相关 -->
|
||||
<dependency>
|
||||
<groupId>io.swagger</groupId>
|
||||
<artifactId>swagger-annotations</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 工具类相关 -->
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct-jdk8</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
@ -1,44 +0,0 @@
|
||||
package cn.iocoder.mall.system.api;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.system.api.bo.datadict.DataDictBO;
|
||||
import cn.iocoder.mall.system.api.dto.datadict.DataDictAddDTO;
|
||||
import cn.iocoder.mall.system.api.dto.datadict.DataDictUpdateDTO;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public interface DataDictService {
|
||||
|
||||
List<DataDictBO> selectDataDictList();
|
||||
|
||||
DataDictBO addDataDict(Integer adminId, DataDictAddDTO dataDictAddDTO);
|
||||
|
||||
Boolean updateDataDict(Integer adminId, DataDictUpdateDTO dataDictUpdateDTO);
|
||||
|
||||
Boolean deleteDataDict(Integer adminId, Integer dataDictId);
|
||||
|
||||
/**
|
||||
* 获取字典值 - 单个
|
||||
*
|
||||
* 注意: dictValue:Object 为了方便调用,会自动转换为 dictValue:String
|
||||
*
|
||||
* @param dictKey
|
||||
* @param dictValue
|
||||
* @return
|
||||
*/
|
||||
CommonResult<DataDictBO> getDataDict(String dictKey, Object dictValue);
|
||||
|
||||
CommonResult<List<DataDictBO>> getDataDict(String dictKey);
|
||||
|
||||
/**
|
||||
* 获取字典值 - 多个
|
||||
*
|
||||
* 注意:dictValueList:? 为了方便调用,会自动转换为 Set:String
|
||||
*
|
||||
* @param dictKey
|
||||
* @param dictValueList
|
||||
* @return
|
||||
*/
|
||||
CommonResult<List<DataDictBO>> getDataDictList(String dictKey, Collection<?> dictValueList);
|
||||
}
|
@ -1,116 +0,0 @@
|
||||
package cn.iocoder.mall.system.api;
|
||||
|
||||
import cn.iocoder.mall.system.api.bo.sms.SmsSignBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsSignBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.SmsTemplateBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.api.dto.sms.PageQuerySmsSignDTO;
|
||||
import cn.iocoder.mall.system.api.dto.sms.PageQuerySmsTemplateDTO;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 短信服务
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 9:54 AM
|
||||
*/
|
||||
public interface SmsService {
|
||||
|
||||
/**
|
||||
* 短信模板 - 分页
|
||||
*
|
||||
* @param queryDTO
|
||||
* @return
|
||||
*/
|
||||
PageSmsSignBO pageSmsSign(PageQuerySmsSignDTO queryDTO);
|
||||
|
||||
/**
|
||||
* 短信模板 - 分页
|
||||
*
|
||||
* @param queryDTO
|
||||
* @return
|
||||
*/
|
||||
PageSmsTemplateBO pageSmsTemplate(PageQuerySmsTemplateDTO queryDTO);
|
||||
|
||||
/**
|
||||
* 签名 - 创建
|
||||
*
|
||||
* @param sign
|
||||
*/
|
||||
void addSign(String sign, Integer platform);
|
||||
|
||||
/**
|
||||
* 签名 - 获取
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
SmsSignBO getSign(Integer id);
|
||||
|
||||
/**
|
||||
* 签名 - 更新
|
||||
*
|
||||
* @param id
|
||||
* @param newSign
|
||||
* @param platform
|
||||
*/
|
||||
void updateSign(Integer id, String newSign, Integer platform);
|
||||
|
||||
/**
|
||||
* 签名 - 更新
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
void deleteSign(Integer id);
|
||||
|
||||
/**
|
||||
* 模板 - 创建
|
||||
*
|
||||
* @param smsSignId 选用的哪个签名
|
||||
* @param templateCode 模板code
|
||||
* @param template 模板内容
|
||||
* @param platform 平台
|
||||
*/
|
||||
void addTemplate(Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType);
|
||||
|
||||
/**
|
||||
* 模板 - 获取
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
SmsTemplateBO getTemplate(Integer id, Integer platform);
|
||||
|
||||
/**
|
||||
* 模板 - 更新
|
||||
*
|
||||
* @param id 模板id
|
||||
* @param smsSignId 短期签名
|
||||
* @param template 模板内容
|
||||
* @param platform 短信平台
|
||||
*/
|
||||
void updateTemplate(Integer id, Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType);
|
||||
|
||||
/**
|
||||
* 模板 - 删除
|
||||
*
|
||||
* @param id
|
||||
*/
|
||||
void deleteTemplate(Integer id);
|
||||
|
||||
/**
|
||||
* 短信发送 - 单个
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
void singleSend(String mobile, Integer smsTemplateId, Map<String, String> params);
|
||||
|
||||
/**
|
||||
* 短信发送 - 批量
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
void batchSend(List<String> mobileList, Integer smsTemplateId, Map<String, String> params);
|
||||
}
|
@ -1,68 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.bo.sms;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* sms page
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:23 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class PageSmsSignBO {
|
||||
|
||||
private Integer count;
|
||||
|
||||
private Long current;
|
||||
|
||||
private Long size;
|
||||
|
||||
private Long total;
|
||||
|
||||
private List<Sign> data;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Sign {
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 短信平台
|
||||
*/
|
||||
private Integer platform;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 审核状态
|
||||
* <p>
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date updateTime;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date createTime;
|
||||
}
|
||||
}
|
@ -1,117 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.bo.sms;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* sms page
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:23 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class PageSmsTemplateBO {
|
||||
|
||||
private Long total;
|
||||
|
||||
private Long current;
|
||||
|
||||
private Long size;
|
||||
|
||||
private List<Template> data;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Template {
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 模板编号 (第三方的)
|
||||
*/
|
||||
private Integer smsSignId;
|
||||
/**
|
||||
* 短信签名 id
|
||||
*/
|
||||
private String platform;
|
||||
/**
|
||||
* 短信模板 Code
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 短信类型
|
||||
*/
|
||||
private Integer smsType;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* 1、审核中
|
||||
* 2、审核成功
|
||||
* 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date updateTime;
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
|
||||
private Date createTime;
|
||||
|
||||
///
|
||||
/// 关联字段
|
||||
|
||||
/**
|
||||
* 签名信息
|
||||
*/
|
||||
private Sign sign;
|
||||
|
||||
}
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Sign {
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 签名id 这个是第三方的
|
||||
*/
|
||||
private String platformId;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
||||
}
|
@ -1,40 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.bo.sms;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信签名
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:30 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class SmsSignBO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 签名id 这个是第三方的
|
||||
*/
|
||||
private Integer signId;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.bo.sms;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信 template
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 7:41 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class SmsTemplateBO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 模板编号 (第三方的)
|
||||
*/
|
||||
private Integer smsSignId;
|
||||
/**
|
||||
* 短信签名 id
|
||||
*/
|
||||
private String platformId;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* 1、审核中
|
||||
* 2、审核成功
|
||||
* 3、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.constant;
|
||||
|
||||
/**
|
||||
* 短信审核状态
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:48 PM
|
||||
*/
|
||||
public enum SmsApplyStatusEnum {
|
||||
|
||||
CHECKING(1, "审核中"),
|
||||
SUCCESS(2, "审核成功"),
|
||||
FAIL(10, "审核失败"),
|
||||
;
|
||||
|
||||
private final Integer value;
|
||||
private final String name;
|
||||
|
||||
SmsApplyStatusEnum(int code, String message) {
|
||||
this.value = code;
|
||||
this.name = message;
|
||||
}
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
}
|
@ -1,41 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.constant;
|
||||
|
||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 短信审核状态
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:48 PM
|
||||
*/
|
||||
public enum SmsPlatformEnum implements IntArrayValuable {
|
||||
|
||||
YunPian(1, "云片"),
|
||||
AliYun(2, "阿里云"),
|
||||
;
|
||||
|
||||
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsPlatformEnum::getValue).toArray();
|
||||
|
||||
private final Integer value;
|
||||
private final String name;
|
||||
|
||||
SmsPlatformEnum(Integer code, String message) {
|
||||
this.value = code;
|
||||
this.name = message;
|
||||
}
|
||||
|
||||
public Integer getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] array() {
|
||||
return ARRAYS;
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.constant;
|
||||
|
||||
import cn.iocoder.common.framework.core.IntArrayValuable;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 短信审核状态
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:48 PM
|
||||
*/
|
||||
public enum SmsTypeEnum implements IntArrayValuable {
|
||||
|
||||
VERIFICATION_CODE(1, "验证码"),
|
||||
NOTICE(2, "通知"),
|
||||
MARKETING(3, "营销"),
|
||||
;
|
||||
|
||||
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SmsTypeEnum::getValue).toArray();
|
||||
|
||||
private final Integer value;
|
||||
private final String name;
|
||||
|
||||
SmsTypeEnum(Integer code, String message) {
|
||||
this.value = code;
|
||||
this.name = message;
|
||||
}
|
||||
|
||||
public Integer getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] array() {
|
||||
return ARRAYS;
|
||||
}
|
||||
}
|
@ -1,38 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.dto.sms;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* page 短信模板 query
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:32 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@ApiModel("短信服务查询")
|
||||
public class PageQuerySmsSignDTO implements Serializable {
|
||||
|
||||
@ApiModelProperty("每页大小")
|
||||
@NotNull
|
||||
private Integer size;
|
||||
|
||||
@ApiModelProperty("当前页")
|
||||
@NotNull
|
||||
private Integer current;
|
||||
|
||||
@ApiModelProperty("编号")
|
||||
private Integer id;
|
||||
|
||||
@ApiModelProperty("签名")
|
||||
private String sign;
|
||||
|
||||
@ApiModelProperty("申请状态")
|
||||
private Integer applyStatus;
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
package cn.iocoder.mall.system.api.dto.sms;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* page 短信模板 query
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/19 4:32 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class PageQuerySmsTemplateDTO implements Serializable {
|
||||
|
||||
@NotNull
|
||||
private Long current;
|
||||
|
||||
@NotNull
|
||||
private Long size;
|
||||
|
||||
@NotNull
|
||||
private String id;
|
||||
|
||||
@NotNull
|
||||
private Integer smsSignId;
|
||||
|
||||
@NotNull
|
||||
private String template;
|
||||
|
||||
@NotNull
|
||||
private String applyStatus;
|
||||
}
|
@ -1,95 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>system</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>system-service-impl</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<!-- Mall 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>system-service-api</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- DB 相关 -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-tx</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-jdbc</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>druid-spring-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.baomidou</groupId>
|
||||
<artifactId>mybatis-plus-boot-starter</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- RPC 相关 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-dubbo</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Registry 和 Config 相关 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 工具类相关 -->
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.yunpian.sdk</groupId>
|
||||
<artifactId>yunpian-java-sdk</artifactId>
|
||||
<version>1.2.7</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.aliyun</groupId>
|
||||
<artifactId>aliyun-java-sdk-core</artifactId>
|
||||
<version>4.1.0</version>
|
||||
</dependency>
|
||||
|
||||
<!-- test -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-api</artifactId>
|
||||
<version>5.4.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<!-- 提供给 mapstruct 使用 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@ -1,162 +0,0 @@
|
||||
package cn.iocoder.mall.admin.client;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.aliyuncs.CommonRequest;
|
||||
import com.aliyuncs.CommonResponse;
|
||||
import com.aliyuncs.DefaultAcsClient;
|
||||
import com.aliyuncs.IAcsClient;
|
||||
import com.aliyuncs.exceptions.ClientException;
|
||||
import com.aliyuncs.http.MethodType;
|
||||
import com.aliyuncs.profile.DefaultProfile;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 短信 AliYun client
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/25 12:28 PM
|
||||
*/
|
||||
@Component
|
||||
public class SmsAliYunClient implements SmsClient {
|
||||
|
||||
private static final Logger LOGGER = LoggerFactory.getLogger(SmsAliYunClient.class);
|
||||
|
||||
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
|
||||
private static final String SUCCESS_CODE = "OK";
|
||||
private static final String SUCCESS_MESSAGE = "OK";
|
||||
/**
|
||||
* 阿里云短信 - 批量推送最大数 500,支持 1000
|
||||
*/
|
||||
private static final int MAX_BATCH_SIZE = 500;
|
||||
|
||||
@Value("${sms.aliYun.accessKeyId?:'default_value'}")
|
||||
private String accessKeyId;
|
||||
@Value("${sms.aliYun.accessSecret?:'default_value'}")
|
||||
private String accessSecret;
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public static class Result {
|
||||
/**
|
||||
* 发送回执ID,可根据该ID在接口QuerySendDetails中查询具体的发送状态。
|
||||
*/
|
||||
private String BizId;
|
||||
/**
|
||||
* 请求状态码。
|
||||
*
|
||||
* - OK 蔡成功
|
||||
*/
|
||||
private String Code;
|
||||
/**
|
||||
* 状态码的描述。
|
||||
*/
|
||||
private String Message;
|
||||
/**
|
||||
* 请求ID。
|
||||
*/
|
||||
private String RequestId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SendResult singleSend(String mobile, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams) {
|
||||
// params
|
||||
CommonRequest request = new CommonRequest();
|
||||
request.setMethod(MethodType.POST);
|
||||
request.setDomain(DOMAIN);
|
||||
request.setVersion("2017-05-25");
|
||||
request.setAction("SendSms");
|
||||
request.putQueryParameter("PhoneNumbers", mobile);
|
||||
request.putQueryParameter("SignName", sign);
|
||||
request.putQueryParameter("TemplateCode", templateCode);
|
||||
request.putQueryParameter("TemplateParam", JSON.toJSONString(templateParams));
|
||||
|
||||
// 发送请求
|
||||
return doSend(request);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SendResult batchSend(List<String> mobileList, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams) {
|
||||
|
||||
// 最大发送数为 1000,我们设置为 500 个, 分段发送
|
||||
int maxSendSize = MAX_BATCH_SIZE;
|
||||
int maxSendSizeCount = mobileList.size() % maxSendSize == 0
|
||||
? mobileList.size() / maxSendSize
|
||||
: mobileList.size() / maxSendSize + 1;
|
||||
|
||||
SendResult sendResult = null;
|
||||
for (int i = 0; i < maxSendSizeCount; i++) {
|
||||
// 分批发送
|
||||
List<String> batchSendMobile = mobileList
|
||||
.subList(i * maxSendSize, (i + 1) * maxSendSize);
|
||||
|
||||
// params
|
||||
CommonRequest request = new CommonRequest();
|
||||
request.setMethod(MethodType.POST);
|
||||
request.setDomain(DOMAIN);
|
||||
request.setVersion("2017-05-25");
|
||||
request.setAction("SendBatchSms");
|
||||
request.putQueryParameter("PhoneNumberJson", JSON.toJSONString(batchSendMobile));
|
||||
request.putQueryParameter("SignNameJson", JSON.toJSONString(Collections.singletonList(sign)));
|
||||
request.putQueryParameter("TemplateCode", templateCode);
|
||||
request.putQueryParameter("TemplateParamJson", JSON.toJSONString(Collections.singletonList(templateParams)));
|
||||
|
||||
// 发送请求
|
||||
sendResult = doSend(request);
|
||||
}
|
||||
return sendResult;
|
||||
}
|
||||
|
||||
private SendResult doSend(CommonRequest request) {
|
||||
// 获取 client
|
||||
IAcsClient client = getClient();
|
||||
try {
|
||||
CommonResponse response = client.getCommonResponse(request);
|
||||
Result result = JSON.parseObject(response.getData(), Result.class);
|
||||
if (!SUCCESS_CODE.equals(result.getCode())) {
|
||||
|
||||
LOGGER.info("发送验证码失败 params {} res {}", JSON.toJSON(request), JSON.toJSON(result));
|
||||
|
||||
// 错误发送失败
|
||||
return new SendResult()
|
||||
.setIsSuccess(false)
|
||||
.setCode(SendResult.ERROR_CODE)
|
||||
.setMessage(result.getMessage());
|
||||
} else {
|
||||
LOGGER.info("发送验证码失败 params {} res", JSON.toJSON(request), JSON.toJSON(result));
|
||||
|
||||
// 发送成功
|
||||
return new SendResult()
|
||||
.setIsSuccess(true)
|
||||
.setCode(SendResult.SUCCESS_CODE)
|
||||
.setMessage(result.getMessage());
|
||||
}
|
||||
} catch (ClientException e) {
|
||||
LOGGER.error("发送验证码异常 {}", ExceptionUtils.getMessage(e));
|
||||
return new SendResult()
|
||||
.setIsSuccess(false)
|
||||
.setCode(SendResult.ERROR_CODE)
|
||||
.setMessage(ExceptionUtils.getMessage(e));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 client
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private IAcsClient getClient() {
|
||||
return new DefaultAcsClient(DefaultProfile.getProfile("default", accessKeyId, accessSecret));
|
||||
}
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
package cn.iocoder.mall.admin.client;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 短信平台
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:33 PM
|
||||
*/
|
||||
public interface SmsClient {
|
||||
|
||||
|
||||
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
class SendResult {
|
||||
|
||||
public static final int SUCCESS_CODE = 0;
|
||||
public static final int ERROR_CODE = 1;
|
||||
public static final String SUCCESS_MESSAGE = "SUCCESS";
|
||||
|
||||
/**
|
||||
* 错误码
|
||||
*/
|
||||
private Integer code;
|
||||
/**
|
||||
* 错误信息
|
||||
*/
|
||||
private String message;
|
||||
/**
|
||||
* 是否成功
|
||||
*/
|
||||
private Boolean isSuccess;
|
||||
}
|
||||
|
||||
/**
|
||||
* 短信发送 - 单个
|
||||
*
|
||||
* @param mobile 手机号
|
||||
* @param sign 签名
|
||||
* @param templateCode 短信模板code
|
||||
* @param template 短信模板
|
||||
* @param templateParams 短信模板 params
|
||||
* @return 发送后信息
|
||||
*/
|
||||
SendResult singleSend(String mobile, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams);
|
||||
|
||||
/**
|
||||
* 短信发送 - 批量
|
||||
*
|
||||
* @param mobileList 手机号
|
||||
* @param sign 签名
|
||||
* @param templateCode 短信模板 code
|
||||
* @param template 短信模板
|
||||
* @param templateParams 短信模板params
|
||||
* @return 发送后信息
|
||||
*/
|
||||
SendResult batchSend(List<String> mobileList, String sign, String templateCode,
|
||||
String template, Map<String, String> templateParams);
|
||||
}
|
@ -1,241 +0,0 @@
|
||||
package cn.iocoder.mall.admin.client;
|
||||
|
||||
import cn.iocoder.common.framework.exception.ServiceException;
|
||||
import cn.iocoder.mall.system.api.constant.AdminErrorCodeEnum;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.NameValuePair;
|
||||
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.message.BasicNameValuePair;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 云片 短信平台
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:34 PM
|
||||
*/
|
||||
@Component
|
||||
public class SmsYunPianClient implements SmsClient {
|
||||
|
||||
protected static final Logger LOGGER = LoggerFactory.getLogger(SmsYunPianClient.class);
|
||||
|
||||
private static final int SUCCESS_CODE = 0;
|
||||
private static final String SUCCESS_MESSAGE = "SUCCESS";
|
||||
|
||||
/**
|
||||
* 云片短信 - 批量推送最大数 500,支持 1000
|
||||
*/
|
||||
private static final int MAX_BATCH_SIZE = 500;
|
||||
/**
|
||||
* 模板 - 参数拼接
|
||||
*/
|
||||
private static final String PARAM_TEMPLATE = "#%s#";
|
||||
/**
|
||||
* 模板 - 签名拼接
|
||||
*/
|
||||
private static final String SIGN_TEMPLATE = "【%s】%s";
|
||||
|
||||
/**
|
||||
* 签名 - 添加
|
||||
*/
|
||||
private static final String URL_SIGN_ADD = "https://sms.yunpian.com/v2/sign/add.json";
|
||||
/**
|
||||
* 签名 - 获取
|
||||
*/
|
||||
private static final String URL_SIGN_GET = "https://sms.yunpian.com/v2/sign/get.json";
|
||||
/**
|
||||
* 签名 - 更新
|
||||
*/
|
||||
private static final String URL_SIGN_UPDATE = "https://sms.yunpian.com/v2/sign/update.json";
|
||||
/**
|
||||
* 模板 - 添加
|
||||
*/
|
||||
private static final String URL_TEMPLATE_ADD = "https://sms.yunpian.com/v2/tpl/add.json";
|
||||
/**
|
||||
* 模板 - 获取
|
||||
*/
|
||||
private static final String URL_TEMPLATE_GET = "https://sms.yunpian.com/v2/tpl/get.json";
|
||||
/**
|
||||
* 模板 - 更新
|
||||
*/
|
||||
private static final String URL_TEMPLATE_UPDATE = "https://sms.yunpian.com/v2/tpl/update.json";
|
||||
/**
|
||||
* 模板 - 删除
|
||||
*/
|
||||
private static final String URL_TEMPLATE_DELETE = "https://sms.yunpian.com/v2/tpl/del.json";
|
||||
/**
|
||||
* 短信发送 - 单个
|
||||
*/
|
||||
private static final String URL_SEND_SINGLE = "https://sms.yunpian.com/v2/sms/single_send.json";
|
||||
/**
|
||||
* 短信发送 - 批量
|
||||
*/
|
||||
private static final String URL_SEND_BATCH = "https://sms.yunpian.com/v2/sms/batch_send.json";
|
||||
|
||||
|
||||
//编码格式。发送编码格式统一用UTF-8
|
||||
private static String ENCODING = "UTF-8";
|
||||
|
||||
@Value("${sms.yunPian.apiKey?:'default_value'}")
|
||||
private String apiKey;
|
||||
|
||||
@Override
|
||||
public SendResult singleSend(String mobile, String sign, String templateCode, String template, Map<String, String> templateParams) {
|
||||
// build 模板
|
||||
template = buildTemplate(sign, template, templateParams);
|
||||
|
||||
// 请求参数
|
||||
Map<String, String> params = new LinkedHashMap<>();
|
||||
params.put("apikey", apiKey);
|
||||
params.put("mobile", mobile);
|
||||
params.put("text", template);
|
||||
// TODO: 2019/5/19 sin 运营商发送报告 回调
|
||||
// params.put("callback_url", template);
|
||||
String result = post(URL_SEND_SINGLE, params);
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
if (jsonObject.containsKey("code")
|
||||
&& !(jsonObject.getInteger("code") == SUCCESS_CODE)) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_PLATFORM_FAIL.getCode(),
|
||||
jsonObject.getString("detail"));
|
||||
}
|
||||
|
||||
return new SendResult()
|
||||
.setIsSuccess(SUCCESS_CODE == jsonObject.getInteger("code"))
|
||||
.setCode(jsonObject.getInteger("code"))
|
||||
.setMessage(jsonObject.getString("detail"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public SendResult batchSend(List<String> mobileList, String sign,
|
||||
String templateCode, String template,
|
||||
Map<String, String> templateParams) {
|
||||
// build 模板
|
||||
template = buildTemplate(sign, template, templateParams);
|
||||
|
||||
// 最大发送数为 1000,我们设置为 500 个, 分段发送
|
||||
int maxSendSize = MAX_BATCH_SIZE;
|
||||
int maxSendSizeCount = mobileList.size() % maxSendSize == 0
|
||||
? mobileList.size() / maxSendSize
|
||||
: mobileList.size() / maxSendSize + 1;
|
||||
int j = 0;
|
||||
int j2 = mobileList.size();
|
||||
|
||||
for (int i = 0; i < maxSendSizeCount; i++) {
|
||||
StringBuffer sendMobileStr = new StringBuffer();
|
||||
for (int k = j; k < j2; k++) {
|
||||
sendMobileStr.append(",");
|
||||
sendMobileStr.append(mobileList.get(k));
|
||||
}
|
||||
|
||||
String dividedMobile = sendMobileStr.toString().substring(1);
|
||||
|
||||
// 发送手机号
|
||||
Map<String, String> params = new LinkedHashMap<>();
|
||||
params.put("apikey", apiKey);
|
||||
params.put("mobile", dividedMobile);
|
||||
params.put("text", template);
|
||||
// TODO: 2019/5/19 sin 运营商发送报告 回调
|
||||
// params.put("callback_url", template);
|
||||
String result = post(URL_SEND_BATCH, params);
|
||||
JSONObject jsonObject = JSON.parseObject(result);
|
||||
if (jsonObject.containsKey("code")
|
||||
&& !(jsonObject.getInteger("code") == SUCCESS_CODE)) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_PLATFORM_FAIL.getCode(),
|
||||
jsonObject.getString("detail"));
|
||||
}
|
||||
|
||||
// 用于递增 maxSendSize
|
||||
j = j2;
|
||||
j2 = j + maxSendSize;
|
||||
}
|
||||
|
||||
return new SendResult()
|
||||
.setIsSuccess(true)
|
||||
.setCode(SUCCESS_CODE)
|
||||
.setMessage(SUCCESS_MESSAGE);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建模板
|
||||
*
|
||||
* @param sign
|
||||
* @param template
|
||||
* @param templateParams
|
||||
* @return
|
||||
*/
|
||||
private static String buildTemplate(String sign, String template,
|
||||
Map<String, String> templateParams) {
|
||||
|
||||
if (CollectionUtils.isEmpty(templateParams)) {
|
||||
return template;
|
||||
}
|
||||
|
||||
for (Map.Entry<String, String> entry : templateParams.entrySet()) {
|
||||
String paramsKey = entry.getKey();
|
||||
String value = entry.getValue();
|
||||
String paramPlace = String.format(PARAM_TEMPLATE, paramsKey);
|
||||
template = template.replaceAll(paramPlace, value);
|
||||
}
|
||||
|
||||
template = String.format(SIGN_TEMPLATE, sign, template);
|
||||
return template;
|
||||
}
|
||||
|
||||
/**
|
||||
* 基于HttpClient 4.3的通用POST方法
|
||||
*
|
||||
* @param url 提交的URL
|
||||
* @param paramsMap 提交<参数,值>Map
|
||||
* @return 提交响应
|
||||
*/
|
||||
|
||||
public static String post(String url, Map<String, String> paramsMap) {
|
||||
CloseableHttpClient client = HttpClients.createDefault();
|
||||
String responseText = "";
|
||||
CloseableHttpResponse response = null;
|
||||
try {
|
||||
HttpPost method = new HttpPost(url);
|
||||
if (paramsMap != null) {
|
||||
List<NameValuePair> paramList = new ArrayList<>();
|
||||
for (Map.Entry<String, String> param : paramsMap.entrySet()) {
|
||||
NameValuePair pair = new BasicNameValuePair(param.getKey(),
|
||||
param.getValue());
|
||||
paramList.add(pair);
|
||||
}
|
||||
method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
|
||||
}
|
||||
response = client.execute(method);
|
||||
HttpEntity entity = response.getEntity();
|
||||
if (entity != null) {
|
||||
responseText = EntityUtils.toString(entity, ENCODING);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
try {
|
||||
response.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
LOGGER.debug("云片短信平台 res: {}", responseText);
|
||||
return responseText;
|
||||
}
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsSignBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.SmsSignBO;
|
||||
import cn.iocoder.mall.admin.dataobject.SmsSignDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 短信 签名
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:31 PM
|
||||
*/
|
||||
@Mapper
|
||||
public interface SmsSignConvert {
|
||||
|
||||
SmsSignConvert INSTANCE = Mappers.getMapper(SmsSignConvert.class);
|
||||
|
||||
@Mappings({})
|
||||
SmsSignBO convert(SmsSignDO smsSignDO);
|
||||
|
||||
@Mappings({})
|
||||
List<PageSmsSignBO.Sign> convert(List<SmsSignDO> smsSignDOList);
|
||||
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package cn.iocoder.mall.admin.convert;
|
||||
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.SmsTemplateBO;
|
||||
import cn.iocoder.mall.admin.dataobject.SmsSignDO;
|
||||
import cn.iocoder.mall.admin.dataobject.SmsTemplateDO;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mappings;
|
||||
import org.mapstruct.factory.Mappers;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 短信 template
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 7:43 PM
|
||||
*/
|
||||
@Mapper
|
||||
public interface SmsTemplateConvert {
|
||||
|
||||
SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class);
|
||||
|
||||
@Mappings({})
|
||||
SmsTemplateBO convert(SmsTemplateDO smsTemplateDO);
|
||||
|
||||
@Mappings({})
|
||||
List<PageSmsTemplateBO.Template> convert(List<SmsTemplateDO> smsTemplateDOList);
|
||||
|
||||
@Mappings({})
|
||||
List<PageSmsTemplateBO.Sign> convertTemplateSign(List<SmsSignDO> smsSignDOList);
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package cn.iocoder.mall.admin.dao;
|
||||
|
||||
import cn.iocoder.mall.admin.dataobject.SmsSendLogDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
* 短信
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:18 PM
|
||||
*/
|
||||
@Repository
|
||||
public interface SmsSendMapper extends BaseMapper<SmsSendLogDO> {
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
package cn.iocoder.mall.admin.dao;
|
||||
|
||||
import cn.iocoder.mall.admin.dataobject.SmsSignDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
* 短信
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:18 PM
|
||||
*/
|
||||
@Repository
|
||||
public interface SmsSignMapper extends BaseMapper<SmsSignDO> {
|
||||
}
|
@ -1,16 +0,0 @@
|
||||
package cn.iocoder.mall.admin.dao;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.BaseDO;
|
||||
import cn.iocoder.mall.admin.dataobject.SmsTemplateDO;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
* 短信 template
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 6:18 PM
|
||||
*/
|
||||
@Repository
|
||||
public interface SmsTemplateMapper extends BaseMapper<SmsTemplateDO> {
|
||||
}
|
@ -1,37 +0,0 @@
|
||||
package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.BaseDO;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信 client log
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/25 12:36 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class SmsSendLogDO extends BaseDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private Integer templateId;
|
||||
/**
|
||||
* 短信
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 参数
|
||||
*/
|
||||
private String params;
|
||||
/**
|
||||
* 发送信息
|
||||
*/
|
||||
private String message;
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.DeletableDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信签名
|
||||
*
|
||||
* 签名是短信发送前缀 如:【阿里云】、【小红书】
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:28 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@TableName("sms_sign")
|
||||
public class SmsSignDO extends DeletableDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 签名名称
|
||||
*/
|
||||
private String sign;
|
||||
/**
|
||||
* 平台
|
||||
*
|
||||
* 1、云片
|
||||
* 2、阿里云
|
||||
*/
|
||||
private Integer platform;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* - 1、审核中
|
||||
* - 2、审核成功
|
||||
* - 10、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
package cn.iocoder.mall.admin.dataobject;
|
||||
|
||||
import cn.iocoder.common.framework.dataobject.DeletableDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* 短信 模板
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 12:31 PM
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
@TableName("sms_template")
|
||||
public class SmsTemplateDO extends DeletableDO {
|
||||
|
||||
/**
|
||||
* 编号
|
||||
*/
|
||||
private Integer id;
|
||||
/**
|
||||
* 模板编号 (第三方的)
|
||||
*/
|
||||
private Integer smsSignId;
|
||||
/**
|
||||
* 模板 code(第三方平台 code)
|
||||
*/
|
||||
private String templateCode;
|
||||
/**
|
||||
* 短信签名 id
|
||||
*/
|
||||
private Integer platform;
|
||||
/**
|
||||
* 短信模板
|
||||
*/
|
||||
private String template;
|
||||
/**
|
||||
* 短信类型
|
||||
*
|
||||
* - 验证码类
|
||||
* - 通知类
|
||||
* - 营销类
|
||||
*/
|
||||
private Integer smsType;
|
||||
/**
|
||||
* 审核状态
|
||||
*
|
||||
* 1、审核中
|
||||
* 2、审核成功
|
||||
* 10、审核失败
|
||||
*/
|
||||
private Integer applyStatus;
|
||||
/**
|
||||
* 审核信息
|
||||
*/
|
||||
private String applyMessage;
|
||||
}
|
@ -1,436 +0,0 @@
|
||||
package cn.iocoder.mall.admin.service;
|
||||
|
||||
import cn.iocoder.common.framework.enums.DeletedStatusEnum;
|
||||
import cn.iocoder.common.framework.exception.ServiceException;
|
||||
import cn.iocoder.mall.system.api.SmsService;
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsSignBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.SmsSignBO;
|
||||
import cn.iocoder.mall.system.api.bo.sms.SmsTemplateBO;
|
||||
import cn.iocoder.mall.system.api.constant.AdminErrorCodeEnum;
|
||||
import cn.iocoder.mall.system.api.constant.SmsApplyStatusEnum;
|
||||
import cn.iocoder.mall.system.api.constant.SmsPlatformEnum;
|
||||
import cn.iocoder.mall.system.api.dto.sms.PageQuerySmsSignDTO;
|
||||
import cn.iocoder.mall.system.api.dto.sms.PageQuerySmsTemplateDTO;
|
||||
import cn.iocoder.mall.admin.client.SmsClient;
|
||||
import cn.iocoder.mall.admin.convert.SmsSignConvert;
|
||||
import cn.iocoder.mall.admin.convert.SmsTemplateConvert;
|
||||
import cn.iocoder.mall.admin.dao.SmsSendMapper;
|
||||
import cn.iocoder.mall.admin.dao.SmsSignMapper;
|
||||
import cn.iocoder.mall.admin.dao.SmsTemplateMapper;
|
||||
import cn.iocoder.mall.admin.dataobject.SmsSendLogDO;
|
||||
import cn.iocoder.mall.admin.dataobject.SmsSignDO;
|
||||
import cn.iocoder.mall.admin.dataobject.SmsTemplateDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 短信
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 10:30 AM
|
||||
*/
|
||||
@Service
|
||||
@org.apache.dubbo.config.annotation.Service(validation = "true", version = "${dubbo.provider.SmsService.version}")
|
||||
public class SmsServiceImpl implements SmsService {
|
||||
|
||||
@Autowired
|
||||
private SmsSignMapper smsSignMapper;
|
||||
@Autowired
|
||||
private SmsTemplateMapper smsTemplateMapper;
|
||||
@Autowired
|
||||
private SmsSendMapper smsSendMapper;
|
||||
|
||||
@Autowired
|
||||
@Qualifier("smsYunPianClient")
|
||||
private SmsClient smsYunPianClient;
|
||||
@Autowired
|
||||
@Qualifier("smsAliYunClient")
|
||||
private SmsClient smsAliYunClient;
|
||||
|
||||
@Override
|
||||
public PageSmsSignBO pageSmsSign(PageQuerySmsSignDTO queryDTO) {
|
||||
QueryWrapper<SmsSignDO> queryWrapper = new QueryWrapper<>();
|
||||
if (queryDTO.getApplyStatus() != null) {
|
||||
queryWrapper.eq("apply_status", queryDTO.getApplyStatus());
|
||||
}
|
||||
if (!StringUtils.isEmpty(queryDTO.getSign())) {
|
||||
queryWrapper.like("sign", queryDTO.getSign());
|
||||
}
|
||||
if (!StringUtils.isEmpty(queryDTO.getId())) {
|
||||
queryWrapper.eq("id", queryDTO.getId());
|
||||
}
|
||||
|
||||
Page<SmsSignDO> page = new Page<SmsSignDO>()
|
||||
.setSize(queryDTO.getSize())
|
||||
.setCurrent(queryDTO.getCurrent())
|
||||
.setDesc("create_time");
|
||||
|
||||
IPage<SmsSignDO> signPage = smsSignMapper.selectPage(page, queryWrapper);
|
||||
List<PageSmsSignBO.Sign> signList = SmsSignConvert.INSTANCE.convert(signPage.getRecords());
|
||||
|
||||
return new PageSmsSignBO()
|
||||
.setData(signList)
|
||||
.setCurrent(signPage.getCurrent())
|
||||
.setSize(signPage.getSize())
|
||||
.setTotal(signPage.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageSmsTemplateBO pageSmsTemplate(PageQuerySmsTemplateDTO queryDTO) {
|
||||
QueryWrapper<SmsTemplateDO> queryWrapper = new QueryWrapper<>();
|
||||
if (queryDTO.getApplyStatus() != null) {
|
||||
queryWrapper.eq("apply_status", queryDTO.getApplyStatus());
|
||||
}
|
||||
if (queryDTO.getSmsSignId() != null) {
|
||||
queryWrapper.eq("sms_sign_id", queryDTO.getSmsSignId());
|
||||
}
|
||||
if (!StringUtils.isEmpty(queryDTO.getTemplate())) {
|
||||
queryWrapper.like("template", queryDTO.getTemplate());
|
||||
}
|
||||
if (!StringUtils.isEmpty(queryDTO.getId())) {
|
||||
queryWrapper.eq("id", queryDTO.getId());
|
||||
}
|
||||
|
||||
Page<SmsTemplateDO> page = new Page<SmsTemplateDO>()
|
||||
.setSize(queryDTO.getSize())
|
||||
.setCurrent(queryDTO.getCurrent())
|
||||
.setDesc("create_time");
|
||||
|
||||
IPage<SmsTemplateDO> signPage = smsTemplateMapper.selectPage(page, queryWrapper);
|
||||
|
||||
List<PageSmsTemplateBO.Template> templateList
|
||||
= SmsTemplateConvert.INSTANCE.convert(signPage.getRecords());
|
||||
|
||||
if (CollectionUtils.isEmpty(templateList)) {
|
||||
return new PageSmsTemplateBO()
|
||||
.setData(Collections.EMPTY_LIST)
|
||||
.setCurrent(signPage.getCurrent())
|
||||
.setSize(signPage.getSize())
|
||||
.setTotal(signPage.getTotal());
|
||||
}
|
||||
|
||||
// 获取 sign
|
||||
|
||||
Set<Integer> smsSignIds = templateList.stream().map(
|
||||
PageSmsTemplateBO.Template::getSmsSignId).collect(Collectors.toSet());
|
||||
|
||||
List<SmsSignDO> smsSignDOList = smsSignMapper.selectList(
|
||||
new QueryWrapper<SmsSignDO>().in("id", smsSignIds));
|
||||
|
||||
List<PageSmsTemplateBO.Sign> signList = SmsTemplateConvert.INSTANCE.convertTemplateSign(smsSignDOList);
|
||||
|
||||
Map<Integer, PageSmsTemplateBO.Sign> smsSignDOMap = signList
|
||||
.stream().collect(Collectors.toMap(PageSmsTemplateBO.Sign::getId, o -> o));
|
||||
|
||||
// 设置 sign
|
||||
|
||||
templateList.forEach(template -> {
|
||||
if (smsSignDOMap.containsKey(template.getSmsSignId())) {
|
||||
template.setSign(smsSignDOMap.get(template.getSmsSignId()));
|
||||
}
|
||||
});
|
||||
|
||||
return new PageSmsTemplateBO()
|
||||
.setData(templateList)
|
||||
.setCurrent(signPage.getCurrent())
|
||||
.setSize(signPage.getSize())
|
||||
.setTotal(signPage.getTotal());
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void addSign(String sign, Integer platform) {
|
||||
|
||||
// 避免重复
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>()
|
||||
.eq("platform", platform)
|
||||
.eq("sign", sign)
|
||||
);
|
||||
|
||||
if (smsSignDO != null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
// 保存数据库
|
||||
smsSignMapper.insert(
|
||||
(SmsSignDO) new SmsSignDO()
|
||||
.setSign(sign)
|
||||
.setPlatform(platform)
|
||||
.setApplyStatus(SmsApplyStatusEnum.SUCCESS.getValue())
|
||||
.setDeleted(DeletedStatusEnum.DELETED_NO.getValue())
|
||||
.setUpdateTime(new Date())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsSignBO getSign(Integer signId) {
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>()
|
||||
.eq("id", signId)
|
||||
.eq("deleted", DeletedStatusEnum.DELETED_NO.getValue()));
|
||||
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
return SmsSignConvert.INSTANCE.convert(smsSignDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateSign(Integer id, String newSign, Integer platform) {
|
||||
// 避免重复
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>()
|
||||
.eq("sign", newSign)
|
||||
.eq("platform", platform));
|
||||
|
||||
if (smsSignDO != null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
// 更新
|
||||
smsSignMapper.update(
|
||||
(SmsSignDO) new SmsSignDO()
|
||||
.setSign(newSign)
|
||||
.setPlatform(platform)
|
||||
.setUpdateTime(new Date()),
|
||||
new QueryWrapper<SmsSignDO>().eq("id", id)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteSign(Integer id) {
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>()
|
||||
.eq("id", id));
|
||||
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
// 更新 deleted 为 YES
|
||||
smsSignMapper.delete(new UpdateWrapper<SmsSignDO>()
|
||||
.set("deleted", DeletedStatusEnum.DELETED_YES.getName())
|
||||
.eq("id", id)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void addTemplate(Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType) {
|
||||
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>().eq("id", smsSignId));
|
||||
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
// 保存数据库
|
||||
smsTemplateMapper.insert(
|
||||
(SmsTemplateDO) new SmsTemplateDO()
|
||||
.setId(null)
|
||||
.setSmsSignId(smsSignId)
|
||||
.setTemplateCode(templateCode)
|
||||
.setTemplate(template)
|
||||
.setPlatform(platform)
|
||||
.setSmsType(smsType)
|
||||
.setApplyStatus(SmsApplyStatusEnum.SUCCESS.getValue())
|
||||
.setApplyMessage("")
|
||||
.setDeleted(DeletedStatusEnum.DELETED_NO.getValue())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsTemplateBO getTemplate(Integer id, Integer platform) {
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
|
||||
new QueryWrapper<SmsTemplateDO>()
|
||||
.eq("platform", platform)
|
||||
.eq("id", id));
|
||||
|
||||
if (smsTemplateDO == null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
return SmsTemplateConvert.INSTANCE.convert(smsTemplateDO);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void updateTemplate(Integer id, Integer smsSignId, String templateCode,
|
||||
String template, Integer platform, Integer smsType) {
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
|
||||
new QueryWrapper<SmsTemplateDO>().eq("id", id));
|
||||
|
||||
if (smsTemplateDO == null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>().eq("id", smsTemplateDO.getSmsSignId()));
|
||||
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
smsTemplateMapper.update(
|
||||
(SmsTemplateDO) new SmsTemplateDO()
|
||||
.setSmsSignId(smsSignId)
|
||||
.setTemplateCode(templateCode)
|
||||
.setTemplate(template)
|
||||
.setPlatform(platform)
|
||||
.setSmsType(smsType)
|
||||
.setUpdateTime(new Date()),
|
||||
new QueryWrapper<SmsTemplateDO>().eq("id", id)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public void deleteTemplate(Integer id) {
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
|
||||
new QueryWrapper<SmsTemplateDO>().eq("id", id));
|
||||
|
||||
if (smsTemplateDO == null
|
||||
|| smsTemplateDO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
// 删除 数据库模板
|
||||
SmsTemplateDO updateTemplate =new SmsTemplateDO();
|
||||
updateTemplate.setDeleted(DeletedStatusEnum.DELETED_YES.getValue());
|
||||
smsTemplateMapper.delete(
|
||||
new UpdateWrapper<SmsTemplateDO>()
|
||||
.set("deleted", DeletedStatusEnum.DELETED_YES)
|
||||
.eq("id", id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void singleSend(String mobile, Integer smsTemplateId, Map<String, String> params) {
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
|
||||
new QueryWrapper<SmsTemplateDO>().eq("id", smsTemplateId));
|
||||
|
||||
if (smsTemplateDO == null
|
||||
|| smsTemplateDO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>().eq("id", smsTemplateDO.getSmsSignId()));
|
||||
|
||||
if (smsSignDO == null) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
// 获取 client
|
||||
SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform());
|
||||
// 发送短信
|
||||
SmsClient.SendResult sendResult = smsClient.singleSend(mobile, smsSignDO.getSign(),
|
||||
smsTemplateDO.getTemplateCode(), smsTemplateDO.getTemplate(), params);
|
||||
|
||||
// 添加日志
|
||||
smsSendMapper.insert(
|
||||
(SmsSendLogDO) new SmsSendLogDO()
|
||||
.setTemplateId(smsTemplateDO.getId())
|
||||
.setTemplate(smsTemplateDO.getTemplate())
|
||||
.setMessage(sendResult.getMessage())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void batchSend(List<String> mobileList, Integer smsTemplateId, Map<String, String> params) {
|
||||
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
|
||||
new QueryWrapper<SmsTemplateDO>().eq("id", smsTemplateId));
|
||||
|
||||
if (smsTemplateDO == null
|
||||
|| smsTemplateDO.getDeleted().equals(DeletedStatusEnum.DELETED_YES.getValue())) {
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
SmsSignDO smsSignDO = smsSignMapper.selectOne(
|
||||
new QueryWrapper<SmsSignDO>().eq("id", smsTemplateDO.getSmsSignId()));
|
||||
|
||||
if (smsSignDO == null) {
|
||||
// 添加日志
|
||||
smsSendMapper.insert(
|
||||
(SmsSendLogDO) new SmsSendLogDO()
|
||||
.setTemplateId(smsTemplateDO.getId())
|
||||
.setTemplate(smsTemplateDO.getTemplate())
|
||||
.setMessage("发送成功!")
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
|
||||
throw new ServiceException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
|
||||
}
|
||||
|
||||
// 获取 client
|
||||
SmsClient smsClient = getSmsClient(smsTemplateDO.getPlatform());
|
||||
|
||||
// 发送短信
|
||||
SmsClient.SendResult sendResult = smsClient.batchSend(mobileList, smsSignDO.getSign(),
|
||||
smsTemplateDO.getTemplateCode(), smsTemplateDO.getTemplate(), params);
|
||||
|
||||
// 添加日志
|
||||
smsSendMapper.insert(
|
||||
(SmsSendLogDO) new SmsSendLogDO()
|
||||
.setTemplateId(smsTemplateDO.getId())
|
||||
.setTemplate(smsTemplateDO.getTemplate())
|
||||
.setMessage(sendResult.getMessage())
|
||||
.setCreateTime(new Date())
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 sms 对于的 client
|
||||
*
|
||||
* @param platform
|
||||
* @return
|
||||
*/
|
||||
private SmsClient getSmsClient(Integer platform) {
|
||||
SmsClient smsClient = null;
|
||||
if (SmsPlatformEnum.YunPian.getValue().equals(platform)) {
|
||||
smsClient = smsYunPianClient;
|
||||
} else if (SmsPlatformEnum.AliYun.getValue().equals(platform)) {
|
||||
smsClient = smsAliYunClient;
|
||||
}
|
||||
|
||||
if (smsClient == null) {
|
||||
throw new ServiceException(
|
||||
AdminErrorCodeEnum.SMS_NOT_SEND_CLIENT.getCode(),
|
||||
AdminErrorCodeEnum.SMS_NOT_SEND_CLIENT.getMessage());
|
||||
}
|
||||
|
||||
return smsClient;
|
||||
}
|
||||
}
|
@ -1,73 +0,0 @@
|
||||
spring:
|
||||
# datasource
|
||||
datasource:
|
||||
url: jdbc:mysql://s1.iocoder.cn:3306/mall_admin?useSSL=false&useUnicode=true&characterEncoding=UTF-8
|
||||
driver-class-name: com.mysql.jdbc.Driver
|
||||
username: root
|
||||
password: zhuyang
|
||||
|
||||
# Spring Cloud 配置项
|
||||
cloud:
|
||||
nacos:
|
||||
# Spring Cloud Nacos Discovery 配置项
|
||||
discovery:
|
||||
server-addr: s1.iocoder.cn:8848 # Nacos 服务器地址
|
||||
|
||||
# mybatis-plus
|
||||
mybatis-plus:
|
||||
configuration:
|
||||
map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
|
||||
global-config:
|
||||
db-config:
|
||||
id-type: auto
|
||||
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
|
||||
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
|
||||
mapper-locations: classpath*:mapper/*.xml
|
||||
type-aliases-package: cn.iocoder.mall.admin.dataobject
|
||||
|
||||
# sms
|
||||
sms:
|
||||
yunPian:
|
||||
apiKey:
|
||||
aliYun:
|
||||
accessKeyId:
|
||||
accessSecret:
|
||||
|
||||
# Dubbo 配置项
|
||||
dubbo:
|
||||
# Dubbo 注册中心
|
||||
registry:
|
||||
address: spring-cloud://s1.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
|
||||
# Spring Cloud Alibaba Dubbo 专属配置
|
||||
cloud:
|
||||
subscribed-services: '' # 设置订阅的应用列表,默认为 * 订阅所有应用
|
||||
# Dubbo 提供者的协议
|
||||
protocol:
|
||||
name: dubbo
|
||||
port: -1
|
||||
# Dubbo 提供服务的扫描基础包
|
||||
scan:
|
||||
base-packages: cn.iocoder.mall.admin.service
|
||||
# Dubbo 服务提供者的配置
|
||||
provider:
|
||||
filter: -exception
|
||||
AdminAccessLogService:
|
||||
version: 1.0.0
|
||||
AdminService:
|
||||
version: 1.0.0
|
||||
DataDictService:
|
||||
version: 1.0.0
|
||||
OAuth2Service:
|
||||
version: 1.0.0
|
||||
ResourceService:
|
||||
version: 1.0.0
|
||||
RoleService:
|
||||
version: 1.0.0
|
||||
SmsService:
|
||||
version: 1.0.0
|
||||
|
||||
# logging
|
||||
logging:
|
||||
level:
|
||||
# dao 开启 debug 模式 mybatis 输入 sql
|
||||
cn.iocoder.mall.admin.dao: debug
|
@ -1,20 +0,0 @@
|
||||
package cn.iocoder.mall.admin;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.scheduling.annotation.EnableAsync;
|
||||
|
||||
/**
|
||||
* 短信 application (test)
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 10:53 AM
|
||||
*/
|
||||
@SpringBootApplication(scanBasePackages = {"cn.iocoder.mall.admin"})
|
||||
@EnableAsync(proxyTargetClass = true)
|
||||
public class SystemApplicationTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SystemApplicationTest.class);
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
package cn.iocoder.mall.admin.client;
|
||||
|
||||
import cn.iocoder.mall.admin.SystemApplicationTest;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
/**
|
||||
* 阿里云 短信 test
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/26 10:08 AM
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = SystemApplicationTest.class)
|
||||
public class SmsAliYunClientTest {
|
||||
|
||||
@Autowired
|
||||
private SmsAliYunClient smsAliYunClient;
|
||||
|
||||
@Test
|
||||
public void singleSendTest() {
|
||||
String sign = "阿里云短信测试专用";
|
||||
String mobile = "13302926050";
|
||||
String templateCode = "SMS_137110043";
|
||||
String template = "验证码#code#,您正在进行身份验证,打死不要告诉别人哦!";
|
||||
smsAliYunClient.singleSend(mobile, sign, templateCode,
|
||||
template, ImmutableMap.of("code", "8888"));
|
||||
}
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
package cn.iocoder.mall.admin.client;
|
||||
|
||||
import cn.iocoder.mall.admin.SystemApplicationTest;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.assertj.core.util.Lists;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
/**
|
||||
* 短信 sms client test
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/25 12:46 PM
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = SystemApplicationTest.class)
|
||||
public class SmsYunPianClientTest {
|
||||
|
||||
@Autowired
|
||||
private SmsYunPianClient smsYunPianClient;
|
||||
|
||||
private String sign = null;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
sign = "悦跑运动";
|
||||
}
|
||||
|
||||
@Test
|
||||
public void sendMobileTest() {
|
||||
String mobile = "13302926050";
|
||||
String template = "您的验证码是#code#,打死也不告诉别人哦。";
|
||||
smsYunPianClient.singleSend(mobile, sign, null,
|
||||
template, ImmutableMap.of("code", "1111"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batchSendTest() {
|
||||
String mobile = "13302926050";
|
||||
String template = "您的验证码是#code#,打死也不告诉别人哦。";
|
||||
smsYunPianClient.batchSend(Lists.newArrayList(mobile), sign, null,
|
||||
template, ImmutableMap.of("code", "2222"));
|
||||
}
|
||||
}
|
@ -1,87 +0,0 @@
|
||||
package cn.iocoder.mall.admin.service;
|
||||
|
||||
import cn.iocoder.common.framework.exception.ServiceException;
|
||||
import cn.iocoder.mall.admin.SystemApplicationTest;
|
||||
import cn.iocoder.mall.system.api.SmsService;
|
||||
import cn.iocoder.mall.system.api.bo.sms.SmsSignBO;
|
||||
import cn.iocoder.mall.system.api.constant.SmsPlatformEnum;
|
||||
import cn.iocoder.mall.system.api.constant.SmsTypeEnum;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import org.assertj.core.util.Lists;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
/**
|
||||
* 短信 test
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/16 10:52 AM
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = SystemApplicationTest.class)
|
||||
public class SmsServiceImplTest {
|
||||
|
||||
@Autowired
|
||||
private SmsService smsService;
|
||||
|
||||
@Test
|
||||
public void createSignTest() {
|
||||
// smsService.addSign("悦跑运动", SmsPlatformEnum.YunPian.getValue());
|
||||
smsService.addSign("登录确认验证码", SmsPlatformEnum.AliYun.getValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSignTest() {
|
||||
SmsSignBO smsSignBO = smsService.getSign(3);
|
||||
Assert.assertNotNull("不能为空!", smsSignBO);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateSignTest() {
|
||||
String oldSign = "悦跑运动2";
|
||||
String newSign = "悦跑运动";
|
||||
smsService.updateSign(3, newSign, SmsPlatformEnum.YunPian.getValue());
|
||||
SmsSignBO smsSignBO = smsService.getSign(3);
|
||||
Assert.assertTrue("更新不成功!", smsSignBO.getSign().equals(newSign));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deletedSignTest() {
|
||||
smsService.deleteSign(3);
|
||||
Assertions.assertThrows(ServiceException.class, () -> {
|
||||
smsService.getSign(3);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createTemplateTest() {
|
||||
Integer sign = 4;
|
||||
String templateCode = "SMS_137110043";
|
||||
String template = "验证码#code#,您正在登录,若非本人操作,请勿泄露。";
|
||||
smsService.addTemplate(
|
||||
sign,
|
||||
templateCode,
|
||||
template,
|
||||
SmsPlatformEnum.AliYun.getValue(),
|
||||
SmsTypeEnum.VERIFICATION_CODE.getValue());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void singleSendTest() {
|
||||
String mobile = "13302926050";
|
||||
Integer templateId = 7;
|
||||
smsService.singleSend(mobile, templateId, ImmutableMap.of("code", "8888"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batchSendTest() {
|
||||
String mobile = "13302926050";
|
||||
Integer templateId = 7;
|
||||
smsService.batchSend(Lists.newArrayList(mobile), templateId, ImmutableMap.of("code", "8888"));
|
||||
}
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
package cn.iocoder.mall.admin.service;
|
||||
|
||||
import cn.iocoder.mall.system.api.SystemLogService;
|
||||
import cn.iocoder.mall.system.api.bo.systemlog.AccessLogPageBO;
|
||||
import cn.iocoder.mall.system.api.dto.systemlog.AccessLogPageDTO;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
/**
|
||||
* @author:ycjx
|
||||
* @descriptio
|
||||
* @create:2019-06-23 18:08
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = SystemLogServiceImplTest.class)
|
||||
public class SystemLogServiceImplTest {
|
||||
|
||||
@Autowired
|
||||
private SystemLogService systemLogService;
|
||||
|
||||
@Test
|
||||
public void getAccessLogPageTest(){
|
||||
AccessLogPageDTO accessLogPageDTO = new AccessLogPageDTO();
|
||||
accessLogPageDTO.setPageNo(1);
|
||||
accessLogPageDTO.setPageSize(10);
|
||||
AccessLogPageBO accessLogPage = systemLogService.getAccessLogPage(accessLogPageDTO);
|
||||
System.out.println(accessLogPage.getTotal());
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -1,107 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>system</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>system-start</artifactId>
|
||||
|
||||
<dependencies>
|
||||
<!-- Mall 相关 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>common-framework</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>mall-spring-boot</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>system-service-impl</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>system-sdk</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Web 相关 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.springfox</groupId>
|
||||
<artifactId>springfox-swagger2</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.github.xiaoymin</groupId>
|
||||
<artifactId>swagger-bootstrap-ui</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 云服务相关 -->
|
||||
<dependency>
|
||||
<groupId>com.qiniu</groupId>
|
||||
<artifactId>qiniu-java-sdk</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 服务保障相关 -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.cloud</groupId>
|
||||
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 监控相关 -->
|
||||
<dependency>
|
||||
<groupId>de.codecentric</groupId>
|
||||
<artifactId>spring-boot-admin-starter-client</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- 测试相关 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<!-- 提供给 mapstruct 使用 -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
</plugin>
|
||||
|
||||
<!-- 打包 -->
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
</project>
|
@ -1,33 +0,0 @@
|
||||
package cn.iocoder.mall.system.application.controller.admins;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import com.qiniu.util.Auth;
|
||||
import io.swagger.annotations.Api;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("admins/file")
|
||||
@Api("文件模块")
|
||||
public class FileController {
|
||||
|
||||
private Logger logger = LoggerFactory.getLogger(getClass());
|
||||
|
||||
@Autowired
|
||||
private Auth auth;
|
||||
@Value("${qiniu.bucket}")
|
||||
private String bucket;
|
||||
|
||||
@GetMapping("/get-qiniu-token")
|
||||
public CommonResult<String> getQiniuToken() {
|
||||
String token = auth.uploadToken(bucket);
|
||||
logger.info("[qiniu_token][token({}) get]", token);
|
||||
return CommonResult.success(token);
|
||||
}
|
||||
|
||||
}
|
@ -1,56 +0,0 @@
|
||||
package cn.iocoder.mall.system.application.controller.admins;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.system.api.SmsService;
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsSignBO;
|
||||
import cn.iocoder.mall.system.api.dto.sms.PageQuerySmsSignDTO;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* 短信服务
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/26 12:26 PM
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("admins/sms/sign")
|
||||
@Api("短信服务(签名)")
|
||||
public class SmsSignController {
|
||||
|
||||
@Autowired
|
||||
private SmsService smsService;
|
||||
|
||||
@GetMapping("page")
|
||||
@ApiOperation("签名-page")
|
||||
public CommonResult<PageSmsSignBO> pageSign(@Validated PageQuerySmsSignDTO querySmsSignDTO) {
|
||||
return CommonResult.success(smsService.pageSmsSign(querySmsSignDTO));
|
||||
}
|
||||
|
||||
@PostMapping("add")
|
||||
@ApiOperation("签名-添加")
|
||||
public CommonResult addSign(@RequestParam("sign") String sign,
|
||||
@RequestParam("platform") Integer platform) {
|
||||
smsService.addSign(sign, platform);
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@PutMapping("update")
|
||||
@ApiOperation("签名-更新")
|
||||
public CommonResult updateSign(@RequestParam("id") Integer id,
|
||||
@RequestParam("sign") String sign,
|
||||
@RequestParam("platform") Integer platform) {
|
||||
smsService.updateSign(id, sign, platform);
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@DeleteMapping("deleted")
|
||||
@ApiOperation("签名-删除")
|
||||
public CommonResult deletedSign(@RequestParam("id") Integer id) {
|
||||
smsService.deleteSign(id);
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
}
|
@ -1,65 +0,0 @@
|
||||
package cn.iocoder.mall.system.application.controller.admins;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.mall.system.api.SmsService;
|
||||
import cn.iocoder.mall.system.api.bo.sms.PageSmsTemplateBO;
|
||||
import cn.iocoder.mall.system.api.dto.sms.PageQuerySmsTemplateDTO;
|
||||
import cn.iocoder.mall.system.application.po.sms.SmsTemplateAddPO;
|
||||
import cn.iocoder.mall.system.application.po.sms.SmsTemplateUpdatePO;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
/**
|
||||
* 短信服务
|
||||
*
|
||||
* @author Sin
|
||||
* @time 2019/5/26 12:26 PM
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("admins/sms/template")
|
||||
@Api("短信服务(短信模板)")
|
||||
public class SmsTemplateController {
|
||||
|
||||
@Autowired
|
||||
private SmsService smsService;
|
||||
|
||||
@GetMapping("page")
|
||||
@ApiOperation("短信模板-page")
|
||||
public CommonResult<PageSmsTemplateBO> pageSign(PageQuerySmsTemplateDTO pageQuerySmsTemplateDTO) {
|
||||
return CommonResult.success(smsService.pageSmsTemplate(pageQuerySmsTemplateDTO));
|
||||
}
|
||||
|
||||
@PostMapping("add")
|
||||
@ApiOperation("短信模板-添加")
|
||||
public CommonResult addSign(SmsTemplateAddPO smsTemplateAddPO) {
|
||||
smsService.addTemplate(
|
||||
smsTemplateAddPO.getSmsSignId(),
|
||||
smsTemplateAddPO.getTemplateCode(),
|
||||
smsTemplateAddPO.getTemplate(),
|
||||
smsTemplateAddPO.getPlatform(),
|
||||
smsTemplateAddPO.getSmsType());
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@PutMapping("update")
|
||||
@ApiOperation("短信模板-更新")
|
||||
public CommonResult updateSign(SmsTemplateUpdatePO smsTemplateUpdatePO) {
|
||||
smsService.updateTemplate(
|
||||
smsTemplateUpdatePO.getId(),
|
||||
smsTemplateUpdatePO.getSmsSignId(),
|
||||
smsTemplateUpdatePO.getTemplateCode(),
|
||||
smsTemplateUpdatePO.getTemplate(),
|
||||
smsTemplateUpdatePO.getPlatform(),
|
||||
smsTemplateUpdatePO.getSmsType());
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
|
||||
@DeleteMapping("deleted")
|
||||
@ApiOperation("短信模板-删除")
|
||||
public CommonResult deletedSign(@RequestParam("id") Integer id) {
|
||||
smsService.deleteTemplate(id);
|
||||
return CommonResult.success(null);
|
||||
}
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
spring:
|
||||
application:
|
||||
name: admin-application
|
||||
|
||||
# Spring Cloud 配置项
|
||||
cloud:
|
||||
# Spring Cloud Sentinel 配置项
|
||||
sentinel:
|
||||
transport:
|
||||
dashboard: s1.iocoder.cn:12088 # Sentinel Dashboard 服务地址
|
||||
eager: true # 项目启动时,直接连接到 Sentinel
|
||||
|
||||
# server
|
||||
server:
|
||||
port: 18083
|
||||
servlet:
|
||||
context-path: /admin-api/
|
||||
|
||||
admins:
|
||||
security:
|
||||
ignore_urls: /admin-api/admins/passport/login, /admin-api/admins/file/get-qiniu-token
|
||||
|
||||
# qiniu
|
||||
qiniu:
|
||||
access-key: YldfyUC7OewoWM63TPYTairqnq8GMJvNek9EGoID
|
||||
secret-key: zZ7Q8wwZRyaklVvkyLmVydA4WygOBqtc_gTYzalS
|
||||
bucket: onemall
|
||||
|
||||
swagger:
|
||||
enable: true # 暂时不去掉
|
||||
title: 管理员子系统
|
||||
description: 管理员子系统
|
||||
version: 1.0.0
|
||||
base-package: cn.iocoder.mall.admin.application.controller
|
@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<artifactId>onemall</artifactId>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>system-service-project</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
<module>system-service-api</module>
|
||||
<module>system-service-app</module>
|
||||
<module>system-service-integration-test</module>
|
||||
</modules>
|
||||
|
||||
<dependencyManagement>
|
||||
<dependencies>
|
||||
<!-- onemall 基础 bom 文件 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>mall-dependencies</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<type>pom</type>
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>common-framework</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 自身项目 -->
|
||||
<dependency>
|
||||
<groupId>cn.iocoder.mall</groupId>
|
||||
<artifactId>system-service-api</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
|
||||
</project>
|
@ -1,49 +0,0 @@
|
||||
package cn.iocoder.mall.systemservice.rpc.errorcode;
|
||||
|
||||
import cn.iocoder.common.framework.vo.CommonResult;
|
||||
import cn.iocoder.common.framework.vo.PageResult;
|
||||
import cn.iocoder.mall.systemservice.rpc.errorcode.dto.ErrorCodeAutoGenerateDTO;
|
||||
import cn.iocoder.mall.systemservice.rpc.errorcode.dto.ErrorCodeCreateDTO;
|
||||
import cn.iocoder.mall.systemservice.rpc.errorcode.dto.ErrorCodePageDTO;
|
||||
import cn.iocoder.mall.systemservice.rpc.errorcode.dto.ErrorCodeUpdateDTO;
|
||||
import cn.iocoder.mall.systemservice.rpc.errorcode.vo.ErrorCodeVO;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 部门 Rpc 接口
|
||||
*/
|
||||
@FeignClient("system-service")
|
||||
public interface ErrorCodeFeign {
|
||||
|
||||
@GetMapping("/system/errorcode/listErrorCodes")
|
||||
public CommonResult<List<ErrorCodeVO>> listErrorCodes(@RequestParam("group") String group, @RequestParam("minUpdateTime") Date minUpdateTime) ;
|
||||
|
||||
@PostMapping("/system/errorcode/autoGenerateErrorCodes")
|
||||
public CommonResult<Boolean> autoGenerateErrorCodes(@RequestBody List<ErrorCodeAutoGenerateDTO> autoGenerateDTOs);
|
||||
|
||||
@PostMapping("/system/errorcode/createErrorCode")
|
||||
public CommonResult<Integer> createErrorCode(@RequestBody ErrorCodeCreateDTO createDTO) ;
|
||||
|
||||
@PostMapping("/system/errorcode/updateErrorCode")
|
||||
public CommonResult<Boolean> updateErrorCode(@RequestBody ErrorCodeUpdateDTO updateDTO) ;
|
||||
|
||||
@GetMapping("/system/errorcode/deleteErrorCode")
|
||||
public CommonResult<Boolean> deleteErrorCode(@RequestParam("errorCodeId")Integer errorCodeId) ;
|
||||
|
||||
@GetMapping("/system/errorcode/getErrorCode")
|
||||
public CommonResult<ErrorCodeVO> getErrorCode(@RequestParam("errorCodeId")Integer errorCodeId) ;
|
||||
|
||||
@GetMapping("/system/errorcode/listErrorCodesByIds")
|
||||
public CommonResult<List<ErrorCodeVO>> listErrorCodes(@RequestParam("errorCodeIds")List<Integer> errorCodeIds) ;
|
||||
|
||||
@PostMapping("/system/errorcode/pageErrorCode")
|
||||
public CommonResult<PageResult<ErrorCodeVO>> pageErrorCode(@RequestBody ErrorCodePageDTO pageDTO);
|
||||
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
package cn.iocoder.mall.systemservice.rpc.errorcode.dto;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 错误码自动生成 DTO
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ErrorCodeAutoGenerateDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 错误码编码
|
||||
*/
|
||||
@NotNull(message = "错误码编码不能为空")
|
||||
private Integer code;
|
||||
/**
|
||||
* 错误码错误提示
|
||||
*/
|
||||
@NotEmpty(message = "错误码错误提示不能为空")
|
||||
private String message;
|
||||
/**
|
||||
* 错误码分组
|
||||
*/
|
||||
@NotNull(message = "错误码分组不能为空")
|
||||
private String group;
|
||||
|
||||
}
|
@ -1,45 +0,0 @@
|
||||
package cn.iocoder.mall.systemservice.rpc.errorcode.dto;
|
||||
|
||||
import cn.iocoder.common.framework.validator.InEnum;
|
||||
import cn.iocoder.mall.systemservice.enums.errorcode.ErrorCodeTypeEnum;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* 错误码创建 DTO
|
||||
*/
|
||||
@Data
|
||||
@Accessors(chain = true)
|
||||
public class ErrorCodeCreateDTO implements Serializable {
|
||||
|
||||
/**
|
||||
* 错误码编码
|
||||
*/
|
||||
@NotNull(message = "错误码编码不能为空")
|
||||
private Integer code;
|
||||
/**
|
||||
* 错误码错误提示
|
||||
*/
|
||||
@NotEmpty(message = "错误码错误提示不能为空")
|
||||
private String message;
|
||||
/**
|
||||
* 错误码类型
|
||||
*/
|
||||
@NotNull(message = "错误码类型不能为空")
|
||||
@InEnum(value = ErrorCodeTypeEnum.class, message = "错误码类型必须是 {value}")
|
||||
private Integer type;
|
||||
/**
|
||||
* 错误码分组
|
||||
*/
|
||||
@NotNull(message = "错误码分组不能为空")
|
||||
private String group;
|
||||
/**
|
||||
* 错误码备注
|
||||
*/
|
||||
private String memo;
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user