From 25c8b9a4f52718e8909cee652d58fd6cfd2f4cc3 Mon Sep 17 00:00:00 2001 From: zhibing.pu <393733352@qq.com> Date: 星期一, 26 八月 2024 17:09:50 +0800 Subject: [PATCH] 完善二维码下载功能 --- ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/QRCodeUtils.java | 268 ++++++++++++++++++++++++++++++++++++++++++++ ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java | 2 ruoyi-service/ruoyi-chargingPile/pom.xml | 12 + ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java | 26 ++++ 4 files changed, 305 insertions(+), 3 deletions(-) diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java index bac3898..588cd20 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java @@ -35,7 +35,7 @@ loginLog.setUserId(userId); loginLog.setUsername(username); loginLog.setIpAddress(headerData.get("ip")); - loginLog.setAddress("");// todo 待完善 https://www.juhe.cn/docs/api/id/1 + loginLog.setAddress(""); loginLog.setBrowserType(headerData.get("browser")); loginLog.setOperatingSystem(headerData.get("os")); loginLog.setLoginTime(LocalDateTime.now()); diff --git a/ruoyi-service/ruoyi-chargingPile/pom.xml b/ruoyi-service/ruoyi-chargingPile/pom.xml index 75191c3..84c6e37 100644 --- a/ruoyi-service/ruoyi-chargingPile/pom.xml +++ b/ruoyi-service/ruoyi-chargingPile/pom.xml @@ -138,7 +138,17 @@ <version>3.3.0</version> <type>pom</type> </dependency> - + <!--二维码--> + <dependency> + <groupId>com.google.zxing</groupId> + <artifactId>core</artifactId> + <version>3.3.0</version> + </dependency> + <dependency> + <groupId>com.google.zxing</groupId> + <artifactId>javase</artifactId> + <version>3.3.0</version> + </dependency> </dependencies> <build> diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java index 334d16f..cc6f241 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java @@ -1,6 +1,7 @@ package com.ruoyi.chargingPile.controller; +import cn.hutool.core.io.FileUtil; import com.ruoyi.chargingPile.api.dto.TChargingGunDTO; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; @@ -8,6 +9,7 @@ import com.ruoyi.chargingPile.api.vo.TChargingGunVO; import com.ruoyi.chargingPile.service.TChargingGunService; import com.ruoyi.chargingPile.service.TChargingPileService; +import com.ruoyi.chargingPile.util.QRCodeUtils; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.BaseDelete; @@ -22,6 +24,9 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.FileInputStream; +import java.io.PrintWriter; +import java.net.URLEncoder; import java.util.Arrays; import java.util.List; @@ -125,7 +130,26 @@ @ApiOperation(tags = {"管理后台-充电桩信息"},value = "下载二维码") @GetMapping(value = "/downloadQRCode/{id}") public void downloadQRCode(@PathVariable Integer id, HttpServletResponse response){ - // todo 待完善 + try { + TChargingGun chargingGun = chargingGunService.getById(id); + response.setContentType("image/jpeg"); + response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(chargingGun.getName(), "UTF-8") + ".jpeg"); + String url = "https://www.baidu.com?id=" + id; + String filePath = ""; + QRCodeUtils.encode(url, filePath); + FileInputStream inputStream = new FileInputStream(filePath); + PrintWriter out = response.getWriter(); + int len = 0; + byte[] buf = new byte[1024]; + while ((len = inputStream.read(buf, 0, 1024)) != -1) { + out.println(buf); + } + out.flush(); + out.close(); + inputStream.close(); + }catch (Exception e){ + e.printStackTrace(); + } } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/QRCodeUtils.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/QRCodeUtils.java new file mode 100644 index 0000000..562b759 --- /dev/null +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/QRCodeUtils.java @@ -0,0 +1,268 @@ +package com.ruoyi.chargingPile.util; + +import com.google.zxing.*; +import com.google.zxing.client.j2se.BufferedImageLuminanceSource; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.common.HybridBinarizer; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +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; + +/** + * 二维码工具类 + */ +public class QRCodeUtils { + + private static Logger logger = LoggerFactory.getLogger(QRCodeUtils.class); + + 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<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>(); + 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; + } + // 插入图片 + QRCodeUtils.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()) { + logger.debug(""+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 = QRCodeUtils.createImage(content, imgPath, + needCompress); + mkdirs(destPath); + String file = new Random().nextInt(99999999)+".jpg"; + ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file)); + return file; + } + + /** + * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常) + * @date 2013-12-11 上午10:16:36 + * @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 { + QRCodeUtils.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 { + QRCodeUtils.encode(content, null, destPath, needCompress); + } + + /** + * 生成二维码 + * + * @param content + * 内容 + * @param destPath + * 存储地址 + * @throws Exception + */ + public static void encode(String content, String destPath) throws Exception { + QRCodeUtils.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 = QRCodeUtils.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 { + QRCodeUtils.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<DecodeHintType, Object> hints = new Hashtable<DecodeHintType, Object>(); + 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 QRCodeUtils.decode(new File(path)); + } + + public static void main(String[] args) throws Exception { + String text = "http://www.baidu.com"; //这里设置自定义网站url + String logoPath = "C:\\Users\\admin\\Desktop\\test\\test.jpg"; + String destPath = "C:\\Users\\admin\\Desktop\\test\\"; + logger.debug(QRCodeUtils.encode(text, logoPath, destPath, true)); + } +} -- Gitblit v1.7.1