Golang新手入门:我的第一个TodoApp项目实践

Golang新手入门:我的第一个TodoApp项目实践 我是Go语言新手。这是我的第一个项目。

GitHub仓库预览图

GitHub - 27vhd/todoapp

为27vhd/todoapp的开发做出贡献,请在GitHub上创建一个账户。

3 回复

太棒了,Vahid!!继续加油!! 你接下来的方向可以尝试应用整洁代码原则。

更多关于Golang新手入门:我的第一个TodoApp项目实践的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


待办事项应用做得非常棒!添加一些样式,特别是针对按钮的样式,可以提升视觉效果和用户体验。可以考虑使用CSS来获得更好的视觉效果和悬停效果。继续加油!

这是一个很棒的入门项目!你的TodoApp结构清晰,代码组织得不错。让我分析一下你的实现并给出一些专业建议:

项目亮点

  1. 清晰的包结构 - 将handler、model、service分离是很好的实践
  2. 使用GORM - 简化了数据库操作
  3. RESTful API设计 - 遵循了良好的API设计原则

代码优化建议

1. 错误处理可以更完善

// 当前代码
func (h *TodoHandler) GetTodos(c *gin.Context) {
    todos, err := h.service.GetTodos()
    if err != nil {
        c.JSON(500, gin.H{"error": err.Error()})
        return
    }
    c.JSON(200, todos)
}

// 建议:统一错误处理中间件
func ErrorHandler() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Next()
        
        if len(c.Errors) > 0 {
            err := c.Errors.Last()
            status := http.StatusInternalServerError
            
            // 根据错误类型设置状态码
            if errors.Is(err, gorm.ErrRecordNotFound) {
                status = http.StatusNotFound
            }
            
            c.JSON(status, gin.H{
                "error": err.Error(),
                "code":  status,
            })
        }
    }
}

2. 添加请求验证

// 在CreateTodo中添加验证
type CreateTodoRequest struct {
    Title       string `json:"title" binding:"required,min=1,max=100"`
    Description string `json:"description" binding:"max=500"`
}

func (h *TodoHandler) CreateTodo(c *gin.Context) {
    var req CreateTodoRequest
    if err := c.ShouldBindJSON(&req); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
    
    todo := model.Todo{
        Title:       req.Title,
        Description: req.Description,
        Completed:   false,
    }
    
    // ... 后续逻辑
}

3. 数据库连接池配置

// 在database.go中添加连接池配置
func ConnectDatabase() (*gorm.DB, error) {
    db, err := gorm.Open(sqlite.Open("todo.db"), &gorm.Config{})
    if err != nil {
        return nil, err
    }
    
    sqlDB, err := db.DB()
    if err != nil {
        return nil, err
    }
    
    // 配置连接池
    sqlDB.SetMaxIdleConns(10)
    sqlDB.SetMaxOpenConns(100)
    sqlDB.SetConnMaxLifetime(time.Hour)
    
    return db, nil
}

4. 添加单元测试示例

// handler/todo_handler_test.go
func TestTodoHandler_CreateTodo(t *testing.T) {
    // 模拟数据库
    mockService := &mockTodoService{}
    handler := NewTodoHandler(mockService)
    
    // 创建测试路由
    router := gin.Default()
    router.POST("/todos", handler.CreateTodo)
    
    // 测试请求
    jsonStr := `{"title":"Test Todo","description":"Test Description"}`
    req, _ := http.NewRequest("POST", "/todos", bytes.NewBufferString(jsonStr))
    req.Header.Set("Content-Type", "application/json")
    
    w := httptest.NewRecorder()
    router.ServeHTTP(w, req)
    
    assert.Equal(t, http.StatusCreated, w.Code)
}

5. 添加Swagger文档

// 使用swaggo添加API文档
// main.go
// @title TodoApp API
// @version 1.0
// @description This is a simple Todo application

// @host localhost:8080
// @BasePath /api/v1
func main() {
    // ... 现有代码
}

项目扩展建议

  1. 添加用户认证 - 使用JWT实现多用户支持
  2. 添加缓存层 - 使用Redis缓存频繁访问的数据
  3. 添加Docker支持 - 方便部署
  4. 添加Makefile - 简化开发命令
  5. 添加CI/CD流水线 - 使用GitHub Actions自动化测试和部署

你的项目基础很扎实,继续完善这些功能会让它成为一个更完整的生产级应用。保持这种代码组织方式,这对团队协作和项目维护非常有帮助。

回到顶部