syzoj-二次开发笔记

nameplate

syzoj 的数据库的 user 表有 nameplate 这个属性,代码里面也有关于 nameplate 的处理, 但是不知道为啥前端并没有给出任何关于 nameplate 的接口,自己写个前端接口就好了。

比如在 views/user_edit.ejs 里面添加关于 nameplate 的修改,然后在 modules/user.js 实现具体的修改即可。

当然不希望在前段开放接口的话也可以直接在数据库里操作。

网站图标

配置里面似乎没有?

views/header.ejs 自行添加 <link rel="icon" href="XXXXXXXX" sizes="32x32"> 即可。

一言

syzoj 的一言只选取了动画这一类,可以在 views/index.ejs 里修改,修改方式见一言官网。

添加新属性

例如给 problem 添加一个新的属性,容易想到在数据库里直接加一列。

但是这样的话每次重启服务该列会被清空,似乎每次 typeORM 会检查多余的列并删除。

models/problem.ts 和里面依葫芦画瓢加入新增的属性,然后 yarn 一遍即可。

更精细的权限管理

syzoj 题目的状态分为两种:公开和未公开;用户对于题目的权限也只有两种:普通用户和管理员。

有特殊需求的话这可能不太够,为了实现更加精细的权限管理,就需要在 problem 添加新属性,修改 models/problem.ts , 并且修改其中一些关于权限判定的函数。

这样不符合权限要求的就看不到题了,但是还是能看提交记录,为此还需要修改 models/judge_state.ts 的权限判定函数。

但是如果需求更特殊,需要限制管理员的权限的话,就更难搞。 因为管理员权限的优先级是很高的,有些地方的逻辑是只要用户有管理题目的权限就通行,而不会判断题目和用户具体的关系。

最麻烦的可能是 modules/submission.js ,事实上这里也没法逐个判断题目和用户具体的关系,所以要限制提交记录的查询, 就必须在 judge_state 上做出限制,原声版本只有 is_public 这个唯一的限制,需要更精细的话还要加上更多。

批量修改 tag

直接写 sql 语句修改 problem_tag_map 这张表,改完后会发现有一些玄学问题。

翻了源码,发现题目的标签是有缓存的,要立即生效必须清除缓存,修改 config.jsoncache_size 后重启即可。