Appearance
Web 题目编辑器
正式出题的默认入口是 Web 管理界面:在管理后台创建或编辑题目,并在题目编辑器中上传统一题目包 zip。仓库里的 problems:build / problems:import 只用于样例题与开发环境初始化,不是正式出题发布流程。
创建 / 编辑题目
入口:管理后台 →「题目」→「新建题目」,或从题目列表进入编辑。
编辑器包含以下区块:
基础信息
| 字段 | 说明 |
|---|---|
| 标题 | 必填 |
| 描述 | 必填,Markdown 格式,支持公式与代码块(题面) |
| 难度 | easy / medium / hard |
| 题型 | U 型(用户题,创建者本人与 admin 可管理)或 P 型(主题题,仅 admin) |
| 分类 | 多选,来自分类管理的层级分类 |
运行时配置(runtime_config)
双容器评测模型下,每个题目声明两个运行时的资源限制:
- Evaluator(出题人代码
evaluate.py):time_limit_ms、memory_limit_mb - Solution(用户代码
solution.py):调用超时call_timeout_ms(题目级默认值)、memory_limit_mb
配置保存在题目上,Judge Worker 评测时读取。call_timeout_ms 作为单次 SDK 调用的默认超时;出题人可在 evaluate.py 中用 runner.call(..., timeout_ms=...) 按调用覆盖(缺省时回退该默认值)。合理设置 Solution 的调用超时可以防止用户代码死循环拖垮整场评测(见评测模型)。
两层超时的状态语义:time_limit_ms 超时表示评测流程未正常完成,最终状态为 SystemError;call_timeout_ms 超时若未被 evaluator 捕获,最终状态为 TimeLimitExceeded,捕获后由 evaluator 自行决定(详见评测模型)。
统一题目包
编辑器中通过拖拽或选择文件上传统一题目包(zip):
- 仅支持
.zip格式,且带合法 zip Content-Type;大小受系统限制。 - 上传走
POST /api/v1/problems/import-bundle(multipart 文件字段file)。 - 包结构、
manifest.json、导入语义(按(type, number)匹配更新/新建、管理员可指定题号等)见统一题目包;用例目录约定见测试数据。 - 上传后可通过编辑器内的状态确认包是否已生效;管理端也可以下载或删除当前支持包。
保存与发布
保存题目后,建议按以下顺序自测:
- 确认支持包已上传且内容完整。
- 以非管理员身份提交一版参考答案,确认状态与得分符合预期。
- 检查隐藏用例的可见性是否符合预期(由 evaluator 控制)。
- 如需调整,修改后重新上传支持包,或对已提交记录触发 rejudge(管理端操作)。
模板
编辑器提供支持包模板下载(GET /api/v1/problems/:id/template),新题目可以从模板起步,避免手写包结构出错。