Merge remote-tracking branch 'origin/master'

This commit is contained in:
En 2026-03-18 10:02:26 +08:00
commit c85a3fd195
10 changed files with 725 additions and 28 deletions

View File

@ -6,6 +6,65 @@
## [Unreleased]
### 排课计划参考示例数据添加 ✅ (2026-03-18)
**添加了课程排课计划参考示例数据:**
**数据库迁移**
- Flyway 迁移脚本:`V29__add_schedule_ref_data.sql`
- 为小猪佩奇绘本阅读、好饿的毛毛虫、三只小猪等课程添加排课计划参考
**数据内容**
- 导入课课程导入激发兴趣每周1次连续2周
- 集体课集体教学活动每周2次连续4周
- 五大领域课:语言、社会、科学、艺术、健康领域活动
**数据结构**
```json
[
{
"lessonType": "INTRODUCTION",
"title": "导入课",
"suggestedOrder": 1,
"durationMinutes": 15,
"frequency": "每周1次连续2周",
"keyPoints": ["展示绘本封面,引导观察"],
"tips": "建议配合实物教具或多媒体资源"
},
...
]
```
**后端 API**
- 新增 `GET /api/v1/school/packages/{packageId}/courses` 获取课程包课程列表
- Git 提交:`commit 4072b21`
---
### 排课计划参考功能 ✅ (2026-03-17 下午)
**添加了课程包排课计划参考数据的返回和显示功能:**
**问题背景**
- 学校老师需要排课计划参考作为指引
- 课程包下有导入课、集体课、五大领域课,需要告诉老师如何安排才能发挥最大价值
**后端实现**
- `CoursePackageResponse.CoursePackageCourseItem` 添加 `scheduleRefData``lessonType` 字段
- `CoursePackageService.toResponse()` 填充 `scheduleRefData``lessonType`
- `CourseCollectionService.toPackageResponse()` 重写以包含课程列表和排课计划参考
- 添加必要的 mapper 依赖注入
**前端实现**
- `school.ts` `CoursePackage` 接口添加 `scheduleRefData` 字段
- `CreateScheduleModal.vue` 优化 `selectPackage()` 方法,直接从响应数据中提取排课计划参考
**API验证**`GET /api/v1/school/packages/5/packages` 返回包含 `courses` 数组的完整响应
**Git提交**: `commit 9f89ce7`
---
### 排课功能两层结构重构完成 ✅ (2026-03-17)
**实现了课程套餐→课程包→课程的两层结构架构:**

View File

