kindergarten_java/docs/数据库迁移指南.md
Claude Opus 4.6 081fac9d97 feat: Java后端迁移完成 - 资源管理API修复与文档更新
完成从Node.js/NestJS到Java Spring Boot的后端迁移,修复资源管理API错误。

**核心修复:**
- 修复资源库API 500错误 - ResourceLibrary/ResourceItem实体与数据库表结构对齐
- 更新ID类型从Long改为String,匹配数据库varchar(32)
- 修正字段映射(libraryType → type)

**新增Java实体(7个):**
- CoursePackage, CoursePackageCourse, TenantPackage
- CourseLesson, LessonStep, LessonStepResource
- Theme

**新增API控制器(5个):**
- AdminResourceController - 资源库管理
- AdminPackageController - 课程套餐管理
- AdminCourseLessonController - 课程环节管理
- AdminThemeController - 主题字典管理
- SchoolPackageController - 学校套餐管理

**新增服务层(5个):**
- ResourceLibraryService, CoursePackageService, CourseLessonService
- ThemeService, FileStorageService

**文档更新:**
- 新增 Java环境配置与启动指南.md
- 新增 Java后端启动完整指南.md
- 新增 数据库迁移指南.md
- 更新 CHANGELOG.md 和开发日志

**前端修复:**
- 解决package.json合并冲突

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 19:49:48 +08:00

227 lines
7.4 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.

