Commit a50db6bf7ff76dc3b323adedea3ef9ab979b3cd6
1 parent
0fd757fb
短信代码的 code review 2020-02-22
Showing
10 changed files
with
18 additions
and
7 deletions
src/main/java/cn/iocoder/dashboard/common/enums/SmsChannelEnum.java
| @@ -3,8 +3,11 @@ package cn.iocoder.dashboard.common.enums; | @@ -3,8 +3,11 @@ package cn.iocoder.dashboard.common.enums; | ||
| 3 | import lombok.AllArgsConstructor; | 3 | import lombok.AllArgsConstructor; |
| 4 | import lombok.Getter; | 4 | import lombok.Getter; |
| 5 | 5 | ||
| 6 | +import java.util.function.Predicate; | ||
| 7 | +import java.util.stream.Stream; | ||
| 8 | + | ||
| 6 | /** | 9 | /** |
| 7 | - * 短信渠道枚举 | 10 | + * 短信渠道枚举 TODO FROM 芋艿 TO zzf:属于短信的枚举类,可以放到 framework/sms 下 |
| 8 | * | 11 | * |
| 9 | * @author zzf | 12 | * @author zzf |
| 10 | * @date 2021/1/25 10:56 | 13 | * @date 2021/1/25 10:56 |
| @@ -16,7 +19,7 @@ public enum SmsChannelEnum { | @@ -16,7 +19,7 @@ public enum SmsChannelEnum { | ||
| 16 | ALI("ALI", "阿里"), | 19 | ALI("ALI", "阿里"), |
| 17 | HUA_WEI("HUA_WEI", "华为"), | 20 | HUA_WEI("HUA_WEI", "华为"), |
| 18 | QI_NIU("QI_NIU", "七牛"), | 21 | QI_NIU("QI_NIU", "七牛"), |
| 19 | - TEN_XUN("TEN_XUN", "腾讯"); | 22 | + TEN_XUN("TEN_XUN", "腾讯"); // TODO FROM 芋艿 to zzf:TEN 有后鼻音哈,要被马爸爸打了。。。 |
| 20 | 23 | ||
| 21 | private final String code; | 24 | private final String code; |
| 22 | 25 |
src/main/java/cn/iocoder/dashboard/framework/sms/client/AliyunSmsClient.java
| @@ -60,7 +60,7 @@ public class AliyunSmsClient extends AbstractSmsClient<SendSmsResponse> { | @@ -60,7 +60,7 @@ public class AliyunSmsClient extends AbstractSmsClient<SendSmsResponse> { | ||
| 60 | request.setSignName(channelVO.getApiSignatureId()); | 60 | request.setSignName(channelVO.getApiSignatureId()); |
| 61 | request.setTemplateCode(channelVO.getTemplateByTemplateCode(smsBody.getTemplateCode()).getApiTemplateId()); | 61 | request.setTemplateCode(channelVO.getTemplateByTemplateCode(smsBody.getTemplateCode()).getApiTemplateId()); |
| 62 | request.setTemplateParam(smsBody.getParamsStr()); | 62 | request.setTemplateParam(smsBody.getParamsStr()); |
| 63 | - | 63 | + // TODO FROM 芋艿 TO zzf:try catch 咱是不是可以交给 abstract 来做。这样,异常处理,重试,限流等等,都可以酱紫 |
| 64 | try { | 64 | try { |
| 65 | SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); | 65 | SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); |
| 66 | 66 |
src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsClientFactory.java
| @@ -33,6 +33,7 @@ public class SmsClientFactory { | @@ -33,6 +33,7 @@ public class SmsClientFactory { | ||
| 33 | * @return 客户端id(默认channelId) | 33 | * @return 客户端id(默认channelId) |
| 34 | */ | 34 | */ |
| 35 | public Long createClient(SmsChannelProperty propertyVO) { | 35 | public Long createClient(SmsChannelProperty propertyVO) { |
| 36 | + // TODO FROM 芋艿 TO zzf:参数的校验,可以考虑统一使用 validation。 | ||
| 36 | if (StrUtil.isBlank(propertyVO.getCode())) { | 37 | if (StrUtil.isBlank(propertyVO.getCode())) { |
| 37 | throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道编码"); | 38 | throw ServiceExceptionUtil.exception(PARAM_VALUE_IS_NULL, "短信渠道编码"); |
| 38 | } | 39 | } |
src/main/java/cn/iocoder/dashboard/framework/sms/core/SmsResult.java
| @@ -13,7 +13,7 @@ public class SmsResult<T> implements Serializable { | @@ -13,7 +13,7 @@ public class SmsResult<T> implements Serializable { | ||
| 13 | /** | 13 | /** |
| 14 | * 是否成功 | 14 | * 是否成功 |
| 15 | */ | 15 | */ |
| 16 | - private Boolean success; | 16 | + private Boolean success; // TODO FROM 芋艿 to zzf:未来要加一个 code,将不同平台的短信失败的情况,做一次统一的收敛。 |
| 17 | 17 | ||
| 18 | /** | 18 | /** |
| 19 | * 提示 | 19 | * 提示 |
| @@ -23,5 +23,5 @@ public class SmsResult<T> implements Serializable { | @@ -23,5 +23,5 @@ public class SmsResult<T> implements Serializable { | ||
| 23 | /** | 23 | /** |
| 24 | * 返回值 | 24 | * 返回值 |
| 25 | */ | 25 | */ |
| 26 | - private T result; | 26 | + private T result; // TODO FROM 芋艿 to zzf:是不是统一各个平台的返回结果,这样对调用方来说统一。因为作为统一的短信客户端,最好让上层不太需要知道太具体。黑河诶 |
| 27 | } | 27 | } |
src/main/java/cn/iocoder/dashboard/framework/sms/core/property/SmsTemplateProperty.java
| @@ -4,7 +4,7 @@ import lombok.Data; | @@ -4,7 +4,7 @@ import lombok.Data; | ||
| 4 | import lombok.EqualsAndHashCode; | 4 | import lombok.EqualsAndHashCode; |
| 5 | 5 | ||
| 6 | /** | 6 | /** |
| 7 | - * 渠道模板VO类 | 7 | + * 渠道模板VO类 TODO FROM 芋艿 TO zzf:模板是不是不要提供到 client 里面,而是交给 factory 统一维护就好。不然,模板修改时候,刷新 client 会比较麻烦。 |
| 8 | * | 8 | * |
| 9 | * @author zzf | 9 | * @author zzf |
| 10 | * @date 2021/1/25 17:03 | 10 | * @date 2021/1/25 17:03 |
src/main/java/cn/iocoder/dashboard/modules/system/mq/producer/sms/SmsProducer.java
| @@ -25,6 +25,7 @@ public class SmsProducer { | @@ -25,6 +25,7 @@ public class SmsProducer { | ||
| 25 | SmsSendMessage message = new SmsSendMessage(); | 25 | SmsSendMessage message = new SmsSendMessage(); |
| 26 | message.setSmsBody(smsBody); | 26 | message.setSmsBody(smsBody); |
| 27 | message.setTargetPhones(targetPhoneList); | 27 | message.setTargetPhones(targetPhoneList); |
| 28 | + // TODO FROM 芋艿 TO ZZF:这块等未来改哈。这个方法目前是广播消费,会导致每个节点都发送一次。等后续封装出 redis stream 消息 | ||
| 28 | RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); | 29 | RedisMessageUtils.sendChannelMessage(stringRedisTemplate, message); |
| 29 | } | 30 | } |
| 30 | 31 |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsChannelService.java
| @@ -18,6 +18,9 @@ import java.util.List; | @@ -18,6 +18,9 @@ import java.util.List; | ||
| 18 | */ | 18 | */ |
| 19 | public interface SmsChannelService { | 19 | public interface SmsChannelService { |
| 20 | 20 | ||
| 21 | + // TODO FROM 芋艿 to ZZF:SmsChannelService=》SysSmsChannelService,增加 Sys 前缀,算在系统模块里 | ||
| 22 | + // TODO FROM 芋艿 to ZZF:方法名,保持不去掉 Sms 前缀。虽然长点,嘿嘿 | ||
| 23 | + | ||
| 21 | /** | 24 | /** |
| 22 | * 初始化短信渠道 | 25 | * 初始化短信渠道 |
| 23 | */ | 26 | */ |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SmsLogService.java
| @@ -22,6 +22,8 @@ public interface SmsLogService { | @@ -22,6 +22,8 @@ public interface SmsLogService { | ||
| 22 | * @param isAsync 是否异步发送 | 22 | * @param isAsync 是否异步发送 |
| 23 | * @return 生成的日志id | 23 | * @return 生成的日志id |
| 24 | */ | 24 | */ |
| 25 | + // TODO FROM 芋艿 to ZZF: async 是针对发送的方式,对于日志不一定需要关心。这样,短信日志,实际就发送前插入,发送后更新结果 | ||
| 26 | + // TODO FROM 芋艿 to ZZF:短信日志,群发的情况,应该是每个手机一条哈。虽然是群发,但是可能部分成功,部分失败;对应到短信平台,实际也是多条。 | ||
| 25 | Long beforeSendLog(SmsBody smsBody, List<String> targetPhones, AbstractSmsClient<?> client, Boolean isAsync); | 27 | Long beforeSendLog(SmsBody smsBody, List<String> targetPhones, AbstractSmsClient<?> client, Boolean isAsync); |
| 26 | 28 | ||
| 27 | /** | 29 | /** |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsChannelServiceImpl.java
| @@ -61,7 +61,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { | @@ -61,7 +61,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { | ||
| 61 | }); | 61 | }); |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | - | 64 | + // TODO FROM 芋艿 to ZZF:channelMapper 嘿,保持命名统一。 |
| 65 | @Resource | 65 | @Resource |
| 66 | private SmsChannelMapper mapper; | 66 | private SmsChannelMapper mapper; |
| 67 | 67 |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SmsServiceImpl.java
| @@ -42,6 +42,7 @@ public class SmsServiceImpl implements SmsService { | @@ -42,6 +42,7 @@ public class SmsServiceImpl implements SmsService { | ||
| 42 | return result; | 42 | return result; |
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | + // TODO FROM 芋艿 to ZZF:可能要讨论下,对于短信发送来说,貌似只提供异步发送即可。对于业务来说,一定不能依赖短信的发送结果。 | ||
| 45 | @Override | 46 | @Override |
| 46 | public void sendAsync(SmsBody smsBody, List<String> targetPhones) { | 47 | public void sendAsync(SmsBody smsBody, List<String> targetPhones) { |
| 47 | AbstractSmsClient<?> client = channelService.getClient(smsBody.getTemplateCode()); | 48 | AbstractSmsClient<?> client = channelService.getClient(smsBody.getTemplateCode()); |