From 447f6cdd39a2266acbe9833e775b2e099ac5571a Mon Sep 17 00:00:00 2001 From: Shenlijun Date: Tue, 30 Jun 2026 20:54:38 +0800 Subject: [PATCH] =?UTF-8?q?update=20CaptchaController.smsCode=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=9F=AD=E4=BF=A1=E5=BC=80=E5=85=B3=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=20emailCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/CaptchaController.java | 19 ++++++++-- .../org/dromara/test/CaptchaSmsCodeTest.java | 35 +++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 ruoyi-admin/src/test/java/org/dromara/test/CaptchaSmsCodeTest.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java index 2586addab..09d2f90ac 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -22,6 +22,7 @@ import org.dromara.common.ratelimiter.enums.LimitType; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.web.core.WaveAndCircleCaptcha; import org.dromara.common.web.config.properties.CaptchaProperties; +import org.dromara.common.sms.config.properties.SmsProperties; import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.core.factory.SmsFactory; @@ -51,15 +52,28 @@ public class CaptchaController { private final CaptchaProperties captchaProperties; private final MailProperties mailProperties; + private final SmsProperties smsProperties; /** * 短信验证码 * * @param phonenumber 用户手机号 */ - @RateLimiter(key = "#phonenumber", time = 60, count = 1) @GetMapping("/resource/sms/code") public R smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { + if (!smsProperties.getEnabled()) { + return R.fail("当前系统没有开启短信功能!"); + } + SpringUtils.getAopProxy(this).smsCodeImpl(phonenumber); + return R.ok(); + } + + /** + * 短信验证码 + * 独立方法避免短信功能关闭之后仍然走限流 + */ + @RateLimiter(key = "#phonenumber", time = 60, count = 1) + public void smsCodeImpl(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; String code = RandomUtil.randomNumbers(4); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); @@ -71,9 +85,8 @@ public class CaptchaController { SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); if (!smsResponse.isSuccess()) { log.error("验证码短信发送异常 => {}", smsResponse); - return R.fail(smsResponse.getData().toString()); + throw new ServiceException(smsResponse.getData().toString()); } - return R.ok(); } /** diff --git a/ruoyi-admin/src/test/java/org/dromara/test/CaptchaSmsCodeTest.java b/ruoyi-admin/src/test/java/org/dromara/test/CaptchaSmsCodeTest.java new file mode 100644 index 000000000..fd76cc3ae --- /dev/null +++ b/ruoyi-admin/src/test/java/org/dromara/test/CaptchaSmsCodeTest.java @@ -0,0 +1,35 @@ +package org.dromara.test; + +import org.dromara.common.core.domain.R; +import org.dromara.common.mail.config.properties.MailProperties; +import org.dromara.common.sms.config.properties.SmsProperties; +import org.dromara.common.web.config.properties.CaptchaProperties; +import org.dromara.web.controller.CaptchaController; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; + +/** + * CaptchaController.smsCode 关闭路径单元测试 + *

直接构造 Controller 调用,不启动 Spring 上下文(无需 MySQL/Redis) + */ +@DisplayName("短信验证码开关单元测试") +public class CaptchaSmsCodeTest { + + @Tag("dev") + @DisplayName("sms.enabled=false 时 smsCode 返回未开启提示且不发信") + @Test + public void shouldReturnFailWhenSmsDisabled() { + SmsProperties smsProperties = new SmsProperties(); + smsProperties.setEnabled(false); + // 字段声明顺序决定构造参数顺序:captchaProperties, mailProperties, smsProperties + CaptchaController controller = new CaptchaController( + new CaptchaProperties(), new MailProperties(), smsProperties); + + R result = controller.smsCode("13800000000"); + + Assertions.assertEquals(R.FAIL, result.getCode()); + Assertions.assertEquals("当前系统没有开启短信功能!", result.getMsg()); + } +}