基于前端技術的QR碼API開發實戰:從原理到部署

前言

QR碼(Quick Response Code)是一種二維碼,于1994年開發。它能快速存儲和識別數據,包含黑白方塊圖案,常用于掃描獲取信息。QR碼具有高容錯性和快速讀取的優點,廣泛應用于廣告、支付、物流等領域。通過掃描QR碼,用戶可以快速獲取信息和實現便捷操作,為現代生活帶來便利。在本教程中,小編將為大家探討如何使用 NestJS 和 qrcode.js 構建 QR 二維碼,并將其放到Excel中。

環境準備

在開始之前,請確保您具備以下工具和知識:

  • Node.js 和 npm 安裝在您的系統上。
  • 基本了解 TypeScript 和 JavaScript。
  • 熟悉 NestJS 基礎知識(如果沒有,可以參考 NestJS 官方文檔)。

第 1 步:設置 NestJS 項目

創建一個新的 NestJS 項目開始。打開終端并執行以下命令:

# Create a new NestJS project
npx @nestjs/cli new qr-code-generator-api# Move into the project directory
cd qr-code-generator-api

第 2 步:安裝qrcode.js

接下來,安裝該 qrcode.js 軟件包,這將使小編能夠生成二維碼。在項目目錄中運行以下命令:

npm install qrcode

第 3 步:生成二維碼

現在小編已經設置了 NestJS 和qrcode.js,讓小編創建一個 QR 碼生成service。在 NestJS 中,service是負責處理業務邏輯的類。小編將創建一個 QrCodeService ,并利用qrcode.js生成二維碼的代碼。

首先,創建一個在 src 文件夾中命名 qr-code.service.ts 的新文件,并添加以下代碼:

// src/qr-code.service.ts
import { Injectable } from '@nestjs/common';
import * as qrcode from 'qrcode';@Injectable()
export class QrCodeService {async generateQrCode(data: string): Promise<string> {try {const qrCodeDataURL = await qrcode.toDataURL(data);return qrCodeDataURL;} catch (error) {throw new Error('Failed to generate QR code.');}}
}

在上面的代碼中,小編創建了一個 QrCodeService 具有單個方法的 generateQrCode ,此方法將字符串 data 作為輸入,并返回一個 Promise,該 Promise 解析為表示生成的 QR 碼的數據 URL。

第 4 步:創建二維碼Controller

在 NestJS 中,controller處理傳入的請求并與服務交互以提供響應。因此小編創建一個 QR 碼 controller來處理 QR 碼的生成。創建 src 文件夾中命名 qr-code.controller.ts 的新文件,并添加以下代碼:

// src/qr-code.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
import { QrCodeService } from './qr-code.service';@Controller('qr-code')
export class QrCodeController {constructor(private readonly qrCodeService: QrCodeService) {}@Get()async generateQrCode(@Query('data') data: string) {const qrCodeDataURL = await this.qrCodeService.generateQrCode(data);return `<img src="${qrCodeDataURL}" alt="QR Code" />`;}
}
@Controller('qr-code-data')
export class QrDataCodeController {constructor(private readonly qrCodeService: QrCodeService) {}@Get()async generateQrCode(@Query('data') data: string) {const qrCodeDataURL = await this.qrCodeService.generateQrCode(data);return qrCodeDataURL;}
}

在上面的代碼中,小編在路由 /qr-code 上定義了一個 QrCodeController 具有單個 GET 端點的端點。端點需要一個查詢參數 data ,該參數表示將是要編碼到 QR 碼中的內容。controller中 generateQrCode 的方法從 中調用 generateQrCode 該方法, QrCodeService 并在響應中以圖像形式返回 QR 碼。同時也通過 /qr-code-data 上定義了一個 QrDataCodeController 具有單個 GET 端點的端點,并在響應中以base^4形式返回。

第 5 步:連接二維碼module

現在小編已經準備好了service和controller,小編需要將它們連接到一個module中。創建 src 文件夾中命名 qr-code.module.ts 的新文件,并添加以下代碼:

