最近计划重新梳理一下OJ系统

文章字数:2795

最近又翻了翻毕业设计时做的OJ系统,感觉还有很多东西值得完善,再加上从2016年至今的数据,搁置起来就很浪费,于是想起来看看能不能再重新归置归置:

按理说这么些年过去,水平应该又能有所长进。

启用域名:首页 - DidaOJ

20250615 后续更新计划等信息优先在站点进行维护,本文仅作备份。

思路梳理

待办记录

  • 题目
    • 题目列表
    • 题目详情
      • 基础功能
      • 自定义题面
    • 题目集,类似于标签
    • 题目推荐
    • 出题流程
      • 编辑题目,判题数据上传R2存储
    • 更多判题类型,其中包括Virtual Judge
      • 选择题、普通填空题与程序填空题等
  • 评测
    • 评测列表
    • 在线测试?服务器资源占用明显,看看是否支持
    • 调整评测列表页面代码按钮为弹出模态框
    • 忽略末尾1个换行
    • 上传判题数据的时候生成rule.yaml
    • 特殊判题
      • 根据程序ret来判断结果
        • 0 - AC
        • 1 - WA
        • 2 - PE
        • other - RE
    • 一些题目的数据需要整理
      • 276 缺少out文件
    • 比赛评测直接输入ID时隐藏
    • 比赛评测展示时隐藏问题ID
  • 排名
    • 总排名
    • 每日排名
    • Rank排名
  • 讨论
    • 并入原博客的功能
    • 博客文章支持收藏
    • 支持自定义MarkDown语法,比如显示题目标记1
  • 用户
    • 登录
    • 注册
    • 权限管理
      • 权限项
      • 角色
      • 管理页面角色分配给具体用户
    • 用户动态
      • 最近提交
      • 最近发帖与回复
      • 提交不考虑保护,发帖隐私保护?
    • 空间说说
      • 想想必要性,是否与发帖功能冗余
    • 空间自定义样式
      • 想想必要性,用户参与度不一定高
    • 签到
      • 每日登录自动签到?
    • 积分系统
      • 积分兑换一些奖励?题目数据?
  • 比赛
    • 竞赛列表
    • 近期比赛
      • 公共源已失效,爬取知名OJ生成数据
    • 竞赛管理
      • 每个人都可以创建比赛
      • 题目可以后台上传分发缓存
        • 分发成功后可以在页面查看cdn版本
        • 输入密码查看
      • 竞赛编辑
        • 管理题目
        • 题目编写自定义题面
        • 设置访问规则
          • 公开
          • 私有
            • 显示在列表/在列表中隐藏
            • 设置密码
            • 是否允许注册
              • 设置截止时间
      • 防作弊
        • 查重
        • 额外客户端
          • 限制仅客户端访问
          • 手机锁定应用
        • 摄像头拍照
        • 屏幕监控
        • IP识别
          • 需要验证一下出口IP
          • 考虑在学校机房部署防作弊验证服务器?
        • 粘贴到输入框时检测内容是否包含关键词
  • 系统
    • 状态
      • 读取R2或者Cloudflare数据库的接口更新信息
    • 关于
      • 读取帖子信息或直接重定向?
  • 工具
    • 码池
  • 杂项
    • 显示效果
      • 组件页边距优化
      • 设置不加载背景图
      • live2D组件
    • 涉及操作R2存储的编辑增加分布式锁

架构

尽可能利用cloudflare资源,分析性能瓶颈点,日常问题不大,突增在大型比赛期间。

  • 查看题目
    • 自动生成离线?代理?
    • 搭配hugo?密码验证?
  • 提交代码
  • 判题
    • 引入任务中心,判题任务分发

前端

使用vue3框架开发,引入TDesign作为基础UI组件库。

后端

使用golang开发,mongodb作为数据库。

判题机安全性

判题机的沙盒直接使用go-judge,只需要制作一个调度程序即可。
Go Judge Documentation
Online Judge 是如何解决判题端安全性问题的? - 知乎

判题数据分发

判题数据的存储使用Cloudflare的R2存储,判题机评测时从R2处拉取数据。
题目评测数据具有一个md5码,存在问题的属性里,评测机发现与本地数据不匹配时,重新拉去评测数据。
如果下载后还不匹配,休眠后重试 在后台上传文件时先存在web端文件夹,用户点保存计算md5后上传R2。
可以考虑支持上传压缩包自动解压。

判题机环境

1
2
3
4
apt install -y build-essential    # C 和 C++
apt install -y python3 python3-pip
apt install -y default-jdk
apt install -y golang-go

g++ –version Python 3.11 Java 1.17 golang 1.19

旧数据迁移

