二维码生成器:从前端到打印的全流程 📅 发布时间:2026/7/11 9:31:13 👁️ 浏览次数: 二维码库的选择前端生成二维码的库挺多的我们用的是qrcode这个npm包star数比较多维护也比较活跃。npm install qrcode项目里的版本是1.5.4。基本用法二维码生成非常简单import QRCode from qrcode; QRCode.toDataURL(https://example.com).then(url { console.log(url); // base64格式的图片数据 });在我们的项目里二维码生成是在支付场景下用的。用户选择充值套餐后后端返回一个支付链接前端把这个链接转成二维码显示template el-dialog title支付二维码 :visible.syncopenWeixinCode div classpayPrice {{ rechargeList[activeRecharge].price }}/div el-image :srcorderInfo.url fitcontain classwxCode/el-image div classpayTip请使用微信扫一扫扫描二维码完成支付/div /el-dialog /template script import QRCode from qrcode; export default { methods: { handlePay() { buyRechargePower(this.rechargeList[this.activeRecharge].id).then(res { QRCode.toDataURL(res.data.url).then(url { this.orderInfo.url url; this.openWeixinCode true; // 轮询支付状态 this.timer setInterval(() { this.getEnOrderStatus(); }, 2000); }); }); } } } /script第一个坑二维码太复杂扫不出来一开始生成的二维码特别复杂感觉密密麻麻全是点手机扫码很难识别。后来查了一下文档发现可以通过errorCorrectionLevel参数调整容错率QRCode.toDataURL(url, { errorCorrectionLevel: L // L、M、Q、H容错率从低到高 }).then(url { // ... });容错率越高二维码越复杂但越抗污损。对于我们的场景线上扫码显示在手机屏幕上选L级别就够了二维码会简洁很多扫码速度快很多。第二个坑二维码尺寸和清晰度默认生成的二维码分辨率不太高在高清屏上有点模糊。可以设置width参数QRCode.toDataURL(url, { width: 300, // 宽度单位是像素 margin: 2, // 边距留白区域 color: { dark: #000000, // 二维码颜色 light: #FFFFFF // 背景颜色 } }).then(url { // ... });这里有个坑width设置太大base64字符串会非常长可能会超出浏览器localStorage的长度限制。一般300-400就够用了。打印适配名片是要打印的所以二维码在打印时的效果很重要。我们用的是html2canvas把整个名片转成图片然后打印。这里有几个要注意的点1. 设置合适的DPI打印用的图片分辨率要比屏幕显示的高。我们是在生成名片的时候整体放大2倍import html2canvas from html2canvas; html2canvas(element, { scale: 2, // 2倍分辨率 useCORS: true, // 支持跨域图片 backgroundColor: #ffffff }).then(canvas { // canvas转图片... });2. 二维码大小要合适名片尺寸通常是90mm × 54mm二维码占的比例不能太大否则扫的时候距离要拉得很远也不能太小否则打印出来不清楚。我们测试下来二维码宽度在名片总宽度的30%-40%比较合适。比如名片宽度360px二维码大概120-140px。3. 考虑留白二维码周围要留点白边不然打印出来边缘被裁了可能就扫不出来了QRCode.toDataURL(url, { margin: 2, // 至少留2个模块的边距 // ... });下载二维码图片有时候用户想单独下载二维码图片可以直接用base64转blob下载function downloadQRCode(text, filename) { QRCode.toDataURL(text).then(url { const link document.createElement(a); link.href url; link.download filename || qrcode.png; link.click(); }); }或者配合file-saver库import { saveAs } from file-saver; QRCode.toBlob(text).then(blob { saveAs(blob, qrcode.png); });实时刷新支付状态二维码生成后要轮询后端接口看用户有没有支付成功handlePay() { buyRechargePower(this.rechargeList[this.activeRecharge].id).then(res { this.orderInfo res.data; QRCode.toDataURL(res.data.url).then(url { this.orderInfo.url url; this.openWeixinCode true; // 每2秒查询一次支付状态 this.timer setInterval(() { this.getEnOrderStatus(); }, 2000); }); }); }, getEnOrderStatus() { getEnOrderStatus(this.orderInfo.orderId).then(res { if (res.data.status 1) { // 支付成功清除定时器 if (this.timer) { clearInterval(this.timer); } this.$message.success(支付成功); this.openWeixinCode false; this.$emit(RechargeSuccess); } }); }这里要注意的是组件销毁的时候一定要清除定时器beforeDestroy() { if (this.timer) { clearInterval(this.timer); } }一些小技巧1. 二维码加Logo可以在生成的二维码中间加个小Logo不过要注意Logo不能太大一般占二维码面积的15%-20%Logo颜色要和二维码有对比度最好用白色边框把Logo围起来这个qrcode库本身不支持加Logo得自己处理canvas。我们项目暂时没这个需求就没做。2. 批量生成如果需要批量生成二维码记得用Promise.all并行处理const urls [url1, url2, url3]; Promise.all(urls.map(url QRCode.toDataURL(url))).then(results { console.log(results); // 三张二维码的base64 });3. 打印预览打印前最好给用户一个预览功能确认效果没问题再打印。浏览器有原生打印APIwindow.print();配合CSS的media print可以控制打印时的样式media print { .no-print { display: none; } .qrcode-container { page-break-inside: avoid; } }总结二维码功能虽然看起来简单但真要做好细节还挺多的容错率要选对根据使用场景调整别一味追求高容错尺寸要合适屏幕显示和打印的尺寸要求不一样要分别优化打印效果要测试别光看屏幕上的效果打印出来看看实际效果定时器要清理轮询类的代码一定要在组件销毁时清除定时器
JMeter实战2--阶梯线程组及计算逻辑 一、压力测试的计算逻辑线程组定义场景,线程数定义用户量,用户量决定并发压力1个线程组 1个测试场景1个线程(数) 1个虚拟用户样本数 接口请求次数 用户数量 每个用户执行的次数 用户数量 每个用户每秒请求率 运行时长≈ 用户… 2026/7/11 9:28:31
告别繁琐安装!m3u8live.cn 在线 M3U8 播放器,粘贴即播,HLS 直播流调试一步到位 如果你是一名视频开发工程师、测试人员、直播运营,或者偶尔需要处理 m3u8 流媒体链接的普通用户,你一定经历过这些烦恼: 想验证一个 m3u8 直播地址,还要下载安装 VLC 等播放器,步骤繁琐本地播放器经常出现无法播放、跨… 2026/7/11 9:29:04
吉客云与金蝶云星空的自动化数据流转方案 吉客云与金蝶云星空系统对接方案系统对接概述轻易云数据集成平台为企业提供吉客云奇门与金蝶云星空的标准化对接方案。该方案基于平台的多源异构集成能力,可实现销售订单、库存数据等核心业务数据的自动化流转,消除企业信息孤岛问题。对接系统说明吉客云… 2026/3/18 16:47:48
全面解析高效asar文件管理工具:5分钟上手教程 全面解析高效asar文件管理工具:5分钟上手教程 【免费下载链接】WinAsar Portable and lightweight GUI utility to pack and extract asar( Electron archive ) files, Only 551 KB! 项目地址: https://gitcode.com/gh_mirrors/wi/WinAsar 还在为Electron应用… 2026/7/11 9:30:03
哔哩下载姬DownKyi完整指南:轻松下载B站视频的终极解决方案 哔哩下载姬DownKyi完整指南:轻松下载B站视频的终极解决方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&… 2026/7/11 9:28:02
智能直流负载管理系统设计与实现 1. 项目背景与核心目标 在工业自动化和电力电子领域,直流负载管理一直是系统设计的关键痛点。传统机械式继电器在频繁开关场景下存在触点磨损、电弧干扰和响应速度慢等问题,而普通电子开关又难以兼顾大电流承载与精确控制。这个项目正是针对这些痛点&… 2026/7/11 9:26:01
深入理解 LDO —— 从入门到精通 本文按由浅入深的顺序,系统讲解 LDO(低压差线性稳压器)的原理、参数、选型和应用。无论你是刚接触电源设计的新手,还是需要深入调试的老手,都能从中找到需要的知识。 第一部分:基础认知 1.1 什么是 LDO&am… 2026/7/11 9:26:01
CBCX平台印象:经纪商服务细节带来的使用参考 在外汇相关服务逐步走向规范化表达的背景下,平台评测需要回到用户真实会遇到的问题:信息是否容易找到,流程是否容易理解,帮助入口是否有效,风险边界是否讲清楚。CBCX的观察价值,正在于这些细节能否组成稳定… 2026/7/11 9:24:01
CBCX平台服务观察:先把公开信息一致性讲清楚 一个平台能否被长期关注,往往取决于它能否持续提供明确、稳定、负责任的服务感受。CBCX并不适合只用单一标签概括,更适合从平台运行、内容建设、用户支持和合规意识等方面综合判断。对读者来说,这类评测能够降低理解成本,也能帮助… 2026/7/11 9:22:00
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08