基于Gin和GORM的在线判题系统后端

时间:2024-10-26 19:18:26

项目地址:基于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 -
mail 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邮箱为例,说明获取流程:

  1. 打开 163 邮箱官网 https://mail.163.com/,登录你的邮箱账号。
  2. 登录成功后,点击页面上方的 “设置”,选择**“POP3/SMTP/IMAP”**。
  3. 在**“开启服务”**选项中开启 “POP3/SMTP服务” 。开启后,系统会提示你需要设置一个 授权密码,按提示设置即可。

注意:授权码只生成一次,记得及时保存(保存到本地或发邮件给自己)。

五、补充说明

  1. 创建表和插入表的sql都放在sql目录下,提交代码的测试数据在“提交代码测试数据.md“中,但本系统目前未能实现对提交的代码进行内存检测功能,主要原因是子程序运行结束后会立即释放内存,仅靠在子程序运行前后获取内存状态是无效的,此功能有待完善。
  2. 本人使用了自己开发的工具包autosql,该包是基于GORM的GEN功能开发的,不仅能自动生成数据库表对应的结构体,还能自动生成外键字段。工具包地址:autosql