fix(AI提示): 解锁条件前后端对齐,提示不再一点就没
Some checks failed
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:
2026-09-06 07:24:26 -06:00
parent 2e78b6efdf
commit bb0f5ec5ef
10 changed files with 172 additions and 34 deletions

View File

@@ -172,6 +172,9 @@ async function submit() {
}
// ==================== 失败计数 ====================
// 这里只数本次会话的增量,历史失败数由 problem.myFailedCount 带进来。
// 排除的状态要和后端 judge/status.ts 的 NON_FAILURE_RESULTS 对齐,
// 尤其是 system_error —— 判题机自己崩了不该推进 AI 提示的解锁进度。
watch(
() => submission.value?.result,
(result) => {
@@ -184,7 +187,8 @@ watch(
return
if (
result !== SubmissionStatus.accepted &&
result !== SubmissionStatus.ast_check_failed
result !== SubmissionStatus.ast_check_failed &&
result !== SubmissionStatus.system_error
) {
problemStore.incrementFailCount()
}
@@ -228,9 +232,13 @@ watch(
</script>
<template>
<!-- 提交按钮 + 结果弹窗 -->
<!-- 提交按钮 + 结果弹窗
display-directive 默认是 "if"面板一收起来整个 SubmissionResult 就被卸载
正在流式输出的 AI 提示连同已经生成的内容一起没了那次 LLM 调用白花
改成 "show" 之后内容留着重新打开还是原样 -->
<n-popover
trigger="manual"
display-directive="show"
placement="bottom-end"
scrollable
:show-arrow="false"
@@ -258,6 +266,17 @@ watch(
<SubmissionResult :submission="submission" />
</n-popover>
<!-- 结果面板点一下别处就收起来 showResult 只在提交时被置 true
原来唯一的重开方式是再提交一次AI 提示读到一半去看眼题面就回不来了
只在这次会话提交过之后才出现没提交时工具栏保持原样 -->
<n-button
v-if="submission && !showResult"
:size="isDesktop ? 'medium' : 'small'"
@click="showResult = true"
>
上次结果
</n-button>
<!-- 评价弹窗 -->
<n-modal
preset="card"