feat(协作): 老师协作时右栏顶上一条协作条,结果页签先摆学生最近一次交的,抽屉变成「他的提交」

- 协作条:「正在帮 谁 · 语言 · 看他交过什么 ↗ · 结束协作」,从工具栏里挪出来,一眼看得出
  编辑器里是学生的代码。「看他交过什么」带上学生用户名、开新标签(原来只带题号,还得再筛一遍)
- 老师接单后「结果」页签原来是空的:现在摆学生在这道题上最近一次交的结果,可刷新;
  不给 AI 提示(那是按登录的人自己的失败次数解锁的)
- 抽屉「我的提交」在协作中变成「他的提交」,列的是学生的提交,只能复制、不能放回编辑器
  (放回去会经协作通道直接盖掉学生正在写的代码),也不显示老师自己的排名
- 学生排队求助中、或者老师正在帮他时换题:先确认一句。换题会断开协作 / 撤掉举手,
  原来一点「下一题」就把正在帮他的老师踢出去了
- 求助按钮文案:「举手求助」→「已举手 · 前面 2 人」→「某某 老师在帮你」
- 提交列表加 exactUsername=1:用户名精确匹配。原来只有「包含」,ks24a1 会把 ks24a10 的提交
  也捞进来

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-09-28 18:28:53 +08:00
1 parent 11368813cc
commit 0c2ff68e9b
13 files changed
+287 -45

No files matched your search

@@ -1,13 +1,13 @@
<script setup lang="ts">
import { storeToRefs } from "pinia"
import { useProblemStore } from "oj/store/problem"
import { useCollabStore } from "shared/store/collab"
import { useUserStore } from "shared/store/user"
import {
DRAWER_TITLE,
useProblemPageContext,
type ProblemDrawer,
} from "../composables/problemPageContext"
import { useTeacherCollab } from "../composables/teacherCollab"
/**
* 统计 / 点评 / 我的提交。原来是左栏的三个页签,课上几乎没人点,却和「题目」挤在一排;
@@ -30,7 +30,6 @@ const ctx = useProblemPageContext()
const route = useRoute()
const router = useRouter()
const userStore = useUserStore()
const collabStore = useCollabStore()
const { problem } = storeToRefs(useProblemStore())
const show = computed({
@@ -55,6 +54,14 @@ watch(
},
)
// 协作中的老师看的是学生的提交(ProblemSubmission 里按学生用户名查)
const teacherCollab = useTeacherCollab()
const drawerTitle = computed(() =>
lastOpened.value === "submission" && teacherCollab.value
? "他的提交"
: DRAWER_TITLE[lastOpened.value],
)
/**
* 「看这道题所有人的提交」,原来是工具栏上的「本题提交」。可见条件照旧:
* 比赛里总给(看的是这场比赛的提交),题库里要管理员或者开着提交列表。
@@ -72,11 +79,7 @@ function goAllSubmissions() {
// 协作中走新标签:教师端「页面即协作现场」,跳走这一页协作就结束了
// (求助会退回排队,但老师还得再接一次)。而「看看这学生都交了什么」恰好是
// 协作时最常点的一个
const collabHere =
collabStore.room !== null &&
collabStore.room.problemId === problem.value?._id &&
userStore.isTeacherOrAbove
if (collabHere) {
if (teacherCollab.value) {
window.open(router.resolve(target).href, "_blank")
return
}
@@ -94,7 +97,7 @@ function goAllSubmissions() {
:trap-focus="false"
:block-scroll="!props.to"
>
<n-drawer-content :title="DRAWER_TITLE[lastOpened]" closable :native-scrollbar="false">
<n-drawer-content :title="drawerTitle" closable :native-scrollbar="false">
<ProblemInfo v-if="lastOpened === 'info'" />
<ProblemReaction v-else-if="lastOpened === 'reaction'" />
<template v-else>