# gin_gorm_oj
**Repository Path**: go_27/gin_gorm_oj
## Basic Information
- **Project Name**: gin_gorm_oj
- **Description**: No description available
- **Primary Language**: Go
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-01
- **Last Updated**: 2025-11-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# gin_gorm_oj
## 项目介绍
**gin_gorm_oj** 是一个基于 Go 语言开发的轻量级在线评测系统(Online Judge)后端服务。该项目采用现代化的 Web 技术栈,提供高效、稳定的编程题评测平台后端支持,包含题目管理、用户系统、代码提交与评测等核心功能,适用于教育、竞赛和学习场景。
## 技术栈
| 类别 | 技术/框架 | 版本要求 | 用途 | 官方手册地址 |
|------|----------|---------|------|------------|
| 编程语言 | Go | 1.16+ | 项目开发语言 | [https://golang.org/doc/](https://golang.org/doc/) |
| Web 框架 | Gin | v1.9+ | HTTP 请求处理与路由管理 | [https://gin-gonic.com/](https://gin-gonic.com/) |
| ORM 工具 | GORM | v1.25+ | 数据库操作与模型管理 | [https://gorm.io/](https://gorm.io/) |
| 数据库 | MySQL | 5.7+ | 数据存储 | [https://dev.mysql.com/doc/](https://dev.mysql.com/doc/) |
| 缓存 | Redis | 6.0+ | 数据缓存与临时存储 | [https://redis.io/documentation](https://redis.io/documentation) |
| 工具库 | go.uuid | v1.2+ | UUID生成 | [https://github.com/satori/go.uuid](https://github.com/satori/go.uuid) |
| API 文档 | Swagger | v2 | 自动生成 API 文档 | [https://swagger.io/docs/](https://swagger.io/docs/) |
| 辅助功能 | email | - | 邮件发送支持 | [https://github.com/jordan-wright/email](https://github.com/jordan-wright/email) |
| 认证 | JWT | - | 用户身份验证 | [https://jwt.io/introduction](https://jwt.io/introduction) |
## 项目架构
项目采用标准的分层架构设计,各模块职责明确,便于维护和扩展:
```
gin_gorm_oj/
├── code/ # 代码运行相关
│ ├── code-user/ # 用户代码目录
│ └── run.go # 代码运行管理
├── core/ # 核心功能模块
│ └── init_db.go # 数据库初始化与连接配置
├── define/ # 常量定义模块
│ └── define.go # 系统全局配置参数
├── helper/ # 工具函数库
│ └── helper.go # 通用辅助函数(JWT、加密、邮件、UUID、Redis等)
├── middlewares/ # 中间件层
│ ├── auth_admin.go # 管理员权限验证
│ └── auth_user.go # 用户权限验证
├── models/ # 数据模型层
│ ├── base.go # 基础模型结构
│ ├── problem.go # 题目模型
│ ├── problem_category.go # 题目分类关联模型
│ ├── category.go # 分类模型
│ ├── submit.go # 提交记录模型
│ ├── test_case.go # 测试用例模型
│ └── user.go # 用户模型
├── router/ # 路由层
│ └── app.go # 路由配置与注册
├── service/ # 业务逻辑层
│ ├── category.go # 分类管理服务
│ ├── ping.go # 健康检查服务
│ ├── problem.go # 题目相关业务逻辑
│ ├── submit.go # 提交相关业务逻辑
│ └── user.go # 用户相关业务逻辑
├── test/ # 测试目录
│ ├── email_test.go # 邮件功能测试
│ ├── gorm_test.go # 数据库操作测试
│ ├── jwt_test.go # JWT功能测试
│ ├── redis_test.go # Redis功能测试
│ └── uuid_test.go # UUID生成测试
├── main.go # 应用程序入口
├── go.mod # Go 模块依赖管理
├── go.sum # 依赖版本锁定文件
├── README.md # 项目说明文档
├── README.en.md # 英文版项目说明
└── swag.md # Swagger文档配置文件
```
### 各层职责说明
- **code**: 管理用户提交代码的运行和评测环境
- **core**: 负责数据库连接初始化等核心基础设施
- **define**: 存储系统配置参数、分页默认值等常量
- **helper**: 提供通用工具函数,包括JWT令牌生成、密码加密等功能
- **middlewares**: 实现认证中间件,处理用户身份验证和权限控制
- **models**: 定义数据库表结构和数据访问方法
- **router**: 配置 API 路由,将请求映射到对应的服务处理函数
- **service**: 实现业务逻辑,处理请求与响应
- **test**: 包含单元测试和功能测试代码
## 核心功能
- **题目管理**
- 问题列表查询(支持分页、关键词搜索、分类筛选)
- 题目详情查看(包含完整题目信息)
- 题目分类关联管理
- **用户系统**
- 用户登录认证(密码MD5加密,JWT令牌生成)
- 用户信息查询与展示
- 安全的数据访问(密码字段自动过滤)
- **代码提交与评测**
- 提交记录存储与管理
- 多维度查询支持(按用户、题目、状态等)
- 实时代码执行与判题
- 多测试用例并发评测
- 运行时资源监控(内存、时间限制)
- 判题结果反馈(正确、错误、超时、内存溢出、编译错误)
- **分类管理**
- 分类的增删改查
- 题目分类关联管理
- **API 接口**
- RESTful API 设计规范
- Swagger 文档自动生成
- 统一的响应格式与错误处理
- **辅助功能**
- 邮件发送支持
- 数据加密与安全保障
- UUID生成(唯一标识符)
- Redis缓存支持
- 中间件认证(用户认证、管理员认证)
## 快速开始
### 环境要求
- Go 1.16 或更高版本
- MySQL 5.7 或更高版本
- Redis 6.0 或更高版本
- Git
### 安装步骤
1. **克隆代码仓库**
```bash
git clone <仓库地址>
cd gin_gorm_oj
```
2. **安装依赖**
```bash
go mod tidy
```
3. **数据库配置**
- 创建数据库:`CREATE DATABASE gin_gorm_oj CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`
- 根据需要修改 `core/init_db.go` 中的数据库连接信息
4. **启动服务**
```bash
go run main.go
```
服务默认监听在 `http://localhost:8080`
## API 接口文档
系统集成了 Swagger 自动文档生成功能,启动服务后可通过以下地址访问完整的 API 文档:
- **Swagger 文档**: `http://localhost:8080/swagger/index.html`
### 常用 API 接口
| API路径 | 方法 | 功能描述 | 参数说明 |
|---------|------|----------|----------|
| `/ping` | GET | 服务健康检查 | 无 |
| `/login` | POST | 用户登录认证 | username: 用户名
password: 密码 |
| `/problem-list` | GET | 获取问题列表 | page: 页码
size: 每页数量
keyword: 搜索关键词
category_id: 分类ID |
| `/problem-detail` | GET | 获取问题详情 | identity: 题目唯一标识 |
| `/user-detail` | GET | 获取用户详情 | identity: 用户唯一标识 |
| `/submit-list` | GET | 获取提交列表 | page: 页码
size: 每页大小
problem_identity: 问题标识
user_identity: 用户标识
status: 状态 |
| `/submit` | POST | 提交代码 | problem_identity: 问题标识(Query参数)
body: 代码内容 |
| `/category-list` | GET | 获取分类列表 | page: 页码
size: 每页大小 |
| `/category-create` | POST | 创建分类 | name: 分类名称
identity: 分类标识(可选) |
| `/category-modify` | PUT | 修改分类 | identity: 分类标识
name: 分类名称 |
| `/category-delete` | DELETE | 删除分类 | identity: 分类标识 |
## 数据库设计
系统包含以下主要数据表:
- **users**: 用户信息表(存储用户名、密码加密、创建时间、提交次数、通过次数等)
- **problems**: 题目表(存储题目内容、标题、难度、时间限制、内存限制、提交次数、通过次数等)
- **categories**: 分类表(存储题目分类信息)
- **problem_categories**: 题目分类关联表(多对多关系映射)
- **submits**: 提交记录表(存储代码提交记录、评测结果、运行时间、内存使用等)
- **test_cases**: 测试用例表(存储题目测试数据和期望输出)
## 安全特性
- 用户密码字段在查询时自动排除,保护敏感信息
- 密码存储采用MD5加密方式
- JWT令牌认证机制,保障API访问安全
- 统一的错误处理和状态码返回机制
- 参数校验和输入验证
## 开发指南
### 代码风格
- 遵循 Go 语言官方代码风格
- 使用 `go fmt` 统一代码格式
- 关键逻辑添加详细注释
- 采用接口驱动设计模式
### 模型查询示例
```go
// 构建查询:关联问题表和用户表,并排除问题内容字段
tx := DB.Model(&Submit{}).Preload("Problem", func(db *gorm.DB) *gorm.DB {
return db.Omit("content") // 预加载Problem关联时,排除content字段(不查询问题内容)
}).Preload("User") // 预加载User关联(用户信息)
// 分类查询示例
tx := models.GetSubmitList(problemIdentity, userIdentity, status)
err = tx.Count(&count).Debug().Offset(page).Limit(size).Find(&data).Error
```
### 项目初始化流程
1. 配置数据库连接信息(core/init_db.go)
2. 初始化Redis连接(helper/helper.go中的InitRedisDB函数)
3. 创建必要的目录结构(code/code-user/)
4. 初始化路由和中间件(router/app.go)
5. 启动HTTP服务器(main.go)
### Swagger文档配置
项目使用swag.md文件配置Swagger API文档,启动服务后可通过Web界面查看自动生成的API文档。
### md5
```go
// GetMd5 计算字符串的MD5哈希值
func GetMd5(s string) string {
// 将输入字符串转换为字节切片,计算MD5哈希,并格式化为十六进制字符串
return fmt.Sprintf("%x", md5.Sum([]byte(s)))
}
password = GetMd5(password)
```
## JWT认证
### 安装JWT依赖
```bash
go get github.com/dgrijalva/jwt-go
```
### JWT使用示例
```go
// 生成JWT令牌
token, err := helper.GenerateToken(data.Identity, data.Name)
// 验证JWT令牌
claims, err := helper.ParseToken(token)
```
### 中间件认证示例
```go
// 用户认证中间件
token := c.GetHeader("Token")
if token == "" {
c.JSON(http.StatusOK, gin.H{
"code": -1,
"msg": "未登录",
})
c.Abort()
return
}
// 解析Token
userClaims, err := helper.AnalyseToken(token)
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": -1,
"msg": "认证失败",
})
c.Abort()
return
}
// 存储用户信息到上下文
c.Set("user", userClaims)
## 密码安全
### MD5加密示例
```go
// GetMd5 计算字符串的MD5哈希值
func GetMd5(s string) string {
// 将输入字符串转换为字节切片,计算MD5哈希,并格式化为十六进制字符串
return fmt.Sprintf("%x", md5.Sum([]byte(s)))
}
password = GetMd5(password) // 用户登录时密码加密
```
## 发送邮件功能
### 安装依赖
```bash
go get github.com/jordan-wright/email
```
```go
// SendCode 发送邮件验证码
// toUserEmail: 收件人邮箱地址
// code: 要发送的验证码
func SendCode(toUserEmail, code string) error {
e := email.NewEmail() // 创建邮件对象
e.From = "Get " // 设置发件人信息
e.To = []string{toUserEmail} // 设置收件人邮箱
e.Subject = "验证码发送" // 设置邮件主题
// 设置HTML格式的邮件内容,包含验证码
e.HTML = []byte("您的验证码:" + code + "")
// 使用TLS加密方式发送邮件
return e.SendWithTLS(
"smtp.163.com:465", // SMTP服务器地址和端口
smtp.PlainAuth(
"", // 身份标识(通常为空)
"getcharzhaopan@163.com", // 发件人邮箱账号
"XYQHBVISUAHXXRQ", // SMTP授权密码
"smtp.163.com", // SMTP服务器地址
),
&tls.Config{
InsecureSkipVerify: true, // 跳过证书验证(生产环境不建议)
ServerName: "smtp.163.com", // 服务器名称
},
)
}
```
### 功能说明
邮件发送功能主要用于系统通知、用户验证等场景,位于helper包中实现。相关功能可在test目录下的email_test.go中查看使用示例。
## UUID
### 安装依赖
```bash
go get github.com/satori/go.uuid
```
```go
// 生成版本4的UUID并转换为字符串格式
s := uuid.NewV4().String()
// 打印生成的UUID到控制台
println(s)
```
```go
// GetUUID 生成全局唯一标识符
func GetUUID() string {
// 使用UUID v4版本生成随机唯一标识符并返回字符串格式
return uuid.NewV4().String()
}
```
## redis
### 安装依赖
```bash
go get github.com/go-redis/redis/v8
```
```go
// InitRedisDB 初始化Redis数据库连接
// 返回Redis客户端实例指针
func InitRedisDB() *redis.Client {
return redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis服务器地址和端口
Password: "1234", // 密码(空表示无密码)
DB: 0, // 数据库编号(0表示默认数据库)
})
}
```
---
## 参与贡献
我们欢迎社区贡献!请按照以下步骤参与项目开发:
1. Fork 本仓库
2. 新建功能分支 (`git checkout -b feature/amazing-feature`)
3. 提交更改 (`git commit -m 'Add some amazing feature'`)
4. 推送到分支 (`git push origin feature/amazing-feature`)
5. 打开 Pull Request
## 许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件
## 联系方式
如有问题或建议,欢迎通过以下方式联系我们:
- **Issues**: 通过项目仓库的Issues提交反馈
- **项目维护者**: 可在代码贡献历史中查看主要维护者信息