Project-layout

社区标准模板

git commit

常用的 type 前缀

type用途
feat新功能
fix修 bug
refactor重构(不影响功能的代码调整)
docs文档
chore杂项(比如调整依赖、配置文件)
test测试相关

以后遇到"这次改动该用哪个 type"拿不准的时候,可以这样问自己:

  • 改动是不是在修一个"错误的行为"(报错、逻辑不对、崩溃)→ fix
  • 改动是不是在新增一个之前没有的能力feat
  • 改动是不是"代码变了,但外部行为完全没变"(比如挪文件、改变量名、拆函数)→ refactor
  • 改动是不是在动依赖版本、CI 配置、Docker 相关buildchore

路由的url

设计路由的时候,想清楚一点会容易很多:RESTful 的核心思路是把"动作"看成"对资源的操作",而不是直接把函数名搬到 URL 上。你现在这两个接口,与其叫"发送验证码"和"注册",不如换个角度想:

  • 发验证码 = “创建一个验证码资源”
  • 注册 = “创建一个用户资源”

这样两个接口都变成了 POST + 名词资源,符合 RESTful 风格:

router.POST("/api/v1/verification-codes", controller.SendCode)   // 创建验证码
router.POST("/api/v1/users", controller.RegisterByCode)          // 创建用户(注册)

为什么不建议这样写

router.POST("/user/send-code", controller.SendCode)      // ❌ 动词入了URL
router.POST("/user/register", controller.RegisterByCode) // ❌ 动词入了URL

加上版本前缀和路由分组

v1 := router.Group("/api/v1")
{
    users := v1.Group("/users")
    {
        users.POST("", controller.RegisterByCode)         // POST /api/v1/users → 注册
        // 以后这里还会加:
        // users.POST("/login", controller.Login)         // 登录(这个算例外,习惯上常用动词,因为"登录"本身不太算创建资源)
        // users.GET("/:id", controller.GetUser)          // 查用户详情
        // users.PUT("/:id", controller.UpdateUser)       // 改用户信息
        // users.DELETE("/:id", controller.DeleteUser)    // 删用户
    }

    v1.POST("/verification-codes", controller.SendCode)  // 发验证码,作为独立的小资源,不挂在 users 下面
}