You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.2 KiB

教师学生端讲解模式设计

目标

教师可以选择自己创建的教学班,在新窗口以学生端界面讲解任务流程。演示会话读取所选教学班的任务、任务分配和页面配置,但不会创建虚拟学生账号、不会写入教学班成员关系,也不会持久化答案、进度、成绩或其他学生业务数据。

不采用 _ys 账号的原因

学生端当前通过 teaching_class_student 的有效成员记录确定教学班。为 张辉_ys 一类账号提供内容,必须把账号加入教学班;而现有模型只会取该学生最近的一条有效教学班归属。切换讲解班级会导致成员关系迁移,并污染学生名单、学习记录、成绩和账号管理。

因此,演示模式使用受控的虚拟会话,不创建 userinfo 学生记录,也不新增 teaching_class_student 记录。

会话与单点进入

教师端

教师端新增“学生端讲解”入口。点击后展示本人创建的教学班列表;未选择教学班不能进入。

教师选择班级后,前端调用教师专用接口创建一次性演示票据。后端必须验证:

  1. 当前用户为教师;
  2. 教学班类型为 TEACHING
  3. school_class.created_by 等于当前教师用户 ID。

前端打开独立学生端窗口,并将一次性票据通过同源 postMessage 发送给新窗口,不把 JWT 放入 URL、浏览器历史或 Referer。

后端

新增演示会话接口:

接口 用途
POST /api/teacher/student-demo-sessions 教师为本人教学班创建短时、单次使用的演示票据。
POST /api/student-demo-sessions/exchange 新窗口使用票据换取演示学生 token。

票据存储字段包括票据值哈希、来源教师 ID、教学班 ID、学校 ID、过期时间、已使用时间和创建时间。票据有效期为 5 分钟,成功兑换后立即失效。演示 token 有效期为 30 分钟。

兑换后的 JWT 维持学生端 roleId=4,并增加如下声明:

  • demoMode=true
  • demoTeachingClassId
  • sourceTeacherId

JwtUserTokenProvider 解析这些声明,供后续服务统一判断演示上下文。

教学班解析规则

新增统一的学生上下文解析器:

  1. 普通学生:保留现有 teaching_class_student 有效成员关系查询。
  2. 演示学生:直接使用 JWT 的 demoTeachingClassId;不查询、不创建成员关系。

任务详情、任务列表、任务分配、成绩参考、进度展示等学生端读取服务均使用该解析器,确保教师看到的是所选教学班的真实教学内容和配置。

演示 token 不允许通过传入其他班级 ID 改变上下文;任何请求中的教学班 ID 必须与 demoTeachingClassId 一致,否则拒绝。

演示数据隔离

演示会话不能持久化任何学生业务数据。

类型 演示模式行为
读取任务、任务分配、班级配置 使用 demoTeachingClassId 正常读取。
查询答案与进度 返回当前窗口的临时数据;首次进入为未开始、空答案。
保存、提交、重置或删除答案 前端写入 sessionStorage 并展示成功,不调用持久化接口。
成绩、排名、进度写入 禁止调用或返回演示提示,不写数据库。
AI 助学、AI 评测及外部资源调用 在演示模式禁用,避免产生外部调用成本或写入结果。

关闭演示窗口或演示 token 过期后,临时数据自动丢弃。教师端、学生端和后端均不保留演示答案内容。

前端交互

  1. 教师端按钮只对教师可见,班级选择框只展示当前教师创建的教学班。
  2. 新窗口进入专用学生端演示路由,等待父窗口发送票据并换取 token若票据缺失、过期或已使用展示“演示链接已失效请返回教师端重新打开”。
  3. 演示学生端顶部展示醒目条:演示模式:{教学班名称},并提供“退出演示”按钮。
  4. 学生端菜单与普通学生一致;被禁用的 AI、成绩提交等操作提供明确的“演示模式不保存数据”提示。
  5. 演示窗口使用独立的 session storage 键保存 token 和临时答案,不覆盖教师窗口或普通学生窗口的登录状态。

安全与边界

  • 创建票据和兑换票据均校验有效期、单次使用状态和来源学校。
  • 教师只能创建本人教学班的演示会话,不能进入其他教师的班级。
  • 演示 token 不拥有教师管理权限;仅拥有学生端读取权限和演示上下文。
  • 所有持久化写接口在后端额外识别 demoMode 并拒绝写入,不能仅依赖前端禁用。
  • 不创建 _ys 用户、密码、学生档案、班级成员或成绩记录。

验收标准

  1. 教师可在新窗口进入自己创建的教学班对应的学生端,并看到该班任务内容。
  2. 教师无法为非本人创建的教学班创建演示会话。
  3. 普通学生的登录、任务读取、答案保存和班级归属逻辑保持不变。
  4. 演示过程中填写答案、切换步骤、提交或退出后,数据库的答案、进度、成绩、排名和成员数据均无新增或变更。
  5. 票据不能重复兑换,过期票据无法兑换;演示 token 过期后必须重新从教师端进入。