From 535d10ab6ecf2427c3bc9a2dd910047f865b101f Mon Sep 17 00:00:00 2001 From: Himit_ZH <372347736@qq.com> Date: Wed, 3 Mar 2021 21:22:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Codeforces=E7=9A=84=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E7=88=AC=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../admin/AdminProblemController.java | 9 +- .../hoj/controller/oj/ContestController.java | 26 +++-- .../crawler/problem/CFProblemStrategy.java | 92 ++++++++++++++++ .../crawler/problem/HDUProblemStrategy.java | 10 +- .../hoj/crawler/problem/ProblemContext.java | 7 +- .../hoj/crawler/problem/ProblemStrategy.java | 15 ++- .../top/hcode/hoj/service/ProblemService.java | 5 +- .../hoj/service/impl/ProblemServiceImpl.java | 45 ++++++-- .../java/top/hcode/hoj/utils/JsoupUtils.java | 4 +- .../hcode/hoj/DataBackupApplicationTests.java | 104 ++++++++++++++++++ .../admin/AdminProblemController.class | Bin 9893 -> 10122 bytes .../hoj/controller/oj/ContestController.class | Bin 21132 -> 21253 bytes .../crawler/problem/CFProblemStrategy.class | Bin 0 -> 6281 bytes .../crawler/problem/HDUProblemStrategy.class | Bin 3881 -> 4343 bytes .../hoj/crawler/problem/ProblemContext.class | Bin 1339 -> 1423 bytes .../ProblemStrategy$RemoteProblemInfo.class | Bin 0 -> 2661 bytes .../hoj/crawler/problem/ProblemStrategy.class | Bin 479 -> 629 bytes .../hcode/hoj/service/ProblemService.class | Bin 1023 -> 1254 bytes .../hoj/service/impl/ProblemServiceImpl.class | Bin 17944 -> 19296 bytes .../top/hcode/hoj/utils/JsoupUtils.class | Bin 4340 -> 4340 bytes .../hoj/DataBackupApplicationTests.class | Bin 7038 -> 12822 bytes hoj-vue/src/App.vue | 94 +++++++++++++++- hoj-vue/src/common/constants.js | 5 +- .../src/components/oj/common/CodeMirror.vue | 11 +- .../src/views/admin/problem/ProblemList.vue | 8 +- hoj-vue/src/views/oj/problem/Problem.vue | 10 +- hoj-vue/src/views/oj/problem/ProblemList.vue | 4 +- sqlAndsetting/hoj-data.sql | 34 ++++++ sqlAndsetting/hoj.sql | 51 +++++---- 30 files changed, 460 insertions(+), 75 deletions(-) create mode 100644 hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/CFProblemStrategy.java create mode 100644 hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/CFProblemStrategy.class create mode 100644 hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/ProblemStrategy$RemoteProblemInfo.class create mode 100644 sqlAndsetting/hoj-data.sql diff --git a/README.md b/README.md index 2698f015..3c8a53d0 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,7 @@ | 2021-02-20 | 测试HDU判题整套流程完成 | Himit_ZH | | 2021-02-22 | 修改前端编辑器样式以及md格式转换 | Himit_ZH | | 2021-02-24 | 完善测试比赛相关接口,验证权限及数据计算 | Himit_ZH | +| 2021-03-03 | 增加Codeforces的题目爬取 | Himit_ZH | # 二、系统架构 diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/admin/AdminProblemController.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/admin/AdminProblemController.java index 70686fe1..c39d2309 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/admin/AdminProblemController.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/admin/AdminProblemController.java @@ -13,6 +13,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import top.hcode.hoj.common.result.CommonResult; +import top.hcode.hoj.crawler.problem.ProblemStrategy; import top.hcode.hoj.pojo.dto.ProblemDto; import top.hcode.hoj.pojo.entity.*; import top.hcode.hoj.pojo.vo.UserRolesVo; @@ -41,9 +42,6 @@ public class AdminProblemController { @Autowired private ProblemCaseServiceImpl problemCaseService; - @Autowired - private ContestProblemServiceImpl contestProblemService; - @Autowired private ToJudgeService toJudgeService; @@ -186,6 +184,7 @@ public class AdminProblemController { @GetMapping("/import-remote-oj-problem") @RequiresAuthentication @RequiresRoles(value = {"root", "admin"}, logical = Logical.OR) + @Transactional public CommonResult importRemoteOJProblem(@RequestParam("name") String name, @RequestParam("problemId") String problemId, HttpServletRequest request) { @@ -200,14 +199,14 @@ public class AdminProblemController { HttpSession session = request.getSession(); UserRolesVo userRolesVo = (UserRolesVo) session.getAttribute("userInfo"); try { - Problem otherOJProblemInfo = problemService.getOtherOJProblemInfo(name.toUpperCase(), problemId, userRolesVo.getUsername()); + ProblemStrategy.RemoteProblemInfo otherOJProblemInfo = problemService.getOtherOJProblemInfo(name.toUpperCase(), problemId, userRolesVo.getUsername()); if (otherOJProblemInfo != null) { boolean result = problemService.adminAddOtherOJProblem(otherOJProblemInfo, name); if (!result) { return CommonResult.errorResponse("导入新题目失败!请重新尝试!"); } } else { - return CommonResult.errorResponse("导入新题目失败!原因:获取该OJ的题目数据失败!"); + return CommonResult.errorResponse("导入新题目失败!原因:获取该OJ的题目数据失败!可能是链接超时!"); } } catch (Exception e) { return CommonResult.errorResponse(e.getMessage()); diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/oj/ContestController.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/oj/ContestController.java index fac9bf95..fa5687d0 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/oj/ContestController.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/controller/oj/ContestController.java @@ -253,21 +253,27 @@ public class ContestController { } //查询题目详情,题目标签,题目语言,题目做题情况 + Problem problem = problemService.getById(contestProblem.getPid()); - QueryWrapper problemTagQueryWrapper = new QueryWrapper<>(); - problemTagQueryWrapper.eq("pid", contestProblem.getPid()); - // 获取该题号对应的标签id - List tidList = new LinkedList<>(); - problemTagService.list(problemTagQueryWrapper).forEach(problemTag -> { - tidList.add(problemTag.getTid()); - }); List tagsStr = new LinkedList<>(); - if (tidList.size() != 0) { - tagService.listByIds(tidList).forEach(tag -> { - tagsStr.add(tag.getName()); + // 比赛结束后才开放标签和source + if (contest.getStatus().intValue() != Constants.Contest.STATUS_ENDED.getCode()) { + problem.setSource(null); + QueryWrapper problemTagQueryWrapper = new QueryWrapper<>(); + problemTagQueryWrapper.eq("pid", contestProblem.getPid()); + // 获取该题号对应的标签id + List tidList = new LinkedList<>(); + problemTagService.list(problemTagQueryWrapper).forEach(problemTag -> { + tidList.add(problemTag.getTid()); }); + if (tidList.size() != 0) { + tagService.listByIds(tidList).forEach(tag -> { + tagsStr.add(tag.getName()); + }); + } } + // 获取题目提交的代码支持的语言 List languagesStr = new LinkedList<>(); QueryWrapper problemLanguageQueryWrapper = new QueryWrapper<>(); diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/CFProblemStrategy.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/CFProblemStrategy.java new file mode 100644 index 00000000..b5c31fa7 --- /dev/null +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/CFProblemStrategy.java @@ -0,0 +1,92 @@ +package top.hcode.hoj.crawler.problem; + +import cn.hutool.core.util.ReUtil; +import org.jsoup.Connection; +import org.jsoup.nodes.Document; +import org.springframework.util.StringUtils; +import top.hcode.hoj.pojo.entity.Problem; +import top.hcode.hoj.pojo.entity.Tag; +import top.hcode.hoj.utils.JsoupUtils; + +import java.util.LinkedList; +import java.util.List; +import java.util.regex.Pattern; + +/** + * @Author: Himit_ZH + * @Date: 2021/3/3 15:00 + * @Description: + */ +public class CFProblemStrategy extends ProblemStrategy { + + public static final String JUDGE_NAME = "CF"; + public static final String HOST = "https://codeforces.com"; + public static final String PROBLEM_URL = "/problemset/problem/%s/%s"; + + @Override + public RemoteProblemInfo getProblemInfo(String problemId, String author) throws Exception { + + String contestId = ReUtil.get("([0-9]+)[A-Z]{1}[0-9]{0,1}", problemId, 1); + String problemNum = ReUtil.get("[0-9]+([A-Z]{1}[0-9]{0,1})", problemId, 1); + if (contestId == null || problemNum == null) { + throw new Exception("Codeforces的题号格式错误!"); + } + + String url = HOST + String.format(PROBLEM_URL, contestId, problemNum); + Connection connection = JsoupUtils.getConnectionFromUrl(url, null, null); + Document document = JsoupUtils.getDocument(connection, null); + String html = document.html(); + + + Problem info = new Problem(); + info.setProblemId(JUDGE_NAME + "-" + problemId); + + info.setTitle(ReUtil.get("
\\s*" + problemNum + "\\. ([\\s\\S]*?)
", html, 1).trim()); + + info.setTimeLimit(1000 * Integer.parseInt(ReUtil.get("([\\d\\.]+) (seconds?|s)\\s*", html, 1))); + + info.setMemoryLimit(Integer.parseInt(ReUtil.get("(\\d+) (megabytes|MB)\\s*", html, 1))); + + String tmpDesc = ReUtil.get("standard output\\s*
([\\s\\S]*?)
([\\s\\S]*?)
\\s*Input\\s*
([\\s\\S]*?)
", html, 1).replaceAll("\\$\\$\\$","\\$")); + + info.setOutput(ReUtil.get("
\\s*Output\\s*
([\\s\\S]*?)
", html, 1).replaceAll("\\$\\$\\$","\\$")); + + StringBuilder sb = new StringBuilder(""); + sb.append(ReUtil.get("
Input
([\\s\\S]*?)
", html, 1)); + sb.append(""); + sb.append(ReUtil.get("
Output
([\\s\\S]*?)
", html, 1)).append(""); + info.setExamples(sb.toString()); + + info.setHint(ReUtil.get("
\\s*Note\\s*
([\\s\\S]*?)
", html, 1).replaceAll("\\$\\$\\$","\\$")); + info.setIsRemote(true); + info.setSource(String.format("

