Skip to content

liuxukun2000/JCoder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

稳定开发测试版本:Dev_Beta_1.2.1

稳定运营版本:Beta_1.2.0

版本更迭时间线:

  • 2021-01-11: Beta_1.0.1上线,承担2021学年春季学期数据结构与算法分析课程的作业与评测任务
  • 2021-01-12:Beta_1.0.4上线
  • 2021-01-18:Beta_1.1.0上线
  • 2021-02-15: Beta_1.2.0上线:http://47.106.36.52/ (后端不定时开放,仅供开发,暂不提供测评。)

开发人员:

  • 黄彦淞 (SID:11912824):前端工程与美术设计
  • 刘旭坤 (SID:11912823):后端工程,数据库设计与测评机架构

前端技术栈

基于Node.js的React框架开发,使用Ant Design及其衍生产品的UI界面库,兼顾图形美术设计与用户友好的界面布局。

后端技术栈

  • 后端使用PythonDjango框架,使用Mysql作为主数据库,Redis作为缓存数据库,RabbitMQ管理数据库与测评机。由于使用ORM框架,可以无缝支持PostgreSQL,SQLite,Oracle等常见数据库。
  • 测评端使用DockerPython构建。
  • 查重使用SimMOSS(目前不支持在线查重,但可通过脚本批量查重)

界面与功能展示

main

首页

  • 全局公告板

题目列表页

  • 基本信息
    • 游客可见
      • 题目编号
      • 题目名称,点击可进入题目详情页面
      • 难度等级
      • 通过率
    • 登录用户额外可见
      • 本题状态(未尝试\尝试未通过\通过)
      • 是否位于“喜爱”列表
      • 是否位于“计划中”列表
  • 详细信息
    • 普通用户可见
      • 来源标签
      • 算法标签
      • 用户操作菜单(设置喜爱\设置计划)
    • 管理员额外可见
      • 题目可见性(管理员可看到不可见题目)
      • 管理菜单(调整题目可见性、删除题目等)
  • 右上角额外菜单
    • 登录用户可见
      • 全局筛选器(全部题目\未通过\喜爱\计划中)
    • 管理员可见
      • 题目操作菜单
        • 添加题目功能(支持匿名和不同类型题目)
  • 左侧题库列表
    • 可嵌套多题库支持

题目详情页

  • 描述分页

    • 题目编号、名称
    • 题目描述(Markdown解析)
    • 右侧信息边栏
      • 所属题库
      • 题目类型
      • 提供者
      • 时间限制与空间限制
      • 难度等级
      • 来源标签
      • 算法标签
    • 右侧细节边栏(登录用户可见)
      • 个人历史最高分
      • 个人本题尝试次数
      • 本题目全局提交数\通过数
      • 本题目全局通过率
  • 提交分页(登录用户可见)

    • 编程语言选择(支持多种语言)
    • 代码编辑(含对应语言高亮支持,限JetBrains风格)与提交
    • 代码文件上传
    • 个人本题目历史提交时间线(含最近7次提交的得分、结果、时间以及测评详情页链接)
  • 管理分页(管理员额外可见)

    • 题目描述编辑器(Markdown编辑器)
    • 可预览的Markdown编辑,支持单页预览和编辑同时预览
    • 修改后可选保存或不保存重置
    • 右侧信息边栏
      • 题目名称、所属题库编辑
      • 时间限制与空间限制编辑
      • 可见性与题目难度评级调整
      • 动态增删来源与算法标签
    • 右侧数据边栏
      • 数据文件列表与大小显示
      • 支持上传单个文件、上传压缩包并自动解析数据文件
      • 支持选定文件的删除
    • 右侧重测边栏
      • 支持按选定评测状态筛选,并提供便捷的集合化选项
      • 支持按时间区间筛选
      • 支持按用户筛选
      • 支持查询指定条件下的评测记录数量
      • 支持一件重测指定条件下的所有评测记录

测评列表页

  • 基本信息分页
    • 游客可见
      • 评测ID(超链接,点击可进入详情界面)
      • 评测提交者
      • 评测时间
      • 题目编号与名称(超链接,点击可进入题目页面)
      • 评测结果(支持多种评测结果;超链接,点击可进入详情界面)
      • 分数(支持自定义评分细则;超链接,点击可进入详情界面)
      • 提交所用编程语言
      • 部分测评信息(最大所耗时间、最大内存占用、代码长度)
    • 管理员可见
      • 评测时间戳
      • 单条重测功能
      • 单条记录删除功能
  • 个人提交分页(登录用户可见)
    • 本用户的提交记录列表

