原生JS如何实现可配置DM码

news2024/11/17 7:40:54

原生JS如何实现可配置DM码

一、 DM码简介

1、 Data Matrix码

Data Matrix码是一种二维条形码,简称DM码,由美国公司International Data Matrix, Inc.(I.D. Matrix)在1994年发明,Data Matrix码中的行数和列数随二维码中存储的信息量而增加,信息限值是2335个字母数字字符。
1)Data Matrix码的外观
Data Matrix码通常是方形,有时也为矩形,由按网格或“矩阵”排列的多个明暗方形点或“单元格”组成,由码一侧的L形图案定义,并形成两条实线相邻边界。这种“寻像图形”可帮助相机扫描仪定位二维码。
在这里插入图片描述

2)如何扫描Data Matrix码
可以使用Data Matrix码扫描仪或全向相机扫描仪从任何角度扫描Data Matrix码。一些智能手机摄像头能对Data Matrix码进行扫描,但许多智能手机没有内置功能,需要第三方应用程序来读取信息。

2、QR码

提到了DM码就不说一下QR码,二者同属于二维码。QR码也能从任何角度读取。由日本的电装株式会社(Denso Corporation)于1994年发明,最多可存储4296个字母数字字符,具体取决于其中包含的行数和列数。

1)QR码的外观
QR码是由在对比背景上按网格排列的深色或浅色方格组成。
为了帮助扫描仪识别二维码,QR码在码左上角、右上角和左下角的三个相同方形结构中包含“寻像图形”。
在这里插入图片描述

2)如何扫描QR码?
与Data Matrix码一样,QR码可以使用专门QR码扫描仪或相机扫描仪从任何方向进行扫描。近年来,一些手机制造商已开始将QR码读取加入标准相机功能中。因此,在面向客户的应用中,QR码比Data Matrix码略有优势,因为用户可以直接使用手机摄像头扫描二维码,而无需使用专门的应用程序。
3、Data Matrix码和QR码有什么区别?
QR Code采用的是矩阵式编码,将数据按照一定规则编码成黑白方块,即使部分区域损坏或遮挡也能正确读取。
Data Matrix采用的是方格式编码,将数据编码成黑白方格,并且具有高密度的数据存储能力。Data Matrix适合在有限的空间中存储少量数据,如标签、包装盒等。与QR Code相比,Data Matrix通常需要更高分辨率的扫描仪或摄像头才能读取。

QR Code适合存储大量数据,并具备容错性;而Data Matrix适合存储少量数据,具备高密度存储能力。如果需要存储较少的数据,Data Matrix可能更适合;如果需要存储大量的数据,QR Code可能更合适。在实际应用中,Data Matrix码常用于内部产品识别和防伪应用,而QR码已成为大多数面向消费者应用的标准格式。

二、目标效果

在这里插入图片描述

组件可配置属性:
value文本 DM码文本信息;
margin边距 DM码边距;
foreground前景色 DM码方格颜色;
background背景色 DM码底层背景色;

三、 实现步骤

实现主要涉及两个文件,界面文件Dmcode.vue和方法文件datamatrix.js,后文会贴出全部代码。

1、定义页面挂载对象dmcode

<template>
  <div class="print-dmcode" ref="dmcode">
    <div class="dmcode-element" v-html="dmContent"></div>
  </div>
</template>

2、定义用户可配置属性(从上层接收)

