权限系统
定海七中OJ/Hydro 的权限系统使用双层结构,分别为 Privilege (PRIV) 和 Permission (PERM)。
权限在系统内部使用位运算表示,具体的定义与数值可以查看 源代码。
Privilege
Privilege 是用户在整套系统内拥有的权限,在所有域均生效。如创建用户,编辑系统设置,创建域,查看域等等。
特别地,PRIV.PRIV_USER_PROFILE
控制一个账号是否能够作为普通账号登录。若不具有此权限,该账号将无法登录(被封禁)。
常见需求:
- 若不想让普通用户上传文件 可以关闭default角色的
PRIV_CREATE_FILE
权限
- 若需要关闭站内消息 可以关闭对应的
PRIV_SEND_MESSAGE
权限
Permission
Permission 是用户在单个域内拥有的权限,如创建题目/比赛,发布/删除讨论等等。
如果 PERM.PERM_VIEW
被禁用,则该用户无法查看此域。
角色
通常我们需要给特定的一组用户分配相同的权限。在用户量较多的时候这会非常混乱难以管理,为此我们设计了【角色】,便于批量操作与管理。
角色是针对域内权限(PERM)的。在系统内置了三个角色:
- guest (对未登录用户生效,含已封禁用户)
- default (对所有未指定角色的用户生效,包括未加入域的用户)
- root (拥有所有权限)
通常情况下,如果需要对域做特殊的权限控制,应当新建一个用户组(例如 member)并将选定用户加入该用户组。
将角色移出域和将用户的角色设置为 default 是等价的。
若有需要,您也可以创建 teacher, admin 等其他角色。
考虑到系统中的用户可能非常多(数万甚至数十万),在用户列表中仅会显示权限不为 default 的用户。
加入域
加入域的过程实际上是 用户通过某种方式自助将自己的权限组由 default 变更到另一权限组(如member) 的过程。
因此在入域申请链接的权限组中选择 guest 和 default 是没有意义的。
导入用户
目前仅支持的 csv 格式导入, csv 文件既可以用文本编辑器创建,也可以用 Excel 等软件来辅助创建。
每行三列或四列,分别为: 邮箱,用户名,密码,显示名。(显示名为可选)
请使用 UTF-8 编码,否则中文可能会乱码。
dh7zoj@dh7zoj.top,b07210107,123456
dh7zoj@dh7zoj.top,b07210107,123456,站长
这将创建两个用户:
b07210107
密码为 123456
, 邮箱 dh7zoj@dh7zoj.top
;
b07210107
密码为 123456
,邮箱 dh7zoj@dh7zoj.top
,显示名为 站长
;
注意:
用户创建后无法删除,请谨慎操作
域
简介
域,可以理解为 OJ 中的 OJ。
用户有权限为自己创建多个域。(取决于用户组设定,需要 PRIV_CREATE_DOMAIN 权限)。
同一 定海七中OJ 实例上的多个域间完全独立,仅用户信息相通(您在一个 定海七中OJ 实例上注册账户后,在该实例的所有域中均有效)。
创建域
登录账号后,在“我的”选项卡中找到“我的域”,并点击“创建域”,填入以下信息:
- ID: 每个域有一个唯一的 ID,将会在域 URL 中体现。创建后无法修改。
- 名称: 域的名字,创建后可以更改。
- 公告: 域主页上显示的公告,创建后可以更改。
- avatar: 域头像,与用户头像同理,可以使用
gravatar:email
或 qq:id
或 github:name
或 url:link
的格式添加。将会在“我的域”界面内显示。
创建域后,您将在此域中拥有管理员权限,可以在域内进行添加题目/创建比赛等操作。
初始化讨论节点
您可以在“管理域”选项卡中点击“初始化讨论节点”按钮初始化讨论节点。
访问控制
未登录用户将默认使用 guest
权限,登录用户将默认使用 default
权限。(所以将登陆用户设为 default
权限后并不会显示在“管理用户”页内,这也表示所有用户默认不会出现在管理列表中)
所以将一个用户的权限设为 default
和将用户移出该域是等价的。
对于不在列表中的用户,点击右上角“添加用户”,在左侧选中用户,右侧选择权限组,再点击“确定”即可。
创建比赛
若您想要创建比赛,您可以在“比赛”选项卡中点击“创建一个比赛”按钮,并填写:
- 规则;
- 标题;
- 开始日期,时间;
- 持续时间;
- 题目: 此比赛包含的题目的 ID,若有多个则用逗号分隔;
- 内容: 该比赛的详细介绍;
- 是否 Rated: 该比赛是否会改变参加选手的 RP。
设置完后可点击“创建”按钮创建比赛。
在比赛中可以进入 /contest/<id>/broadcast
(即比赛公告页网址后面加一个 /broadcast
) 对所有参赛选手发布比赛公告,所有参与比赛的选手已打开的比赛页面将弹出公告弹窗。
tip:若因为删除比赛内题目导致比赛无法打开,可以通过 /contest/<id>/edit
(即比赛页面后加上 /edit
)直接访问比赛编辑页并修正配置文件。
创建作业
若您想要创建作业,您可以在“作业”选项卡中点击“创建作业”按钮,并填写:
- 标题;
- 开始日期、时间;
- 结束日期、时间;
- 最长延期;
- 延期递交扣分规则;
- 题目:此作业包含的题目的 ID,若有多个则用逗号分隔;
- 内容:该作业的详细介绍。
之后点击“创建”按钮进行创建。
tip:若因为删除作业内题目导致作业无法打开,可以通过 /homework/<id>/edit
(即作业页面后加上 /edit
)直接访问作业编辑页并修正配置文件。
创建训练
若您想要创建训练,您可以在“训练” 项卡中点击“新建训练计划”,填写以下信息:
- 标题:该训练的标题;
- 简介:该训练的简介,会与标题同时显示在列表页面中;
- 说明:该训练的详细信息;
- 计划:该训练的具体题目及计划信息,其格式如下:
[
{章节详细信息},
{章节详细信息},
...
{章节详细信息}
]
其中,“章节详细信息”的包含以下部分:
_id
:章节数字编号;
title
:章节标题;
requireNids
:训练此章节之前需要完成的章节数字编号,若无要求则留空,若有多个则使用逗号分隔;
pids
:此章节中包含的题目的 ID,若有多个则使用逗号分隔。
举例:若要在训练中创建三个章节,章节中分别有 ID 为 1,2,3 的题目。其中章节一、二无前置条件,章节三需要同时完成章节一、二后才能进行,则格式如下:
[
{
"_id": 1,
"title": "入门",
"requireNids": [],
"pids": [1]
},
{
"_id": 2,
"title": "精通",
"requireNids": [],
"pids": [2]
},
{
"_id": 3,
"title": "大师",
"requireNids": [1,2],
"pids": [3]
}
]
tip:若因为删除训练计划内题目导致训练计划无法打开,可以通过 /training/<id>/edit
(即训练计划页面后加上 /edit
)直接访问训练计划编辑页并修正配置文件。
测试数据格式