测评详情页

  • 评测结果分页
    • 编译结果与信息
    • 各测试点单点测评结果、时间与内存占用
      • 展开可见测评信息
    • 右侧信息边栏
      • 提交时间
      • 测评题目(含超链接,可点击跳转到题目详情页)
      • 提交用户名
      • 评测结果
      • 得分
    • 右侧本人历史提交边栏(同上)
  • 源代码分页(仅提交者本人和管理员可见)
    • 提交源代码
    • 右侧信息边栏
      • 提交编程语言
      • 部分测评信息(最大所耗时间、最大内存占用、代码长度)
    • 右侧本人历史提交边栏(同上)

课程列表页

  • 课程列表分页
    • 右侧学期筛选器
    • 课程卡片(包含课程标识、课程名称、学期、编号、当前成员数量、简要描述等信息,点击可进入课程详情页)
  • 个人课程分页(登录用户可见)
    • 本人加入的课程展示

课程详情页

  • 课程信息页头
    • 教师姓名、QQ\微信群组号码、助教\学生助理列表
    • 简要课程描述
    • 当前成员数
    • 当前管理员数
    • 申请加入\旁听课程按钮(如用户已在课程内,则为提问\退出课程按钮,如用户为课程内部管理员,则为提问\管理按钮)
  • 公告板分页
    • 课程公告,课程内部管理员可编辑
    • 支持添加和修改公告
    • 支持置顶和取消置顶公告
    • 公告支持MarkDown解析
  • 作业分页(仅课程成员可见)
    • 单个作业标签
      • 作业状态(隐藏(仅课程管理员可见)\未开始\进行中\打折中\已结束)
      • 作业描述(支持Markdown解析)
      • 作业要求(起止日期、评分细则等,支持Markdown解析)
      • 题目列表(含每题得分与总评得分百分比)
      • 修改按钮(课程管理员可见)
    • 右侧成绩边栏
      • 展示本人在课程内的成绩
  • 内部题目分页(TODO)
  • 管理分页(TODO)

登录页

  • 忘记密码与邮箱验证找回功能
  • 自主验证码生成

注册页

  • 邮箱验证功能

测评部分

JCoder的测评端主要由三部分组成:Outter_Judger,Inner_Judger与Config。其中Outter_Judger负责与后端与数据库交互。由于多线程的使用,Outter_Judger也可以作为测评集群的管理端,负责统计与任务分发。

JCoder测评端从设计之初便有着全功能,分布式的设计思路。后端可以与多个不同的测评机建立连接构成分布式测评系统。

Inner_JudgerOutter_Judger的管控,运行在我们设计好的Docker镜像中。对于Inner_Judger的设计,JCoder参考了多个开源OJ,并结合大型商业OJ:luogu的第四代测评机构建方法,设计出了兼具安全稳定与高效率的测评系统。在Docker内部,程序的运行与编译均由Inner_Judger全程托管监控。同时采用Linux权限控制指令限制了程序的内存使用,IO访问,CPU时间,REAL时间,输出大小,权限等级,网络访问......等。不仅如此,用户提交的代码在编译运行的全部过程中UID与PID均被锁定,进一步减少程序越狱的可能。此外,JCoder还通过change_root,cgroup等方式严格限制了代码权限。

为了达到教学目的,JCoder相较其他开源OJ系统额外限制了一些奇技淫巧。例如多线程优化,编译优化等。

除此之外,通过自定义配置文件,JCoder可以支持多种对比方式与评分标准。例如,您可以自定义每一个测试点的得分与限制,同时可以为不同语言提供不同的时间限制。也可以很方便地支持Special Judge

对于没有特殊需求的题目,管理员可以通过题目管理页面上传测试数据压缩文件。JCoder将自动识别其中的输入输出文件并生成对应的配置文件。对于有特殊需求的题目,您需要在上传的zip文件中包含名为config.json的配置文件,用来指定测试数据与限制。对于输入输出文件,JCoder不限制文件名,但需要保证同一组输入输出文件的文件名相同。此外,输入数据的后缀名必须为**.in**,输出数据的后缀名为**.out**,对于不匹配的数据不会被解压。

