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(); 
 | 
    } 
 | 
  
 | 
} 
 |