// src/qr-code.module.ts
import { Module } from '@nestjs/common';
import { QrCodeController, QrDataCodeController } from "./qr-code.controller";
import { QrCodeService } from './qr-code.service';@Module({controllers: [QrCodeController,QrDataCodeController],providers: [QrCodeService],
})
export class QrCodeModule {}

在上面的代碼中,小編定義了一個 QrCodeModule 導入 QrCodeController,QrDataCodeController 和 QrCodeService 的 .該模塊將負責提供二維碼生成功能。

第 6 步:修改main.ts

現在小編已經創建了module,讓小編引導 NestJS 應用程序并包含 QrCodeModule。打開文件 src/main.ts 并按如下方式進行修改:

// src/main.ts
import { NestFactory } from '@nestjs/core';
import { QrCodeModule } from './qr-code.module';async function bootstrap() {const app = await NestFactory.create(QrCodeModule);await app.listen(3000);
}
bootstrap();

在上面的代碼中,小編已導入 QrCodeModule 并將其傳遞給 NestFactory.create ,表明小編的應用程序將使用 QrCodeModule .應用程序將偵聽端口 3000(默認為3000,也可以修改端口)。

第 7 步:測試 QR 碼生成器 API

  1. 執行以下命令來運行 NestJS 應用程序:
npm run start
  1. 打開瀏覽器,在地址欄中輸入http://localhost:3000/qr-code?data=Hello%20Spreadjs

替換等于號之后的內容為您要編碼到 QR 碼中的數據。

  1. 您應該會收到一個包含帶有生成的二維碼的 HTML img 標簽的回復。圖像將在響應中顯示為數據 URL。

然后掃描二維碼,如果掃描成功,就代表我們已經創建了一個二維碼。

  1. 打開瀏覽器,在地址欄中輸入http://localhost:3000/qr-code-data?data=Hello%20Spreadjs。返回一個base64碼數據

最后附上完整的項目代碼地址:

https://github.com/wteja/qr-code-generator-api

前端表格組件實現二維碼圖片

在上面介紹的例子中,小編是直接生成了一個二維碼,但是在實際的日常,這種場景其實很少,更多的是將二維碼放在各種 Excel 報告中,除了使用上述的原生 NestJS 和 qrcode.js 之外,還可以嘗試其他的一些支持NestJS的前端表格組件來實現,這樣做的好處是可以減少代碼的開發量。

SpreadJS 是葡萄城推出的基于 HTML5 標準的純前端表格組件,具備高性能、跨平臺、與 Excel高度兼容的產品特性,其設計目的是幫助開發者快速實現瀏覽器中各類 Excel 表格應用,已成功在數據填報、在線表格文檔、類 Excel 報表制作與生成、企業預決算、計量檢測、實驗室管理等領域得到廣泛應用,可讓您快速具備與飛書、語雀、靈犀文檔等同源的表格開發能力。下圖是使用 SpreadJS 實現的一個二維碼樣例:

SpreadJS如同Excel一樣,支持插入圖片,定位圖片。我們在SpreadJS中插入上述拿到的6ase64數據

第1步:獲取Base64數據

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:3000/qr-code-data?data=Hello%20Spreadjs', true);xhr.onload = function (e) {if (this.status == 200) {var base64Data = this.response;}
};xhr.send();

第2步:獲取SpreadJS對象

接下來獲取SpreadJS對象

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"/><!-- 禁用IE兼容視圖 --><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="spreadjs culture" content="zh-cn"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" , user-scalable=no"/><title>SpreadJS demo</title><link href="http://cdn.grapecity.com/spreadjs/hosted/css/gc.spread.sheets.excel2013white.17.0.0.css"rel="stylesheet" type="text/css"/><script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/gc.spread.sheets.all.17.0.0.min.js"></script><script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/plugins/gc.spread.sheets.shapes.17.0.0.min.js"></script>
</head><body>
<div><div id="ss" class="sample-spreadsheets" style="height: 500px;width: 90%;"></div>
</div><script type="text/javascript">window.onload = function () {var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2});  }</script>
</body></html>

