#!/bin/bash ############################################## # 数据库初始化SQL准备脚本 # 功能:将SQL文件复制到Docker初始化目录 # 基于:schoolNewsServ/.bin/mysql/sql/reInit.sh ############################################## set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 路径定义 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SQL_SOURCE_DIR="../../schoolNewsServ/.bin/mysql/sql" INIT_DB_DIR="$SCRIPT_DIR" echo "========================================" echo "数据库初始化SQL准备" echo "========================================" log_info "源SQL目录: $SQL_SOURCE_DIR" log_info "目标目录: $INIT_DB_DIR" echo "========================================" echo "" # 检查源目录 if [ ! -d "$SQL_SOURCE_DIR" ]; then log_error "源SQL目录不存在: $SQL_SOURCE_DIR" exit 1 fi # 备份现有SQL文件 if ls "$INIT_DB_DIR"/*.sql 1> /dev/null 2>&1; then log_warn "发现现有SQL文件,正在备份..." BACKUP_DIR="$INIT_DB_DIR/backup_$(date +%Y%m%d_%H%M%S)" mkdir -p "$BACKUP_DIR" mv "$INIT_DB_DIR"/*.sql "$BACKUP_DIR/" 2>/dev/null || true log_info "已备份到: $BACKUP_DIR" echo "" fi # 创建02-create-tables.sql log_info "创建表结构脚本: 02-create-tables.sql" cat > "$INIT_DB_DIR/02-create-tables.sql" << 'EOF' -- ======================================== -- 校园新闻管理系统 - 表结构创建脚本 -- 自动生成时间: $(date '+%Y-%m-%d %H:%M:%S') -- 基于: schoolNewsServ/.bin/mysql/sql/ -- ======================================== USE school_news; -- 检查是否已执行过此脚本 SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '02-create-tables.sql'); -- 如果已执行过,记录并退出 SELECT CASE WHEN @executed > 0 THEN '表结构已存在,跳过创建' ELSE '开始创建表结构...' END AS message; EOF # 合并所有createTable*.sql文件 log_info "合并表结构文件..." TABLE_FILES=( "createTableUser.sql" "createTablePermission.sql" "createTablePermissionControl.sql" "createTableResource.sql" "createTableCourse.sql" "createTableLearning.sql" "createTableUserCenter.sql" "createTableAI.sql" "createTableSystem.sql" "createTableAchievement.sql" "createTableCrontab.sql" "createTableMessage.sql" "createTableSensitive.sql" ) for file in "${TABLE_FILES[@]}"; do if [ -f "$SQL_SOURCE_DIR/$file" ]; then echo "" >> "$INIT_DB_DIR/02-create-tables.sql" echo "-- ========================================" >> "$INIT_DB_DIR/02-create-tables.sql" echo "-- $file" >> "$INIT_DB_DIR/02-create-tables.sql" echo "-- ========================================" >> "$INIT_DB_DIR/02-create-tables.sql" cat "$SQL_SOURCE_DIR/$file" >> "$INIT_DB_DIR/02-create-tables.sql" log_info " ✓ $file" else log_warn " ✗ $file (文件不存在)" fi done # 添加执行状态记录 cat >> "$INIT_DB_DIR/02-create-tables.sql" << 'EOF' -- 记录执行状态 INSERT IGNORE INTO _db_init_status (script_name) VALUES ('02-create-tables.sql'); SELECT '表结构创建完成' AS message; EOF echo "" # 创建03-init-data.sql log_info "创建初始数据脚本: 03-init-data.sql" cat > "$INIT_DB_DIR/03-init-data.sql" << 'EOF' -- ======================================== -- 校园新闻管理系统 - 初始数据导入脚本 -- 自动生成时间: $(date '+%Y-%m-%d %H:%M:%S') -- 基于: schoolNewsServ/.bin/mysql/sql/ -- ======================================== USE school_news; -- 检查是否已执行过此脚本 SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '03-init-data.sql'); SELECT CASE WHEN @executed > 0 THEN '初始数据已存在,跳过导入' ELSE '开始导入初始数据...' END AS message; EOF # 合并初始数据文件 log_info "合并初始数据文件..." DATA_FILES=( "initMenuData.sql" "initAllData.sql" "initCrontabMetaData.sql" ) for file in "${DATA_FILES[@]}"; do if [ -f "$SQL_SOURCE_DIR/$file" ]; then echo "" >> "$INIT_DB_DIR/03-init-data.sql" echo "-- ========================================" >> "$INIT_DB_DIR/03-init-data.sql" echo "-- $file" >> "$INIT_DB_DIR/03-init-data.sql" echo "-- ========================================" >> "$INIT_DB_DIR/03-init-data.sql" cat "$SQL_SOURCE_DIR/$file" >> "$INIT_DB_DIR/03-init-data.sql" log_info " ✓ $file" else log_warn " ✗ $file (文件不存在)" fi done # 添加爬虫配置初始化 cat >> "$INIT_DB_DIR/03-init-data.sql" << 'EOF' -- ======================================== -- Docker环境爬虫配置 -- ======================================== INSERT IGNORE INTO tb_sys_config (config_key, config_value, config_desc, created_at) VALUES ('crawler.pythonPath', '/usr/bin/python3', 'Docker容器内Python路径', NOW()), ('crawler.basePath', '/app/crawler', 'Docker容器内爬虫脚本路径', NOW()); -- 记录执行状态 INSERT IGNORE INTO _db_init_status (script_name) VALUES ('03-init-data.sql'); SELECT '初始数据导入完成' AS message; SELECT '默认用户: admin, 密码: admin123' AS tip; EOF echo "" # 生成统计信息 log_info "生成文件统计..." cat > "$INIT_DB_DIR/00-init-summary.txt" << EOF ======================================== 数据库初始化脚本准备完成 ======================================== 生成时间: $(date '+%Y-%m-%d %H:%M:%S') 源目录: $SQL_SOURCE_DIR 生成的文件: 01-init-database.sql - 数据库创建(已存在) 02-create-tables.sql - 表结构创建 03-init-data.sql - 初始数据导入 执行顺序: 1. 创建数据库和初始化标记表 2. 创建所有业务表 3. 导入初始数据(用户、菜单、系统配置等) 默认账户: 用户名: admin 密码: admin123 角色: 管理员 注意事项: 1. 脚本具有幂等性,可以重复执行 2. 使用 _db_init_status 表跟踪执行状态 3. Docker容器启动时自动执行这些脚本 4. 如需重新初始化,删除数据卷: docker-compose down -v ======================================== EOF echo "" log_info "========================================" log_info "准备完成!" log_info "========================================" log_info "生成的文件:" ls -lh "$INIT_DB_DIR"/*.sql 2>/dev/null | awk '{print " " $9 " (" $5 ")"}' echo "" log_info "下一步:" echo " 1. 检查生成的SQL文件" echo " 2. 运行Docker构建: ./build.sh" echo " 3. 启动服务: cd docker && docker-compose up -d" log_info "========================================"