Files
schoolNews/docker/init-db/prepare-sql.sh

232 lines
6.7 KiB
Bash
Raw Normal View History

2025-11-24 11:50:15 +08:00
#!/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 "========================================"