新建一個文本文檔,復制上面的代碼,將其后綴修改為.html ,在瀏覽器中打開此文件,發現發現了一個電子表格

第3步:插入圖片

接下來 我們添加圖片

var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), {sheetCount: 2});
let activeSheet = spread.getSheet(0);
activeSheet.setRowHeight(0, 100);
activeSheet.setColumnWidth(0, 100)var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://localhost:3000/qr-code-data?data=Hello%20Spreadjs', true);xhr.onload = function (e) {if (this.status == 200) {var base64Data = this.response;var pic = activeSheet.shapes.addPictureShape("Picture 1", base64Data, 0, 0, 100, 100);pic.startRow(0);pic.startColumn(0);pic.width(100)pic.height(100)}
};
xhr.send();

結果如下:

這樣子就實現了在電子表格中,插入一個二維碼圖片的效果。

怎么,上述過程太復雜,沒有關系,SpreadJS也支持直接創建二維碼。

前端表格組件實現二維碼公式

第1步:打開SpreadJS

打開剛剛的頁面,或者點擊這里重新打開SpreadJS。

第2步:實現二維碼

打開SpreadJS之后,新建一個Sheet頁,然后把想要展示在二維碼上的信息寫下來,如下圖所示:

然后我們隨便找一個空白的單元格,輸入以下公式,空格中輸入顯示信息的單元格位置(比如上圖中的“Hello World”的位置B10)

//空格中為顯示信息的單元格位置
=BC_QRCODE()

然后就會顯示一個二維碼:

掃描該二維碼,手機就會顯示“Hello World”字符串,這樣就完成了一個將二維碼嵌到Excel中的小Demo。(更多樣式的二維碼可以參考這個Demo)

除此之外,還可以用代碼的方式給二維碼賦值:

sheet.setFormula(0,0,'=BC_QRCODE("hello,我是二維碼")');

上述代碼是為A1單元格創建一個公式,公式是=BC_QRCODE(“hello,我是二維碼”),結果是這樣子的:

附上完整的代碼:

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="utf-8"/><meta name="spreadjs culture" content="zh-cn" /><link href="http://cdn.grapecity.com/spreadjs/hosted/css/gc.spread.sheets.excel2013white.17.0.7.css"rel="stylesheet" type="text/css"/><script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/gc.spread.sheets.all.17.0.7.min.js"></script><script src="http://cdn.grapecity.com/spreadjs/hosted/scripts/plugins/gc.spread.sheets.barcode.17.0.7.min.js"></script>
</head><body>
<div><div class="container"><div id="ss" style="width:200%; height:90vh;"></div></div></div>
<script type="text/javascript">window.onload = function () {let  spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));let sheet = spread.getActiveSheet()sheet.setFormula(0,0,'=BC_QRCODE("hello,我是二維碼")');sheet.setRowHeight(0,200)sheet.setColumnWidth(0,200)}</script>
</body>
</html>

總結

在本文中,小編介紹了如何使用 NestJS 和 qrcode.js 創建 QR 二維碼,并借助了純前端表格組件SpreadJS來實現將 QR 二維碼中顯示在Excel中,如果您想了解更多關于SpreadJS的信息,歡迎點擊這里查看。

擴展鏈接:

【干貨放送】財務報表勾稽分析要點,一文讀盡!

為什么你的財務報表不出色?推薦你了解這四個設計要點和!

純前端類 Excel 表格控件在報表勾稽分析領域的應用場景解析

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901644.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901644.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901644.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用耦合有限元和神經網絡計算的骨重塑模擬多尺度方法

Multiscale methodology for bone remodelling simulation using coupled finite element and neural network computation 摘要&#xff1a;本文旨在開發一種基于有限元分析&#xff08;FEA&#xff09;和神經網絡&#xff08;NN&#xff09;計算的多尺度分層混合模型&#xf…

使用異步特征引發的錯誤error[E0195]: lifetime parameters or bounds on method `before_save`

