拆解基础的ginServer
最开始gin版本
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
r.Group("/a")
r.GET("/hello", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
}
改造后的
main页面编写
package main
import (
"github.com/gin-gonic/gin"
"handitem/xxb-gin-web/global"
"handitem/xxb-gin-web/initilization"
"handitem/xxb-gin-web/model/user"
)
func main() {
//1、读取配置文件
initilization.InitViper()
//2.初始化中间 redis/mysql/mongodb
initilization.InitMySQL()
// 这个default被 InitGinRouter替代
//r := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
// r.GET("/hello", func(c *gin.Context) {
// // c.JSON:返回JSON格式的数据
// c.JSON(200, gin.H{
// "message": "Hello world!",
// })
// h := user.User{Name: "haha"}
// global.KSD_DB.Model(&user.User{}).Create(&h)
// })
// 这个run被 initilization.RunServer() 替代
initilization.RunServer()
//r.Run()
}
r.Run()的改写
main页面就是调用的这个函数启动服务 注意这里也是需要读取配置文件的 读取的是server.port
func RunServer() {
// 初始化路由
srv := InitGinRouter()
// 为用户头像和文件提供静态地址
srv.StaticFS("/static", http.Dir("/static"))
address := global.Config.Server.Port
// 启动HTTP服务,courseController
s := initServer(address, srv)
// 保证文本顺序输出
// In order to ensure that the text order output can be deleted
time.Sleep(10 * time.Microsecond)
s2 := s.ListenAndServe().Error()
fmt.Println("服务启动完毕 ", s2)
}
gin.default的改写
基础写法
r := gin.Default()
r.Group("/a")
抽离写法
在initilization包下创建init_router.go
这个文件就是把r.Group给拆解成的,最后返回带有路由组的*gin.Engine 供ginserver使用
package initilization
import (
"fmt"
"github.com/gin-gonic/gin"
"handitem/xxb-gin-web/global"
"net/http"
"time"
)
func InitGinRouter() *gin.Engine {
// 创建gin服务
ginServer := gin.Default()
// 提供服务组
//courseRouter := router.RouterWebGroupApp.Course.CourseRouter
videoRouter := router.RouterWebGroupApp.Video.VideoRouter
//loginRouter := login.LoginRouter{}
//codeRouter := code.CodeRouter{}
// 接口隔离,比如登录,健康检查都不需要拦截和做任何的处理
//loginRouter.InitLoginRouter(ginServer)
//codeRouter.InitCodeRouter(ginServer)
// 业务模块接口,
publicGroup := ginServer.Group("/api")
{
videoRouter.InitVideoRouter(publicGroup)
//courseRouter.InitCourseRouter(publicGroup)
}
fmt.Println("router register success")
return ginServer
}
InitVideoRouter
在项目文件下创建router文件夹,在router下创建video文件夹,在video下创建router.go
这个文件对应的是基础页面里面的r.get(“xxx”,func(){}),只不过这里把func又抽出去一层,抽到service一层
● 基础写法
r.GET("/hello", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
```
● 抽离写法
```go
package video
import (
"github.com/gin-gonic/gin"
v1 "handitem/xxb-gin-web/api/v1"
)
type VideoRouter struct{}
func (e *VideoRouter) InitVideoRouter(Router *gin.RouterGroup) {
controller := v1.WebApiGroupApp.Video.VideoController
// 这个路由多了一个对对post,put请求的中间件处理,而这个中间件做了一些对post和put的参数的处理和一些公共信息的处理
videoRouter := Router.Group("video") //.Use(middleware.OperationRecord())
{
videoRouter.GET("find", controller.FindVideos)
videoRouter.GET("get", controller.GetByID)
}
}
最后就是service层调用具体方法的实现
基础写法
● 这里的方法实现是用一个匿名方法完成的
r.GET("/hello", func(c *gin.Context) {
// c.JSON:返回JSON格式的数据
c.JSON(200, gin.H{
"message": "Hello world!",
})
})
```
抽离写法
● 这是用调用具体的方法实现的
```go
package video
import (
"github.com/gin-gonic/gin"
)
type VideoController struct{}
// 查询video
func (videoController *VideoController) FindVideos(c *gin.Context) {
}
// 获取明细
func (videoController *VideoController) GetByID(c *gin.Context) {
// 绑定参数用来获取/:id这个方式
//id := c.Param("id")
// 绑定参数 ?ids=1111
}