提交 453235bb authored 作者: sin's avatar sin

- 添加 SmsPlatform

上级 2b02b5b9
package cn.iocoder.mall.admin.api;
import cn.iocoder.mall.admin.api.bo.sms.SmsSignBO;
import lombok.Data;
import lombok.experimental.Accessors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 短信平台
*
* @author Sin
* @time 2019/5/16 6:33 PM
*/
public interface SmsPlatform {
@Data
@Accessors(chain = true)
class Result {
/**
* 编号
*/
private String id;
/**
* 审核状态
*/
private Integer applyStatus;
/**
* 审核内容
*/
private String applyMessage;
}
/**
* 签名 - 创建
*
* @param sign
*/
Result createSign(String sign);
/**
* 签名 - 获取
*
* @param sign
*/
Result getSign(String sign);
/**
* 签名 - 更新
*
* @param oldSign
* @param sign
*/
Result updateSign(String oldSign, String sign);
/**
* 模板 - 创建
*
* @param sign 选用的哪个签名
* @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null
*/
Result createTemplate(String sign, String template, Integer tplType);
/**
* 获取模板信息
*
* @param tipId
*/
Result getTemplate(String tipId);
/**
* 更新模板内容
*
* @param tipId 选用的哪个签名
* @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null
*/
Result updateTemplate(String tipId, String template, Integer tplType);
}
package cn.iocoder.mall.admin.api;
import cn.iocoder.mall.admin.api.bo.sms.SmsSignBO;
import cn.iocoder.mall.admin.api.bo.sms.SmsTemplateBO;
/**
* 短信服务
*
* @author Sin
* @time 2019/5/16 9:54 AM
*/
public interface SmsService {
/**
* 签名 - 创建
*
* @param sign
*/
void createSign(String sign);
/**
* 签名 - 获取
*
* @param sign
*/
SmsSignBO getSign(String sign);
/**
* 签名 - 更新
*
* @param oldSign
* @param sign
*/
void updateSign(String oldSign, String sign);
/**
* 模板 - 创建
*
* @param smsSignId 选用的哪个签名
* @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null
*/
void createTemplate(Integer smsSignId, String template, Integer tplType);
/**
* 获取模板信息
*
* @param id
*/
SmsTemplateBO getTemplate(String id);
/**
* 更新模板内容
*
* @param id 模板id
* @param template 模板内容
* @param tplType 1 为验证码类型,其他为 null
*/
void updateTemplate(String id, String template, Integer tplType);
}
package cn.iocoder.mall.admin.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;
}
package cn.iocoder.mall.admin.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;
}
......@@ -46,6 +46,15 @@ public enum AdminErrorCodeEnum {
DATA_DICT_EXISTS(1002005000, "该数据字典已经存在"),
DATA_DICT_NOT_EXISTS(1002005001, "该数据字典不存在"),
// ========== 短信模板 1002006000 ==========
SMS_SIGN_ADD_FAIL(1002006000, "短信签名添加失败"),
SMS_SIGN_NOT_EXISTENT(1002006001, "短信签名不存在"),
SMS_SIGN_IS_EXISTENT(1002006002, "短信签名已存在"),
SMS_SIGN_UPDATE_FAIL(1002006003, "短信更新失败"),
SMS_TEMPLATE_ADD_FAIL(1002006020, "短信签名不存在"),
SMS_TEMPLATE_NOT_EXISTENT(1002006021, "短信签名不存在"),
SMS_TEMPLATE_IS_EXISTENT(1002006022, "短信签名不存在"),
;
private final int code;
......
package cn.iocoder.mall.admin.api.constant;
/**
* 短信审核状态
*
* @author Sin
* @time 2019/5/16 12:48 PM
*/
public enum SmsApplyStatusEnum {
CHECKING(1, "审核中"),
SUCCESS(2, "审核成功"),
FAIL(3, "审核失败"),
;
private final int code;
private final String message;
SmsApplyStatusEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
package cn.iocoder.mall.admin.api.exception;
import cn.iocoder.common.framework.exception.ServiceException;
/**
* @author Sin
* @time 2019/5/16 11:17 AM
*/
public class SmsFailException extends ServiceException {
public SmsFailException(Integer code, String message) {
super(code, message);
}
}
......@@ -67,7 +67,17 @@
<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>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
......
package cn.iocoder.mall.admin.convert;
import cn.iocoder.mall.admin.api.bo.sms.SmsSignBO;
import cn.iocoder.mall.admin.dataobject.SmsSignDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* 短信 签名
*
* @author Sin
* @time 2019/5/16 6:31 PM
*/
@Mapper
public interface SmsSignConvert {
SmsSignConvert INSTANCE = Mappers.getMapper(SmsSignConvert.class);
@Mappings({})
SmsSignBO convert(SmsSignDO smsSignDO);
}
package cn.iocoder.mall.admin.convert;
import cn.iocoder.mall.admin.api.bo.sms.SmsTemplateBO;
import cn.iocoder.mall.admin.dataobject.SmsTemplateDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* 短信 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);
}
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> {
}
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> {
}
package cn.iocoder.mall.admin.dataobject;
import cn.iocoder.common.framework.dataobject.DeletableDO;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 短信签名
*
* 签名是短信发送前缀 如:【阿里云】、【小红书】
*
* @author Sin
* @time 2019/5/16 12:28 PM
*/
@Data
@Accessors(chain = true)
public class SmsSignDO extends DeletableDO {
/**
* 编号
*/
@TableId("id")
private Integer id;
/**
* 签名id 这个是第三方的
*/
private String platformId;
/**
* 签名名称
*/
private String sign;
/**
* 审核状态
*
* - 1、审核中
* - 2、审核成功
* - 3、审核失败
*/
private Integer applyStatus;
/**
* 审核信息
*/
private String applyMessage;
}
package cn.iocoder.mall.admin.dataobject;
import cn.iocoder.common.framework.dataobject.DeletableDO;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* 短信 模板
*
* @author Sin
* @time 2019/5/16 12:31 PM
*/
@Data
@Accessors(chain = true)
public class SmsTemplateDO extends DeletableDO {
/**
* 编号
*/
private Integer id;
/**
* 模板编号 (第三方的)
*/
private Integer smsSignId;
/**
* 短信签名 id
*/
private String platformId;
/**
* 短信模板
*/
private String template;
/**
* 审核状态
*
* 1、审核中
* 2、审核成功
* 3、审核失败
*/
private Integer applyStatus;
/**
* 审核信息
*/
private String applyMessage;
}
package cn.iocoder.mall.admin.service;
import cn.iocoder.common.framework.constant.DeletedStatusEnum;
import cn.iocoder.mall.admin.api.SmsPlatform;
import cn.iocoder.mall.admin.api.SmsService;
import cn.iocoder.mall.admin.api.bo.sms.SmsSignBO;
import cn.iocoder.mall.admin.api.bo.sms.SmsTemplateBO;
import cn.iocoder.mall.admin.api.constant.AdminErrorCodeEnum;
import cn.iocoder.mall.admin.api.exception.SmsFailException;
import cn.iocoder.mall.admin.convert.SmsSignConvert;
import cn.iocoder.mall.admin.convert.SmsTemplateConvert;
import cn.iocoder.mall.admin.dao.SmsSignMapper;
import cn.iocoder.mall.admin.dao.SmsTemplateMapper;
import cn.iocoder.mall.admin.dataobject.SmsSignDO;
import cn.iocoder.mall.admin.dataobject.SmsTemplateDO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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 java.util.Date;
/**
* 短信
*
* @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
@Qualifier("smsYunPianPlatform")
private SmsPlatform smsPlatform;
@Override
@Transactional
public void createSign(String sign) {
// 避免重复
SmsSignDO smsSignDO = smsSignMapper.selectOne(
new QueryWrapper<SmsSignDO>().eq("sign", sign));
if (smsSignDO != null) {
throw new SmsFailException(AdminErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getCode(),
AdminErrorCodeEnum.SMS_SIGN_IS_EXISTENT.getMessage());
}
// 创建平台 sign
SmsPlatform.Result result = smsPlatform.createSign(sign);
// 保存数据库
smsSignMapper.insert(
(SmsSignDO) new SmsSignDO()
.setSign(sign)
.setPlatformId(result.getId())
.setApplyStatus(result.getApplyStatus())
.setDeleted(DeletedStatusEnum.DELETED_NO.getValue())
.setUpdateTime(new Date())
);
}
@Override
public SmsSignBO getSign(String sign) {
SmsSignDO smsSignDO = smsSignMapper.selectOne(
new QueryWrapper<SmsSignDO>().eq("sign", sign));
if (smsSignDO == null) {
throw new SmsFailException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
}
return SmsSignConvert.INSTANCE.convert(smsSignDO);
}
@Override
@Transactional
public void updateSign(String oldSign, String sign) {
// 避免重复
SmsSignDO smsSignDO = smsSignMapper.selectOne(
new QueryWrapper<SmsSignDO>().eq("sign", oldSign));
if (smsSignDO == null) {
throw new SmsFailException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
}
// 更新平台
SmsPlatform.Result result = smsPlatform.updateSign(oldSign, sign);
// 更新
smsSignMapper.updateById(
(SmsSignDO) new SmsSignDO()
.setId(smsSignDO.getId())
.setPlatformId(result.getId())
.setSign(sign)
.setApplyStatus(result.getApplyStatus())
.setUpdateTime(new Date())
);
}
@Override
public void createTemplate(Integer smsSignId, String template, Integer tplType) {
SmsSignDO smsSignDO = smsSignMapper.selectOne(
new QueryWrapper<SmsSignDO>().eq("id", smsSignId));
if (smsSignDO == null) {
throw new SmsFailException(AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getCode(),
AdminErrorCodeEnum.SMS_SIGN_NOT_EXISTENT.getMessage());
}
// 调用平台
SmsPlatform.Result result = smsPlatform
.createTemplate(smsSignDO.getSign(), template, tplType);
// 保存数据库
smsTemplateMapper.insert(
(SmsTemplateDO) new SmsTemplateDO()
.setId(null)
.setSmsSignId(smsSignId)
.setPlatformId(result.getId())
.setTemplate(template)
.setApplyStatus(result.getApplyStatus())
.setApplyMessage(result.getApplyMessage())
.setDeleted(DeletedStatusEnum.DELETED_NO.getValue())
.setCreateTime(new Date())
);
}
@Override
public SmsTemplateBO getTemplate(String id) {
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
new QueryWrapper<SmsTemplateDO>().eq("id", id));
if (smsTemplateDO == null) {
throw new SmsFailException(AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
}
return SmsTemplateConvert.INSTANCE.convert(smsTemplateDO);
}
@Override
public void updateTemplate(String id, String template, Integer tplType) {
SmsTemplateDO smsTemplateDO = smsTemplateMapper.selectOne(
new QueryWrapper<SmsTemplateDO>().eq("id", id));
if (smsTemplateDO == null) {
throw new SmsFailException(AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getCode(),
AdminErrorCodeEnum.SMS_TEMPLATE_NOT_EXISTENT.getMessage());
}
SmsPlatform.Result result = smsPlatform.updateTemplate(
smsTemplateDO.getPlatformId(), template, tplType);
smsTemplateMapper.update(
(SmsTemplateDO) new SmsTemplateDO()
.setApplyStatus(result.getApplyStatus())
.setApplyMessage(result.getApplyMessage())
.setUpdateTime(new Date()),
new QueryWrapper<SmsTemplateDO>().eq("id", id)
);
}
}
......@@ -24,6 +24,10 @@ mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: cn.iocoder.mall.admin.dataobject
# sms
sms:
apiKey: d4705399e71e822fe3a90f801ed95bd9
# dubbo
dubbo:
application:
......@@ -49,6 +53,8 @@ dubbo:
version: 1.0.0
RoleService:
version: 1.0.0
SmsService:
version: 1.0.0
# logging
logging:
......
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);
}
}
/**
* @author Sin
* @time 2019/5/16 10:52 AM
*/
package cn.iocoder.mall.admin;
\ No newline at end of file
package cn.iocoder.mall.admin.service;
import cn.iocoder.mall.admin.SystemApplicationTest;
import cn.iocoder.mall.admin.service.SmsServiceImpl;
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/16 10:52 AM
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SystemApplicationTest.class)
public class SmsServiceImplTest {
@Autowired
private SmsServiceImpl smsService;
@Test
public void createSignTest() {
// smsService.createSign("测试签名1");
smsService.getSign("测试签名1");
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论