登录
首页 >  数据库 >  MySQL

Golang Gin瀹炶返 杩炶浇鍗佷簲 鐢熸垚浜岀淮鐮併€佸悎骞舵捣鎶?/a>

来源:SegmentFault

时间:2023-02-16 17:10:29 427浏览 收藏

有志者,事竟成!如果你在学习数据库,那么本文《Golang Gin瀹炶返 杩炶浇鍗佷簲 鐢熸垚浜岀淮鐮併€佸悎骞舵捣鎶?/a>》,就很适合你!文章讲解的知识点主要包括MySQL、go、PHP,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

鍘熸枃鍦板潃锛?a href="https://link.segmentfault.com/?enc=M0c3He0Nk7euMaqAYCPc4Q%3D%3D.lqTqI9PKx7DWU8v%2FMV4ySD0VEvsazCV4k5vKv1nYlZmcUBIt4A35Uvj2Z8AuinW8" rel="nofollow">Golang Gin瀹炶返 杩炶浇鍗佷簲 鐢熸垚浜岀淮鐮併€佸悎骞舵捣鎶?/a>
椤圭洰鍦板潃锛?a href="https://link.segmentfault.com/?enc=0PvtIiLk2pNc8vA%2FboF6%2BA%3D%3D.HgHyyzRrO2GgU6bSv02%2BRySHjrvoZsS%2BhKwaHBps695Icigk3gkPuWWuyY8xCaVd" rel="nofollow">https://github.com/EDDYCJY/go...

濡傛灉瀵逛綘鏈夋墍甯姪锛屾杩庣偣涓?Star 馃憤

鍓嶈█

鍦ㄦ湰绔犺妭锛屽皢瀹炵幇濡備笅鍔熻兘缁嗛」锛?/p>

1銆佺敓鎴愪簩缁寸爜

2銆佸悎骞舵捣鎶ワ紙鑳屾櫙鍥?+ 浜岀淮鐮侊級

瀹炵幇

棣栧厛锛屼綘闇€瑕佸湪 App 閰嶇疆椤逛腑澧炲姞浜岀淮鐮佸強鍏舵捣鎶ョ殑瀛樺偍璺緞锛屾垜浠害瀹氶厤缃」鍚嶇О涓?

QrCodeSavePath
锛屽€间负
qrcode/

缁忚繃澶氳妭杩炶浇鐨勪綘搴旇鑳藉瀹屾垚锛岃嫢鏈変笉鎳傚彲鍙傜収 go-gin-example

鐢熸垚浜岀淮鐮?/h2>

瀹夎

$ go get -u github.com/boombuler/barcode

宸ュ叿鍖?/h3>

鑰冭檻鐢熸垚浜岀淮鐮佽繖涓€鍔ㄤ綔璐村悎宸ュ叿鍖呯殑瀹氫箟锛屼笖鏈夊叕鐢ㄧ殑鍙兘鎬э紝鏂板缓 pkg/qrcode/qrcode.go 鏂囦欢锛屽啓鍏ュ唴瀹癸細

package qrcode

import (
    "image/jpeg"

    "github.com/boombuler/barcode"
    "github.com/boombuler/barcode/qr"

    "github.com/EDDYCJY/go-gin-example/pkg/file"
    "github.com/EDDYCJY/go-gin-example/pkg/setting"
    "github.com/EDDYCJY/go-gin-example/pkg/util"
)

type QrCode struct {
    URL    string
    Width  int
    Height int
    Ext    string
    Level  qr.ErrorCorrectionLevel
    Mode   qr.Encoding
}

const (
    EXT_JPG = ".jpg"
)

func NewQrCode(url string, width, height int, level qr.ErrorCorrectionLevel, mode qr.Encoding) *QrCode {
    return &QrCode{
        URL:    url,
        Width:  width,
        Height: height,
        Level:  level,
        Mode:   mode,
        Ext:    EXT_JPG,
    }
}

func GetQrCodePath() string {
    return setting.AppSetting.QrCodeSavePath
}

func GetQrCodeFullPath() string {
    return setting.AppSetting.RuntimeRootPath + setting.AppSetting.QrCodeSavePath
}

func GetQrCodeFullUrl(name string) string {
    return setting.AppSetting.PrefixUrl + "/" + GetQrCodePath() + name
}

func GetQrCodeFileName(value string) string {
    return util.EncodeMD5(value)
}

func (q *QrCode) GetQrCodeExt() string {
    return q.Ext
}

func (q *QrCode) CheckEncode(path string) bool {
    src := path + GetQrCodeFileName(q.URL) + q.GetQrCodeExt()
    if file.CheckNotExist(src) == true {
        return false
    }

    return true
}

