H5扫描二维码相关实现

news2025/3/17 18:19:49

        H5  Web网页实现扫一扫识别解析二维码,就现在方法的npm包就能实现,在这个过程中使用过html5-qrcode 和 vue3-qr-reader。

1、html5-qrcode的使用

       感觉html5-qrcode有点小坑,在使用的时候识别不成功还总是进入到错误回调中出现类似NotFoundException: No MultiFormat Readers were able to detect the ....的错误,后面去到官网GitHub上看到有人说是版本问题,降到指定版本之后,一开始没有问题也可以识别了,奇怪的是,过一个星期直接噶了😭。。。(感觉不是很稳定,如果有不同见解可以交流一下)

html5-qrcode 的具体使用参考html5-qrcode

2、vue3-qr-reader的使用

vue3-qr-reader 是继 html5-qrcode 找到的第二种方案,这个相对来说比较稳定使用方式简单:

        1、vue3项目中下载vue3-qr-reader包

npm install vue3-qr-reader

// 或者

npm i vue3-qr-reader

         2、在项目中引用需要使用的组件,在页面t使用组件

<template>
    <van-button @click="openQrcode" color="rgba(0, 0, 0, 0.3)"
        style="border-color: rgba(255, 255, 255, 0.4)">扫一扫</van-button>


    <-- 扫码页面内容 !-->
    <div class="reader-box" v-if="isScaning">
      <div class="line"></div>
      <qr-stream @decode="onDecode" class="mb">
        <div class="frame" style="color: red;"></div>
      </qr-stream>
      <div class="desc">扫描激活二维码</div>
      <van-button @click="closeQrcode" color="rgba(0, 0, 0, 0.3)"
        style="border-color: rgba(255, 255, 255, 0.4)">返回</van-button>
    </div>
</template>

<script setup>
// 引入依赖
import { QrStream } from "vue3-qr-reader"

// ...

const isScaning = ref(false)

// 开启扫码
const openQrcode = ()=>{
    isScaning.value = true
}
// 关闭扫码
const closeQrcode = ()=> {
    isScaning.value = false
}

// 处理扫码成功后相关的业务内容
const onDecode = (data)=>{
    try{
        // data 为扫码结果 对data做相关处理进行下一步操作
    }catch(err){
        closeQrcode()
        showNotify({
            type:'danger',
            message:'扫码失败,请联系管理员'
        })
    }
}
</script>
/* 相关样式 */
.reader-box {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(0, 0, 0, 0.9);
  z-index: 999;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
}
.reader-box .desc {
  position: fixed;
  bottom: 140px;
  font-family: PingFang SC, PingFang SC;
  font-weight: bold;
  font-size: 15px;
  color: #ffffff;
  margin-top: 16px;
}
.reader-box .van-button {
  position: absolute;
  bottom: 70px;
  width: 90%;
  border: 1px solid #fff;
}
.line {
  position: absolute;
  top: 180px;
  width: 100%;
  animation: radar-beam 2s infinite;
  animation-timing-function: cubic-bezier(0.53, 0, 0.43, 0.99);
  animation-delay: 1.4s;
  z-index: 9999;
  height: 130px;
  border-bottom: 1px solid #4b66d0;
  background: linear-gradient(to top, #4b66d0, transparent);
}

@keyframes radar-beam {
  0% {
    transform: translateY(-100%);
  }
  100% {
    transform: translateY(90%);
  }
}

最终实现效果如下

注意:因为获取摄像头权限,需要网页是https的,所以在本地调试的话要开启https,开启https的方式,可以参考这个大佬的方式本地localhost开启https通过软件及命令生成证书,并将证书放入到vue项目中,在vite.config.js的配置中加入并保存即可

import vue from '@vitejs/plugin-vue';
import { defineConfig, loadEnv } from 'vite';
import Components from 'unplugin-vue-components/vite';
import { VantResolver } from 'unplugin-vue-components/resolvers';
const fs = require('fs');

export default ({ mode }) =>
  defineConfig({
    plugins: [
      vue(),
      Components({
        resolvers: [VantResolver()],
      }),
    ],
    css: {
      postcss: {
        plugins: [
          require('postcss-pxtorem')({
            rootValue: 50,
            propList: ['*'],
            selectorBlackList: ['.van-'],
          }),
        ],
      },
    },
    base: './',
    server: {
      host: '0.0.0.0',
      // port: import.meta.VITE_PORT,
      port: loadEnv(mode, process.cwd()).VITE_PORT,
      // open: import.meta.VITE_OPEN,
      proxy: {
        '/api': {
          target: 'https://xxx.com/',
          ws: true,
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, ''),
        },
      },
      https: {
        key: fs.readFileSync('public/127.0.0.1-key.pem'),
        cert: fs.readFileSync('public/127.0.0.1.pem'),
      },
    },
    minify: 'esbuild',
    sourcemap: false,
  });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MFC密码对话框之间数据传送实例(源码下载)

