uniapp条形码实现

news2024/9/28 4:32:27

条形码在实际应用场景是经常可见的。

这里教大家如何集成uniapp条形码。条形码依赖类库JsBarcode.

下载JsBarcode源码,对CanvasRenderer进行了改进兼容uniapp。

import merge from "../help/merge.js";
import {calculateEncodingAttributes, getTotalWidthOfEncodings, getMaximumHeightOfEncodings} from "./shared.js";

class CanvasRenderer{
	constructor(canvas, encodings, options){
		this.canvas = canvas;
		this.encodings = encodings;
		this.options = options;
	}

	render(){
		// Abort if the browser does not support HTML5 canvas
		// if (!this.canvas.getContext) {
		// 	throw new Error('The browser does not support canvas.');
		// }
		
		this.initSize()
		setTimeout(() => {
			this.prepareCanvas();
		   for(let i = 0; i < this.encodings.length; i++){
				var encodingOptions = merge(this.options, this.encodings[i].options);
				this.drawCanvasBarcode(encodingOptions, this.encodings[i]);
				this.drawCanvasText(encodingOptions, this.encodings[i]);
				this.moveCanvasDrawing(this.encodings[i]);
		   }
		   this.canvas.draw();
		}, 50);
		
		// this.restoreCanvas();
	}
	initSize(){
		var ctx = this.canvas;
		calculateEncodingAttributes(this.encodings, this.options, ctx);
		var totalWidth = getTotalWidthOfEncodings(this.encodings);
		var maxHeight = getMaximumHeightOfEncodings(this.encodings);
		this.options.thiz.canvasWidth = totalWidth + this.options.marginLeft + this.options.marginRight;
		this.options.thiz.canvasHeight = maxHeight;
	}
	prepareCanvas(){
		// Get the canvas context
		var ctx = this.canvas;
		// ctx.save();
		// fixEncodings(this.encodings, this.options, ctx)
		// Paint the canvas
		ctx.clearRect(0, 0, this.options.thiz.canvasWidth, this.options.thiz.canvasHeight);
		if(this.options.background){
			ctx.fillStyle = this.options.background;
			ctx.fillRect(0, 0, this.options.thiz.canvasWidth, this.options.thiz.canvasHeigh);
		}

		ctx.translate(this.options.marginLeft, 0);
	}

	drawCanvasBarcode(options, encoding){
		// Get the canvas context
		var ctx = this.canvas;
		 
		var binary = encoding.data;

		// Creates the barcode out of the encoded binary
		var yFrom;
		if(options.textPosition == "top"){
			yFrom = options.marginTop + options.fontSize + options.textMargin;
		}
		else{
			yFrom = options.marginTop;
		}

		// ctx.fillStyle = options.lineColor;
		ctx.setFillStyle(options.lineColor)
		for(var b = 0; b < binary.length; b++){
			var x = b * options.width + encoding.barcodePadding;

			if(binary[b] === "1"){
				ctx.fillRect(x, yFrom, options.width, options.height);
			}
			else if(binary[b]){
				ctx.fillRect(x, yFrom, options.width, options.height * binary[b]);
			}
		}
	}

	drawCanvasText(options, encoding){
		// Get the canvas context
		var ctx = this.canvas;
		var font = options.fontOptions + " " + options.fontSize + "px " + options.font;

		// Draw the text if displayValue is set
		if(options.displayValue){
			var x, y;

			if(options.textPosition == "top"){
				y = options.marginTop + options.fontSize - options.textMargin;
			}
			else{
				y = options.height + options.textMargin + options.marginTop + options.fontSize;
			}

			// ctx.font = font;
			if(options.fontSize){
				ctx.setFontSize(options.fontSize)
			}
			if(options.lineColor){
				ctx.setFillStyle(options.lineColor)
			}

			// Draw the text in the correct X depending on the textAlign option
			if(options.textAlign == "left" || encoding.barcodePadding > 0){
				x = 0;
				ctx.textAlign = 'left';
			}
			else if(options.textAlign == "right"){
				x = encoding.width - 1;
				ctx.textAlign = 'right';
			}
			// In all other cases, center the text
			else{
				x = encoding.width / 2;
				ctx.textAlign = 'center';
			}

			ctx.fillText(encoding.text, x, y);
		}
	}



	moveCanvasDrawing(encoding){
		var ctx = this.canvas;
		ctx.translate(encoding.width, 0);
	}

	restoreCanvas(){
		// Get the canvas context
		var ctx = this.canvas;
		ctx.restore();
	}
}

export default CanvasRenderer;