func (q *QrCode) Encode(path string) (string, string, error) {
    name := GetQrCodeFileName(q.URL) + q.GetQrCodeExt()
    src := path + name
    if file.CheckNotExist(src) == true {
        code, err := qr.Encode(q.URL, q.Level, q.Mode)
        if err != nil {
            return "", "", err
        }

        code, err = barcode.Scale(code, q.Width, q.Height)
        if err != nil {
            return "", "", err
        }

        f, err := file.MustOpen(name, path)
        if err != nil {
            return "", "", err
        }
        defer f.Close()

        err = jpeg.Encode(f, code, nil)
        if err != nil {
            return "", "", err
        }
    }

    return name, path, nil
}

杩欓噷涓昏鑱氱劍

func (q *QrCode) Encode
鏂规硶锛屽仛浜嗗涓嬩簨鎯咃細
  • 鑾峰彇浜岀淮鐮佺敓鎴愯矾寰?/li>
  • 鍒涘缓浜岀淮鐮?/li>
  • 缂╂斁浜岀淮鐮佸埌鎸囧畾澶у皬
  • 鏂板缓瀛樻斁浜岀淮鐮佸浘鐗囩殑鏂囦欢
  • 灏嗗浘鍍忥紙浜岀淮鐮侊級浠?JPEG 4锛?锛? 鍩虹嚎鏍煎紡鍐欏叆鏂囦欢

鍙﹀鍦?

jpeg.Encode(f, code, nil)
涓紝绗笁涓弬鏁板彲璁剧疆鍏跺浘鍍忚川閲忥紝榛樿鍊间负 75

// DefaultQuality is the default quality encoding parameter.
const DefaultQuality = 75

// Options are the encoding parameters.
// Quality ranges from 1 to 100 inclusive, higher is better.
type Options struct {
    Quality int
}

璺敱鏂规硶

1銆佺涓€姝?/p>

鍦?routers/api/v1/article.go 鏂板 GenerateArticlePoster 鏂规硶鐢ㄤ簬鎺ュ彛寮€鍙?/p>

2銆佺浜屾

鍦?routers/router.go 鐨?apiv1 涓柊澧?

apiv1.POST("/articles/poster/generate", v1.GenerateArticlePoster)
璺敱

3銆佺涓夋

淇敼 GenerateArticlePoster 鏂规硶锛岀紪鍐欏搴旂殑鐢熸垚閫昏緫锛屽涓嬶細

const (
    QRCODE_URL = "https://github.com/EDDYCJY/blog#gin%E7%B3%BB%E5%88%97%E7%9B%AE%E5%BD%95"
)

func GenerateArticlePoster(c *gin.Context) {
    appG := app.Gin{c}
    qrc := qrcode.NewQrCode(QRCODE_URL, 300, 300, qr.M, qr.Auto)
    path := qrcode.GetQrCodeFullPath()
    _, _, err := qrc.Encode(path)
    if err != nil {
        appG.Response(http.StatusOK, e.ERROR, nil)
        return
    }

    appG.Response(http.StatusOK, e.SUCCESS, nil)
}

楠岃瘉

閫氳繃 POST 鏂规硶璁块棶

http://127.0.0.1:8000/api/v1/articles/poster/generate?token=$token
锛堟敞鎰?$token锛?/p>

image

閫氳繃妫€鏌ヤ袱涓偣纭畾鍔熻兘鏄惁姝e父锛屽涓嬶細

1銆佽闂粨鏋滄槸鍚?200

2銆佹湰鍦扮洰褰曟槸鍚︽垚鍔熺敓鎴愪簩缁寸爜鍥剧墖

image

鍚堝苟娴锋姤

鍦ㄨ繖涓€鑺傦紝灏嗗疄鐜颁簩缁寸爜鍥剧墖涓庤儗鏅浘鍚堝苟鎴愭柊鐨勪竴寮犲浘锛屽彲鐢ㄤ簬甯歌鐨勫浼犳捣鎶ョ瓑涓氬姟鍦烘櫙

鑳屾櫙鍥?/h3>

image

灏嗚儗鏅浘鍙﹀瓨涓?runtime/qrcode/bg.jpg锛堝疄闄呭簲鐢紝鍙瓨鍦?OSS 鎴栧叾浠栧湴鏂癸級

service 鏂规硶

鎵撳紑 service/article_service 鐩綍锛屾柊寤?article_poster.go 鏂囦欢锛屽啓鍏ュ唴瀹癸細

package article_service

import (
    "image"
    "image/draw"
    "image/jpeg"
    "os"

    "github.com/EDDYCJY/go-gin-example/pkg/file"
    "github.com/EDDYCJY/go-gin-example/pkg/qrcode"
)

type ArticlePoster struct {
    PosterName string
    *Article
    Qr *qrcode.QrCode
}

func NewArticlePoster(posterName string, article *Article, qr *qrcode.QrCode) *ArticlePoster {
    return &ArticlePoster{
        PosterName: posterName,
        Article:    article,
        Qr:         qr,
    }
}

func GetPosterFlag() string {
    return "poster"
}

func (a *ArticlePoster) CheckMergedImage(path string) bool {
    if file.CheckNotExist(path+a.PosterName) == true {
        return false
    }

    return true
}

func (a *ArticlePoster) OpenMergedImage(path string) (*os.File, error) {
    f, err := file.MustOpen(a.PosterName, path)
    if err != nil {
        return nil, err
    }

    return f, nil
}

type ArticlePosterBg struct {
    Name string
    *ArticlePoster
    *Rect
    *Pt
}

type Rect struct {
    Name string
    X0   int
    Y0   int
    X1   int
    Y1   int
}

type Pt struct {
    X int
    Y int
}

func NewArticlePosterBg(name string, ap *ArticlePoster, rect *Rect, pt *Pt) *ArticlePosterBg {
    return &ArticlePosterBg{
        Name:          name,
        ArticlePoster: ap,
        Rect:          rect,
        Pt:            pt,
    }
}

func (a *ArticlePosterBg) Generate() (string, string, error) {
    fullPath := qrcode.GetQrCodeFullPath()
    fileName, path, err := a.Qr.Encode(fullPath)
    if err != nil {
        return "", "", err
    }

    if !a.CheckMergedImage(path) {
        mergedF, err := a.OpenMergedImage(path)
        if err != nil {
            return "", "", err
        }
        defer mergedF.Close()

        bgF, err := file.MustOpen(a.Name, path)
        if err != nil {
            return "", "", err
        }
        defer bgF.Close()

        qrF, err := file.MustOpen(fileName, path)
        if err != nil {
            return "", "", err
        }
        defer qrF.Close()

        bgImage, err := jpeg.Decode(bgF)
        if err != nil {
            return "", "", err
        }
        qrImage, err := jpeg.Decode(qrF)
        if err != nil {
            return "", "", err
        }

        jpg := image.NewRGBA(image.Rect(a.Rect.X0, a.Rect.Y0, a.Rect.X1, a.Rect.Y1))

        draw.Draw(jpg, jpg.Bounds(), bgImage, bgImage.Bounds().Min, draw.Over)
        draw.Draw(jpg, jpg.Bounds(), qrImage, qrImage.Bounds().Min.Sub(image.Pt(a.Pt.X, a.Pt.Y)), draw.Over)

        jpeg.Encode(mergedF, jpg, nil)
    }

    return fileName, path, nil
}

杩欓噷閲嶇偣鐣欐剰

func (a *ArticlePosterBg) Generate()
鏂规硶锛屽仛浜嗗涓嬩簨鎯咃細
  • 鑾峰彇浜岀淮鐮佸瓨鍌ㄨ矾寰?/li>
  • 鐢熸垚浜岀淮鐮佸浘鍍?/li>
  • 妫€鏌ュ悎骞跺悗鍥惧儚锛堟寚鐨勬槸瀛樻斁鍚堝苟鍚庣殑娴锋姤锛夋槸鍚﹀瓨鍦?/li>
  • 鑻ヤ笉瀛樺湪锛屽垯鐢熸垚寰呭悎骞剁殑鍥惧儚 mergedF
  • 鎵撳紑浜嬪厛瀛樻斁鐨勮儗鏅浘 bgF
  • 鎵撳紑鐢熸垚鐨勪簩缁寸爜鍥惧儚 qrF
  • 瑙g爜 bgF 鍜?qrF 杩斿洖 image.Image
  • 鍒涘缓涓€涓柊鐨?RGBA 鍥惧儚
  • 鍦?RGBA 鍥惧儚涓婄粯鍒?鑳屾櫙鍥撅紙bgF锛?/li>
  • 鍦ㄥ凡缁樺埗鑳屾櫙鍥剧殑 RGBA 鍥惧儚涓婏紝鍦ㄦ寚瀹?Point 涓婄粯鍒朵簩缁寸爜鍥惧儚锛坬rF锛?/li>
  • 灏嗙粯鍒跺ソ鐨?RGBA 鍥惧儚浠?JPEG 4锛?锛? 鍩虹嚎鏍煎紡鍐欏叆鍚堝苟鍚庣殑鍥惧儚鏂囦欢锛坢ergedF锛?/li>

閿欒鐮?/h3>

鏂板 閿欒鐮?/a>锛?a href="https://link.segmentfault.com/?enc=mCgOrmLTkXMuUsigkaz4lQ%3D%3D.IsUFEsoILnkR9nrSqjEuKXdQXkuBaa7kpGPefPOqi16NPZEjJUqht040oEwuUGlwYIZX41idBGsyP%2FAA%2BuTdnsEfyqoPIaCAGE8UrYgxfuo%3D" rel="nofollow">閿欒鎻愮ず

璺敱鏂规硶

鎵撳紑 routers/api/v1/article.go 鏂囦欢锛屼慨鏀?GenerateArticlePoster 鏂规硶锛岀紪鍐欐渶缁堢殑涓氬姟閫昏緫锛堝惈鐢熸垚浜岀淮鐮佸強鍚堝苟娴锋姤锛夛紝濡備笅锛?/p>

const (
    QRCODE_URL = "https://github.com/EDDYCJY/blog#gin%E7%B3%BB%E5%88%97%E7%9B%AE%E5%BD%95"
)

func GenerateArticlePoster(c *gin.Context) {
    appG := app.Gin{c}
    article := &article_service.Article{}
    qr := qrcode.NewQrCode(QRCODE_URL, 300, 300, qr.M, qr.Auto) // 鐩墠鍐欐 gin 绯诲垪璺緞锛屽彲鑷澧炲姞涓氬姟閫昏緫
    posterName := article_service.GetPosterFlag() + "-" + qrcode.GetQrCodeFileName(qr.URL) + qr.GetQrCodeExt()
    articlePoster := article_service.NewArticlePoster(posterName, article, qr)
    articlePosterBgService := article_service.NewArticlePosterBg(
        "bg.jpg",
        articlePoster,
        &article_service.Rect{
            X0: 0,
            Y0: 0,
            X1: 550,
            Y1: 700,
        },
        &article_service.Pt{
            X: 125,
            Y: 298,
        },
    )

    _, filePath, err := articlePosterBgService.Generate()
    if err != nil {
        appG.Response(http.StatusOK, e.ERROR_GEN_ARTICLE_POSTER_FAIL, nil)
        return
    }

    appG.Response(http.StatusOK, e.SUCCESS, map[string]string{
        "poster_url":      qrcode.GetQrCodeFullUrl(posterName),
        "poster_save_url": filePath + posterName,
    })
}

杩欏潡娑夊強鍒板ぇ閲忕煡璇嗭紝寮虹儓寤鸿闃呰涓嬶紝濡備笅锛?/p>

鍏舵墍娑夊強銆佸叧鑱旂殑搴撻兘寤鸿鐮旂┒涓€涓?/p>

StaticFS

鍦?routers/router.go 鏂囦欢锛屽鍔犲涓嬩唬鐮?

r.StaticFS("/qrcode", http.Dir(qrcode.GetQrCodeFullPath()))

楠岃瘉

image

璁块棶瀹屾暣鐨?URL 璺緞锛岃繑鍥炲悎鎴愬悗鐨勬捣鎶ュ苟鎵櫎浜岀淮鐮佹垚鍔熷垯姝g‘ 馃

image

鎬荤粨

鍦ㄦ湰绔犺妭瀹炵幇浜嗕袱涓緢甯歌鐨勪笟鍔″姛鑳斤紝鍒嗗埆鏄敓鎴愪簩缁寸爜鍜屽悎骞舵捣鎶ャ€傚笇鏈涗綘鑳藉浠旂粏闃呰鎴戠粰鍑虹殑閾炬帴锛岃繖鍧楃殑鐭ヨ瘑閲忎笉灏戯紝鎯宠鐢ㄥソ鍥惧儚澶勭悊鐨勫姛鑳斤紝蹇呴』鐞嗚В瀵瑰簲鐨勬€濊矾锛屼妇涓€鍙嶄笁

鏈€鍚庡笇鏈涘浣犳湁鎵€甯姪 馃憣

鍙傝€?/h2>

鏈郴鍒楃ず渚嬩唬鐮?/h3>

鏈郴鍒楃洰褰?/h3>

到这里,我们也就讲完了《Golang Gin瀹炶返 杩炶浇鍗佷簲 鐢熸垚浜岀淮鐮併€佸悎骞舵捣鎶?/a>》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>