mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 04:08:43 +08:00 
			
		
		
		
	完善 SmsCodeServiceImpl 单元测试
This commit is contained in:
		@@ -1,6 +1,6 @@
 | 
			
		||||
package cn.iocoder.yudao.module.system.api.sms;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.service.sms.SmsCodeService;
 | 
			
		||||
@@ -32,8 +32,8 @@ public class SmsCodeApiImpl implements SmsCodeApi {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
 | 
			
		||||
        smsCodeService.checkSmsCode(reqDTO);
 | 
			
		||||
    public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
 | 
			
		||||
        smsCodeService.validateSmsCode(reqDTO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
package cn.iocoder.yudao.module.system.service.sms;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.common.exception.ServiceException;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
 | 
			
		||||
 | 
			
		||||
@@ -35,6 +35,6 @@ public interface SmsCodeService {
 | 
			
		||||
     *
 | 
			
		||||
     * @param reqDTO 校验请求
 | 
			
		||||
     */
 | 
			
		||||
    void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO);
 | 
			
		||||
    void validateSmsCode(@Valid SmsCodeValidateReqDTO reqDTO);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,9 @@ package cn.iocoder.yudao.module.system.service.sms;
 | 
			
		||||
import cn.hutool.core.date.LocalDateTimeUtil;
 | 
			
		||||
import cn.hutool.core.lang.Assert;
 | 
			
		||||
import cn.hutool.core.map.MapUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeCheckReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeValidateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
 | 
			
		||||
import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
 | 
			
		||||
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
 | 
			
		||||
@@ -16,11 +14,11 @@ import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.validation.annotation.Validated;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.time.temporal.ChronoUnit;
 | 
			
		||||
 | 
			
		||||
import static cn.hutool.core.util.RandomUtil.randomInt;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.isToday;
 | 
			
		||||
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -58,11 +56,11 @@ public class SmsCodeServiceImpl implements SmsCodeService {
 | 
			
		||||
        if (lastSmsCode != null) {
 | 
			
		||||
            if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
 | 
			
		||||
                    < smsCodeProperties.getSendFrequency().toMillis()) { // 发送过于频繁
 | 
			
		||||
                throw ServiceExceptionUtil.exception(SMS_CODE_SEND_TOO_FAST);
 | 
			
		||||
                throw exception(SMS_CODE_SEND_TOO_FAST);
 | 
			
		||||
            }
 | 
			
		||||
            if (DateUtils.isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限
 | 
			
		||||
            if (isToday(lastSmsCode.getCreateTime()) && // 必须是今天,才能计算超过当天的上限
 | 
			
		||||
                    lastSmsCode.getTodayIndex() >= smsCodeProperties.getSendMaximumQuantityPerDay()) { // 超过当天发送的上限。
 | 
			
		||||
                throw ServiceExceptionUtil.exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
 | 
			
		||||
                throw exception(SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY);
 | 
			
		||||
            }
 | 
			
		||||
            // TODO 芋艿:提升,每个 IP 每天可发送数量
 | 
			
		||||
            // TODO 芋艿:提升,每个 IP 每小时可发送数量
 | 
			
		||||
@@ -71,7 +69,7 @@ public class SmsCodeServiceImpl implements SmsCodeService {
 | 
			
		||||
        // 创建验证码记录
 | 
			
		||||
        String code = String.valueOf(randomInt(smsCodeProperties.getBeginCode(), smsCodeProperties.getEndCode() + 1));
 | 
			
		||||
        SmsCodeDO newSmsCode = SmsCodeDO.builder().mobile(mobile).code(code).scene(scene)
 | 
			
		||||
                .todayIndex(lastSmsCode != null && DateUtils.isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1)
 | 
			
		||||
                .todayIndex(lastSmsCode != null && isToday(lastSmsCode.getCreateTime()) ? lastSmsCode.getTodayIndex() + 1 : 1)
 | 
			
		||||
                .createIp(ip).used(false).build();
 | 
			
		||||
        smsCodeMapper.insert(newSmsCode);
 | 
			
		||||
        return code;
 | 
			
		||||
@@ -80,32 +78,32 @@ public class SmsCodeServiceImpl implements SmsCodeService {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void useSmsCode(SmsCodeUseReqDTO reqDTO) {
 | 
			
		||||
        // 检测验证码是否有效
 | 
			
		||||
        SmsCodeDO lastSmsCode = this.checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
 | 
			
		||||
        SmsCodeDO lastSmsCode = validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
 | 
			
		||||
        // 使用验证码
 | 
			
		||||
        smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId())
 | 
			
		||||
                .used(true).usedTime(LocalDateTime.now()).usedIp(reqDTO.getUsedIp()).build());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
 | 
			
		||||
        checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
 | 
			
		||||
    public void validateSmsCode(SmsCodeValidateReqDTO reqDTO) {
 | 
			
		||||
        validateSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) {
 | 
			
		||||
    private SmsCodeDO validateSmsCode0(String mobile, String code, Integer scene) {
 | 
			
		||||
        // 校验验证码
 | 
			
		||||
        SmsCodeDO lastSmsCode = smsCodeMapper.selectLastByMobile(mobile, code, scene);
 | 
			
		||||
        // 若验证码不存在,抛出异常
 | 
			
		||||
        if (lastSmsCode == null) {
 | 
			
		||||
            throw ServiceExceptionUtil.exception(SMS_CODE_NOT_FOUND);
 | 
			
		||||
            throw exception(SMS_CODE_NOT_FOUND);
 | 
			
		||||
        }
 | 
			
		||||
        // 超过时间
 | 
			
		||||
        if (LocalDateTimeUtil.between(lastSmsCode.getCreateTime(), LocalDateTime.now()).toMillis()
 | 
			
		||||
                >= smsCodeProperties.getExpireTimes().toMillis()) { // 验证码已过期
 | 
			
		||||
            throw ServiceExceptionUtil.exception(SMS_CODE_EXPIRED);
 | 
			
		||||
            throw exception(SMS_CODE_EXPIRED);
 | 
			
		||||
        }
 | 
			
		||||
        // 判断验证码是否已被使用
 | 
			
		||||
        if (Boolean.TRUE.equals(lastSmsCode.getUsed())) {
 | 
			
		||||
            throw ServiceExceptionUtil.exception(SMS_CODE_USED);
 | 
			
		||||
            throw exception(SMS_CODE_USED);
 | 
			
		||||
        }
 | 
			
		||||
        return lastSmsCode;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user