创新实训(四)系统管理功能
系统管理功能
在管理员权限下,用户可以对系统进行一些权限的修改,包括对用户和对博客总体的管理。
这部分代码实现主要在super_manage.php
文件中
用户管理
对用户权限的设置,分为三种:普通用户,封禁用户和超级用户,不同用户权限不同,在下方还有一个封禁名单展示。
1.导入lib文件,并且验证用户权限是否为超级用户,否则跳转到403错误页面
requirePHPLib('form');
requirePHPLib('judger');
if ($myUser == null || !isSuperUser($myUser)) {
become403Page();
}
2. 用户管理表单
$user_form = new UOJForm('user');
创建一个新的表单对象,表单的标识为 'user'
。
添加用户名输入框
$user_form->addInput('username', 'text', '用户名', '',
function ($username) {
if (!validateUsername($username)) {
return '用户名不合法';
}
if (!queryUser($username)) {
return '用户不存在';
}
return '';
},
null
);
- 字段名:'username'
- 类型:'text'
- 标签:'用户名'
- 默认值:空字符串
- 验证函数:匿名函数,验证用户名是否合法,并检查用户是否存在
- 调用
validateUsername($username)
验证用户名是否合法 - 调用
queryUser($username)
查询用户是否存在
- 调用
添加操作类型选择框
$options = array(
'banneduser' => '设为封禁用户',
'normaluser' => '设为普通用户',
'superuser' => '设为超级用户'
);
$user_form->addSelect('op-type', $options, '操作类型', '');
- 字段名:'op-type'
- 选项:包含'设为封禁用户'、'设为普通用户'、'设为超级用户'
- 标签:'操作类型'
- 默认值:空字符串
表单处理函数
$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}'");
break;
case 'normaluser':
DB::update("update user_info set usergroup = 'U' where username = '{$username}'");
break;
case 'superuser':
DB::update("update user_info set usergroup = 'S' where username = '{$username}'");
break;
}
};
根据选择的操作类型对指定的用户进行相应的操作:
- 封禁用户:将
usergroup
字段设置为 'B' - 普通用户:将
usergroup
字段设置为 'U' - 超级用户:将
usergroup
字段设置为 'S'
运行表单
$user_form->runAtServer();
调用 runAtServer()
方法,使表单在服务器上运行,处理用户提交的数据。
博客管理
根据博客ID对博客进行管理,包括添加到比赛链接或公告,或者删除博客
博客与比赛关联管理表单
$blog_link_contests = new UOJForm('blog_link_contests');
创建一个新的表单对象,用于管理博客与比赛的关联。
添加博客ID输入框
$blog_link_contests->addInput('blog_id', 'text', '博客ID', '',
function ($x) {
if (!validateUInt($x)) return 'ID不合法';
if (!queryBlog($x)) return '博客不存在';
return '';
},
null
);
- 字段名:
blog_id
- 类型:
text
- 标签:
博客ID
- 默认值:空字符串
- 验证函数:匿名函数,验证ID合法性,并检查博客是否存在
添加比赛ID输入框
$blog_link_contests->addInput('contest_id', 'text', '比赛ID', '',
function ($x) {
if (!validateUInt($x)) return 'ID不合法';
if (!queryContest($x)) return '比赛不存在';
return '';
},
null
);
- 字段名:
contest_id
- 类型:
text
- 标签:
比赛ID
- 默认值:空字符串
- 验证函数:匿名函数,验证ID合法性,并检查比赛是否存在
添加标题输入框
$blog_link_contests->addInput('title', 'text', '标题', '',
function ($x) {
return '';
},
null
);
- 字段名:
title
- 类型:
text
- 标签:
标题
- 默认值:空字符串
- 验证函数:匿名函数,不进行验证
添加操作类型选择框
$options = array(
'add' => '添加',
'del' => '删除'
);
$blog_link_contests->addSelect('op-type', $options, '操作类型', '');
- 字段名:
op-type
- 选项:
添加
和删除
- 标签:
操作类型
- 默认值:空字符串
表单处理函数
$blog_link_contests->handle = function() {
$blog_id = $_POST['blog_id'];
$contest_id = $_POST['contest_id'];
$str = DB::selectFirst(("select * from contests where id='${contest_id}'"));
$all_config = json_decode($str['extra_config'], true);
$config = $all_config['links'];
$n = count($config);
if ($_POST['op-type'] == 'add') {
$row = array();
$row[0] = $_POST['title'];
$row[1] = $blog_id;
$config[$n] = $row;
}
if ($_POST['op-type'] == 'del') {
for ($i = 0; $i < $n; $i++)
if ($config[$i][1] == $blog_id) {
$config[$i] = $config[$n - 1];
unset($config[$n - 1]);
break;
}
}
$all_config['links'] = $config;
$str = json_encode($all_config);
$str = DB::escape($str);
DB::query("update contests set extra_config='${str}' where id='${contest_id}'");
};
根据选择的操作类型(添加或删除)对比赛的 extra_config
字段进行更新:
- 添加:将博客ID和标题添加到比赛的关联列表中
- 删除:从比赛的关联列表中移除指定的博客ID
运行表单
$blog_link_contests->runAtServer();
调用 runAtServer()
方法,使表单在服务器上运行,处理用户提交的数据。
博客首页置顶管理表单
$blog_link_index = new UOJForm('blog_link_index');
创建一个新的表单对象,用于管理博客在首页的置顶级别。
添加博客ID输入框
$blog_link_index->addInput('blog_id2', 'text', '博客ID', '',
function ($x) {
if (!validateUInt($x)) return 'ID不合法';
if (!queryBlog($x)) return '博客不存在';
return '';
},
null
);
- 字段名:
blog_id2
- 类型:
text
- 标签:
博客ID
- 默认值:空字符串
- 验证函数:匿名函数,验证ID合法性,并检查博客是否存在
添加置顶级别输入框
$blog_link_index->addInput('blog_level', 'text', '置顶级别(删除不用填)', '0',
function ($x) {
if (!validateUInt($x)) return '数字不合法';
if ($x > 3) return '该级别不存在';
return '';
},
null
);
- 字段名:
blog_level
- 类型:
text
- 标签:
置顶级别(删除不用填)
- 默认值:
0
- 验证函数:匿名函数,验证级别合法性,并检查级别是否存在
添加操作类型选择框
$options = array(
'add' => '添加',
'del' => '删除'
);
$blog_link_index->addSelect('op-type2', $options, '操作类型', '');
- 字段名:
op-type2
- 选项:
添加
和删除
- 标签:
操作类型
- 默认值:空字符串
表单处理函数
$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}");
}
};
根据选择的操作类型(添加或删除)对 important_blogs
表进行更新:
- 添加:如果博客ID已存在,则更新其置顶级别,否则插入新的记录
- 删除:从
important_blogs
表中移除指定的博客ID
运行表单
$blog_link_index->runAtServer();
调用 runAtServer()
方法,使表单在服务器上运行,处理用户提交的数据。
博客删除表单
$blog_deleter = new UOJForm('blog_deleter');
创建一个新的表单对象,用于删除博客。
添加博客ID输入框
$blog_deleter->addInput('blog_del_id', 'text', '博客ID', '',
function ($x) {
if (!validateUInt($x)) {
return 'ID不合法';
}
if (!queryBlog($x)) {
return '博客不存在';
}
return '';
},
null
);
- 字段名:
blog_del_id
- 类型:
text
- 标签:
博客ID
- 默认值:空字符串
- 验证函数:匿名函数,验证ID合法性,并检查博客是否存在
表单处理函数
$blog_deleter->handle = function() {
deleteBlog($_POST['blog_del_id']);
};
调用 deleteBlog()
函数删除指定ID的博客。
运行表单
$blog_deleter->runAtServer();
调用 runAtServer()
方法,使表单在服务器上运行,处理用户提交的数据。
比赛提交删除表单
$contest_submissions_deleter = new UOJForm('contest_submissions');
创建一个新的表单对象,用于删除比赛提交记录。
添加比赛ID输入框
$contest_submissions_deleter->addInput('contest_id', 'text', '比赛ID', '',
function ($x) {
if (!validateUInt($x)) {
return 'ID不合法';
}
if (!queryContest($x)) {
return '比赛不存在';
}
return '';
},
null
);
- 字段名:
contest_id
- 类型:
text
- 标签:
比赛ID
- 默认值:空字符串
- 验证函数:匿名函数,验证ID合法性,并检查比赛是否存在
表单处理函数
$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']);
}
}
};
删除指定比赛的提交记录:
- 获取比赛信息及其相关的题目
- 遍历每个题目的提交记录
- 删除提交的文件和记录,并更新最佳AC提交记录
运行表单
$contest_submissions_deleter->runAtServer();
调用 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
);
- 字段名:
last
- 类型:
text
- 标签:
删除末尾记录
- 默认值:
5
- 验证函数:匿名函数,验证数字合法性,并将值存储在
vdata
中
表单处理函数
$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();
调用 runAtServer()
方法,使表单在服务器上运行,处理用户提交的数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端