package com.dy.pipIrrApp.captcha; import com.dy.pipIrrApp.captcha.dto.CaptchaDomain; import com.dy.pipIrrGlobal.daoBa.BaCaptchaMapper; import com.dy.pipIrrGlobal.pojoBa.BaCaptcha; import com.google.code.kaptcha.Producer; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.imageio.ImageIO; import java.io.ByteArrayOutputStream; import java.util.Base64; import java.util.UUID; /** * @author ZhuBaoMin * @date 2024-09-11 13:46 * @LastEditTime 2024-09-11 13:46 * @Description */ @Slf4j @Service public class CaptchaSV { @Autowired private BaCaptchaMapper baCaptchaMapper; @Resource(name = "captchaProducer") private Producer captchaProducer; @Resource(name = "captchaProducerMathOne") private Producer captchaProducerMathOne; @Resource(name = "captchaProducerMathTwo") private Producer captchaProducerMathTwo; private static final String TYPE_CHAR = "char"; private static final String TYPE_MATH_ONE = "math"; private static final String TYPE_MATH_TWO = "math2"; /** * Kaptcha生成验证码实体 * @param type,char - 字符(缺省) | math - 一位数算式 | math2 - 两位数算式 * @return */ public CaptchaDomain createGoogleCaptcha(String type) { // 定义验证码实体 CaptchaDomain captchaDomain = new CaptchaDomain(); // 一位数加减乘除 if (TYPE_MATH_ONE.equals(type)) { // 生成文本 String producerText = captchaProducerMathOne.createText(); // 设置验证码字符 captchaDomain.setText(producerText.substring(0, producerText.indexOf("@"))); // 设置验证码答案码 captchaDomain.setCode(producerText.substring(producerText.indexOf("@") + 1)); // 设置验证码图片 captchaDomain.setImage(captchaProducerMathOne.createImage(captchaDomain.getText())); } // 两位数加减乘除 else if (TYPE_MATH_TWO.equals(type)) { String producerText = captchaProducerMathTwo.createText(); captchaDomain.setText(producerText.substring(0, producerText.indexOf("@"))); captchaDomain.setCode(producerText.substring(producerText.indexOf("@") + 1)); captchaDomain.setImage(captchaProducerMathTwo.createImage(captchaDomain.getText())); } // 缺省情况:字符 else { captchaDomain.setText(captchaProducer.createText()); captchaDomain.setCode(captchaDomain.getText()); captchaDomain.setImage(captchaProducer.createImage(captchaDomain.getText())); } // 生成base64 try { // 定义字节数组输出流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 将图像以 jpg 的形式,写到字节数组输出流中 ImageIO.write(captchaDomain.getImage(), "jpg", outputStream); // 写入base64格式 captchaDomain.setBase64("data:image/jpg;base64," + Base64.getEncoder().encodeToString(outputStream.toByteArray())); // 写入唯一Token captchaDomain.setToken(UUID.randomUUID().toString()); // 返回结果 return captchaDomain; } catch (Exception e) { System.out.println(e.getMessage()); return null; } } /** * 添加图片验证记录 * @param po * @return */ public Long addCaptcha(BaCaptcha po) { baCaptchaMapper.insert(po); return po.getId(); } }