Skip to content

Commit

Permalink
add: support Libre OJ
Browse files Browse the repository at this point in the history
  • Loading branch information
HimitZH committed Mar 12, 2024
1 parent dd13353 commit 8ab6ba9
Show file tree
Hide file tree
Showing 14 changed files with 138 additions and 93 deletions.
2 changes: 1 addition & 1 deletion README-EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

- One click deployment based on **Docker** and **Docke-compose**
- Multi-language support:**C、C++、C#、Python、PyPy、Go、Java、JavaScript、PHP、Ruby、Rust**
- Remote judge support: **HDU、POJ、Codeforces、GYM、AtCoder、SPOJ**
- Remote judge support: **HDU、POJ、Codeforces、GYM、AtCoder、SPOJ、LIBRE**
- Perfect evaluation mode:**General 、Special、Interactive 、Self-test、Subtask、File IO**
- Perfect contest function:**Star team、 Attention team、 External Rank、Scroll Board**
- **Support group and discussion area function**
Expand Down
89 changes: 45 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

- 基于Vue和Spring Boot、Spring Cloud Alibaba构建的前后端分离,分布式架构的评测系统
- **支持多种评测语言:C、C++、C#、Python、PyPy、Go、Java、JavaScript、PHP、Ruby、Rust**
- **支持HDU、POJ、Codeforces(包括GYM)、AtCoder、SPOJ的Remote Judge评测**
- **支持HDU、POJ、Codeforces(包括GYM)、AtCoder、SPOJ、LIBRE的Remote Judge评测**
- **支持移动端、PC端浏览,拥有讨论区与站内消息系统**
- **支持私有训练、公开训练(题单)和团队功能**
- **完善的评测功能:普通测评、特殊测评、交互测评、在线自测、子任务分组评测、文件IO**
Expand Down Expand Up @@ -50,49 +50,50 @@

## 四、上线日记

