Files
ClassHelper/docs/app/homeworks.md
T
LoveChengke c7f215a09c feat(courseware,docs): 完善课件传输与岛编辑并统一全仓文档
- 增加课件上传、班级可见范围、设备补收与传输进度
- 整合自定义灵动岛编辑器和相关客户端交互
- 同步三端契约、数据库迁移、部署配置与隔离回归
- 按源码统一文档与官网说明,移除过时任务书和审查记录
- 保持产品版本为 1.4.0
2026-10-18 11:53:37 +08:00

93 lines
5.1 KiB
Markdown
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.
---
title: 作业
description: 作业按所属日期归类、看板与全屏看板、教室机器录入作业、未交名单与附件。
---
# 作业
## 按「所属日期」归类,不是按录入时间
每份作业有一个**所属日期**(`Homework.assignDate`,形如 `2026-10-06` 的本地日期,不带时区)。
按天查看、日期高亮、客户端的「只看今天」都看它。
> 用录入时间(`createdAt`)当"哪一天的作业"是错的:它是 UTC,晚上 8 点留的作业会被算到第二天。
> 系统里统一用「本地日期」,新增按天查询的接口也一样走 `?date=YYYY-MM-DD`。
所以老师可以给今天、明天、甚至补录上周某一天 —— 客户端按日期查得到。
## 两端各自能做什么
| 能力 | Web 管理端(老师) | 桌面客户端(教室机器) |
| ------------------ | ---------------------------------------- | ----------------------------------------------- |
| 按天查看 | 工具栏日期选择器;有作业的日期下面带圆点 | 日期选择器 + 前 / 后一天,支持 `?date=` 深链 |
| 发布 / 编辑 / 删除 | ✅(教师 / 管理员) | ✅ **录入**(班级账号也能发,归属到该班班主任) |
| 看板模式 | — | ✅ 默认视图 |
| 全屏看板 | — | ✅ |
| 完成情况 | ✅ 按名单统计完成人数 | ❌ **客户端不显示"已完成 / 待完成"** |
| 未交名单 | ✅ 作业详情抽屉里可看可改 | ✅ |
> 客户端刻意不显示完成状态:完成与否是**老师端与通知中心**的概念;
> 教室机器上只做"看作业 + 录作业"两件事。服务端的完成数据与统计接口都还在,Web 端照旧可用。
## 看板模式
客户端作业页默认按**科目**分卡片,每张卡列出该科的所有作业。工具栏可以:
- **看板 / 列表** 切换视图(列表模式有一列"作业要求"全文);
- **只看今天** 开关(默认开);
- **显示时间** 开关;
- **字号**滑块(11–28px 即时生效)。
这些偏好存在客户端配置里,重启后仍生效。
卡片里同时渲染**标题 + 作业要求全文**(不截断)。
### 全屏看板
点卡片或「全屏看板」进入。全屏下的排版不是简单地放大:
1. 按"可用宽 × 可用高"枚举 1..N 列,取**单卡面积最大、宽高比最接近 1.15** 的方案;
2. 再按「内容高度 / 可用高度」整体 `transform: scale()` 缩到刚好铺满 —— 所以**不用上下翻页**;
3. 标题栏中间绝对居中显示当天日期时间(受「显示时间」开关控制,每分钟刷新)。
> 字号仍由工具栏的滑块决定,缩放只负责"放得下"。工具栏上会显示当前缩放比例。
## 教室机器录入作业
教室里那台机器用**班级账号**登录,可以直接发作业。两个细节:
- 服务端拿到的是班级账号的会话(`sub` 是班级 id),写 `createdBy` 前会换成该班班主任,
否则会撞外键。
- **本机刚录入的那条不会弹到灵动岛上**——自己通知自己没意义。这条判断是在发请求**之前**
按内容登记指纹做的(服务端是先广播后回响应,等拿到 id 再登记就晚了)。
录入时可以点**快捷短语**(默认 `P` / `大本` / `小本` / `卷子` / `背诵` / `默写` / `听写` / `预习` /
`订正` / `读书`),点一下追加到标题或内容。短语可以在客户端「设置 → 通用」里增删,存在本机。
## 未交名单
在作业列表或详情里点「未交名单」→ 勾选**没交作业**的同学 → 保存。
其余同学会被自动标记为已完成(接口是 `PATCH /api/homeworks/:id/submissions`)。
Web 端作业详情抽屉里同样可看可改。
> 名单来自班级的学生名单 —— 名单不全,这项就不准。见[班级、学生与教师](classes.md)。
## 附件
作业可以带一个附件链接。**只接受 `http(s)://` 或站内相对路径**,其他 scheme(`javascript:`、
`data:text/html` 等)服务端会直接拒;Web 端渲染前还会再兜一层。
放行这些 scheme 等于给了一条存储型 XSS。
## 实时推送
发布 / 修改 / 删除作业会分别广播:
| 事件 | 客户端反应 |
| ------------------ | --------------------------------------------------- |
| `homework:new` | 列表刷新;经典岛显示胶囊/课堂暂存,自定义岛提示铃铛 |
| `homework:updated` | 刷新;带 `deleted: true` 表示删除 |
| `homework:status` | 完成状态变化时刷新统计 |
课表、作业、通知、成绩都是同一个套路:写库 → 按班级房间广播 → 客户端更新内存状态并写回 IndexedDB。