@ -224,3 +224,162 @@ mvn clean compile -DskipTests
| AdminPackageController | ✅ 已规范 |
| AdminThemeController | ✅ 已规范 |
| AdminSettingsController | 🟡 可选(设置类接口允许使用 Map |
---
## 排课计划参考功能实现
### 背景
学校端排课功能需要显示排课计划参考数据,帮助老师了解课程包下的课程安排建议。用户说明:"因为我们一个套餐是一个课程体系,在这个课程体系下,有多个课程包,每个课程包下,有导入课、集体课、五大领域课,我们提供的排课计划参考是为了给学校老师指引,告诉他们课程包下的这三类课如何上,才能发挥最大的价值。"
### 新建排课流程
1. 选择课程套餐 → 选择课程包 → 显示排课计划参考
2. 单选课程类型(导入课/集体课/五大领域课)
3. 选择班级 → 指定授课教师
4. 设置授课时间
### 后端修改
#### 1. CoursePackageResponse.java
**文件路径**: `reading-platform-java/src/main/java/com/reading/platform/dto/response/CoursePackageResponse.java`
**修改内容**: 在 `CoursePackageCourseItem` 内部类中添加 `scheduleRefData``lessonType` 字段
```java
@Schema(description = "排课计划参考数据JSON")
private String scheduleRefData;
@Schema(description = "课程类型")
private String lessonType;
```
#### 2. CoursePackageService.java
**文件路径**: `reading-platform-java/src/main/java/com/reading/platform/service/CoursePackageService.java`
**修改内容**: 修改 `toResponse()` 方法,填充 `scheduleRefData``lessonType`
```java
if (course != null) {
item.setId(course.getId());
item.setName(course.getName());
item.setScheduleRefData(course.getScheduleRefData());
item.setLessonType(course.getLessonType());
}
```
#### 3. CourseCollectionService.java
**文件路径**: `reading-platform-java/src/main/java/com/reading/platform/service/CourseCollectionService.java`
**修改内容**:
- 添加依赖注入:`CoursePackageCourseMapper`, `CourseMapper`
- 添加导入:`Course`, `CoursePackageCourse`
- 完全重写 `toPackageResponse()` 方法,包含课程列表查询逻辑
```java
private CoursePackageResponse toPackageResponse(CoursePackage pkg) {
// 查询课程包关联的课程
List<CoursePackageCourse> packageCourses = packageCourseMapper.selectList(
new LambdaQueryWrapper<CoursePackageCourse>()
.eq(CoursePackageCourse::getPackageId, pkg.getId())
.orderByAsc(CoursePackageCourse::getSortOrder)
);
List<CoursePackageResponse.CoursePackageCourseItem> courseItems = ...;
// 构建 courseItems 列表,包含 scheduleRefData
}
```
### 前端修改
#### 1. school.ts
**文件路径**: `reading-platform-frontend/src/api/school.ts`
**修改内容**: 在 `CoursePackage` 接口的 `courses` 数组项中添加 `scheduleRefData` 字段
```typescript
courses?: Array<{
id: number;
name: string;
gradeLevel: string;
sortOrder: number;
scheduleRefData?: string; // 新增字段
}>;
```
#### 2. CreateScheduleModal.vue
**文件路径**: `reading-platform-frontend/src/views/school/schedule/components/CreateScheduleModal.vue`
**修改内容**: 优化 `selectPackage()` 方法,直接从响应数据中提取排课计划参考
```typescript
const selectPackage = async (packageId: number) => {
formData.packageId = packageId;
formData.courseId = undefined;
// 加载排课计划参考(从选中的课程包中获取)
if (selectedCollection.value?.packages) {
const selectedPkg = selectedCollection.value.packages.find((p: any) => p.id === packageId);
if (selectedPkg?.courses && selectedPkg.courses.length > 0) {
const firstCourse = selectedPkg.courses[0];
if (firstCourse.scheduleRefData) {
try {
const parsedData = JSON.parse(firstCourse.scheduleRefData);
scheduleRefData.value = Array.isArray(parsedData) ? parsedData : [];
} catch (e) {
scheduleRefData.value = [];
}
}
}
}
await loadLessonTypes(packageId);
};
```
### API 验证
**请求**:
```
GET /api/v1/school/packages/5/packages
Authorization: Bearer {token}
```
**响应**:
```json
{
"code": 200,
"data": [{
"id": "5",
"name": "完整阅读能力培养套餐",
"courses": [
{
"id": "6",
"name": "小猪佩奇绘本阅读",
"gradeLevel": "小班",
"sortOrder": 1,
"scheduleRefData": null,
"lessonType": null
}
]
}]
}
```
### 下一步工作
1. 在数据库中添加示例排课计划参考数据(`course.schedule_ref_data` 字段)
2. 考虑添加 `collectionId` 存储(需要数据库迁移和 DTO 更新)
### Git 提交
```
commit 9f89ce7
feat: 添加课程包排课计划参考数据返回
```

View File

@ -0,0 +1,82 @@
# 开发日志 - 2026-03-18
## 完成事项
### 1. 提交昨天的变更代码
**提交内容**
- `SchoolPackageController.java` - 新增 `GET /api/v1/school/packages/{packageId}/courses` 接口
- 文档更新CHANGELOG.md, dev-logs/2026-03-17.md
**Git 提交**
```
commit 4072b21
feat: 添加课程包课程列表查询API
```
### 2. 添加排课计划参考示例数据
**Flyway 迁移脚本**`V29__add_schedule_ref_data.sql`
**为以下课程添加了排课计划参考数据**
#### 小猪佩奇绘本阅读
- 导入课:通过图片、视频等形式导入课程主题
- 集体课:全班集体参与的教学活动
- 五大领域课:语言、社会、科学、艺术、健康
#### 好饿的毛毛虫
- 导入课:通过毛毛虫玩偶导入课程,激发好奇心
- 集体课:绘本共读,了解毛毛虫的成长过程
- 五大领域课:各领域活动安排
#### 三只小猪
- 导入课:通过小猪玩偶和房子图片导入课程主题
- 集体课:绘本共读,理解故事情节和寓意
- 五大领域课:各领域活动安排
**排课计划参考数据结构**
```json
[
{
"lessonType": "INTRODUCTION",
"title": "导入课",
"description": "...",
"suggestedOrder": 1,
"durationMinutes": 15,
"frequency": "每周1次连续2周",
"keyPoints": ["..."],
"tips": "..."
},
{
"lessonType": "COLLECTIVE",
"title": "集体课",
"description": "...",
"suggestedOrder": 2,
"durationMinutes": 25,
"frequency": "每周2次连续4周",
"keyPoints": ["..."],
"tips": "..."
},
// ... 五大领域课
]
```
### 排课计划参考功能说明
**功能目的**
帮助学校老师了解课程包下的三类课程(导入课、集体课、五大领域课)如何安排才能发挥最大价值。
**数据位置**
- 数据库:`course.schedule_ref_data` 字段JSON 格式)
- 实体类:`Course.scheduleRefData`
- 响应 DTO`CoursePackageResponse.CoursePackageCourseItem.scheduleRefData`
**前端显示**
学校端排课功能中,选择课程包后会自动显示该课程包的排课计划参考,帮助老师了解课程安排建议。
### 后续工作
- [ ] 考虑添加 `collectionId` 存储(需要数据库迁移和 DTO 更新)
---