| 时间 | 内容 | 更新者 |
| ---------- | ---------------------------------------- | ----------- |
| 2020-10-26 | 正式开发 | Himit_ZH |
| 2021-04-10 | 首次上线测试 | Himit_ZH |
| 2021-04-15 | 判题调度2.0解决并发问题 | Himit_ZH |
| 2021-04-16 | 重构解耦JudgeServer判题逻辑,添加部署文档 | Himit_ZH |
| 2021-04-19 | 加入rsync实现评测数据同步,修复一些已知的BUG | Himit_ZH |
| 2021-04-24 | 加入题目模板,修改页面页脚 | Himit_ZH |
| 2021-05-02 | 修复比赛后管理员重判题目导致排行榜失效的问题 | Himit_ZH |
| 2021-05-09 | 添加公共讨论区,题目讨论区,比赛评论 | Himit_ZH |
| 2021-05-12 | 添加评论及回复删除,讨论举报,调整显示时间。 | Himit_ZH |
| 2021-05-16 | 完善权限控制,讨论管理员管理,讨论删除与编辑更新。 | Himit_ZH |
| 2021-05-22 | 更新docker-compose一键部署,修正部分bug | Himit_ZH |
| 2021-05-24 | 判题调度乐观锁改为悲观锁 | Himit_ZH |
| 2021-05-28 | 增加导入导出题目,增加用户页面的最近登录,开发正式结束,进入维护摸鱼 | Himit_ZH |
| 2021-06-02 | 大更新,完善补充前端页面,修正判题等待超时时间,修补一系列bug | Himit_ZH |
| 2021-06-07 | 修正特殊判题,增加前台i18n | Himit_ZH |
| 2021-06-08 | 添加后台i18n,路由懒加载 | Himit_ZH |
| 2021-06-12 | 完善比赛赛制,具体请看在线文档 | Himit_ZH |
| 2021-06-14 | 完善后台管理员权限控制,恢复CF的vjudge判题 | Himit_ZH |
| 2021-06-25 | 丰富前端操作,增加POJ的vjudge判题 | Himit_ZH |
| 2021-08-14 | 增加spj对使用testlib的支持 | Himit_ZH |
| 2021-09-21 | 增加比赛打印功能、账号限制功能 | Himit_ZH |
| 2021-10-05 | 增加站内消息系统——评论、回复、点赞、系统通知的消息,优化前端。 | Himit_ZH |
| 2021-10-06 | 美化比赛排行榜,增加对FPS题目导入的支持 | Himit_ZH |
| 2021-12-09 | 美化比赛排行榜,增加外榜、打星队伍、关注队伍的支持 | Himit_ZH |
| 2022-01-01 | 增加公开训练和公开训练(题单) | Himit_ZH |
| 2022-01-04 | 增加交互判题、重构judgeserver的三种判题模式(普通、特殊、交互) | Himit_ZH |
| 2022-01-29 | 重构remote judge,增加AtCoder、SPOJ的支持 | Himit_ZH |
| 2022-02-19 | 修改首页前端布局和题目列表页 | Himit_ZH |
| 2022-02-25 | 支持PyPy2、PyPy3、JavaScript V8、JavaScript Node、PHP | Himit_ZH |
| 2022-03-12 | 后端接口全部重构,赛外榜单增加缓存 | Himit_ZH |
| 2022-03-28 | 合并冷蕴提交的团队功能 | Himit_ZH、冷蕴 |
| 2022-04-01 | 正式上线团队功能 | Himit_ZH、冷蕴 |
| 2022-05-29 | 增加在线调试、个人主页提交热力图 | Himit_ZH |
| 2022-08-06 | 增加题目标签的分类管理(二级标签) | Himit_ZH |
| 2022-08-21 | 增加人工评测、取消评测 | Himit_ZH |
| 2022-08-30 | 增加OI题目的subtask、ACM题目的'遇错止评'模式 | Himit_ZH |
| 2022-10-04 | 增加比赛奖项配置,增加ACM赛制的滚榜 | Himit_ZH |
| 2022-11-14 | 增加题目详情页专注模式,优化首页布局 | Himit_ZH |
| 2023-05-01 | 增加题目评测支持文件IO | Himit_ZH |
| 2023-06-11 | 增加允许比赛结束后提交 | Himit_ZH |
| 2023-06-27 | 支持Ruby、Rust | Himit_ZH |
| 时间 | 内容 | 更新者 |
| ---------- | ---------------------------------------- | ------------- |
| 2020-10-26 | 正式开发 | Himit_ZH |
| 2021-04-10 | 首次上线测试 | Himit_ZH |
| 2021-04-15 | 判题调度2.0解决并发问题 | Himit_ZH |
| 2021-04-16 | 重构解耦JudgeServer判题逻辑,添加部署文档 | Himit_ZH |
| 2021-04-19 | 加入rsync实现评测数据同步,修复一些已知的BUG | Himit_ZH |
| 2021-04-24 | 加入题目模板,修改页面页脚 | Himit_ZH |
| 2021-05-02 | 修复比赛后管理员重判题目导致排行榜失效的问题 | Himit_ZH |
| 2021-05-09 | 添加公共讨论区,题目讨论区,比赛评论 | Himit_ZH |
| 2021-05-12 | 添加评论及回复删除,讨论举报,调整显示时间。 | Himit_ZH |
| 2021-05-16 | 完善权限控制,讨论管理员管理,讨论删除与编辑更新。 | Himit_ZH |
| 2021-05-22 | 更新docker-compose一键部署,修正部分bug | Himit_ZH |
| 2021-05-24 | 判题调度乐观锁改为悲观锁 | Himit_ZH |
| 2021-05-28 | 增加导入导出题目,增加用户页面的最近登录,开发正式结束,进入维护摸鱼 | Himit_ZH |
| 2021-06-02 | 大更新,完善补充前端页面,修正判题等待超时时间,修补一系列bug | Himit_ZH |
| 2021-06-07 | 修正特殊判题,增加前台i18n | Himit_ZH |
| 2021-06-08 | 添加后台i18n,路由懒加载 | Himit_ZH |
| 2021-06-12 | 完善比赛赛制,具体请看在线文档 | Himit_ZH |
| 2021-06-14 | 完善后台管理员权限控制,恢复CF的vjudge判题 | Himit_ZH |
| 2021-06-25 | 丰富前端操作,增加POJ的vjudge判题 | Himit_ZH |
| 2021-08-14 | 增加spj对使用testlib的支持 | Himit_ZH |
| 2021-09-21 | 增加比赛打印功能、账号限制功能 | Himit_ZH |
| 2021-10-05 | 增加站内消息系统——评论、回复、点赞、系统通知的消息,优化前端。 | Himit_ZH |
| 2021-10-06 | 美化比赛排行榜,增加对FPS题目导入的支持 | Himit_ZH |
| 2021-12-09 | 美化比赛排行榜,增加外榜、打星队伍、关注队伍的支持 | Himit_ZH |
| 2022-01-01 | 增加公开训练和公开训练(题单) | Himit_ZH |
| 2022-01-04 | 增加交互判题、重构judgeserver的三种判题模式(普通、特殊、交互) | Himit_ZH |
| 2022-01-29 | 重构remote judge,增加AtCoder、SPOJ的支持 | Himit_ZH |
| 2022-02-19 | 修改首页前端布局和题目列表页 | Himit_ZH |
| 2022-02-25 | 支持PyPy2、PyPy3、JavaScript V8、JavaScript Node、PHP | Himit_ZH |
| 2022-03-12 | 后端接口全部重构,赛外榜单增加缓存 | Himit_ZH |
| 2022-03-28 | 合并冷蕴提交的团队功能 | Himit_ZH、冷蕴 |
| 2022-04-01 | 正式上线团队功能 | Himit_ZH、冷蕴 |
| 2022-05-29 | 增加在线调试、个人主页提交热力图 | Himit_ZH |
| 2022-08-06 | 增加题目标签的分类管理(二级标签) | Himit_ZH |
| 2022-08-21 | 增加人工评测、取消评测 | Himit_ZH |
| 2022-08-30 | 增加OI题目的subtask、ACM题目的'遇错止评'模式 | Himit_ZH |
| 2022-10-04 | 增加比赛奖项配置,增加ACM赛制的滚榜 | Himit_ZH |
| 2022-11-14 | 增加题目详情页专注模式,优化首页布局 | Himit_ZH |
| 2023-05-01 | 增加题目评测支持文件IO | Himit_ZH |
| 2023-06-11 | 增加允许比赛结束后提交 | Himit_ZH |
| 2023-06-27 | 支持Ruby、Rust | Himit_ZH |
| 2024-03-13 | 支持LibreOJ的远程评测 | Himit_ZH、Nine |