問題描述&#xff1a; 使用SeaOrm保存實體到數據庫時不想每次都設置更新時間&#xff0c;所以想通過實現ActiveModelBehavior在保存實體前統一設置更新時間 impl ActiveModelBehavior for ActiveModel {async fn before_save<C>(self, _db: &C, _insert: bool) -&…

TVS管與ESD保護二極管詳解:原理、區別與應用選型

一、TVS管&#xff08;瞬態電壓抑制二極管&#xff09; 1. 基本定義 TVS管&#xff08;Transient Voltage Suppressor&#xff09; 是一種用于抑制瞬態高壓脈沖的半導體器件&#xff0c;通過雪崩擊穿效應快速鉗位電壓&#xff0c;保護后端電路。 2. 核心特性參數 參數定義公…

Day08 【基于jieba分詞實現詞嵌入的文本多分類】

基于jieba分詞的文本多分類 目標數據準備參數配置數據處理模型構建主程序測試與評估測試結果 目標 本文基于給定的詞表&#xff0c;將輸入的文本基于jieba分詞分割為若干個詞&#xff0c;然后將詞基于詞表進行初步編碼&#xff0c;之后經過網絡層&#xff0c;輸出在已知類別標…

入門-C編程基礎部分:6、常量

飛書文檔https://x509p6c8to.feishu.cn/wiki/MnkLwEozRidtw6kyeW9cwClbnAg C 常量 常量是固定值&#xff0c;在程序執行期間不會改變&#xff0c;可以讓我們編程更加規范。 常量可以是任何的基本數據類型&#xff0c;比如整數常量、浮點常量、字符常量&#xff0c;或字符串字…

第二階段:數據結構與函數

模塊4&#xff1a;常用數據結構 (Organizing Lots of Data) 在前面的模塊中&#xff0c;我們學習了如何使用變量來存儲單個數據&#xff0c;比如一個數字、一個名字或一個布爾值。但很多時候&#xff0c;我們需要處理一組相關的數據&#xff0c;比如班級里所有學生的名字、一本…

【C++算法】61.字符串_最長公共前綴

文章目錄 題目鏈接&#xff1a;題目描述&#xff1a;解法C 算法代碼&#xff1a;解釋 題目鏈接&#xff1a; 14. 最長公共前綴 題目描述&#xff1a; 解法 解法一&#xff1a;兩兩比較 先算前兩個字符串的最長公共前綴&#xff0c;然后拿這個最長公共前綴和后面一個來比較&…

JVM 調優不再難:AI 工具自動生成內存優化方案

在 Java 應用程序的開發與運行過程中&#xff0c;Java 虛擬機&#xff08;JVM&#xff09;的性能調優一直是一項極具挑戰性的任務&#xff0c;尤其是內存優化方面。不合適的 JVM 內存配置可能會導致應用程序出現性能瓶頸&#xff0c;甚至頻繁拋出內存溢出異常&#xff0c;影響業…

紛析云開源財務軟件:企業財務數字化轉型的靈活解決方案

紛析云是一家專注于開源財務軟件研發的公司&#xff0c;自2018年成立以來&#xff0c;始終以“開源開放”為核心理念&#xff0c;致力于通過技術創新助力企業實現財務管理的數字化與智能化轉型。其開源財務軟件憑借高擴展性、靈活部署和全面的功能模塊&#xff0c;成為眾多企業…

【數字圖像處理】數字圖像空間域增強(3)

圖像銳化 圖像細節增強 圖像輪廓&#xff1a;灰度值陡然變化的部分 空間變化&#xff1a;計算灰度變化程度 圖像微分法&#xff1a;微分計算灰度梯度突變的速率 一階微分&#xff1a;單向差值 二階微分&#xff1a;雙向插值 一階微分濾波 1&#xff1a;梯度法 梯度&#xff1…

基于Linux的ffmpeg python的關鍵幀抽取

1.FFmpeg的環境配置 首先強調&#xff0c;ffmpeg-python包與ffmpeg包不一樣。 1) 創建一個虛擬環境env conda create -n yourenv python3.x conda activate yourenv2) ffmpeg-python包的安裝 pip install ffmpeg-python3) 安裝系統級別的 FFmpeg 工具 雖然安裝了 ffmpeg-p…