Problem:%s

" + + "Contest:" + ReUtil.get("(]+/contest/\\d+\">.+?)", html, 1).replace("/contest", HOST + "/contest") + .replace("color: black", "color: #009688;") + "

", + contestId, problemNum, JUDGE_NAME + "-" + problemId)); + + info.setType(0) + .setAuth(1) + .setAuthor(author) + .setOpenCaseResult(false) + .setIsRemoveEndBlank(false) + .setDifficulty(1); // 默认为中等 + + List all = ReUtil.findAll(Pattern.compile("([\\s\\S]*?)"), html, 1); + + List tagList = new LinkedList<>(); + for (String tmp:all){ + tagList.add(new Tag().setName(tmp.trim())); + } + return new RemoteProblemInfo().setProblem(info).setTagList(tagList); + } + + +} \ No newline at end of file diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/HDUProblemStrategy.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/HDUProblemStrategy.java index 2eab7812..82bb8384 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/HDUProblemStrategy.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/HDUProblemStrategy.java @@ -4,6 +4,7 @@ import cn.hutool.core.util.ReUtil; import org.jsoup.Connection; import org.jsoup.helper.Validate; import org.jsoup.nodes.Document; +import org.springframework.util.Assert; import top.hcode.hoj.pojo.entity.Problem; import top.hcode.hoj.utils.JsoupUtils; @@ -24,9 +25,9 @@ public class HDUProblemStrategy extends ProblemStrategy { * @throws Exception */ @Override - public Problem getProblemInfo(String problemId, String author) throws Exception { + public RemoteProblemInfo getProblemInfo(String problemId, String author) throws Exception { // 验证题号是否符合规范 - Validate.isTrue(problemId.matches("[1-9]\\d*")); + Assert.isTrue(problemId.matches("[1-9]\\d*"),"HDU题号格式错误!"); Problem info = new Problem(); String url = HOST + String.format(PROBLEM_URL, problemId); Connection connection = JsoupUtils.getConnectionFromUrl(url, null, null); @@ -52,7 +53,8 @@ public class HDUProblemStrategy extends ProblemStrategy { .setAuthor(author) .setOpenCaseResult(false) .setIsRemoveEndBlank(false) - .setDifficulty(0); // 默认为简单 - return info; + .setDifficulty(1); // 默认为简单 + + return new RemoteProblemInfo().setProblem(info).setTagList(null); } } \ No newline at end of file diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemContext.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemContext.java index 1623b9d5..49f4bfce 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemContext.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemContext.java @@ -18,11 +18,10 @@ public class ProblemContext { } //上下文接口 - public Problem getProblemInfo(String problemId, String author) { - Problem problem; + public ProblemStrategy.RemoteProblemInfo getProblemInfo(String problemId, String author) { + try { - problem = problemStrategy.getProblemInfo(problemId, author); - return problem; + return problemStrategy.getProblemInfo(problemId, author); } catch (Exception e) { log.error("获取题目详情失败---------------->{}", e.getMessage()); } diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemStrategy.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemStrategy.java index e8c6a288..8954cfbc 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemStrategy.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/crawler/problem/ProblemStrategy.java @@ -1,8 +1,21 @@ package top.hcode.hoj.crawler.problem; +import lombok.Data; +import lombok.experimental.Accessors; import top.hcode.hoj.pojo.entity.Problem; +import top.hcode.hoj.pojo.entity.Tag; + +import java.util.List; public abstract class ProblemStrategy { - public abstract Problem getProblemInfo(String problemId,String author) throws Exception; + public abstract RemoteProblemInfo getProblemInfo(String problemId,String author) throws Exception; + + @Data + @Accessors(chain = true) + public static + class RemoteProblemInfo { + private Problem problem; + private List tagList; + } } diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/ProblemService.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/ProblemService.java index f4af491e..c8630ee6 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/ProblemService.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/ProblemService.java @@ -1,6 +1,7 @@ package top.hcode.hoj.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import top.hcode.hoj.crawler.problem.ProblemStrategy; import top.hcode.hoj.pojo.dto.ProblemDto; import top.hcode.hoj.pojo.vo.ProblemVo; import top.hcode.hoj.pojo.entity.Problem; @@ -25,7 +26,7 @@ public interface ProblemService extends IService { boolean adminAddProblem(ProblemDto problemDto); - Problem getOtherOJProblemInfo(String OJName, String problemId, String author) throws Exception; + ProblemStrategy.RemoteProblemInfo getOtherOJProblemInfo(String OJName, String problemId, String author) throws Exception; - boolean adminAddOtherOJProblem(Problem problem,String OJName); + boolean adminAddOtherOJProblem(ProblemStrategy.RemoteProblemInfo remoteProblemInfo,String OJName); } diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/impl/ProblemServiceImpl.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/impl/ProblemServiceImpl.java index 43f71825..d9e80d0d 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/impl/ProblemServiceImpl.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/service/impl/ProblemServiceImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import top.hcode.hoj.common.result.CommonResult; +import top.hcode.hoj.crawler.problem.CFProblemStrategy; import top.hcode.hoj.crawler.problem.HDUProblemStrategy; import top.hcode.hoj.crawler.problem.ProblemContext; import top.hcode.hoj.crawler.problem.ProblemStrategy; @@ -377,7 +378,7 @@ public class ProblemServiceImpl extends ServiceImpl impl } @Override - public Problem getOtherOJProblemInfo(String OJName, String problemId, String author) throws Exception { + public ProblemStrategy.RemoteProblemInfo getOtherOJProblemInfo(String OJName, String problemId, String author) throws Exception { ProblemStrategy problemStrategy; @@ -385,6 +386,9 @@ public class ProblemServiceImpl extends ServiceImpl impl case "HDU": problemStrategy = new HDUProblemStrategy(); break; + case "CF": + problemStrategy = new CFProblemStrategy(); + break; default: throw new Exception("未知的OJ的名字,暂时不支持!"); } @@ -394,7 +398,10 @@ public class ProblemServiceImpl extends ServiceImpl impl } @Override - public boolean adminAddOtherOJProblem(Problem problem, String OJName) { + @Transactional + public boolean adminAddOtherOJProblem(ProblemStrategy.RemoteProblemInfo remoteProblemInfo, String OJName) { + + Problem problem = remoteProblemInfo.getProblem(); boolean addProblemResult = problemMapper.insert(problem) == 1; // 为新的其它oj题目添加对应的language QueryWrapper languageQueryWrapper = new QueryWrapper<>(); @@ -410,16 +417,32 @@ public class ProblemServiceImpl extends ServiceImpl impl // 为新的题目初始化problem_count表 boolean initProblemCountResult = problemCountService.save(new ProblemCount().setPid(problem.getId())); - QueryWrapper tagQueryWrapper = new QueryWrapper<>(); - tagQueryWrapper.eq("name", OJName); - Tag OJNameTag = tagService.getOne(tagQueryWrapper, false); - if (OJNameTag == null) { - OJNameTag = new Tag(); - OJNameTag.setName(OJName); - tagService.saveOrUpdate(OJNameTag); + boolean addProblemTagResult = true; + List addTagList = remoteProblemInfo.getTagList(); + if (addTagList != null && addTagList.size() > 0) { + List tagList = tagService.list(); + // 已存在的tag不进行添加 + for (Tag hasTag:tagList){ + addTagList.removeIf(newTag -> newTag.getName().equals(hasTag.getName())); + } + tagService.saveOrUpdateBatch(addTagList); + List problemTagList = new LinkedList<>(); + for (Tag tmp : remoteProblemInfo.getTagList()) { + problemTagList.add(new ProblemTag().setTid(tmp.getId()).setPid(problem.getId())); + } + addProblemTagResult = problemTagService.saveOrUpdateBatch(problemTagList); + } else { + QueryWrapper tagQueryWrapper = new QueryWrapper<>(); + tagQueryWrapper.eq("name", OJName); + Tag OJNameTag = tagService.getOne(tagQueryWrapper, false); + if (OJNameTag == null) { + OJNameTag = new Tag(); + OJNameTag.setName(OJName); + tagService.saveOrUpdate(OJNameTag); + } + addProblemTagResult = problemTagService.saveOrUpdate(new ProblemTag().setTid(OJNameTag.getId()) + .setPid(problem.getId())); } - boolean addProblemTagResult = problemTagService.saveOrUpdate(new ProblemTag().setTid(OJNameTag.getId()) - .setPid(problem.getId())); return addProblemResult && addProblemTagResult && addProblemLanguageResult && initProblemCountResult; } diff --git a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/utils/JsoupUtils.java b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/utils/JsoupUtils.java index ed4dc68b..bb03a45c 100644 --- a/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/utils/JsoupUtils.java +++ b/hoj-springboot/DataBackup/src/main/java/top/hcode/hoj/utils/JsoupUtils.java @@ -36,8 +36,8 @@ public class JsoupUtils { Connection connection = Jsoup.connect(url); // 设置用户代理 connection.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"); - // 设置超时时间10秒 - connection.timeout(10000); + // 设置超时时间15秒 + connection.timeout(15000); // 设置请求头 if (headers != null) { connection.headers(headers); diff --git a/hoj-springboot/DataBackup/src/test/java/top/hcode/hoj/DataBackupApplicationTests.java b/hoj-springboot/DataBackup/src/test/java/top/hcode/hoj/DataBackupApplicationTests.java index 9ae020a7..7b06cac0 100644 --- a/hoj-springboot/DataBackup/src/test/java/top/hcode/hoj/DataBackupApplicationTests.java +++ b/hoj-springboot/DataBackup/src/test/java/top/hcode/hoj/DataBackupApplicationTests.java @@ -23,6 +23,7 @@ import org.jsoup.nodes.Document; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; import top.hcode.hoj.common.result.CommonResult; import top.hcode.hoj.dao.*; @@ -34,6 +35,7 @@ import top.hcode.hoj.pojo.vo.UserRolesVo; import top.hcode.hoj.service.UserInfoService; import top.hcode.hoj.service.UserRoleService; import top.hcode.hoj.service.impl.AnnouncementServiceImpl; +import top.hcode.hoj.service.impl.LanguageServiceImpl; import top.hcode.hoj.service.impl.UserInfoServiceImpl; import top.hcode.hoj.service.impl.UserRoleServiceImpl; import top.hcode.hoj.utils.Constants; @@ -45,6 +47,7 @@ import java.io.IOException; import java.net.*; import java.text.MessageFormat; import java.util.*; +import java.util.regex.Pattern; /** * @Author: Himit_ZH @@ -199,5 +202,106 @@ public class DataBackupApplicationTests { System.out.println(info.getOutput()); } + @Test + public void Test7() throws IOException { + String JUDGE_NAME = "CF"; + String HOST = "https://codeforces.com"; + String PROBLEM_URL = "/problemset/problem/%s/%s"; + + String problemId = "1491F"; + String contestId = ReUtil.get("([0-9]+)[A-Z]{1}[0-9]{0,1}", problemId, 1); + String problemNum = ReUtil.get("[0-9]+([A-Z]{1}[0-9]{0,1})", problemId, 1); + + + String url = HOST + String.format(PROBLEM_URL, contestId, problemNum); + Connection connection = JsoupUtils.getConnectionFromUrl(url, null, null); + Document document = JsoupUtils.getDocument(connection, null); + String html = document.html(); + Problem info = new Problem(); + info.setProblemId(JUDGE_NAME + "-" + problemId); + + info.setTitle(ReUtil.get("
\\s*" + problemNum + "\\. ([\\s\\S]*?)
", html, 1).trim()); + + info.setTimeLimit(1000 * Integer.parseInt(ReUtil.get("([\\d\\.]+) (seconds?|s)\\s*", html, 1))); + + info.setMemoryLimit(Integer.parseInt(ReUtil.get("(\\d+) (megabytes|MB)\\s*", html, 1))); + + String tmpDesc = ReUtil.get("standard output\\s*
([\\s\\S]*?)
[\\s\\S]*?)
\\s*Input\\s*
([\\s\\S]*?)
", html, 1)); + + info.setOutput(ReUtil.get("
\\s*Output\\s*
([\\s\\S]*?)
", html, 1)); + + StringBuilder sb = new StringBuilder(""); + sb.append(ReUtil.get("
Input
([\\s\\S]*?)
", html, 1)); + sb.append(""); + sb.append(ReUtil.get("
Output
([\\s\\S]*?)
", html, 1)).append(""); + info.setExamples(sb.toString()); + + info.setHint(ReUtil.get("
\\s*Note\\s*
([\\s\\S]*?)
", html, 1)); + info.setIsRemote(true); + info.setSource(String.format("

