Files
OJ2/apps/web/src/shared/components/CollabHost.vue
T
xuyueandClaude Opus 5.5 29c31640b5 refactor(课堂任务): 「课堂看板」改名「课堂任务」,地址换成 /task;班级 PK 换成 /pk
- 界面上的「课堂看板」「课堂作业」统一叫「课堂任务」,顶栏、老师首页、后台菜单一起改
- 前端 oj/classroom → oj/task、oj/class → oj/pk,两个名字不再只差几个字母却毫不相干;旧地址不留跳转
- 后端 routes/classroom.ts 拆开:课堂任务的接口进 routes/task.ts(/task/board|lesson|today),
  首页的「上次来」「班里在做」进 routes/home.ts;共用的取题口径挪进 services/lesson.ts
- 契约 classroom.ts 同样拆成 task.ts / home.ts,ClassBoard* 改叫 TaskBoard*

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 22:53:07 +08:00

61 lines
2.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script setup lang="ts">
import { useCollabStore } from 'shared/store/collab'
/**
* 课堂求助的全局界面:一次性提示、老师接单后跳到那道题。
*
* 新求助**不弹 toast**:原来每来一个就弹一条,一节课能弹十几次,讲台电脑投着屏时还弹在
* 全班面前。现在靠顶栏(前台、后台都有)的 HelpButton:没人等不显示,冒出来就是提醒,
* 人数再变多时闪一下。
*
* 教师端的协作**没有弹框**:房间开好就跳到那道题的页面,在页面自带的编辑器里协作
* (ProblemEditor 的 collabHere)。用户选的方案 A:演示学生的错误时题目和代码要并排。
* 原来这里还异步挂一个 CollabModal,那个弹框按一下 Esc 就关、协作跟着结束。
*
* 挂在 App.vue 而不是顶栏或 default.vue 布局里。这些东西跟着**连接**走,
* 而连接是全局常驻的(App.vue 按登录态开关)—— 挂在前台顶栏里的时候,老师一进
* /admin 就换成了 admin.vue 布局,顶栏连同这几个消费者一起卸载,正好错过
* collab.ts 里写的那句「老师可能正在后台改题时收到求助」。放在这里才真的全局;
* 后台那条顶栏自己也挂了一个 HelpButton。
*
* 位置要求:n-message-provider 的后代(useMessage 需要)。
*/
const collabStore = useCollabStore()
const message = useMessage()
/**
* 一次性提示统一在这里消费。
*
* 学生排着队切去看提交记录,老师这时候取消了他的求助,那条「老师已取消你的
* 求助」挂在题目页上就永远没人消费 —— 教师端的 error 提示(比如「请先退出
* 当前协作」)同理。
*/
watch(
() => collabStore.noticeSeq,
() => {
const text = collabStore.consumeNotice()
if (text) message.info(text)
},
)
/**
* 老师这边房间开好了(「帮他」、任务页上点「在写」、协作条的「下一个」):跳到那道题。
* 等 room_open 到了才跳,不在点的那一刻跳 —— 服务端可能拒了(别的老师先接走、学生刚走),
* 那时候跳过去就是对着一个空编辑器。已经在这道题上就不跳(同一道题换下一个人)
*/
const router = useRouter()
const route = useRoute()
watch(
() => collabStore.room,
(room) => {
if (!room || !collabStore.isTeacher) return
const target = `/problem/${room.problemId}`
if (route.path !== target) router.push(target)
},
)
</script>
<template>
<span hidden></span>
</template>