kindergarten_java/docs/design/16-教学环节资源关联设计.md

289 lines
14 KiB
Markdown
Raw Normal View History

2026-02-28 16:41:39 +08:00
# 教学环节资源关联设计
> 创建时间2025-02-14
> 最后更新2025-02-14
> 状态:已确认
---
## 一、需求背景
### 1.1 问题描述
在当前系统中:
- 超管端创建课程包时上传了数字资源电子绘本、音频、视频和教学材料PPT、挂图
- 但编辑教学环节时,**没有将资源与具体环节关联**
- 导致教师端查看环节时,**环节材料始终为空**
### 1.2 业务需求
教师在授课时,需要:
1. **备课阶段**:了解每个环节需要使用哪些资源
2. **授课阶段**:快速访问和播放当前环节的资源
---
## 二、设计方案
### 2.1 关联粒度
**采用方案B关联到逐页脚本级别**
- 教学环节(环节级别):可以关联资源
- 逐页脚本(页面级别):也可以关联资源
这样设计更灵活,例如:
- 导入环节关联:动画视频、背景音乐
- 第3页脚本关联第3页的特定音频
### 2.2 资源范围
以下资源都可以被关联:
- 数字资源:电子绘本、音频、视频
- 教学材料PPT课件、教学挂图
### 2.3 关联规则
| 规则 | 说明 |
|------|------|
| 多选 | 一个环节/页面可关联多个资源 |
| 复用 | 同一资源可被多个环节/页面关联 |
| 可选 | 环节/页面可以不关联任何资源 |
---
## 三、数据模型
### 3.1 现有表结构
**CourseResource课程资源表**
```prisma
model CourseResource {
id Int @id
courseId Int
resourceType String // EBOOK, AUDIO, VIDEO, PPT, POSTER
resourceName String
fileUrl String
fileSize Int?
mimeType String?
metadata String?
}
```
**CourseScript教学环节表**
```prisma
model CourseScript {
id Int
courseId Int
stepIndex Int
stepName String
// ...
resourceIds String? // JSON数组存储关联的资源ID
}
```
**CourseScriptPage逐页脚本表** - 需要新增字段
```prisma
model CourseScriptPage {
id Int
scriptId Int
pageNumber Int
questions String?
teacherNotes String?
// 需要新增:
resourceIds String? // JSON数组存储关联的资源ID
}
```
### 3.2 数据流
```
┌─────────────────────────────────────────────────────────────────┐
│ 资源关联数据流 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. 上传资源 │
│ 电子绘本.pdf ──→ CourseResource (id=1, type=EBOOK) │
│ 导入音乐.mp3 ──→ CourseResource (id=2, type=AUDIO) │
│ 绘本动画.mp4 ──→ CourseResource (id=3, type=VIDEO) │
│ │
│ 2. 编辑教学环节 │
│ 环节1: 导入环节 │
│ 关联资源: [2, 3] │
│ ↓ │
│ CourseScript.resourceIds = "[2, 3]" │
│ │
│ 3. 编辑逐页脚本 │
│ 第3页: │
│ 关联资源: [1] │
│ ↓ │
│ CourseScriptPage.resourceIds = "[1]" │
│ │
│ 4. 查询展示 │
│ SELECT * FROM CourseScript WHERE id = X │
│ resourceIds = "[2, 3]" │
│ ↓ │
│ SELECT * FROM CourseResource WHERE id IN (2, 3) │
│ ↓ │
│ 返回资源详情列表 │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 四、界面设计
### 4.1 超管端 - 教学环节编辑
```
┌─────────────────────────────────────────────────────────────────┐
│ 第4步编辑教学环节 │
│ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ 环节1: 导入环节 ││
│ │ 时长: 5分钟 ││
│ │ 教师活动: 播放动画,引导幼儿观察封面... ││
│ │ ││
│ │ 关联资源: ││
│ │ ┌───────────────────────────────────────────────────────┐ ││
│ │ │ ☑ 📹 绘本动画.mp4 (视频) │ ││
│ │ │ ☑ 🎵 导入音乐.mp3 (音频) │ ││
│ │ │ ☐ 📄 绘本故事.pdf (电子绘本) │ ││
│ │ │ ☐ 📊 教学课件.pptx (PPT) │ ││
│ │ │ ☐ 🖼️ 角色卡片.jpg (挂图) │ ││
│ │ │ │ ││
│ │ │ 提示请先在第2步上传数字资源第3步上传教学材料 │ ││
│ │ └───────────────────────────────────────────────────────┘ ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
```
### 4.2 超管端 - 逐页脚本编辑
```
┌─────────────────────────────────────────────────────────────────┐
│ 逐页脚本 │
│ │
│ ┌─────────────────────────────────────────────────────────────┐│
│ │ 第3页 ││
│ │ 教师话术: "小朋友们,看这页毛毛虫吃了什么?" ││
│ │ 教学备注: 引导幼儿数数 ││
│ │ ││
│ │ 关联资源: ││
│ │ ┌───────────────────────────────────────────────────────┐ ││
│ │ │ ☑ 📄 绘本故事.pdf (电子绘本) - 第3页 │ ││
│ │ │ ☐ 其他资源... │ ││
│ │ └───────────────────────────────────────────────────────┘ ││
│ └─────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────┘
```
### 4.3 教师端 - 备课模式
```
┌─────────────────────────────────────────────────────────────────┐
│ 备课模式 │
├────────────┬───────────────────────────────────┬────────────────┤
│ 教学流程 │ 当前环节详情 │ 环节材料 │
│ │ │ │
│ 1.导入环节 │ 环节:导入环节 │ ┌────────────┐ │
│ (进行中) │ 目标:激发兴趣 │ │ 📹 动画.mp4│ │
│ 2.阅读绘本 │ │ │ [▶播放] │ │
│ 3.互动讨论 │ 教师讲稿: │ └────────────┘ │
│ 4.总结延伸 │ "小朋友们,今天我们..." │ ┌────────────┐ │
│ │ │ │ 🎵 音乐.mp3│ │
│ │ │ │ [▶播放] │ │
│ │ │ └────────────┘ │
└────────────┴───────────────────────────────────┴────────────────┘
```
### 4.4 教师端 - 授课模式
```
┌─────────────────────────────────────────────────────────────────┐
│ [退出上课] [上一步] [下一步] [全屏] [计时器] [课堂记录] [结束] │
├────────────┬───────────────────────────────────┬────────────────┤
│ 教学流程 │ 当前环节详情 │ 本步骤材料 │
│ │ │ │
│ 1.导入环节 │ 环节:导入环节 │ 📹 绘本动画.mp4│
│ (进行中) │ 时长5分钟 │ [▶播放] │
│ 2.阅读绘本 │ │ │
│ 3.互动讨论 │ 教师讲稿: │ 🎵 导入音乐.mp3│
│ 4.总结延伸 │ "小朋友们..." │ [▶播放] │
└────────────┴───────────────────────────────────┴────────────────┘
```
---
## 五、开发计划
### Phase 1: 后端改造
| 任务 | 说明 |
|------|------|
| 资源同步 | 上传资源时同步到 CourseResource 表 |
| 数据库迁移 | CourseScriptPage 增加 resourceIds 字段 |
| API 改造 | 保存环节时存储 resourceIds |
| API 改造 | 查询时返回关联资源详情 |
### Phase 2: 超管端改造
| 任务 | 说明 |
|------|------|
| 教学环节编辑 | 增加资源关联多选组件 |
| 逐页脚本编辑 | 增加资源关联多选组件 |
| 资源选择器 | 从已上传资源中选择 |
### Phase 3: 教师端改造
| 任务 | 说明 |
|------|------|
| 备课模式 | 展示环节关联资源 |
| 授课模式 | 展示环节关联资源 |
| 资源预览/播放 | 支持快速访问资源 |
---
## 六、技术实现要点
### 6.1 资源类型图标映射
```typescript
const resourceIcons: Record<string, string> = {
EBOOK: '📄',
AUDIO: '🎵',
VIDEO: '📹',
PPT: '📊',
POSTER: '🖼️',
};
```
### 6.2 资源类型名称映射
```typescript
const resourceTypeNames: Record<string, string> = {
EBOOK: '电子绘本',
AUDIO: '音频',
VIDEO: '视频',
PPT: 'PPT课件',
POSTER: '教学挂图',
};
```
### 6.3 数据加载逻辑
```typescript
// 加载环节时,同时加载关联资源
const loadScriptWithResources = async (scriptId: number) => {
const script = await getScript(scriptId);
if (script.resourceIds) {
const resourceIds = JSON.parse(script.resourceIds);
script.resources = await getResourcesByIds(resourceIds);
}
return script;
};
```