uniapp核心条码组件库

<template>
	<view class="barcode" >
		<!-- #ifndef MP-ALIPAY -->
		<canvas :canvas-id="elid" :id="elid"  type="2D" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}" />
		<!-- #endif -->
		<!-- #ifdef MP-ALIPAY -->
		<canvas :id="elid" :width="canvasWidth" :height="canvasHeight" />
		<!-- #endif -->
	</view>
</template>

<script>
	import JsBarcode from "./jsbarcode/JsBarcode.js"
	export default {
		data() {
			return {
				canvasWidth: 0,
				canvasHeight: 0,
				elid: this.$u.guid()
			}
		},
		props: {
			format:{
				type: String,
				default: 'CODE128'
			},
			text: {
				type: String,
				default: '123'
			},
			width: {
				type: Number,
				default: 2
			},
			height: {
				type: Number,
				default: 60
			},
			background: {
				type: String,
				default: '#ffffff'
			},
			fontSize:{
				type: Number,
				default: 20
			},
			margin:{
				type: Number,
				default: 5
			},
			// fontColor: {
			// 	type: String,
			// 	default: '#000000'
			// },
			lineColor: {
				type: String,
				default: '#000000'
			},
			displayValue: {
				type: Boolean,
				default: true
			},
			//bottom 或者 top
			textPosition:{
				type: String,
				default: 'bottom'
			}	
		},
		// 在实例挂载完成后被立即调用
		//兼容非动态取值(二维码为固定内容)
		mounted() { 
			this.renderCode()
		},
		watch: {
			text(newVal, oldVal) { //监测到text值发生改变时重新绘制
				this.renderCode()
			}
		},
		methods: {
			// 二维码生成工具
			renderCode() {
				let ctx = uni.createCanvasContext(this.elid,this)
				JsBarcode(ctx, this.text, {
					  format:this.format,
					  thiz:this,
					  width:this.width,
					  height:this.height,
					  background:this.background,
					  lineColor:this.lineColor,
					  margin:this.margin,
					  fontSize:this.fontSize,
					  fontColor:this.fontColor,
					  textPosition:this.textPosition,
					  displayValue: this.displayValue
				});
			}
		}
	}
</script>

<style>
	.barcode {
		display: flex;
		align-items: center;
		justify-content: center;
	}
</style>

uniapp环境下预览效果

 

 

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

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

相关文章

POSTGRESQL 关于2023-08-14 数据库自动启动文章中使用KILL 来进行配置RELOAD的问题解释...

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…

Text-to-SQL小白入门(二)——Transformer学习

摘要 本文主要针对NLP任务中经典的Transformer模型的来源、用途、网络结构进行了详细描述&#xff0c;对后续NLP研究、注意力机制理解、大模型研究有一定帮助。 1. 引言 在上一篇《Text-to-SQL小白入门&#xff08;一&#xff09;》中&#xff0c;我们介绍了Text-to-SQL研究…

Java版电子招投标管理系统源码-电子招投标认证服务平台-权威认证 tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;…

【mysql】—— 表的增删改查

目录 序言 &#xff08;一&#xff09;Create操作 1、单行数据 全列插入 2、多行数据 指定列插入 3、插入否则更新 4、直接替换 &#xff08;二&#xff09;Retrieve操作 1、SELECT 列 1️⃣全列查询 2️⃣指定列查询 3️⃣查询字段为表达式 4️⃣为查询结果指定…

无涯教程-Perl - sprintf函数

描述 此函数使用FORMAT基于LIST中的值返回格式化的字符串。本质上与printf相同,但是返回格式化的字符串而不是将其打印。 语法 以下是此函数的简单语法- sprintf FORMAT, LIST返回值 此函数返回SCALAR(格式化的文本字符串)。 例 以下是显示其基本用法的示例代码- #!/us…

SQL Injection

SQL Injection 就是通过把恶意的sql命令插入web表单递交给服务器&#xff0c;或者输入域名或页面请求的查询字符串递交到服务器&#xff0c;达到欺骗服务器&#xff0c;让服务器执行这些恶意的sql命令&#xff0c;从而让攻击者&#xff0c;可以绕过一些机制&#xff0c;达到直…

【Android Studio】 win11 安装配置 jdk17 超详细

概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 一、下载JDK JDK官网 这里下载 JDK17 windows x64 installer 二、安装JDK 双击打开下载的 j…

计算机毕设项目之基于django+mysql的疫情实时监控大屏系统(前后全分离)

系统阐述的是一款新冠肺炎疫情实时监控系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体…

