Commit cd2a01819b98cd43bcee34db0e48d23f9d3b810a
1 parent
2a4d9f43
短信 code review 2020-02-25
Showing
10 changed files
with
13 additions
and
24 deletions
src/main/java/cn/iocoder/dashboard/framework/sms/client/AbstractSmsClient.java
| @@ -22,7 +22,7 @@ public abstract class AbstractSmsClient implements SmsClient { | @@ -22,7 +22,7 @@ public abstract class AbstractSmsClient implements SmsClient { | ||
| 22 | protected final SmsChannelProperty channelVO; | 22 | protected final SmsChannelProperty channelVO; |
| 23 | 23 | ||
| 24 | /** | 24 | /** |
| 25 | - * 构造阿里云短信发送处理 | 25 | + * 构造阿里云短信发送处理 TODO FROM 芋艿 to zzf:貌似注释不对 |
| 26 | * | 26 | * |
| 27 | * @param property 阿里云短信配置 | 27 | * @param property 阿里云短信配置 |
| 28 | */ | 28 | */ |
| @@ -30,13 +30,12 @@ public abstract class AbstractSmsClient implements SmsClient { | @@ -30,13 +30,12 @@ public abstract class AbstractSmsClient implements SmsClient { | ||
| 30 | this.channelVO = property; | 30 | this.channelVO = property; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | - | ||
| 34 | public SmsChannelProperty getProperty() { | 33 | public SmsChannelProperty getProperty() { |
| 35 | return channelVO; | 34 | return channelVO; |
| 36 | } | 35 | } |
| 37 | 36 | ||
| 38 | @Override | 37 | @Override |
| 39 | - public SmsResult send(String templateApiId, SmsBody smsBody, Collection<String> targets) { | 38 | + public final SmsResult send(String templateApiId, SmsBody smsBody, Collection<String> targets) { |
| 40 | SmsResult result; | 39 | SmsResult result; |
| 41 | try { | 40 | try { |
| 42 | beforeSend(templateApiId, smsBody, targets); | 41 | beforeSend(templateApiId, smsBody, targets); |
| @@ -50,13 +49,13 @@ public abstract class AbstractSmsClient implements SmsClient { | @@ -50,13 +49,13 @@ public abstract class AbstractSmsClient implements SmsClient { | ||
| 50 | return result; | 49 | return result; |
| 51 | } | 50 | } |
| 52 | 51 | ||
| 53 | - | ||
| 54 | /** | 52 | /** |
| 55 | * 发送消息 | 53 | * 发送消息 |
| 56 | * | 54 | * |
| 57 | * @param templateApiId 短信模板唯一标识 | 55 | * @param templateApiId 短信模板唯一标识 |
| 58 | * @param smsBody 消息内容 | 56 | * @param smsBody 消息内容 |
| 59 | * @param targets 发送对象列表 | 57 | * @param targets 发送对象列表 |
| 58 | + * @throws Exception 调用发送失败,抛出异常 | ||
| 60 | * @return 短信发送结果 | 59 | * @return 短信发送结果 |
| 61 | */ | 60 | */ |
| 62 | public abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection<String> targets) throws Exception; | 61 | public abstract SmsResult doSend(String templateApiId, SmsBody smsBody, Collection<String> targets) throws Exception; |
| @@ -67,7 +66,7 @@ public abstract class AbstractSmsClient implements SmsClient { | @@ -67,7 +66,7 @@ public abstract class AbstractSmsClient implements SmsClient { | ||
| 67 | protected void afterSend(String templateApiId, SmsBody smsBody, Collection<String> targets, SmsResult result) throws Exception { | 66 | protected void afterSend(String templateApiId, SmsBody smsBody, Collection<String> targets, SmsResult result) throws Exception { |
| 68 | } | 67 | } |
| 69 | 68 | ||
| 70 | - | 69 | + // TODO FROM 芋艿 to zzf:可以考虑抽到 SmsResult 里 |
| 71 | SmsResult failResult(String message) { | 70 | SmsResult failResult(String message) { |
| 72 | SmsResult resultBody = new SmsResult(); | 71 | SmsResult resultBody = new SmsResult(); |
| 73 | resultBody.setSuccess(false); | 72 | resultBody.setSuccess(false); |
src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java
| @@ -58,16 +58,14 @@ public class AliyunSmsClient extends AbstractSmsClient { | @@ -58,16 +58,14 @@ public class AliyunSmsClient extends AbstractSmsClient { | ||
| 58 | acsClient = new DefaultAcsClient(profile); | 58 | acsClient = new DefaultAcsClient(profile); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | - | ||
| 62 | @Override | 61 | @Override |
| 63 | public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection<String> targets) throws Exception { | 62 | public SmsResult doSend(String templateApiId, SmsBody smsBody, Collection<String> targets) throws Exception { |
| 64 | SendSmsRequest request = new SendSmsRequest(); | 63 | SendSmsRequest request = new SendSmsRequest(); |
| 65 | request.setSysMethod(MethodType.POST); | 64 | request.setSysMethod(MethodType.POST); |
| 66 | - request.setPhoneNumbers(StringUtils.join(targets, ",")); | 65 | + request.setPhoneNumbers(StringUtils.join(targets, ",")); // TODO FROM 芋艿 to zzf:统一使用 Hutool 工具类嘿。 |
| 67 | request.setSignName(channelVO.getApiSignatureId()); | 66 | request.setSignName(channelVO.getApiSignatureId()); |
| 68 | request.setTemplateCode(templateApiId); | 67 | request.setTemplateCode(templateApiId); |
| 69 | request.setTemplateParam(smsBody.getParamsStr()); | 68 | request.setTemplateParam(smsBody.getParamsStr()); |
| 70 | - // TODO FROM 芋艿 TO zzf:try catch 咱是不是可以交给 abstract 来做。这样,异常处理,重试,限流等等,都可以酱紫 DONE | ||
| 71 | SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); | 69 | SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); |
| 72 | 70 | ||
| 73 | boolean result = OK.equals(sendSmsResponse.getCode()); | 71 | boolean result = OK.equals(sendSmsResponse.getCode()); |
| @@ -78,7 +76,7 @@ public class AliyunSmsClient extends AbstractSmsClient { | @@ -78,7 +76,7 @@ public class AliyunSmsClient extends AbstractSmsClient { | ||
| 78 | resultBody.setSuccess(result); | 76 | resultBody.setSuccess(result); |
| 79 | QuerySendDetailsRequest querySendDetailsRequest = new QuerySendDetailsRequest(); | 77 | QuerySendDetailsRequest querySendDetailsRequest = new QuerySendDetailsRequest(); |
| 80 | querySendDetailsRequest.setBizId(sendSmsResponse.getBizId()); | 78 | querySendDetailsRequest.setBizId(sendSmsResponse.getBizId()); |
| 81 | - | 79 | + // TODO FROM 芋艿 to zzf:发送完之后,基于短信平台回调,去更新回执状态。短信发送是否成功,和最终用户收到,是两个维度。这块有困惑,可以微信,我给个截图哈。 |
| 82 | QuerySendDetailsResponse acsResponse = acsClient.getAcsResponse(querySendDetailsRequest); | 80 | QuerySendDetailsResponse acsResponse = acsClient.getAcsResponse(querySendDetailsRequest); |
| 83 | List<SmsResultDetail> resultDetailList = new ArrayList<>(Integer.parseInt(acsResponse.getTotalCount())); | 81 | List<SmsResultDetail> resultDetailList = new ArrayList<>(Integer.parseInt(acsResponse.getTotalCount())); |
| 84 | acsResponse.getSmsSendDetailDTOs().forEach(s -> { | 82 | acsResponse.getSmsSendDetailDTOs().forEach(s -> { |
src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java
| @@ -42,7 +42,6 @@ public class SmsClientFactory { | @@ -42,7 +42,6 @@ public class SmsClientFactory { | ||
| 42 | * @return 客户端id(默认channelId) | 42 | * @return 客户端id(默认channelId) |
| 43 | */ | 43 | */ |
| 44 | public Long createClient(SmsChannelProperty propertyVO) { | 44 | public Long createClient(SmsChannelProperty propertyVO) { |
| 45 | - // TODO FROM 芋艿 TO zzf:参数的校验,可以考虑统一使用 validation。 DONE | ||
| 46 | AbstractSmsClient sender = createClient(SmsChannelEnum.getByCode(propertyVO.getCode()), propertyVO); | 45 | AbstractSmsClient sender = createClient(SmsChannelEnum.getByCode(propertyVO.getCode()), propertyVO); |
| 47 | smsSenderMap.put(propertyVO.getId(), sender); | 46 | smsSenderMap.put(propertyVO.getId(), sender); |
| 48 | return propertyVO.getId(); | 47 | return propertyVO.getId(); |
| @@ -77,7 +76,7 @@ public class SmsClientFactory { | @@ -77,7 +76,7 @@ public class SmsClientFactory { | ||
| 77 | * 添加或修改短信模板信息缓存 | 76 | * 添加或修改短信模板信息缓存 |
| 78 | */ | 77 | */ |
| 79 | public void addOrUpdateTemplateCache(Collection<SmsTemplateProperty> templateProperties) { | 78 | public void addOrUpdateTemplateCache(Collection<SmsTemplateProperty> templateProperties) { |
| 80 | - templateProperties.forEach(s -> templatePropertyMap.put(s.getCode(), s)); | 79 | + templateProperties.forEach(s -> addOrUpdateTemplateCache(templateProperties)); |
| 81 | } | 80 | } |
| 82 | 81 | ||
| 83 | 82 | ||
| @@ -102,4 +101,5 @@ public class SmsClientFactory { | @@ -102,4 +101,5 @@ public class SmsClientFactory { | ||
| 102 | } | 101 | } |
| 103 | return smsTemplateProperty.getApiTemplateId(); | 102 | return smsTemplateProperty.getApiTemplateId(); |
| 104 | } | 103 | } |
| 104 | + | ||
| 105 | } | 105 | } |
src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java
| @@ -14,7 +14,6 @@ public class SmsResult implements Serializable { | @@ -14,7 +14,6 @@ public class SmsResult implements Serializable { | ||
| 14 | /** | 14 | /** |
| 15 | * 是否成功(发送短信的请求是否成功) | 15 | * 是否成功(发送短信的请求是否成功) |
| 16 | */ | 16 | */ |
| 17 | - // TODO FROM 芋艿 to zzf:未来要加一个 code,将不同平台的短信失败的情况,做一次统一的收敛。 DONE | ||
| 18 | private Boolean success; | 17 | private Boolean success; |
| 19 | 18 | ||
| 20 | /** | 19 | /** |
| @@ -30,7 +29,6 @@ public class SmsResult implements Serializable { | @@ -30,7 +29,6 @@ public class SmsResult implements Serializable { | ||
| 30 | /** | 29 | /** |
| 31 | * 返回值 | 30 | * 返回值 |
| 32 | */ | 31 | */ |
| 33 | - // TODO FROM 芋艿 to zzf:是不是统一各个平台的返回结果,这样对调用方来说统一。因为作为统一的短信客户端,最好让上层不太需要知道太具体。黑河诶 DONE | ||
| 34 | private List<SmsResultDetail> result; | 32 | private List<SmsResultDetail> result; |
| 35 | 33 | ||
| 36 | } | 34 | } |
src/main/java/cn/iocoder/dashboard/framework/sms/core/enums/SmsChannelEnum.java
| @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; | @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; | ||
| 4 | import lombok.Getter; | 4 | import lombok.Getter; |
| 5 | 5 | ||
| 6 | /** | 6 | /** |
| 7 | - * 短信渠道枚举 TODO FROM 芋艿 TO zzf:属于短信的枚举类,可以放到 framework/sms 下 DONE | 7 | + * 短信渠道枚举 |
| 8 | * | 8 | * |
| 9 | * @author zzf | 9 | * @author zzf |
| 10 | * @date 2021/1/25 10:56 | 10 | * @date 2021/1/25 10:56 |
| @@ -16,7 +16,7 @@ public enum SmsChannelEnum { | @@ -16,7 +16,7 @@ public enum SmsChannelEnum { | ||
| 16 | ALI("ALI", "阿里"), | 16 | ALI("ALI", "阿里"), |
| 17 | HUA_WEI("HUA_WEI", "华为"), | 17 | HUA_WEI("HUA_WEI", "华为"), |
| 18 | QI_NIU("QI_NIU", "七牛"), | 18 | QI_NIU("QI_NIU", "七牛"), |
| 19 | - TENCENT("TENCENT", "腾讯"); // TODO FROM 芋艿 to zzf:TEN 有后鼻音哈,要被马爸爸打了。。。 DONE | 19 | + TENCENT("TENCENT", "腾讯"); |
| 20 | 20 | ||
| 21 | private final String code; | 21 | private final String code; |
| 22 | 22 | ||
| @@ -30,4 +30,5 @@ public enum SmsChannelEnum { | @@ -30,4 +30,5 @@ public enum SmsChannelEnum { | ||
| 30 | } | 30 | } |
| 31 | return null; | 31 | return null; |
| 32 | } | 32 | } |
| 33 | + | ||
| 33 | } | 34 | } |
src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java
| @@ -7,8 +7,6 @@ import javax.validation.constraints.NotEmpty; | @@ -7,8 +7,6 @@ import javax.validation.constraints.NotEmpty; | ||
| 7 | 7 | ||
| 8 | /** | 8 | /** |
| 9 | * 渠道模板VO类 | 9 | * 渠道模板VO类 |
| 10 | - * TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 DONE | ||
| 11 | - * | ||
| 12 | * | 10 | * |
| 13 | * @author zzf | 11 | * @author zzf |
| 14 | * @date 2021/1/25 17:03 | 12 | * @date 2021/1/25 17:03 |
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java
| @@ -37,12 +37,10 @@ public class SmsChannelController { | @@ -37,12 +37,10 @@ public class SmsChannelController { | ||
| 37 | return success(service.getSmsChannelEnums()); | 37 | return success(service.getSmsChannelEnums()); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| 40 | - | ||
| 41 | @ApiOperation("添加消息渠道") | 40 | @ApiOperation("添加消息渠道") |
| 42 | @PostMapping("/create") | 41 | @PostMapping("/create") |
| 43 | public CommonResult<Long> add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) { | 42 | public CommonResult<Long> add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) { |
| 44 | return success(service.createSmsChannel(reqVO)); | 43 | return success(service.createSmsChannel(reqVO)); |
| 45 | } | 44 | } |
| 46 | 45 | ||
| 47 | - | ||
| 48 | } | 46 | } |
src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SmsSendConsumer.java
| @@ -24,7 +24,7 @@ public class SmsSendConsumer extends AbstractChannelMessageListener<SmsSendMessa | @@ -24,7 +24,7 @@ public class SmsSendConsumer extends AbstractChannelMessageListener<SmsSendMessa | ||
| 24 | 24 | ||
| 25 | @Override | 25 | @Override |
| 26 | public void onMessage(SmsSendMessage message) { | 26 | public void onMessage(SmsSendMessage message) { |
| 27 | - log.info("[onMessage][收到 发送短信 消息]"); | 27 | + log.info("[onMessage][收到 发送短信 消息]"); // TODO FROM 芋艿 to zzf:log 如果要打,这里要内容打上。其他 Consumer 没打的原因,是没内容。。。 |
| 28 | SmsResult send = sysSmsService.send(message.getSmsBody(), message.getTargetPhones()); | 28 | SmsResult send = sysSmsService.send(message.getSmsBody(), message.getTargetPhones()); |
| 29 | } | 29 | } |
| 30 | 30 |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java
| @@ -18,9 +18,6 @@ import java.util.List; | @@ -18,9 +18,6 @@ import java.util.List; | ||
| 18 | */ | 18 | */ |
| 19 | public interface SysSmsChannelService { | 19 | public interface SysSmsChannelService { |
| 20 | 20 | ||
| 21 | - // TODO FROM 芋艿 to ZZF:SmsChannelService=》SysSmsChannelService,增加 Sys 前缀,算在系统模块里 | ||
| 22 | - // TODO FROM 芋艿 to ZZF:方法名,保持不去掉 Sms 前缀。虽然长点,嘿嘿 | ||
| 23 | - | ||
| 24 | /** | 21 | /** |
| 25 | * 初始化短信渠道 | 22 | * 初始化短信渠道 |
| 26 | */ | 23 | */ |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java
| @@ -42,6 +42,7 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { | @@ -42,6 +42,7 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { | ||
| 42 | @Autowired | 42 | @Autowired |
| 43 | private SmsClientFactory clientFactory; | 43 | private SmsClientFactory clientFactory; |
| 44 | 44 | ||
| 45 | + // TODO FROM 芋艿 to zzf:方法要放在成员变量下面; | ||
| 45 | /** | 46 | /** |
| 46 | * 初始化短信客户端 | 47 | * 初始化短信客户端 |
| 47 | */ | 48 | */ |
| @@ -65,7 +66,6 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { | @@ -65,7 +66,6 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { | ||
| 65 | }); | 66 | }); |
| 66 | } | 67 | } |
| 67 | 68 | ||
| 68 | - // TODO FROM 芋艿 to ZZF:channelMapper 嘿,保持命名统一。 DONE | ||
| 69 | @Resource | 69 | @Resource |
| 70 | private SysSmsChannelMapper channelMapper; | 70 | private SysSmsChannelMapper channelMapper; |
| 71 | 71 |