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;
/**
* 发送邮件