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一样,支持导入和导出。
官网有对这个的详细介绍:
同时支持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的题目,具体操作可以看官方文档:
本文用不到,暂时不做介绍。
(4)导出题目
我们勾选要导出的题目,选择”导出题目“
然后导出的题目如下:
可以看出,题目导出的格式和导入不一样。
3.批量导入用户
有些情况下,我们需要批量导入用户,按照官网是说法,需要遵循以下规则:
用户数据导入仅支持csv格式的用户数据。
共七列数据:用户名和密码不能为空,邮箱、真实姓名、性别、昵称和学校可选填,否则该行数据可能导入失败。
第一行不必写(“用户名”,“密码”,“邮箱”,"真实姓名",“性别”,“昵称”,“学校”)这7个列名
性别为男请使用“male”或“0”,女请使用“female”或“1”,不填默认为“secrecy”。
请导入保存为UTF-8编码的文件,否则中文可能会乱码。
比较懒的用户可以直接下载我做好的模板,
https://box356.lanzouq.com/iYt6P06az40b
如果不会保存成UTF-8格式,可以txt打开CSV文件,然后另存为UTF-8格式。