当前位置: 首页 > wzjs >正文

最牛html5网站建设wordpress怎么私人媒体库

最牛html5网站建设,wordpress怎么私人媒体库,东莞英文建站公司,网站建设公司江西文章目录 一、业务场景1.1 验证码登录1.2 手机号注册1.3 忘记密码1.4 其他场景..... 二. 准备工作1.注册阿里云账号2.阿里云申请签名3.阿里云短信模版4.阿里云短信控制台测试 三、功能规划1. 工厂模式根据不同业务进行校验,提高代码的可扩展性2.不同业务类型使用不同…

文章目录

  • 一、业务场景
    • 1.1 验证码登录
    • 1.2 手机号注册
    • 1.3 忘记密码
    • 1.4 其他场景.....
  • 二. 准备工作
    • 1.注册阿里云账号
    • 2.阿里云申请签名
    • 3.阿里云短信模版
    • 4.阿里云短信控制台测试
  • 三、功能规划
    • 1. 工厂模式根据不同业务进行校验,提高代码的可扩展性
    • 2.不同业务类型使用不同的缓存key
  • 四、业务实现
    • 1.引入jar
    • 2.yam配置信息及对应配置类
    • 3. 业务工厂: 获取对应业务模版
    • 4. 发送短信模版:用来发送短信
    • 5. 业务模版:用来校验
      • 5.1 登录
      • 5.2 注册
      • 5.3 忘记密码
    • 6.短信缓存redis
    • 7. 请求入口:
    • 8. 参数:SmsReqAo


提示:以下是本篇文章正文内容,下面案例可供参考

一、业务场景

每种业务场景对手机号校验方式可能都不相同

1.1 验证码登录

校验:手机号在系统是否存在,存在则发送短信

1.2 手机号注册

校验:手机号在系统是否已经注册,未注册则发送短信

1.3 忘记密码

校验:手机号在系统是否存在,存在则发送短信

1.4 其他场景…

二. 准备工作

1.注册阿里云账号

2.阿里云申请签名

3.阿里云短信模版

4.阿里云短信控制台测试

三、功能规划

1. 工厂模式根据不同业务进行校验,提高代码的可扩展性

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 {// 阿里云短信服务accessKeyIdprivate String accessKeyId;// 阿里云短信服务accessKeySecretprivate 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);};}
}

4. 发送短信模版:用来发送短信


