一个基于 Go + Gin + MySQL + Redis 开发的博客系统,提供完整的用户认证、文章管理、评论系统、权限管理等功能。
- 用户注册(邮箱验证码验证)
- 用户登录(图形验证码)
- JWT 认证
- Token 刷新机制
- 密码重置
- 头像上传
- 用户信息修改
- 文章 CRUD
- 文章分类
- 文章标签
- 文章点赞
- 文章统计
- Markdown 支持
- 图片上传
- 评论 CRUD
- 嵌套评论
- 评论审核
- RBAC 权限模型
- 角色管理
- 菜单管理
- 权限管理
- 细粒度权限控制
- 用户私信
- 系统通知
- 消息已读状态
- 批量已读
- CORS 跨域支持
- 日志记录
- 请求恢复中间件
- 图片清理定时任务
- Go - 编程语言
- Gin - Web 框架
- GORM - ORM 框架
- MySQL - 关系型数据库
- Redis - 缓存数据库
- JWT - 身份认证
- golang-jwt/jwt - JWT 签发与验证
- go-redis/redis - Redis 客户端
- captcha - 图形验证码
- gomail - 邮件发送
Blog/
├── cmd/
│ └── service/
│ └── main.go # 程序入口
├── configs/
│ └── config.yaml # 配置文件
├── docs/
│ ├── API.md # API 文档
│ └── README.md # 项目说明
├── internal/
│ ├── api/ # API 路由和控制器
│ │ ├── router.go # 路由注册
│ │ └── v1/ # API v1 版本
│ │ ├── article/ # 文章模块
│ │ ├── auth/ # 认证模块
│ │ ├── category/ # 分类模块
│ │ ├── comment/ # 评论模块
│ │ ├── like/ # 点赞模块
│ │ ├── menu/ # 菜单模块
│ │ ├── message/ # 消息模块
│ │ ├── permission/ # 权限模块
│ │ ├── role/ # 角色模块
│ │ ├── tag/ # 标签模块
│ │ └── user/ # 用户模块
│ ├── app/
│ │ └── app.go # 应用初始化
│ ├── middleware/ # 中间件
│ │ ├── auth.go # JWT 认证中间件
│ │ ├── cors.go # CORS 中间件
│ │ ├── logger.go # 日志中间件
│ │ └── recovery.go # 恢复中间件
│ ├── model/ # 数据模型
│ │ ├── dto/ # 数据传输对象
│ │ │ ├── request/ # 请求 DTO
│ │ │ └── response/ # 响应 DTO
│ │ ├── entity/ # 实体模型
│ │ └── mapper/ # 数据映射
│ ├── repository/ # 数据仓库层
│ └── service/ # 业务逻辑层
├── pkg/ # 公共包
│ ├── captcha/ # 验证码
│ ├── config/ # 配置管理
│ ├── database/ # 数据库连接
│ ├── errors/ # 错误处理
│ ├── email/ # 邮件发送
│ ├── jwt/ # JWT 工具
│ ├── logger/ # 日志工具
│ └── util/ # 工具函数
├── uploads/ # 上传文件目录
│ ├── articles/ # 文章图片
│ └── avatars/ # 用户头像
├── logs/ # 日志文件目录
└── go.mod # Go 模块依赖
- Go 1.20+
- MySQL 5.7+
- Redis 5.0+
- 克隆项目
git clone https://github.com/your-repo/blog.git
cd blog- 安装依赖
go mod download- 配置数据库
编辑 configs/config.yaml 文件,配置 MySQL 和 Redis 连接信息:
app:
name: "Spring-Blog"
version: "1.0.0"
mode: "debug"
port: 8090
database:
mysql:
host: "localhost"
port: 3306
username: "root"
password: "your_password"
database: "Zblog"
redis:
host: "localhost"
port: 6379
password: "your_password"
db: 5
jwt:
secret: "your-jwt-secret-key"
expire_hours: 24
refresh_hours: 168
email:
host: "smtp.qq.com"
port: 465
username: "your-email@qq.com"
password: "your-email-password"- 创建数据库
CREATE DATABASE Zblog DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;- 启动服务
go run cmd/service/main.go服务启动后,默认监听 http://localhost:8090
详细的 API 文档请查看 API.md
| 模块 | 前缀 | 说明 |
|---|---|---|
| 认证 | /api/v1/auth |
登录、注册、验证码等 |
| 用户 | /api/v1/user |
用户信息、头像等 |
| 文章 | /api/v1/article |
文章 CRUD |
| 评论 | /api/v1/comment |
评论 CRUD |
| 点赞 | /api/v1/like |
点赞功能 |
| 分类 | /api/v1/category |
分类管理 |
| 标签 | /api/v1/tag |
标签管理 |
| 菜单 | /api/v1/menu |
菜单管理 |
| 角色 | /api/v1/role |
角色管理 |
| 权限 | /api/v1/permission |
权限管理 |
| 消息 | /api/v1/message |
消息中心 |
系统采用 RBAC(Role-Based Access Control)权限模型:
- 超级管理员 (admin): 拥有所有权限
- 普通用户 (user): 基本操作权限
- 自定义角色: 可根据需要配置
模块:操作
例如:
article:create- 创建文章article:update- 更新文章article:delete- 删除文章user:manage- 用户管理
- 遵循 Go 语言标准规范
- 使用 meaningful 的变量命名
- 适当的注释说明复杂逻辑
Controller (控制器) -> Service (服务) -> Repository (仓库) -> Database (数据库)
- Controller: 处理请求参数,调用 Service,返回响应
- Service: 业务逻辑处理
- Repository: 数据库操作
- Model: 数据模型定义
- 在
internal/model/entity/定义实体 - 在
internal/model/dto/定义请求/响应 DTO - 在
internal/repository/定义仓库接口和实现 - 在
internal/service/定义服务接口和实现 - 在
internal/api/v1/添加控制器和路由 - 在
internal/api/router.go注册路由
- 修改
mode为release - 使用强密码和 HTTPS
- 配置合理的数据库连接池
- 使用 Nginx 反向代理
- 配置日志轮转
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o blog cmd/service/main.go
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/blog .
COPY --from=builder /app/configs ./configs
COPY --from=builder /app/uploads ./uploads
EXPOSE 8090
CMD ["./blog"]- 首次运行前请确保数据库已创建
- 请修改默认的 JWT Secret 和邮箱配置
- 生产环境请使用 HTTPS
- 定期备份数据库
MIT License
欢迎提交 Issue 和 Pull Request!