fix(AI提示): 解锁条件前后端对齐,提示不再一点就没
Deploy / deploy (push) Has been cancelled

「失败 3 次解锁 AI 提示」实际是「在当前这次页面会话里再失败 3 次」:
problemStore.failCount 是个从 0 起数的内存计数器,刷新、切题、跳进跳出就归零,
而后端闸门数的是数据库里的历史失败数,两边根本不是一回事。昨天在这题上撞了
十次墙的学生今天进来照样看不到按钮。

- 数法收成一个 countFailedSubmissions(),题目详情的 myFailedCount 和
  POST /ai/hint 共用。原来详情把「等待/正在评分」也算失败,连点三次提交就能
  把按钮点亮,点下去却回 hint-locked
- 阈值 3 挪进契约 HINT_MIN_FAILURES,两端引用同一个常量
- failCount 改成 myFailedCount + 本次会话增量;在题目页里登录的补拉一次详情,
  否则停在匿名时的 0
- 结果面板改 display-directive="show",不再一收起来就把流式输出中的提示连同
  那次 LLM 调用一起作废;补「上次结果」按钮,原来唯一的重开方式是再提交一次
- prompt 里的判题结果翻成中文,原来拼的是裸状态码,模型不知道 -1 是什么
- system_error 不计入失败数、也不显示按钮:判题机自己崩了不是学生的问题
- 比赛中不给提示,和「求助」按钮同一个口径

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RC5uL72UY9aZFuTvUKe2jv
This commit is contained in:
xuyueandClaude Opus 5 committed 2026-09-06 07:24:26 -06:00
1 parent 2e78b6efdf
commit bb0f5ec5ef
10 files changed
+172 -34

No files matched your search

+37
View File
@@ -18,3 +18,40 @@ export type JudgeStatusValue = (typeof JudgeStatus)[keyof typeof JudgeStatus]
export function isAccepted(result: number) {
return result === JudgeStatus.ACCEPTED || result === JudgeStatus.AST_CHECK_FAILED
}
/**
* 判题状态的中文名,和前端 `utils/constants.ts` 的 `JUDGE_STATUS` 一致,两边必须同步。
* 目前只用在喂给模型的 prompt 里 —— 原来那里拼的是裸状态码(`结果:-1`),
* 模型根本不知道 -1 是「答案错误」还是别的什么,等于白给一条信息。
*/
export const JUDGE_STATUS_NAME: Record<number, string> = {
[JudgeStatus.COMPILE_ERROR]: "编译失败",
[JudgeStatus.WRONG_ANSWER]: "答案错误",
[JudgeStatus.ACCEPTED]: "答案正确",
[JudgeStatus.CPU_TIME_LIMIT_EXCEEDED]: "运行超时",
[JudgeStatus.REAL_TIME_LIMIT_EXCEEDED]: "运行超时",
[JudgeStatus.MEMORY_LIMIT_EXCEEDED]: "内存超限",
[JudgeStatus.RUNTIME_ERROR]: "运行时错误",
[JudgeStatus.SYSTEM_ERROR]: "系统错误",
[JudgeStatus.PENDING]: "等待评分",
[JudgeStatus.JUDGING]: "正在评分",
[JudgeStatus.PARTIALLY_ACCEPTED]: "部分正确",
[JudgeStatus.AST_CHECK_FAILED]: "答案正确,但语法未通过",
}
export function judgeStatusName(result: number) {
return JUDGE_STATUS_NAME[result] ?? `未知状态(${result})`
}
/**
* **不**计入「这道题失败了几次」的状态。除了通过(含 AST_CHECK_FAILED,那也是答案对了)
* 和还没判完的两个,还排掉 SYSTEM_ERROR —— 判题机自己崩了不是学生的问题,
* 不该推着 AI 提示的解锁进度往前走。
*/
export const NON_FAILURE_RESULTS: number[] = [
JudgeStatus.ACCEPTED,
JudgeStatus.AST_CHECK_FAILED,
JudgeStatus.PENDING,
JudgeStatus.JUDGING,
JudgeStatus.SYSTEM_ERROR,
]