diff --git a/eladmin-common/pom.xml b/eladmin-common/pom.xml index 82f6534..1f97b5c 100644 --- a/eladmin-common/pom.xml +++ b/eladmin-common/pom.xml @@ -22,5 +22,17 @@ hutool-all ${hutool.version} + + + com.google.zxing + core + 3.3.0 + + + com.google.zxing + javase + 3.3.0 + + - \ No newline at end of file + diff --git a/eladmin-common/src/main/java/me/zhengjie/utils/QRCodeUtil.java b/eladmin-common/src/main/java/me/zhengjie/utils/QRCodeUtil.java new file mode 100644 index 0000000..526e3ca --- /dev/null +++ b/eladmin-common/src/main/java/me/zhengjie/utils/QRCodeUtil.java @@ -0,0 +1,323 @@ +package me.zhengjie.utils; + +import cn.hutool.crypto.digest.DigestUtil; +import cn.hutool.extra.qrcode.BufferedImageLuminanceSource; +import com.google.zxing.*; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.common.HybridBinarizer; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.OutputStream; +import java.util.Hashtable; +import java.util.Random; + +/** + * @author Enzo + * @date : 2022/11/18 + */ +public class QRCodeUtil { + private static final String CHARSET = "utf-8"; + private static final String FORMAT_NAME = "JPG"; + // 二维码尺寸 + private static final int QRCODE_SIZE = 300; + // LOGO宽度 + private static final int WIDTH = 60; + // LOGO高度 + private static final int HEIGHT = 60; + + private static BufferedImage createImage(String content, String imgPath, + boolean needCompress) throws Exception { + Hashtable hints = new Hashtable<>(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, CHARSET); + hints.put(EncodeHintType.MARGIN, 1); + BitMatrix bitMatrix = new MultiFormatWriter().encode(content, + BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints); + int width = bitMatrix.getWidth(); + int height = bitMatrix.getHeight(); + BufferedImage image = new BufferedImage(width, height, + BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 + : 0xFFFFFFFF); + } + } + if (imgPath == null || "".equals(imgPath)) { + return image; + } + // 插入图片 + QRCodeUtil.insertImage(image, imgPath, needCompress); + return image; + } + + /** + * 插入LOGO + * + * @param source + * 二维码图片 + * @param imgPath + * LOGO图片地址 + * @param needCompress + * 是否压缩 + * @throws Exception + */ + private static void insertImage(BufferedImage source, String imgPath, + boolean needCompress) throws Exception { + File file = new File(imgPath); + if (!file.exists()) { + System.err.println(""+imgPath+" 该文件不存在!"); + return; + } + Image src = ImageIO.read(new File(imgPath)); + int width = src.getWidth(null); + int height = src.getHeight(null); + if (needCompress) { // 压缩LOGO + if (width > WIDTH) { + width = WIDTH; + } + if (height > HEIGHT) { + height = HEIGHT; + } + Image image = src.getScaledInstance(width, height, + Image.SCALE_SMOOTH); + BufferedImage tag = new BufferedImage(width, height, + BufferedImage.TYPE_INT_RGB); + Graphics g = tag.getGraphics(); + g.drawImage(image, 0, 0, null); // 绘制缩小后的图 + g.dispose(); + src = image; + } + // 插入LOGO + Graphics2D graph = source.createGraphics(); + int x = (QRCODE_SIZE - width) / 2; + int y = (QRCODE_SIZE - height) / 2; + graph.drawImage(src, x, y, width, height, null); + Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); + graph.setStroke(new BasicStroke(3f)); + graph.draw(shape); + graph.dispose(); + } + + /** + * 生成二维码(内嵌LOGO) + * + * @param content + * 内容 + * @param imgPath + * LOGO地址 + * @param destPath + * 存放目录 + * @param needCompress + * 是否压缩LOGO + * @throws Exception + */ + public static String encode(String content, String imgPath, String destPath, + boolean needCompress) throws Exception { + BufferedImage image = QRCodeUtil.createImage(content, imgPath, + needCompress); + mkdirs(destPath); + String file = new Random().nextInt(99999999)+".jpg"; + ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file)); + return destPath+"/"+file; + } + + /** + * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) + * @param destPath 存放目录 + */ + public static void mkdirs(String destPath) { + File file =new File(destPath); + //当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) + if (!file.exists() && !file.isDirectory()) { + file.mkdirs(); + } + } + + /** + * 生成二维码(内嵌LOGO) + * + * @param content + * 内容 + * @param imgPath + * LOGO地址 + * @param destPath + * 存储地址 + * @throws Exception + */ + public static void encode(String content, String imgPath, String destPath) + throws Exception { + QRCodeUtil.encode(content, imgPath, destPath, false); + } + + /** + * 生成二维码 + * + * @param content + * 内容 + * @param destPath + * 存储地址 + * @param needCompress + * 是否压缩LOGO + * @throws Exception + */ + public static void encode(String content, String destPath, + boolean needCompress) throws Exception { + QRCodeUtil.encode(content, null, destPath, needCompress); + } + + /** + * 生成二维码 + * + * @param content + * 内容 + * @param destPath + * 存储地址 + * @throws Exception + */ + public static void encode(String content, String destPath) throws Exception { + QRCodeUtil.encode(content, null, destPath, false); + } + + /** + * 生成二维码(内嵌LOGO) + * + * @param content + * 内容 + * @param imgPath + * LOGO地址 + * @param output + * 输出流 + * @param needCompress + * 是否压缩LOGO + * @throws Exception + */ + public static void encode(String content, String imgPath, + OutputStream output, boolean needCompress) throws Exception { + BufferedImage image = QRCodeUtil.createImage(content, imgPath, + needCompress); + ImageIO.write(image, FORMAT_NAME, output); + } + + /** + * 生成二维码 + * + * @param content + * 内容 + * @param output + * 输出流 + * @throws Exception + */ + public static void encode(String content, OutputStream output) + throws Exception { + QRCodeUtil.encode(content, null, output, false); + } + + /** + * 解析二维码 + * + * @param file + * 二维码图片 + * @return + * @throws Exception + */ + public static String decode(File file) throws Exception { + BufferedImage image; + image = ImageIO.read(file); + if (image == null) { + return null; + } + BufferedImageLuminanceSource source = new BufferedImageLuminanceSource( + image); + BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); + Result result; + Hashtable hints = new Hashtable(); + hints.put(DecodeHintType.CHARACTER_SET, CHARSET); + result = new MultiFormatReader().decode(bitmap, hints); + String resultStr = result.getText(); + return resultStr; + } + + /** + * 解析二维码 + * + * @param path + * 二维码图片地址 + * @return + * @throws Exception + */ + public static String decode(String path) throws Exception { + return QRCodeUtil.decode(new File(path)); + } + + /** + * + * @param content + * @param imgPath + * @param destPath + * @param localUrl 当前环境的域名或者ip地址 + * @param needCompress + * @return + * @throws Exception + */ + public static String encode(String content, String imgPath, String destPath,String localUrl, + boolean needCompress) throws Exception { + BufferedImage image = QRCodeUtil.createImage(content, imgPath, + needCompress); + mkdirs(destPath); + String file = new Random().nextInt(99999999)+".jpg"; + ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file)); + return localUrl+file; + } + + public static String encodeDZ(String content, String imgPath, String destPath,String localUrl,int length,int width, + boolean needCompress) throws Exception { + BufferedImage image = QRCodeUtil.createImageDZ(content, imgPath,length,width, + needCompress); + mkdirs(destPath); + String file = new Random().nextInt(99999999)+".jpg"; + ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file)); + return localUrl+file; + } + + private static BufferedImage createImageDZ(String content, String imgPath,int newlength,int newWidth, + boolean needCompress) throws Exception { + Hashtable hints = new Hashtable(); + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + hints.put(EncodeHintType.CHARACTER_SET, CHARSET); + hints.put(EncodeHintType.MARGIN, 1); + BitMatrix bitMatrix = new MultiFormatWriter().encode(content, + BarcodeFormat.QR_CODE, newlength, newWidth, hints); + int width = bitMatrix.getWidth(); + int height = bitMatrix.getHeight(); + BufferedImage image = new BufferedImage(width, height, + BufferedImage.TYPE_INT_RGB); + for (int x = 0; x < width; x++) { + for (int y = 0; y < height; y++) { + image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 + : 0xFFFFFFFF); + } + } + if (imgPath == null || "".equals(imgPath)) { + return image; + } + // 插入图片 + QRCodeUtil.insertImage(image, imgPath, needCompress); + return image; + } + + public static void main(String[] args) { + + String md5Hex1 = DigestUtil.md5Hex("13586541001"); + System.out.println(md5Hex1); + + System.out.println("577270def616ae1da497bbbb5bc0d28d".length()); + } + +} + diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/taskrecord/task/SendRecordTask.java b/eladmin-system/src/main/java/me/zhengjie/modules/taskrecord/task/SendRecordTask.java index 0c1ad79..d891c48 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/taskrecord/task/SendRecordTask.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/taskrecord/task/SendRecordTask.java @@ -46,7 +46,7 @@ public class SendRecordTask { /** * 每次发送条数限制 */ - private static final int SEND_LIMIT = 5000; + private static final int SEND_LIMIT = 1000; /** * 完成发送任务标识 diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/tmpfilerecord/domain/TempFileRecord.java b/eladmin-system/src/main/java/me/zhengjie/modules/tmpfilerecord/domain/TempFileRecord.java index 252afd3..8b6a0e2 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/tmpfilerecord/domain/TempFileRecord.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/tmpfilerecord/domain/TempFileRecord.java @@ -80,4 +80,4 @@ public class TempFileRecord implements Serializable { public void copy(TempFileRecord source) { BeanUtil.copyProperties(source, this, CopyOptions.create().setIgnoreNullValue(true)); } -} \ No newline at end of file +} diff --git a/eladmin-system/src/main/resources/config/application-prod.yml b/eladmin-system/src/main/resources/config/application-prod.yml index ba3b67a..838518a 100644 --- a/eladmin-system/src/main/resources/config/application-prod.yml +++ b/eladmin-system/src/main/resources/config/application-prod.yml @@ -128,9 +128,9 @@ file: req: db: # 设置给大坝回传号码的地址 - host: http://api.hzdaba.cn/aibot + host: https://api.hzdaba.cn/aibot url: /api/activity/addclient - cluster: http://ai.hzdaba.cn/api/activity/addclient + cluster: https://ai.hzdaba.cn/api/activity/addclient # 线程池的相关配置 produce: task: diff --git a/eladmin-system/src/test/java/me/zhengjie/TempTest.java b/eladmin-system/src/test/java/me/zhengjie/TempTest.java index 124f0c6..7fa624f 100644 --- a/eladmin-system/src/test/java/me/zhengjie/TempTest.java +++ b/eladmin-system/src/test/java/me/zhengjie/TempTest.java @@ -1,11 +1,7 @@ package me.zhengjie; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.date.DateTime; -import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.JSON; import me.zhengjie.modules.abmessage.domain.AbMessage; -import me.zhengjie.utils.DateUtil; import me.zhengjie.utils.FileUtil; import me.zhengjie.utils.StringUtils; import org.junit.Test; diff --git a/eladmin-tools/src/main/java/me/zhengjie/rest/EmailController.java b/eladmin-tools/src/main/java/me/zhengjie/rest/EmailController.java index 68528b2..2357066 100644 --- a/eladmin-tools/src/main/java/me/zhengjie/rest/EmailController.java +++ b/eladmin-tools/src/main/java/me/zhengjie/rest/EmailController.java @@ -15,27 +15,17 @@ */ package me.zhengjie.rest; -import cn.hutool.json.JSON; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import me.zhengjie.annotation.Log; -import me.zhengjie.common.http.CommonResponse; -import me.zhengjie.common.http.ResponseCode; -import me.zhengjie.common.json.OnceLinkMsgJsonContent; -import me.zhengjie.domain.vo.EmailVo; import me.zhengjie.domain.EmailConfig; +import me.zhengjie.domain.vo.EmailVo; import me.zhengjie.service.EmailService; -import me.zhengjie.utils.StringUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletResponse; /** * 发送邮件