37 个稳定版本

使用旧的 Rust 2015

1.14.5 2023 年 2 月 18 日
1.12.0 2022 年 4 月 7 日
1.10.0 2021 年 7 月 5 日
1.8.0 2021 年 2 月 3 日
0.1.0 2018 年 9 月 10 日

#36HTTP 服务器

Download history 6/week @ 2024-03-07 6/week @ 2024-03-28 1/week @ 2024-04-04

101 每月下载量

AGPL-3.0-or-later

1.5MB
17K SLoC

Rust 10K SLoC // 0.1% comments Handlebars 5K SLoC // 0.0% comments JavaScript 1K SLoC // 0.2% comments SQL 241 SLoC Shell 5 SLoC // 0.3% comments

Logo The Medal Contest Platform

crates.io documentation pipeline License: AGPL3

Medal 是一个用于在浏览器中运行竞赛的小型平台,使用 Rust 编写。

它为德国 "Jugendwettbewerb Informatik" 设计,这是一个使用 Google Blockly 作为编程语言替代品的计算机科学竞赛。

jwinf.de 上尝试。

用户手册(德语手册)

屏幕截图

Index Index Index Index Index Index

翻译

目前 medal 中尚未内置翻译框架,但这已在我们待办事项列表中。

如果您想将平台或其部分翻译成其他语言,请通过提交工单或发送电子邮件至 jugendwettbewerb [a.t] bwinf.de 告知我们。

文件夹结构(管理)

tasks/

包含所有任务文件和竞赛。

任务是以 HTML 格式的文件,可以直接提供并可以引用其他文件(CSS、JS、图片)。

竞赛是以 YAML 格式的文件,遵循一定的结构(参见 src/contestreader_yaml.rs)。平台启动时,将扫描整个 tasks 目录及其所有子目录中的 .yaml 文件,并将每个 .yaml 文件解析为竞赛并插入到数据库中或更新(如果文件名保持不变)。

tasks/jwinf/(使用 FIOI 任务)

为了使用在 https://jwinf.de/ 上使用的类似 france-ioi 风格的任务,必须在竞赛定义中使用 tasks/jwinf/ 中的包装文件来包装任务,以便实现任务与平台之间的通信。

此外,还需要检出仓库 https://github.com/France-ioi/bebras-modules.git,因为任务依赖于它。通常应该检出在 tasks/jwinf/_common/modules

tasks/teacher/

目录 tasks/teacher/ 可以包含一个 index.html 文件。此文件将在平台的教师区域(在iframe中)展示给教师。还可以从它链接到其他站点或文档。

templates/

文件夹 templates/ 包含不同的模板集。模板集可以在 config.json 中选择,或者通过命令行参数。默认情况下,选择模板集 default/

config.json

config.json 配置平台(见 src/config.rs)。

运行 Medal

要求

需要库 libsqlite3-dev

需要 rustccargo 1.40(稳定版)或更高版本。

Rust 可以从这里获得: https://rustup.rs/

运行

运行

make

编译并运行调试/测试服务器。

对于生产使用,应该编译一个发布二进制文件,并在反向代理(nginx、apache 等)后面提供服务。

make release

编译一个带有静态链接 openssl 的发布构建。

目录 tasks/static/ 可以(并且为了吞吐量目的应该)直接由反向代理提供。

部署

建议在反向代理后面运行平台,该代理直接提供静态文件。但是,不应该向用户提供竞赛 YAML 文件!

以下配置可以用于 Nginx 网络服务器

upstream medal {
  server [::1]:8000;
}

server {
  # Other server settings here

  location ~* \.(yaml)$ {
    deny all;
  }

  location /static {
    add_header Cache-Control "public, max-age=604800";
  }

  location /tasks {
    add_header Cache-Control "public, max-age=604800";
  }

  location / {
    proxy_pass http://medal;
  }

以下配置可以用于 Apache 2.4 网络服务器

  ServerSignature Off
  ProxyPreserveHost On
  AllowEncodedSlashes NoDecode

  ProxyPass /static/ !
  ProxyPass /tasks/ !
  ProxyPass /favicon.ico !
  ProxyPass / http://[::1]:8080/
  ProxyPassReverse / http://[::1]:8080/

  Alias "/tasks/" "/path/to/medal/tasks/"
  Alias "/static/" "/path/to/medal/static/"
  Alias "/favicon.ico" "/path/to/medal/static/images/favicon.png"

  <filesMatch "\.(css|jpe?g|png|gif|js|ico)$">
    Header set Cache-Control "max-age=604800, public"
  </filesMatch>

  <FilesMatch "\.yaml$">
    Deny from all
  </FilesMatch>

  <Directory "/path/to/medal/static/">
    Require all granted
  </Directory>

  <Directory "/path/to/medal/tasks/">
    Require all granted
  </Directory>

贡献

请使用 rustfmt 格式化您的代码,并使用 clippy 检查警告。

您可以使用以下命令安装它们

rustup component add rustfmt --toolchain nightly
rustup component add clippy

使用以下命令格式化代码并检查警告

make format
make clippy

文件夹结构(开发)

migrations/

包含所有数据库迁移。新数据库迁移将在平台启动时应用。这可以在配置中禁用,或者通过命令行开关。

src/

src/main.rs

程序的入口点和包含所有集成测试。

src/core.rs

所有 http 端点的核心逻辑。

src/webfw_iron.rs

将核心逻辑连接到网络框架(在这个案例中是 iron)。

src/db_conn.rssrc/db_objects.rs

为核心逻辑提供数据库抽象。

src/db_conn_*.rs

为不同的数据库类型实现数据库抽象。

src/db_conn_*.rs 文件由 generate_connectors.shsrc/db_conn.base.rssrc/db_conn_*.header.rs 生成。

其他

  • helpers.rs 小型辅助函数
  • config.rs 解析配置文件
  • contestreader_yaml.rs 解析竞赛文件
  • db_apply_migrations.rs 读取 migrations/ 目录并将找到的文件应用到数据库连接器的迁移函数中

依赖关系

~56MB
~1M SLoC