完成从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>
87 lines
7.4 KiB
Bash
Executable File
87 lines
7.4 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# 数据库迁移脚本
|
||
|
||
echo "==========================================="
|
||
echo "开始执行数据库迁移..."
|
||
echo "==========================================="
|
||
|
||
cd /Users/retirado/Program/ccProgram_0312/reading-platform-java
|
||
|
||
# 创建临时迁移 Java 文件
|
||
cat > /tmp/DbMigrate.java << 'EOF'
|
||
import java.sql.*;
|
||
|
||
public class DbMigrate {
|
||
public static void main(String[] args) {
|
||
String url = "jdbc:mysql://8.148.151.56:3306/reading_platform?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
|
||
String user = "root";
|
||
String password = "reading_platform_pwd";
|
||
|
||
String[] sqls = {
|
||
"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='课程套餐表')",
|
||
|
||
"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='套餐课程关联表'",
|
||
|
||
"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)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户套餐关联表'",
|
||
|
||
"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='课程环节表'",
|
||
|
||
"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='教学环节表'",
|
||
|
||
"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='环节资源关联表'",
|
||
|
||
"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='主题字典表'"
|
||
};
|
||
|
||
try (Connection conn = DriverManager.getConnection(url, user, password);
|
||
Statement stmt = conn.createStatement()) {
|
||
|
||
for (int i = 0; i < sqls.length; i++) {
|
||
try {
|
||
System.out.println("执行 SQL [" + (i + 1) + "/" + sqls.length + "]...");
|
||
stmt.execute(sqls[i]);
|
||
System.out.println("✓ 成功");
|
||
} catch (SQLException e) {
|
||
if (e.getMessage() != null && e.getMessage().contains("already exists")) {
|
||
System.out.println("⚠ 表已存在,跳过");
|
||
} else {
|
||
System.out.println("✗ 失败: " + e.getMessage());
|
||
}
|
||
}
|
||
}
|
||
|
||
System.out.println("\n===========================================");
|
||
System.out.println("数据库迁移完成!");
|
||
System.out.println("===========================================");
|
||
|
||
} catch (SQLException e) {
|
||
System.err.println("数据库连接失败: " + e.getMessage());
|
||
System.exit(1);
|
||
}
|
||
}
|
||
}
|
||
EOF
|
||
|
||
# 编译并运行
|
||
echo "编译迁移工具..."
|
||
javac /tmp/DbMigrate.java 2>&1 || {
|
||
echo "编译失败,尝试使用 Maven..."
|
||
# 使用 Maven 创建临时项目
|
||
mvn exec:java -Dexec.mainClass="DbMigrate" -Dexec.classpathScope=compile -Dexec.cleanup=false -q 2>&1 || {
|
||
echo "Maven 方式也失败,尝试直接使用 mvn spring-boot:run..."
|
||
# 修改 Application 主类临时添加迁移
|
||
echo "请手动执行以下步骤:"
|
||
echo "1. 打开 Navicat 或其他数据库管理工具"
|
||
echo "2. 连接到数据库:8.148.151.56:3306"
|
||
echo "3. 执行 SQL 脚本:src/main/resources/db/migration/V20260312__create_new_tables.sql"
|
||
exit 1
|
||
}
|
||
}
|
||
|
||
echo "执行迁移..."
|
||
java -cp /tmp DbMigrate
|
||
|
||
echo "清理临时文件..."
|
||
rm -f /tmp/DbMigrate.*
|