提示:以下是本篇文章正文内容,下面案例可供参考
一、业务场景
每种业务场景对手机号校验方式可能都不相同
1.1 验证码登录
校验:手机号在系统是否存在,存在则发送短信
1.2 手机号注册
校验:手机号在系统是否已经注册,未注册则发送短信
1.3 忘记密码
校验:手机号在系统是否存在,存在则发送短信
1.4 其他场景…
二. 准备工作
1.注册阿里云账号
2.阿里云申请签名
3.阿里云短信模版
4.阿里云短信控制台测试
三、功能规划
1. 设计模式
1.1工厂模式:根据不同业务创建不同的工厂类
1.1策略模式:每个类有不同的短信模版内容
1.2 模版方法模式:每个类 发送时,都需要提前进行业务校验
作用:提高代码的可扩展性
2.不同业务类型使用不同的缓存key
四、业务实现

1.引入jar
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20170525</artifactId>
<version>3.1.0</version>
</dependency>
2.yam配置信息及对应配置类

@Configuration
@ConfigurationProperties(prefix = "aliyun.sms")
@Data
public class AliyunSmsConfig {
// 阿里云短信服务accessKeyId
private String accessKeyId;
// 阿里云短信服务accessKeySecret
private String accessKeySecret;
// 短信签名
private String signName;
// 短信发送地区
private String regionId;
// 短信模板
private Map<String, String> templates;
public String getTemplateCode(String key) {
String templateCode = templates.get(key);
ArgumentAssert.notBlank(templateCode, "短信模板不存在");
return templateCode;
}
}
3. 业务工厂: 获取对应业务模版
@Service
@AllArgsConstructor
@Slf4j
public class SmsTemplateFactory {
private final LoginSmsTemplate loginSmsTemplate;
private final RegisterSmsTemplate registerSmsTemplate;
private final ForgotPasswordSmsTemplate forgotPasswordSmsTemplate;
/**
* 根据场景类型获取对应的模板
*
* @param templateKey 场景类型(login/register/forgotPassword)
* @return 对应的模板实现类
*/
public SmsTemplate getTemplate(String templateKey) {
return switch (templateKey) {
case "login" -> loginSmsTemplate;
case "register" -> registerSmsTemplate;
case "forgotPassword" -> forgotPasswordSmsTemplate;
default -> throw new IllegalArgumentException("未知的场景类型:" + templateKey);
};
}

最低0.47元/天 解锁文章
6065

被折叠的 条评论
为什么被折叠?



