refactor(web/super_manage): index manage

This commit is contained in:
Baoshuo Ren 2022-10-20 17:07:43 +08:00
parent 6963be54f2
commit eda9df3d1a
Signed by: baoshuo
GPG Key ID: 00CB9680AB29F51A
9 changed files with 1335 additions and 846 deletions

View File

@ -11,5 +11,5 @@
become404Page(); become404Page();
} }
redirectTo(HTML::blog_url($blog['poster'], '/post/'.$_GET['id'])); redirectTo(HTML::blog_url($blog['poster'], '/post/'.$_GET['id'] . ($_GET['sub'] ?: '')));
?> ?>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,867 @@
<?php
requireLib('bootstrap5');
requireLib('md5');
requireLib('jquery.query');
requirePHPLib('form');
requirePHPLib('judger');
if (!isSuperUser($myUser)) {
become403Page();
}
$register_form = new UOJForm('register');
$register_form->submit_button_config['align'] = 'compressed';
$register_form->addInput('new_username', 'text', '用户名', '',
function ($new_username) {
if (!validateUsername($new_username)) {
return '用户名不合法';
}
if (queryUser($new_username)) {
return '该用户已存在';
}
return '';
},
null
);
$register_form->addInput('new_password', 'password', '密码', '',
function ($new_password) {
return '';
},
null
);
$register_form->addInput('new_realname', 'text', '真实姓名', '',
function ($new_realname) {
return '';
},
null
);
$register_form->addInput('new_school', 'text', '学校名称', '',
function ($new_school) {
return '';
},
null
);
$register_form->handle = function() {
$new_username = $_POST['new_username'];
$new_password = $_POST['new_password'];
$new_realname = DB::escape($_POST['new_realname']);
$new_school = DB::escape($_POST['new_school']);
$new_password = hash_hmac('md5', $new_password, getPasswordClientSalt());
$new_password = getPasswordToStore($new_password, $new_username);
$svn_pw = uojRandString(10);
DB::query("insert into user_info (username, realname, school, password, svn_password, register_time, usergroup) values ('$new_username', '$new_realname', '$new_school', '$new_password', '$svn_pw', now(), 'U')");
};
$register_form->runAtServer();
$change_password_form = new UOJForm('change_password');
$change_password_form->submit_button_config['align'] = 'compressed';
$change_password_form->addInput('p_username', 'text', '用户名', '',
function ($p_username) {
if (!validateUsername($p_username)) {
return '用户名不合法';
}
if (!queryUser($p_username)) {
return '用户不存在';
}
return '';
},
null
);
$change_password_form->addInput('p_password', 'password', '密码', '',
function ($p_password) {
return '';
},
null
);
$change_password_form->handle = function() {
$p_username = $_POST['p_username'];
$p_password = $_POST['p_password'];
$p_password = hash_hmac('md5', $p_password, getPasswordClientSalt());
$p_password = getPasswordToStore($p_password, $p_username);
DB::query("update user_info set password = '$p_password' where username = '$p_username'");
};
$change_password_form->runAtServer();
$change_realname_form = new UOJForm('change_realname');
$change_realname_form->submit_button_config['align'] = 'compressed';
$change_realname_form->addInput('r_username', 'text', '用户名', '',
function ($r_username) {
if (!validateUsername($r_username)) {
return '用户名不合法';
}
if (!queryUser($r_username)) {
return '用户不存在';
}
return '';
},
null
);
$change_realname_form->addInput('r_realname', 'text', '真实姓名', '',
function ($r_realname) {
return '';
},
null
);
$change_realname_form->handle = function() {
$r_username = $_POST['r_username'];
$r_realname = DB::escape($_POST['r_realname']);
DB::query("update user_info set realname = '$r_realname' where username = '$r_username'");
};
$change_realname_form->runAtServer();
$change_school_form = new UOJForm('change_school');
$change_school_form->submit_button_config['align'] = 'compressed';
$change_school_form->addInput('s_username', 'text', '用户名', '',
function ($s_username) {
if (!validateUsername($s_username)) {
return '用户名不合法';
}
if (!queryUser($s_username)) {
return '用户不存在';
}
return '';
},
null
);
$change_school_form->addInput('s_school', 'text', '学校名称', '',
function ($s_school) {
return '';
},
null
);
$change_school_form->handle = function() {
$s_username = $_POST['s_username'];
$s_school = DB::escape($_POST['s_school']);
DB::query("update user_info set school = '$s_school' where username = '$s_username'");
};
$change_school_form->runAtServer();
$user_form = new UOJForm('user');
$user_form->submit_button_config['align'] = 'compressed';
$user_form->addInput('username', 'text', '用户名', '',
function ($username) {
if (!validateUsername($username)) {
return '用户名不合法';
}
if (!queryUser($username)) {
return '用户不存在';
}
return '';
},
null
);
$options = array(
'banneduser' => '设为封禁用户',
'normaluser' => '设为普通用户',
'superuser' => '设为超级用户'
);
$user_form->addSelect('op_type', $options, '操作类型', '');
$user_form->handle = function() {
global $user_form;
$username = $_POST['username'];
switch ($_POST['op_type']) {
case 'banneduser':
DB::update("update user_info set usergroup = 'B' where username = '{$username}'");
DB::update("update user_info set usertype = 'banned' where username = '{$username}'");
break;
case 'normaluser':
DB::update("update user_info set usergroup = 'U' where username = '{$username}'");
DB::update("update user_info set usertype = 'student' where username = '{$username}'");
break;
case 'superuser':
DB::update("update user_info set usergroup = 'S' where username = '{$username}'");
DB::update("update user_info set usertype = 'student' where username = '{$username}'");
break;
}
};
$user_form->runAtServer();
$usertype_form = new UOJForm('usertype');
$user_form->submit_button_config['align'] = 'compressed';
$usertype_form->addInput('usertype_username', 'text', '用户名', '',
function ($username) {
if (!validateUsername($username)) {
return '用户名不合法';
}
if (!queryUser($username)) {
return '用户不存在';
}
return '';
},
null
);
$usertype_options = array(
'student' => '学生',
'teacher' => '老师',
'problem_uploader' => '题目上传者',
'problem_manager' => '题目管理员',
'contest_judger' => '比赛评测员',
'contest_only' => '仅比赛参加者',
);
$usertype_form->addSelect('usertype_type', $usertype_options, '角色', '');
$usertype_form->addSelect('usertype_op', array('add' => '添加', 'remove' => '移除'), '操作', '');
$usertype_form->handle = function() {
global $usertype_form;
$username = $_POST['usertype_username'];
$user = queryUser($username);
switch ($_POST['usertype_type']) {
case 'teacher':
if ($_POST['usertype_op'] === 'add') {
$user = addUserType($user, 'teacher');
$user = removeUserType($user, 'student');
} else {
$user = removeUserType($user, 'teacher');
$user = addUserType($user, 'student');
}
break;
case 'problem_manager':
if ($_POST['usertype_op'] === 'add') {
$user = addUserType($user, 'problem_manager');
$user = removeUserType($user, 'problem_uploader');
} else {
$user = removeUserType($user, 'problem_manager');
}
break;
case 'student':
case 'problem_uploader':
case 'contest_judger':
case 'contest_only':
$user = $_POST['usertype_op'] === 'add'
? addUserType($user, $_POST['usertype_type'])
: removeUserType($user, $_POST['usertype_type']);
break;
}
DB::update("update user_info set usertype = '{$user['usertype']}' where username = '{$username}'");
};
$usertype_form->runAtServer();
$blog_link_index = new UOJForm('blog_link_index');
$blog_link_index->addInput('blog_id2', 'text', '博客ID', '',
function ($x) {
if (!validateUInt($x)) {
return 'ID不合法';
}
if (!queryBlog($x)) {
return '博客不存在';
}
return '';
},
null
);
$blog_link_index->addInput('blog_level', 'text', '置顶级别(删除不用填)', '0',
function ($x) {
if (!validateUInt($x)) {
return '数字不合法';
}
if ($x > 3) {
return '该级别不存在';
}
return '';
},
null
);
$options = array(
'add' => '添加',
'del' => '删除'
);
$blog_link_index->addSelect('op-type2', $options, '操作类型', '');
$blog_link_index->handle = function() {
$blog_id = $_POST['blog_id2'];
$blog_level = $_POST['blog_level'];
if ($_POST['op-type2'] == 'add') {
if (DB::selectFirst("select * from important_blogs where blog_id = {$blog_id}")) {
DB::update("update important_blogs set level = {$blog_level} where blog_id = {$blog_id}");
} else {
DB::insert("insert into important_blogs (blog_id, level) values ({$blog_id}, {$blog_level})");
}
}
if ($_POST['op-type2'] == 'del') {
DB::delete("delete from important_blogs where blog_id = {$blog_id}");
}
};
$blog_link_index->runAtServer();
$blog_deleter = new UOJForm('blog_deleter');
$blog_deleter->addInput('blog_del_id', 'text', '博客ID', '',
function ($x) {
if (!validateUInt($x)) {
return 'ID不合法';
}
if (!queryBlog($x)) {
return '博客不存在';
}
return '';
},
null
);
$blog_deleter->handle = function() {
deleteBlog($_POST['blog_del_id']);
};
$blog_deleter->runAtServer();
$countdown_adder = new UOJForm('new_countdown');
$countdown_adder->submit_button_config['align'] = 'compressed';
$countdown_adder->addInput('new_countdown_title', 'text', '标题', '',
function ($new_countdown_title) {
return '';
},
null
);
$countdown_adder->addInput('new_countdown_endtime', 'text', '截止日期', date("Y-m-d H:i:s"),
function($str, &$vdata) {
try {
$vdata['new_countdown_endtime'] = new DateTime($str);
} catch (Exception $e) {
return '无效时间格式';
}
return '';
},
null
);
$countdown_adder->handle = function() {
$new_countdown_title = $_POST['new_countdown_title'];
$new_countdown_endtime = $_POST['new_countdown_endtime'];
$esc_countdown_title = DB::escape($new_countdown_title);
DB::query("insert into countdowns (title, endtime) values ('$esc_countdown_title', '$new_countdown_endtime')");
};
$countdown_adder->runAtServer();
$countdown_deleter = new UOJForm('delete_countdown');
$countdown_deleter->submit_button_config['align'] = 'compressed';
$countdown_deleter->addInput('delete_countdown_id', 'text', 'ID', '',
function ($x) {
if (!validateUInt($x)) {
return 'ID不合法';
}
if (!DB::selectFirst("select * from countdowns where id = $x")) {
return '倒计时不存在';
}
return '';
},
null
);
$countdown_deleter->handle = function() {
$delete_countdown_id = $_POST['delete_countdown_id'];
DB::query("delete from countdowns where id = $delete_countdown_id");
};
$countdown_deleter->runAtServer();
$countdowns_header_row = <<<EOD
<tr>
<th>ID</th>
<th>标题</th>
<th>时间</th>
</tr>
EOD;
$countdowns_print_row = function($row) {
echo <<<EOD
<tr>
<td>{$row['id']}</td>
<td>{$row['title']}</td>
<td>{$row['endtime']}</td>
</tr>
EOD;
};
$friend_link_adder = new UOJForm('new_friend_link');
$friend_link_adder->submit_button_config['align'] = 'compressed';
$friend_link_adder->addInput('new_friend_link_title', 'text', '名称', '',
function ($str) {
return '';
},
null
);
$friend_link_adder->addInput('new_friend_link_url', 'text', '链接', '',
function($str) {
if (!validateURL($str)) {
return '链接不合法';
}
return '';
},
null
);
$friend_link_adder->addInput('new_friend_link_level', 'text', '权重', '10',
function($str) {
if (!validateUInt($str)) {
return '权重必须是数字';
}
return '';
},
null
);
$friend_link_adder->handle = function() {
$new_friend_link_title = $_POST['new_friend_link_title'];
$new_friend_link_url = $_POST['new_friend_link_url'];
$new_friend_link_level = $_POST['new_friend_link_level'];
$esc_new_friend_link_title = DB::escape($new_friend_link_title);
$esc_new_friend_link_url = DB::escape($new_friend_link_url);
DB::query("insert into friend_links (title, url, level) values ('$esc_new_friend_link_title', '$esc_new_friend_link_url', $new_friend_link_level)");
};
$friend_link_adder->runAtServer();
$friend_link_deleter = new UOJForm('delete_friend_link');
$friend_link_deleter->submit_button_config['align'] = 'compressed';
$friend_link_deleter->addInput('delete_friend_link_id', 'text', 'ID', '',
function ($id) {
if (!validateUInt($id)) {
return 'ID不合法';
}
if (!DB::selectFirst("select * from friend_links where id = $id")) {
return 'ID不存在';
}
return '';
},
null
);
$friend_link_deleter->handle = function() {
$delete_friend_link_id = $_POST['delete_friend_link_id'];
DB::query("delete from friend_links where id = $delete_friend_link_id");
};
$friend_link_deleter->runAtServer();
$friend_links_header_row = <<<EOD
<tr>
<th>ID</th>
<th>名称</th>
<th>链接</th>
<th>置顶等级</th>
</tr>
EOD;
$friend_links_print_row = function($row) {
echo <<<EOD
<tr>
<td>{$row['id']}</td>
<td>{$row['title']}</td>
<td>{$row['url']}</td>
<td>{$row['level']}</td>
</tr>
EOD;
};
$contest_submissions_deleter = new UOJForm('contest_submissions');
$contest_submissions_deleter->addInput('contest_id', 'text', '比赛ID', '',
function ($x) {
if (!validateUInt($x)) {
return 'ID不合法';
}
if (!queryContest($x)) {
return '博客不存在';
}
return '';
},
null
);
$contest_submissions_deleter->handle = function() {
$contest = queryContest($_POST['contest_id']);
genMoreContestInfo($contest);
$contest_problems = DB::selectAll("select problem_id from contests_problems where contest_id = {$contest['id']}");
foreach ($contest_problems as $problem) {
$submissions = DB::selectAll("select * from submissions where problem_id = {$problem['problem_id']} and submit_time < '{$contest['start_time_str']}'");
foreach ($submissions as $submission) {
$content = json_decode($submission['content'], true);
unlink(UOJContext::storagePath().$content['file_name']);
DB::delete("delete from submissions where id = {$submission['id']}");
updateBestACSubmissions($submission['submitter'], $submission['problem_id']);
}
}
};
$contest_submissions_deleter->runAtServer();
$custom_test_deleter = new UOJForm('custom_test_deleter');
$custom_test_deleter->addInput('last', 'text', '删除末尾记录', '5',
function ($x, &$vdata) {
if (!validateUInt($x)) {
return '不合法';
}
$vdata['last'] = $x;
return '';
},
null
);
$custom_test_deleter->handle = function(&$vdata) {
$all = DB::selectAll("select * from custom_test_submissions order by id asc limit {$vdata['last']}");
foreach ($all as $submission) {
$content = json_decode($submission['content'], true);
unlink(UOJContext::storagePath().$content['file_name']);
}
DB::delete("delete from custom_test_submissions order by id asc limit {$vdata['last']}");
};
$custom_test_deleter->runAtServer();
$judger_adder = new UOJForm('judger_adder');
$judger_adder->addInput('judger_adder_name', 'text', '评测机名称', '',
function ($x, &$vdata) {
if (!validateUsername($x)) {
return '不合法';
}
if (DB::selectCount("select count(*) from judger_info where judger_name='$x'")!=0) {
return '不合法';
}
$vdata['name'] = $x;
return '';
},
null
);
$judger_adder->handle = function(&$vdata) {
$password=uojRandString(32);
DB::insert("insert into judger_info (judger_name,password) values('{$vdata['name']}','{$password}')");
};
$judger_adder->runAtServer();
$judger_deleter = new UOJForm('judger_deleter');
$judger_deleter->addInput('judger_deleter_name', 'text', '评测机名称', '',
function ($x, &$vdata) {
if (!validateUsername($x)) {
return '不合法';
}
if (DB::selectCount("select count(*) from judger_info where judger_name='$x'")!=1) {
return '不合法';
}
$vdata['name'] = $x;
return '';
},
null
);
$judger_deleter->handle = function(&$vdata) {
DB::delete("delete from judger_info where judger_name='{$vdata['name']}'");
};
$judger_deleter->runAtServer();
$judgerlist_cols = array('judger_name', 'password');
$judgerlist_config = array();
$judgerlist_header_row = <<<EOD
<tr>
<th>评测机名称</th>
<th>密码</th>
</tr>
EOD;
$judgerlist_print_row = function($row) {
echo <<<EOD
<tr>
<td>{$row['judger_name']}</td>
<td>{$row['password']}</td>
</tr>
EOD;
};
$userlist_cols = array('username', 'school', 'usergroup', 'usertype', 'register_time');
$userlist_config = array('page_len' => 20,
'table_classes' => array('table', 'table-bordered', 'table-hover', 'table-striped'));
$userlist_header_row = <<<EOD
<tr>
<th>用户名</th>
<th>学校</th>
<th style="width: 6em">用户类别</th>
<th style="width: 12em">注册时间</th>
</tr>
EOD;
$cur_tab = isset($_GET['tab']) ? $_GET['tab'] : 'users';
$user_list_cond = array();
if ($cur_tab === 'users') {
if (isset($_GET['username']) && $_GET['username'] != "") {
$user_list_cond[] = "username like '%" . DB::escape($_GET['username']) . "%'";
}
if (isset($_GET['usergroup']) && $_GET['usergroup'] != "") {
$user_list_cond[] = "usergroup = '" . DB::escape($_GET['usergroup']) . "'";
}
}
if ($user_list_cond) {
$user_list_cond = join($user_list_cond, ' and ');
} else {
$user_list_cond = '1';
}
$userlist_print_row = function($row) {
$hislink = getUserLink($row['username']);
echo <<<EOD
<tr>
<td>${hislink}</td>
<td>{$row['school']}</td>
<td>{$row['usergroup']}, {$row['usertype']}</td>
<td>{$row['register_time']}</td>
</tr>
EOD;
};
$image_hosting_cols = ['*'];
$image_hosting_config = ['page_len' => 20, 'table_classes' => ['table', 'table-bordered', 'table-hover', 'table-striped']];
$image_hosting_header_row = <<<EOD
<tr>
<th>ID</th>
<th>上传者</th>
<th>预览</th>
<th style="width: 3em">文件大小</th>
<th style="width: 12em">上传时间</th>
</tr>
EOD;
$image_hosting_print_row = function($row) {
$user_link = getUserLink($row['uploader']);
if ($row['size'] < 1024 * 512) {
$size = strval(round($row['size'] * 1.0 / 1024, 1)) . ' KB';
} else {
$size = strval(round($row['size'] * 1.0 / 1024 / 1024, 1)) . ' MB';
}
echo <<<EOD
<tr>
<td>{$row['id']}</td>
<td>$user_link</td>
<td><img src="{$row['path']}" width="250"></td>
<td>$size</td>
<td>{$row['upload_time']}</td>
</tr>
EOD;
};
$image_deleter = new UOJForm('image_deleter');
$image_deleter->submit_button_config['align'] = 'compressed';
$image_deleter->submit_button_config['text'] = '删除';
$image_deleter->submit_button_config['class_str'] = 'btn btn-danger';
$image_deleter->addInput('image_deleter_id', 'text', '图片 ID', '',
function ($x, &$vdata) {
if (!validateUInt($x)) {
return 'ID 不合法';
}
if (!DB::selectCount("select count(*) from users_images where id = $x")) {
return '图片不存在';
}
$vdata['id'] = $x;
return '';
},
null
);
$image_deleter->handle = function(&$vdata) {
$id = $vdata['id'];
$result = DB::selectFirst("SELECT * from users_images WHERE id = $id");
unlink(UOJContext::storagePath().$result['path']);
DB::delete("DELETE FROM users_images WHERE id = $id");
};
$image_deleter->runAtServer();
$change_user_image_total_size_limit_form = new UOJForm('change_user_image_total_size_limit');
$change_user_image_total_size_limit_form->submit_button_config['align'] = 'compressed';
$change_user_image_total_size_limit_form->addInput('change_user_image_total_size_limit_username', 'text', '用户名', '',
function ($x, &$vdata) {
if (!validateUsername($x)) {
return '用户名不合法';
}
if (!queryUser($x)) {
return '用户不存在';
}
$vdata['username'] = $x;
return '';
},
null
);
$change_user_image_total_size_limit_form->addInput('change_user_image_total_size_limit_limit', 'text', '存储限制单位Byte', '104857600',
function ($x, &$vdata) {
if (!validateUInt($x, 10)) {
return '限制不合法';
}
if (intval($x) > 2147483648) {
return '限制不能大于 2 GB';
}
$vdata['limit'] = $x;
return '';
},
null
);
$change_user_image_total_size_limit_form->handle = function(&$vdata) {
DB::update("UPDATE user_info SET images_size_limit = {$vdata['limit']} WHERE username = '{$vdata['username']}'");
};
$change_user_image_total_size_limit_form->runAtServer();
$tabs_info = array(
'users' => array(
'name' => '用户管理',
'url' => "/super-manage/users"
),
'blogs' => array(
'name' => '博客管理',
'url' => "/super-manage/blogs"
),
'index' => array(
'name' => '首页管理',
'url' => '/super-manage/index'
),
'submissions' => array(
'name' => '提交记录',
'url' => "/super-manage/submissions"
),
'custom-test' => array(
'name' => '自定义测试',
'url' => '/super-manage/custom-test'
),
'judger' => array(
'name' => '评测机管理',
'url' => '/super-manage/judger'
),
'image_hosting' => array(
'name' => '图床管理',
'url' => '/super-manage/image_hosting'
)
);
if (!isset($tabs_info[$cur_tab])) {
become404Page();
}
?>
<?php
requireLib('shjs');
requireLib('morris');
?>
<?php echoUOJPageHeader('系统管理') ?>
<div class="row">
<div class="col-sm-3">
<?= HTML::tablist($tabs_info, $cur_tab, 'nav-pills flex-column') ?>
</div>
<div class="col-sm-9">
<?php if ($cur_tab === 'users'): ?>
<h3>添加新用户</h3>
<?php $register_form->printHTML(); ?>
<h3>修改用户密码</h3>
<?php $change_password_form->printHTML(); ?>
<h3>用户类别设置</h3>
<p>在此处更新用户所属类别后会自动重置用户权限。</p>
<?php $user_form->printHTML(); ?>
<h3>用户权限管理</h3>
<?php $usertype_form->printHTML(); ?>
<h3>修改用户真实姓名</h3>
<?php $change_realname_form->printHTML(); ?>
<h3>修改用户学校名称</h3>
<?php $change_school_form->printHTML(); ?>
<h3>用户名单</h3>
<div id="user-query">
<form class="form-horizontal uoj-form-compressed" target="_self" method="GET">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="username" id="user-query-username" value="" />
</div>
</div>
<div class="form-group">
<label for="usergroup" class="col-sm-2 control-label">用户类别</label>
<div class="col-sm-3">
<select class="form-control" id="user-query-usergroup" name="usergroup">
<option value="">*: 所有用户</option>
<option value="B">B: 封禁用户</option>
<option value="U">U: 普通用户</option>
<option value="S">S: 超级用户</option>
</select>
</div>
</div><div class="text-center"><button type="submit" id="user-query-submit" class="mt-2 btn btn-secondary">查询</button></div>
</form>
</div>
<?php echoLongTable($userlist_cols, 'user_info', $user_list_cond, 'order by username asc', $userlist_header_row, $userlist_print_row, $userlist_config) ?>
<?php elseif ($cur_tab === 'blogs'): ?>
<div>
<h4>添加到公告</h4>
<?php $blog_link_index->printHTML(); ?>
</div>
<div>
<h4>删除博客</h4>
<?php $blog_deleter->printHTML(); ?>
</div>
<?php elseif ($cur_tab === 'index'): ?>
<div>
<h4>倒计时</h4>
<?php echoLongTable(array('id', 'title', 'endtime'), 'countdowns', '1', 'order by endtime asc', $countdowns_header_row, $countdowns_print_row, $userlist_config) ?>
<h5>添加倒计时</h5>
<?php $countdown_adder->printHTML(); ?>
<h5>删除倒计时</h5>
<?php $countdown_deleter->printHTML(); ?>
<h4>友情链接</h4>
<?php echoLongTable(array('id', 'title', 'url', 'level'), 'friend_links', '1', 'order by level desc, id asc', $friend_links_header_row, $friend_links_print_row, $userlist_config) ?>
<h5>添加友情链接</h5>
<?php $friend_link_adder->printHTML(); ?>
<h5>删除友情链接</h5>
<?php $friend_link_deleter->printHTML(); ?>
</div>
<?php elseif ($cur_tab === 'submissions'): ?>
<div>
<h4>删除赛前提交记录</h4>
<?php $contest_submissions_deleter->printHTML(); ?>
</div>
<div>
<h4>测评失败的提交记录</h4>
<?php echoSubmissionsList("result_error = 'Judgement Failed'", 'order by id desc', array('result_hidden' => ''), $myUser); ?>
</div>
<?php elseif ($cur_tab === 'custom-test'): ?>
<?php $custom_test_deleter->printHTML() ?>
<?php
$submissions_pag = new Paginator(array(
'col_names' => array('*'),
'table_name' => 'custom_test_submissions',
'cond' => '1',
'tail' => 'order by id asc',
'page_len' => 5
));
foreach ($submissions_pag->get() as $submission) {
$problem = queryProblemBrief($submission['problem_id']);
$submission_result = json_decode($submission['result'], true);
echo '<dl class="dl-horizontal">';
echo '<dt>id</dt>';
echo '<dd>', "#{$submission['id']}", '</dd>';
echo '<dt>problem_id</dt>';
echo '<dd>', "#{$submission['problem_id']}", '</dd>';
echo '<dt>submit time</dt>';
echo '<dd>', $submission['submit_time'], '</dd>';
echo '<dt>submitter</dt>';
echo '<dd>', $submission['submitter'], '</dd>';
echo '<dt>judge_time</dt>';
echo '<dd>', $submission['judge_time'], '</dd>';
echo '</dl>';
echoSubmissionContent($submission, getProblemCustomTestRequirement($problem));
echoCustomTestSubmissionDetails($submission_result['details'], "submission-{$submission['id']}-details");
}
?>
<?= $submissions_pag->pagination() ?>
<?php elseif ($cur_tab === 'judger'): ?>
<div>
<h4>添加评测机</h4>
<?php $judger_adder->printHTML(); ?>
</div>
<div>
<h4>删除评测机</h4>
<?php $judger_deleter->printHTML(); ?>
</div>
<h3>评测机列表</h3>
<?php echoLongTable($judgerlist_cols, 'judger_info', "1=1", '', $judgerlist_header_row, $judgerlist_print_row, $judgerlist_config) ?>
<?php elseif ($cur_tab === 'image_hosting'): ?>
<h3>图床管理</h3>
<?php echoLongTable($image_hosting_cols, 'users_images', "1=1", 'order by id desc', $image_hosting_header_row, $image_hosting_print_row, $image_hosting_config) ?>
<div>
<h4>删除图片</h4>
<?php $image_deleter->printHTML() ?>
</div>
<div>
<h4>修改用户存储上限</h4>
<?php $change_user_image_total_size_limit_form->printHTML() ?>
</div>
<?php endif ?>
</div>
</div>
<?php echoUOJPageFooter() ?>

