基于Gin的golang web开发增删改查实战(TodoList)

说明

1、目的是练习golang基于gin+gorm的web开发涉及到的最基本的增删改查,所以关于数据库连接和对应配置从配置文件的读取没有详细说明

如果想了解配置文件解析和读取可以参考: Golang加载yaml类型配置文件问题

2、为了方便演示,所有的代码都在同一个文件todo.go中,没有做项目目录的划分,关于项目目录划分后续文章介绍

3、为了保证http handle 逻辑和 实际model的正删改查不混在一起,所以这里定义了 service和handler
service 是 model的正删改查逻辑
handler 是 http 请求结构的逻辑

项目实战

model 定义

// todo model
type Todo struct {
    gorm.Model
    Title   string  `gorm:"type:varchar(200)"`
    Status  uint    `gorm:"type:tinyint"`
}

// 数据库表明自定义,默认为model的复数形式,比如这里默认为 todos
func (Todo) TableName() string {
    return "gocrud_todo"
}

数据库连接

// mysql connection
func ConnectDB() {
    db, err = gorm.Open("mysql", "bamboo:Bamboo@tcp(127.0.0.1:3306)/bamboo?charset=utf8mb4&parseTime=True&loc=Local")
    if err != nil {
        log.Panicln("连接数据库报错" + err.Error())
    }

    // 最大空闲数
    db.DB().SetMaxIdleConns(10)
    // 最大连接数
    db.DB().SetMaxOpenConns(50)
    // 最长连接时间
    db.DB().SetConnMaxLifetime(5 * time.Minute)
    // open log
    db.LogMode(true)
}

func DisconnectDB() {
    if err = db.Close(); err != nil {
        log.Println("数据库关闭失败:" + err.Error())
    }
}

service定义

service 是 model的对于数据库的正删改查逻辑

func AddTodoService(todo *Todo) error {}
func UpdateTodoService(todo *Todo, id uint) error {}
func DeleteTodoService(id int) error {}
func GetTodoService(id int) (*Todo, error) {}
func ListTodoService()([]*Todo, error) {}

handler 定义

handler 是 http 请求API定义的逻辑

type TodoHttpAddHandler struct {
    Title   string  `json:"title"`
}
func addTodoHandler(c *gin.Context) {}

func getTodoHandler(c *gin.Context) {}

type TodoHttpUpdateHandler struct {
    Title   string  `json:"title"`
    Status  uint    `json:"status"`
}
func updateTodoHandler(c *gin.Context) {}

func deleteTodoHandler(c *gin.Context) {}
func listTodoHandler(c *gin.Context) {}

路由定义

// router 
func MapRouter() *gin.Engine {
    router := gin.Default()
    router.GET("/", indexHandler)
    router.GET("/todo/", listTodoHandler)
    router.POST("/todo/", addTodoHandler)
    router.PUT("/todo/:id", updateTodoHandler)
    // router.PATCH("/todo/:id", updateTodoHandler)
    router.DELETE("/todo/:id", deleteTodoHandler)
    router.GET("/todo/:id", getTodoHandler)
    return router
}

主入口定义

注意这里的数据库连接和数据库关闭,采用defer在程序结束之时执行数据库关闭操作

// main enterance
func main() {
    ConnectDB()
    defer DisconnectDB()

    db.AutoMigrate(&Todo{})
    
    router := MapRouter()
    router.Run()
}

参考文档

mysql orm: https://gorm.io/docs/delete.html
go get -u github.com/jinzhu/gorm

web应用gin: https://github.com/gin-gonic/gin
go get -u github.com/gin-gonic/gin

完整的代码请参考 https://gitee.com/colin5063/go-learn/tree/master/20201223-crud,如需交流请入群 950828714

你可能感兴趣的:(基于Gin的golang web开发增删改查实战(TodoList))