From 2c35758f777fd3d52b0aecadb016f4ec7ae352f6 Mon Sep 17 00:00:00 2001
From: Administrator <admin>
Date: Tue, 24 Aug 2021 11:51:10 +0800
Subject: [PATCH] 二维码生成
---
src/main/java/org/springblade/common/utils/QRCodeUtil.java | 215 +++++++++++++++++++++++++++++++++++++++++++
src/main/java/org/springblade/common/constant/FtpConstant.java | 16 +-
pom.xml | 11 ++
src/main/java/org/springblade/modules/qrcode/QrCodeController.java | 26 +++++
src/main/resources/application.yml | 1
5 files changed, 261 insertions(+), 8 deletions(-)
diff --git a/pom.xml b/pom.xml
index c90523e..04e5fda 100644
--- a/pom.xml
+++ b/pom.xml
@@ -234,6 +234,17 @@
<artifactId>commons-net</artifactId>
<version>3.1</version>
</dependency>
+ <!-- 二维码生成 -->
+ <dependency>
+ <groupId>com.google.zxing</groupId>
+ <artifactId>core</artifactId>
+ <version>3.3.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.zxing</groupId>
+ <artifactId>javase</artifactId>
+ <version>3.3.3</version>
+ </dependency>
</dependencies>
<build>
diff --git a/src/main/java/org/springblade/common/constant/FtpConstant.java b/src/main/java/org/springblade/common/constant/FtpConstant.java
index 0329beb..91447df 100644
--- a/src/main/java/org/springblade/common/constant/FtpConstant.java
+++ b/src/main/java/org/springblade/common/constant/FtpConstant.java
@@ -8,22 +8,22 @@
/**
* sql connect
*/
- String sql_connect_dev = "jdbc:mysql://223.82.109.183:2083/zhbaw";
+// String sql_connect_dev = "jdbc:mysql://223.82.109.183:2083/zhbaw";
/**
* sql connect
*/
-// String sql_connect_dev = "jdbc:mysql://localhost:2083/zhbaw";
+ String sql_connect_dev = "jdbc:mysql://localhost:2083/zhbaw";
/**
* ftp服务器IP地址
*/
- String ftpHost_dev = "192.168.0.105";
+// String ftpHost_dev = "192.168.0.105";
/**
* ftp服务器IP地址
*/
-// String ftpHost_dev = "172.19.1.30";
+ String ftpHost_dev = "172.19.1.30";
/**
* ftp服务器端口
@@ -44,12 +44,12 @@
/**
* ftp服务器路径
*/
-// String ftpPath = "yly/anbao/";
- String ftpPath = "anbao/";
+ String ftpPath = "yly/anbao/";
+// String ftpPath = "anbao/";
/**
* 本地路径
*/
-// String localPath = "/home/zhongsong/anbao/";
- String localPath = "D:\\anbao\\";
+ String localPath = "/home/zhongsong/anbao/";
+// String localPath = "D:\\anbao\\";
}
diff --git a/src/main/java/org/springblade/common/utils/QRCodeUtil.java b/src/main/java/org/springblade/common/utils/QRCodeUtil.java
new file mode 100644
index 0000000..fe98c12
--- /dev/null
+++ b/src/main/java/org/springblade/common/utils/QRCodeUtil.java
@@ -0,0 +1,215 @@
+package org.springblade.common.utils;
+
+import com.github.xiaoymin.knife4j.core.util.StrUtil;
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.itextpdf.xmp.impl.Base64;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import java.awt.*;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.HashMap;
+
+import static org.bouncycastle.asn1.x500.style.RFC4519Style.cn;
+
+/**
+ * <p>QRCodeUtil</p>
+ *
+ * @author lvhaosir6
+ * @version 1.0.0
+ * @date 2020/7/8
+ * @import_date 2021-8-24
+ */
+@Slf4j
+@UtilityClass
+public class QRCodeUtil {
+ /**
+ * 默认宽度
+ */
+ private static final Integer WIDTH = 140;
+ /**
+ * 默认高度
+ */
+ private static final Integer HEIGHT = 140;
+
+ /**
+ * LOGO 默认宽度
+ */
+ private static final Integer LOGO_WIDTH = 22;
+ /**
+ * LOGO 默认高度
+ */
+ private static final Integer LOGO_HEIGHT = 22;
+
+ /**
+ * 图片格式
+ */
+ private static final String IMAGE_FORMAT = "png";
+ private static final String CHARSET = "utf-8";
+ /**
+ * 原生转码前面没有 data:image/png;base64 这些字段,返回给前端是无法被解析
+ */
+ private static final String BASE64_IMAGE = "data:image/png;base64,%s";
+
+ /**
+ * 生成二维码,使用默认尺寸
+ *
+ * @param content 内容
+ * @return
+ */
+ public String getBase64QRCode(String content) {
+ return getBase64Image(content, WIDTH, HEIGHT, null, null, null);
+ }
+
+ /**
+ * 生成二维码,使用默认尺寸二维码,插入默认尺寸logo
+ *
+ * @param content 内容
+ * @param logoUrl logo地址
+ * @return
+ */
+ public String getBase64QRCode(String content, String logoUrl) {
+ return getBase64Image(content, WIDTH, HEIGHT, logoUrl, LOGO_WIDTH, LOGO_HEIGHT);
+ }
+
+ /**
+ * 生成二维码
+ *
+ * @param content 内容
+ * @param width 二维码宽度
+ * @param height 二维码高度
+ * @param logoUrl logo 在线地址
+ * @param logoWidth logo 宽度
+ * @param logoHeight logo 高度
+ * @return
+ */
+ public String getBase64QRCode(String content, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) {
+ return getBase64Image(content, width, height, logoUrl, logoWidth, logoHeight);
+ }
+
+ private String getBase64Image(String content, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) {
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ BufferedImage bufferedImage = crateQRCode(content, width, height, logoUrl, logoWidth, logoHeight);
+ try {
+ ImageIO.write(bufferedImage, IMAGE_FORMAT, os);
+ } catch (IOException e) {
+ log.error("[生成二维码,错误{}]", e);
+ }
+ // 转出即可直接使用
+ return String.format(BASE64_IMAGE, Base64.encode(os.toByteArray()));
+ }
+
+
+ /**
+ * 生成二维码
+ *
+ * @param content 内容
+ * @param width 二维码宽度
+ * @param height 二维码高度
+ * @param logoUrl logo 在线地址
+ * @param logoWidth logo 宽度
+ * @param logoHeight logo 高度
+ * @return
+ */
+ private BufferedImage crateQRCode(String content, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) {
+ if (StrUtil.isNotBlank(content)) {
+ ServletOutputStream stream = null;
+ HashMap<EncodeHintType, Comparable> hints = new HashMap<>(4);
+ // 指定字符编码为utf-8
+ hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+ // 指定二维码的纠错等级为中级
+ hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
+ // 设置图片的边距
+ hints.put(EncodeHintType.MARGIN, 2);
+ try {
+ QRCodeWriter writer = new QRCodeWriter();
+ BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
+ BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ for (int x = 0; x < width; x++) {
+ for (int y = 0; y < height; y++) {
+ bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
+ }
+ }
+ if (StrUtil.isNotBlank(logoUrl)) {
+ insertLogo(bufferedImage, width, height, logoUrl, logoWidth, logoHeight);
+ }
+ return bufferedImage;
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (stream != null) {
+ try {
+ stream.flush();
+ stream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 二维码插入logo
+ *
+ * @param source 二维码
+ * @param width 二维码宽度
+ * @param height 二维码高度
+ * @param logoUrl logo 在线地址
+ * @param logoWidth logo 宽度
+ * @param logoHeight logo 高度
+ * @throws Exception
+ */
+ private void insertLogo(BufferedImage source, Integer width, Integer height, String logoUrl, Integer logoWidth, Integer logoHeight) throws Exception {
+ // logo 源可为 File/InputStream/URL
+ Image src = ImageIO.read(new URL(logoUrl));
+ // 插入LOGO
+ Graphics2D graph = source.createGraphics();
+ int x = (width - logoWidth) / 2;
+ int y = (height - logoHeight) / 2;
+ graph.drawImage(src, x, y, logoWidth, logoHeight, null);
+ Shape shape = new RoundRectangle2D.Float(x, y, logoWidth, logoHeight, 6, 6);
+ graph.setStroke(new BasicStroke(3f));
+ graph.draw(shape);
+ graph.dispose();
+ }
+
+
+ /**
+ * 获取二维码
+ *
+ * @param content 内容
+ * @param output 输出流
+ * @throws IOException
+ */
+ public void getQRCode(String content, OutputStream output) throws IOException {
+ BufferedImage image = crateQRCode(content, WIDTH, HEIGHT, null, null, null);
+ ImageIO.write(image, IMAGE_FORMAT, output);
+ }
+
+ /**
+ * 获取二维码
+ *
+ * @param content 内容
+ * @param logoUrl logo资源
+ * @param output 输出流
+ * @throws Exception
+ */
+ public void getQRCode(String content, String logoUrl, OutputStream output) throws Exception {
+ BufferedImage image = crateQRCode(content, WIDTH, HEIGHT, logoUrl, LOGO_WIDTH, LOGO_HEIGHT);
+ ImageIO.write(image, IMAGE_FORMAT, output);
+ }
+
+}
diff --git a/src/main/java/org/springblade/modules/qrcode/QrCodeController.java b/src/main/java/org/springblade/modules/qrcode/QrCodeController.java
new file mode 100644
index 0000000..d01b7c2
--- /dev/null
+++ b/src/main/java/org/springblade/modules/qrcode/QrCodeController.java
@@ -0,0 +1,26 @@
+package org.springblade.modules.qrcode;
+
+import org.springblade.common.utils.QRCodeUtil;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author zhongrj
+ * @date 2021-08-24
+ * 二维码生成
+ */
+@RestController
+@RequestMapping("/qrCode")
+public class QrCodeController {
+
+
+ @GetMapping("/getQrCode")
+ public R getQrCode(String content){
+ //获取二维码
+ String qrCode = QRCodeUtil.getBase64QRCode(content);
+ return R.data(qrCode);
+ }
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index cc56ee9..75bfb7e 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -212,6 +212,7 @@
- /blade-system/**
- /blade-resource/**
- /liveLocation/**
+ - /qrCode/**
#授权认证配置
auth:
- method: ALL
--
Gitblit v1.9.3