@Slf4j
public abstract class SmsTemplate {protected abstract void checkBiz(String phoneNumber);/*** 发送短信验证码** @param templateKey 模板key* @param phoneNumber 手机号* @return 是否发送成功*/public boolean sendSms(String templateKey, String phoneNumber) {checkBiz(phoneNumber);SmsCodeCache smsCodeCache = SpringUtils.getBean(SmsCodeCache.class);// 检查发送频率(60秒内只能发送一次)if (!smsCodeCache.checkRateLimit(phoneNumber, 60)) {throw new RuntimeException("发送频率过高,请稍后再试");}String code = this.generateCode(); // 生成验证码boolean isSuccess = this.sendSmsToAliyun(templateKey, phoneNumber, code); // 调用阿里云发送短信if (isSuccess) {// 缓存验证码,有效期5分钟smsCodeCache.cacheCode(templateKey, phoneNumber, code, 5);}return isSuccess;}/*** 调用阿里云短信服务发送短信** @param templateKey 模板key* @param phoneNumber 手机号* @param code        验证码* @return 是否发送成功*/private boolean sendSmsToAliyun(String templateKey, String phoneNumber, String code) {AliyunSmsConfig smsConfig = SpringUtils.getBean(AliyunSmsConfig.class);String templateCode = smsConfig.getTemplateCode(templateKey);try {// 初始化客户端Config config = new Config().setAccessKeyId(smsConfig.getAccessKeyId()).setAccessKeySecret(smsConfig.getAccessKeySecret()).setRegionId(smsConfig.getRegionId());Client client = new Client(config);// 构建请求SendSmsRequest request = new SendSmsRequest().setPhoneNumbers(phoneNumber).setSignName(smsConfig.getSignName()).setTemplateCode(templateCode).setTemplateParam("{\"code\":\"" + code + "\"}");// 发送短信SendSmsResponse response = client.sendSms(request);return "OK".equals(response.getBody().getCode());} catch (Exception e) {log.error("发送短信验证码失败,模版:{},手机号:{},验证码:{},错误:{}", templateKey, phoneNumber, code, e.getMessage());return false;}}/*** 生成6位随机验证码** @return 验证码*/private String generateCode() {Random random = new Random();return String.format("%06d", random.nextInt(1000000));}
}

5. 业务模版:用来校验

5.1 登录

@Component
@AllArgsConstructor
public class LoginSmsTemplate extends SmsTemplate {private final BaseStaffService baseStaffService;@Overridepublic void checkBiz(String phoneNumber) {BaseStaff staff = baseStaffService.getStaffByTelephone(phoneNumber);ArgumentAssert.notNull(staff, "该手机号不存在");}
}

5.2 注册

@Component
@AllArgsConstructor
public class RegisterSmsTemplate extends SmsTemplate {private final BaseStaffService baseStaffService;@Overridepublic void checkBiz(String phoneNumber) {BaseStaff staff = baseStaffService.getStaffByTelephone(phoneNumber);ArgumentAssert.isNull(staff, "该手机号已注册");}
}

5.3 忘记密码

@Component
@AllArgsConstructor
public class ForgotPasswordSmsTemplate extends SmsTemplate {private final BaseStaffService baseStaffService;@Overridepublic void checkBiz(String phoneNumber) {BaseStaff staff = baseStaffService.getStaffByTelephone(phoneNumber);ArgumentAssert.notNull(staff, "该手机号不存在");}
}

6.短信缓存redis


@Component
@AllArgsConstructor
public class SmsCodeCache {private final RedisTemplate<String, String> redisTemplate;// 验证码缓存前缀private static final String CODE_PREFIX = "sms:code:";// 发送频率限制前缀private static final String RATE_LIMIT_PREFIX = "sms:rate:";/*** 缓存验证码** @param templateKey 模板key* @param phoneNumber 手机号* @param code        验证码* @param expireTime  过期时间(分钟)*/public void cacheCode(String templateKey, String phoneNumber, String code, long expireTime) {String key = CODE_PREFIX + templateKey + StrPool.COLON + phoneNumber;redisTemplate.opsForValue().set(key, code, expireTime, TimeUnit.MINUTES);}/*** 获取缓存的验证码** @param templateKey 模板key* @param phoneNumber 手机号* @return 验证码*/public String getCachedCode(String templateKey, String phoneNumber) {String key = CODE_PREFIX + templateKey + StrPool.COLON + phoneNumber;return redisTemplate.opsForValue().get(key);}/*** 删除缓存的验证码** @param templateKey 模板key* @param phoneNumber 手机号*/public void deleteCode(String templateKey, String phoneNumber) {String key = CODE_PREFIX + templateKey + StrPool.COLON + phoneNumber;redisTemplate.delete(key);}/*** 检查发送频率** @param phoneNumber 手机号* @param interval    间隔时间(秒)* @return 是否可以发送*/public boolean checkRateLimit(String phoneNumber, long interval) {String key = RATE_LIMIT_PREFIX + phoneNumber;Long lastSentTime = redisTemplate.opsForValue().getOperations().getExpire(key);if (lastSentTime != null && lastSentTime > 0) {return false; // 还在限制时间内}redisTemplate.opsForValue().set(key, "1", interval, TimeUnit.SECONDS);return true;}
}

7. 请求入口:

@PostMapping("getSmsCode")@ApiOperation(value = "获取短信验证码")public DataResponse<Boolean> getSmsCode(@RequestBody @Validated SmsReqAo ao) {String templateKey = ao.getTemplateKey();return DataResponse.builderSuccess(smsTemplateFactory.getTemplate(templateKey).sendSms(templateKey, ao.getTelephone()));}

8. 参数:SmsReqAo

@Data
@ApiModel("短信求入参")
public class SmsReqAo implements Serializable {private static final long serialVersionUID = 1L;@NotBlank(message = "模版KEY不能为空")@ApiModelProperty(value = "模版KEY", required = true)String templateKey;/*** 手机号*/@ApiModelProperty(value = "手机号", required = true)@NotBlank(message = "手机号不能为为空")@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")private String telephone;
}

文章转载自:

http://yhgWUJ5X.tkyry.cn
http://c3AGTBWb.tkyry.cn
http://XsCF35CM.tkyry.cn
http://GvSpc5Ix.tkyry.cn
http://N6lDVYXg.tkyry.cn
http://jQWwB2kb.tkyry.cn
http://hO2cJt9s.tkyry.cn
http://CBYSGDBU.tkyry.cn
http://IuYfXknz.tkyry.cn
http://MAwGpV0e.tkyry.cn
http://YAgeyhgb.tkyry.cn
http://7H3cwRIw.tkyry.cn
http://Zi1DYsho.tkyry.cn
http://SrCH9wCG.tkyry.cn
http://8nDG5LBO.tkyry.cn
http://E1gvkdYn.tkyry.cn
http://V7HrUrfG.tkyry.cn
http://SD0YKNKf.tkyry.cn
http://0LHl5uMW.tkyry.cn
http://NVWFvAmI.tkyry.cn
http://si4mc44h.tkyry.cn
http://kp6o9AMz.tkyry.cn
http://SvEYsNcT.tkyry.cn
http://E1TbZcUr.tkyry.cn
http://NDbVTK3X.tkyry.cn
http://8ZOa9zk0.tkyry.cn
http://jqF4aoF3.tkyry.cn
http://NXfqXziY.tkyry.cn
http://aZlGy7PT.tkyry.cn
http://bjZvdgat.tkyry.cn
http://www.dtcms.com/wzjs/675819.html

相关文章:

