【uniapp:二维码生成和扫描】


前言

提示:uniapp + springboot 二维码生成和扫描:

使用uniapp + springboot 框架,实现二维码生成和扫描二维码功能。
兼容H5、小程序、app端。


提示:以下是本篇文章正文内容,下面案例可供参考

代码部分

一、后端

1. pom.xml引入库

pom.xml添加以下依赖:

 <!--生成二维码-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version>
        </dependency>

2. springboot后端生成二维码——QRCodeController.java

package cn.iocoder.hwb.module.system.controller.admin.qrcode;

import cn.iocoder.hwb.framework.common.pojo.CommonResult;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import static cn.iocoder.hwb.framework.common.pojo.CommonResult.success;

@RestController
public class QRCodeController {

     /**
     *
     * 扫描二维码 1.1 
     * @param text
     * @return
     */
    @GetMapping("/api/qrcode")
    public CommonResult<byte[]> generateQRCode(@RequestParam String text) {
        try {
            // 设置二维码参数
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 指定字符集


            // 生成二维码矩阵
            BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, 300, 300, hints);

            // 转换为BufferedImage
            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);

            // 将BufferedImage转换为byte数组,并返回给前端
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "PNG", baos);
            byte[] imageBytes = baos.toByteArray();
            return success(imageBytes);


        } catch (WriterException | IOException e) {
            e.printStackTrace();
            return null;
        }


    }



    /**
     *
     * 扫描二维码 1.2
     * @param text
     * @return
     */
    @GetMapping("/api/qrcode")
    public CommonResult<byte[]> generateQRCode(@RequestParam String text) {
        try {
            // 生成二维码图片
            byte[] imageBytes = generateQRCodeImage(text);
            return success(imageBytes);
        } catch (Exception e) {
            // 捕获所有异常,并返回带有错误信息的CommonResult对象
            e.printStackTrace(); // 或者使用日志记录器记录异常
            return error("Failed to generate QR code", e.getMessage());
        }
    }

    private byte[] generateQRCodeImage(String text) throws WriterException, IOException {
        // 设置二维码参数
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 指定字符集

        // 生成二维码矩阵
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, 300, 300, hints);

        // 转换为BufferedImage
        BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);

        // 将BufferedImage转换为byte数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "PNG", baos);
        byte[] imageBytes = baos.toByteArray();
        baos.close(); // 关闭流  
        return imageBytes;
    }
}

二、前端

1. 在package.json中引入前端依赖库

{
"dependencies": {
    "axios": "^1.6.7",
    "crypto-js": "^4.0.0",
    "html5-qrcode": "^2.3.8",
    "image-tools": "^1.4.0",
    "qrcodejs2-fix": "^0.0.1",
    "sm-crypto": "^0.3.13",
    "weixin-jsapi": "^1.1.0"
  },
}

2. 创建qrcode.js文件,配置调用后端api接口

import upload from '@/utils/upload'
import request from '@/utils/request'

// 生成二维码
export function generateQRCode(text) {  
    return request({  
      url: '/api/qrcode', // 后端API地址  
      method: 'GET',  
      params: { // 如果后端需要GET参数,可以这样传递  
        text  
      },  
      responseType: 'text' // 确保响应类型是文本,因为我们要处理Base64字符串  
    }).then(response => {  
      // 假设后端返回的是纯Base64编码的字符串,没有前缀  
      // 你可以在这里添加前缀来创建一个完整的Data URL  
      const dataUrl = `data:image/png;base64,${response.data}`;  
      return dataUrl; // 返回完整的Data URL  
    });  
  }

3. 前端页面generateIndex.vue,实现二维码生成,二维码扫描功能

<template>
  <view class="container">
    <view class="header-section text-center" style='margin-top: 30rpx;'>
      <image :src="qrCodeDataUrl" mode="aspectFit"></image>
      <button @click="fetchQRCode" style='margin-top: 30rpx;'>生成二维码</button>
    </view>
    <view class="header-section text-center" style='margin-top: 30rpx;'>
      <button @click="scanQRCode">扫描二维码</button>
    </view>
  </view>
</template>

<script>
import { generateQRCode } from "@/api/system/qrcode"
export default {
  data() {
    return {
      qrCodeDataUrl: ''
    };
  },
  methods: {

    // 生成二维码
    fetchQRCode() {
      const text = '哈哈哈!!!``'; // 你要生成的二维码内容,你可以从某处获取这个text,比如输入框的值  
      generateQRCode(text).then(dataUrl => {
        console.log("dataUrl:" + dataUrl);
        this.qrCodeDataUrl = dataUrl; // 设置图片的src为完整的Data URL  
      }).catch(error => {
        // 处理错误情况  
        uni.showToast({
          title: '获取二维码失败',
          icon: 'none'
        });
        console.error('获取二维码失败:', error);
      });
    },


    // 扫描二维码
    scanQRCode() {
      uni.scanCode({
        success: (res) => {
          console.log('扫描结果:', res.result); // res.result 为扫描结果  

          uni.showToast({ title: '扫描结果:' + res.result, icon: 'none' });
          // 在这里处理扫描结果,例如显示在页面上或者发送到服务器  
        },
        fail: (err) => {
          console.error('扫描失败:', err);
        }
      });
    }
  }
};  
</script>

附:链接: uniapp扫码官网


实现效果

在这里插入图片描述


总结

通过以上代码可以在H5、小程序、web端,实现二维码生成、二维码扫描功能。

生成uniapp二维码的方法是通过创建一个名为uqrcode.js的js文件,并在需要的页面引入该文件。接下来需要在画布(canvas)中展示二维码,因此需要创建一个画布。然后在methods方法中定义一个函数方法,通过调用UQrcode.make方法来生成二维码。具体代码如下: ``` (1) 首先需要创建一个js文件,名字为 uqrcode.js (2) 在你需要的页引入 uqrcode.js文件 (3) 创建一个画布(canvas) (4) 在methods方法里边定义一个qrFun函数方法 onLoad(option) { console.log(this.obj,123) this.qrFun(option.qljyAdvertisementEnrollEntity.adMark) }, methods: { qrFun: function(text) { UQrcode.make({ canvasId: 'qrcode', componentInstance: this, text: text, size: 150, margin: 0, backgroundColor: '#ffffff', foregroundColor: '#000000', fileType: 'jpg', errorCorrectLevel: UQrcode.errorCorrectLevel.H, success: res => {} }) }, } ``` 如果你想了解更多关于uniapp二维码生成的内容,可以扫描二维码联系博主了解更多信息。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [【uniapp-如何生成二维码超详细】](https://blog.csdn.net/Lnbd_/article/details/130560389)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [基于MATLAB编程的局部非先验去雾代码(代码完整,数据齐全)](https://download.csdn.net/download/abc991835105/88217974)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值