View File

@ -341,7 +341,7 @@ EOD);
</div> </div>
<?php if (isSuperUser($myUser) && $user['username'] != $myUser['username']): ?> <?php if (isSuperUser($myUser) && $user['username'] != $myUser['username']): ?>
<div class="alert alert-warning mb-0" role="alert"> <div class="alert alert-warning mb-0" role="alert">
如需重置其他用户的密码,请前往 <a href="/super-manage/users" class="alert-link">系统管理</a> 页面操作。 如需重置其他用户的密码,请前往 <a href="/super_manage/users" class="alert-link">系统管理</a> 页面操作。
</div> </div>
<?php endif ?> <?php endif ?>

View File

@ -111,7 +111,7 @@ EOD;
<label for="input-$name" class="col-sm-2 control-label">$label_text</label> <label for="input-$name" class="col-sm-2 control-label">$label_text</label>
<div class="col-sm-3"> <div class="col-sm-3">
<input type="$type" class="form-control" name="$name" id="input-$name" value="$default_value" /> <input type="$type" class="form-control" name="$name" id="input-$name" value="$default_value" />
<span class="help-block" id="help-$name"></span> <span class="help-block invalid-feedback" id="help-$name"></span>
</div> </div>
</div> </div>
EOD; EOD;
@ -197,7 +197,7 @@ EOD;
<label for="input-$name" class="col-sm-2 control-label">$label_text</label> <label for="input-$name" class="col-sm-2 control-label">$label_text</label>
<div class="col-sm-10"> <div class="col-sm-10">
<textarea class="form-control" name="$name" id="input-$name">$default_value</textarea> <textarea class="form-control" name="$name" id="input-$name">$default_value</textarea>
<span class="help-block" id="help-$name"></span> <span class="help-block invalid-feedback" id="help-$name"></span>
</div> </div>
</div> </div>
EOD; EOD;
@ -210,7 +210,7 @@ EOD;
<div id="div-$name" class="form-group"> <div id="div-$name" class="form-group">
<label for="input-$name" class="control-label">$label_text</label> <label for="input-$name" class="control-label">$label_text</label>
<textarea class="form-control" name="$name" id="input-$name">$default_value</textarea> <textarea class="form-control" name="$name" id="input-$name">$default_value</textarea>
<span class="help-block" id="help-$name"></span> <span class="help-block invalid-feedback" id="help-$name"></span>
</div> </div>
EOD; EOD;
$this->add($name, $html, $validator_php, $validator_js, $no_val); $this->add($name, $html, $validator_php, $validator_js, $no_val);
@ -270,7 +270,7 @@ EOD;
<div id="div-$name"> <div id="div-$name">
<label for="input-$name" class="control-label">$label_text</label> <label for="input-$name" class="control-label">$label_text</label>
<textarea class="ckeditor" name="$name" id="input-$name">$default_value</textarea> <textarea class="ckeditor" name="$name" id="input-$name">$default_value</textarea>
<span class="help-block" id="help-$name"></span> <span class="help-block invalid-feedback" id="help-$name"></span>
</div> </div>
EOD; EOD;
$this->add($name, $html, $validator_php, $validator_js); $this->add($name, $html, $validator_php, $validator_js);
@ -333,7 +333,7 @@ EOD
<div id="div-$name"> <div id="div-$name">
<label for="input-$name" class="control-label">$label_text</label> <label for="input-$name" class="control-label">$label_text</label>
<textarea name="$name" id="input-$name">$default_value</textarea> <textarea name="$name" id="input-$name">$default_value</textarea>
<span class="help-block" id="help-$name"></span> <span class="help-block invalid-feedback" id="help-$name"></span>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
$('#input-$name').slide_editor(); $('#input-$name').slide_editor();
@ -794,7 +794,7 @@ EOD;
<button type="button" class="btn btn-primary" style="width:100px; !important" onclick="$('#input-{$name}').click();"><span class="glyphicon glyphicon-folder-open"></span> $browse_text</button> <button type="button" class="btn btn-primary" style="width:100px; !important" onclick="$('#input-{$name}').click();"><span class="glyphicon glyphicon-folder-open"></span> $browse_text</button>
</span> </span>
</div> </div>
<span class="help-block" id="help-{$name}"></span> <span class="help-block invalid-feedback" id="help-{$name}"></span>
</div> </div>
EOD; EOD;

