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.json
的 cache_size
后重启即可。