C#進階學習(四)單向鏈表和雙向鏈表,循環鏈表(上)單向鏈表

目錄 前置知識&#xff1a; 一、鏈表中的結點類LinkedNode 1、申明字段節點類&#xff1a; 2、申明屬性節點類: 二、兩種方式實現單向鏈表 ①定框架&#xff1a; ②增加元素的方法&#xff1a;因為是單鏈表&#xff0c;所以增加元素一定是只能在末尾添加元素&#xff0c;…

RK3588 Buildroot 串口測試工具

RK3588 Buildroot串口測試工具(含代碼) 一、引言 1.1 目的 本文檔旨在指導開發人員能快速測試串口功能 1.2 適用范圍 本文檔適用于linux 系統串口測試。 二、開發環境準備 2.1 硬件環境 開發板:RK3588開發板,確保其串口硬件連接正常,具備電源供應、調試串口等基本硬…

HOJ PZ

https://docs.hdoi.cn/deploy 單體部署 請到~/hoj-deploy/standAlone的目錄下&#xff0c;即是與docker-compose.yml的文件同個目錄下&#xff0c;該目錄下有個叫hoj的文件夾&#xff0c;里面的文件夾介紹如下&#xff1a; hoj ├── file # 存儲了上傳的圖片、上傳的臨…

EtherCAT 的優點與缺點

EtherCAT&#xff08;以太網控制自動化技術&#xff09;是一種高性能的工業以太網協議&#xff0c;廣泛應用于實時自動化控制。以下是其核心優缺點分析&#xff1a; ?一、EtherCAT 的核心優點? 1. ?超低延遲 & 高實時性? ?原理?&#xff1a;采用"?Processing…

高并發多級緩存架構實現思路

目錄 1.整體架構 3.安裝環境 1.1 使用docket安裝redis 1.2 配置redis緩存鏈接&#xff1a; 1.3 使用redisTemplate實現 1.4 緩存注解優化 1.4.1 常用緩存注解簡紹 1.4.2 EnableCaching注解的使用 1.4.3使用Cacheable 1.4.4CachePut注解的使用 1.4.5 優化 2.安裝Ngin…

Qt QML實現Windows桌面顏色提取器

前言 實現一個簡單的小工具&#xff0c;使用Qt QML實現Windows桌面顏色提取器&#xff0c;實時顯示鼠標移動位置的顏色值&#xff0c;包括十六進制值和RGB值。該功能在實際應用中比較常見&#xff0c;比如截圖的時候&#xff0c;鼠標移動就會在鼠標位置實時顯示坐標和顏色值&a…

vue3+vite 多個環境配置

同一套代碼 再也不用在不同的環境里來回切換請求地址了 然后踩了一個坑 就是env的文件路徑是在當前項目下 不是在views內 因為公司項目需求只有dev和pro兩個環境 雖然我新增了3個 但是只在這兩個里面配置了 .env是可以配置一些公共配置的 目前需求來說不需要 所以我也懶得配了。…

AI賦能PLC(一):三菱FX-3U編程實戰初級篇

前言 在工業自動化領域&#xff0c;三菱PLC以其高可靠性、靈活性和廣泛的應用場景&#xff0c;成為眾多工程師的首選控制設備。然而&#xff0c;傳統的PLC編程往往需要深厚的專業知識和經驗積累&#xff0c;開發周期長且調試復雜。隨著人工智能技術的快速發展&#xff0c;利用…

XSS 跨站Cookie 盜取表單劫持網絡釣魚溯源分析項目平臺框架

漏洞原理&#xff1a;接受輸入數據&#xff0c;輸出顯示數據后解析執行 基礎類型&#xff1a;反射 ( 非持續 ) &#xff0c;存儲 ( 持續 ) &#xff0c; DOM-BASE 拓展類型&#xff1a; jquery &#xff0c; mxss &#xff0c; uxss &#xff0c; pdfxss &#xff0c; flashx…