Browse Source

新增 二维码

Administrator 1 year ago
parent
commit
5d1f27612b

+ 2 - 2
ruoyi-common/pom.xml

@@ -21,12 +21,12 @@
         <dependency>
         <dependency>
             <groupId>com.google.zxing</groupId>
             <groupId>com.google.zxing</groupId>
             <artifactId>core</artifactId>
             <artifactId>core</artifactId>
-            <version>3.1.0</version>
+            <version>3.5.1</version>
         </dependency>
         </dependency>
         <dependency>
         <dependency>
             <groupId>com.google.zxing</groupId>
             <groupId>com.google.zxing</groupId>
             <artifactId>javase</artifactId>
             <artifactId>javase</artifactId>
-            <version>3.1.0</version>
+            <version>3.5.1</version>
         </dependency>
         </dependency>
         <!--word签名-->
         <!--word签名-->
         <dependency>
         <dependency>

+ 239 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/QRCodeUtils.java

@@ -0,0 +1,239 @@
+package com.ruoyi.common.utils;
+
+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 com.ruoyi.common.utils.uuid.UUID;
+
+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;
+
+/**
+ * @author tjf
+ * @Date: 2021/12/29/15:09
+ */
+public class QRCodeUtils {
+    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()) {
+            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 = QRCodeUtils.createImage(content, imgPath,
+                needCompress);
+        String date = DateUtils.datePath();
+        destPath = destPath+"/" + date;
+        mkdirs(destPath);
+        String file = UUID.randomUUID() + ".jpg";
+        File fileQR = new File(destPath + "/" + file);
+        ImageIO.write(image, FORMAT_NAME, fileQR);
+        return "/profile/qrUpload/"+date+"/"+file;
+    }
+
+
+    /**
+     * 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+     *
+     * @param destPath 存放目录
+     * @date 2013-12-11 上午10:16:36
+     */
+    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));
+    }
+}

+ 13 - 1
ruoyi-system/src/main/java/com/ruoyi/system/domain/document/ExplainDocument.java

@@ -21,6 +21,10 @@ public class ExplainDocument extends BaseEntity
     /** 说明文档标题 */
     /** 说明文档标题 */
     @Excel(name = "说明文档标题")
     @Excel(name = "说明文档标题")
     private String explainTitle;
     private String explainTitle;
+    /**
+     * 说明文档封面URL
+     */
+    private String explainImage;
 
 
     /** 说明文档类型(1:担保材料清单 2:小微企业说明) */
     /** 说明文档类型(1:担保材料清单 2:小微企业说明) */
     @Excel(name = "说明文档类型", readConverterExp = "1=:担保材料清单,2=:小微企业说明")
     @Excel(name = "说明文档类型", readConverterExp = "1=:担保材料清单,2=:小微企业说明")
@@ -34,7 +38,15 @@ public class ExplainDocument extends BaseEntity
     @Excel(name = "说明文档状态", readConverterExp = "0=正常,1=关闭")
     @Excel(name = "说明文档状态", readConverterExp = "0=正常,1=关闭")
     private String status;
     private String status;
 
 
-    public void setExplainId(Integer explainId) 
+    public String getExplainImage() {
+        return explainImage;
+    }
+
+    public void setExplainImage(String explainImage) {
+        this.explainImage = explainImage;
+    }
+
+    public void setExplainId(Integer explainId)
     {
     {
         this.explainId = explainId;
         this.explainId = explainId;
     }
     }

+ 1 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/loan/impl/LoanApplicationServiceImpl.java

@@ -1,6 +1,7 @@
 package com.ruoyi.system.service.loan.impl;
 package com.ruoyi.system.service.loan.impl;
 
 
 
 
+import cn.hutool.extra.qrcode.QrCodeUtil;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.common.core.domain.entity.SysRole;

+ 5 - 1
ruoyi-system/src/main/resources/mapper/system/ExplainDocumentMapper.xml

@@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <resultMap type="ExplainDocument" id="ExplainDocumentResult">
     <resultMap type="ExplainDocument" id="ExplainDocumentResult">
         <result property="explainId"    column="explain_id"    />
         <result property="explainId"    column="explain_id"    />
         <result property="explainTitle"    column="explain_title"    />
         <result property="explainTitle"    column="explain_title"    />
+        <result property="explainImage"    column="explain_image"    />
         <result property="explainType"    column="explain_type"    />
         <result property="explainType"    column="explain_type"    />
         <result property="explainContent"    column="explain_content"    />
         <result property="explainContent"    column="explain_content"    />
         <result property="status"    column="status"    />
         <result property="status"    column="status"    />
@@ -18,7 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
     </resultMap>
 
 
     <sql id="selectExplainDocumentVo">
     <sql id="selectExplainDocumentVo">
-        select explain_id, explain_title, explain_type, explain_content, status, create_by, create_time, update_by, update_time, remark from explain_document
+        select explain_id, explain_title, explain_type,explain_image, explain_content, status, create_by, create_time, update_by, update_time, remark from explain_document
     </sql>
     </sql>
 
 
     <select id="selectExplainDocumentList" parameterType="ExplainDocument" resultMap="ExplainDocumentResult">
     <select id="selectExplainDocumentList" parameterType="ExplainDocument" resultMap="ExplainDocumentResult">
@@ -41,6 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         insert into explain_document
         insert into explain_document
         <trim prefix="(" suffix=")" suffixOverrides=",">
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="explainTitle != null and explainTitle != ''">explain_title,</if>
             <if test="explainTitle != null and explainTitle != ''">explain_title,</if>
+            <if test="explainImage != null and explainImage != ''">explain_image,</if>
             <if test="explainType != null and explainType != ''">explain_type,</if>
             <if test="explainType != null and explainType != ''">explain_type,</if>
             <if test="explainContent != null">explain_content,</if>
             <if test="explainContent != null">explain_content,</if>
             <if test="status != null">status,</if>
             <if test="status != null">status,</if>
@@ -52,6 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          </trim>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="explainTitle != null and explainTitle != ''">#{explainTitle},</if>
             <if test="explainTitle != null and explainTitle != ''">#{explainTitle},</if>
+            <if test="explainImage != null and explainImage != ''">#{explainImage},</if>
             <if test="explainType != null and explainType != ''">#{explainType},</if>
             <if test="explainType != null and explainType != ''">#{explainType},</if>
             <if test="explainContent != null">#{explainContent},</if>
             <if test="explainContent != null">#{explainContent},</if>
             <if test="status != null">#{status},</if>
             <if test="status != null">#{status},</if>
@@ -67,6 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         update explain_document
         update explain_document
         <trim prefix="SET" suffixOverrides=",">
         <trim prefix="SET" suffixOverrides=",">
             <if test="explainTitle != null and explainTitle != ''">explain_title = #{explainTitle},</if>
             <if test="explainTitle != null and explainTitle != ''">explain_title = #{explainTitle},</if>
+            <if test="explainImage != null and explainImage != ''">explain_image = #{explainImage},</if>
             <if test="explainType != null and explainType != ''">explain_type = #{explainType},</if>
             <if test="explainType != null and explainType != ''">explain_type = #{explainType},</if>
             <if test="explainContent != null">explain_content = #{explainContent},</if>
             <if test="explainContent != null">explain_content = #{explainContent},</if>
             <if test="status != null">status = #{status},</if>
             <if test="status != null">status = #{status},</if>