Skip to content
This repository was archived by the owner on Apr 18, 2021. It is now read-only.

Commit 4c8bbdf

Browse files
author
Eureka0225
committed
pie in the sky
1 parent efb9761 commit 4c8bbdf

File tree

6 files changed

+107
-36
lines changed

6 files changed

+107
-36
lines changed

config.js

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module.exports = {
33
host: '0.0.0.0',
44
port: 5000,
55
problemPath: './data/problem',
6+
contestPath: './data/contest',
67
submissionPath: './data/submission',
78
tempPath: './data/temp'
89
},

src/routes/api/contest.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
3+
const fs = require('fs');
4+
const yaml = require('js-yaml');
5+
6+
const { errorCode, errorMessage } = require('../../error');
7+
const config = require('../../config');
8+
const logger = require('../../logger');
9+
const util = require('../../util');
10+
11+
const User = require('../../models-build/user').default;
12+
const Contest = require('../../models-build/contest').default;
13+
14+
async function contestList (req, res) {
15+
//TODO: Contest list API
16+
}
17+
18+
module.exports = {
19+
contestList
20+
};

src/routes/contest.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const express = require('express');
44
const { constants } = require('buffer');
55
const { default: problem } = require('../models-build/problem');
6+
const { route } = require('./submission');
67

78
const User = require('../models-build/user').default;
89