对于单个测试文件的上传和删除可能会导致某组测试数据不完整。对于此类不完整的数据(如只有输入文件,没有输出文件)在测评时会被跳过,但文件不会被删除,仅影响配置文件。

add_data

注意事项:

  • 在题目已有数据的情况下上传**.zip**文件会清空原先的数据文件并覆盖。
  • 对于指定配置文件的题目,删除单个数据或改变时间,空间限制均会导致配置文件被覆盖。
  • 为保证测评安全,您将无法在文件被使用时删除文件。

下方是配置文件的例子,其中name_list保存了数据点的文件名。如果配置文件不匹配或不合法将会导致解析失败。

{
    'testcase': 10,
    'name_list': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'],
    'info': {'testcase': 0, 'time_limit_c': [
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1
        ], 'time_limit_java': [
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1
        ], 'memory_limit': [
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1,
            1
        ]
    }
}

生成的配置文件见下文。但出于对安全性的考量,此文件与真实配置文件有所改动。

testcase = 0
name_list = []
info = {'testcase': 0, 'time_limit_c': [], 'time_limit_java': [], 'memory_limit': []}
ans = []
scores = []
score = 100
is_spj = False
spj_name = ''
spj_language = ''

对于Rejudge功能的使用,您可参照以下说明。

如果您是管理员,您可以在submission页面和题目管理页面进行重测。

submission页面重测如下图所示:

rej

使用此方法将重新测试该条记录并覆盖原先的结果。此方法不影响学生尝试次数,但会影响学生成绩题目AC率等信息。

题目管理页面重测由三部分组成,可以选择特定结果,特定时间,特定用户的提交进行重测。重测结果同样不影响学生尝试次数,但会影响学生成绩题目AC率等信息。

结果筛选器如下图所示:

pre1

管理员可以在下拉列表中选中需要重测的状态,进行测试。也可以使用多选框快速选中对应状态。注意:多选框和下拉列表属于联动关系,改变相互影响。

时间筛选器如下图所示:

pre2

管理员可以选择特定时间段进行重测。时间精确到秒。

用户筛选器如下图所示:

pre3

管理员可以通过输入用户名筛选特定用户进行重测。此控件支持Excel表格粘贴,将会自动拆分去重。

需要注意的是,虽然以上三种筛选器并没有明确的优先级之分,但是测评结果筛选器为必填,时间与用户筛选器为选填。默认为所有时间与所有用户。对于不存在的用户,虽然能填入用户筛选器,但会在后端被忽略。

课程部分

JCoder允许管理员创建课程以适应教学用途。现阶段,您可以在课程中发布通知布置作业。在后期的开发过程中JCoder会参考SakaiBlackboard系统,引入完整的文件服务与课程管理平台。

cour

课程内部权限控制与外部稍有不同。权限暂时分为两类:课程管理员课程学生课程管理员在课程内部具有类似全站管理员的权限,可以添加题目创建,管理作业查看统计结果等。考虑到安全性与教学需要,目前JCoder只允许全站管理员查看代码。

JCoder课程内部页面如下图所示:

a_

JCoder的课程通知页面如图所示。通知主要分为标题内容两部分。其中内容部分支持完整的MarkDown语法。

使用通知功能时需要注意以下几点:

  • 课程管理员全站管理员均可在课程内部发布,管理公告。

cour_admin

  • 公告发布后,管理员可通过管理按钮随时更改公告的内容标题是否置顶等特性,也可随时删除公告。

ann_min

chan_ann

  • JCoder的公告按照发布时间倒序排布,置顶公告优先。

cour_info

JCoder的课程详细界面,顶部信息栏将显示显示课程相关信息。

下方Homework选项卡页面中会显示当前课程的作业信息

JCoder的作业信息由编号名称介绍要求题目列表等部分组成。其中介绍要求部分同样支持Markdown语法。