View File

@ -58,6 +58,7 @@ Route::group([
} }
Route::any('/blogs/{id}', '/blog_show.php'); Route::any('/blogs/{id}', '/blog_show.php');
Route::any('/post/{id}', '/blog_show.php'); Route::any('/post/{id}', '/blog_show.php');
Route::any('/post/{id}/write', '/blog_show.php?sub=%2Fwrite');
Route::any('/announcements', '/announcements.php'); Route::any('/announcements', '/announcements.php');
@ -76,7 +77,8 @@ Route::group([
Route::any('/user_msg', '/user_msg.php'); Route::any('/user_msg', '/user_msg.php');
Route::any('/user/{username}/system_msg', '/user_system_msg.php'); Route::any('/user/{username}/system_msg', '/user_system_msg.php');
Route::any('/super-manage(?:/{tab})?', '/super_manage.php'); Route::any('/super-manage(?:/{tab})?', '/super_manage_old.php');
Route::any('/super_manage(?:/{tab})?', '/super_manage.php');
Route::any('/download.php', '/download.php'); Route::any('/download.php', '/download.php');

View File

@ -145,7 +145,7 @@ mb-4" role="navigation">
</li> </li>
<?php if (isSuperUser(Auth::user())): ?> <?php if (isSuperUser(Auth::user())): ?>
<li> <li>
<a class="dropdown-item" href="<?= HTML::url('/super-manage') ?>"> <a class="dropdown-item" href="<?= HTML::url('/super_manage') ?>">
<?= UOJLocale::get('system manage') ?> <?= UOJLocale::get('system manage') ?>
</a> </a>
</li> </li>

View File

@ -212,7 +212,7 @@ mb-4" role="navigation">
</li> </li>
<?php if (isSuperUser(Auth::user())): ?> <?php if (isSuperUser(Auth::user())): ?>
<li> <li>
<a class="dropdown-item" href="<?= HTML::url('/super-manage') ?>"> <a class="dropdown-item" href="<?= HTML::url('/super_manage') ?>">
<?= UOJLocale::get('system manage') ?> <?= UOJLocale::get('system manage') ?>
</a> </a>
</li> </li>

View File

@ -576,19 +576,39 @@ $.fn.long_table = function(data, cur_page, header_row, get_row_str, config) {
if (n_pages > 1) { if (n_pages > 1) {
var pagination = $('<ul class="pagination top-buffer-no bot-buffer-sm justify-content-center"></ul>'); var pagination = $('<ul class="pagination top-buffer-no bot-buffer-sm justify-content-center"></ul>');
if (cur_page > 1) { if (cur_page > 1) {
if (isBootstrap5Page) {
pagination.append(get_page_li(1, '<i class="bi bi-chevron-double-left"></i>'));
pagination.append(get_page_li(cur_page - 1, '<i class="bi bi-chevron-left"></i>'));
} else {
pagination.append(get_page_li(cur_page - 1, '<span class="glyphicon glyphicon glyphicon-backward"></span>')); pagination.append(get_page_li(cur_page - 1, '<span class="glyphicon glyphicon glyphicon-backward"></span>'));
}
} else {
if (isBootstrap5Page) {
pagination.append(get_page_li(-1, '<i class="bi bi-chevron-double-left"></i>'));
pagination.append(get_page_li(-1, '<i class="bi bi-chevron-left"></i>'));
} else { } else {
pagination.append(get_page_li(-1, '<span class="glyphicon glyphicon glyphicon-backward"></span>')); pagination.append(get_page_li(-1, '<span class="glyphicon glyphicon glyphicon-backward"></span>'));
} }
}
var max_extend = config.max_extend != undefined ? config.max_extend : 5; var max_extend = config.max_extend != undefined ? config.max_extend : 5;
for (var i = Math.max(cur_page - max_extend, 1); i <= Math.min(cur_page + max_extend, n_pages); i++) { for (var i = Math.max(cur_page - max_extend, 1); i <= Math.min(cur_page + max_extend, n_pages); i++) {
pagination.append(get_page_li(i, i.toString())); pagination.append(get_page_li(i, i.toString()));
} }
if (cur_page < n_pages) { if (cur_page < n_pages) {
if (isBootstrap5Page) {
pagination.append(get_page_li(cur_page + 1, '<i class="bi bi-chevron-right"></i>'));
pagination.append(get_page_li(n_pages, '<i class="bi bi-chevron-double-right"></i>'));
} else {
pagination.append(get_page_li(cur_page + 1, '<span class="glyphicon glyphicon glyphicon-forward"></span>')); pagination.append(get_page_li(cur_page + 1, '<span class="glyphicon glyphicon glyphicon-forward"></span>'));
}
} else {
if (isBootstrap5Page) {
pagination.append(get_page_li(-1, '<i class="bi bi-chevron-right"></i>'));
pagination.append(get_page_li(-1, '<i class="bi bi-chevron-double-right"></i>'));
} else { } else {
pagination.append(get_page_li(-1, '<span class="glyphicon glyphicon glyphicon-forward"></span>')); pagination.append(get_page_li(-1, '<span class="glyphicon glyphicon glyphicon-forward"></span>'));
} }
}
$(table_div).append($('<div class="text-center"></div>').append(pagination)); $(table_div).append($('<div class="text-center"></div>').append(pagination));
} }
}); });