Commit e5a7b8474ff5ec0f0909b3c78af8a5b116fc1373
1 parent
8a6c48f2
fix:短信验证码的每日发送条数不正确
Showing
3 changed files
with
23 additions
and
6 deletions
README.md
| @@ -158,7 +158,7 @@ ps:核心功能已经实现,正在对接微信小程序中... | @@ -158,7 +158,7 @@ ps:核心功能已经实现,正在对接微信小程序中... | ||
| 158 | 158 | ||
| 159 | | 框架 | 说明 | 版本 | 学习指南 | | 159 | | 框架 | 说明 | 版本 | 学习指南 | |
| 160 | |---------------------------------------------------------------------------------------------|-----------------------|-----------|----------------------------------------------------------------| | 160 | |---------------------------------------------------------------------------------------------|-----------------------|-----------|----------------------------------------------------------------| |
| 161 | -| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.6.9 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | | 161 | +| [Spring Boot](https://spring.io/projects/spring-boot) | 应用开发框架 | 2.6.10 | [文档](https://github.com/YunaiV/SpringBoot-Labs) | |
| 162 | | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 | | | 162 | | [MySQL](https://www.mysql.com/cn/) | 数据库服务器 | 5.7 | | |
| 163 | | [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.11 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) | | 163 | | [Druid](https://github.com/alibaba/druid) | JDBC 连接池、监控组件 | 1.2.11 | [文档](http://www.iocoder.cn/Spring-Boot/datasource-pool/?yudao) | |
| 164 | | [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.2 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) | | 164 | | [MyBatis Plus](https://mp.baomidou.com/) | MyBatis 增强工具包 | 3.5.2 | [文档](http://www.iocoder.cn/Spring-Boot/MyBatis/?yudao) | |
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java
| 1 | package cn.iocoder.yudao.framework.common.util.date; | 1 | package cn.iocoder.yudao.framework.common.util.date; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.date.DateUtil; | ||
| 4 | + | ||
| 3 | import java.time.Duration; | 5 | import java.time.Duration; |
| 4 | import java.util.Calendar; | 6 | import java.util.Calendar; |
| 5 | import java.util.Date; | 7 | import java.util.Date; |
| @@ -120,4 +122,17 @@ public class DateUtils { | @@ -120,4 +122,17 @@ public class DateUtils { | ||
| 120 | return c.getTime(); | 122 | return c.getTime(); |
| 121 | } | 123 | } |
| 122 | 124 | ||
| 125 | + /** | ||
| 126 | + * 是否今天 | ||
| 127 | + * | ||
| 128 | + * @param date 日期 | ||
| 129 | + * @return 是否 | ||
| 130 | + */ | ||
| 131 | + public static boolean isToday(Date date) { | ||
| 132 | + if (date == null) { | ||
| 133 | + return false; | ||
| 134 | + } | ||
| 135 | + return DateUtil.isSameDay(date, new Date()); | ||
| 136 | + } | ||
| 137 | + | ||
| 123 | } | 138 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java
| @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.sms; | @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.system.service.sms; | ||
| 3 | import cn.hutool.core.lang.Assert; | 3 | import cn.hutool.core.lang.Assert; |
| 4 | import cn.hutool.core.map.MapUtil; | 4 | import cn.hutool.core.map.MapUtil; |
| 5 | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; | 5 | import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; |
| 6 | +import cn.iocoder.yudao.framework.common.util.date.DateUtils; | ||
| 6 | import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; | 7 | import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO; |
| 7 | import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; | 8 | import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; |
| 8 | import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; | 9 | import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; |
| @@ -52,21 +53,22 @@ public class SmsCodeServiceImpl implements SmsCodeService { | @@ -52,21 +53,22 @@ public class SmsCodeServiceImpl implements SmsCodeService { | ||
| 52 | // 校验是否可以发送验证码,不用筛选场景 | 53 | // 校验是否可以发送验证码,不用筛选场景 |
| 53 | SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null,null); | 54 | SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, null,null); |
| 54 | if (lastSmsCode != null) { | 55 | if (lastSmsCode != null) { |
| 55 | - if (lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 | ||
| 56 | - throw ServiceExceptionUtil.exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); | ||
| 57 | - } | ||
| 58 | if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() | 56 | if (System.currentTimeMillis() - lastSmsCode.getCreateTime().getTime() |
| 59 | < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 | 57 | < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁 |
| 60 | throw ServiceExceptionUtil.exception(SMS_CODE_SEND_TOO_FAST); | 58 | throw ServiceExceptionUtil.exception(SMS_CODE_SEND_TOO_FAST); |
| 61 | } | 59 | } |
| 60 | + if (DateUtils.isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限 | ||
| 61 | + lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。 | ||
| 62 | + throw ServiceExceptionUtil.exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY); | ||
| 63 | + } | ||
| 62 | // TODO 芋艿:提升,每个 IP 每天可发送数量 | 64 | // TODO 芋艿:提升,每个 IP 每天可发送数量 |
| 63 | // TODO 芋艿:提升,每个 IP 每小时可发送数量 | 65 | // TODO 芋艿:提升,每个 IP 每小时可发送数量 |
| 64 | } | 66 | } |
| 65 | 67 | ||
| 66 | // 创建验证码记录 | 68 | // 创建验证码记录 |
| 67 | String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1)); | 69 | String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1)); |
| 68 | - SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code) | ||
| 69 | - .scene(scene).todayIndex(lastSmsCode != null ? lastSmsCode.getTodayIndex() + 1 : 1) | 70 | + SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene) |
| 71 | + .todayIndex(lastSmsCode != null && DateUtils.isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1) | ||
| 70 | .createIp(ip).used(false).build(); | 72 | .createIp(ip).used(false).build(); |
| 71 | smsCodeMapper.insert(newSmsCode); | 73 | smsCodeMapper.insert(newSmsCode); |
| 72 | return code; | 74 | return code; |