S2OJ/web/app/controllers/contest_manage.php
2022-03-17 11:02:44 +08:00

239 lines
7.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
requirePHPLib('form');
if (!validateUInt($_GET['id']) || !($contest = queryContest($_GET['id']))) {
become404Page();
}
genMoreContestInfo($contest);
if (!isSuperUser($myUser)) {
become403Page();
}
$time_form = new UOJForm('time');
$time_form->addInput(
'name', 'text', '比赛标题', $contest['name'],
function($str) {
return '';
},
null
);
$time_form->addInput(
'start_time', 'text', '开始时间', $contest['start_time_str'],
function($str, &$vdata) {
try {
$vdata['start_time'] = new DateTime($str);
} catch (Exception $e) {
return '无效时间格式';
}
return '';
},
null
);
$time_form->addInput(
'last_min', 'text', '时长(单位:分钟)', $contest['last_min'],
function($str) {
return !validateUInt($str) ? '必须为一个整数' : '';
},
null
);
$time_form->handle = function(&$vdata) {
global $contest;
$start_time_str = $vdata['start_time']->format('Y-m-d H:i:s');
$purifier = HTML::pruifier();
$esc_name = $_POST['name'];
$esc_name = $purifier->purify($esc_name);
$esc_name = DB::escape($esc_name);
DB::update("update contests set start_time = '$start_time_str', last_min = {$_POST['last_min']}, name = '$esc_name' where id = {$contest['id']}");
};
$managers_form = newAddDelCmdForm('managers',
function($username) {
if (!validateUsername($username) || !queryUser($username)) {
return "不存在名为{$username}的用户";
}
return '';
},
function($type, $username) {
global $contest;
if ($type == '+') {
DB::query("insert into contests_permissions (contest_id, username) values (${contest['id']}, '$username')");
} elseif ($type == '-') {
DB::query("delete from contests_permissions where contest_id = ${contest['id']} and username = '$username'");
}
}
);
$problems_form = newAddDelCmdForm('problems',
function($cmd) {
if (!preg_match('/^(\d+)\s*(\[\S+\])?$/', $cmd, $matches)) {
return "无效题号";
}
$problem_id = $matches[1];
if (!validateUInt($problem_id) || !($problem = queryProblemBrief($problem_id))) {
return "不存在题号为{$problem_id}的题";
}
if (!hasProblemPermission(Auth::user(), $problem)) {
return "无权添加题号为{$problem_id}的题";
}
return '';
},
function($type, $cmd) {
global $contest;
if (!preg_match('/^(\d+)\s*(\[\S+\])?$/', $cmd, $matches)) {
return "无效题号";
}
$problem_id = $matches[1];
if ($type == '+') {
DB::insert("insert into contests_problems (contest_id, problem_id) values ({$contest['id']}, '$problem_id')");
} elseif ($type == '-') {
DB::delete("delete from contests_problems where contest_id = {$contest['id']} and problem_id = '$problem_id'");
}
if (isset($matches[2])) {
switch ($matches[2]) {
case '[sample]':
unset($contest['extra_config']["problem_$problem_id"]);
break;
case '[full]':
$contest['extra_config']["problem_$problem_id"] = 'full';
break;
case '[no-details]':
$contest['extra_config']["problem_$problem_id"] = 'no-details';
break;
}
$esc_extra_config = json_encode($contest['extra_config']);
$esc_extra_config = DB::escape($esc_extra_config);
DB::update("update contests set extra_config = '$esc_extra_config' where id = {$contest['id']}");
}
}
);
if (isSuperUser($myUser)) {
$version_form = new UOJForm('version');
$version_form->addInput('standings_version', 'text', '排名版本', $contest['extra_config']['standings_version'],
function ($x) {
if (!validateUInt($x) || $x < 1 || $x > 2) {
return '不是合法的版本号';
}
return '';
},
null
);
$version_form->handle = function() {
global $contest;
$contest['extra_config']['standings_version'] = $_POST['standings_version'];
$esc_extra_config = json_encode($contest['extra_config']);
$esc_extra_config = DB::escape($esc_extra_config);
DB::update("update contests set extra_config = '$esc_extra_config' where id = {$contest['id']}");
};
$version_form->runAtServer();
$contest_type_form = new UOJForm('contest_type');
$contest_type_form->addInput('contest_type', 'text', '赛制', $contest['extra_config']['contest_type'],
function ($x) {
if ($x != 'OI' && $x != 'ACM' && $x != 'IOI') {
return '不是合法的赛制名';
}
return '';
},
null
);
$contest_type_form->handle = function() {
global $contest;
$contest['extra_config']['contest_type'] = $_POST['contest_type'];
$esc_extra_config = json_encode($contest['extra_config']);
$esc_extra_config = DB::escape($esc_extra_config);
DB::update("update contests set extra_config = '$esc_extra_config' where id = {$contest['id']}");
};
$contest_type_form->runAtServer();
}
$time_form->runAtServer();
$managers_form->runAtServer();
$problems_form->runAtServer();
?>
<?php echoUOJPageHeader(HTML::stripTags($contest['name']) . ' - 比赛管理') ?>
<h1 class="page-header" align="center"><?=$contest['name']?> 管理</h1>
<ul class="nav nav-tabs mb-3" role="tablist">
<li class="nav-item"><a class="nav-link active" href="#tab-time" role="tab" data-toggle="tab">比赛时间</a></li>
<li class="nav-item"><a class="nav-link" href="#tab-managers" role="tab" data-toggle="tab">管理者</a></li>
<li class="nav-item"><a class="nav-link" href="#tab-problems" role="tab" data-toggle="tab">试题</a></li>
<?php if (isSuperUser($myUser)): ?>
<li class="nav-item"><a class="nav-link" href="#tab-others" role="tab" data-toggle="tab">其它</a></li>
<?php endif ?>
<li class="nav-item"><a class="nav-link" href="/contest/<?=$contest['id']?>" role="tab">返回</a></li>
</ul>
<div class="tab-content top-buffer-sm">
<div class="tab-pane active" id="tab-time">
<?php $time_form->printHTML(); ?>
</div>
<div class="tab-pane" id="tab-managers">
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>用户名</th>
</tr>
</thead>
<tbody>
<?php
$row_id = 0;
$result = DB::query("select username from contests_permissions where contest_id = {$contest['id']}");
while ($row = DB::fetch($result, MYSQLI_ASSOC)) {
$row_id++;
echo '<tr>', '<td>', $row_id, '</td>', '<td>', getUserLink($row['username']), '</td>', '</tr>';
}
?>
</tbody>
</table>
<p class="text-center">命令格式:命令一行一个,+mike表示把mike加入管理者-mike表示把mike从管理者中移除</p>
<?php $managers_form->printHTML(); ?>
</div>
<div class="tab-pane" id="tab-problems">
<table class="table table-hover">
<thead>
<tr>
<th>#</th>
<th>试题名</th>
</tr>
</thead>
<tbody>
<?php
$result = DB::query("select problem_id from contests_problems where contest_id = ${contest['id']} order by problem_id asc");
while ($row = DB::fetch($result, MYSQLI_ASSOC)) {
$problem = queryProblemBrief($row['problem_id']);
$problem_config_str = isset($contest['extra_config']["problem_{$problem['id']}"]) ? $contest['extra_config']["problem_{$problem['id']}"] : 'sample';
echo '<tr>', '<td>', $problem['id'], '</td>', '<td>', getProblemLink($problem), ' ', "[$problem_config_str]", '</td>', '</tr>';
}
?>
</tbody>
</table>
<p class="text-center">命令格式:命令一行一个,+233表示把题号为233的试题加入比赛-233表示把题号为233的试题从比赛中移除</p>
<?php $problems_form->printHTML(); ?>
</div>
<?php if (isSuperUser($myUser)): ?>
<div class="tab-pane" id="tab-others">
<div class="row">
<div class="col-sm-12 top-buffer-sm">
<h3>版本控制</h3>
<?php $version_form->printHTML(); ?>
</div>
<div class="col-sm-12 top-buffer-sm">
<h3>赛制</h3>
<?php $contest_type_form->printHTML(); ?>
</div>
</div>
</div>
<?php endif ?>
</div>
<?php echoUOJPageFooter() ?>