开始增加支付-1

This commit is contained in:
yml
2026-06-03 12:21:23 +08:00
parent 6dcea2d56c
commit ae8928f458
22 changed files with 2098 additions and 33 deletions
+95 -21
View File
@@ -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