开始增加支付-1
This commit is contained in:
+95
-21
@@ -5,7 +5,8 @@ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
COMPOSE_FILE="${ROOT_DIR}/deploy/docker-compose.dev.yml"
|
||||
BACKEND_ENV="${ROOT_DIR}/backend/.env"
|
||||
BACKEND_ENV_EXAMPLE="${ROOT_DIR}/backend/.env.example"
|
||||
INIT_SQL="${ROOT_DIR}/backend/migrations/000001_init.sql"
|
||||
MIGRATIONS_DIR="${ROOT_DIR}/backend/migrations"
|
||||
MYSQL_DATABASE="${DEV_MYSQL_DATABASE:-hfb_sys}"
|
||||
BACKEND_PORT="${DEV_BACKEND_PORT:-8080}"
|
||||
FRONTEND_PORT="${DEV_FRONTEND_PORT:-5173}"
|
||||
BACKEND_HEALTH_URL="${DEV_BACKEND_HEALTH_URL:-http://127.0.0.1:${BACKEND_PORT}/health}"
|
||||
@@ -53,12 +54,15 @@ show_help() {
|
||||
选项:
|
||||
--reset-db 重置数据库(删除并重建)
|
||||
--seed-only 仅重新同步基础数据
|
||||
--no-migrate 不执行数据库迁移
|
||||
--no-frontend 不启动前端
|
||||
--no-backend 不启动后端
|
||||
-h, --help 显示帮助信息
|
||||
|
||||
环境变量:
|
||||
DEV_RESET_DB=1 等同于 --reset-db
|
||||
DEV_MYSQL_DATABASE=hfb_sys
|
||||
开发数据库名
|
||||
DEV_BACKEND_PORT=8080
|
||||
后端端口占用检查端口
|
||||
DEV_FRONTEND_PORT=5173
|
||||
@@ -81,6 +85,7 @@ EOF
|
||||
# 参数解析
|
||||
RESET_DB="${DEV_RESET_DB:-0}"
|
||||
SEED_ONLY=0
|
||||
NO_MIGRATE=0
|
||||
NO_FRONTEND=0
|
||||
NO_BACKEND=0
|
||||
|
||||
@@ -94,6 +99,10 @@ while [[ $# -gt 0 ]]; do
|
||||
SEED_ONLY=1
|
||||
shift
|
||||
;;
|
||||
--no-migrate)
|
||||
NO_MIGRATE=1
|
||||
shift
|
||||
;;
|
||||
--no-frontend)
|
||||
NO_FRONTEND=1
|
||||
shift
|
||||
@@ -208,29 +217,87 @@ mysql_hfb() {
|
||||
docker exec -i -e MYSQL_PWD=secret hfb-mysql mysql -uhfb "$@"
|
||||
}
|
||||
|
||||
init_database() {
|
||||
if [[ "${RESET_DB}" == "1" ]]; then
|
||||
log_warn "重置数据库..."
|
||||
mysql_root -e \
|
||||
"DROP DATABASE IF EXISTS hfb_sys; CREATE DATABASE hfb_sys CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||
mysql_scalar() {
|
||||
mysql_hfb --default-character-set=utf8mb4 -N -s -e "$1" "${MYSQL_DATABASE}"
|
||||
}
|
||||
|
||||
validate_database_name() {
|
||||
if [[ ! "${MYSQL_DATABASE}" =~ ^[A-Za-z0-9_]+$ ]]; then
|
||||
log_error "DEV_MYSQL_DATABASE 只能包含字母、数字和下划线,当前值:${MYSQL_DATABASE}"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
reset_database() {
|
||||
if [[ "${RESET_DB}" != "1" ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
local table_count
|
||||
table_count="$(
|
||||
mysql_hfb -N -s -e \
|
||||
"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'hfb_sys' AND table_name = 'users';" 2>/dev/null
|
||||
)"
|
||||
log_warn "重置数据库 ${MYSQL_DATABASE}..."
|
||||
mysql_root -e \
|
||||
"DROP DATABASE IF EXISTS \`${MYSQL_DATABASE}\`; CREATE DATABASE \`${MYSQL_DATABASE}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
|
||||
log_success "数据库已重建"
|
||||
}
|
||||
|
||||
if [[ "${table_count}" == "0" ]]; then
|
||||
log "首次启动,初始化数据库..."
|
||||
log "执行初始化脚本:$(basename "${INIT_SQL}")"
|
||||
mysql_hfb --default-character-set=utf8mb4 hfb_sys < "${INIT_SQL}"
|
||||
log_success "数据库初始化完成"
|
||||
elif [[ "${SEED_ONLY}" == "1" ]]; then
|
||||
log "重新同步基础数据..."
|
||||
mysql_hfb --default-character-set=utf8mb4 hfb_sys < "${INIT_SQL}"
|
||||
ensure_migration_table() {
|
||||
mysql_hfb --default-character-set=utf8mb4 "${MYSQL_DATABASE}" <<'SQL'
|
||||
CREATE TABLE IF NOT EXISTS schema_migrations (
|
||||
version VARCHAR(255) PRIMARY KEY,
|
||||
applied_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
SQL
|
||||
}
|
||||
|
||||
bootstrap_existing_schema_history() {
|
||||
local migration_count users_exists
|
||||
migration_count="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations;")"
|
||||
users_exists="$(mysql_scalar "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'users';")"
|
||||
|
||||
if [[ "${migration_count}" == "0" && "${users_exists}" != "0" ]]; then
|
||||
log_warn "检测到已有表结构但没有迁移记录,补记 000001_init 并同步初始化脚本"
|
||||
mysql_hfb --default-character-set=utf8mb4 -e \
|
||||
"INSERT IGNORE INTO schema_migrations (version) VALUES ('000001_init');" "${MYSQL_DATABASE}"
|
||||
fi
|
||||
}
|
||||
|
||||
run_migrations() {
|
||||
if [[ "${NO_MIGRATE}" == "1" ]]; then
|
||||
log_warn "已跳过数据库迁移"
|
||||
return 0
|
||||
fi
|
||||
|
||||
log "自动发现并执行数据库迁移..."
|
||||
ensure_migration_table
|
||||
bootstrap_existing_schema_history
|
||||
|
||||
local file version applied
|
||||
local found=0
|
||||
shopt -s nullglob
|
||||
for file in "${MIGRATIONS_DIR}"/*.sql; do
|
||||
found=1
|
||||
version="$(basename "${file}" .sql)"
|
||||
applied="$(mysql_scalar "SELECT COUNT(*) FROM schema_migrations WHERE version = '${version}';")"
|
||||
if [[ "${applied}" != "0" ]]; then
|
||||
if [[ "${version}" == "000001_init" ]]; then
|
||||
log "同步初始化脚本:${version}"
|
||||
mysql_hfb --default-character-set=utf8mb4 "${MYSQL_DATABASE}" < "${file}"
|
||||
else
|
||||
log "跳过已应用迁移:${version}"
|
||||
fi
|
||||
continue
|
||||
fi
|
||||
|
||||
log "执行迁移:${version}"
|
||||
mysql_hfb --default-character-set=utf8mb4 "${MYSQL_DATABASE}" < "${file}"
|
||||
mysql_hfb --default-character-set=utf8mb4 -e \
|
||||
"INSERT INTO schema_migrations (version) VALUES ('${version}');" "${MYSQL_DATABASE}"
|
||||
done
|
||||
shopt -u nullglob
|
||||
|
||||
if [[ "${found}" == "0" ]]; then
|
||||
log_warn "未发现迁移文件:${MIGRATIONS_DIR}/*.sql"
|
||||
else
|
||||
log "数据库已存在,跳过迁移(使用 --reset-db 重建)"
|
||||
log_success "数据库迁移完成"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -308,6 +375,12 @@ main() {
|
||||
trap cleanup EXIT
|
||||
trap 'cleanup; exit 130' INT TERM
|
||||
|
||||
validate_database_name
|
||||
if [[ "${RESET_DB}" == "1" && "${NO_MIGRATE}" == "1" ]]; then
|
||||
log_error "--reset-db 会清空数据库,不能和 --no-migrate 同时使用"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "启动开发依赖:MySQL、Redis、MinIO"
|
||||
docker compose -f "${COMPOSE_FILE}" up -d
|
||||
|
||||
@@ -315,7 +388,8 @@ main() {
|
||||
wait_container_healthy hfb-redis "Redis"
|
||||
wait_container_healthy hfb-minio "MinIO"
|
||||
|
||||
init_database
|
||||
reset_database
|
||||
run_migrations
|
||||
|
||||
# 仅同步基础数据模式
|
||||
if [[ "${SEED_ONLY}" == "1" ]]; then
|
||||
|
||||
Reference in New Issue
Block a user