props: {
   
  value: {
   
    type: String,
    default: 'hello world',
  },
  margin: {
   
    type: Number,
    default: 0,
  },
  background: {
   
    type: String,
    default: '#FFFFFF',
  },
  foreground: {
   
    type: String,
    default: '#000000',
  }

3、编写初始化各配置项方法

mounted() {
   
  this.renderCode()
}

相关方法:

methods: {
   
  renderCode() {
   
    if (!this.container) {
   
      this.container = this.$refs['dmcode'].querySelector('.dmcode-element')
    }
    try {
   
      if(this.container){
   
        let value = this.$parse(this.value)
        // 空字符串CODE128报错,阻塞模板渲染,增加判断
        if (value) {
   
          const options = {
   
            msg :  this.value          // msg,必填
            ,dim :   this.size.h       // height,高度
            ,rct :   0                 //是否为矩形,0否 1是
            ,pad :   this.margin        // padding,默认值为2px,设置0表示无填充
            ,pal : [this.foreground, this.background]  // [前景色, 背景色]
            ,vrb :   0                 // svg node is optimized to be compact and default value is 0, set this parameter to 1 in case you need more verbose output.
          }
          const svgNode = DATAMatrix(options); 
          this.dmContent = svgNode.outerHTML
        }
      }
    } catch (e) {
   
      if (typeof e === 'string') {
   
        this.$message.error(e)
      } else {
   
        this.$message.error(e && e.message)
      }
    }
  }
},

核心方法DATAMatrix()下文会讲

4、引入原生js方法文件datamatrix.js

import DATAMatrix from '../../../../core/utils/datamatrix '

具体文件位置根据自己实际路径为准。下面为DATAMatrix.js文件全部代码,开箱即用,直接复制即可。

/**
 * DM二维码生成方法
 * Created by guohuijie5 on 2024/3/18. 
 */
export function DATAMatrix( Q ) {
   
   var
    M = []
   ,xx = 0
   ,yy = 0
   ,bit = function( x, y ) {
   
         M[ y ] = M[ y ] || [],
         M[ y ][ x ] = 1;
      }
   ,toAscii = function( t ) {
   
      var
      r = [],
      l = t.length;
      for( var i = 0; i < l; i++ ) {
   
         var
         c = t.charCodeAt( i ),
         c1 = ( i + 1 < l ) ? t.charCodeAt( i + 1 ) : 0;
         if( c > 47 && c < 58 && c1 > 47 && c1 < 58 ) {
    /* 2 digits */
            r.push( ( c - 48 ) * 10 + c1 + 82 ), /* - 48 + 130 = 82 */
            i++;
         } else if( c > 127 ) {
    /* extended char */
            r.push( 235 ),
            r.push( ( c - 127 ) & 255 );
         } else r.push( c + 1 ); /* char */
      }
      return r;
   }
   ,toBase = function( t ) {
   
      var
      r = [ 231 ], /* switch to Base 256 */
      l = t.length;
      if( 250 < l ) {
   
         r.push( 37 + ( l / 250 | 0 ) & 255 ); /* length high byte (in 255 state algo) */
      }
         r.push( l % 250 + 149 * ( r.length + 1 ) % 255 + 1 & 255 ); /* length low byte (in 255 state algo) */
      for( var i = 0; i < l; i++ ) {
   
         r.push( t.charCodeAt( i ) + 149 * ( r.length + 1 ) % 255 + 1 & 255 ); /* data in 255 state algo */
      }
      return r;
   }
   ,toEdifact = function( t ) {
   
      var
      n = t.length,
      l = ( n + 1 ) & -4, cw = 0, ch,
      r = ( l > 0 ) ? [ 240 ] : []; /* switch to Edifact */

      for( var i = 0; i < l; i++ ) {
   
         if( i < l - 1 ) {
   
            /* encode char */
            ch = t.charCodeAt( i );
            if( ch < 32

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

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

相关文章

LangChain 与 Elastic 合作为 RAG 添加向量数据库和语义重排序

作者&#xff1a;来自 Elastic Max Jakob 在过去的一年中&#xff0c;我们看到了生成式人工智能领域的许多进展。许多新服务和库应运而生。LangChain 已成为使用大型语言模型 (LLM) 构建应用程序的最受欢迎的库&#xff0c;例如检索增强生成 (RAG) 系统。该库使原型设计和试验不…

汇凯金业:黄金5g工艺是什么意思

黄金5g工艺是一种新型黄金饰品工艺&#xff0c;它在生产加工过程中&#xff0c;通过在黄金中添加一定量的稀有元素&#xff0c;使得黄金的分子结构更加紧密。这种创新工艺不仅提升了黄金的纯度&#xff0c;还改善了其物理特性&#xff0c;使其成为市场上一种备受关注的黄金饰品…

到底要不要报考“通信工程”?(2024版)

又到了高考季。为了方便广大考生全面了解“通信工程”专业&#xff0c;小枣君特此更新了这篇经典文章。 █ “通信工程”的基本介绍 通信工程&#xff0c;英文全称叫做Communication Engineering&#xff0c;是一门重要的工学基础学科。 根据教育部《学位授予和人才培养学科目录…

LLM主要类别架构

LLM主要类别架构介绍 LLM主要类别 LLM本身基于transformer架构。自2017年&#xff0c;attention is all you need诞生起&#xff0c;transformer模型为不同领域的模型提供了灵感和启发。基于原始的Transformer框架&#xff0c;衍生出了一系列模型&#xff0c;一些模型仅仅使用…

Java版电子招标采购系统源码:实现企业采购战略与流程的数字化革新

随着企业的发展&#xff0c;内部采购管理面临着日益增长的挑战。为了提升采购效率&#xff0c;确保采购过程的透明性和公正性&#xff0c;企业需要一个高效、规范的电子招标采购系统。鸿鹄电子招投标系统正是为此而设计&#xff0c;它采用Java技术&#xff0c;结合先进的微服务…

5.冒泡+选择+插入+希尔

一、排序算法 排序基础 1.排序算法的稳定性 2.何为原地排序算法 1.冒泡排序 从下面第一个元素开始往上冒泡&#xff0c;一轮冒泡下来&#xff0c;最大的元素就去了最上面了 步骤&#xff1a;无序数组 每次冒泡都可以将最大的元素放到最右边去 第一轮比较了5次&#xff1a;…

3D数字化营销——电商行业提升转化率,降低退货率的杀手锏!

随着3D、AR等前沿技术的蓬勃发展&#xff0c;电商行业正迎来一场3D数字化营销的革命。这种创新的营销方式不仅极大地丰富了商品的展现形式&#xff0c;还成功弥补了传统电商在临场感和体验感方面的不足&#xff0c;从而显著提升了消费者的购物体验。 51建模网为电商行业提供3D…

C++:十大排序

目录 时间复杂度分析 选择排序 引言 算法思想 动图展示 代码实现 (升序) 优化 代码实现 分析 冒泡排序 引言 算法思想 动图展示 代码实现 插入排序 引言 算法思想 动图展示 代码实现 计数排序 引言 算法思想 动图展示 代码实现 桶排序 引言 算法思…

python学习—合并多个Excel工作簿表格文件

系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停&#xff0c;游戏抽签抽奖 python学习—循环语句-控制流 文章目录 系列文章目录功能说明1 准备工作&#…

Python内存管理与垃圾回收机制

目录 一、引言 二、Python内存管理概述 三、引用计数机制 四、垃圾回收机制 标记-清除&#xff08;Mark-and-Sweep&#xff09; 分代收集&#xff08;Generational Collection&#xff09; 五、内存泄漏与优化 六、总结 一、引言 Python作为一门高级编程语言&#xff…

基于Java技术的ERP管理系统:企业资源规划的先进解决方案

在当前数字化转型的趋势下&#xff0c;企业对于高效、稳定且具备扩展性的管理系统的需求日益增加。为了满足这一需求&#xff0c;我们开发了一款基于Java技术的鸿鹄ERP&#xff08;企业资源规划&#xff09;管理系统。该系统采用了Spring Cloud Alibaba、Spring Boot、MybatisP…

ArrayList浅析

目录 一、ArrayList源码1.1 迭代器1.1.1 Itr源码浅析1.1.2 ListItr源码浅析 1.2 常用方法1.3 System.arraycopy1.4 ArrayList 的创建方式 二、引申问题2.1 ArrayList的大小是如何增加的&#xff1f;2.2 什么情况下你会使用ArrayList2.3 在索引中ArrayList的增加或者删除某个对象…

JVM 一些常见问题QA

GC Roots 虚拟机栈中引用的对象&#xff1b; 本地方法栈中JNI引用的对象&#xff1b; 方法区中类静态变量引用的对象&#xff1b; 方法区中常量引用的对象&#xff1b; Full GC是Minor GCMajor GC吗&#xff1f; Minor GC&#xff1a;回收年轻代&#xff1b; Major GC&…

比特币私钥公钥地址生成

比特币私钥公钥地址生成算法 原理 实现 #!coding:utf8#author:yqq #date:2019/3/4 0004 14:35 #description: 比特币地址生成算法import hashlib import ecdsa import os#2019-05-15 添加私钥限制范围 g_b58 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz#g…

写个代码扫描插件,再也不怕 log4j 等问题

引言 关于静态代码扫描&#xff0c;大家想必都非常熟悉了&#xff0c;比如 lint、detekt 等&#xff0c;这些也都是常用的扫描工具。但随着隐私合规在国内越来越趋于常态&#xff0c;我们经常需要考虑某些危险api的调用排查等等&#xff0c;此时上述的工具往往不容易实现现有的…

PHP开发的爱情盲盒交友系统网站源码

源码介绍 PHP开发的爱情盲盒交友系统网站源码 独立后台 源码截图 源码下载 PHP开发的爱情盲盒交友系统网站源码

TCPListen客户端和TCPListen服务器

创建项目 TCPListen服务器 public Form1() {InitializeComponent();//TcpListener 搭建tcp服务器的类&#xff0c;基于socket套接字通信的//1创建服务器对象TcpListener server new TcpListener(IPAddress.Parse("192.168.107.83"), 3000);//2 开启服务器 设置最大…

Kali Linux 2022.2 发布,包含 10 个新工具和WSL 改进

Offensive Security发布了Kali Linux 2022.2&#xff0c;这是2022年的第二个版本&#xff0c;具有桌面增强功能&#xff0c;有趣的愚人节屏幕保护程序&#xff0c;WSL GUI改进&#xff0c;终端调整&#xff0c;最重要的是&#xff0c;新的工具&#xff01; Kali Linux是一个Li…

Python | Leetcode Python题解之第148题排序链表

题目&#xff1a; 题解&#xff1a; class Solution:def sortList(self, head: ListNode) -> ListNode:def merge(head1: ListNode, head2: ListNode) -> ListNode:dummyHead ListNode(0)temp, temp1, temp2 dummyHead, head1, head2while temp1 and temp2:if temp1.v…

Django中使用下拉列表过滤HTML表格数据

在Django中&#xff0c;你可以使用下拉列表&#xff08;即选择框&#xff09;来过滤HTML表格中的数据。这通常涉及两个主要步骤&#xff1a;创建过滤表单和处理过滤逻辑。 创建过滤表单 首先&#xff0c;你需要创建一个表单&#xff0c;用于接收用户选择的过滤条件。这个表单可…