基于Gin和Gorm实现Todo-List CRUD

217 阅读2分钟

本文将介绍如何使用Gin web框架和Gorm对象关系映射框架来构建一个简单的Todo-List应用程序。我们将使用MySQL数据库,并实现基本的增删改查(CRUD)功能。这是一个极简风格的项目,使用Go语言实现。

执行

go mod init "todo-list"

项目目录结构

-| models/
---| models.go
---| todo.go
-| routes/
---| todo.go
-| main.go
-| README.md

models/models.go

package models

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

var DB *gorm.DB

func InitDB() *gorm.DB {
    configuration := "root:password@tcp(localhost:3306)/todo_list?charset=utf8&parseTime=True"
    db, err := gorm.Open("mysql", configuration)
    if err != nil {
        fmt.Println(err)
    }

    DB = db
    
    if err = DB.AutoMigrate(&Todo{}); err != nil {
       panic(err)
    }

    return DB
}

models/todo.go

package models

type Todo struct {
    ID    uint   `gorm:"primary_key" json:"id"`
    Title string `json:"title"`
}

routes/todo.go

package routes

import (
    "github.com/gin-gonic/gin"
    "net/http"
    "todo-list/models"
)

func SetTodoRoutes(r *gin.Engine) {
    r.GET("/api/todos", func(c *gin.Context) {
        var todos []models.Todo
        models.DB.Find(&todos)

        c.JSON(http.StatusOK, todos)
    })

    r.POST("/api/todos", func(c *gin.Context) {
        var todo models.Todo
        c.Bind(&todo)

        models.DB.Create(&todo)

        c.JSON(http.StatusOK, gin.H{"success": todo})
    })

    r.PUT("/api/todos/:id", func(c *gin.Context) {
        id := c.Params.ByName("id")
        var todo models.Todo
        models.DB.First(&todo, id)

        c.Bind(&todo)

        models.DB.Save(&todo)

        c.JSON(http.StatusOK, gin.H{"success": todo})
    })

    r.DELETE("/api/todos/:id", func(c *gin.Context) {
        id := c.Params.ByName("id")
        var todo models.Todo
        models.DB.First(&todo, id)

        models.DB.Delete(&todo)

        c.Status(http.StatusOK)
    })
}

main.go

Copy code
package main

import (
    "github.com/gin-gonic/gin"
    "todo-list/models"
    "todo-list/routes"
)

func main() {
    db := models.InitDB()
    defer func() {
       dbClose, err := db.DB()
       if err != nil {
          panic(err)
       }
       dbClose.Close()
    }()

    r := gin.Default()

    routes.SetTodoRoutes(r)

    r.Run(":8080")
}

操作说明

首先,需要在MySQL中创建一个名为todo_list的数据库。

现在,我们可以运行应用程序并访问http://localhost:8080/api/todos来查看空的todo列表。

为了添加一个新的Todo项,请通过POST请求将title作为JSON参数提交给http://localhost:8080/api/todos。

要更新现有的Todo项,请使用PUT请求并将要更新的Todo的ID和新值作为JSON参数提交给http://localhost:8080/api/todos/:id。请注意,:id应替换为要更新的Todo项的实际ID。

要删除现有的Todo项,请使用DELETE请求并将要删除的Todo的ID作为URL参数提交至http://localhost:8080/api/todos/:id。同样,请注意要将:id替换为要删除的Todo项的实际ID。