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:支持这个项目
如果你正在使用这个项目并感觉良好,或只是想要支持我继续开发,你可以通过如下任意 方式支持我:
- Star 并 分享这个项目 :rocket:
- 通过以下二维码 一次性捐款。 我多半会买一杯
咖啡茶。:tea:
谢谢! :heart:
微信赞赏 | 微信 | 支付宝 |
---|---|---|
[图片上传失败...(image-db2c07-1739366566298)] | [图片上传失败...(image-36f87c-1739366566298)] | [图片上传失败...(image-1dfd27-1739366566298)] |