AutoSAR配置与实践(基础篇)3.1 BSW架构和主要功能概要

传送门 点击返回 ->AUTOSAR配置与实践总目录 AutoSAR配置与实践(基础篇)3.1 BSW架构和主要功能概要 一、什么叫BSW二、分层介绍BSW主要功能2.1 微处理器抽象层MCAL2.2 ECU抽象层2.3 服务层2.4 复杂驱动CDD三、总结BSW各层主要功能一、什么叫BSW BSW是Basic Software的缩…

LeetCode150道面试经典题-- 合并两个有序链表(简单)

1.题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.示例 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

使用Kaptcha生成验证码

说明&#xff1a;验证码&#xff0c;是登录流程中必不可少的一环&#xff0c;一般企业级的系统&#xff0c;使用都是专门制作验证码、审核校验的第三方SDK&#xff08;如极验&#xff09;。本文介绍&#xff0c;使用谷歌提供的Kaptcha技术&#xff0c;制作一个简单的验证码。 …

关系代数运算中的集合运算符和关系运算符

关系代数是一种抽象的查询语言&#xff0c;是研究关系模型的数学工具。关系代数的运算对象是关系&#xff0c;运算结果也是关系。关系代数运算符主要分为集合运算符和关系运算符两大类。 集合运算符有笛卡尔积、并、交、差&#xff0c;关系运算符有除、选择、投影、连接&#x…

ABAP内表与XML格式互转

1需求说明 在系统交互中需要将SAP内表转换为XML文件&#xff0c;发送给其他系统&#xff0c;并且将其他系统返回的XML文件转换为SAP内表。 2创建转换编辑器 事务代码&#xff1a;STRANS 选择简单转换 以图形方式编辑 右键插入新行 选择参考的类型。此处的TYPE类型是SE11中创…

基于STM32的指纹门禁系统

基于STM32的指纹门禁系统 系统简介 指纹系统&#xff0c;可以存指纹&#xff1b;指纹对了之后开门&#xff1b; 材料 STM32F103C8T6芯片OLED液晶显示屏杜邦线AS608模块用keil5进行开发 开始制作 制作过程 AS608模块调试 模块原理 模块是通过串口通信,采用回复式通信。 这…

基于Python编写个语法解析器

这篇文章主要为大家详细介绍了如何基于Python编写个语法解析器&#xff0c;文中的示例代码讲解详细&#xff0c;具有一定的学习价值&#xff0c;感兴趣的小伙伴可以了解一下 − 目录 前言选型效果实现 字符指针错误类型语法解析交互 前言 目的纯粹&#xff0c;基于Python做…

26、springboot的自动配置03--核心功能--自定义条件注解及使用

开发自己的自动配置------开发自己的条件注解 ★ 自定义条件注解 好处有两个&#xff1a; 1. 真正掌握Spring boot条件注解的本质。 2. 项目遇到一些特殊的需求时&#xff0c;也可以开发自己的自定义条件注解来解决问题。自定义条件注解&#xff1a; ▲ 所有自定义注解其实都…

香港服务器三网直连内地线路什么意思?好用吗?

​  三网直连内地是指香港服务器可以直接连接中国内地的电信、联通和移动三大运营商网络&#xff0c;避免了中间网络干线的支持。这样可以实现直接、快速、稳定的网络访问&#xff0c;提高用户对网络访问的效率&#xff0c;减少网络访问问题和拥堵的现象。 香港服务器直连内地…

开源项目AJ-Captcha使用小结

在网上看到开源项目AJ-Captcha&#xff0c;想把它加入到自己的项目中&#xff0c;遇到了一些问题&#xff0c;记录一下。 AJ-Captcha: 行为验证码(滑动拼图、点选文字)&#xff0c;前后端(java)交互&#xff0c;包含vue/h5/Android/IOS/flutter/uni-app/react/php/go/微信小程…

C# 读取pcd点云文件数据

pcd文件有ascii 和二进制格式&#xff0c;ascii可以直接记事本打开&#xff0c;C#可以一行行读。但二进制格式的打开是乱码&#xff0c;如果尝试程序中读取&#xff0c;对比下看了数据也对不上。 这里可以使用pcl里的函数来读取pcd&#xff0c;无论二进制或ascii都可以正确读取…

Fortinet数据中心防火墙及服务ROI超300%,Forrester TEI研究发布

近日&#xff0c;专注网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;联合全球知名分析机构Forrester发布总体经济影响独立分析报告&#xff0c;详细阐述了在企业数据中心部署 FortiGate 下一代防火墙&#xff08;NGFW&#xff09…