二维码工具类
package com.admin.dc.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import javax.通达信本地数据开放接口,imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.通达信本地数据开放接口,image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: jyz
* @Date: 2021/8/9 10:55
* @Description: 二维码相关接口
*/
public class QrcodeUtils {
// 二维码尺寸
private static final int QRCODE_SIZE = 400;
private static final String LOGOPATH='D:/log.png';
private static final int WIDTH = 60;
// LOGO高度
private static final int HEIGHT = 60;
public static String createQrCode(String url, String path, String fileName) {
try {
Map<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, 'UTF-8');
BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
File file = new File(path, fileName);
if (file.exists() || ((file.getParentFile().exists() || file.getParentFile().mkdirs()) && file.createNewFile())) {
writeToFile(bitMatrix, 'jpg', file);
System.out.println('成功:' + file);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage 通达信本地数据开放接口,image = toBufferedImage(matrix);
if (!ImageIO.write(通达信本地数据开放接口,image, format, file)) {
throw new IOException('Could not write an 通达信本地数据开放接口,image of format ' + format + ' to ' + file);
}
}
public static void writeToStream(BitMatrix matrix, String format, OutputStream stream) throws IOException {
BufferedImage 通达信本地数据开放接口,image = toBufferedImage(matrix);
if (!ImageIO.write(通达信本地数据开放接口,image, format, stream)) {
throw new IOException('Could not write an 通达信本地数据开放接口,image of format ' + format);
}
}
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.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, matrix.get(x, y) ? BLACK : WHITE);
}
}
// try {
// QrcodeUtils.insertImage(通达信本地数据开放接口,image,LOGOPATH,true);
// } catch (Exception e) {
// e.printStackTrace();
// }
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();
}
public static void main(String[] args) {
createQrCode('https://www.baidu.com','D:/','test2.png');
}
}
生成二维码并下载为片
/**
* @author: jyz
* @description: 生成二维码并下载
* @date: 2021/8/9 14:53
* @Param: request
* @Param: response
* @return: void
*/
@GetMapping('/generateQRCode')
public void dowanload(HttpServletRequest request, HttpServletResponse response) throws Exception {
//获取当前登录人的企业id
String qyid = UserUtil.getQyId();
//二维码中包含的信息
String content = 'https://www.baidu.com?qyid='+qyid;
Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
// 指定编码格式
hints.put(EncodeHintType.CHARACTER_SET, 'UTF-8');
// 指定纠错级别(L--7%,M--15%,Q--25%,H--30%)
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 编码内容,编码类型(这里指定为二维码),生成图片宽度,生成图片高度,设置参数
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 200, 200, hints);
//设置请求头
response.setHeader('Content-Type','application/octet-stream');
response.setHeader('Content-Disposition', 'attachment;filename=' + 'qrCode.png');
OutputStream outputStream = response.getOutputStream();
QrcodeUtils.writeToStream(bitMatrix, 'png', outputStream);
outputStream.flush();
outputStream.close();
}
这里涉及两个技术点,一个是生成二维码,一个是扫码登录。 生成二维码功能并不难实现,实现原理就是通过一个公共方法的调用,生成专属二维码,也可以根据需要在二维码的中间插入自定义logo,我们只需要调用方法的时候传一个String类型的url即可。 用户扫码后,就会自动跳转到我们之前设定的url打开一个页面,这个url可以根据业务需要携带标识参数,当跳转的时候,前端获取url的参数,调用后端接口,查询相应数据。
如上所述,扫码登录会跳转一个新的页面,前端获取url上面的参数,在页面初始化方法里调用后端接口,来获取页面响应数据。
实现思路
代码实现过程
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
文章为作者独立观点,不代表股票交易接口观点
我们爱Lucky2022-04-22
这届有人喜欢发新股,大盘已经到了如此境地了,还强行上大盘股中海油,股票怎么可能好?去年一年的新股数量,融资额度都创出近20年的新高,今年虽然行情不好,但新股融资额度依然在创新高!