构建ToDo待办事项应用是Golang Web开发的经典入门项目,能够帮助开发者快速掌握路由处理、数据库操作、接口开发等核心技能。本文使用gin框架作为Web层,MySQL作为数据存储,实现一个具备创建、查询、更新、删除待办事项功能的完整应用。

环境准备
在开始开发前需要准备好基础环境,首先确保本地已经安装Golang 1.18及以上版本,然后安装gin框架和MySQL驱动,执行以下命令完成依赖安装:
go get -u github.com/gin-gonic/gin go get -u gorm.io/gorm go get -u gorm.io/driver/mysql
数据库设计
ToDo应用需要存储待办事项的基本信息,设计todos表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 主键,自增 |
| title | varchar(200) | 待办事项标题 |
| completed | tinyint(1) | 是否完成,0未完成1完成 |
| created_at | datetime | 创建时间 |
项目结构搭建
创建项目目录并整理结构,核心文件分布如下:
- main.go:程序入口,初始化路由和数据库
- models/todo.go:定义待办事项的数据模型和数据库操作方法
- handlers/todo_handler.go:处理HTTP请求的业务逻辑
核心代码实现
数据模型定义
在models/todo.go中定义Todo结构体,对应数据库表结构:
package models
import "gorm.io/gorm"
type Todo struct {
gorm.Model
Title string `json:"title" gorm:"type:varchar(200)"`
Completed bool `json:"completed" gorm:"type:tinyint(1);default:0"`
}
// 创建待办事项
func CreateTodo(db *gorm.DB, todo *Todo) error {
return db.Create(todo).Error
}
// 查询所有待办事项
func GetAllTodos(db *gorm.DB) ([]Todo, error) {
var todos []Todo
err := db.Find(&todos).Error
return todos, err
}
// 更新待办事项状态
func UpdateTodo(db *gorm.DB, id uint, completed bool) error {
return db.Model(&Todo{}).Where("id = ?", id).Update("completed", completed).Error
}
// 删除待办事项
func DeleteTodo(db *gorm.DB, id uint) error {
return db.Delete(&Todo{}, id).Error
}
请求处理逻辑
在handlers/todo_handler.go中实现各个接口的处理函数:
package handlers
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"your_project_name/models"
)
type TodoHandler struct {
DB *gorm.DB
}
// 新增待办事项
func (h *TodoHandler) CreateTodo(c *gin.Context) {
var todo models.Todo
if err := c.ShouldBindJSON(&todo); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
return
}
if err := models.CreateTodo(h.DB, &todo); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "创建失败"})
return
}
c.JSON(http.StatusOK, todo)
}
// 获取所有待办事项
func (h *TodoHandler) GetTodos(c *gin.Context) {
todos, err := models.GetAllTodos(h.DB)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "查询失败"})
return
}
c.JSON(http.StatusOK, todos)
}
// 更新待办状态
func (h *TodoHandler) UpdateTodo(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
return
}
var req struct {
Completed bool `json:"completed"`
}
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "参数错误"})
return
}
if err := models.UpdateTodo(h.DB, uint(id), req.Completed); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "更新失败"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "更新成功"})
}
// 删除待办事项
func (h *TodoHandler) DeleteTodo(c *gin.Context) {
idStr := c.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的ID"})
return
}
if err := models.DeleteTodo(h.DB, uint(id)); err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "删除失败"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
}
程序入口配置
在main.go中初始化数据库连接和路由,启动服务:
package main
import (
"log"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"your_project_name/handlers"
"your_project_name/models"
)
func main() {
// 连接MySQL数据库,替换为自己的数据库配置
dsn := "root:password@tcp(127.0.0.1:3306)/todo_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal("数据库连接失败:", err)
}
// 自动迁移表结构
db.AutoMigrate(&models.Todo{})
// 初始化gin路由
r := gin.Default()
todoHandler := &handlers.TodoHandler{DB: db}
// 定义接口路由
r.POST("/todos", todoHandler.CreateTodo)
r.GET("/todos", todoHandler.GetTodos)
r.PUT("/todos/:id", todoHandler.UpdateTodo)
r.DELETE("/todos/:id", todoHandler.DeleteTodo)
// 启动服务,默认监听8080端口
r.Run(":8080")
}
功能测试
启动程序后可以使用Postman或者curl命令测试各个接口:
- 创建待办:发送POST请求到
http://127.0.0.1:8080/todos,请求体为{"title": "学习Golang"} - 查询所有待办:发送GET请求到
http://127.0.0.1:8080/todos - 更新状态:发送PUT请求到
http://127.0.0.1:8080/todos/1,请求体为{"completed": true} - 删除待办:发送DELETE请求到
http://127.0.0.1:8080/todos/1
总结
通过以上步骤就完成了一个基础ToDo待办事项应用的开发,整个流程涵盖了Golang Web开发的核心环节。开发者可以在此基础上扩展功能,比如添加用户认证、待办事项分类、截止时间设置等,进一步熟悉Golang的Web开发能力。