feat(题目): 结果标题说清楚错在哪——「在例子 1 上就错了」「所有测试点都对了」,答错时附上题目对输出的原话

- 在公开例子上就错了的:标题写「答案错误 · 在例子 N 上就错了」,不再挂「通过 x/y 个测试点」
  和进度条 —— 那时候那个数字没意义,先把例子跑对
- 做对了:「答案正确 · 所有测试点都对了」
- 答案错误的说明末尾摆出题目「输出」那一节的原话:格式不对、漏了一行这类错,对着原话一看就明白
- 例子都对、错在隐藏测试点的,给「去自己输入试试」(SQL 题不给,跑不了)
- 提交详情页的标题不变

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-09-28 19:03:13 +08:00
1 parent b4afcbd47f
commit 8f0d39bb5a
2 files changed
+110 -10

No files matched your search

@@ -145,6 +145,41 @@ const msg = computed(() => {
// 这是学生这边唯一能看出「比上次多过了几个点」的地方。
const partialCases = computed(() => submissionPartialCases(props.submission))
/** 在公开的例子上就错了:这时候「通过 x/y 个测试点」没意义,先说是哪个例子 */
const failedOnSample = computed(() =>
sampleCheck.value && !sampleCheck.value.passed ? sampleCheck.value : null,
)
/**
* 结果标题(设计文档第 6 节)。比「答案错误 · 通过 1/3 个测试点」多走一步:
* 例子上就错了的说「在例子 N 上就错了」,例子都对的才报测试点;做对了说全对了。
* 提交详情页还用通用的 submissionResultTitle
*/
const title = computed(() => {
const submission = props.submission
if (!submission) return ""
if (submission.result === SubmissionStatus.accepted) return "答案正确 · 所有测试点都对了"
if (failedOnSample.value) {
return `答案错误 · 在例子 ${(failedOnSample.value.index ?? 0) + 1} 上就错了`
}
const cases = hiddenCases.value
if (cases) return `答案错误 · 通过 ${cases.passed}/${cases.total} 个测试点`
return submissionResultTitle(submission)
})
/**
* 例子都对了、错在隐藏的测试点上:一个都没过也要报「通过 0/5」—— 那正说明例子之外的全错了。
* 其余情况沿用 submissionPartialCases(一个都没过就不报)
*/
const hiddenCases = computed(() => {
const summary = props.submission?.caseSummary
if (!sampleCheck.value?.passed || !summary || summary.passed >= summary.total) return null
return summary
})
const progressCases = computed(
() => hiddenCases.value ?? (failedOnSample.value ? null : partialCases.value),
)
// 是否显示AI提示区域。
// 阈值和后端 POST /ai/hint 共用契约里的 HINT_MIN_FAILURES,别在这里写死数字;
// 编译失败不数次数,和后端同口径(理由见 HINT_MIN_FAILURES 的注释);
@@ -214,16 +249,12 @@ const columns: DataTableColumn<JudgeCaseResult>[] = [
<template>
<div v-if="submission">
<n-alert
:type="JUDGE_STATUS[submission.result]['type']"
:title="submissionResultTitle(submission)"
class="mb-3"
>
<template v-if="partialCases" #default>
<n-alert :type="JUDGE_STATUS[submission.result]['type']" :title="title" class="mb-3">
<template v-if="progressCases" #default>
<n-progress
type="line"
status="success"
:percentage="(partialCases.passed / partialCases.total) * 100"
:percentage="(progressCases.passed / progressCases.total) * 100"
:show-indicator="false"
/>
</template>
@@ -248,6 +279,7 @@ const columns: DataTableColumn<JudgeCaseResult>[] = [
<RuntimeErrorExplain v-if="runtimeError" :info="runtimeError" :code="submission.code" />
<WrongAnswerExplain
v-if="sampleCheck"
full
:check="sampleCheck"
:code="submission.code"
:language="submission.language"