Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Gunakan rangka kerja Gin untuk melaksanakan penjanaan kod QR dan fungsi pengimbasan

Gunakan rangka kerja Gin untuk melaksanakan penjanaan kod QR dan fungsi pengimbasan

王林
王林asal
2023-06-23 08:18:091717semak imbas

Dalam masyarakat moden, kod QR telah menjadi kaedah biasa penghantaran maklumat. Ia boleh menyampaikan maklumat dengan cepat dan memudahkan kehidupan orang ramai. Bagi pembangun, cara menjana dan mengimbas kod QR dengan mudah dan cepat adalah isu yang perlu dipertimbangkan. Dalam artikel ini, kami akan memperkenalkan cara menggunakan rangka kerja Gin untuk merealisasikan penjanaan dan fungsi pengimbasan kod QR.

  1. Pasang rangka kerja Gin dan perpustakaan berkaitan

Mula-mula, kita perlu memasang rangka kerja Gin dan perpustakaan berkaitan. Jalankan arahan berikut untuk melengkapkan pemasangan:

go get -u github.com/gin-gonic/gin
go get -u github.com/skip2/go-qrcode
go get -u github.com/fogleman/gg

Antaranya, gin ialah rangka kerja Gin, go-qrcode ialah perpustakaan untuk menjana kod QR, dan gg ialah perpustakaan untuk menjana gambar.

  1. Jana kod QR

Seterusnya kita perlu menulis kod untuk menjana kod QR. Kita boleh mentakrifkan fungsi yang menghasilkan kod QR Kodnya adalah seperti berikut:

func generateQRCode(c *gin.Context) {
    // 获取传递的参数
    content := c.Query("content")
    size := c.DefaultQuery("size", "256")

    // 生成二维码图片
    qr, err := qrcode.New(content, qrcode.Medium)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    qr.DisableBorder = true
    img := qr.Image(int(size))

    // 将图片存储为PNG格式
    buffer := new(bytes.Buffer)
    err = png.Encode(buffer, img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将图片作为响应输出给客户端
    c.Data(http.StatusOK, "image/png", buffer.Bytes())
}

Dalam kod di atas, kami membaca parameter content yang diluluskan sebagai kandungan kod QR. kita juga boleh lulus sizeParameter untuk menetapkan saiz kod QR, nilai lalai ialah 256. Kami menggunakan fungsi go-qrcode dalam pustaka qrcode.New untuk menjana imej kod QR. Kami juga boleh mengalih keluar sempadan imej melalui atribut DisableBorder. Akhir sekali, kami menggunakan fungsi gg dalam pustaka png.Encode untuk menyimpan imej dalam format PNG dan mengeluarkan imej sebagai respons kepada klien melalui kaedah c.Data rangka kerja Gin.

  1. Imbas kod QR

Selepas menjana kod QR, kita perlu menulis kod untuk mengimbas kod QR. Kami boleh menambah laluan untuk mengimbas kod QR dalam laluan, kodnya adalah seperti berikut:

func scanQRCode(c *gin.Context) {
    // 读取上传的图片文件
    file, err := c.FormFile("file")
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 打开上传的文件
    f, err := file.Open()
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    defer f.Close()

    // 读取文件内容并解码
    img, err := png.Decode(f)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    content, err := qrcode.Decode(img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将解码后的内容作为响应输出给客户端
    c.JSON(http.StatusOK, gin.H{
        "content": content,
    })
}

Dalam kod di atas, kami menggunakan fungsi FormFile rangka kerja Gin untuk membaca fail imej yang dimuat naik. Kami kemudiannya menyahkod kandungan fail melalui fungsi png.Decode dan menggunakan fungsi go-qrcode dalam pustaka qrcode.Decode untuk mengeluarkan kandungan yang dinyahkod kepada klien sebagai respons.

  1. Kod lengkap

Selepas langkah di atas selesai, kami menulis kod lengkap, seperti berikut:

package main

import (
    "bytes"
    "net/http"
    "strconv"

    "github.com/gin-gonic/gin"
    "github.com/fogleman/gg"
    "github.com/skip2/go-qrcode"
)

func main() {
    r := gin.Default()

    // 生成二维码
    r.GET("/qrcode", generateQRCode)

    // 扫描二维码
    r.POST("/qrcode", scanQRCode)

    r.Run()
}

func generateQRCode(c *gin.Context) {
    // 获取传递的参数
    content := c.Query("content")
    sizeStr := c.DefaultQuery("size", "256")

    // 将size参数转换为int类型
    size, err := strconv.Atoi(sizeStr)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 生成二维码图片
    qr, err := qrcode.New(content, qrcode.Medium)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    qr.DisableBorder = true
    img := qr.Image(size)

    // 将图片存储为PNG格式
    buffer := new(bytes.Buffer)
    err = png.Encode(buffer, img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将图片作为响应输出给客户端
    c.Data(http.StatusOK, "image/png", buffer.Bytes())
}

func scanQRCode(c *gin.Context) {
    // 读取上传的图片文件
    file, err := c.FormFile("file")
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 打开上传的文件
    f, err := file.Open()
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    defer f.Close()

    // 读取文件内容并解码
    img, err := png.Decode(f)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }
    content, err := qrcode.Decode(img)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{
            "error": err.Error(),
        })
        return
    }

    // 将解码后的内容作为响应输出给客户端
    c.JSON(http.StatusOK, gin.H{
        "content": content,
    })
}

Dalam kod di atas, kami menggunakan Rangka kerja Gin mentakrifkan dua fungsi pemprosesan generateQRCode dan scanQRCode. Dalam fungsi generateQRCode, kami menggunakan pustaka go-qrcode untuk menjana kod QR dan menggunakan pustaka gg untuk menjana imej format PNG. Dalam fungsi scanQRCode, kami menghuraikan imej kod QR yang dimuat naik, membaca kandungan kod QR, dan akhirnya mengeluarkan kandungan tersebut kepada pelanggan sebagai respons melalui kaedah c.JSON rangka kerja Gin. Kami menggunakan fungsi penghalaan rangka kerja Gin dalam fungsi utama untuk mentakrifkan permintaan GET dan POST di bawah laluan qrcode yang sepadan dengan fungsi menjana kod QR dan mengimbas kod QR masing-masing.

  1. Kesan penggunaan

Selepas melengkapkan kod di atas, kita boleh memulakan perkhidmatan melalui arahan berikut:

go run main.go

Kemudian akses http dalam penyemak imbas: //localhost:8080/qrcode?content=HelloWorld boleh menjana kod QR. Jika kita ingin mengimbas kod QR yang baru kita hasilkan, kita perlu terlebih dahulu menyimpan kod QR sebagai fail imej format PNG, dan kemudian gunakan alat seperti curl atau Postman untuk memuat naik fail imej, contohnya:

curl -X POST -F "file=@qrcode.png" http://localhost:8080/qrcode

Dengan cara ini, kami Anda boleh mendapatkan kandungan yang terkandung dalam kod QR dalam respons yang dikembalikan.

Setakat ini, kami telah berjaya melaksanakan penjanaan kod QR dan fungsi pengimbasan menggunakan rangka kerja Gin, yang memudahkan kerja pembangunan kami.

Atas ialah kandungan terperinci Gunakan rangka kerja Gin untuk melaksanakan penjanaan kod QR dan fungsi pengimbasan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn