Ruoyi-Go 项目实战 - Gin项目功能说明篇

Ruoyi-Go 实战 - Gin项目功能说明篇

Gin项目功能说明篇

Gin 是一个用 Go (Golang) 编写的 Web 框架。
Go 即Golang,是Google公司2009年11月正式对外公开的一门编程语言。

Go是静态强类型语言,是区别于解析型语言的编译型语言。

解析型语言——源代码是先翻译为中间代码,然后由解析器对代码进行解释执行。

编译型语言——源代码编译生成机器语言,然后由机器直接执行机器码即可执行。

特效

支持中间件:传入的 HTTP 请求可以由一系列中间件和最终操作来处理。例如:Logger,Authorization,GZIP,最终操作 DB。

Crash 处理:Gin 可以 catch 一个发生在 HTTP 请求中的 panic 并 recover 它。这样,你的服务器将始终可用。例如,你可以向 Sentry 报告这个 panic!

JSON 验证:Gin 可以解析并验证请求的 JSON,例如检查所需值的存在。

路由组:更好地组织路由。是否需要授权,不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能。

错误管理:Gin 提供了一种方便的方法来收集 HTTP 请求期间发生的所有错误。最终,中间件可以将它们写入日志文件,数据库并通过网络发送。

内置渲染:Gin 为 JSON,XML 和 HTML 渲染提供了易于使用的 API。

可扩展性:新建一个中间件非常简单,去查看示例代码吧。

快速开始

创建文件夹 打开cmd

go mod init example.com/m
为创建go.mod

在创建main.go,未启动文件,package main 为主要的,方可以运行。

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    // 1.创建路由
    r := gin.Default()
    // 2.绑定路由规则,执行的函数
    // gin.Context,封装了request和response
    r.GET("/", func(c *gin.Context) {
        c.JSON(http.StatusOK, "hello World!")
    })
    // 3.监听端口,默认在8080
    // Run("里面不指定端口号默认为8080")
    r.Run(":8081")
}

这样代码就完了,简单的demo,运行需要下载gin包。我们只需要一个命令即可

go get -u github.com/gin-gonic/gin

就是下载了gin 包,或 go mod tidy 下载相关的包不仅仅有gin,还有相关的包,用到什么就会下载什么包的。

然后在运行go run main.go或在idea中点击运行即可

访问http://localhost:8081 即可查看结果 hello World!

数据处理,json 数据封装

简单的Get 方法

/*普通string获取*/
r.GET("/", func(c *gin.Context) {
   c.String(http.StatusOK, "hello World!")
})

/*json 返回*/
r.GET("/book", func(c *gin.Context) {
   c.JSON(200, gin.H{
      "method": "GET",
   })
})
/*html 返回*/
r.LoadHTMLGlob("templates/*")
r.GET("/index", func(c *gin.Context) {
   c.HTML(http.StatusOK, "index.html", gin.H{
      "title": "index",
   })
})
/*重定向*/
r.GET("/test", func(c *gin.Context) {
   c.Redirect(http.StatusMovedPermanently, "http://www.ruo.com/")
})

1、正常的数据的封装

package R

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

type R struct {
    Ctx *gin.Context
}

// 返回的结果:
type Result struct {
    Code int         `json:"code"`           //提示代码
    Msg  interface{} `json:"msg"`            //提示信息
    Data interface{} `json:"data,omitempty"` //数据
}

func ReturnSuccess(data any) Result {
    return Result{
        Code: http.StatusOK,
        Msg:  "操作成功",
        Data: data,
    }
}

func ReturnFailMsg(msg any) Result {
    return Result{
        Msg:  msg,
        Code: http.StatusInternalServerError,
    }
}

2、是分页的数据等封装


import "net/http"

type SearchTableDataParam struct {
    PageNum       int    `json:"pageNum"`
    PageSize      int    `json:"pageSize"`
    Other         any    `json:"other"`
    OrderByColumn string `json:"orderByColumn,omitempty"`
    IsAsc         string `json:"isAsc,omitempty"`
    Params        Params `json:"params"`
}

