syzoj 添加审核功能

syzoj 添加审核功能

先决条件
1.安装了 syzoj
2.是最新版
3.能正常运行
注意!本教程所在目录是在 syzoj 安装目录的 web 目录

开始!

models\user.ts 文件的 register_time: number; 的下面添加代码:

@TypeORM.Column({ nullable: true, type: "boolean", default: false })
  pending: boolean;

注意 register_time: number; 与添加的代码之间有一行空格!


modules\admin.js 文件的最后添加代码:

app.post('/admin/user', async (req, res) => {

  try {

    if (!res.locals.user || !res.locals.user.is_admin) throw new ErrorMessage('您没有权限进行此操作。');

    let pending_user = await User.find ();

    res.render('admin_user', {

    is_logined: !!res.locals.user,

    allowedManage: res.locals.user && await res.locals.user.hasPrivilege('manage_user'),

    pending_user: pending_user

    });

  } catch (e) {

    syzoj.log(e);

    res.render('error', {

      err: e

    })

  }

});


app.get('/admin/user', async (req, res) => {

  try {

    if (!res.locals.user || !res.locals.user.is_admin) throw new ErrorMessage('您没有权限进行此操作。');


    let pending_user = await User.find ();

    res.render('admin_user', {

    is_logined: !!res.locals.user,

    allowedManage: res.locals.user && await res.locals.user.hasPrivilege('manage_user'),

    pending_user: pending_user

    });

  } catch (e) {

    syzoj.log(e);

    res.render('error', {

      err: e

    })

  }

});

views\admin_header.ejs 中将 let items = { ...... } 括号中的内容替换为代码:

info: '统计信息',
config: '系统配置',
user: '用户管理',
privilege: '权限管理',
rejudge: '一键重测',
links: '友链管理',
rating: '积分管理',
other: '其他操作'

views 目录中添加文件 admin_user.ejs 文件内容:

<% this.adminPage = 'user'; %>
<% include admin_header %>
<% if (is_logined && allowedManage && pending_user && pending_user.length) { %>
<div class="ui bottom attached segment">
<h4 class="ui top attached block header"><i class="user icon"></i>待审核用户</h4>
    <table class="ui very basic center aligned table" style="table-layout: fixed; ">
      <tbody>
        <%
        for (let i = 0; i < pending_user.length; i++) {
          let user = pending_user[i];
        %>
          <% if (user.is_admin != 1) { %>
          <tr id = "<%= user.username %>">
            <td style="text-align:left;"><span class="user-name user-blue"><%= user.username %></span><span class="user-gray user-nameplate"><%= user.nameplate %></span></td>
            <td style="width: 90px;">
              <% if ( user.pending != 1 ) { %>
              <a style="width: 35px; padding-right: 5px; padding-left: 5px; padding-top: 5px; padding-bottom: 5px" class="ui mini green right button" οnclick=userAllow("<%= user.username %>")>
                通过
              </a>
              <% } else  { %>
              <a style="width: 35px; padding-right: 5px; padding-left: 5px; padding-top: 5px; padding-bottom: 5px" class="ui mini gray right button" οnclick=userBlock("<%= user.username %>")>
                忽略
              </a>
              <% } %>
            </td>
          </tr>
        <% } %>
        <% } %>
      </tbody>
    </table>
  </div>
<% } %>

<script>
function userAllow (username) {
  $.ajax({
    url: '/api/allow_user/' + username,
    type: 'POST',
    async: true
  });

}
function userBlock (username) {
  $.ajax({
    url: '/api/block_user/' + username,
    type: 'POST',
    async: true
  });

}

</script>
<% include admin_footer %>

( 参考了博文 SYZOJ 部署&魔改记录 中的前端部分 )


modules\api.js 中的 app.post('/api/sign_up', async (req, res) 找到代码:

user = await User.create({
  .......
});

将括号内的替换为代码:

username: req.body.username,
password: req.body.password,
email: req.body.email,
is_show: syzoj.config.default.user.show,
rating: syzoj.config.default.user.rating,
register_time: parseInt((new Date()).getTime() / 1000),
pending: false

然后删除下面的两行代码:

req.session.user_id = user.id;
setLoginCookie(user.username, user.password, res);
And

再找到 app.post('/api/login', async (req, res) 中的代码:

if (!user) throw 1001;

在下面插入代码:

else if (user.pending == 0) throw 1004;

views\login.ejs 文件中的 login() 函数( script 部分)找到代码:

switch (error_code) {
    ....
}

将括号内替换为d代码:

switch (error_code) {
    case 1001:
        show_error("用户不存在");
        break;
    case 1002:
        show_error("密码错误");
        break;
    case 1003:
        show_error("您尚未设置密码,请通过下方「找回密码」来设置您的密码。");
        break;
    case 1004:
        show_error("您尚未通过审核,请联系管理员审核");
        break;
    case 1:
        success(data.session_id);
        return;
    default:
        show_error("未知错误");
        break;
}

And then… 最后一步

syzoj 安装目录的 web 目录执行命令:

yarn

重启 syzoj 的网页端!

Over!

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!针对您的问题,我可以为您提供一个使用动态规划和二分法解决最大子段和问题的算法。 首先,让我们定义一个函数`dp`来表示以`mid`为中点的最大子段和。我们可以使用动态规划来计算`dp`的值。 1. 首先,我们定义一个数组`sum`,其中`sum[i]`表示以索引`i`结尾的子段的和。 2. 然后,我们初始化`dp`数组,将所有元素初始化为负无穷,即`dp[i] = -∞`。 3. 接下来,我们从左到右遍历数组,计算每个`sum[i]`的值,并更新`dp[i]`的值: - 如果`i`等于0,则`dp[i]`等于`sum[i]`。 - 否则,`dp[i]`等于`max(dp[i-1] + sum[i], sum[i])`,即选择继续扩展前一个子段或者从当前位置开始一个新的子段。 4. 在计算`dp`数组的过程中,我们记录最大的`dp`值,并更新最大子段和。 接下来,我们可以使用二分法来寻找最大子段和的起始和结束位置。 1. 我们定义一个函数`binary_search`,它接受一个目标值`target`和一个排序好的数组`arr`。 2. 在`binary_search`函数中,我们使用二分法来找到第一个大于等于`target`的元素的索引。 - 初始化左指针`left`为0,右指针`right`为数组长度减一。 - 当`left`小于等于`right`时,执行以下步骤: - 计算中间指针`mid`,即`(left + right) // 2`。 - 如果`arr[mid]`小于`target`,则更新`left`为`mid + 1`。 - 否则,更新`right`为`mid - 1`。 - 返回`left`作为结果。 3. 使用`binary_search`函数找到最大子段和的起始位置和结束位置。 这就是使用动态规划和二分法解决最大子段和问题的算法。希望对您有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值