View File

@ -301,6 +301,7 @@ export interface CoursePackage {
name: string;
gradeLevel: string;
sortOrder: number;
scheduleRefData?: string;
}>;
}

View File

@ -405,7 +405,29 @@ const handleCollectionChange = async (collectionId: number) => {
const selectPackage = async (packageId: number) => {
formData.packageId = packageId;
formData.courseId = undefined;
scheduleRefData.value = [];
//
if (selectedCollection.value?.packages) {
const selectedPkg = selectedCollection.value.packages.find((p: any) => p.id === packageId);
if (selectedPkg?.courses && selectedPkg.courses.length > 0) {
//
const firstCourse = selectedPkg.courses[0];
if (firstCourse.scheduleRefData) {
try {
const parsedData = JSON.parse(firstCourse.scheduleRefData);
scheduleRefData.value = Array.isArray(parsedData) ? parsedData : [];
console.log('✅ 排课计划参考数据:', scheduleRefData.value);
} catch (e) {
console.error('解析排课数据失败:', e);
scheduleRefData.value = [];
}
} else {
scheduleRefData.value = [];
}
} else {
scheduleRefData.value = [];
}
}
//
await loadLessonTypes(packageId);
@ -414,31 +436,6 @@ const selectPackage = async (packageId: number) => {
//
const selectCourse = (courseId: number) => {
formData.courseId = courseId;
//
loadScheduleRefData(courseId);
};
//
const loadScheduleRefData = async (courseId: number) => {
try {
// TODO: API
// const course = await getCourseDetail(courseId);
// if (course?.scheduleRefData) {
// try {
// const parsedData = JSON.parse(course.scheduleRefData);
// scheduleRefData.value = Array.isArray(parsedData) ? parsedData : [];
// } catch (e) {
// console.error('Failed to parse scheduleRefData:', e);
// scheduleRefData.value = [];
// }
// } else {
// scheduleRefData.value = [];
// }
scheduleRefData.value = [];
} catch (error) {
console.error('Failed to load course detail:', error);
scheduleRefData.value = [];
}
};
//

View File

@ -48,6 +48,13 @@ public class SchoolPackageController {
return Result.success(collectionService.getPackagesByCollection(collectionId));
}
@GetMapping("/packages/{packageId}/courses")
@Operation(summary = "获取课程包下的课程列表(包含排课计划参考)")
@RequireRole(UserRole.SCHOOL)
public Result<CoursePackageResponse> getPackageCourses(@PathVariable Long packageId) {
return Result.success(packageService.findOnePackage(packageId));
}
@GetMapping("/legacy")
@Operation(summary = "查询租户套餐旧版API已废弃")
@Deprecated

View File

@ -98,5 +98,11 @@ public class CoursePackageResponse {
@Schema(description = "排序号")
private Integer sortOrder;
@Schema(description = "排课计划参考数据JSON")
private String scheduleRefData;
@Schema(description = "课程类型")
private String lessonType;
}
}

View File

@ -8,12 +8,16 @@ import com.reading.platform.common.enums.TenantPackageStatus;
import com.reading.platform.common.response.PageResult;
import com.reading.platform.dto.response.CourseCollectionResponse;
import com.reading.platform.dto.response.CoursePackageResponse;
import com.reading.platform.entity.Course;
import com.reading.platform.entity.CourseCollection;
import com.reading.platform.entity.CourseCollectionPackage;
import com.reading.platform.entity.CoursePackage;
import com.reading.platform.entity.CoursePackageCourse;
import com.reading.platform.entity.TenantPackage;
import com.reading.platform.mapper.CourseCollectionMapper;
import com.reading.platform.mapper.CourseCollectionPackageMapper;
import com.reading.platform.mapper.CourseMapper;
import com.reading.platform.mapper.CoursePackageCourseMapper;
import com.reading.platform.mapper.CoursePackageMapper;
import com.reading.platform.mapper.TenantPackageMapper;
import lombok.RequiredArgsConstructor;
@ -39,6 +43,8 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
private final CourseCollectionPackageMapper collectionPackageMapper;
private final CoursePackageMapper packageMapper;
private final TenantPackageMapper tenantPackageMapper;
private final CoursePackageCourseMapper packageCourseMapper;
private final CourseMapper courseMapper;
/**
* 查询租户的课程套餐列表
@ -323,9 +329,46 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
}
/**
* 转换为课程包响应对象简化版
* 转换为课程包响应对象包含课程列表和排课计划参考
*/
private CoursePackageResponse toPackageResponse(CoursePackage pkg) {
// 解析 gradeLevels
String[] gradeLevelsArray = new String[0];
if (pkg.getGradeLevels() != null && !pkg.getGradeLevels().isEmpty()) {
try {
gradeLevelsArray = pkg.getGradeLevels().split(",");
} catch (Exception e) {
gradeLevelsArray = new String[0];
}
}
List<CoursePackageResponse.CoursePackageCourseItem> courseItems = new ArrayList<>();
// 查询课程包关联的课程
List<CoursePackageCourse> packageCourses = packageCourseMapper.selectList(
new LambdaQueryWrapper<CoursePackageCourse>()
.eq(CoursePackageCourse::getPackageId, pkg.getId())
.orderByAsc(CoursePackageCourse::getSortOrder)
);
if (!packageCourses.isEmpty()) {
courseItems = packageCourses.stream()
.map(pkc -> {
CoursePackageResponse.CoursePackageCourseItem item = new CoursePackageResponse.CoursePackageCourseItem();
// CoursePackageCourse 获取课程信息
Course course = courseMapper.selectById(pkc.getCourseId());
if (course != null) {
item.setId(course.getId());
item.setName(course.getName());
item.setScheduleRefData(course.getScheduleRefData());
}
item.setGradeLevel(pkc.getGradeLevel());
item.setSortOrder(pkc.getSortOrder());
return item;
})
.collect(Collectors.toList());
}
return CoursePackageResponse.builder()
.id(pkg.getId())
.name(pkg.getName())
@ -333,7 +376,7 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
.price(pkg.getPrice())
.discountPrice(pkg.getDiscountPrice())
.discountType(pkg.getDiscountType())
.gradeLevels(pkg.getGradeLevels() != null ? pkg.getGradeLevels().split(",") : new String[0])
.gradeLevels(gradeLevelsArray)
.courseCount(pkg.getCourseCount())
.status(pkg.getStatus())
.submittedAt(pkg.getSubmittedAt())
@ -344,6 +387,7 @@ public class CourseCollectionService extends ServiceImpl<CourseCollectionMapper,
.publishedAt(pkg.getPublishedAt())
.createdAt(pkg.getCreatedAt())
.updatedAt(pkg.getUpdatedAt())
.courses(courseItems)
.build();
}
}

View File

@ -153,6 +153,7 @@ public class CoursePackageService extends ServiceImpl<CoursePackageMapper, Cours
item.setName(course.getName());
item.setGradeLevel(pkc.getGradeLevel());
item.setSortOrder(pkc.getSortOrder());
item.setScheduleRefData(course.getScheduleRefData());
return item;
})
.filter(Objects::nonNull)