新建一个login工程项目对话框&#xff0c;主对话框IDD_LOGIN_DIALOG中一个显示按钮IDC_BUTTON1、一个密码按钮IDC_BUTTON2。添加一个密码对话框IDD_DIALOG1&#xff0c;添加类password&#xff0c;在对话框中添加一个编辑框IDC_EDIT1、一个确定按钮IDC_BUTTON1。 程序功能&…

Java进阶学习笔记13——抽象类

认识抽象类&#xff1a; 当我们在做子类共性功能抽取的时候&#xff0c;有些方法在父类中并没有具体的体现&#xff0c;这个时候就需要抽象类了。在Java中&#xff0c;一个没有方法体的方法应该定义为抽象方法&#xff0c;而类中如果有抽象方法&#xff0c;该类就定义为抽象类…

IOS开发者证书快捷申请

App Uploader 在进行iOS应用开发中,可以借助appuploader辅助工具进行证书制作、上传和安装测试等操作。首先,您需要访问官方网站获取最新版本的appuploader。最新版本已经优化了与Apple账号的登录流程,无需支付688元,并提供了Windows版和Mac版供用户选择。下载完成后,解压…

c++编程14——STL(3)list

欢迎来到博主的专栏&#xff1a;c编程 博主ID&#xff1a;代码小豪 文章目录 list成员类型构造、析构、与赋值iterator元素访问修改元素list的操作 list list的数据结构是一个链表&#xff0c;准确的说应该是一个双向链表。这是一个双向链表的节点结构&#xff1a; list的使用…

Java轻松转换Markdown文件到Word和PDF文档

Markdown 凭借其简洁易用的特性&#xff0c;成为创建和编辑纯文本文档的常用选择。但某些时候我们需要更加精致的展示效果&#xff0c;例如在专业分享文档或打印成离线使用的纸质版时&#xff0c;就需要将Markdown文件以其他固定的文档格式呈现。通过将 Markdown 转换为 Word 和…

PostgreSQL用户与角色简述

简述 PostgreSQL通过角色&#xff08;role&#xff09;来控制数据库的访问权限。角色可以拥有数据库对象&#xff08;比如表、函数等&#xff09;&#xff0c;并允许将这些对象的权限授予其他角色&#xff0c;从而实现对象访问的控制。角色&#xff08;role&#xff09;包含了…

llama3-8b-instruct-262k微调过程的问题笔记(场景为llama论文审稿)

目录 一、环境配置 1.1、模型 1.2、微调环境 1.3、微调数据 二、发现的问题 2.1、过拟合问题 2.2、Qlora zero3 保存模型时OOM问题(已解决) 一、环境配置 1.1、模型 llama3-8b-instruct-262k &#xff08;英文&#xff09; 1.2、微调环境 Package Version ------------------…

军队仓库管理系统|DW-S301系统特点

部队仓库管理系统DW-S301系统通过数据采集、互联网和物联网技术&#xff0c;实现数字化智能管控&#xff0c;以提高军用物资的仓储准确率和流转率&#xff0c;缩短周转时间&#xff0c;降低库存成本&#xff0c;也有助于消除生产过程中的不确定性。 系统功能&#xff1a;通过部…

ComfyUI完全入门:图生图局部重绘

大家好&#xff0c;我是每天分享AI应用的萤火君&#xff01; 这篇文章的主题和美女有关&#xff0c;不过并不是教大家生产美女视频&#xff0c;而是讲解 ComfyUI 的图生图局部重绘&#xff0c;其中将会以美女图片为例&#xff0c;来展示局部重绘的强大威力。 先看看效果&…

