Commit Graph

15 Commits

Author SHA1 Message Date
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
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
1ef681d5e9 fix(achievement): 重算时重建增量辅助键,避免指标回退 2026-08-04 01:39:29 -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
46e5d774f1 feat(achievement): 添加管理侧成就 API 与阈值补发 2026-08-04 01:20:58 -06:00
b9caf55c4c fix(achievement): 隐藏成就的条件字段一并遮码 2026-08-04 01:14:52 -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
95bf02efbd feat(achievement): 添加判定核心、通知模块并接入判题链路 2026-08-04 01:02:29 -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