From 90e8d3bdac056cf38e59abc5cced5da533262cbe Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 2 Jul 2025 09:36:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9B=E5=88=99=E8=BF=90=E7=AE=97=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E6=94=AF=E6=8C=81=E4=B8=8D=E7=94=9F=E6=88=90=E8=B4=9F?= =?UTF-8?q?=E6=95=B0=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../captcha/generator/MathGenerator.java | 45 ++++++++++++++----- .../v7/swing/captcha/GeneratorTest.java | 8 ++++ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/hutool-swing/src/main/java/cn/hutool/v7/swing/captcha/generator/MathGenerator.java b/hutool-swing/src/main/java/cn/hutool/v7/swing/captcha/generator/MathGenerator.java index 452723af3..ea0ca58b2 100644 --- a/hutool-swing/src/main/java/cn/hutool/v7/swing/captcha/generator/MathGenerator.java +++ b/hutool-swing/src/main/java/cn/hutool/v7/swing/captcha/generator/MathGenerator.java @@ -18,8 +18,10 @@ package cn.hutool.v7.swing.captcha.generator; import cn.hutool.v7.core.math.Calculator; import cn.hutool.v7.core.text.CharUtil; -import cn.hutool.v7.core.util.RandomUtil; import cn.hutool.v7.core.text.StrUtil; +import cn.hutool.v7.core.util.RandomUtil; + +import java.io.Serial; /** * 数字计算验证码生成器 @@ -28,42 +30,63 @@ import cn.hutool.v7.core.text.StrUtil; * @since 4.1.2 */ public class MathGenerator implements CodeGenerator { + @Serial private static final long serialVersionUID = -5514819971774091076L; private static final String operators = "+-*"; - /** 参与计算数字最大长度 */ + /** + * 参与计算数字最大长度 + */ private final int numberLength; + /** + * 计算结果是否允许负数 + */ + private final boolean resultHasNegativeNumber; /** * 构造 */ public MathGenerator() { - this(2); + this(2, false); } /** * 构造 * - * @param numberLength 参与计算最大数字位数 + * @param numberLength 参与计算最大数字位数 + * @param resultHasNegativeNumber 结果是否允许负数 */ - public MathGenerator(final int numberLength) { + public MathGenerator(final int numberLength, final boolean resultHasNegativeNumber) { this.numberLength = numberLength; + this.resultHasNegativeNumber = resultHasNegativeNumber; } @Override public String generate() { final int limit = getLimit(); - String number1 = Integer.toString(RandomUtil.randomInt(limit)); - String number2 = Integer.toString(RandomUtil.randomInt(limit)); + final char operator = RandomUtil.randomChar(operators); + final int numberInt1; + final int numberInt2; + numberInt1 = RandomUtil.randomInt(limit); + // 如果禁止了结果有负数,且计算方式正好计算为减法,需要第二个数小于第一个数 + if (!resultHasNegativeNumber && CharUtil.equals('-',operator,false)) { + //如果第一个数为0,第二个数必须为0,随机[0,0)的数字会报错 + numberInt2 = numberInt1 == 0 ? 0 : RandomUtil.randomInt(0, numberInt1); + } else { + numberInt2 = RandomUtil.randomInt(limit); + } + String number1 = Integer.toString(numberInt1); + String number2 = Integer.toString(numberInt2); + number1 = StrUtil.padAfter(number1, this.numberLength, CharUtil.SPACE); number2 = StrUtil.padAfter(number2, this.numberLength, CharUtil.SPACE); return StrUtil.builder()// - .append(number1)// - .append(RandomUtil.randomChar(operators))// - .append(number2)// - .append('=').toString(); + .append(number1)// + .append(operator)// + .append(number2)// + .append('=').toString(); } @Override diff --git a/hutool-swing/src/test/java/cn/hutool/v7/swing/captcha/GeneratorTest.java b/hutool-swing/src/test/java/cn/hutool/v7/swing/captcha/GeneratorTest.java index c1f4f44e0..14ae7f8f0 100644 --- a/hutool-swing/src/test/java/cn/hutool/v7/swing/captcha/GeneratorTest.java +++ b/hutool-swing/src/test/java/cn/hutool/v7/swing/captcha/GeneratorTest.java @@ -16,7 +16,9 @@ package cn.hutool.v7.swing.captcha; +import cn.hutool.v7.core.math.Calculator; import cn.hutool.v7.swing.captcha.generator.MathGenerator; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class GeneratorTest { @@ -27,5 +29,11 @@ public class GeneratorTest { for (int i = 0; i < 1000; i++) { mathGenerator.verify(mathGenerator.generate(), "0"); } + + final MathGenerator mathGenerator1 = new MathGenerator(2, false); + for (int i = 0; i < 1000; i++) { + final String generate = mathGenerator1.generate(); + Assertions.assertTrue(Calculator.conversion(generate) >= 0); + } } }