## 五、部分截图

Expand Down
4 changes: 2 additions & 2 deletions docs/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ features:
details: 判题使用 cgroup 隔离用户程序,网站权限控制完善
- title: 多样化
details: 独有自身判题服务,同时支持其它知名OJ题目的提交判题
footer: MIT Licensed | Copyright © 2023.02.05 @Author Himit_ZH QQ Group:598587305、743568562
footer: MIT Licensed | Copyright © 2024.03.13 @Author Himit_ZH QQ Group:598587305、743568562
---

[![Java](https://img.shields.io/badge/Java-1.8-informational)](http://openjdk.java.net/)
Expand All @@ -34,7 +34,7 @@ footer: MIT Licensed | Copyright © 2023.02.05 @Author Himit_ZH QQ Group:598587
[![Gitee Star](https://gitee.com/himitzh0730/hoj/badge/star.svg)](https://gitee.com/himitzh0730/hoj)
[![QQ Group 598587305](https://img.shields.io/badge/QQ%20Group-598587305-blue)](https://qm.qq.com/cgi-bin/qm/qr?k=WWGBZ5gfDiBZOcpNvM8xnZTfUq7BT4Rs&jump_from=webapi)

Hcode Online Judge (HOJ) : 基于前后端分离,分布式架构的在线测评平台(hoj),前端使用vue,后端主要使用springboot,redis,mysql,nacos等技术,**支持HDU、POJ、Codeforces(包括GYM)、AtCoder、SPOJ的Remote Judge判题,同时适配手机端、电脑端浏览,拥有讨论区与站内消息系统,支持私有训练、公开训练(题单),支持团队功能,还有完善的判题模式(普通测评、特殊测评、交互测评、子任务评测、文件IO)和完善的比赛功能(打星队伍、关注队伍、外榜、滚榜)。**
Hcode Online Judge (HOJ) : 基于前后端分离,分布式架构的在线测评平台(hoj),前端使用vue,后端主要使用springboot,redis,mysql,nacos等技术,**支持HDU、POJ、Codeforces(包括GYM)、AtCoder、SPOJ、Libre的Remote Judge判题,同时适配手机端、电脑端浏览,拥有讨论区与站内消息系统,支持私有训练、公开训练(题单),支持团队功能,还有完善的判题模式(普通测评、特殊测评、交互测评、子任务评测、文件IO)和完善的比赛功能(打星队伍、关注队伍、外榜、滚榜)。**

[Github 仓库](https://github.com/HimitZH/HOJ)
[Gitee 仓库](https://gitee.com/himitzh0730/hoj)
Expand Down
2 changes: 1 addition & 1 deletion docs/docs/introducition/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ HOJ,全称 Hcode Online Judge,是基于(springcloud+vue)前后端分离
- 支持testlib的特殊评测、交互评测、子任务评测
- 支持在线自测调试

- 多样:支持自身题目数据评测,也支持其它知名OJ(HDU、Codeforces、GYM、POJ、AtCoder、SPOJ)题目的爬取与提交
- 多样:支持自身题目数据评测,也支持其它知名OJ(HDU、Codeforces、GYM、POJ、AtCoder、SPOJ、Libre)题目的爬取与提交
:::


Expand Down
3 changes: 2 additions & 1 deletion docs/docs/use/import-problem.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,14 +199,15 @@

## 三、导入其它OJ题目

导入HDU、Codeforces、POJ、GYM、AtCoder、SPOJ的题目,只需提供该题目的题号便可一键导入。
导入HDU、Codeforces、POJ、GYM、AtCoder、SPOJ、Libre的题目,只需提供该题目的题号便可一键导入。

:::tip

- HDU和POJ的题号一般是 `1000`以上的数字
- Codeforces和GYM的题号是`1000A``1000B`、这种数字加大写英文字母的格式,具体请到[https://codeforces.com](https://codeforces.com)查看
- SPOJ的题号是大写英文字母,如`TEST`,具体请到[https://www.spoj.com](https://www.spoj.com)查看
- AtCoder的题号是类似`abc110_a`这种格式,具体请到 [https://atcoder.jp](https://atcoder.jp) 查看
- Libre的题号是数字,具体请到https://loj.ac/p查看

:::

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
* @ClassName LibreProblemStrategy
Expand Down Expand Up @@ -44,10 +46,25 @@ public RemoteProblemInfo getProblemInfo(String problemId, String author) throws
param.put("statistics", Boolean.TRUE);
param.put("tagsOfLocale", "zh_CN");
param.put("judgeInfo", Boolean.TRUE);
String body = HttpRequest.post(API_HOST + PROBLEM_URL)
.body(param.toString())
.execute()
.body();
String body = null;
try {
body = HttpRequest.post(API_HOST + PROBLEM_URL)
.body(param.toString())
.timeout(5000)
.execute()
.body();
}catch (cn.hutool.core.io.IORuntimeException e){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException ignored) {
}
// 超时重试
body = HttpRequest.post(API_HOST + PROBLEM_URL)
.body(param.toString())
.timeout(5000)
.execute()
.body();
}
JSONObject parseObj = JSONUtil.parseObj(body);
if (parseObj.containsKey("error")) {
throw new IllegalArgumentException("LibreOJ: Incorrect problem id!");
Expand All @@ -68,7 +85,13 @@ public RemoteProblemInfo getProblemInfo(String problemId, String author) throws
examples.append("<output>").append(tempObj.getStr("outputData")).append("</output>");
});
Problem problem = new Problem();
problem.setProblemId(NAME + "-" + problemId+"-"+id)
String finalProblemId = null;
if (Objects.equals(problemId, id)) {
finalProblemId = NAME + "-" + problemId;
} else {
finalProblemId = NAME + "-" + problemId + "(" + id + ")";
}
problem.setProblemId(finalProblemId)
.setTitle(localizedContentsOfLocale.getStr("title"))
.setTimeLimit(Integer.parseInt(judgeInfo.getStr("timeLimit")))
.setMemoryLimit(Integer.parseInt(judgeInfo.getStr("memoryLimit")))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ atcoder-username-list:
atcoder-password-list:
spoj-username-list:
spoj-password-list:
libreoj-username-list:
libreoj-password-list:
# 是否强制用配置更新覆盖remote judge的账号
forced-update-remote-judge-account: false

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ atcoder-username-list: ${ATCODER_ACCOUNT_USERNAME_LIST:}
atcoder-password-list: ${ATCODER_ACCOUNT_PASSWORD_LIST:}
spoj-username-list: ${SPOJ_ACCOUNT_USERNAME_LIST:}
spoj-password-list: ${SPOJ_ACCOUNT_PASSWORD_LIST:}
libreoj-username-list: ${LIBREOJ_ACCOUNT_USERNAME_LIST:}
libreoj-password-list: ${LIBREOJ_ACCOUNT_USERNAME_LIST:}
# 是否强制用配置更新覆盖remote judge的账号
forced-update-remote-judge-account: ${FORCED_UPDATE_REMOTE_JUDGE_ACCOUNT:false}

Expand Down
2 changes: 1 addition & 1 deletion hoj-springboot/DataBackup/src/main/resources/banner.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@ ${AnsiColor.BRIGHT_YELLOW}
'---' `---` '---' `----'
Hcode Online Judge(HOJ) - Backend
@Author Himit_ZH
@Last Update 20240123
@Last Update 20240312
->Github<- https://www.github.com/HimitZH/HOJ
->Gitee<- https://gitee.com/himitzh0730/hoj
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,6 @@ public void judge(ToJudgeDTO toJudgeDTO) {
String[] source = toJudgeDTO.getRemoteJudgeProblem().split("-");
String remoteOj = source[0];
String remoteProblemId = source[1];
//libre oj 题目展示和实际提交id不一
if (remoteOj.compareTo(Constants.RemoteJudge.LIBRE_JUDGE.getName()) == 0) {
remoteProblemId = source[2];
}
RemoteJudgeDTO remoteJudgeDTO = RemoteJudgeDTO.builder()
.judgeId(toJudgeDTO.getJudge().getSubmitId())
.uid(toJudgeDTO.getJudge().getUid())
Expand Down Expand Up @@ -98,6 +94,13 @@ private void initProblemId(RemoteJudgeDTO remoteJudgeDTO) {
remoteJudgeDTO.setContestId(arr[0]);
remoteJudgeDTO.setProblemNum(arr[1]);
break;
case "LIBRE":
//libre oj 题目展示和实际提交id有可能不一样,例如LIBRE-6764(41180)
String realSubmitProblemId = ReUtil.get("\\d+\\((\\d+)\\)", remoteJudgeDTO.getCompleteProblemId(), 1);
if (realSubmitProblemId != null) {
remoteJudgeDTO.setCompleteProblemId(realSubmitProblemId);
}
break;
}
}

Expand Down
Loading

0 comments on commit 8ab6ba9

Please sign in to comment.