基于Gin和GORM的在线判题系统后端
项目地址:基于Gin和GORM的在线判题系统后端
一、开发环境与API测试工具
开发环境
Go1.23,VSCode,Gin框架,GORM框架
gin-swagger
swagger是一个用于描述和文档化 RESTful API 的开源工具,它可以帮助开发者生成交互式文档,并且提供 API 的可视化测试功能。gin-swagger
使得在 Gin 框架中集成 Swagger 变得简单,提供了方便的 API 文档生成方式。通过注释或特定的标记(如 @Summary
、@Param
等),gin-swagger
可以根据代码中的注释自动生成 API 文档,使用方式详见gin-swagger。
二、数据库设计
category
表
字段名 | 类型 | 是否为空 | 默认值 | 注释 |
---|---|---|---|---|
id | int | 否 | AUTO_INCREMENT | 主键 |
name | varchar(100) | 是 | NULL | - |
parent_id | int | 是 | 0 | 父级ID |
created_at | datetime | 是 | NULL | - |
updated_at | datetime | 是 | NULL | - |
deleted_at | datetime | 是 | NULL | - |
problem
表
字段名 | 类型 | 是否为空 | 默认值 | 注释 |
---|---|---|---|---|
id | int | 否 | AUTO_INCREMENT | 主键 |
title | varchar(100) | 是 | NULL | 问题标题 |
content | text | 是 | NULL | 问题内容 |
max_runtime | int | 是 | NULL | 最大运行时间 |
max_mem | int | 是 | NULL | 最大运行内存 |
pass_num | int | 是 | 0 | 所有用户通过的次数 |
submit_num | int | 是 | 0 | 所有用户提交的次数 |
created_at | datetime | 是 | NULL | - |
updated_at | datetime | 是 | NULL | - |
deleted_at | datetime | 是 | NULL | - |
category_id | int | 否 | - | 外键 |
user
表
字段名 | 类型 | 是否为空 | 默认值 | 注释 |
---|---|---|---|---|
id | int | 否 | AUTO_INCREMENT | 主键 |
name | varchar(100) | 是 | NULL | - |
password | varchar(32) | 是 | NULL | - |
phone | varchar(20) | 是 | NULL | - |
varchar(100) | 是 | NULL | - | |
pass_num | int | 是 | 0 | 通过问题数 |
submit_num | int | 是 | 0 | 总提交次数 |
is_admin | tinyint | 是 | 0 | 是否是管理员【0-否,1-是】 |
created_at | datetime | 是 | NULL | - |
updated_at | datetime | 是 | NULL | - |
deleted_at | datetime | 是 | NULL | - |
submit
表
字段名 | 类型 | 是否为空 | 默认值 | 注释 |
---|---|---|---|---|
id | int | 否 | AUTO_INCREMENT | 主键 |
code_path | varchar(255) | 是 | NULL | - |
status | tinyint | 是 | -1 | 提交状态【-1-待判断,1-答案正确,2-答案错误,3-编译错误,4-运行错误,5-运行超时,6-运行超内存】 |
created_at | datetime | 是 | NULL | - |
updated_at | datetime | 是 | NULL | - |
deleted_at | datetime | 是 | NULL | - |
problem_id | int | 否 | - | 外键 |
user_id | int | 否 | - | 外键 |
test_case
表
字段名 | 类型 | 是否为空 | 默认值 | 注释 |
---|---|---|---|---|
id | int | 否 | AUTO_INCREMENT | 主键 |
input | text | 是 | NULL | - |
output | text | 是 | NULL | - |
created_at | datetime | 是 | NULL | - |
updated_at | datetime | 是 | NULL | - |
deleted_at | datetime | 是 | NULL | - |
problem_id | int | 否 | - | 外键 |
三、系统模块与目录总体设计
系统模块
- 公共模块:所有人能使用的模块,功能:查看分类列表,查看问题列表,查看提交列表,查看排名列表,查询问题,查询用户。
- 用户模块:和用户相关的模块,功能:注册,登录,发送验证码,检测提交的代码。
- 管理员模块:和管理员相关的模块,功能:创建问题,修改问题,创建分类,修改分类,删除分类,获取测试用例列表。
- 安全模块:使用中间件验证用户或管理员身份。
目录结构
├─code
├─docs
├─middlewares
├─model
├─router
├─service
├─utils
└─main.go
- code:存放用户提交的代码。
- docs:gin-swagger项目文档。
- middlewares:中间件模块,验证管理员或用户身份。
- model:数据模型层,定义数据库表结构的实体映射,保持数据与数据库结构一致。
- router:路由配置层,定义各请求路径和对应的处理函数,将请求正确地分配到相关业务逻辑。
- service:服务层,包含核心业务逻辑的实现,调用其他模块完成具体的业务流程。
- utils:工具库,封装所有业务层需要用到的公共函数或变量,例如格式转换、通用计算等。
- 主函数:利用自动生成工具生成数据库表对应的结构体,调用路由配置层的函数。
四、邮箱授权码获取流程
邮箱授权码是由邮箱提供商生成并分配的,允许外部应用(比如你的程序)通过 SMTP 协议访问邮箱服务并发送邮件,以下以163邮箱为例,说明获取流程:
- 打开 163 邮箱官网 https://mail.163.com/,登录你的邮箱账号。
- 登录成功后,点击页面上方的 “设置”,选择**“POP3/SMTP/IMAP”**。
- 在**“开启服务”**选项中开启 “POP3/SMTP服务” 。开启后,系统会提示你需要设置一个 授权密码,按提示设置即可。
注意:授权码只生成一次,记得及时保存(保存到本地或发邮件给自己)。
五、补充说明
- 创建表和插入表的sql都放在sql目录下,提交代码的测试数据在“提交代码测试数据.md“中,但本系统目前未能实现对提交的代码进行内存检测功能,主要原因是子程序运行结束后会立即释放内存,仅靠在子程序运行前后获取内存状态是无效的,此功能有待完善。
- 本人使用了自己开发的工具包autosql,该包是基于GORM的GEN功能开发的,不仅能自动生成数据库表对应的结构体,还能自动生成外键字段。工具包地址:autosql。