View File

@ -0,0 +1,341 @@
-- =====================================================
-- 添加排课计划参考示例数据
-- 版本: V29
-- 创建时间: 2026-03-18
-- 描述: 为课程添加排课计划参考数据,帮助学校老师了解课程包下的
-- 导入课、集体课、五大领域课的排课安排建议
-- =====================================================
-- 排课计划参考数据说明:
-- 根据用户需求,课程体系下有多个课程包,每个课程包包含:
-- 1. 导入课 (INTRODUCTION) - 课程导入,激发兴趣
-- 2. 集体课 (COLLECTIVE) - 集体教学活动
-- 3. 五大领域课 - LANGUAGE(语言)、SOCIETY(社会)、SCIENCE(科学)、ART(艺术)、HEALTH(健康)
-- 为小猪佩奇绘本阅读课程添加排课计划参考
UPDATE `course` SET `schedule_ref_data` = '[
{
"lessonType": "INTRODUCTION",
"title": "导入课",
"description": "通过图片、视频等形式导入课程主题,激发幼儿学习兴趣",
"suggestedOrder": 1,
"durationMinutes": 15,
"frequency": "每周1次连续2周",
"keyPoints": [
"展示绘本封面,引导观察",
"提出开放性问题激发兴趣",
"介绍课程主题和学习目标"
],
"tips": "建议配合实物教具或多媒体资源,增强视觉效果"
},
{
"lessonType": "COLLECTIVE",
"title": "集体课",
"description": "全班集体参与的教学活动,培养集体意识和协作能力",
"suggestedOrder": 2,
"durationMinutes": 25,
"frequency": "每周2次连续4周",
"keyPoints": [
"绘本共读,教师引导讲解",
"互动问答,鼓励幼儿表达",
"角色扮演或情景模拟",
"总结分享,巩固学习成果"
],
"tips": "注重全体参与,关注个别差异,给予每个幼儿表达机会"
},
{
"lessonType": "LANGUAGE",
"title": "语言领域活动",
"description": "语言表达能力训练,丰富词汇量",
"suggestedOrder": 3,
"durationMinutes": 20,
"frequency": "每周2次",
"keyPoints": [
"词汇学习与巩固",
"句型练习与对话",
"故事复述与创编",
"语言游戏活动"
],
"tips": "创设语言环境,鼓励大胆表达,及时给予正面反馈"
},
{
"lessonType": "SOCIETY",
"title": "社会领域活动",
"description": "培养社会交往能力和情感认知",
"suggestedOrder": 4,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"情感认知与表达",
"社交技能培养",
"规则意识建立",
"团队合作活动"
],
"tips": "结合生活实际,引导幼儿体验和反思"
},
{
"lessonType": "SCIENCE",
"title": "科学领域活动",
"description": "科学探究与认知能力培养",
"suggestedOrder": 5,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"观察与发现",
"探究与实验",
"分类与比较",
"记录与分享"
],
"tips": "提供丰富材料,鼓励动手操作,培养科学思维"
},
{
"lessonType": "ART",
"title": "艺术领域活动",
"description": "艺术表现与审美能力培养",
"suggestedOrder": 6,
"durationMinutes": 25,
"frequency": "每周1次",
"keyPoints": [
"欣赏与感受",
"创作与表现",
"分享与评价",
"作品展示活动"
],
"tips": "尊重幼儿创意,提供多样化材料,鼓励自由表达"
},
{
"lessonType": "HEALTH",
"title": "健康领域活动",
"description": "身体运动与健康生活习惯培养",
"suggestedOrder": 7,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"身体协调训练",
"生活习惯养成",
"安全意识教育",
"情绪管理学习"
],
"tips": "结合游戏活动,注重趣味性和参与度"
}
]' WHERE `name` = '';
-- 为好饿的毛毛虫课程添加排课计划参考
UPDATE `course` SET `schedule_ref_data` = '[
{
"lessonType": "INTRODUCTION",
"title": "导入课",
"description": "通过毛毛虫玩偶导入课程,激发幼儿对生命成长的好奇",
"suggestedOrder": 1,
"durationMinutes": 15,
"frequency": "每周1次连续2周",
"keyPoints": [
"出示毛毛虫玩偶,激发兴趣",
"提问关于毛毛虫的问题",
"介绍成长的概念"
],
"tips": "准备真实的毛毛虫或蝴蝶标本,增强直观感受"
},
{
"lessonType": "COLLECTIVE",
"title": "集体课",
"description": "绘本共读,了解毛毛虫的成长过程",
"suggestedOrder": 2,
"durationMinutes": 25,
"frequency": "每周2次连续4周",
"keyPoints": [
"完整讲述绘本故事",
"讨论每天吃的东西",
"数数练习1-5",
"认识星期概念"
],
"tips": "使用日历教具,帮助幼儿理解时间概念"
},
{
"lessonType": "LANGUAGE",
"title": "语言领域活动",
"description": "词汇扩展与句型练习",
"suggestedOrder": 3,
"durationMinutes": 20,
"frequency": "每周2次",
"keyPoints": [
"食物词汇学习",
"星期词汇学习",
"简单句型练习",
"故事复述"
],
"tips": "使用闪卡和实物,增加词汇学习的趣味性"
},
{
"lessonType": "SOCIETY",
"title": "社会领域活动",
"description": "生命教育与情感认知",
"suggestedOrder": 4,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"认识生命成长过程",
"分享自己的成长经历",
"关爱生命教育",
"分享与合作"
],
"tips": "邀请家长分享幼儿成长照片,增强情感连接"
},
{
"lessonType": "SCIENCE",
"title": "科学领域活动",
"description": "昆虫观察与自然科学探索",
"suggestedOrder": 5,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"观察昆虫特征",
"了解变态发育",
"种植观察活动",
"自然探索"
],
"tips": "准备放大镜、观察盒等科学工具"
},
{
"lessonType": "ART",
"title": "艺术领域活动",
"description": "创意手工与美术表达",
"suggestedOrder": 6,
"durationMinutes": 25,
"frequency": "每周1次",
"keyPoints": [
"毛毛虫手工制作",
"蝴蝶绘画创作",
"拼贴画活动",
"作品展示"
],
"tips": "提供多样化材料,鼓励自由创作"
},
{
"lessonType": "HEALTH",
"title": "健康领域活动",
"description": "健康饮食习惯培养",
"suggestedOrder": 7,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"认识健康食物",
"了解均衡饮食",
"良好饮食习惯",
"身体运动游戏"
],
"tips": "结合健康餐盘游戏,学习食物分类"
}
]' WHERE `name` = '饿';
-- 为三只小猪课程添加排课计划参考
UPDATE `course` SET `schedule_ref_data` = '[
{
"lessonType": "INTRODUCTION",
"title": "导入课",
"description": "通过小猪玩偶和房子图片导入课程主题",
"suggestedOrder": 1,
"durationMinutes": 15,
"frequency": "每周1次连续2周",
"keyPoints": [
"出示三只小猪图片",
"提问关于房子的问题",
"引入建房主题"
],
"tips": "准备不同材质的建筑材料样品"
},
{
"lessonType": "COLLECTIVE",
"title": "集体课",
"description": "绘本共读,理解故事情节和寓意",
"suggestedOrder": 2,
"durationMinutes": 25,
"frequency": "每周2次连续4周",
"keyPoints": [
"完整讲述故事",
"讨论三只房子区别",
"理解勤劳与智慧",
"角色扮演活动"
],
"tips": "准备动物头饰,增强角色扮演趣味性"
},
{
"lessonType": "LANGUAGE",
"title": "语言领域活动",
"description": "词汇扩展与语言表达",
"suggestedOrder": 3,
"durationMinutes": 20,
"frequency": "每周2次",
"keyPoints": [
"建筑材料词汇",
"形容词学习(结实、轻便等)",
"对话练习",
"故事创编"
],
"tips": "使用实物材料,增强词汇学习的直观性"
},
{
"lessonType": "SOCIETY",
"title": "社会领域活动",
"description": "劳动教育与团队协作",
"suggestedOrder": 4,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"认识劳动价值",
"培养勤劳品质",
"团队协作游戏",
"分享劳动成果"
],
"tips": "组织简单的劳动活动,体验劳动乐趣"
},
{
"lessonType": "SCIENCE",
"title": "科学领域活动",
"description": "建筑材料与结构探索",
"suggestedOrder": 5,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"认识不同建筑材料",
"探索材料特性",
"简单搭建活动",
"结构稳定性实验"
],
"tips": "准备积木、纸板等材料,开展搭建游戏"
},
{
"lessonType": "ART",
"title": "艺术领域活动",
"description": "美术创作与手工活动",
"suggestedOrder": 6,
"durationMinutes": 25,
"frequency": "每周1次",
"keyPoints": [
"房子绘画创作",
"小猪手工制作",
"拼贴画活动",
"作品展示分享"
],
"tips": "鼓励幼儿设计自己的理想房子"
},
{
"lessonType": "HEALTH",
"title": "健康领域活动",
"description": "身体运动与安全意识",
"suggestedOrder": 7,
"durationMinutes": 20,
"frequency": "每周1次",
"keyPoints": [
"跑跳运动游戏",
"安全意识教育",
"躲避游戏",
"身体协调训练"
],
"tips": "设计安全的追逐游戏,锻炼反应能力"
}
]' WHERE `name` = '';
-- 注意lesson_type 字段位于 course_lesson 表,不在 course 表中
-- 课程类型INTRODUCTION, COLLECTIVE, LANGUAGE, SOCIETY, SCIENCE, ART, HEALTH
-- 在 course_esson 表中定义,此处不需要更新