修复HOJ、POJ更新后的bug

This commit is contained in:
Himit_ZH 2021-06-25 14:00:50 +08:00
parent 8329f0d420
commit 3606ae9fe6
11 changed files with 63 additions and 32 deletions

View File

@ -11,7 +11,7 @@ module.exports = {
themeConfig: {
sidebarDepth: 5,
nav: [
{ text: 'Demo', link: 'https://www.hcode.top' },
{ text: 'Demo', link: 'https://hdoi.cn/' },
{ text: 'Gitee', link: 'https://gitee.com/himitzh0730/hoj' },
{ text: 'Github', link: 'https://github.com/HimitZH/HOJ' },
{ text: '作者首页', link: 'https://blog.csdn.net/weixin_43853097' },

View File

@ -16,5 +16,5 @@ features:
details: 判题使用 cgroup 隔离用户程序,网站权限控制完善
- title: 多样化
details: 独有自身判题服务同时支持其它知名OJ题目的提交判题
footer: MIT Licensed | Copyright © 2021.06.14 @Author Himit_ZH QQ Group:598587305
footer: MIT Licensed | Copyright © 2021.06.25 @Author Himit_ZH QQ Group:598587305
---

View File

@ -63,6 +63,8 @@
HDU_ACCOUNT_PASSWORD_LIST=
CF_ACCOUNT_USERNAME_LIST=
CF_ACCOUNT_PASSWORD_LIST=
POJ_ACCOUNT_USERNAME_LIST=
POJ_ACCOUNT_PASSWORD_LIST=
# judgeserver的配置
JUDGE_SERVER_IP=172.20.0.7
@ -70,13 +72,13 @@
JUDGE_SERVER_NAME=judger-alone
# docker network的配置
SUBNET=172.20.0.0/16
SUBNET=172.20.0.0/16
```
如果不改动,则以默认参数启动
```shell
docker-compose up -d
docker-compose up -d
```
**根据网速情况,大约十到二十分钟拉取镜像,全程无需人工干预,拉取完毕后,自动启动容器服务,大概需要一至两分钟的初始化。**
@ -84,7 +86,7 @@
等待命令执行完毕后,查看容器状态
```shell
docker ps -a
docker ps -a
```
当看到所有的容器的状态status都为`UP`或`healthy`就代表 OJ 已经启动成功。
@ -97,7 +99,7 @@
- 默认nacos管理员账号与密码root / hoj123456
- 默认不开启https开启需修改文件同时提供证书文件
- 判题并发数默认cpu核心数*2
- 默认开启vj判题需要手动修改添加账号与密码如果不添加不能vj判题
- 默认开启vj判题需要手动修改添加账号与密码如果不添加不能vj判题
- vj判题并发数默认cpu核心数*4
@ -199,6 +201,8 @@ Password: 开启SMTP服务后生成的随机授权码
HDU_ACCOUNT_PASSWORD_LIST=password1,password2
CF_ACCOUNT_USERNAME_LIST=
CF_ACCOUNT_PASSWORD_LIST=
POJ_ACCOUNT_USERNAME_LIST=
POJ_ACCOUNT_PASSWORD_LIST=
# 评测数据同步的配置
RSYNC_PASSWORD=hoj123456 # 请修改数据同步密码

View File

@ -25,7 +25,7 @@ HOJ全称 Hcode Online Judge是基于前后端分离分布式架构的
- 扩展:支持分布式判题
- 简单:高度集中网站配置
- 功能支持ACM、OI题目及比赛
- 多样支持自身题目数据评测也支持其它知名OJHDU、Codeforces题目的爬取与提交
- 多样支持自身题目数据评测也支持其它知名OJHDU、Codeforces、POJ)题目的爬取与提交
## 截图

View File

@ -39,7 +39,6 @@ public class RemoteJudgeGetResult {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
AtomicInteger count = new AtomicInteger(0);
Runnable getResultTask = new Runnable() {
@Override
@Transactional
@ -54,7 +53,6 @@ public class RemoteJudgeGetResult {
Integer time = (Integer) result.getOrDefault("time", null);
Integer memory = (Integer) result.getOrDefault("memory", null);
String CEInfo = (String) result.getOrDefault("CEInfo", null);
Judge judge = new Judge();
judge.setSubmitId(submitId)

View File

@ -60,6 +60,7 @@ public class RemoteJudgeToSubmit {
UpdateWrapper<RemoteJudgeAccount> remoteJudgeAccountUpdateWrapper = new UpdateWrapper<>();
remoteJudgeAccountUpdateWrapper.set("status", true)
.eq("oj", remoteJudge)
.eq("username", username)
.eq("password", password);
boolean isOk = remoteJudgeAccountService.update(remoteJudgeAccountUpdateWrapper);
@ -87,10 +88,10 @@ public class RemoteJudgeToSubmit {
return;
}
// 提交成功顺便更新状态为-->STATUS_PENDING 等待...
// 提交成功顺便更新状态为-->STATUS_JUDGING 判题...
judgeService.updateById(new Judge()
.setSubmitId(submitId)
.setStatus(Constants.Judge.STATUS_PENDING.getStatus())
.setStatus(Constants.Judge.STATUS_JUDGING.getStatus())
.setJudger(name)
);

View File

@ -58,7 +58,7 @@ public class HduJudge implements RemoteJudgeStrategy {
.put("usercode", userCode)
.map())
.execute();
if (response.getStatus() != 200) {
if (response.getStatus() != 200 && response.getStatus() != 302) {
log.error("进行题目提交时发生错误:提交题目失败," + HduJudge.class.getName() + ",题号:" + problemId);
return null;
}
@ -66,7 +66,6 @@ public class HduJudge implements RemoteJudgeStrategy {
request.setMethod(Method.GET);
// 获取提交的题目id
Long maxRunId = getMaxRunId(request, username, problemId);
if (maxRunId == -1L) { // 等待2s再次查询如果还是失败则表明提交失败了
TimeUnit.SECONDS.sleep(2);
maxRunId = getMaxRunId(request, username, problemId);
@ -116,7 +115,7 @@ public class HduJudge implements RemoteJudgeStrategy {
@Override
public Map<String, Object> getLoginUtils(String username, String password){
public Map<String, Object> getLoginUtils(String username, String password) {
HttpRequest request = HttpUtil.createPost(HOST + LOGIN_URL).addHeaders(headers);
HttpResponse response = request.form(MapUtil
@ -152,11 +151,11 @@ public class HduJudge implements RemoteJudgeStrategy {
}
public Long getMaxRunId(HttpRequest request, String userName, String problemId){
String url = String.format(STATUS_URL, userName, problemId);
HttpResponse response = request.setUrl(url).execute();
Matcher matcher = Pattern.compile("<td height=22px>(\\d+)").matcher(response.body());
return matcher.find() ? Long.parseLong(matcher.group(1)) : -1L;
public Long getMaxRunId(HttpRequest request, String userName, String problemId) {
String url = HOST + String.format(STATUS_URL, userName, problemId);
HttpResponse response = HttpUtil.createGet(url).addHeaders(headers).execute();
String maxRunId = ReUtil.get("<td height=22px>(\\d+)", response.body(), 1);
return maxRunId != null ? Long.parseLong(maxRunId) : -1L;
}

View File

@ -58,7 +58,7 @@ public class POJJudge implements RemoteJudgeStrategy {
.put("source", Base64.encode(userCode))
.put("encoded", 1).map())
.execute();
if (response.getStatus() != 302) {
if (response.getStatus() != 302 && response.getStatus() != 200) {
log.error("进行题目提交时发生错误:提交题目失败," + POJJudge.class.getName() + ",题号:" + problemId);
return null;
}
@ -89,11 +89,10 @@ public class POJJudge implements RemoteJudgeStrategy {
.replaceAll("<.*?>", "")
.trim();
Constants.Judge statusType = statusTypeMap.getOrDefault(statusStr, null);
Constants.Judge statusType = statusMap.get(statusStr);
if (statusType == null) {
return MapUtil.builder(new HashMap<String, Object>())
.put("status", Constants.Judge.STATUS_PENDING).build();
.put("status", Constants.Judge.STATUS_JUDGING).build();
}
// 返回的结果map
Map<String, Object> result = MapUtil.builder(new HashMap<String, Object>())
@ -107,9 +106,9 @@ public class POJJudge implements RemoteJudgeStrategy {
} else {
// 如果不是CE,获取其他信息
String executionTime = ReUtil.get("<b>Memory:</b> ([-\\d]+)", response.body(), 1);
result.put("time", Integer.parseInt(executionTime));
result.put("time", executionTime == null ? null : Integer.parseInt(executionTime));
String executionMemory = ReUtil.get("<b>Time:</b> ([-\\d]+)", response.body(), 1);
result.put("memory", Integer.parseInt(executionMemory));
result.put("memory", executionMemory == null ? null : Integer.parseInt(executionMemory));
}
return result;
}
@ -162,7 +161,7 @@ public class POJJudge implements RemoteJudgeStrategy {
// TODO 添加结果对应的状态
private static final Map<String, Constants.Judge> statusTypeMap = new HashMap<String, Constants.Judge>() {
private static final Map<String, Constants.Judge> statusMap = new HashMap<String, Constants.Judge>() {
{
put("Compiling", Constants.Judge.STATUS_COMPILING);
put("Accepted", Constants.Judge.STATUS_ACCEPTED);

View File

@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import top.hcode.hoj.remoteJudge.task.Impl.CodeForcesJudge;
import top.hcode.hoj.remoteJudge.task.Impl.HduJudge;
import top.hcode.hoj.remoteJudge.task.Impl.POJJudge;
import top.hcode.hoj.util.JsoupUtils;
import java.io.IOException;
@ -90,4 +91,33 @@ public class JudgeServerApplicationTests {
}
@Test
void test03() throws Exception {
HduJudge hduJudge = new HduJudge();
Map<String, Object> submit = hduJudge.submit("账号", "密码", "1000", "GCC", "#include<stdio.h> \\n\" +\n" +
" \"int main()\\n\" +\n" +
" \"{\\n\" +\n" +
" \"\\tint a,b,sum;\\n\" +\n" +
" \"\\twhile(scanf(\\\"%d%d\\\",&a,&b)!=EOF)\\n\" +\n" +
" \"\\t{\\n\" +\n" +
" \"\\t\\tsum=a+b;\\n\" +\n" +
" \"\\t\\tprintf(\\\"%d\\\\n\\\",sum);\\n\" +\n" +
" \"\\n\" +\n" +
" \"\\t}\\n\" +\n" +
" \"\\treturn 0;\\n\" +\n" +
" \"}");
System.out.println(submit);
}
@Test
void test04(){
POJJudge pojJudge = new POJJudge();
Map<String, Object> loginUtils = pojJudge.getLoginUtils("账号", "密码");
Map<String, Object> result = pojJudge.result(22716128L, "账号", (String) loginUtils.get("cookies"));
System.out.println(result);
}
}

View File

@ -368,7 +368,7 @@ export const m = {
Security:'Security',
Security_Desc:'The Sandbox is isolated by CGroup, and the website authority control is perfect',
Diversity:'Diversity',
Diversity_Desc:'Support codefoces, HDU remote judge',
Diversity_Desc:'Support codefoces, HDU, POJ remote judge',
Available:'Available',
Faulty:'Faulty',

View File

@ -370,7 +370,7 @@ export const m = {
Security:'安全性',
Security_Desc:'判题沙盒使用cgroup隔离网站权限控制完善',
Diversity:'多样性',
Diversity_Desc:'支持CodefocesHDU的远程判题',
Diversity_Desc:'支持CodefocesHDUPOJ的远程判题',
Available:'有效',
Faulty:'不完善',