- 导航改成 题目 / 题单 / 比赛 / 排名 / 自学 / 更多,当前页浅绿底块;提交、公告收进「更多」 - 题号框点开先列出这节课的题(做对没有、下一道),输入时按题号或标题筛,回车照旧直达; 只在今天有课、不在题目页时出现 - 后台入口、暗色开关收进个人菜单;老师顶栏只留课堂看板 - 「N 人举手」前台、后台顶栏都有,放最末尾:没人等不显示,人数变多时闪一下; 新求助的 toast 删掉(一节课能弹十几次,投屏时还弹在全班面前) - 1280 以下题号框变窄、课堂看板只留图标、名字最宽 120;1024 以下允许折行 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5b43015be4
commit
56ef4a999c
5 files changed
+629
-212
No files matched your search
@@ -1,20 +1,23 @@
|
||||
<script setup lang="ts">
|
||||
import type { CollabRequestItem } from "shared/composables/websocket"
|
||||
import { useCollabStore } from "shared/store/collab"
|
||||
import HelpRequestList from "./HelpRequestList.vue"
|
||||
|
||||
/**
|
||||
* 课堂求助的全局界面:一次性提示、新求助 toast、求助列表。
|
||||
* 课堂求助的全局界面:一次性提示、求助列表。
|
||||
*
|
||||
* 新求助**不弹 toast**:原来每来一个就弹一条,一节课能弹十几次,讲台电脑投着屏时还弹在
|
||||
* 全班面前。现在靠顶栏(前台、后台都有)的 HelpButton:没人等不显示,冒出来就是提醒,
|
||||
* 人数再变多时闪一下。
|
||||
*
|
||||
* 教师端的协作**没有弹框**:接单会跳到那道题的页面,在页面自带的编辑器里协作
|
||||
* (见 HelpRequestList 的 handleAccept、ProblemEditor 的 collabHere)。
|
||||
* 原来这里还异步挂一个 CollabModal,那个弹框按一下 Esc 就关、协作跟着结束。
|
||||
*
|
||||
* 挂在 App.vue 而不是顶栏或 default.vue 布局里。这些东西跟着**连接**走,
|
||||
* 而连接是全局常驻的(App.vue 按登录态开关)—— 挂在顶栏里的时候,老师一进
|
||||
* /admin 就换成了 admin.vue 布局,顶栏连同这几个消费者一起卸载:求助照收,
|
||||
* 提示、角标、协作界面全都不出现,正好错过 collab.ts 里写的那句「老师可能
|
||||
* 正在后台改题时收到求助」。放在这里才真的全局。
|
||||
* 而连接是全局常驻的(App.vue 按登录态开关)—— 挂在前台顶栏里的时候,老师一进
|
||||
* /admin 就换成了 admin.vue 布局,顶栏连同这几个消费者一起卸载,正好错过
|
||||
* collab.ts 里写的那句「老师可能正在后台改题时收到求助」。放在这里才真的全局;
|
||||
* 后台那条顶栏自己也挂了一个 HelpButton。
|
||||
*
|
||||
* 位置要求:n-message-provider 的后代(useMessage 需要)。
|
||||
*/
|
||||
@@ -35,43 +38,6 @@ watch(
|
||||
if (text) message.info(text)
|
||||
},
|
||||
)
|
||||
|
||||
/**
|
||||
* 新求助进来只有角标默默 +1,上课走动的时候根本注意不到,补一条 toast。
|
||||
*
|
||||
* 只在数字**变大**时弹:老师自己接单、拒绝、别的老师接走都会让它变小,那些
|
||||
* 不该打扰人。断线重连后服务端会重推一份全量列表,队里还有人的话这里会再弹
|
||||
* 一次 —— 那正好是「你刚断过线,这些人还等着」,留着。
|
||||
*/
|
||||
watch(
|
||||
() => collabStore.pendingCount,
|
||||
(count, previous) => {
|
||||
if (count <= previous) return
|
||||
let latest: CollabRequestItem | null = null
|
||||
for (const item of collabStore.requests) {
|
||||
if (item.status !== "pending") continue
|
||||
if (!latest || item.createdAt > latest.createdAt) latest = item
|
||||
}
|
||||
const text = latest ? `${latest.studentName} 求助:${latest.problemTitle}` : "有新的求助"
|
||||
// 内容传 render 函数(naive 的 content 支持),这样整条 toast 可点:
|
||||
// 点一下直接开求助列表,省得再去点名字、再点菜单。
|
||||
const notice = message.info(
|
||||
() =>
|
||||
h(
|
||||
"span",
|
||||
{
|
||||
style: { cursor: "pointer" },
|
||||
onClick: () => {
|
||||
collabStore.helpPanelOpen = true
|
||||
notice.destroy()
|
||||
},
|
||||
},
|
||||
`${text} · 点击处理`,
|
||||
),
|
||||
{ duration: 5000 },
|
||||
)
|
||||
},
|
||||
)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
Reference in new issue
Block a user