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
的网页端!