mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-11-22 14:48:41 +00:00
refactor(problem/manage/data): uoj_form_v2
This commit is contained in:
parent
ac0e1aa4a4
commit
88e8f1de62
@ -126,11 +126,9 @@ if ($_POST['problem_settings_file_submit'] == 'submit') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$info_form = new UOJBs4Form('info');
|
$info_form = new UOJForm('info');
|
||||||
$http_host = HTML::escape(UOJContext::httpHost());
|
|
||||||
$attachment_url = UOJProblem::cur()->getAttachmentUri();
|
$attachment_url = UOJProblem::cur()->getAttachmentUri();
|
||||||
$info_form->appendHTML(
|
$info_form->appendHTML(<<<EOD
|
||||||
<<<EOD
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-3 control-label">problem_{$problem['id']}_attachment.zip</label>
|
<label class="col-sm-3 control-label">problem_{$problem['id']}_attachment.zip</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
@ -139,11 +137,9 @@ $info_form->appendHTML(
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
EOD
|
EOD);
|
||||||
);
|
|
||||||
$download_url = UOJProblem::cur()->getMainDataUri();
|
$download_url = UOJProblem::cur()->getMainDataUri();
|
||||||
$info_form->appendHTML(
|
$info_form->appendHTML(<<<EOD
|
||||||
<<<EOD
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-3 control-label">problem_{$problem['id']}.zip</label>
|
<label class="col-sm-3 control-label">problem_{$problem['id']}.zip</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
@ -152,92 +148,80 @@ $info_form->appendHTML(
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
EOD
|
EOD);
|
||||||
);
|
$info_form->appendHTML(<<<EOD
|
||||||
$info_form->appendHTML(
|
|
||||||
<<<EOD
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-3 control-label">testlib.h</label>
|
<label class="col-sm-3 control-label">testlib.h</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="form-control-static">
|
<div class="form-control-static">
|
||||||
<a class="text-decoration-none" href="/download.php?type=testlib.h">下载</a>
|
<a class="text-decoration-none" href="/download/testlib.h">下载</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
EOD
|
EOD);
|
||||||
);
|
|
||||||
|
|
||||||
$esc_submission_requirement = HTML::escape(json_encode(json_decode($problem['submission_requirement']), JSON_PRETTY_PRINT));
|
$esc_submission_requirement = HTML::escape(json_encode(json_decode($problem['submission_requirement']), JSON_PRETTY_PRINT));
|
||||||
$info_form->appendHTML(
|
$info_form->appendHTML(<<<EOD
|
||||||
<<<EOD
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-3 control-label">提交文件配置</label>
|
<label class="col-sm-3 control-label">提交文件配置</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="form-control-static"><pre class="uoj-pre bg-light rounded">
|
<pre class="uoj-pre bg-light rounded">
|
||||||
$esc_submission_requirement
|
$esc_submission_requirement
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
EOD
|
EOD);
|
||||||
);
|
|
||||||
$esc_extra_config = HTML::escape(json_encode(json_decode($problem['extra_config']), JSON_PRETTY_PRINT));
|
$esc_extra_config = HTML::escape(json_encode(json_decode($problem['extra_config']), JSON_PRETTY_PRINT));
|
||||||
$info_form->appendHTML(
|
$info_form->appendHTML(<<<EOD
|
||||||
<<<EOD
|
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label class="col-sm-3 control-label">其它配置</label>
|
<label class="col-sm-3 control-label">其它配置</label>
|
||||||
<div class="col-sm-9">
|
<div class="col-sm-9">
|
||||||
<div class="form-control-static"><pre class="uoj-pre bg-light rounded">
|
<pre class="uoj-pre bg-light rounded">
|
||||||
$esc_extra_config
|
$esc_extra_config
|
||||||
</pre>
|
</pre>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
EOD
|
EOD);
|
||||||
);
|
|
||||||
if (isSuperUser(Auth::user())) {
|
if (isSuperUser(Auth::user())) {
|
||||||
$info_form->addVInput(
|
$info_form->addTextArea('submission_requirement', [
|
||||||
'submission_requirement',
|
'label' => '提交文件配置',
|
||||||
'text',
|
'input_class' => 'form-control font-monospace',
|
||||||
'提交文件配置',
|
'default_value' => $problem['submission_requirement'],
|
||||||
$problem['submission_requirement'],
|
'validator_php' => function ($submission_requirement, &$vdata) {
|
||||||
function ($submission_requirement, &$vdata) {
|
|
||||||
$submission_requirement = json_decode($submission_requirement, true);
|
$submission_requirement = json_decode($submission_requirement, true);
|
||||||
if ($submission_requirement === null) {
|
if ($submission_requirement === null) {
|
||||||
return '不是合法的JSON';
|
return '不是合法的JSON';
|
||||||
}
|
}
|
||||||
$vdata['submission_requirement'] = json_encode($submission_requirement);
|
$vdata['submission_requirement'] = json_encode($submission_requirement);
|
||||||
},
|
},
|
||||||
null
|
]);
|
||||||
);
|
$info_form->addTextArea('extra_config', [
|
||||||
$info_form->addVInput(
|
'label' => '其他配置',
|
||||||
'extra_config',
|
'input_class' => 'form-control font-monospace',
|
||||||
'text',
|
'default_value' => $problem['extra_config'],
|
||||||
'其它配置',
|
'validator_php' => function ($extra_config, &$vdata) {
|
||||||
$problem['extra_config'],
|
|
||||||
function ($extra_config, &$vdata) {
|
|
||||||
$extra_config = json_decode($extra_config, true);
|
$extra_config = json_decode($extra_config, true);
|
||||||
if ($extra_config === null) {
|
if ($extra_config === null) {
|
||||||
return '不是合法的JSON';
|
return '不是合法的JSON';
|
||||||
}
|
}
|
||||||
$vdata['extra_config'] = json_encode($extra_config);
|
$vdata['extra_config'] = json_encode($extra_config);
|
||||||
},
|
},
|
||||||
null
|
]);
|
||||||
);
|
|
||||||
$info_form->handle = function (&$vdata) use ($problem) {
|
$info_form->handle = function (&$vdata) use ($problem) {
|
||||||
DB::update([
|
DB::update([
|
||||||
"update problems",
|
"update problems",
|
||||||
"set", [
|
"set", [
|
||||||
"submission_requirement" => $vdata['submission_requirement'],
|
"submission_requirement" => $vdata['submission_requirement'],
|
||||||
"extra_config" => $vdata['extra_config']
|
"extra_config" => $vdata['extra_config'],
|
||||||
], "where", ["id" => $problem['id']]
|
], "where", [
|
||||||
|
"id" => $problem['id'],
|
||||||
|
]
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
$info_form->no_submit = true;
|
$info_form->config['no_submit'] = true;
|
||||||
}
|
}
|
||||||
|
$info_form->runAtServer();
|
||||||
$problem_conf = getUOJConf("$data_dir/problem.conf");
|
|
||||||
|
|
||||||
function displayProblemConf(UOJProblemDataDisplayer $self) {
|
function displayProblemConf(UOJProblemDataDisplayer $self) {
|
||||||
global $info_form;
|
global $info_form;
|
||||||
@ -250,8 +234,8 @@ function displayProblemConf(UOJProblemDataDisplayer $self) {
|
|||||||
$self->echoFilePre('problem.conf');
|
$self->echoFilePre('problem.conf');
|
||||||
}
|
}
|
||||||
|
|
||||||
function addTestsTab(UOJProblemDataDisplayer $disp, array $problem_conf) {
|
function addTestsTab(UOJProblemDataDisplayer $disp, UOJProblemConf $problem_conf) {
|
||||||
$n_tests = getUOJConfVal($problem_conf, 'n_tests', 10);
|
$n_tests = $problem_conf->getVal('n_tests', 10);
|
||||||
if (!validateUInt($n_tests)) {
|
if (!validateUInt($n_tests)) {
|
||||||
$disp->setProblemConfRowStatus('n_tests', 'danger');
|
$disp->setProblemConfRowStatus('n_tests', 'danger');
|
||||||
return false;
|
return false;
|
||||||
@ -260,8 +244,8 @@ function addTestsTab(UOJProblemDataDisplayer $disp, array $problem_conf) {
|
|||||||
$inputs = [];
|
$inputs = [];
|
||||||
$outputs = [];
|
$outputs = [];
|
||||||
for ($num = 1; $num <= $n_tests; $num++) {
|
for ($num = 1; $num <= $n_tests; $num++) {
|
||||||
$inputs[$num] = getUOJProblemInputFileName($problem_conf, $num);
|
$inputs[$num] = $problem_conf->getInputFileName($num);
|
||||||
$outputs[$num] = getUOJProblemOutputFileName($problem_conf, $num);
|
$outputs[$num] = $problem_conf->getOutputFileName($num);
|
||||||
unset($disp->rest_data_files[$inputs[$num]]);
|
unset($disp->rest_data_files[$inputs[$num]]);
|
||||||
unset($disp->rest_data_files[$outputs[$num]]);
|
unset($disp->rest_data_files[$outputs[$num]]);
|
||||||
}
|
}
|
||||||
@ -281,14 +265,14 @@ function addTestsTab(UOJProblemDataDisplayer $disp, array $problem_conf) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function addExTestsTab(UOJProblemDataDisplayer $disp, array $problem_conf) {
|
function addExTestsTab(UOJProblemDataDisplayer $disp, UOJProblemConf $problem_conf) {
|
||||||
$has_extra_tests = !(isset($problem_conf['submit_answer']) && $problem_conf['submit_answer'] == 'on');
|
$has_extra_tests = $problem_conf->getNonTraditionalJudgeType() != 'submit_answer';
|
||||||
|
|
||||||
if (!$has_extra_tests) {
|
if (!$has_extra_tests) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$n_ex_tests = getUOJConfVal($problem_conf, 'n_ex_tests', 0);
|
$n_ex_tests = $problem_conf->getVal('n_ex_tests', 0);
|
||||||
if (!validateUInt($n_ex_tests)) {
|
if (!validateUInt($n_ex_tests)) {
|
||||||
$disp->setProblemConfRowStatus('n_ex_tests', 'danger');
|
$disp->setProblemConfRowStatus('n_ex_tests', 'danger');
|
||||||
return false;
|
return false;
|
||||||
@ -301,8 +285,8 @@ function addExTestsTab(UOJProblemDataDisplayer $disp, array $problem_conf) {
|
|||||||
$inputs = [];
|
$inputs = [];
|
||||||
$outputs = [];
|
$outputs = [];
|
||||||
for ($num = 1; $num <= $n_ex_tests; $num++) {
|
for ($num = 1; $num <= $n_ex_tests; $num++) {
|
||||||
$inputs[$num] = getUOJProblemExtraInputFileName($problem_conf, $num);
|
$inputs[$num] = $problem_conf->getExtraInputFileName($num);
|
||||||
$outputs[$num] = getUOJProblemExtraOutputFileName($problem_conf, $num);
|
$outputs[$num] = $problem_conf->getExtraOutputFileName($num);
|
||||||
unset($disp->rest_data_files[$inputs[$num]]);
|
unset($disp->rest_data_files[$inputs[$num]]);
|
||||||
unset($disp->rest_data_files[$outputs[$num]]);
|
unset($disp->rest_data_files[$outputs[$num]]);
|
||||||
}
|
}
|
||||||
@ -341,7 +325,7 @@ function addSrcTab(UOJProblemDataDisplayer $disp, $tab_name, string $name) {
|
|||||||
function getDataDisplayer() {
|
function getDataDisplayer() {
|
||||||
$disp = new UOJProblemDataDisplayer(UOJProblem::cur());
|
$disp = new UOJProblemDataDisplayer(UOJProblem::cur());
|
||||||
|
|
||||||
$problem_conf = UOJProblem::cur()->getProblemConfArray();
|
$problem_conf = UOJProblem::cur()->getProblemConf();
|
||||||
if ($problem_conf === -1) {
|
if ($problem_conf === -1) {
|
||||||
return $disp->addTab('problem.conf', function ($self) {
|
return $disp->addTab('problem.conf', function ($self) {
|
||||||
global $info_form;
|
global $info_form;
|
||||||
@ -365,18 +349,18 @@ function getDataDisplayer() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$disp->setProblemConf($problem_conf);
|
$disp->setProblemConf($problem_conf->conf);
|
||||||
unset($disp->rest_data_files['problem.conf']);
|
unset($disp->rest_data_files['problem.conf']);
|
||||||
unset($disp->rest_data_files['download.zip']);
|
unset($disp->rest_data_files['download.zip']);
|
||||||
$disp->addTab('problem.conf', 'displayProblemConf');
|
$disp->addTab('problem.conf', 'displayProblemConf');
|
||||||
addTestsTab($disp, $problem_conf);
|
addTestsTab($disp, $problem_conf);
|
||||||
addExTestsTab($disp, $problem_conf);
|
addExTestsTab($disp, $problem_conf);
|
||||||
|
|
||||||
$judger_name = getUOJConfVal($problem_conf, 'use_builtin_judger', null);
|
$judger_name = $problem_conf->getVal('use_builtin_judger', null);
|
||||||
if ($judger_name === null) {
|
if ($judger_name === null) {
|
||||||
return $disp;
|
return $disp;
|
||||||
} elseif ($judger_name === 'on') {
|
} elseif ($judger_name === 'on') {
|
||||||
if (!isset($problem_conf['interaction_mode'])) {
|
if ($problem_conf->isOn('interaction_mode')) {
|
||||||
if (isset($problem_conf['use_builtin_checker'])) {
|
if (isset($problem_conf['use_builtin_checker'])) {
|
||||||
$disp->addTab('checker', function ($self) {
|
$disp->addTab('checker', function ($self) {
|
||||||
echo '<h4>use builtin checker : ', $self->problem_conf['use_builtin_checker']['val'], '</h4>';
|
echo '<h4>use builtin checker : ', $self->problem_conf['use_builtin_checker']['val'], '</h4>';
|
||||||
@ -389,7 +373,7 @@ function getDataDisplayer() {
|
|||||||
addSrcTab($disp, 'standard', 'std');
|
addSrcTab($disp, 'standard', 'std');
|
||||||
addSrcTab($disp, 'validator', 'val');
|
addSrcTab($disp, 'validator', 'val');
|
||||||
}
|
}
|
||||||
if (isset($problem_conf['interaction_mode'])) {
|
if (isset($problem_conf->conf['interaction_mode'])) {
|
||||||
addSrcTab($disp, 'interactor', 'interactor');
|
addSrcTab($disp, 'interactor', 'interactor');
|
||||||
}
|
}
|
||||||
return $disp;
|
return $disp;
|
||||||
@ -409,7 +393,7 @@ if (isset($_GET['display_file'])) {
|
|||||||
die();
|
die();
|
||||||
}
|
}
|
||||||
|
|
||||||
$hackable_form = new UOJBs4Form('hackable');
|
$hackable_form = new UOJForm('hackable');
|
||||||
$hackable_form->handle = function () use ($problem) {
|
$hackable_form->handle = function () use ($problem) {
|
||||||
$problem['hackable'] = !$problem['hackable'];
|
$problem['hackable'] = !$problem['hackable'];
|
||||||
$ret = dataSyncProblemData($problem);
|
$ret = dataSyncProblemData($problem);
|
||||||
@ -424,11 +408,13 @@ $hackable_form->handle = function () use ($problem) {
|
|||||||
"where", ["id" => $problem['id']]
|
"where", ["id" => $problem['id']]
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
$hackable_form->submit_button_config['class_str'] = 'btn btn-warning d-block w-100';
|
$hackable_form->config['submit_container']['class'] = '';
|
||||||
$hackable_form->submit_button_config['text'] = $problem['hackable'] ? '禁用 Hack 功能' : '启用 Hack 功能';
|
$hackable_form->config['submit_button']['class'] = 'btn btn-warning d-block w-100';
|
||||||
$hackable_form->submit_button_config['smart_confirm'] = '';
|
$hackable_form->config['submit_button']['text'] = $problem['hackable'] ? '禁用 Hack 功能' : '启用 Hack 功能';
|
||||||
|
$hackable_form->config['confirm']['smart'] = true;
|
||||||
|
$hackable_form->runAtServer();
|
||||||
|
|
||||||
$data_form = new UOJBs4Form('data');
|
$data_form = new UOJForm('data');
|
||||||
$data_form->handle = function () use ($problem) {
|
$data_form->handle = function () use ($problem) {
|
||||||
set_time_limit(60 * 5);
|
set_time_limit(60 * 5);
|
||||||
$ret = dataSyncProblemData($problem, Auth::user());
|
$ret = dataSyncProblemData($problem, Auth::user());
|
||||||
@ -436,39 +422,46 @@ $data_form->handle = function () use ($problem) {
|
|||||||
becomeMsgPage('<div>' . $ret . '</div><a href="/problem/' . $problem['id'] . '/manage/data">返回</a>');
|
becomeMsgPage('<div>' . $ret . '</div><a href="/problem/' . $problem['id'] . '/manage/data">返回</a>');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
$data_form->submit_button_config['class_str'] = 'btn btn-danger d-block w-100';
|
$data_form->config['submit_container']['class'] = '';
|
||||||
$data_form->submit_button_config['text'] = '检验配置并同步数据';
|
$data_form->config['submit_button']['class'] = 'btn btn-danger d-block w-100';
|
||||||
$data_form->submit_button_config['smart_confirm'] = '';
|
$data_form->config['submit_button']['text'] = '检验配置并同步数据';
|
||||||
|
$data_form->config['confirm']['smart'] = true;
|
||||||
|
$data_form->runAtServer();
|
||||||
|
|
||||||
$clear_data_form = new UOJBs4Form('clear_data');
|
$clear_data_form = new UOJForm('clear_data');
|
||||||
$clear_data_form->handle = function () {
|
$clear_data_form->handle = function () use ($problem) {
|
||||||
global $problem;
|
|
||||||
dataClearProblemData($problem);
|
dataClearProblemData($problem);
|
||||||
};
|
};
|
||||||
$clear_data_form->submit_button_config['class_str'] = 'btn btn-danger d-block w-100';
|
$clear_data_form->config['submit_container']['class'] = '';
|
||||||
$clear_data_form->submit_button_config['text'] = '清空题目数据';
|
$clear_data_form->config['submit_button']['class'] = 'btn btn-danger d-block w-100';
|
||||||
$clear_data_form->submit_button_config['smart_confirm'] = '';
|
$clear_data_form->config['submit_button']['text'] = '清空题目数据';
|
||||||
|
$clear_data_form->config['confirm']['smart'] = true;
|
||||||
|
$clear_data_form->runAtServer();
|
||||||
|
|
||||||
$rejudge_form = new UOJBs4Form('rejudge');
|
$rejudge_form = new UOJForm('rejudge');
|
||||||
$rejudge_form->handle = function () {
|
$rejudge_form->handle = function () {
|
||||||
UOJSubmission::rejudgeProblem(UOJProblem::cur());
|
UOJSubmission::rejudgeProblem(UOJProblem::cur());
|
||||||
};
|
};
|
||||||
$rejudge_form->succ_href = "/submissions?problem_id={$problem['id']}";
|
$rejudge_form->succ_href = "/submissions?problem_id={$problem['id']}";
|
||||||
$rejudge_form->submit_button_config['class_str'] = 'btn btn-danger d-block w-100';
|
$rejudge_form->config['submit_container']['class'] = '';
|
||||||
$rejudge_form->submit_button_config['text'] = '重测该题';
|
$rejudge_form->config['submit_button']['class'] = 'btn btn-danger d-block w-100';
|
||||||
$rejudge_form->submit_button_config['smart_confirm'] = '';
|
$rejudge_form->config['submit_button']['text'] = '重测该题';
|
||||||
|
$rejudge_form->config['confirm']['smart'] = true;
|
||||||
|
$rejudge_form->runAtServer();
|
||||||
|
|
||||||
$rejudgege97_form = new UOJBs4Form('rejudgege97');
|
$rejudgege97_form = new UOJForm('rejudgege97');
|
||||||
$rejudgege97_form->handle = function () {
|
$rejudgege97_form->handle = function () {
|
||||||
UOJSubmission::rejudgeProblemGe97(UOJProblem::cur());
|
UOJSubmission::rejudgeProblemGe97(UOJProblem::cur());
|
||||||
};
|
};
|
||||||
$rejudgege97_form->succ_href = "/submissions?problem_id={$problem['id']}";
|
$rejudgege97_form->succ_href = "/submissions?problem_id={$problem['id']}";
|
||||||
$rejudgege97_form->submit_button_config['class_str'] = 'btn btn-danger d-block w-100';
|
$rejudgege97_form->config['submit_container']['class'] = '';
|
||||||
$rejudgege97_form->submit_button_config['text'] = '重测 >=97 的程序';
|
$rejudgege97_form->config['submit_button']['class'] = 'btn btn-danger d-block w-100';
|
||||||
$rejudgege97_form->submit_button_config['smart_confirm'] = '';
|
$rejudgege97_form->config['submit_button']['text'] = '重测 >=97 的程序';
|
||||||
|
$rejudgege97_form->config['confirm']['smart'] = true;
|
||||||
|
$rejudgege97_form->runAtServer();
|
||||||
|
|
||||||
if ($problem['hackable']) {
|
if ($problem['hackable']) {
|
||||||
$test_std_form = new UOJBs4Form('test_std');
|
$test_std_form = new UOJForm('test_std');
|
||||||
$test_std_form->handle = function () use ($problem, $data_disp) {
|
$test_std_form->handle = function () use ($problem, $data_disp) {
|
||||||
$user_std = UOJUser::query('std');
|
$user_std = UOJUser::query('std');
|
||||||
if (!$user_std) {
|
if (!$user_std) {
|
||||||
@ -480,7 +473,7 @@ if ($problem['hackable']) {
|
|||||||
|
|
||||||
$src_std = UOJLang::findSourceCode('std', '', [$data_disp, 'isFile']);
|
$src_std = UOJLang::findSourceCode('std', '', [$data_disp, 'isFile']);
|
||||||
if ($src_std === false) {
|
if ($src_std === false) {
|
||||||
UOJResponse::message('未找到std!');
|
UOJResponse::message('未找到 std!');
|
||||||
}
|
}
|
||||||
|
|
||||||
$zip_file_name = FS::randomAvailableSubmissionFileName();
|
$zip_file_name = FS::randomAvailableSubmissionFileName();
|
||||||
@ -526,41 +519,35 @@ if ($problem['hackable']) {
|
|||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
$test_std_form->succ_href = "/submissions?problem_id={$problem['id']}";
|
$test_std_form->succ_href = "/submissions?problem_id={$problem['id']}";
|
||||||
$test_std_form->submit_button_config['class_str'] = 'btn btn-danger d-block w-100';
|
$test_std_form->config['submit_container']['class'] = '';
|
||||||
$test_std_form->submit_button_config['text'] = '检验数据正确性';
|
$test_std_form->config['submit_button']['class'] = 'btn btn-warning d-block w-100';
|
||||||
|
$test_std_form->config['submit_button']['text'] = '检验数据正确性';
|
||||||
$test_std_form->runAtServer();
|
$test_std_form->runAtServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
$hackable_form->runAtServer();
|
|
||||||
$data_form->runAtServer();
|
|
||||||
$clear_data_form->runAtServer();
|
|
||||||
$rejudge_form->runAtServer();
|
|
||||||
$rejudgege97_form->runAtServer();
|
|
||||||
$info_form->runAtServer();
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<?php echoUOJPageHeader(HTML::stripTags($problem['title']) . ' - 数据 - 题目管理') ?>
|
<?php echoUOJPageHeader('数据管理 - ' . UOJProblem::cur()->getTitle(['with' => 'id'])) ?>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- left col -->
|
<!-- left col -->
|
||||||
<div class="col-12 col-lg-9">
|
<div class="col-12 col-lg-9">
|
||||||
<h1>
|
<h1>
|
||||||
#<?= $problem['id'] ?>. <?= $problem['title'] ?> 管理
|
<?= UOJProblem::cur()->getTitle(['with' => 'id']) ?> 管理
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<ul class="nav nav-pills my-3" role="tablist">
|
<ul class="nav nav-pills my-3" role="tablist">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/problem/<?= $problem['id'] ?>/manage/statement" role="tab">
|
<a class="nav-link" href="<?= UOJProblem::cur()->getUri('/manage/statement') ?>" role="tab">
|
||||||
题面
|
题面
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/problem/<?= $problem['id'] ?>/manage/managers" role="tab">
|
<a class="nav-link" href="<?= UOJProblem::cur()->getUri('/manage/managers') ?>" role="tab">
|
||||||
管理者
|
管理者
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" href="/problem/<?= $problem['id'] ?>/manage/data" role="tab">
|
<a class="nav-link active" href="<?= UOJProblem::cur()->getUri('/manage/data') ?>" role="tab">
|
||||||
数据
|
数据
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@ -607,7 +594,6 @@ $info_form->runAtServer();
|
|||||||
|
|
||||||
<!-- right col -->
|
<!-- right col -->
|
||||||
<aside class="col-12 col-lg-3 mt-3 mt-lg-0 d-flex flex-column">
|
<aside class="col-12 col-lg-3 mt-3 mt-lg-0 d-flex flex-column">
|
||||||
|
|
||||||
<div class="card card-default mt-3 mt-lg-0 mb-2 order-2 order-lg-1">
|
<div class="card card-default mt-3 mt-lg-0 mb-2 order-2 order-lg-1">
|
||||||
<ul class="nav nav-pills nav-fill flex-column" role="tablist">
|
<ul class="nav nav-pills nav-fill flex-column" role="tablist">
|
||||||
<li class="nav-item text-start">
|
<li class="nav-item text-start">
|
||||||
@ -717,6 +703,8 @@ $info_form->runAtServer();
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php $problem_conf = UOJProblem::cur()->getProblemConf() ?>
|
||||||
|
|
||||||
<div class="modal fade" id="ProblemSettingsFileModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
<div class="modal fade" id="ProblemSettingsFileModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
|
||||||
<div class="modal-dialog modal-lg">
|
<div class="modal-dialog modal-lg">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
@ -729,7 +717,7 @@ $info_form->runAtServer();
|
|||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="use_builtin_checker" class="col-sm-5 control-label">比对函数</label>
|
<label for="use_builtin_checker" class="col-sm-5 control-label">比对函数</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $checker_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'use_builtin_checker', 'ownchk') : ""; ?>
|
<?php $checker_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('use_builtin_checker', 'ownchk') : ""; ?>
|
||||||
<select class="form-select" id="use_builtin_checker" name="use_builtin_checker">
|
<select class="form-select" id="use_builtin_checker" name="use_builtin_checker">
|
||||||
<option value="ncmp" <?= $checker_value == "ncmp" ? 'selected' : '' ?>>ncmp: 整数序列</option>
|
<option value="ncmp" <?= $checker_value == "ncmp" ? 'selected' : '' ?>>ncmp: 整数序列</option>
|
||||||
<option value="wcmp" <?= $checker_value == "wcmp" ? 'selected' : '' ?>>wcmp: 字符串序列</option>
|
<option value="wcmp" <?= $checker_value == "wcmp" ? 'selected' : '' ?>>wcmp: 字符串序列</option>
|
||||||
@ -748,63 +736,63 @@ $info_form->runAtServer();
|
|||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="n_tests" class="col-sm-5 control-label">n_tests</label>
|
<label for="n_tests" class="col-sm-5 control-label">n_tests</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $n_tests_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'n_tests', '') : ""; ?>
|
<?php $n_tests_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('n_tests', '') : ""; ?>
|
||||||
<input type="number" class="form-control" id="n_tests" name="n_tests" placeholder="数据点个数(必填)" value="<?= $n_tests_value ?>">
|
<input type="number" class="form-control" id="n_tests" name="n_tests" placeholder="数据点个数(必填)" value="<?= $n_tests_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="n_ex_tests" class="col-sm-5 control-label">n_ex_tests</label>
|
<label for="n_ex_tests" class="col-sm-5 control-label">n_ex_tests</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $n_ex_tests_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'n_ex_tests', 0) : ""; ?>
|
<?php $n_ex_tests_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('n_ex_tests', 0) : ""; ?>
|
||||||
<input type="number" class="form-control" id="n_ex_tests" name="n_ex_tests" placeholder="额外数据点个数(默认为 0)" value="<?= $n_ex_tests_value ?>">
|
<input type="number" class="form-control" id="n_ex_tests" name="n_ex_tests" placeholder="额外数据点个数(默认为 0)" value="<?= $n_ex_tests_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="n_sample_tests" class="col-sm-5 control-label">n_sample_tests</label>
|
<label for="n_sample_tests" class="col-sm-5 control-label">n_sample_tests</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $n_sample_tests_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'n_sample_tests', 0) : ""; ?>
|
<?php $n_sample_tests_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('n_sample_tests', 0) : ""; ?>
|
||||||
<input type="number" class="form-control" id="n_sample_tests" name="n_sample_tests" placeholder="样例测试点个数(默认为 0)" value="<?= $n_sample_tests_value ?>">
|
<input type="number" class="form-control" id="n_sample_tests" name="n_sample_tests" placeholder="样例测试点个数(默认为 0)" value="<?= $n_sample_tests_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="input_pre" class="col-sm-5 control-label">input_pre</label>
|
<label for="input_pre" class="col-sm-5 control-label">input_pre</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $input_pre_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'input_pre', 'input') : ""; ?>
|
<?php $input_pre_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('input_pre', 'input') : ""; ?>
|
||||||
<input type="text" class="form-control" id="input_pre" name="input_pre" placeholder="输入文件名称(默认为 input)" value="<?= $input_pre_value ?>">
|
<input type="text" class="form-control" id="input_pre" name="input_pre" placeholder="输入文件名称(默认为 input)" value="<?= $input_pre_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="input_suf" class="col-sm-5 control-label">input_suf</label>
|
<label for="input_suf" class="col-sm-5 control-label">input_suf</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $input_suf_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'input_suf', 'txt') : ""; ?>
|
<?php $input_suf_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('input_suf', 'txt') : ""; ?>
|
||||||
<input type="text" class="form-control" id="input_suf" name="input_suf" placeholder="输入文件后缀(默认为 txt)" value="<?= $input_suf_value ?>">
|
<input type="text" class="form-control" id="input_suf" name="input_suf" placeholder="输入文件后缀(默认为 txt)" value="<?= $input_suf_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="output_pre" class="col-sm-5 control-label">output_pre</label>
|
<label for="output_pre" class="col-sm-5 control-label">output_pre</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $output_pre_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'output_pre', 'output') : ""; ?>
|
<?php $output_pre_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('output_pre', 'output') : ''; ?>
|
||||||
<input type="text" class="form-control" id="output_pre" name="output_pre" placeholder="输出文件名称(默认为 output)" value="<?= $output_pre_value ?>">
|
<input type="text" class="form-control" id="output_pre" name="output_pre" placeholder="输出文件名称(默认为 output)" value="<?= $output_pre_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="output_suf" class="col-sm-5 control-label">output_suf</label>
|
<label for="output_suf" class="col-sm-5 control-label">output_suf</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $output_suf_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'output_suf', 'txt') : ""; ?>
|
<?php $output_suf_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('output_suf', 'txt') : ""; ?>
|
||||||
<input type="text" class="form-control" id="output_suf" name="output_suf" placeholder="输出文件后缀(默认为 txt)" value="<?= $output_suf_value ?>">
|
<input type="text" class="form-control" id="output_suf" name="output_suf" placeholder="输出文件后缀(默认为 txt)" value="<?= $output_suf_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="time_limit" class="col-sm-5 control-label">time_limit</label>
|
<label for="time_limit" class="col-sm-5 control-label">time_limit</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $time_limit_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'time_limit', 1) : ""; ?>
|
<?php $time_limit_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('time_limit', 1) : ""; ?>
|
||||||
<input type="text" class="form-control" id="time_limit" name="time_limit" placeholder="时间限制(默认为 1s)" value="<?= $time_limit_value ?>">
|
<input type="text" class="form-control" id="time_limit" name="time_limit" placeholder="时间限制(默认为 1s)" value="<?= $time_limit_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="memory_limit" class="col-sm-5 control-label">memory_limit</label>
|
<label for="memory_limit" class="col-sm-5 control-label">memory_limit</label>
|
||||||
<div class="col-sm-7">
|
<div class="col-sm-7">
|
||||||
<?php $memory_limit_value = is_array($problem_conf) ? getUOJConfVal($problem_conf, 'memory_limit', 256) : ""; ?>
|
<?php $memory_limit_value = $problem_conf instanceof UOJProblemConf ? $problem_conf->getVal('memory_limit', 256) : ""; ?>
|
||||||
<input type="number" class="form-control" id="memory_limit" name="memory_limit" placeholder="内存限制(默认为 256 MB)" value="<?= $memory_limit_value ?>">
|
<input type="number" class="form-control" id="memory_limit" name="memory_limit" placeholder="内存限制(默认为 256 MB)" value="<?= $memory_limit_value ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -689,7 +689,9 @@ class UOJProblem {
|
|||||||
|
|
||||||
public function getProblemConfArray(string $where = 'data') {
|
public function getProblemConfArray(string $where = 'data') {
|
||||||
if ($where === 'data') {
|
if ($where === 'data') {
|
||||||
return getUOJConf($this->getDataFilePath('problem.conf'));
|
$conf = UOJProblemConf::getFromFile($this->getDataFilePath('problem.conf'));
|
||||||
|
|
||||||
|
return $conf instanceof UOJProblemConf ? $conf->conf : $conf;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
class UOJProblemConf {
|
class UOJProblemConf {
|
||||||
public array $conf;
|
public array $conf;
|
||||||
|
|
||||||
static function getFromFile($file_name) {
|
static function getFromFile($file_name) {
|
||||||
$reader = new StrictFileReader($file_name);
|
$reader = new StrictFileReader($file_name);
|
||||||
if ($reader->failed()) {
|
if ($reader->failed()) {
|
||||||
@ -30,7 +30,7 @@ class UOJProblemConf {
|
|||||||
$reader->close();
|
$reader->close();
|
||||||
return new UOJProblemConf($conf);
|
return new UOJProblemConf($conf);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function __construct($conf) {
|
public function __construct($conf) {
|
||||||
$this->conf = $conf;
|
$this->conf = $conf;
|
||||||
}
|
}
|
||||||
@ -58,6 +58,22 @@ class UOJProblemConf {
|
|||||||
return $default_val;
|
return $default_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getInputFileName($num) {
|
||||||
|
return $this->getVal('input_pre', 'input') . $num . '.' . $this->getVal('input_suf', 'txt');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getOutputFileName($num) {
|
||||||
|
return $this->getVal('output_pre', 'output') . $num . '.' . $this->getVal('output_suf', 'txt');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getExtraInputFileName($num) {
|
||||||
|
return 'ex_' . $this->getInputFileName($num);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getExtraOutputFileName($num) {
|
||||||
|
return 'ex_' . $this->getOutputFileName($num);
|
||||||
|
}
|
||||||
|
|
||||||
public function isOn($key) {
|
public function isOn($key) {
|
||||||
return isset($this->conf[$key]) && $this->conf[$key] == 'on';
|
return isset($this->conf[$key]) && $this->conf[$key] == 'on';
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@ Route::group(
|
|||||||
Route::any('/problem/{id}/manage/statement', '/problem_statement_manage.php');
|
Route::any('/problem/{id}/manage/statement', '/problem_statement_manage.php');
|
||||||
Route::any('/problem/{id}/manage/managers', '/problem_managers_manage.php');
|
Route::any('/problem/{id}/manage/managers', '/problem_managers_manage.php');
|
||||||
Route::any('/problem/{id}/manage/data', '/problem_data_manage.php');
|
Route::any('/problem/{id}/manage/data', '/problem_data_manage.php');
|
||||||
|
Route::any('/download/testlib.h', '/download.php?type=testlib.h');
|
||||||
Route::any('/download/problem/{id}/data.zip', '/download.php?type=problem');
|
Route::any('/download/problem/{id}/data.zip', '/download.php?type=problem');
|
||||||
Route::any('/download/problem/{id}/attachment.zip', '/download.php?type=attachment');
|
Route::any('/download/problem/{id}/attachment.zip', '/download.php?type=attachment');
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user