0.前言

前面的文章简单介绍了HOJ的搭建和更换端口的操作,这篇文章介绍下关于HOJ题目生成、导入、导出题目,批量导入用户的操作。

你也可以直接看 官方的操作文档:HOJ (hdoi.cn)

1.手动生成题目

我们登陆OJ系统后,右上角登陆,账号密码如果你没改过的话用默认的

root
hoj123456

然后来到后台界面

可以看到,这个后台界面和青岛OJ很类似,应该是用的同一个前端模板吧。

我们来到题目管理下面的创建题目,填写题目ID、标题、描述、输入描述、输出描述、样例输入、样例输出后,着重是测试样例的操作。我们创建一道题目,假设是A+B Problem问题,它的测试样例是xxx.in 和 xxx.out

这个地方需要上传的是xxx.zip 格式的测试样例,xxx一般是题目编号。

比如下面这样,我们制作了两组测试用例,然后放到101这个文件夹中。

注意:这个地方不能把外层文件夹打包,后台无法识别出文件夹里面嵌套文件夹,服务端会报错:

java.lang.RuntimeException: The test cases of problem must not be empty!

我们直接全部选中这些测试样例,然后右击添加压缩文件后压缩成zip文件。

然后,我们在测评数据这里选择“选择文件”,把刚才的压缩的zip文件上传上去,然后点击最后的保存。出现下面这种情况才表示正常加入样例。

当然,我们也可以使用手动输入的测试样例

输入完毕后就点击”保存”,

然后就可以在”题目“中看到刚才创建的题目了

2.导入/导出题目

HOJ和青岛OJ一样,支持导入和导出。

官网有对这个的详细介绍:

题目管理 | HOJ (hdoi.cn)

同时支持FPS格式和QDUOJ导入题目

(1)批量导入题目

提供一个一本通题目的下载链接:

https://box356.lanzouq.com/ia33r069qkgd

下载后解压,我们假设先把1-100.zip批量导入到OJ中。

我们选择导入题目,

上传完毕后,点击旁边的”上传“按钮。然后就可以看到刚才上传的题目。

(2)创建的题目的格式

如果你要用这个批量导入的题目并且是自己创建的题目,我们可以按照官方给定的格式创建题目。

选择需要导入的题目数据zip压缩包,注意不要多一层文件夹进行压缩请保证题目json文件的名字与其对应的存放评测数据的文件夹名字一致,具体文件格式如下:

+-- problem_1000.json
+-- problem_1000
|   +-- 1.in
|   +-- 1.out
|   +-- ....
+-- problem_1001.json
+-- problem_1001
|   +-- 1.in
|   +-- 1.out
|   +-- ....

题目的json格式,请严格按照以下格式,才可以正常导入。

{
  "judgeMode":"default", // 普通判题:default, 特殊判题:spj, 交互判题:interactive
  // 题目支持的语言如下,可多可少
  "languages": ["C", "C++", "Java", "Python3", "Python2",  "Golang", "C#"], 
  "samples": [
      {
          "input": "1.in", 
          "output": "1.out",
          //"score": 10  // 如果是oi题目需要给测试点加得分
      },
      {
          "input": "2.in", 
          "output": "2.out",
          //"score": 10  // 如果是oi题目需要给测试点加得分
      }
  ], 
  "tags": ["测试题","测试"], // 题目标签,一般不超过三个 
  "problem": {
      "auth": 1, // 1 公开赛
      "author": "admin", // 题目上传的作者,请使用用户名
      "isRemote": false, // 均为非VJ题目,不用修改
      "problemId": "HOJ-1010", // 题目的展示id
      "description": "", // 题目的描述,支持markdown语法
      "source": "", // 题目来源
      "title": "", // 题目标题
      "type": 0,  // 0为ACM题目,1为OI题目
      "timeLimit": 1000, // 时间限制 单位是ms
      "memoryLimit": 256, // 空间限制 单位是mb
      "input": "", // 题目的输入描述
      "output": "", // 题目的输出描述
      "difficulty": 0, // 题目难度,1为简单,2为中等,3为困难
      "examples": "", // 题目的题面样例,格式为<input>输入</input><output>输出</output><input>输入</input><output>输出</output>
      "ioScore": 100, // OI题目总得分,与测试点总分一致
      "codeShare": true, // 该题目是否允许用户共享其提交的代码 
      "hint": "", // 题目提示
      "isRemoveEndBlank": true, // 评测数据的输出是否自动去掉行末空格
      "openCaseResult": true,  // 是否允许用户看到各个评测点的结果
       // "spjLanguage:"C" // 特殊判题的程序代码语言
      // "spjCode":"" // 特殊判题的代码
  }, 
  "codeTemplates": [
      {
          "code": "", // 模板代码
          "language": "C" // 模板代码语言
      }, 
      {
          "code": "", // 模板代码
          "language": "C++"// 模板代码语言
      }
   ],
    // 用户程序的额外库文件 key:文件名,value:文件内容,如果没有请去掉
   "userExtraFile":{
       "testlib.h":"code",
       "stdio.h":"..."
   },
    // 特殊或交互程序的额外库文件 key:文件名,value:文件内容,如果没有请去掉
    "judgeExtraFile":{
        "testlib.h":"code",
        "stdio.h":"..."
    }
}

(3)导入其他OJ的题目

HOJ支持添加其他OJ的题目,具体操作可以看官方文档:

题目管理 | HOJ (hdoi.cn)

本文用不到,暂时不做介绍。

(4)导出题目

我们勾选要导出的题目,选择”导出题目“

然后导出的题目如下:

可以看出,题目导出的格式和导入不一样。

3.批量导入用户

有些情况下,我们需要批量导入用户,按照官网是说法,需要遵循以下规则:

用户数据导入仅支持csv格式的用户数据。
共七列数据:用户名和密码不能为空,邮箱、真实姓名、性别、昵称和学校可选填,否则该行数据可能导入失败。
第一行不必写(“用户名”,“密码”,“邮箱”,"真实姓名",“性别”,“昵称”,“学校”)这7个列名
性别为男请使用“male”或“0”,女请使用“female”或“1”,不填默认为“secrecy”。
请导入保存为UTF-8编码的文件,否则中文可能会乱码。

比较懒的用户可以直接下载我做好的模板,

https://box356.lanzouq.com/iYt6P06az40b

如果不会保存成UTF-8格式,可以txt打开CSV文件,然后另存为UTF-8格式。