使用前端技術創建 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 表格控件在報表勾稽分析領域的應用場景解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章