写一个迁移程序,从老的数据库中读取数据,整理后写入新的mongodb数据库。

  • HPUOJ · 1.0 - [ ~ 2016.10 ]
    • 数据仍然没有下落,暂时无法找回,看看有没有谁有线索。
    • 看起来至少可以从博客手动恢复一部分题目
  • HPUOJ · 2.0 - [ 2015.09 ~ 2018.12 ]
    • OJ数据全部导入到CodeOJ1.0,用户密码由于规则无法找回,可以尝试提供一个迁移页面
    • Vjudge数据尝试导入DidaOJ
  • CodeOJ · 1.0 - [ 2019.01 ~ 至今 ]
    • 数据比较可控,支持完美迁移
  • hpuoj.com
    • 数据比较可控,支持完美迁移
  1. 迁移题目数据
    1. 以CodeOJ的数据为准
    2. 判题数据重新通过系统导入
  2. 迁移用户
    1. 以jol数据为准
    2. 补充codeoj独有的数据
  3. 迁移比赛记录
    1. 合并jol、vhoj数据
    2. 以时间排序
  4. 迁移评测记录
    1. 合并jol、codeoj、vhoj数据
    2. 以时间排序
  5. 迁移讨论区
    1. 合并jol、codeoj数据
    2. 以时间排序
  6. 迁移其他数据
    1. 已手动编辑为主

更新计划

以下主要取为老计划存档。

功能相关

  • 报名系统
  • 教学与题解系统2
  • 用户签名显示3
  • OJ系统性信息展示
  • 表单系统4
  • 投票系统5
  • 工具(草稿、画板……)

以下为公测前已完成,存档以供查看

说明 本任务从5月23号开始记录,

  • 判题各种结果测试
  • 分任务判题
  • 去除HTTP方式连接数据库
  • spj重构
  • 预览图片层级

更新日志

本日志自2019年4月19日开始记录。

图片上传功能

20250527

  • OJ核心功能基本完成,继续完善细节

20250516

  • 用户系统已完成

20250505

  • 完善C/C++/Java/Python评测逻辑
  • 完善用户登陆与注销操作

20250501

  • 完善问题详情页面

20250530

  • 完善系统相关文档

20250429

  • 完善用户系统

20250428

  • 完善数据库迁移逻辑
  • 完善判题机基础逻辑

20250427

  • 完善网站编辑器与问题详情页

20250426

  • OJ重启计划立项
  • 初始化网站基础框架与问题列表页

20190817

  • 增加背景图展示
  • 修复新闻编辑页新闻权限展示bug
  • 开源前端代码
  • 修复工信部备案链接
  • 修复静态代理链接
  • 首页友链显示效果优化
  • 修复无法编辑回复的BUG

20190621

  • 修复苹果端友情链接样式BUG

20190620

  • 首页增加友情链接
  • 优化首页圆环样式
  • 修复切换用户空间数据不重载的BUG

20190619

  • 题目显示题目来源
  • 修复苹果系统日期bug
  • 空间页展示提交统计

20190618

  • 博客文章支持统计浏览量
  • 增加码池功能

20190617

  • 修复博客文章过长导致编辑失败的错误

20190616

  • CodeOJ进入公测

20190526

  • 判题完成

20190514

  • 测试判题

20190513

  • 优化状态页面
  • 新增用户签名信息
  • 多种判题方式

20190512

  • 状态页面
  • 提交代码

20190510~20190511

  • 判题代码

20190509

  • 修复新建博文title可以设置为空的bug
  • 新建问题功能
  • 修复hint等为空的报错

20190508

  • 完善问题管理
  • 提交状态页
  • 修复搜索BUG

20190508

  • 问题管理
  • 问题编辑
  • 问题添加

20190507

  • 初步设计判题系统
  • 问题列表页设计

20190502~20190506

  • 设计判题系统
  • 编写相关报告

20190501

  • 程序docker运行

20190430

  • 图片上传功能

头像

  • 消息推送
  • docker技术

20190429

  • 优化新闻权限
  • 修复时间BUG

20190428

  • 完善增加博客文章
  • 完善博客筛选功能
  • 新闻管理

20190427

  • 整理报告
  • 增加文章选项

20190426

  • 整理系统信息
  • 细节调整

20190425

  • 完善邮件系统
  • 完善首页轮播图设置
  • 列表筛选功能
  • 修复系统BUG

20190424

  • 完善忘记密码功能
  • 邮箱服务切换到腾讯企业邮
  • 邮箱发件系统待观察

20190423

  • 注册功能
  • 忘记密码页面
  • 修复BUG

20190422

  • 管理页面 – 首页轮播图设置页面 – 支持管理页面切换端口

20190421

  • 管理页面 – 用户信息编辑 – 用户邮箱验证 – 博客管理页面
  • 动态切换端口

20190420

  • 增加文章私有选项,获取文章增加token判断
  • 用户信息页面
  • 管理后台菜单

20190419

  • 完善权限系统
  • 整理并修复系统性问题
  • 增加错误页
  • 完善博客系统,新增文章编辑页面
  • 项目部署服务器

之前

  • 设计架构
    • 前端页面VUE
    • 后台框架PhalApi
  • 编写首页、问题列表页、问题页、博客页

之前的之前

  • 研究其他OJ的先进经验

  1. 类似vjudge ↩︎

  2. 可暂使用博客代替 ↩︎

  3. 目前已有旧OJ数据但暂未设计展示效果,欢迎提供意见 ↩︎

  4. 可暂时与注册型比赛整合 ↩︎

  5. 比如关于此页面的投票 ↩︎

该内容采用 CC BY-NC-SA 4.0 许可协议。

如果对您有帮助或存在意见建议,欢迎在下方评论交流。

最后更新于 2025-05-27 20:41:00

加载中...