feat(class-account): 学生端主体改为班级(班级码 + 班级密码)+ 数据按班级隔离

服务端:
- Class 新增 code(唯一)/passwordHash 与迁移(老数据回填 C00001 形式, 未设密码禁止登录)
- POST /auth/class-login: 班级码 + 班级密码 -> classSession 会话(sub=classId)
- PATCH /classes/:id/class-account: 管理员改班级码/重置密码(唯一性、格式校验)
- auth 中间件/socket 握手支持班级会话(sub 为 classId, 回查 Class 表, 加入 user:{classId} 房间)
- lib/session.ts: 班级设备代全班操作(通知已读/作业完成/成绩总览按全班读写), 普通学生账号行为不变
- 叫人消息同时广播到 user:{classId}, 班级设备立即上岛
- 班级列表/详情按权限返回班级码与密码状态(哈希不外泄)

客户端:
- 登录页改为班级码 + 班级密码(个人学生入口移除, /auth/login 接口保留兼容)
- 作业按钮/成绩标题按班级会话显示(全班标记完成 / 本班成绩)
- 冒烟脚本自动准备班级账号凭据(兼容全新与升级安装)

Web 管理端:
- 班级管理新增「班级账号」列与设置弹窗(改班级码/重置密码/随机生成)
- 新建班级可选自定义班级码, 默认由服务端生成

验证: verify:e2e 125/125(新增班级账号 18 项) verify:web 18/18 verify:desktop 40/40
      (login=高一(1)班 classSession=true)
文档: README 新增「学生端班级账号」章节、API/迁移/验收/默认账号更新; 安装包 README 同步
This commit is contained in:
LoveChengke committed 2026-09-12 15:51:08 +08:00
1 parent 8b85079d81
commit 1073436ad6
38 files changed
+1289 -157

No files matched your search

+33 -1
View File
@@ -64,9 +64,27 @@ export interface LoginRequest {
password: string;
}
/**
* 登录会话主体。
* - 普通账号(教师/管理员/个人学生):就是用户本身;
* - 班级账号(班级设备):`classSession = true`,此时 `id` 与 `classId` 都是班级 id,
* `name` 是班级名,个人数据由服务端按"全班"范围读写。
*/
export interface SessionUser extends StudentDto {
classSession?: boolean;
/** 班级账号的班级码(仅班级会话返回) */
classCode?: string;
}
export interface LoginResponse {
token: string;
user: UserDto;
user: SessionUser;
}
/** 班级账号登录(学生端):班级码 + 班级密码 */
export interface ClassLoginRequest {
code: string;
password: string;
}
/* ------------------------------------------------------------------ 班级 */
@@ -82,6 +100,10 @@ export interface ClassDto {
courseCount?: number;
homeworkCount?: number;
notificationCount?: number;
/** 班级码(学生端班级账号登录用);仅对有管理权限的角色返回 */
code?: string;
/** 是否已设置班级密码(哈希永不外泄) */
hasPassword?: boolean;
}
export interface ClassTeacherBrief {
@@ -99,6 +121,8 @@ export interface ClassDetailDto extends ClassDto {
export interface CreateClassRequest {
name: string;
grade: string;
/** 可选:自定义班级码,留空自动生成 */
code?: string;
}
export interface UpdateClassRequest {
@@ -106,6 +130,14 @@ export interface UpdateClassRequest {
grade?: string;
}
/** 管理员设置/重置班级账号(班级码 + 班级密码) */
export interface UpdateClassAccountRequest {
/** 新的班级码(4~16 位字母数字,留空表示不改) */
code?: string;
/** 新的班级密码(留空表示不改) */
password?: string;
}
/* ------------------------------------------------------------------ 课程 */
export interface CourseDto {