mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
core: homework: 修正导出逻辑 & record: 添加统计信息
This commit is contained in:
1 parent
f0c1b49ac1
commit
df0982c690
4 files changed
+20
-9
No files matched your search
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hydrooj",
|
"name": "hydrooj",
|
||||||
"version": "2.17.2",
|
"version": "2.17.3",
|
||||||
"bin": "bin/hydrooj.js",
|
"bin": "bin/hydrooj.js",
|
||||||
"main": "dist/loader.js",
|
"main": "dist/loader.js",
|
||||||
"typings": "dist/loader.d.ts",
|
"typings": "dist/loader.d.ts",
|
||||||
|
|||||||
@@ -356,7 +356,7 @@ class HomeworkScoreboardHandler extends HomeworkHandler {
|
|||||||
];
|
];
|
||||||
this.response.template = 'contest_scoreboard.html';
|
this.response.template = 'contest_scoreboard.html';
|
||||||
this.response.body = {
|
this.response.body = {
|
||||||
tdoc, rows, path, udict,
|
tdoc, rows, path, udict, page_name: 'homework_scoreboard',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -370,8 +370,8 @@ class HomeworkScoreboardDownloadHandler extends HomeworkHandler {
|
|||||||
html: (rows) => this.renderHTML('contest_scoreboard_download_html.html', { rows }),
|
html: (rows) => this.renderHTML('contest_scoreboard_download_html.html', { rows }),
|
||||||
};
|
};
|
||||||
if (!getContent[ext]) throw new ValidationError('ext');
|
if (!getContent[ext]) throw new ValidationError('ext');
|
||||||
const [, rows] = await this.getScoreboard(domainId, tid, true, document.TYPE_HOMEWORK);
|
const [tdoc, rows] = await this.getScoreboard(domainId, tid, true, document.TYPE_HOMEWORK);
|
||||||
this.binary(await getContent[ext](rows), `${this.tdoc.title}.${ext}`);
|
this.binary(await getContent[ext](rows), `${tdoc.title}.${ext}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -407,7 +407,10 @@ export async function apply() {
|
|||||||
Route('homework_create', '/homework/create', HomeworkCreateHandler, PERM.PERM_CREATE_HOMEWORK);
|
Route('homework_create', '/homework/create', HomeworkCreateHandler, PERM.PERM_CREATE_HOMEWORK);
|
||||||
Route('homework_detail', '/homework/:tid', HomeworkDetailHandler, PERM.PERM_VIEW_HOMEWORK);
|
Route('homework_detail', '/homework/:tid', HomeworkDetailHandler, PERM.PERM_VIEW_HOMEWORK);
|
||||||
Route('homework_scoreboard', '/homework/:tid/scoreboard', HomeworkScoreboardHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD);
|
Route('homework_scoreboard', '/homework/:tid/scoreboard', HomeworkScoreboardHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD);
|
||||||
Route('homework_scoreboard', '/homework/:tid/scoreboard/download/:ext', HomeworkScoreboardDownloadHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD);
|
Route(
|
||||||
|
'homework_scoreboard_download', '/homework/:tid/scoreboard/download/:ext',
|
||||||
|
HomeworkScoreboardDownloadHandler, PERM.PERM_VIEW_HOMEWORK_SCOREBOARD,
|
||||||
|
);
|
||||||
Route('homework_detail_problem', '/homework/:tid/p/:pid', HomeworkDetailProblemHandler, PERM.PERM_VIEW_HOMEWORK);
|
Route('homework_detail_problem', '/homework/:tid/p/:pid', HomeworkDetailProblemHandler, PERM.PERM_VIEW_HOMEWORK);
|
||||||
Route('homework_detail_problem_submit', '/homework/:tid/p/:pid/submit', HomeworkDetailProblemSubmitHandler, PERM.PERM_SUBMIT_PROBLEM);
|
Route('homework_detail_problem_submit', '/homework/:tid/p/:pid/submit', HomeworkDetailProblemSubmitHandler, PERM.PERM_SUBMIT_PROBLEM);
|
||||||
Route('homework_code', '/homework/:tid/code', HomeworkCodeHandler, PERM.PERM_VIEW_HOMEWORK);
|
Route('homework_code', '/homework/:tid/code', HomeworkCodeHandler, PERM.PERM_VIEW_HOMEWORK);
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
import { FilterQuery, ObjectID } from 'mongodb';
|
import { FilterQuery, ObjectID } from 'mongodb';
|
||||||
import { PermissionError, RecordNotFoundError } from '../error';
|
import { PermissionError, RecordNotFoundError } from '../error';
|
||||||
import { PERM, CONSTANT, STATUS } from '../model/builtin';
|
import {
|
||||||
|
PERM, CONSTANT, STATUS, PRIV,
|
||||||
|
} from '../model/builtin';
|
||||||
import * as problem from '../model/problem';
|
import * as problem from '../model/problem';
|
||||||
import * as record from '../model/record';
|
import * as record from '../model/record';
|
||||||
import * as contest from '../model/contest';
|
import * as contest from '../model/contest';
|
||||||
@@ -19,7 +21,8 @@ class RecordListHandler extends RecordHandler {
|
|||||||
@param('pid', Types.String, true)
|
@param('pid', Types.String, true)
|
||||||
@param('tid', Types.ObjectID, true)
|
@param('tid', Types.ObjectID, true)
|
||||||
@param('uidOrName', Types.String, true)
|
@param('uidOrName', Types.String, true)
|
||||||
async get(domainId: string, page = 1, pid?: string, tid?: ObjectID, uidOrName?: string) {
|
@param('allDomain', Types.Boolean, true)
|
||||||
|
async get(domainId: string, page = 1, pid?: string, tid?: ObjectID, uidOrName?: string, all = false) {
|
||||||
this.response.template = 'record_main.html';
|
this.response.template = 'record_main.html';
|
||||||
const q: FilterQuery<Rdoc> = { 'contest.tid': tid, hidden: false };
|
const q: FilterQuery<Rdoc> = { 'contest.tid': tid, hidden: false };
|
||||||
if (uidOrName) {
|
if (uidOrName) {
|
||||||
@@ -63,6 +66,9 @@ class RecordListHandler extends RecordHandler {
|
|||||||
filterTid: tid,
|
filterTid: tid,
|
||||||
filterUidOrName: uidOrName,
|
filterUidOrName: uidOrName,
|
||||||
};
|
};
|
||||||
|
if (this.user.hasPriv(PRIV.PRIV_VIEW_JUDGE_STATISTICS)) {
|
||||||
|
this.response.body.statistics = await record.stat(all ? undefined : domainId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,15 +58,17 @@ export async function get(domainId: string, _id: ObjectID): Promise<Rdoc | null>
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function stat(domainId?: string) {
|
export async function stat(domainId?: string) {
|
||||||
const [d5min, d1h, d1d, d1m, total] = await Promise.all([
|
const [d5min, d1h, day, week, month, year, total] = await Promise.all([
|
||||||
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-5, 'minutes')) }, ...domainId ? { domainId } : {} }).count(),
|
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-5, 'minutes')) }, ...domainId ? { domainId } : {} }).count(),
|
||||||
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, ...domainId ? { domainId } : {} }).count(),
|
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'hour')) }, ...domainId ? { domainId } : {} }).count(),
|
||||||
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'day')) }, ...domainId ? { domainId } : {} }).count(),
|
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'day')) }, ...domainId ? { domainId } : {} }).count(),
|
||||||
|
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'week')) }, ...domainId ? { domainId } : {} }).count(),
|
||||||
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'month')) }, ...domainId ? { domainId } : {} }).count(),
|
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'month')) }, ...domainId ? { domainId } : {} }).count(),
|
||||||
|
coll.find({ _id: { $gte: Time.getObjectID(moment().add(-1, 'year')) }, ...domainId ? { domainId } : {} }).count(),
|
||||||
coll.find(domainId ? { domainId } : {}).count(),
|
coll.find(domainId ? { domainId } : {}).count(),
|
||||||
]);
|
]);
|
||||||
return {
|
return {
|
||||||
d5min, d1h, d1d, d1m, total,
|
d5min, d1h, day, week, month, year, total,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user