kindergarten_java/docs/design/16-教学环节资源关联设计.md
2026-02-28 16:41:39 +08:00

289 lines
14 KiB
Markdown
Raw Permalink 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.

# 教学环节资源关联设计
> 创建时间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;
};
```