创新实训(四)系统管理功能

系统管理功能

在管理员权限下,用户可以对系统进行一些权限的修改,包括对用户和对博客总体的管理。
这部分代码实现主要在super_manage.php文件中

用户管理

对用户权限的设置,分为三种:普通用户,封禁用户和超级用户,不同用户权限不同,在下方还有一个封禁名单展示。
image
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
);
  1. 字段名:'username'
  2. 类型:'text'
  3. 标签:'用户名'
  4. 默认值:空字符串
  5. 验证函数:匿名函数,验证用户名是否合法,并检查用户是否存在
    • 调用 validateUsername($username) 验证用户名是否合法
    • 调用 queryUser($username) 查询用户是否存在

添加操作类型选择框

$options = array(
    'banneduser' => '设为封禁用户',
    'normaluser' => '设为普通用户',
    'superuser' => '设为超级用户'
);
$user_form->addSelect('op-type', $options, '操作类型', '');
  1. 字段名:'op-type'
  2. 选项:包含'设为封禁用户'、'设为普通用户'、'设为超级用户'
  3. 标签:'操作类型'
  4. 默认值:空字符串

表单处理函数

$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对博客进行管理,包括添加到比赛链接或公告,或者删除博客
image
image

博客与比赛关联管理表单

$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() 方法,使表单在服务器上运行,处理用户提交的数据。

posted @   贺丁  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示