news 2026/4/11 11:17:41

uniapp在app端扫码核销(支持自定义内容)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
uniapp在app端扫码核销(支持自定义内容)

效果图如下

本文将详细介绍如何使用 nvue + Barcode 模块实现一个完整的自定义扫码页面。
为什么选择 nvue?
因为uniapp中这个组件的限制

配置:
首先需要在 `manifest.json` 中启用 Barcode 模块:

{ "app-plus": { "modules": { "Barcode": {}, "Camera": {} }, "distribute": { "android": { "permissions": [ "<uses-permission android:name=\"android.permission.CAMERA\"/>" ] } } } }

2. pages.json 配置

在 `pages.json` 中注册页面并隐藏导航栏: { "path": "pages/Shops/code", "style": { "navigationBarTitleText": "扫一扫", "app-plus": { "titleNView": false } } }

页面完整代码

<template> <view class="page"> <!-- 状态栏占位 --> <view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view> <!-- 自定义导航栏 --> <view class="nav-bar"> <view class="nav-back" @click="goBack"> <uni-icons type="left" size="18" color="#333333"></uni-icons> </view> <text class="nav-title">订单核销</text> <view class="nav-placeholder"></view> </view> <!-- 扫码区域容器 --> <view class="scan-container"> <!-- Barcode 组件 --> <barcode ref="barcode" class="barcode" :autostart="false" @marked="onMarked" @error="onError"> </barcode> <!-- 底部提示 --> <view class="bottom-tip" @click="goToManualInput"> <text class="tip-text">无法识别?试试</text> <text class="tip-link">手动输入核销码</text> </view> </view> </view> </template>

Js逻辑代码

export default { data() { return { statusBarHeight: 0, isScanning: false // 防止重复扫码 } }, created() { // 获取状态栏高度,适配不同机型 const systemInfo = uni.getSystemInfoSync(); this.statusBarHeight = systemInfo.statusBarHeight || 0; }, onReady() { // 页面首次加载时启动扫码 this.startScan(); }, onShow() { // 页面显示时重新启动扫码(处理返回场景) this.isScanning = false; this.startScan(); }, methods: { // 启动扫码 startScan() { this.$nextTick(() => { try { const barcode = this.$refs.barcode; if (barcode && barcode.start) { barcode.start(); console.log('扫码已启动'); } } catch (e) { console.log('启动扫码失败:', e); } }); }, // 扫码成功回调 onMarked(e) { // 防止重复处理 if (this.isScanning) { return; } this.isScanning = true; const result = e.detail.code; console.log('扫码结果:', result); // 处理扫码结果 this.handleScanResult(result); // 延迟重置标志 setTimeout(() => { this.isScanning = false; }, 2000); }, // 扫码失败回调 onError(e) { console.log('扫码错误:', e); uni.showToast({ title: '扫码失败', icon: 'none' }); }, // 处理扫码结果 handleScanResult(code) { // 跳转到处理页面或调用接口 uni.navigateTo({ url: '/pages/result?code=' + code }); }, // 手动输入 goToManualInput() { uni.navigateTo({ url: '/pages/manualInput' }); }, // 返回 goBack() { uni.navigateBack({}); } } }

关于css就不公布了,大家可以自己定义。

遇到的一些问题:
1.页面黑屏(考虑Barcode 组件未正确启动)

// 确保在 $nextTick 中启动 this.$nextTick(() => { const barcode = this.$refs.barcode; if (barcode && barcode.start) { barcode.start(); } });

2.扫码后卡死(扫码成功后组件未停止,继续占用摄像头)

- 使用 `isScanning` 标志防止重复处理

- 在 `onShow` 中重置状态

3.返回后无法扫码(autostart 只在首次加载时生效)

onShow() {

this.startScan(); // 手动重启

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 9:06:05

如何设计Agentic AI的“引导式反馈”?提示工程架构师的5个技巧

如何设计Agentic AI的“引导式反馈”?提示工程架构师的5个实战技巧 一、引言:为什么你的Agent反馈总“踩坑”? 你有没有过这样的经历? 让Agent写一份产品推广方案,反馈“这个方案不够有冲击力”,结果它改出来的版本更平淡了; 让Agent处理客户投诉,反馈“回复要更友好…

作者头像 李华
网站建设 2026/4/5 9:38:26

基于Python+Django的框架的襄阳四方汽车检测站管理系统(源码+lw+部署文档+讲解等)

课题介绍本课题针对襄阳四方汽车检测站管理中存在的检测预约低效、车辆检测记录杂乱、检测人员排班不便、设备维护不及时、检测报告生成繁琐等痛点&#xff0c;设计并实现基于PythonDjango的襄阳四方汽车检测站管理系统。后端采用Python语言结合Django框架搭建高效稳定的服务架…

作者头像 李华
网站建设 2026/3/26 22:54:22

基于Python+Django的协同过滤算法在线教育平台的设计与实现(源码+lw+部署文档+讲解等)

课题介绍本课题针对在线教育平台中课程推荐同质化、用户找课效率低、学习需求与课程匹配度不足、学习体验不佳等痛点&#xff0c;设计并实现基于PythonDjango的协同过滤算法在线教育平台。后端采用Python语言结合Django框架搭建高效稳定的服务架构&#xff0c;整合ORM框架实现数…

作者头像 李华
网站建设 2026/4/10 2:45:08

大模型十年演进

大模型&#xff08;Large Language Models, LLMs&#xff09; 的十年&#xff08;2015–2025&#xff09;&#xff0c;是从“特定任务的神经翻译”向“具备自我进化能力的通用人工智能&#xff08;AGI&#xff09;”跨越的十年。 这十年见证了“规模定律&#xff08;Scaling L…

作者头像 李华
网站建设 2026/4/7 9:56:40

基于空间视频智能解析的防护作业区人员统计与工服分类一体化技术方案

基于空间视频智能解析的 防护作业区人员统计与工服分类一体化技术方案 &#xff08;融合三维实时重构的空间级安全感知体系&#xff09; 一、项目背景与问题本质 在危化品作业区、应急处置现场、封闭式工业生产区域等高风险、高不确定性场景中&#xff0c;人员安全始终是安全…

作者头像 李华