@@ -22,7 +23,7 @@ router.get('/', async (req, res) => {
2223
for (let contest of contests) {
2324
await contest.loadRelatives();
2425
}
25-
res.render('contest.pug', { nowUser: nowUser, contest: contests.map(contest => ({
26+
res.render('contests.pug', { nowUser: nowUser, contest: contests.map(contest => ({
2627
cid: contest.cid,
2728
title: contest.title,
2829
type: contest.type,
@@ -39,4 +40,16 @@ router.get('/', async (req, res) => {
3940
}
4041
});
4142

43+
router.get("/:cid", async (req, res)=> {
44+
if (req.session.user_id) {
45+
const contest = await Contest.fromCid(req.params.cid);
46+
const contest_file = `${config.hoj.problemPath}/${req.params.cid}`;
47+
contest.info = yaml.safeLoad(fs.readFileSync(`${contest_file}/problem.yml`));
48+
contest.config = yaml.safeLoad(fs.readFileSync(`${contest_file}/config.yml`));
49+
res.render('contest.pug', {data: contest});
50+
} else {
51+
res.redirect('/login')
52+
}
53+
});
54+
4255
module.exports = router;

src/routes/problem.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ router.get('/:pid', async (req, res) => {
4747
res.render('problem.pug', { problem: problem ,user: await User.fromUid(problem.uid), nowUser: await User.fromUid(req.session.user_id)});
4848
}
4949
else {
50-
res.redirect('/404');
50+
res.redirect('/login');
5151
}
5252
});
5353

views/contest.pug

+32-34
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,37 @@
11
extends layout/template.pug
22

33
block css
4-
link(rel='stylesheet', href='/css/global.css')
5-
link(rel='stylesheet', href='/css/meter.css')
6-
link(rel='stylesheet', href='/css/datagrid.css')
4+
link(rel='stylesheet', href='/css/problem.css')
5+
link(rel='stylesheet', href='/css/util.css')
76
link(rel='stylesheet', href='/css/tag.css')
8-
link(rel='stylesheet', href='/css/contestlist.css')
7+
link(rel='stylesheet', href='/css/markdown.css')
8+
link(rel='stylesheet', data-name='vs/editor/editor.main', href='/monaco-editor/min/vs/editor/editor.main.css')
9+
link(rel='stylesheet', href='/katex/dist/katex.min.css')
910

10-
block content
11-
div.card
12-
p(style='font-size: 20px; margin: 0px') Hydrogen OJ Contest Set
13-
div.card
14-
table.datagrid
15-
thead
16-
tr
17-
th.contestlist-table-cid 比赛编号
18-
th.contestlist-table-title 比赛标题
19-
th.contestlist-table-type 类型
20-
th.contestlist-table-difficulty 难度
21-
th.contestlist-table-owner 举办者
22-
tbody#datagrid
23-
each item in contest
24-
tr
25-
td.contestlist-table-cid= item.cid
26-
td.contestlist-table-title: a(href=`/contest/${item.cid}`)= item.title
27-
- const contest_type = ["个人公开赛","团队公开赛","个人邀请赛","团队邀请赛","团队内部赛"]
28-
td.contestlist-table-type: div(class=`tag tag-difficulty-${item.type+1}`): span= contest_type[item.type]
29-
- const contest_difficulty = ['尚未评定', '入门', '普及-', '普及/提高-', '普及+/提高', '提高+/省选-', '省选/NOI-', 'NOI/NOI+/CTSC'];
30-
td.contestlist-table-difficulty: div(class=`tag tag-difficulty-${item.difficulty}`): span= contest_difficulty[item.difficulty]
31-
td.contestlist-table-onwer.contestlist-table-title
32-
a(href=`/user/${item.user.uid}`)= item.user.username
33-
div.page-selector
34-
li.page-top: i.fa.fa-angle-double-left
35-
li.page-last: i.fa.fa-angle-left
36-
- for (let i = 1; i < 10; ++i)
37-
li(onclick=`loadPage(${i}, 10)`).page: = i
38-
li.page-next: i.fa.fa-angle-right
39-
li.page-end: i.fa.fa-angle-double-right
11+
12+
block js
13+
script(src='/showdown/dist/showdown.min.js')
14+
script(src='/showdown-katex/dist/showdown-katex.min.js')
15+
script.
16+
var require = { paths: {
17+
'vs': '/monaco-editor/min/vs'
18+
}};
19+
script(src='/monaco-editor/min/vs/loader.js')
20+
script(src='/monaco-editor/min/vs/editor/editor.main.js')
21+
script(src='/monaco-editor/min/vs/editor/editor.main.nls.js')
22+
23+
block content
24+
div.problem-head.card
25+
p.problem-title #{problem.pid} #{problem.title}
26+
- var classes = problem.class.split(",")
27+
each tag in classes
28+
div(class=`tag tag-difficulty-1`)
29+
span= tag
30+
div(class=`tag tag-difficulty-0`): span= "出题人: " + user.username
31+
div(class=`tag tag-difficulty-0`): span= "内存限制: " + problem.config.substacks[0].memory_limit/1024 + "MiB"
32+
div(class=`tag tag-difficulty-0`): span= "时间限制: " + problem.config.substacks[0].time_limit + "ms"
33+
div.problem-info.card
34+
p.problem-info-title 题目背景
35+
div#problem-background #{problem.info.background}
36+
p.problem-info-title 题目描述
37+
div#problem-description #{problem.info.description}

views/contests.pug

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
extends layout/template.pug
2+
3+
block css
4+
link(rel='stylesheet', href='/css/global.css')
5+
link(rel='stylesheet', href='/css/meter.css')
6+
link(rel='stylesheet', href='/css/datagrid.css')
7+
link(rel='stylesheet', href='/css/tag.css')
8+
link(rel='stylesheet', href='/css/contestlist.css')
9+
10+
block content
11+
div.card
12+
p(style='font-size: 20px; margin: 0px') Hydrogen OJ Contest Set
13+
div.card
14+
table.datagrid
15+
thead
16+
tr
17+
th.contestlist-table-cid 比赛编号
18+
th.contestlist-table-title 比赛标题
19+
th.contestlist-table-type 类型
20+
th.contestlist-table-difficulty 难度
21+
th.contestlist-table-owner 举办者
22+
tbody#datagrid
23+
each item in contest
24+
tr
25+
td.contestlist-table-cid= item.cid
26+
td.contestlist-table-title: a(href=`/contest/${item.cid}`)= item.title
27+
- const contest_type = ["个人公开赛","团队公开赛","个人邀请赛","团队邀请赛","团队内部赛"]
28+
td.contestlist-table-type: div(class=`tag tag-difficulty-${item.type+1}`): span= contest_type[item.type]
29+
- const contest_difficulty = ['尚未评定', '入门', '普及-', '普及/提高-', '普及+/提高', '提高+/省选-', '省选/NOI-', 'NOI/NOI+/CTSC'];
30+
td.contestlist-table-difficulty: div(class=`tag tag-difficulty-${item.difficulty}`): span= contest_difficulty[item.difficulty]
31+
td.contestlist-table-onwer.contestlist-table-title
32+
a(href=`/user/${item.user.uid}`)= item.user.username
33+
div.page-selector
34+
li.page-top: i.fa.fa-angle-double-left
35+
li.page-last: i.fa.fa-angle-left
36+
- for (let i = 1; i < 10; ++i)
37+
li(onclick=`loadPage(${i}, 10)`).page: = i
38+
li.page-next: i.fa.fa-angle-right
39+
li.page-end: i.fa.fa-angle-double-right

0 commit comments

Comments
 (0)