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