fix(题目): 修掉代码审查查出的几处问题——流程图拿到的徽章不弹、点评弹窗读失败时关不掉等

- 流程图画到 A / S 拿到的题单徽章、成就原来不弹:流程图那条 WebSocket 只认评分完成 / 失败,
  成就消息被丢掉了,要等下次换路由拉 pending 才出来
- 强制点评弹窗读不出点评、或者一直交不上时,「下一题 / 继续」按钮也给出来:原来弹窗关不掉,
  只能按浏览器后退;拦下换题时就记上「继续」,按钮文字不会写错
- 「放回编辑器」走正常的换语言路子(画流程图时切回代码编辑器、读那门语言的草稿);
  这道题已经不收的语言(0020 摘掉的 Java / JS / Go)置灰,只能复制
- 举着手时刚交对、1.5 秒内点下一题:原来「确定要换题吗」要问两遍(点评完再问一次),
  现在同意过的那个地址不再问
- 课堂看板上评分中、评失败的流程图不再算「尝试过」,和学生的课堂条一个口径;
  新加的流程图查询和其他查询并行,不再多等一轮数据库
- 课堂条的数据只认最后发出的那次请求:进页面那次后到的话会把刚做完的那道盖回「没做」
- 「A / S 算做完」收进契约,前后端只留一份;协作中老师的判断统一用 useTeacherCollab;
  几处放错位置、说法过时的注释

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-09-28 19:35:07 +08:00
1 parent 10169f5792
commit 83b6b7a81a
16 files changed
+162 -99

No files matched your search

+21 -1
View File
@@ -140,9 +140,19 @@ watch(
*/
const collabStore = useCollabStore()
const dialog = useDialog()
/**
* 已经同意过要去的地方。通过之后 1.5 秒内点「下一题」:这里先问一次,接着被强制点评拦下
* (SubmissionEffects 的 holdForReview),评完再 push 同一个地址 —— 不记着的话会再问一遍,
* 第二次点「留在这道题」就成了同意换题之后又被留下
*/
let approvedTarget: string | null = null
function confirmLeavingHelp(to: RouteLocationNormalized, from: RouteLocationNormalized) {
if (collabStore.isTeacher || collabStore.helpStatus === "idle") return true
if (to.name === from.name && to.params.problemID === from.params.problemID) return true
if (approvedTarget === to.fullPath) {
approvedTarget = null
return true
}
const active = collabStore.helpStatus === "active"
return new Promise<boolean>((resolve) => {
dialog.warning({
@@ -152,7 +162,10 @@ function confirmLeavingHelp(to: RouteLocationNormalized, from: RouteLocationNorm
: "换题之后这次举手就撤掉了,要在新的题目里重新举手。确定要换吗?",
positiveText: "换题",
negativeText: "留在这道题",
onPositiveClick: () => resolve(true),
onPositiveClick: () => {
approvedTarget = to.fullPath
resolve(true)
},
onNegativeClick: () => resolve(false),
onClose: () => resolve(false),
onMaskClick: () => resolve(false),
@@ -161,6 +174,13 @@ function confirmLeavingHelp(to: RouteLocationNormalized, from: RouteLocationNorm
}
onBeforeRouteUpdate(confirmLeavingHelp)
onBeforeRouteLeave(confirmLeavingHelp)
// 到了就作废:没被点评拦下、一次就换过去的,不能留着让下次去同一道题时不再问
watch(
() => route.fullPath,
(path) => {
if (path === approvedTarget) approvedTarget = null
},
)
// 结果页签的标题带状态图标(ResultTabLabel),n-tab-pane 的 tab 接受渲染函数
const resultTab = () => h(ResultTabLabel)