package com.dl.common.captcha; import cn.hutool.captcha.generator.CodeGenerator; import cn.hutool.core.math.Calculator; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.RandomUtil; import com.dl.common.utils.StringUtils; /** * 无符号计算生成器 * * @author Lion Li */ public class UnsignedMathGenerator implements CodeGenerator { private static final long serialVersionUID = -5514819971774091076L; private static final String OPERATORS = "+-*"; /** * 参与计算数字最大长度 */ private final int numberLength; /** * 构造 */ public UnsignedMathGenerator() { this(2); } /** * 构造 * * @param numberLength 参与计算最大数字位数 */ public UnsignedMathGenerator(int numberLength) { this.numberLength = numberLength; } @Override public String generate() { final int limit = getLimit(); int a = RandomUtil.randomInt(limit); int b = RandomUtil.randomInt(limit); String max = Integer.toString(Math.max(a,b)); String min = Integer.toString(Math.min(a,b)); max = StringUtils.rightPad(max, this.numberLength, CharUtil.SPACE); min = StringUtils.rightPad(min, this.numberLength, CharUtil.SPACE); return max + RandomUtil.randomChar(OPERATORS) + min + '='; } @Override public boolean verify(String code, String userInputCode) { int result; try { result = Integer.parseInt(userInputCode); } catch (NumberFormatException e) { // 用户输入非数字 return false; } final int calculateResult = (int) Calculator.conversion(code); return result == calculateResult; } /** * 获取验证码长度 * * @return 验证码长度 */ public int getLength() { return this.numberLength * 2 + 2; } /** * 根据长度获取参与计算数字最大值 * * @return 最大值 */ private int getLimit() { return Integer.parseInt("1" + StringUtils.repeat('0', this.numberLength)); } }