一个基于 Go 语言、Gin 框架和 MySQL 数据库的 Web API 项目,采用分层架构设计,适合 Go 语言初学者学习。
本项目是一个简单的用户和文章管理系统,提供了完整的 CRUD(增删改查)操作。项目采用经典的三层架构模式,代码结构清晰,注释详细,非常适合 Go 语言新手学习和参考。
- 👤 用户管理:创建、查询、更新、删除用户
- 📝 文章管理:创建、查询、更新、删除文章
- 🔗 关联查询:获取用户及其所有文章
- 🔄 事务支持:用户创建时自动创建默认文章(演示事务操作)
golang-gin-mysql/
├── cmd/
│ └── server/
│ └── main.go # 应用程序入口点
├── internal/ # 内部包(不对外暴露)
│ ├── config/
│ │ └── config.go # 配置管理
│ ├── db/
│ │ └── db.go # 数据库连接管理
│ ├── handler/ # HTTP 处理器层
│ │ ├── user_handler.go # 用户相关 HTTP 处理
│ │ └── article_handler.go # 文章相关 HTTP 处理
│ ├── model/ # 数据模型层
│ │ ├── user.go # 用户数据模型
│ │ └── article.go # 文章数据模型
│ ├── repository/ # 数据访问层
│ │ ├── user_repository.go # 用户数据访问
│ │ └── article_repository.go # 文章数据访问
│ └── service/ # 业务逻辑层
│ └── user_service.go # 用户业务逻辑
├── config.yaml # 配置文件
├── go.mod # Go 模块文件
├── go.sum # Go 模块校验文件
└── README.md # 项目说明文档
- Go 1.24.0 或更高版本
- MySQL 5.7 或更高版本
- Git
-
克隆项目
git clone <repository-url> cd golang-gin-mysql
-
安装依赖
go mod tidy
-
配置数据库
创建 MySQL 数据库和表:
CREATE DATABASE dev_learning; USE dev_learning; -- 创建用户表 CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 创建文章表 CREATE TABLE articles ( id BIGINT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL, title VARCHAR(200) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE );
-
修改配置文件
编辑
config.yaml文件,修改数据库连接信息:server: port: ":8080" mysql: dsn: "root:your_password@tcp(127.0.0.1:3306)/dev_learning?parseTime=true&loc=Local"
-
运行项目
go run cmd/server/main.go
看到以下输出表示启动成功:
[SERVER] listening on :8080
| 方法 | 路径 | 描述 | 请求体 |
|---|---|---|---|
| POST | /users |
创建用户(同时创建默认文章) | {"username": "string", "email": "string"} |
| GET | /users/:id |
获取用户信息及其文章列表 | - |
| PUT | /users/:id |
更新用户信息 | {"username": "string", "email": "string"} |
| DELETE | /users/:id |
删除用户(暂未实现) | - |
| 方法 | 路径 | 描述 | 请求体 |
|---|---|---|---|
| POST | /articles |
创建文章 | {"user_id": int64, "title": "string", "content": "string"} |
| GET | /articles/:id |
获取单篇文章 | - |
| PUT | /articles/:id |
更新文章 | {"title": "string", "content": "string"} |
| DELETE | /articles/:id |
删除文章 | - |
| GET | /articles/user/:uid |
获取用户的所有文章 | - |
创建用户:
curl -X POST http://localhost:8080/users \
-H "Content-Type: application/json" \
-d '{"username": "john_doe", "email": "john@example.com"}'获取用户信息:
curl http://localhost:8080/users/1创建文章:
curl -X POST http://localhost:8080/articles \
-H "Content-Type: application/json" \
-d '{"user_id": 1, "title": "我的第一篇文章", "content": "这是文章内容..."}'本项目采用经典的三层架构模式:
-
Handler 层(处理器层)
- 处理 HTTP 请求和响应
- 参数验证和错误处理
- 调用 Service 层处理业务逻辑
-
Service 层(业务逻辑层)
- 处理复杂的业务逻辑
- 协调多个 Repository 操作
- 事务管理
-
Repository 层(数据访问层)
- 封装数据库操作
- 提供数据访问接口
- 隔离数据库实现细节
- 依赖注入:通过构造函数注入依赖
- 接口隔离:每层只依赖必要的接口
- 单一职责:每个结构体和方法职责单一
- Web 框架:Gin - 高性能的 Go Web 框架
- 数据库:MySQL - 关系型数据库
- ORM:database/sql - Go 标准库数据库操作
- 配置管理:Viper - 配置管理库
- 数据验证:Gin 内置验证器
- 包管理:使用
go mod管理依赖 - 结构体和方法:面向对象编程
- 接口:多态和依赖注入
- 错误处理:Go 语言的错误处理机制
- 并发:Context 上下文管理
- RESTful API:REST 风格的 API 设计
- HTTP 状态码:正确的状态码使用
- JSON 序列化:数据交换格式
- 中间件:请求处理管道
- 数据库事务:数据一致性保证
检查以下几点:
- MySQL 服务是否启动
- 数据库连接信息是否正确
- 数据库和表是否已创建
- 防火墙是否阻止连接
如果 8080 端口被占用,可以修改 config.yaml 中的端口配置:
server:
port: ":8081" # 修改为其他端口欢迎提交 Issue 和 Pull Request 来改进这个项目!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
感谢以下开源项目:
- Gin - Web 框架
- Viper - 配置管理
- Go MySQL Driver - MySQL 驱动
Happy Coding! 🎉