美文网首页
Ruoyi-Go 项目实战 - Gin项目功能说明篇

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

作者: 客观开发者 | 来源:发表于2025-02-11 21:23 被阅读0次

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

相关文章

网友评论

      本文标题:Ruoyi-Go 项目实战 - Gin项目功能说明篇

      本文链接:https://www.haomeiwen.com/subject/nspfpjtx.html