From ae197c86fdfa162b4801f3b0f431d557470ab238 Mon Sep 17 00:00:00 2001 From: erdanergou Date: Sat, 18 Feb 2023 10:21:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9D=A1=E5=BD=A2=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserController.java | 4 +- .../intercepter/UserInterceptor.java | 2 + .../depository_manage/pojo/RestResponse.java | 2 +- .../utils/CreateQrCodeUtil.java | 128 +++++++++++++-- .../resources/templates/pages/user/login.html | 2 +- .../pages/warehouse/warehouse_view.html | 2 +- .../depository_manage/TestOther.java | 151 ++++++++++++++++-- 7 files changed, 254 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java b/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java index 22fca4a6..e48c7aad 100644 --- a/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java +++ b/src/main/java/com/dreamchaser/depository_manage/controller/UserController.java @@ -183,9 +183,7 @@ public class UserController { }else{ return CrudUtil.NOT_EXIST_USER_OR_ERROR_PWD_RESPONSE; } - /*UserToken userToken = new UserToken(LoginType.getType(map.get("loginType")) - , map.get("principal"), map.get("credentials")); - return login(userToken);*/ + } /** * 将生成的令牌拿去认证,如果认证成功则返回带有token凭证响应,否则返回用户密码错误的响应 diff --git a/src/main/java/com/dreamchaser/depository_manage/intercepter/UserInterceptor.java b/src/main/java/com/dreamchaser/depository_manage/intercepter/UserInterceptor.java index 0123e1cd..e196c52d 100644 --- a/src/main/java/com/dreamchaser/depository_manage/intercepter/UserInterceptor.java +++ b/src/main/java/com/dreamchaser/depository_manage/intercepter/UserInterceptor.java @@ -35,6 +35,8 @@ public class UserInterceptor extends HandlerInterceptorAdapter { UserByPort userByPort = (UserByPort) session.getAttribute("userToken"); if(userByPort!=null){ token = (String) session.getAttribute("token"+userByPort.getId()); + }else{ + token = request.getHeader("user-token"); } //如果是访问logout则删除对应的令牌 if ("/loginOut".equals(request.getServletPath())){ diff --git a/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java b/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java index 17265bff..9580d2c2 100644 --- a/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java +++ b/src/main/java/com/dreamchaser/depository_manage/pojo/RestResponse.java @@ -91,7 +91,7 @@ public class RestResponse implements Serializable { */ public static RestResponse CreateBarCode(String context) throws IOException { // 生成base64类型图片 - String qrCode = CreateQrCodeUtil.CreateBarCode128(context, 50, 200); + String qrCode = CreateQrCodeUtil.CreateBarCode128(context, 52, 200); Map result = new HashMap<>(); result.put("qrCode",qrCode); result.put("codeValue",context); diff --git a/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java b/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java index 938afb9d..7717ded6 100644 --- a/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java +++ b/src/main/java/com/dreamchaser/depository_manage/utils/CreateQrCodeUtil.java @@ -14,13 +14,16 @@ import com.google.zxing.pdf417.encoder.BarcodeMatrix; import com.google.zxing.qrcode.QRCodeWriter; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import org.apache.http.util.TextUtils; +import org.junit.jupiter.api.Test; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; +import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; @@ -85,22 +88,10 @@ public class CreateQrCodeUtil { public static String CreateBarCode128(String content, int height, int width){ String resultImage = ""; if (!StringUtils.isEmpty(content)) { - ServletOutputStream stream = null; + BufferedImage image = insertWords(getBarCode(content,width,height), content,width,height,80); ByteArrayOutputStream os = new ByteArrayOutputStream(); - Hashtable hints = new Hashtable(); - hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8” - hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 指定二维码的纠错等级为中级 - hints.put(EncodeHintType.MARGIN, 2); // 设置图片的边距 - Code128Writer writer = new Code128Writer(); - BitMatrix bitMatrix = null; try { - bitMatrix = writer.encode(content, BarcodeFormat.CODE_128, width, height,hints); - } catch (WriterException e) { - e.printStackTrace(); - } - BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix); - try { - ImageIO.write(bufferedImage, "png", os); + ImageIO.write(image, "png", os); } catch (IOException e) { e.printStackTrace(); } @@ -115,6 +106,115 @@ public class CreateQrCodeUtil { + /** + * 设置 条形码参数 + */ + public Map hints = new HashMap() { + public static final long serialVersionUID = 1L; + + { + // 设置编码方式 + put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 容错级别 这里选择最高H级别 + put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + put(EncodeHintType.MARGIN, 1); + } + }; + + + /** + * 生成 图片缓冲 + * + * @param vaNumber VA 码 + * @return 返回BufferedImage + * @author fxbin + */ + public static BufferedImage getBarCode(String vaNumber, int WIDTH, int HEIGHT) { + try { + Code128Writer writer = new Code128Writer(); + // 编码内容, 编码类型, 宽度, 高度, 设置参数 + Hashtable hints = new Hashtable(); + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 指定字符编码为“utf-8” + hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 指定二维码的纠错等级为中级 + hints.put(EncodeHintType.MARGIN, 1); // 设置图片的边距 + BitMatrix bitMatrix = writer.encode(vaNumber, BarcodeFormat.CODE_128, WIDTH, HEIGHT, hints); + return MatrixToImageWriter.toBufferedImage(bitMatrix); + } catch (WriterException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 把带logo的二维码下面加上文字 + * + * @param image 条形码图片 + * @param words 文字 + * @return 返回BufferedImage + * @author fxbin + */ + public static BufferedImage insertWords(BufferedImage image, String words, int WIDTH, int HEIGHT, int WORD_HEIGHT) { + // 新的图片,把带logo的二维码下面加上文字 + if (org.apache.commons.lang.StringUtils.isNotEmpty(words)) { + BufferedImage outImage = new BufferedImage(WIDTH, WORD_HEIGHT, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = outImage.createGraphics(); + // 抗锯齿 + setGraphics2D(g2d); + // 设置白色 + setColorWhite(g2d); + // 画条形码到新的面板 + g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); + // 画文字到新的面板 + Color color = new Color(0, 0, 0); + g2d.setColor(color); + // 字体、字型、字号 + g2d.setFont(new Font("微软雅黑", Font.PLAIN, 16)); + //文字长度 + int strWidth = g2d.getFontMetrics().stringWidth(words); + //总长度减去文字长度的一半 (居中显示) + int wordStartX = (WIDTH - strWidth) / 2; + //height + (outImage.getHeight() - height) / 2 + 12 + int wordStartY = HEIGHT + 20; + // 画文字 + g2d.drawString(words, wordStartX, wordStartY); + g2d.dispose(); + outImage.flush(); + return outImage; + } + return null; + } + + /** + * 设置 Graphics2D 属性 (抗锯齿) + * + * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制 + */ + public static void setGraphics2D(Graphics2D g2d) { + // 消除画图锯齿 + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // 消除文字锯齿 + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER); + g2d.setStroke(s); + } + + /** + * 设置背景为白色 + * + * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制 + */ + public static void setColorWhite(Graphics2D g2d) { + g2d.setColor(Color.WHITE); + //填充整个屏幕 + g2d.fillRect(0, 0, 302, 113); + //设置笔刷 + g2d.setColor(Color.BLACK); + } + + + + diff --git a/src/main/resources/templates/pages/user/login.html b/src/main/resources/templates/pages/user/login.html index 073c2b18..86ecbd0f 100644 --- a/src/main/resources/templates/pages/user/login.html +++ b/src/main/resources/templates/pages/user/login.html @@ -116,7 +116,7 @@ }, success:function(data){ layer.close(this.layerIndex); - if(data.status != 200){ + if(data.status !== 200){ layer.msg(data.statusInfo.message);//失败的表情 $.ajax({ url:"/getCaptchaid", diff --git a/src/main/resources/templates/pages/warehouse/warehouse_view.html b/src/main/resources/templates/pages/warehouse/warehouse_view.html index 050174d7..8f7fdfa7 100644 --- a/src/main/resources/templates/pages/warehouse/warehouse_view.html +++ b/src/main/resources/templates/pages/warehouse/warehouse_view.html @@ -187,7 +187,7 @@ success: function (d) { var data = d.data; layer.close(this.layerIndex); - // $("#barCode").attr("src", data.qrCode); + $("#barCode").attr("src", data.qrCode); $("#barCodeValue").text(data.codeValue); $("#codeItem").show(); $("#createCode").hide(); diff --git a/src/test/java/com/dreamchaser/depository_manage/TestOther.java b/src/test/java/com/dreamchaser/depository_manage/TestOther.java index d4fd8b1a..849b9b16 100644 --- a/src/test/java/com/dreamchaser/depository_manage/TestOther.java +++ b/src/test/java/com/dreamchaser/depository_manage/TestOther.java @@ -1,33 +1,150 @@ package com.dreamchaser.depository_manage; -import com.alibaba.fastjson.JSONObject; -import com.dreamchaser.depository_manage.config.JM_3DES; -import com.dreamchaser.depository_manage.config.QyWxConfig; -import com.dreamchaser.depository_manage.service.impl.QyWxOperationService; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.WriterException; +import com.google.zxing.client.j2se.MatrixToImageWriter; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.oned.Code128Writer; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; +import org.apache.commons.lang.StringUtils; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; @SpringBootTest @RunWith(SpringRunner.class) public class TestOther { + /** + * 条形码宽度 + */ + public static final int WIDTH = 300; + /** + * 条形码高度 + */ + public static final int HEIGHT = 52; + /** + * 加文字 条形码 + */ + public static final int WORD_HEIGHT = 80; + + /** + * 设置 条形码参数 + */ + public Map hints = new HashMap() { + public static final long serialVersionUID = 1L; + + { + // 设置编码方式 + put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 容错级别 这里选择最高H级别 + put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); + put(EncodeHintType.MARGIN, 1); + } + }; @Test - public void Test() { - ArrayList list = new ArrayList(); - list.add("PangFuZhen"); - list.add("KaiXinGuo"); - list.add("WoBenShanLiang_3"); - System.out.println(list.contains("PangFuZhen")); - System.out.println(list.contains("PangFuZhen1")); + public void Test() throws IOException { + BufferedImage image = insertWords(getBarCode("123456"), "123456"); + ImageIO.write(image, "jpg", new File("D:/superMan.png")); + } + + /** + * 生成 图片缓冲 + * + * @param vaNumber VA 码 + * @return 返回BufferedImage + * @author fxbin + */ + public BufferedImage getBarCode(String vaNumber) { + try { + Code128Writer writer = new Code128Writer(); + // 编码内容, 编码类型, 宽度, 高度, 设置参数 + BitMatrix bitMatrix = writer.encode(vaNumber, BarcodeFormat.CODE_128, WIDTH, HEIGHT, hints); + return MatrixToImageWriter.toBufferedImage(bitMatrix); + } catch (WriterException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 把带logo的二维码下面加上文字 + * + * @param image 条形码图片 + * @param words 文字 + * @return 返回BufferedImage + * @author fxbin + */ + public BufferedImage insertWords(BufferedImage image, String words) { + // 新的图片,把带logo的二维码下面加上文字 + if (StringUtils.isNotEmpty(words)) { + BufferedImage outImage = new BufferedImage(WIDTH, WORD_HEIGHT, BufferedImage.TYPE_INT_RGB); + Graphics2D g2d = outImage.createGraphics(); + // 抗锯齿 + setGraphics2D(g2d); + // 设置白色 + setColorWhite(g2d); + // 画条形码到新的面板 + g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); + // 画文字到新的面板 + Color color = new Color(0, 0, 0); + g2d.setColor(color); + // 字体、字型、字号 + g2d.setFont(new Font("微软雅黑", Font.PLAIN, 16)); + //文字长度 + int strWidth = g2d.getFontMetrics().stringWidth(words); + //总长度减去文字长度的一半 (居中显示) + int wordStartX = (WIDTH - strWidth) / 2; + //height + (outImage.getHeight() - height) / 2 + 12 + int wordStartY = HEIGHT + 20; + // 画文字 + g2d.drawString(words, wordStartX, wordStartY); + g2d.dispose(); + outImage.flush(); + return outImage; + } + return null; } + + /** + * 设置 Graphics2D 属性 (抗锯齿) + * + * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制 + */ + public void setGraphics2D(Graphics2D g2d) { + // 消除画图锯齿 + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // 消除文字锯齿 + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); + Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER); + g2d.setStroke(s); + } + + /** + * 设置背景为白色 + * + * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制 + */ + public void setColorWhite(Graphics2D g2d) { + g2d.setColor(Color.WHITE); + //填充整个屏幕 + g2d.fillRect(0, 0, 302, 113); + //设置笔刷 + g2d.setColor(Color.BLACK); + } + + }