STM32学习和实践笔记(30):窗口看门狗(WWDG)实验

1.WWDG介绍 1.1 WWDG简介 上一章我们已经介绍了IWDG&#xff0c;知道它的工作原理就是一个12位递减计数器不断递减计数&#xff0c;当减到0之前还未进行喂狗的话&#xff0c;产生一个MCU复位。 窗口看门狗WWDG其实和独立看门狗类似&#xff0c;它是一个7位递减计数器不断的往…

网络模型-策略路由配置

在实际网络应用中&#xff0c;策略路由也是一种重要的技术手段。尽管在考试并不注重策略路由&#xff0c;但是实际上应用较多建议考生除了掌握基本的静态路由协议IP route-static&#xff0c;动态路由协议RIP、还要掌握如何配置策略路由。策略路由的基本原理:根据ACL定义的不同…

基于高通公司AI Hub Models的On-Device AI学习:Introduction to On-Device AI

Introduction to On-Device AI 本文是学习 https://www.deeplearning.ai/short-courses/introduction-to-on-device-ai/这门课的学习笔记。 What you’ll learn in this course As AI moves beyond the cloud, on-device inference is rapidly expanding to smartphones, IoT…

前端-移动端布局

如何在PC端模拟移动端设备 可以在浏览器里打开检查 点击一下移动端按钮 然后选择一下对应的手机型号可以切换到对应的手机端 响应式布局实现方法 Viewport Flex 弹性盒子 Flex容器属性 flex-direction flex-wrap justify-content align-items align-content 进阶学习建议 Vu…

Point-Nerf 理论笔记和理解

文章目录 什么是point nerf 和Nerf 有什么区别Point Nerf 核心结构有哪些&#xff1f;什么是point-based radiance field? 点云位置以及置信度是怎么来Point pruning 和 Point Growing 什么是point nerf 和Nerf 有什么区别 基本的nerf 是通过过拟合MLP来完成任意视角场景的重…

Express 的 req 和 res 对象

新建 learn-express文件夹&#xff0c;执行命令行 npm init -y npm install express 新建 index.js const express require(express); const app express();app.get(/, (req, res, next) > {res.json(return get) })app.post(/, (req, res, next) > {res.json(retur…

在 Ubuntu 22 上深入了解和搭建 Minikube

在 Ubuntu 22 上深入了解和搭建 Minikube Minikube 是一个开源工具&#xff0c;使开发者能够在本地计算机上运行单节点的 Kubernetes 集群&#xff0c;非常适合于开发、测试和学习 Kubernetes 的基础知识。在这篇文章中&#xff0c;我们将深入了解 Minikube 的工作原理&#x…

【vue echart】完成一个简单echart图表+自适应

实现效果&#xff1a; html&#xff1a; <divref"echartOne"id"echartOne"style"width: 100%; height: 100%" ></div> js: getEchartOne() {let chart this.$echarts.init(this.$refs.echartOne);chart.setOption({title: {text:…

【全部更新完毕】2024电工杯A题数学建模详细思路代码文章分享

A 题&#xff1a;园区微电网风光储协调优化配置 摘要 在全球范围内&#xff0c;气候变化和环境污染问题日益严重&#xff0c;减少碳排放和实现可持续发展成为各国的共同目标。新能源&#xff0c;尤其是风能和光伏发电&#xff0c;因其清洁、可再生的特性&#xff0c;正在全球范…

Python vscode debug: Error while enumerating installed packages.解决

记录一个vscode python debug时出现的错误&#xff1a; 具体错误如下&#xff1a; E00000.030: Error while enumerating installed packages. Traceback (most recent call last): File “/root/.vscode-server/extensions/ms-python.debugpy-2024.0.0-linux-x64/bundled/lib…

【C++11】lambda匿名函数和包装器

目录 一&#xff0c;lambda匿名函数 1-1&#xff0c;lambda的引入 1-2&#xff0c;lambda表达式书写格式 1-3&#xff0c;lambda函数的名称 1-4&#xff0c;lambda捕获列表的使用 1-5&#xff0c;函数对象与lambda表达式 二&#xff0c;包装器 2-1&#xff0c;function…