完成从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>
227 lines
7.4 KiB
Markdown
227 lines
7.4 KiB
Markdown
# 数据库迁移指南
|
||
|
||
## 数据库配置
|
||
|
||
**服务器地址**: 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*
|