12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- package com.ruoyi.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.ruoyi.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));
- }
- }
|