type Params struct {
    BeginTime string `json:"beginTime"`
    EndTime   string `json:"endTime"`
}

type TableDataInfo struct {
    Total int64  `json:"total,omitempty"`
    Rows  any    `json:"rows,omitempty"`
    Code  int    `json:"code,omitempty"`
    Msg   string `json:"msg,omitempty"`
}

func Success(rows any, total int64) TableDataInfo {
    return TableDataInfo{
        Msg:   "查询成功",
        Code:  http.StatusOK,
        Total: total,
        Rows:  rows,
    }
}
func Fail() TableDataInfo {
    return TableDataInfo{
        Msg:  "查询失败",
        Code: http.StatusInternalServerError,
    }
}

简单的中间件

1、日志
r.Use(utils.Logger())

2、跨域
r.Use(utils.Core())

3、统一异常处理
r.Use(utils.Recover)

4、Notfound

//处理异常
router.NoRoute(HandleNotFound)
router.NoMethod(HandleNotFound)
    
//404
func HandleNotFound(c *gin.Context) {
    global.Logger.Errorf("handle not found: %v", c.Request.RequestURI)
    //global.Logger.Errorf("stack: %v",string(debug.Stack()))
    //result.NewResult(c).Error(404,"资源未找到")
    panic(R.ReturnFailMsg("资源未找到"))
    return
} 

Gin限流

    // 设置上传文件大小->(默认是 32 MiB)
    engine.MaxMultipartMemory = 8 << 20 // 8 MiB
    上传限制文件大小
/*限制*/
    var uriLimiters = middleware.NewUriLimiter().AddBucketByConf()
    e.Use(middleware.RateLimiter(uriLimiters))
// 限流
func RateLimiter(l LimiterIface) gin.HandlerFunc {
    return func(c *gin.Context) {
        // 通过ip进行存储来进行过滤
        key := l.Key(c) + c.ClientIP()
        if bucket, ok := l.GetBucket(key); ok {
            count := bucket.TakeAvailable(1)
            if count == 0 {
                return
            }
        } else {
            // 过滤记录 应该是 100 毫秒只能三次访问
            l.AddBucketsByUri(key, 3, 100, 100)
            c.Next()
        }
        c.Next()
    }
}

Gin缓存

    memoryStore := persist.NewMemoryStore(1 * time.Minute)
    handlerFunc := cache.CacheByRequestURI(memoryStore, 2*time.Second)
    v1 := e.Group("/")
    {
        auth := v1.Group("")
        auth.Use(utils.JWTAuthMiddleware())
        {
            /*用户信息*/
            auth.GET("getInfo", handlerFunc, api.GetInfoHandler)
            /*获取用户授权菜单*/
            auth.GET("getRouters", handlerFunc, api.GetRoutersHandler)
        }
    }

注入

https://www.php.cn/faq/564829.html

(待进行)

参考链接

https://gin-gonic.com/zh-cn/docs/
https://www.tizi365.com/archives/244.html
https://blog.csdn.net/weixin_43881017/article/details/112174440
https://zhuanlan.zhihu.com/p/462420476

:sparkling_heart:支持这个项目

如果你正在使用这个项目并感觉良好,或只是想要支持我继续开发,你可以通过如下任意 方式支持我:

  1. Star 并 分享这个项目 :rocket:
  2. 通过以下二维码 一次性捐款。 我多半会买一杯 咖啡 茶。:tea:

谢谢! :heart:

微信赞赏 微信 支付宝
[图片上传失败...(image-db2c07-1739366566298)] [图片上传失败...(image-36f87c-1739366566298)] [图片上传失败...(image-1dfd27-1739366566298)]

下载地址

https://gitee.com/OptimisticDevelopers/Ruoyi-Go

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容