一、项目任务概述

本项目旨在开发一个基于 Go 语言和 Gin 框架构建的简易在线评测系统(Online Judge),命名为“deepjudge”。平台主要面向编程初学者、算法竞赛选手和教学辅助场景,支持多语言编程提交、题目管理、代码评测与结构分析等功能。系统整体采用前后端分离架构设计,后端基于 Gin,前端可使用 Vue.js 实现基本交互,后期支持 API 扩展及深度分析能力。

本项目按照功能模块拆分为四个核心部分:用户系统、题目管理、代码提交与评测、DeepSeek API 分析,并为每一部分制定了可考核、可量化的技术指标,以保障系统开发质量与后期维护能力。

本人参与了其中数据库总体设计,负责平台整体数据库的设计与建模;并规划提交表数据分析表等关键数据结构;

二、技术选型

后端框架:Gin

数据库:SQLite

缓存:Redis

三,gin开发流程记录

基本模块分为Model,router和service的三层

Model层是数据访问层,主要包括了类型的定义(对象结构体),获取类的相关方法,并返回对象数组

type Problem struct {
	gorm.Model

	ID           uint   `json:"id"`
	Title        string `json:"title"`
	Description  string `json:"description"` // 题目描述
	Input        string `json:"input"`       // 输入描述
	Output       string `json:"output"`      // 输出描述
	SampleInput  string `json:"sample_input"`
	SampleOutput string `json:"sample_output"`
	Difficulty   string `json:"difficulty"` // easy / medium / hard
}

routes层主要是将方法映射到相应的请求路径上,在Gin框架中,可以通过路由分组实现接口分类。将公用接口和受保护接口分开管理,例如将题目和提交相关的接口划分为不同路由组。

例如,利用gin框架将题目和提交区别为受保护接口和公用接口,将操作方法映射到相应的请求路径,实现增删改查

func SetupRoutes(r *gin.Engine) {
	r.POST("/register", controllers.Register) //注册
	r.POST("/login", controllers.Login)       //登陆

	// 公共题目接口
	r.GET("/problems", controllers.GetProblems)        //查看题目列表
	r.GET("/problems/:id", controllers.GetProblemByID) //查看题目

	// 受保护接口
	auth := r.Group("/auth", middleware.AuthMiddleware())
	{
		problems := auth.Group("/problems")
		{

			problems.POST("/:id/submit", middleware.RateLimitMiddleware(2, 10*time.Second), // 10 秒最多 2 次
				controllers.SubmitCode) //提交代码
			problems.GET("/:id/all_submissions", controllers.GetProblemSubmissions)
			problems.GET("/:id/submissions", controllers.GetProblemSubmissions)
		}

		edit := auth.Group("/edit")
		{
			edit.POST("/add", controllers.CreateProblem)          //创建题目
			edit.PUT("/:id", controllers.UpdateProblem)           //编辑题目
			edit.DELETE("/:id", controllers.DeleteProblem)        //删除题目
			edit.POST("/:id/upload", controllers.UploadTestcases) //上传测试用例
		}

		// 与用户相关的通用接口
		auth.GET("/submissions", controllers.GetUserSubmissions)             // 获取当前用户所有提交记录
		auth.GET("/submissions/:id/results", controllers.GetTestcaseResults) // 查看测试点结果
		// 分析结果接口
		auth.POST("/submissions/:id/analyze", controllers.TriggerAnalysis) // 提交分析请求
		auth.GET("/submissions/:id/analysis", controllers.GetAllAnalyses)  // 查看分析结果
	}
}

service层提供了应用方法,其中包括了对数据库操作方法的调用,这里的调用请求经过routes层处理变成了可执行的方法

例如,service中定义的调用DeepSeek接口分析提交代码的方法中,向数据库发送了查询提交记录的请求

func AnalyzeCodeWithDeepSeek(submissionID uint) (AnalysisResult, error) {
	// fmt.Println ("I m working")
	// 获取提交记录
	var submission models.Submission
	if err := utils.DB.Where("id = ?", submissionID).First(&submission).Error; err != nil {
		return AnalysisResult{}, fmt.Errorf("提交记录未找到:%v", err)
	}
}

更多数据库的相应操作可以在GROM提供方法中找到

四,数据库建立

数据库设计步骤

基于DeepSeek的代码评测和自动纠错优化系统-数据库架构的初步设计和流程_deepseek code review-CSDN博客

基于DeepSeek的代码评测和自动纠错优化系统-需求分析与关系图-CSDN博客

基于DeepSeek的代码评测和自动纠错优化系统-数据库逻辑结构设计-CSDN博客

基于DeepSeek的代码评测和自动纠错优化系统-数据库物理结构设计与实施-CSDN博客

基于DeepSeek的代码评测与自动纠错优化系统-基于索引优化搜索结构-CSDN博客

五,优化流程

使用了ORM

基于DeepSeek的ai代码自动纠错和优化评测系统-ORM处理数据库-CSDN博客

用Reddis作为缓存实现异步控制与并发

基于DeepSeek的代码评测和自动纠错优化系统-Redis异步队列实现-CSDN博客

基于索引优化搜索结构基于DeepSeek的代码评测与自动纠错优化系统-基于索引优化搜索结构-CSDN博客

六,实现心得

       数据库开发的过程围绕如何高效健壮地支撑核心业务(用户系统、题目管理、代码评测与分析)展开,并时刻关注未来的可扩展性。开发核心点在于清晰地将业务实体(用户、题目、提交记录、分析结果)及其关系映射为合理的表结构,特别是用户与提交(1:N)、题目与提交(1:N)以及提交与分析(1:1)这些关键关联的精确设计。

       在题目表中使用 JSON 字段存储题目标签、难度参数等动态元数据,这充分利用了 Gin 处理 JSON 数据结构的便捷性,方便服务层通过 binding 或 mapstructure 等机制高效解析与注入业务逻辑,特别针对与 DeepSeek API 的集成需求,设计了结构清晰、独立的分析结果表,该表设计兼容以结构化 JSON 或 TEXT 格式存储深度分析数据,使 Gin 应用服务层能够高效地接收、存储和按需查询复杂的分析结果集,为后续基于 Gin API 扩展更复杂的评测报告、代码结构洞察等深度分析功能,奠定了坚实的数据基础。

       性能优化是处理高频代码提交场景的重中之重。提交记录表将成为核心压力点,因此对其进行了重点设计:对高频查询字段(如user_id, problem_id, created_at, status)建立了必要的索引,状态字段采用枚举类型以提高效率,同时谨慎权衡读写性能,避免过度索引影响写入速度。安全与一致性也贯穿设计始终,包括对用户密码进行强哈希(如bcrypt)处理,并在关键数据关联(如submissions.problem_id -> problems.id)处使用外键约束来强制保证数据完整性,对核心业务逻辑(如用户积分操作)则注重事务的原子性实现。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