  • 哪个网站做简历免费开发网站需求设计
  • dw建网站具体步骤360免费wifi可以破解wifi密码吗
  • 现在个人网站怎么备案南京网站建设咨询
  • 淘宝网站icp备案网站备案最多需要多久
  • 做网站系统的答辩ppt范文福州房产网站建设
  • 西安北郊网站维护运营云南网站制作公司
  • wordpress安装无法登录长沙网站优化体验
  • 站外推广策划书徐州seo关键词
  • 沈阳 网站制作报价建设网站群的意义
  • 自己建设网站要花多少钱怎样用ps做网站的效果图
  • 园林专业设计学习网站保定市城市规划建设局网站
  • 上海奉贤网站建设在线设计平台源码
  • 邢台做网站推广价格域名转移影响网站访问吗
  • 怎样建网站视频教程上海网站建设 知名做
  • 小网站搜什么关键词vi设计的概念
  • 旅游网站建设经费预算wordpress 代码缩进
  • 餐饮网站做的比较好的是哪个做网站要服务器和什么软件
  • 青岛市网站建设公司西安网站优化培训
  • 网站开发需要人员百度seo怎么关闭
  • 百度网站建设中的自由容器家具网站建设案例
  • 服务器访问不了网站东莞h5网站开发
  • 西安晨曦e动网站建设wordpress2016
  • 北京建公司网站价格小蘑菇网站开发
  • 做微信公众号的网站有哪些caddy搭建wordpress
  • 中国做趋势的网站网络营销公司组织架构
  • 货物公司网站建设方案深圳市长城建设有限公司网站
  • 对加强政务门户网站建设的意见深圳网站设计定制开发
  • 网站制作公司排行榜汽车网站建设论文
  • 梅花手表网站网站建设最好的
  • 手机电子商务网站建设策划书学服装设计培训机构