不同于大部分开源OJ,JCoder有四种作业状态:未开始进行中延期结束。会在作业的右上角标注。

  • 当作业处于未开始状态时,此次作业只有管理员可见,非管理员的提交强行查看均被禁止。
  • 当作业处于进行中状态时,如果此次作业被标记为可见,则非管理员用户可以查看提交题目。请注意,作业可见性的优先级大于!!!作业状态!
  • 当作业处于延期状态时,权限与进行中一致,但会在成绩统计界面进行标注,提供不同的成绩统计方式。
  • 当作业处于结束状态时,非管理员用户的提交被禁止,但仍然可以查看题目。

JCoder允许管理员在课程内创建题目,课程内题目不会在主题库中显示。对于课程内题目,JCoder提供三种不同的创建方式:复制新建链接

  • 如果采用复制方式添加题目,管理员可以选择一道可见的主题库题目添加进课程。此操作会同时复制题目数据。对于采用此种方式创建的题目,课程内管理员拥有该题的完全修改权限。如更改题面更改数据等。

copy

  • 如果采用新建方式添加题目,JCoder将会新增一道空白题目。与复制类似,课程内管理员拥有该题的完全修改权限

creat

  • 如果采用链接方式添加题目,管理员可以选择一道可见的主题库题目添加进课程。此操作不会复制题目数据,但会继承AC率提交次数等信息。对于采用此种方式创建的题目,课程内管理员没有该题的修改权限。该题被从外部删除的同时也将从课程内消失。 reference

prob_inc

JCoder会为管理员提供课程与作业的统计信息。在目前的设计思路下,管理员可以通过提交时间提交次数分段统计成绩,并支持导出。

为了使课程管理更为完善,JCoder在课程内新增了Group进行再次分类。(注意:此页面只有全站管理员课程管理员可见)

members

管理员可以:

  • 新增

cgroup

  • 删除修改
  • 更改所属Group(可通过用户名与**唯一识别凭证(如StudentID)**更改)

gtrans

  • 单独操作,权限控制

single_change

  • 批量增删用户

add_cp

以上所有批量功能均支持Excel直接粘贴,且会自动拆分去重

题目管理

JCoder提供完善的题目管理功能,管理页面如下:

man_prob

左侧为题面编辑区,管理员可以使用MarkDown语法编辑题面并提供实时预览

右侧为题目设置数据管理重测分区。管理员可以随时更改题目名称,时间限制。也可以动态添加标签,改变题目可见性,添加数据等

需要注意的是,以上所有操作在保存后会立即生效

对于添加题目,操作方式如下:

add_p

管理员需要指定Problem ID,题目名称,题目类型是否匿名。其中除题目名称外,其他信息一经确定无法更改。

点击确定后,JCoder将采用默认配置新建一道不可见题目供管理员后续修改。

讨论部分

JCoderDev_Beta_1.2.1版本开始支持讨论功能。

Jcoder的讨论分为3部分,分别位于:课程,题目,比赛板块。并支持评论,匿名与多层回复等功能。

具体内容与形式详见下方图片。

dis

可见,讨论由以下两部分组成:讨论,评论。两者具有不同的展示形式。区别如下:

  • 讨论支持富文本解析,可以较为方便地使用Markdown语法进行编辑。
  • 评论不支持富文本解析,有一定的字数限制。

相同点如下:

  • 两者都支持嵌套回复
  • 两者都可以匿名
  • 两者都可以删除
  • 两者一经发布不允许修改

为了便于监管,JCoder对于发表讨论与评论有一定权限要求:

  • 对于题目讨论
    • 当题目可见且属于主题库所有人都可以发表。
    • 当题目属于课程时,仅课程内人员可以发表。
  • 对于课程讨论
    • 只有课程内人员可以发表。
  • 对于比赛讨论
    • 只有参与人员可以发表。
  • JCoder全站管理员可以在任何地点发表,删除讨论与评论。为了方便监管,全站管理员不受匿名与删除影响
  • 用户可以删除本人的讨论与评论
  • 对于匿名发布的讨论与评论,用户名会使用匿名替代,且头像与URL均为特殊值或为空。
  • 删除讨论后,所有评论会被删除。
  • 删除评论后,评论内容会被已删除覆盖。

开发愿景

JCoder是一个正在不断开发迭代的Online Judge与课程管理平台。将来,我们希望JCoder成为一个不仅涵盖计算机科学而且涵盖数学,物理和许多其他领域的在线教学系统,并最终成为一个完整的在线教学终端。

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published