196e8a4532
docs: 题目标签重构实施计划
...
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com >
2026-08-05 00:42:56 -06:00
9e0fb40f6c
docs: 题目标签重构设计文档
...
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com >
2026-08-05 00:24:16 -06:00
b5702147b8
feat(achievement): 成就图标从 emoji 换成 iconify 图标名
...
机房的老浏览器缺 emoji 字体,成就图标会渲染成方块。改存 iconify
图标名(noto 集,Noto Color Emoji 的 SVG 版),前端渲染成 SVG,
和浏览器字体无关,视觉上与原 emoji 基本一致。
隐藏成就的遮罩图标一并改成 noto:red-question-mark。
迁移 0002 带 77 条 emoji → noto 映射,覆盖首批成就用到的全部图标;
表里没有的保持原值,前端按纯文本兜底,之后在后台手工补。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 19:20:02 -06:00
cf5c3c5d2f
fix(achievement): 管理接口序列化 create_time 为字符串
...
_serialize 是手写 dict 而非 DRF 序列化器,原始 datetime 交给
JSON 编码器抛 TypeError,导致整个管理接口 500。
表为空时列表接口看着正常(不进循环),一旦有数据就全挂——
生产环境表现为:新建成就实际写库成功,但返回响应时炸掉,
前端弹窗不关、列表刷不出来,看起来像保存失败,于是重复点击建出多条。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 09:56:16 -06:00
1504164ae8
fix(achievement): distinct() 前必须 order_by() 清掉默认排序
...
Submission.Meta 有 ordering=("-create_time",),Django 会把排序字段
并入 DISTINCT,导致 _languages 每条提交各成一行——生产环境实测
某用户 659 条而不是 5 种语言。
recompute 侥幸正确只因 .count() 会清排序,两个实现同一个量却不一致。
三处 distinct() 全部显式加 order_by()。
由 check_achievement_deploy 的自检项发现。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 09:50:19 -06:00
f95c3a8bae
docs: 成就系统上线与运维文档
...
部署步骤、日常运维(加成就/加指标/定期检查)、
出问题的处置、已知未验证部分与遗留问题。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 07:30:51 -06:00
8ada9f72ed
feat(achievement): 添加部署后自检命令
...
只读,覆盖那些错了也不报错的地方:极小值指标对零 AC 用户是否返回 None、
JSONB 阈值比较是否按整数、重算是否重建了增量辅助键、
unlock_count 是否与实际解锁人数一致、是否有疑似配错阈值的成就。
这套系统开发全程无数据库,后端逻辑只经过纸面审查,这些是静态审查抓不到的部分。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 07:27:29 -06:00
8ecfeb5e36
fix(problemset): 奖章判定修复 N+1 与并发冲突并接入通知
2026-08-04 04:40:17 -06:00
1ef681d5e9
fix(achievement): 重算时重建增量辅助键,避免指标回退
2026-08-04 01:39:29 -06:00
72fec2ca61
fix(plan): 重算必须重建增量辅助键
...
原计划断言四个依赖辅助键的指标都受 max 语义保护、重算后不会回退,
实测只有 max_ac_streak_days 的最大值成立。另外三个的 on_submission
完全从辅助结构推导,辅助键一丢下次提交就打回 1,上线当天即触发。
新增 BaseMetric.recompute_state 钩子由指标各自重建。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 01:36:41 -06:00
13e2f6df08
feat(achievement): 添加全量重算管理命令
...
新增 recompute_achievements 管理命令:全量重算所有指标并按补发语义
解锁成就,用于首次上线补发存量用户、指标口径变更后重算,以及增量
逻辑漂移时的安全网。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 01:33:20 -06:00
d14251b53d
fix(achievement): 补发标记 backfilled、放宽补发触发条件、校验稀有度
2026-08-04 01:28:31 -06:00
054d4d5c32
fix(plan): 修正补发触发条件与 backfilled 标记
...
三处缺陷:rescan 从未传 backfilled=True(字段形同虚设);
loosened 谓词漏掉改 metric 和从下架转上架两种情况。
改为只要 metric/operator/threshold/visible 有变化就补发——
补发幂等,多跑一次只花一次扫描,漏跑是学生该得没得。
另补 rarity 的取值校验。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 01:27:09 -06:00
46e5d774f1
feat(achievement): 添加管理侧成就 API 与阈值补发
2026-08-04 01:20:58 -06:00
b9caf55c4c
fix(achievement): 隐藏成就的条件字段一并遮码
2026-08-04 01:14:52 -06:00
562cf4f0b4
fix(plan): 隐藏成就的条件字段也必须遮码
...
只遮名称和描述、却明文下发 metric/operator/threshold,
学生打开 DevTools 就能看到达成条件,隐藏成就失去意义。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 01:14:07 -06:00
1d66e2be1f
feat(achievement): 添加用户侧成就 API
...
新增 achievements 列表、summary、pending 三个用户侧端点,隐藏未解锁成就
在序列化层打码(name/description/icon 替换为占位符,不下发 progress)。
2026-08-04 01:12:16 -06:00
8ce3660c87
fix(achievement): 元指标回写改为重新取锁重读,避免丢失更新
2026-08-04 01:08:06 -06:00
73789bda0c
fix(plan): 修正元指标回写的丢失更新缺陷
...
第二轮 stat.save() 在锁外整体写回解锁前的快照,
并发判题时会覆盖掉另一条链路刚提交的指标增量。
改为重新取锁、重读、只合并元指标的 key。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 01:07:21 -06:00
95bf02efbd
feat(achievement): 添加判定核心、通知模块并接入判题链路
2026-08-04 01:02:29 -06:00
9e0bc1fa8c
fix(plan): 修正 unlock() 的并发重复计数缺陷
...
bulk_create(ignore_conflicts=True) 无法区分新建与已存在,
并发判题时会重复累加 unlock_count 并重复推送通知。
改为逐条 get_or_create,以 was_created 为唯一判据。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 00:59:49 -06:00
c1081e6193
fix(achievement): 指标的 AC 口径改用 is_accepted,与全项目一致
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 00:56:32 -06:00
d9840910e6
feat(achievement): 添加指标注册表与 16 个内置指标
...
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 00:49:49 -06:00
456c435289
feat(achievement): 添加成就系统数据模型
2026-08-04 00:44:35 -06:00
d4d700782b
docs: 成就系统实施计划
...
13 个任务、75 个步骤,覆盖后端 app、指标注册表、判定任务、
用户与管理 API、重算命令、题单奖章接入,以及前端奖杯馆、
全局弹窗、炫耀入口和管理配置页。
按项目规定不含测试步骤,每个任务以可执行的验证命令替代。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-04 00:03:02 -06:00
8d9dc7b521
docs: 修订成就系统设计,修复对现有代码的错误假设
...
- 解锁通知改推拉结合:WebSocket 非常驻连接,纯推会丢消息,
以 UserAchievement.notified + pending 端点为主通道
- 记录 push_to_user 复用 submission_update handler 的冲突,
useSubmissionMonitor 需按 type 过滤
- 定义 achievement_unlocked_count 元指标及两轮判定上限,解决自引用
- 明确比赛提交不计入成就(contest_joined 除外)
- 判定任务投递点精确到 judge_task 末尾,避免漏掉比赛分支
- 移除无用例的 eq operator
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-03 23:51:08 -06:00
c51e9332d1
docs: 成就系统设计方案
...
日式游戏风格的全站成就系统设计:代码注册指标、后台配置条件、
判题后异步判定、前端奖杯馆。与现有题单奖章分层共存。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com >
2026-08-03 23:46:55 -06:00
75ff10d9fe
fix
2026-07-26 07:21:56 -06:00
224960ac0f
fix
2026-07-26 07:20:16 -06:00
66fac1f66d
update
2026-07-05 03:12:34 -06:00
70fed2d15d
fix
2026-07-05 01:33:33 -06:00
10af0256b8
移除 OI 残留:UserProfile 的 oi_problems_status / total_score / add_score
...
判题不再写入 OI 相关状态后,UserProfile 上的 OI 字段永远为空/为 0:
- 删除 oi_problems_status、total_score 两列及 add_score() 方法
- ProfileProblemDisplayIDRefreshAPI 去掉 oi_problems 合并分支
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-07-04 11:40:45 -06:00
9535b64a4b
精简 Problem 模型:移除 rule_type / total_score / io_mode
...
系统只用 ACM 模式且题目固定标准 IO,这三列已无实际用途:
- rule_type / total_score:OI 专用,删除后 judge/dispatcher 的 OI 分支全部塌缩为 ACM
- io_mode:判题改为固定发送 Standard IO 常量;languages.py 的 seccomp_rule
保留 dict 形态但改用字面量 key,不改判题机 wire 契约
- prompt 字段保留(预留给未来 AI 分析)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com >
2026-07-04 11:40:38 -06:00
4743b0398a
update
2026-07-04 11:07:24 -06:00
deae73cd88
feat: SQL 题测试点脚本回显接口
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 19:29:51 -06:00
803d6ca58d
feat: SQL 题测试点预览接口
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 19:25:47 -06:00
f77b98d4d7
fix
2026-07-03 18:34:12 -06:00
fc09d291a7
fix
2026-07-03 18:28:25 -06:00
979c709333
fix
2026-07-03 18:19:16 -06:00
16ec78beae
feat: SQL 提交前自动格式化(sqlparse)
...
- format_code 新增 sql 分支,reindent + 关键字大写
- FormatCodeSerializer 的 language choices 加入 sql
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 10:05:38 -06:00
2ec036ac37
feat: 新增 rebuild_sql_display 管理命令,为存量 SQL 题回填展示数据
...
生成逻辑从 ProblemBase._build_sql_display 提取为 problem.utils.generate_sql_display,
管理端保存与回填命令共用。命令支持 --dry-run / --force。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 09:42:11 -06:00
5af9d67fe2
fix: 终审修复——test_case_id 格式校验、modify 空变更报错、异常兜底与文档补充
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 06:26:00 -06:00
67079b5304
fix: _build_sql_display 兜底 info 结构损坏,避免 KeyError 导致 500
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 01:22:27 -06:00
06642b8131
feat: 保存 SQL 题时自动生成 sql_display 展示数据
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 01:15:58 -06:00
90531720bb
fix: build_display modify 模式补齐被 DROP 的表条目
...
标准答案 DROP 表后该表不在 sqlite_master 中,changed_tables 会静默
遗漏;用初始展示数据补齐并标记 dropped=True。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 01:10:04 -06:00
09501469e2
feat: SQL 题展示数据生成 build_display
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 01:01:32 -06:00
caec69c809
docs: SQL 题数据化展示实施计划
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 00:56:10 -06:00
e244030e7a
docs: SQL 题数据化展示设计文档
...
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-03 00:49:03 -06:00
1e6041d13d
fix
2026-07-02 19:16:09 -06:00
9f7f818d51
新增 SQL 题型:SQLite 内联判题(不依赖外部沙箱)
...
- SQL 作为语言接入现有提交流程,judge_task 按 language 分流到 SQLJudgeDispatcher
- judge/sql_runner.py:内存 SQLite 判题核心,查询题比结果集/增删改题比表状态,
authorizer + progress_handler + max_page_count 三重防护
- dispatcher 提取 _process_judge_result/_push_status 供 SQL 判题复用(行为不变)
- 测试点通道支持 1.sql..N.sql 压缩包,出题只需数据脚本+标准答案
- Problem 增加 sql_config 字段;options 数据迁移注册 SQL 语言
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-02 17:23:13 -06:00