Problem:%s

" + + "Contest:" + ReUtil.get("(]+/contest/\\d+\">.+?)", html, 1).replace("/contest", HOST + "/contest") + .replace("color: black", "color: #009688;") + "

", + contestId, problemNum, JUDGE_NAME + "-" + problemId)); + + List all = ReUtil.findAll(Pattern.compile("([\\s\\S]*?)"), html, 1); + for (String tmp : all) { + System.out.println(tmp.trim()); + } + } + + + @Autowired + private LanguageServiceImpl languageService; + + @Test + public void Test8() throws IOException { + LinkedHashMap languageList = new LinkedHashMap<>(); + languageList.put("GNU GCC C11 5.1.0", "text/x-csrc"); + languageList.put("Clang++17 Diagnostics", "text/x-c++src"); + languageList.put("GNU G++11 5.1.0", "text/x-c++src"); + languageList.put("GNU G++14 6.4.0", "text/x-c++src"); + languageList.put("GNU G++17 7.3.0", "text/x-c++src"); + languageList.put("Microsoft Visual C++ 2010", "text/x-c++src"); + languageList.put("Microsoft Visual C++ 2017", "text/x-c++src"); + languageList.put("C# Mono 5.18", "text/x-csharp"); + languageList.put("D DMD32 v2.083.1", "text/x-d"); + languageList.put("Go 1.11.4", "text/x-go"); + languageList.put("Haskell GHC 8.6.3", "text/x-haskell"); + languageList.put("Java 1.8.0_162", "text/x-java"); + languageList.put("Kotlin 1.3.10", "text/x-java"); + languageList.put("OCaml 4.02.1", "text/x-ocaml"); + languageList.put("Delphi 7", "text/x-pascal"); + languageList.put("Free Pascal 3.0.2", "text/x-pascal"); + languageList.put("PascalABC.NET 3.4.2", "text/x-pascal"); + languageList.put("Perl 5.20.1", "text/x-perl"); + languageList.put("PHP 7.2.13", "text/x-php"); + languageList.put("Python 2.7.15", "text/x-python"); + languageList.put("Python 3.7.2", "text/x-python"); + languageList.put("PyPy 2.7 (6.0.0)", "text/x-python"); + languageList.put("PyPy 3.5 (6.0.0)", "text/x-python"); + languageList.put("Ruby 2.0.0p645", "text/x-ruby"); + languageList.put("Rust 1.31.1", "text/x-rustsrc"); + languageList.put("Scala 2.12.8", "text/x-scala"); + languageList.put("JavaScript V8 4.8.0", "text/javascript"); + languageList.put("Node.js 9.4.0", "text/javascript"); + + List languageList1 = new LinkedList<>(); + for (String key : languageList.keySet()) { + String tmp = languageList.get(key); + languageList1.add(new Language().setName(key).setDescription(key).setOj("CF").setIsSpj(false).setContentType(tmp)); + + } + boolean b = languageService.saveOrUpdateBatch(languageList1); + System.out.println(b); + } + } \ No newline at end of file diff --git a/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/controller/admin/AdminProblemController.class b/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/controller/admin/AdminProblemController.class index 455b38548f063bdfb60c86e169dc5c5b27524f0f..fdbdafbc5752e80033e7bbf3b7b73be2d81ded60 100644 GIT binary patch delta 3425 zcmbtV33yc189o0@lK1lFg)9&-BtSw)3K5vHG*)5-0uh5C2}{_QA(?E3OqiJj;x-M| zstCmLs!*^MXt9;HAVvtH;@YZ!6xXhHB}1^SwzaFWcik?4 zztHhZ9luJ%Ed1KQZ}652zs2u#{NBJH@JAhgQiCTnbm<7|IGM=NZZ&mEjfdXW@n;=> zG4NNsW1t`2HSjn5UG4i1HUFNDf2#UlI{vNWKg#022L6Zlb$p=4PwP0Ns$g6T^z(CPDA1(UXuh}G+lI_Dv5>|;!=gFicpd+y_9LP>ZPbws!P(OwfO@ z{J!N4-W9XF{+7B*ufRPm=xcIYx5%-M`yCa|q+xWlZCs$qq@ej1?5ITV(C;l^pt#6l!vXDPNW=1@XbU zV1w6`aZ+T;Rq_=+=hYD9)vIRVL=3LX)da87~tw8D`2vDJI|WmNnr`+rsxg z9A3X$lS!sbmJ$wkZ|Ll5zb|~}JzZ-bFy$JVBFIs0wq0SpWL#z~O3qKZ7LBHq%2ZRX zlWA6aa{hqnCf3UJrp%Bsdf$|CDKllJLN-fgTdyXMan6wnOHavl&6RnY%r|9$6kCNU z6Pyb<-kNen)^Jl63Eh?u2zr9e0Tc7FK$FF$ERm(w(Ud@_RF-MtF=e^hx>DwuQYB?{ zaaa2q(l~KoefMooo;Yyu1rqoIugEqpHdbMpq_nw`nc5FVmb$3_iBjL`+yR1X0Ss6E&(jY4YdUL?*SIW`E zZAzo~toKs$lbRH=mBPIO614Ku+_K23NSi#St9=i#g*WdxWgQA{*x9}R_VA|t1S#m< zgNE|(HU;Z^^lY<~S^LtCmT1x<7$0;0XH#NFTkk=dv|8KyPZ{;8Wo&)WKdZQ6=;zG_ zt0;5uIKhZdMFly$5NGphjk9VpOXs*CSjul%03IZ=!MtHvMFTf$VI5!43E9hr174O1 z_Fx{W*)}5vs6j1zf;!a0i7G22>#2~ky&B0Z#~~F($i-DC#CZNDU<$9W>rqT3lX&1{ ztV9W#aSd+Awb+R3@EuIUgS1d*%!H0L-1P=DAfEl*(bH6G1sZJxyWwNYVb3;U39So5 zSj}x4_*85}R&?=rn)wkRg&<7}I2YNtnHv|{_RTSSH5RdNq5Ue_kAP;zx#G{lqtRAF z>pAk*G~B4+Ci{Og$L)VB&^v^=Tr-qVZXv{F3n2mAiV(-XN}%jJ0%!{mz-?Z9jl{ps znNd!f-l3)gq;}^5+||?fUC?j(sJ|9>6SNB0YOZv$&MtTqDb}2UId%-vI17R?F%KzB z|9;F|<=5R8=1;st4_W7}^0*w28F17xzWcQk$pIM`Bnv zse^3SUlJ>1%%!ky#<%D*<>|LsD=n5=qjH8?`PmWd`9uxMOQ*atsOLPiU>LnP8aGn= zH&OF9Q{T7Re8xuB$M}?E3$_xij#68q4z3<<$HB?9={CnWTed3aB33O?*2!?pJcH3x zB;#}%={@}K|3v&%Y&4bY-)2LYd^SxhFK3kfV8h)T*$wM)f_FNFVE|pQ2PAERdN~G4-+!C8&f8Ji|s&ruw zDL#x$?Bx^iD22Jtrl;VlxP3%#EFbhA)4vLC92}YPF_=AK+It?pa)k=cuOVsiqe&120lZhtY&1OrN7@!^@1|F*^J>_4W#r;01bo`q({w6YO delta 3054 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 literal 0 HcmV?d00001 diff --git a/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/HDUProblemStrategy.class b/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/HDUProblemStrategy.class index bf37095c2ceb1e7bef80929b41a9af13ab0936d9..fb60593ad266730736a0d796033b10222553f550 100644 GIT binary patch delta 1665 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 delta 414 zcmZvY$xZ@66h&`!fdx$m4WbMRD2M}t<$%bbD^^CLZcU6ygB`JhG%+2ciHV=!qV+#; z2#K2b0j~T2zs2~#t*J%bdgtD%_v+5~u9iQ4-aY^nu&u&}c`v+JP_c+5fz05L^&qFh zg}e{TkOC_zR+Z?$>^2OB0FC(o4ma(I%nOukt`EMK?^Rq+a0f;r zu0F&oJRGb?cF=cdG&sjN>B(U%3>6WoMyaM$NdE$RFhq<1 diff --git a/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/ProblemStrategy$RemoteProblemInfo.class b/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/ProblemStrategy$RemoteProblemInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..aa1b751e3068a515f981ec32939405a7aebd2169 GIT binary patch literal 2661 zcmb_eQBxaL6#j0qo86=fg%l`J)M}}Q1e(^OwFyvLN-Z^^NU&OcaS7XGF(fhB=U0GyVpDhL6_z-Q7(H8`Re65biyD?z!iD=R4N}Z6eW#wWYL4yfW!62T9PJ&moVQz!z({__{L;*{9lM&58XiWA zcDZIc?WQGgF>t)_FYY(Za&C$DBMWxTc9sOf$r)l(mWf5+WZte>Ywg`FtGQ_st3W(o zFPYW5X496>zEW{2c1vJ%!`iJomXCO~cE2uQtk!B)bGd4^S{6;N1)!9g=2um#nenOU zW?OWcrel@&rUyI{YOHKIehh(g$(ex5{+p)ffhS^p(Kf4Wp>aQc)vT2>ceZw{l9QYH zL_o0H;vN(IM*?cysaQ?6qU_RXztaSUT=n6zcifvX|M>8^=$NI?3ueRZc@Doj!+OcA ztw>-3dc|y2ys_a7tupTV#%f`Oz$izWR;yj*=<0_7_355--Kn$X?OIu2tlNfe5}sBz zeX-tdmaLn$9Ktcb{kvmwUN*CV1YR(33S$PwF`?ljfvZQ~E6?0&2Cm?|f!A=>z?_t( zan3*%1a#URpgxe-+jezZ@|+5y8yMoGUxY;iALE`}Sijip8J~|uayDb&8m{wIcNoU2 zwZPmnB}MMdM#HLY^J0JJ_{{n*g26nP;t~69r}cH1=fclBhgbRfkMpY{#6MQSl~@Rn zD_5RGlroFN^+jqj+y!?v^#I~K*JO%o#8nRCCCY|pfS2hUlvxO_M=yVm(6@oh@nbKu zc0?Au91dPSb3<$B``rFn)nGwNirkzoK=~SK_#pi=l)`MP z1J!+`5Luh$l2zt@#fgOS2&4Nj<`PN=TGv9)sx;BFk%TI3B99Q?$528|M7l=G0b>p3 zaLdEcBcs9=xIl#CDB>b39O8K0z?;;CNzM{3QQ{8`p3GBHQD81_QHtPg`agrHrvHgy z4VNFwaes#&T|CC5Cr0@tE~nRL;0kwH3RR{q;f4NzVzmcPB`66`$bt9W{LXtSZ)Znx z3(BHP*VIU^LbCLc^ggt?4x*n)y`EL%K|=9QbV(tPrjDm(-t+3m4&yQwu*jGy6JDYe z;;*I)xXS-9N8mKxrKGqt+=lXm3WYQX!PFtd6B->phooX0YS*A^qa0PyjPdx+@iX0E zOgWv&9}&Cv04L%`2SYO94u<0=Jz1CX2;~k&kMDnPfRlb+AuPMh-(c~;jAV&!;T1&x E2Kl&43IG5A literal 0 HcmV?d00001 diff --git a/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/ProblemStrategy.class b/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/crawler/problem/ProblemStrategy.class index 9b2432d0c6b3fbbd61c470ef92ca70d07f9c9f97..6614668ebbda1942cbb5b03b50afe041d46b6055 100644 GIT binary patch delta 236 zcmcc5{FTM})W2Q(7#J8#7$mtEm>ERa8ARC`#Ml|c85snFQgic5QUi+elX6mXJ@eA? z85wvy^YT)QoO2S3i&Kjyigq%lPn>T$FJKpq1F7Xvqto;fiy1z o0}CSq9|J#7L;xtm0;B~Qm>7hBY$gU_pe~ReMxZzo11ke30PTh_IRF3v delta 180 zcmey$a-UiB)W2Q(7#J8#7(}@km>C4w8HCswgeO{eGI~xtYN}F@pOvqlnpcupQmG$M zl%JH7nrqF-z~x$zoLW$lnV(n8&LA?`hEa`;g@KikL3iRC-N{oKMJK;uR1O1*FfcN( z0nOG2(u_cwRcku~<3=EZiGdwRvOxqHIDl*(D4Uaki-CcKk%1d5!V8pP0m|?JF+W(J F0072<9j*WX diff --git a/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/service/ProblemService.class b/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/service/ProblemService.class index d41f22895291e199467179aa9aba8c7e13a61e7e..3a8d54bf8c1c89bd86c1280ff73b86abde68083c 100644 GIT binary patch delta 408 zcmey*{)|)j)W2Q(7#J8#806R)#Mv1n*cl`@3h!XlVrP(MWDpEW&CM@K4JgV_%1O=j z%uCB>WZ?14%S$bC&PgmTPAz6+sMMJJkWppg1MbQH7{#5EixSIoQj7EpAUgD+I)h7! z5=&CkD^)Pevu0%Aa;->CEhx#%&nsqUkeO`BB<&QY;Zu@dpr4VPpOUJdk)Necvbmcp zn8X=f*%@RR8SE)EYH~lbm;ob$E=k5rUdn82&dX0p(j?7%1jlHYurNsLj9kwG{su`E$PCowNw oAFh0I4U4fl4+A3uFVH>~Ak7D~gr7kG$YWw)1CxRbLSR}L00)R5b^rhX diff --git a/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/service/impl/ProblemServiceImpl.class b/hoj-springboot/DataBackup/target/classes/top/hcode/hoj/service/impl/ProblemServiceImpl.class index 5a256ca233be628a57190290a1973c082ae48d73..a0188757e3a4860ea91fbfe992551090ceb740aa 100644 GIT binary patch delta 6906 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 HWdHvGJZGdF delta 5871 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 delta 2056 zcmZ`)30PEB6#mc5F!#-y2bc(=CJKcM3P_TDq~)h(DwdVxQYvXMsi8d&wk>c{> z1T#=L$>gfyj8tiaQwsY@UEybe*>!AQV07v5qQVk|U+i4pdb^*0n0p`w*}MJ61Nha# zZ}?r|4-0?dv_P6#_zQn4oUw2g=M<_fDuq~#xGYdiMwXc37o^!URh*rp;_F&sVUUtYOQPtFzUXK7jNFzf(U#PaODw4? zF@pGlA!S3-3j?L;IYoIR0;LxcP&j2tJ&Cm>PU_noq8fW7USjM)QSph=K)iz33!Xjb zp4llszc^4*Vo5`ZwdY5TPmo4(sU?lYt0cjaCQMZlB}vI;7RtqIr$t}eN-nn~S(*v_ zCB=EyB&DUL^CyUKPAo*aCC#OUB`qbzUJ%{JBdxeO9G%frT1$$OR8~{cEJ>F(mSpG( zU7; z-3_?0maZ3Ws-?Rbx75%DLqU2Yr-m}5W0z~`*sfZ-{lrnEv97=k-_66Dd_gKF2i(P-i=J7;2@oj~R}w7%4^i3>vj7pi^AU9< z?MD$uv&u?vRE1QX?^O}61f#FLkKbM?<2Pk@|T`AS%JEz4Ir-IpR1n>k&EM&FISgdC=`Y9XsfX{DRc3BGFbbvZql zp&Kw0XY?}uEaDYrDa=Se4VSB@!t83=hnh8m_u6N+O5)}*>OI7pb5ZB)P?hY;mPed2 zbw(XpZX*57OlAwiZe`)Np&ehjj@ZFZ$xigbE{@=CCbx$j*~=pC;~To4kK+N}9(2kx z&>7fW;jG>Cp6m2TW6pE3_F*IDbLS@h8Z5x$eMzt#rn5%@R diff --git a/hoj-vue/src/common/constants.js b/hoj-vue/src/common/constants.js index ae7eb50b..2ce29f08 100644 --- a/hoj-vue/src/common/constants.js +++ b/hoj-vue/src/common/constants.js @@ -141,7 +141,10 @@ export const PROBLEM_LEVEL_RESERVE={ export const OJ_NAME = 'HOJ' -export const REMOTE_OJ = ['HDU'] +export const REMOTE_OJ = [ + {name:'HDU',key:"HDU"}, + {name:"Codeforces",key:"CF"} +] export const CONTEST_STATUS = { 'SCHEDULED': -1, diff --git a/hoj-vue/src/components/oj/common/CodeMirror.vue b/hoj-vue/src/components/oj/common/CodeMirror.vue index 9c7be87b..08630f94 100644 --- a/hoj-vue/src/components/oj/common/CodeMirror.vue +++ b/hoj-vue/src/components/oj/common/CodeMirror.vue @@ -84,7 +84,16 @@ import 'codemirror/theme/material.css'; // mode import 'codemirror/mode/clike/clike.js'; import 'codemirror/mode/python/python.js'; -import 'codemirror/mode/pascal/pascal.js'; +import 'codemirror/mode/pascal/pascal.js'; //pascal +import 'codemirror/mode/go/go.js'; //go +import 'codemirror/mode/d/d.js'; //d +import 'codemirror/mode/haskell/haskell.js'; //haskell +import 'codemirror/mode/mllike/mllike.js'; //OCaml +import 'codemirror/mode/perl/perl.js'; //perl +import 'codemirror/mode/php/php.js'; //php +import 'codemirror/mode/ruby/ruby.js'; //ruby +import 'codemirror/mode/rust/rust.js'; //rust +import 'codemirror/mode/javascript/javascript.js'; //javascript // active-line.js import 'codemirror/addon/selection/active-line.js'; diff --git a/hoj-vue/src/views/admin/problem/ProblemList.vue b/hoj-vue/src/views/admin/problem/ProblemList.vue index 56cd7d01..277cf7fd 100644 --- a/hoj-vue/src/views/admin/problem/ProblemList.vue +++ b/hoj-vue/src/views/admin/problem/ProblemList.vue @@ -151,9 +151,9 @@ @@ -204,7 +204,7 @@ export default { addRemoteOJproblemLoading: false, otherOJName: 'HDU', otherOJProblemId: '', - REMOTE_OJ: [], + REMOTE_OJ: {}, }; }, mounted() { diff --git a/hoj-vue/src/views/oj/problem/Problem.vue b/hoj-vue/src/views/oj/problem/Problem.vue index baa0dc25..0681536b 100644 --- a/hoj-vue/src/views/oj/problem/Problem.vue +++ b/hoj-vue/src/views/oj/problem/Problem.vue @@ -8,7 +8,10 @@
{{ problemData.problem.title }}
- 比赛题目 + {{ tag }} + 暂无标签
-
+

Source

diff --git a/hoj-vue/src/views/oj/problem/ProblemList.vue b/hoj-vue/src/views/oj/problem/ProblemList.vue index ac1d1b64..25da0f89 100644 --- a/hoj-vue/src/views/oj/problem/ProblemList.vue +++ b/hoj-vue/src/views/oj/problem/ProblemList.vue @@ -98,7 +98,7 @@ min-width="100" > - + - +