# 数据库迁移指南
## 数据库配置
**服务器地址**: 8.148.151.56:3306
**数据库名**: reading_platform
**用户名**: root
**密码**: reading_platform_pwd
---
## 需要创建的表
本次迁移需要创建以下 7 个新表:
1. **course_package** - 课程套餐表
2. **course_package_course** - 套餐课程关联表
3. **tenant_package** - 租户套餐关联表
4. **course_lesson** - 课程环节表
5. **lesson_step** - 教学环节表
6. **lesson_step_resource** - 环节资源关联表
7. **theme** - 主题字典表
---
## 执行方式
### 方式 1使用数据库管理工具推荐
1. 打开 Navicat、phpMyAdmin、DBeaver 等数据库管理工具
2. 连接到数据库:`8.148.151.56:3306`
3. 选择数据库:`reading_platform`
4. 打开 SQL 执行窗口
5. 复制下面的 SQL 脚本并执行
### 方式 2使用 MySQL 命令行
```bash
mysql -h 8.148.151.56 -P 3306 -u root -preading_platform_pwd reading_platform < V20260312__create_new_tables.sql
```
### 方式 3在线执行如果没有本地工具
访问在线 SQL 执行工具或使用 SSH 连接到服务器后执行。
---
## SQL 脚本
### 1. 课程套餐表
```sql
CREATE TABLE IF NOT EXISTS `course_package` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL COMMENT '套餐名称',
`description` TEXT COMMENT '套餐描述',
`price` BIGINT NOT NULL COMMENT '价格(分)',
`discount_price` BIGINT COMMENT '折后价格(分)',
`discount_type` VARCHAR(50) COMMENT '折扣类型',
`grade_levels` VARCHAR(500) COMMENT '适用年级',
`course_count` INT NOT NULL DEFAULT 0 COMMENT '课程数量',
`status` VARCHAR(50) NOT NULL DEFAULT 'DRAFT' COMMENT '状态',
`submitted_at` DATETIME COMMENT '提交时间',
`submitted_by` BIGINT COMMENT '提交人ID',
`reviewed_at` DATETIME COMMENT '审核时间',
`reviewed_by` BIGINT COMMENT '审核人ID',
`review_comment` TEXT COMMENT '审核意见',
`published_at` DATETIME COMMENT '发布时间',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程套餐表';
```
### 2. 套餐课程关联表
```sql
CREATE TABLE IF NOT EXISTS `course_package_course` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`package_id` BIGINT NOT NULL COMMENT '套餐ID',
`course_id` BIGINT NOT NULL COMMENT '课程ID',
`grade_level` VARCHAR(50) COMMENT '适用年级',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_package_course` (`package_id`, `course_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='套餐课程关联表';
```
### 3. 租户套餐关联表
```sql
CREATE TABLE IF NOT EXISTS `tenant_package` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`tenant_id` BIGINT NOT NULL COMMENT '租户ID',
`package_id` BIGINT NOT NULL COMMENT '套餐ID',
`start_date` DATE NOT NULL COMMENT '开始日期',
`end_date` DATE NOT NULL COMMENT '结束日期',
`price_paid` BIGINT NOT NULL DEFAULT 0 COMMENT '实付价格',
`status` VARCHAR(50) NOT NULL DEFAULT 'ACTIVE' COMMENT '状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_package_id` (`package_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户套餐关联表';
```
### 4. 课程环节表
```sql
CREATE TABLE IF NOT EXISTS `course_lesson` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`course_id` BIGINT NOT NULL COMMENT '课程ID',
`lesson_type` VARCHAR(50) NOT NULL COMMENT '课程类型',
`name` VARCHAR(255) NOT NULL COMMENT '课程名称',
`description` TEXT COMMENT '课程描述',
`duration` INT COMMENT '时长(分钟)',
`video_path` VARCHAR(500) COMMENT '视频路径',
`video_name` VARCHAR(255) COMMENT '视频名称',
`ppt_path` VARCHAR(500) COMMENT 'PPT路径',
`ppt_name` VARCHAR(255) COMMENT 'PPT名称',
`pdf_path` VARCHAR(500) COMMENT 'PDF路径',
`pdf_name` VARCHAR(255) COMMENT 'PDF名称',
`objectives` TEXT COMMENT '教学目标',
`preparation` TEXT COMMENT '教学准备',
`extension` TEXT COMMENT '教学延伸',
`reflection` TEXT COMMENT '教学反思',
`assessment_data` TEXT COMMENT '评测数据',
`use_template` TINYINT(1) DEFAULT 0 COMMENT '是否使用模板',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_course_id` (`course_id`),
UNIQUE KEY `uk_course_lesson_type` (`course_id`, `lesson_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程环节表';
```
### 5. 教学环节表
```sql
CREATE TABLE IF NOT EXISTS `lesson_step` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`lesson_id` BIGINT NOT NULL COMMENT '课程环节ID',
`name` VARCHAR(255) NOT NULL COMMENT '环节名称',
`content` TEXT COMMENT '环节内容',
`duration` INT NOT NULL DEFAULT 5 COMMENT '时长(分钟)',
`objective` TEXT COMMENT '教学目标',
`resource_ids` TEXT COMMENT '资源ID列表',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_lesson_id` (`lesson_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教学环节表';
```
### 6. 环节资源关联表
```sql
CREATE TABLE IF NOT EXISTS `lesson_step_resource` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`step_id` BIGINT NOT NULL COMMENT '环节ID',
`resource_id` BIGINT NOT NULL COMMENT '资源ID',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
PRIMARY KEY (`id`),
KEY `idx_step_id` (`step_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='环节资源关联表';
```
### 7. 主题字典表
```sql
CREATE TABLE IF NOT EXISTS `theme` (
`id` BIGINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL COMMENT '主题名称',
`description` TEXT COMMENT '主题描述',
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`status` VARCHAR(50) NOT NULL DEFAULT 'ACTIVE' COMMENT '状态',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='主题字典表';
```
---
## 验证表创建
执行完成后,运行以下 SQL 验证:
```sql
-- 查看所有表
SHOW TABLES;
-- 查看新创建的表
SELECT TABLE_NAME, TABLE_COMMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'reading_platform'
AND TABLE_NAME IN ('course_package', 'course_package_course', 'tenant_package',
'course_lesson', 'lesson_step', 'lesson_step_resource', 'theme');
```
---
## 注意事项
1. **执行前备份**: 建议先备份数据库
2. **字符集**: 所有表使用 utf8mb4 字符集
3. **引擎**: 使用 InnoDB 存储引擎
4. **索引**: 已创建必要的索引以提高查询性能
---
## 下一步
表创建完成后,可以:
1. 启动 Java 后端应用
2. 访问 Swagger 文档测试 API`http://localhost:8080/swagger-ui.html`
3. 进行功能测试
---
*创建时间: 2026-03-12*