gin 框架目錄


一個 Gin 項目結構示例

IllIIlIlIII
0.4632019.07.18 02:21:02字數 144閱讀 6,104
├── gin
│   ├──  Router
│          └── router.go
│   ├──  Middlewares
│          └── corsMiddleware.go
│   ├──  Controllers
│          └── testController.go
│   ├──  Services
│          └── testService.go
│   ├──  Models
│          └── testModel.go
│   ├──  Databases
│          └── mysql.go
│   ├──  Sessions
│          └── session.go
└── main.go

  • 使用gorm訪問數據庫
  • gin 為項目根目錄
  • main.go 為入口文件
  • Router 為路由目錄
  • Middlewares 為中間件目錄
  • Controllers 為控制器目錄(MVC)
  • Services 為服務層目錄,這里把DAO邏輯也寫入其中,如果分開也可以
  • Models 為模型目錄
  • Databases 為數據庫初始化目錄
  • Sessions 為session初始化目錄
  • 文件 引用順序 大致如下:
    main.go(在main中關閉數據庫) - router(Middlewares) - Controllers - Services(sessions) - Models - Databases
  • Databases / mysql
package Mysql import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "fmt" ) var DB *gorm.DB func init() { var err error DB, err = gorm.Open("mysql", "wuyu:MIDSUMMERfish0@/gin?charset=utf8&parseTime=True&loc=Local") if err != nil { fmt.Printf("mysql connect error %v", err) } if DB.Error != nil { fmt.Printf("database error %v", DB.Error) } } 
  • Models / testModel.go
package Models import ( "gin/Databases" ) type Test struct { Id int Testcol string `gorm:"column:testcol"` } // 設置Test的表名為`test` // func (Test) TableName() string { // return "test" // } func (this *Test) Insert() (id int, err error) { result := Mysql.DB.Create(&this) id = this.Id if result.Error != nil { err = result.Error return } return } 
  • Services / testService.go
package Services import ( "gin/Models" ) type Test struct { Id int `json:"id"` Testcol string `json:"testcol"` } func (this *Test) Insert() (id int, err error) { var testModel Models.Test testModel.Id = this.Id testModel.Testcol = this.Testcol id, err = testModel.Insert() return } 
  • Controllers / testController.go
package Controllers import ( "github.com/gin-gonic/gin" "net/http" "strconv" "fmt" "gin/Services" ) func TestInsert(c *gin.Context) { var testService Services.Test err := c.ShouldBindJSON(&testService) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } id, err := testService.Insert() if err != nil { c.JSON(http.StatusOK, gin.H{ "code": -1, "message": "Insert() error!", }) return } c.JSON(http.StatusOK, gin.H{ "code": 1, "message": "success", "data": id, }) } 
  • Router / router.go
package Router import ( "github.com/gin-gonic/gin" "gin/Controllers" "gin/Middlewares" "gin/Sessions" "github.com/gin-contrib/sessions" ) func InitRouter() { router := gin.Default() // 要在路由組之前全局使用「跨域中間件」, 否則OPTIONS會返回404 router.Use(Middlewares.Cors()) // 使用 session(cookie-based) router.Use(sessions.Sessions("myyyyysession", Sessions.Store)) v1 := router.Group("v1") { v1.POST("/testinsert", Controllers.TestInsert) } router.Run(":8080") } 
  • Middlewares / corsMiddleware.go
package Middlewares import ( "github.com/gin-gonic/gin" "net/http" ) // 跨域中間件 func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method origin := c.Request.Header.Get("Origin") if origin != "" { c.Header("Access-Control-Allow-Origin", origin) c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE") c.Header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization") c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type") c.Header("Access-Control-Allow-Credentials", "false") c.Set("content-type", "application/json") } if method == "OPTIONS" { c.AbortWithStatus(http.StatusNoContent) } c.Next() } } 
  • Sessions/session.go
package Sessions import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" "time" "strconv" ) var Store = cookie.NewStore([]byte("very-very-secret")) func SetSession(c *gin.Context, username string) string { session := sessions.Default(c) sessionId := "sessionIdxxxxxxxok" session.Set(sessionId, username) session.Save() return sessionId } func GetSession(c *gin.Context, sessionId string) (username string) { session := sessions.Default(c) result := session.Get(sessionId) username = result.(string) return } 
  • main.go
package main import ( "gin/Router" "gin/Databases" ) func main() { defer Mysql.DB.Close() Router.InitRouter() }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM