权限系统

定海七中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:emailqq:idgithub:nameurl: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)直接访问训练计划编辑页并修正配置文件。

测试数据格式

测试数据格式

自动模式

tip:您可以直接选择文件(支持多选)上传或将文件拖拽至相应位置上传。
若上传文件为 zip 格式,将会自动进行解压操作。

对于一般的题目,您只需提供 .in.out/.ans 文件,以下是一个例子。
请务必确保文件名中含有数字。形如 sample.in 的文件是不会被自动识别的。

喵? tree
.
├── a1.in
├── a1.out
├── a2.in
├── a2.out
├── a3.in
└── a3.out

测试数据将被自动识别,并使用 1S 256MB 的限制。

使用配置文件

tip:推荐您通过 评测设置 在线编辑题目配置,可以拥有更好的编辑体验。

上传 config.yaml 文件即可,文件格式如下(下方所有样例均为可选项,若无说明则预填写的内容即为默认值):

# 题目类型,可以为 default(比对输出,可以含spj), objective(客观题), interactive(交互题)
type: default

# 全局时空限制(此处的限制优先级低于测试点的限制)
time: 1s
memory: 128m

# 输入输出文件名(例:使用 foo.in 和 foo.out),若使用标准 IO 删除此配置项即可
filename: foo

# 此部分设置当题目类型为 default 时生效
# 比较器类型,支持的值有 default(直接比对,忽略行末空格和文件末换行), ccr, cena, hustoj, lemon, qduoj, syzoj, testlib(比较常用)
checker_type: default
# 比较器文件(当比较器类型不为 default 时填写)
# 文件路径(位于压缩包中的路径)
# 将通过扩展名识别语言,与编译命令处一致。在默认配置下,C++ 扩展名应为 .cc 而非 .cpp
checker: chk.cc

# 此部分设置当题目类型为interactive时生效
# 交互器路径(位于压缩包中的路径)
interactor: interactor.cc

# Extra files 额外文件
# These files will be copied to the working directory 这些文件将被复制到工作目录。
# 提示:您无需手动上传 testlib.h。
user_extra_files:
  - extra_input.txt
judge_extra_files:
  - extra_file.txt

# Test Cases 测试数据列表
# If neither CASES or SUBTASKS are set(or config.yaml doesn't exist), judge will try to locate them automaticly.
# 如果 CASES 和 SUBTASKS 都没有设置或 config.yaml 不存在, 系统会自动尝试识别数据点。
# We support these names for auto mode: 自动识别支持以下命名方式:
# 1. [name(optional)][number].(in/out/ans)         RegExp: /^([a-zA-Z]*)([0-9]+).in$/
#   examples: 
#     - c1.in / c1.out
#     - 1.in / 1.out
#     - c1.in / c1.ans
# 2. input[number].txt / output[number].txt        RegExp: /^(input)([0-9]+).txt$/
#   - example: input1.txt / input2.txt
#
# The CASES option has higher priority than the SUBTASKS option!
# 在有 CASES 设置项时,不会读取 SUBTASKS 设置项!
#
# The CASES option has been deprecated in the new version, please use the more personalized SUBTASKS!
# CASES 已于新版本中被废弃,请使用个性化程度更高的SUBTASKS!
# score: 50     # 单个测试点分数
# time: 1s      # 时间限制
# memory: 256m  # 内存限制
# cases:
#   - input: abc.in
#     output: def.out
#   - input: ghi.in
#     output: jkl.out
# 或使用Subtask项:
subtasks:
  - score: 30
    type: min # 可选 min/max/sum,分别表示取所有测试点最小值、所有测试点最大值、所有测试点之和
    time: 1s
    memory: 64m
    cases:
      - time: 0.5s
        memory: 32m # 可对单个测试点单独设置时间限制和内存限制
        input: a.in
        output: a.out
      - input: b.in
        output: b.out
  - score: 70
    time: 0.5s
    memory: 32m
    if: [0] # 可选,传入数组,表示仅在subtask0通过时此subtask才计分
    cases:
      - input: c.in
        output: c.out
      - input: d.in
        output: d.out

# 提交语言限制
# 列举出所有本题允许使用的语言对应的代码(需要和评测机 lang.yaml 内的语言代码相同)
# 使用语言ID而非名称!对于有子类的选项,请详细至子分类!
langs:
  - c
  - cc
  - cc.cc11o2
  - pas

Elements

Text

This is bold and this is strong. This is italic and this is emphasized. This is superscript text and this is subscript text. This is underlined and this is code: for (;;) { ... }. Finally, this is a link.


Heading Level 2

Heading Level 3

Heading Level 4

Heading Level 5
Heading Level 6

Blockquote

Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan faucibus. Vestibulum ante ipsum primis in faucibus lorem ipsum dolor sit amet nullam adipiscing eu felis.

Preformatted

i = 0;

while (!deck.isInOrder()) {
    print 'Iteration ' + i;
    deck.shuffle();
    i++;
}

print 'It took ' + i + ' iterations to sort the deck.';

Lists

Unordered

  • Dolor pulvinar etiam.
  • Sagittis adipiscing.
  • Felis enim feugiat.

Alternate

  • Dolor pulvinar etiam.
  • Sagittis adipiscing.
  • Felis enim feugiat.

Ordered

  1. Dolor pulvinar etiam.
  2. Etiam vel felis viverra.
  3. Felis enim feugiat.
  4. Dolor pulvinar etiam.
  5. Etiam vel felis lorem.
  6. Felis enim et feugiat.

Icons

Actions

Table

Default

Name Description Price
Item One Ante turpis integer aliquet porttitor. 29.99
Item Two Vis ac commodo adipiscing arcu aliquet. 19.99
Item Three Morbi faucibus arcu accumsan lorem. 29.99
Item Four Vitae integer tempus condimentum. 19.99
Item Five Ante turpis integer aliquet porttitor. 29.99
100.00

Alternate

Name Description Price
Item One Ante turpis integer aliquet porttitor. 29.99
Item Two Vis ac commodo adipiscing arcu aliquet. 19.99
Item Three Morbi faucibus arcu accumsan lorem. 29.99
Item Four Vitae integer tempus condimentum. 19.99
Item Five Ante turpis integer aliquet porttitor. 29.99
100.00

Buttons

  • Disabled
  • Disabled

Form