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 日 |
#36 在 HTTP 服务器
101 每月下载量
1.5MB
17K SLoC
The Medal Contest Platform
Medal 是一个用于在浏览器中运行竞赛的小型平台,使用 Rust 编写。
它为德国 "Jugendwettbewerb Informatik" 设计,这是一个使用 Google Blockly 作为编程语言替代品的计算机科学竞赛。
在 jwinf.de 上尝试。
屏幕截图
翻译
目前 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
。
需要 rustc
和 cargo
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.rs
,src/db_objects.rs
为核心逻辑提供数据库抽象。
src/db_conn_*.rs
为不同的数据库类型实现数据库抽象。
src/db_conn_*.rs
文件由 generate_connectors.sh
从 src/db_conn.base.rs
和 src/db_conn_*.header.rs
生成。
其他
helpers.rs
小型辅助函数config.rs
解析配置文件contestreader_yaml.rs
解析竞赛文件db_apply_migrations.rs
读取migrations/
目录并将找到的文件应用到数据库连接器的迁移函数中
依赖关系
~56MB
~1M SLoC