部署脚本

This commit is contained in:
wanghai
2026-07-20 13:46:08 +08:00
parent ba4d74a23f
commit 5cc55f7f03
6 changed files with 541 additions and 162 deletions

View File

@@ -20,6 +20,9 @@ CONTAINER_NAME="ecshopx-dev"
WEB_CONTAINER_NAME="ecshopx-web-frontend"
DOCKER_COMPOSE_FILE="$PROJECT_ROOT/docker-compose.dev.yml"
# 公开前端仓库地址;默认使用 Gitee 方便国内用户,如需 GitHub 可在运行脚本前导出 PUBLIC_REPO_BASE_URL 覆盖
PUBLIC_REPO_BASE_URL="${PUBLIC_REPO_BASE_URL:-https://gitee.com/ShopeX}"
# 数据库配置
MYSQL_ROOT_PWD="rootpassword"
MYSQL_DATABASE="ecshopx"
@@ -48,6 +51,10 @@ PC_URL="http://localhost:8082"
QIANKUN_ENTRY_URL="http://localhost:8080/newpc/"
MOBILE_API_URL="http://localhost:8080/api/h5app/wxapp"
PC_API_URL="http://localhost:8080/api/h5app"
ADMIN_HOST_PORT="8080"
H5_HOST_PORT="8081"
PC_HOST_PORT="8082"
NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS="http://localhost:8080"
# 业务模式(全局变量,在 build_admin 中设置build_vshop 中复用)
SELECTED_PLATFORM=""
@@ -55,6 +62,9 @@ SELECTED_PLATFORM=""
# 默认语言(全局变量,在第一个编译的项目中设置,后续项目复用)
SELECTED_LANG=""
# 最近一次前端 .env 配置是否发生变化build_* 中用于决定已有产物能否跳过编译)
FRONTEND_ENV_CHANGED=false
# 语言/业务模式等交互必须从 /dev/tty 读取:若仅从 stdin 读,在「管道、重定向、部分 IDE 集成终端」下会立即 EOF
# 空变量会触发 ${VAR:-1},表现为未确认就选用默认项 1。
@@ -130,6 +140,53 @@ validate_public_url() {
esac
}
extract_host_port_from_url() {
local url=$1
local default_port=$2
local without_scheme=""
local authority=""
local port=""
without_scheme=${url#*://}
authority=${without_scheme%%/*}
case "$authority" in
*:*)
port=${authority##*:}
;;
*)
port=$default_port
;;
esac
case "$port" in
''|*[!0-9]*)
log_error "访问地址端口无效: $url"
exit 1
;;
esac
if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
log_error "访问地址端口超出范围: $url"
exit 1
fi
echo "$port"
}
configure_docker_host_ports() {
ADMIN_HOST_PORT=$(extract_host_port_from_url "$ADMIN_URL" "8080")
H5_HOST_PORT=$(extract_host_port_from_url "$H5_URL" "8081")
PC_HOST_PORT=$(extract_host_port_from_url "$PC_URL" "8082")
export ADMIN_HOST_PORT H5_HOST_PORT PC_HOST_PORT
log_info "Docker 宿主机端口映射:"
log_info " 管理后台/API: ${ADMIN_HOST_PORT}->8080"
log_info " H5前端: ${H5_HOST_PORT}->8081"
log_info " PC前端: ${PC_HOST_PORT}->8082"
}
set_url_defaults_from_site_url() {
local normalized_site_url
normalized_site_url=$(trim_trailing_slashes "$SITE_URL")
@@ -148,6 +205,36 @@ derive_api_base_from_admin_url() {
PC_API_URL="$normalized_api_url/h5app"
}
origin_from_url() {
local url=$1
local scheme=""
local without_scheme=""
local authority=""
scheme=${url%%://*}
without_scheme=${url#*://}
authority=${without_scheme%%/*}
echo "${scheme}://${authority}"
}
read_env_value() {
local env_file=$1
local key=$2
local value=""
if [ ! -f "$env_file" ]; then
return 0
fi
value=$(grep -m 1 "^${key}=" "$env_file" 2>/dev/null | cut -d'=' -f2- || true)
value=${value%\"}
value=${value#\"}
value=${value%\'}
value=${value#\'}
echo "$value"
}
configure_public_urls() {
if [ -z "$SITE_URL" ] && [ -z "$ADMIN_URL_OVERRIDE" ] && [ -z "$H5_URL_OVERRIDE" ] && [ -z "$PC_URL_OVERRIDE" ]; then
echo ""
@@ -187,6 +274,10 @@ configure_public_urls() {
fi
derive_api_base_from_admin_url
export NUXT_PUBLIC_API_BASE="$PC_API_URL"
NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$(origin_from_url "$ADMIN_URL")
export NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS="$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS"
configure_docker_host_ports
log_info "访问地址配置完成:"
log_info " 管理后台: $ADMIN_URL"
@@ -504,7 +595,7 @@ check_and_clone_frontend() {
# 检查 ECShopX_web-frontend
PC_DIR="$PARENT_DIR/ECShopX_web-frontend"
PC_REPO="https://gitee.com/ShopeX/ECShopX_web-frontend.git"
PC_REPO="$PUBLIC_REPO_BASE_URL/ECShopX_web-frontend.git"
if [ ! -d "$PC_DIR" ] || [ ! -f "$PC_DIR/package.json" ]; then
if [ ! -d "$PC_DIR" ]; then
@@ -560,7 +651,7 @@ check_and_clone_frontend() {
# 检查 ECShopX_admin-frontend
ADMIN_DIR="$PARENT_DIR/ECShopX_admin-frontend"
ADMIN_REPO="https://gitee.com/ShopeX/ECShopX_admin-frontend.git"
ADMIN_REPO="$PUBLIC_REPO_BASE_URL/ECShopX_admin-frontend.git"
if [ ! -d "$ADMIN_DIR" ] || [ ! -f "$ADMIN_DIR/package.json" ]; then
if [ ! -d "$ADMIN_DIR" ]; then
@@ -620,7 +711,7 @@ check_and_clone_frontend() {
# 检查 ECShopX_mobile-frontend
VSHOP_DIR="$PARENT_DIR/ECShopX_mobile-frontend"
VSHOP_REPO="https://gitee.com/ShopeX/ECShopX_mobile-frontend.git"
VSHOP_REPO="$PUBLIC_REPO_BASE_URL/ECShopX_mobile-frontend.git"
if [ ! -d "$VSHOP_DIR" ] || [ ! -f "$VSHOP_DIR/package.json" ]; then
if [ ! -d "$VSHOP_DIR" ]; then
@@ -915,6 +1006,104 @@ read_product_model_from_env() {
fi
}
preserve_existing_product_model() {
local product_model=""
product_model=$(read_env_value "$PROJECT_ROOT/.env" "PRODUCT_MODEL")
if [ -z "$product_model" ] && docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$" 2>/dev/null; then
product_model=$(docker exec "$CONTAINER_NAME" sh -c \
"cd /data/httpd/ECShopX && grep '^PRODUCT_MODEL=' .env 2>/dev/null | cut -d'=' -f2" 2>/dev/null || true)
fi
if [ "$product_model" = "standard" ]; then
SELECTED_PLATFORM="standard"
log_info "检测到现有 PRODUCT_MODEL=standard保留 B2C 业务模式"
return 0
fi
if [ "$product_model" = "platform" ]; then
SELECTED_PLATFORM="platform"
log_info "检测到现有 PRODUCT_MODEL=platform保留 BBC 业务模式"
return 0
fi
return 1
}
load_existing_frontend_lang() {
if [ -n "$SELECTED_LANG" ]; then
return 0
fi
local lang=""
lang=$(read_env_value "$PARENT_DIR/ECShopX_admin-frontend/.env" "VUE_APP_DEFAULT_LANG")
if [ -z "$lang" ]; then
lang=$(read_env_value "$PARENT_DIR/ECShopX_web-frontend/.env" "NUXT_PUBLIC_DEFAULT_COUNTRY_CODE")
fi
if [ -z "$lang" ]; then
lang=$(read_env_value "$PARENT_DIR/ECShopX_mobile-frontend/.env" "APP_I18N_ORIGIN_LANG")
fi
if [ "$lang" = "zh-CN" ]; then
SELECTED_LANG="zhcn"
log_info "从现有前端 .env 读取默认语言: $SELECTED_LANG"
elif [ "$lang" = "en-CN" ]; then
SELECTED_LANG="en"
log_info "从现有前端 .env 读取默认语言: $SELECTED_LANG"
elif [ "$lang" = "zhcn" ] || [ "$lang" = "en" ]; then
SELECTED_LANG="$lang"
log_info "从现有前端 .env 读取默认语言: $SELECTED_LANG"
fi
}
ensure_selected_lang() {
load_existing_frontend_lang
if [ -n "$SELECTED_LANG" ]; then
log_info "复用默认语言: $SELECTED_LANG"
return 0
fi
echo ""
log_info "请选择默认语言:"
log_info " 1) 中文 (zhcn)"
log_info " 2) 英文 (en)"
echo ""
while true; do
read -r -p "请输入选项 (1 或 2默认: 1): " LANG_CHOICE < /dev/tty
LANG_CHOICE=${LANG_CHOICE:-1}
if [ "$LANG_CHOICE" = "1" ] || [ "$LANG_CHOICE" = "zhcn" ] || [ "$LANG_CHOICE" = "zh" ]; then
SELECTED_LANG="zhcn"
break
elif [ "$LANG_CHOICE" = "2" ] || [ "$LANG_CHOICE" = "en" ] || [ "$LANG_CHOICE" = "english" ]; then
SELECTED_LANG="en"
break
else
log_error "无效的选项,请输入 1 或 2"
fi
done
echo ""
log_info "已选择默认语言: $SELECTED_LANG"
echo ""
}
pc_api_country_code_for_lang() {
local lang=$1
case "$lang" in
en|en-CN|en_US|en-US)
echo "en-CN"
;;
zhcn|zh|zh-CN|zh_CN|"")
echo "zh-CN"
;;
*)
echo "$lang"
;;
esac
}
# ===========================================
# 配置 PHP 应用
# ===========================================
@@ -952,28 +1141,30 @@ configure_application() {
(grep -q '^SHOP_ADMIN_URL=' .env && sed -i 's|^SHOP_ADMIN_URL=.*|SHOP_ADMIN_URL=$ADMIN_URL/|' .env || echo 'SHOP_ADMIN_URL=$ADMIN_URL/' >> .env) && \
(grep -q '^API_BASE_URL=' .env && sed -i 's|^API_BASE_URL=.*|API_BASE_URL=$API_BASE_URL|' .env || echo 'API_BASE_URL=$API_BASE_URL' >> .env)" 2>/dev/null || true
# 选择业务模式并写入 PRODUCT_MODEL
echo ""
log_info "请选择业务模式:"
log_info " 1) BBC (多商户入驻电商平台模式)"
log_info " 2) B2C (线上商城、O2O云店、内购商城、供应链线上商城等模式)"
echo ""
while true; do
read -r -p "请输入选项 (1 或 2默认: 1): " BIZ_MODE_CHOICE < /dev/tty
BIZ_MODE_CHOICE=${BIZ_MODE_CHOICE:-1}
if [ "$BIZ_MODE_CHOICE" = "1" ] || [ "$BIZ_MODE_CHOICE" = "bbc" ]; then
SELECTED_PLATFORM="platform"
log_info "已选择业务模式: BBC (B2B2C)"
break
elif [ "$BIZ_MODE_CHOICE" = "2" ] || [ "$BIZ_MODE_CHOICE" = "b2c" ]; then
SELECTED_PLATFORM="standard"
log_info "已选择业务模式: B2C"
break
else
log_error "无效的选项,请输入 1 或 2"
fi
done
echo ""
# 选择业务模式并写入 PRODUCT_MODEL;重跑脚本时优先保留已有安装模式
if ! preserve_existing_product_model; then
echo ""
log_info "请选择业务模式"
log_info " 1) BBC (多商户入驻电商平台模式)"
log_info " 2) B2C (线上商城、O2O云店、内购商城、供应链线上商城等模式)"
echo ""
while true; do
read -r -p "请输入选项 (1 或 2默认: 1): " BIZ_MODE_CHOICE < /dev/tty
BIZ_MODE_CHOICE=${BIZ_MODE_CHOICE:-1}
if [ "$BIZ_MODE_CHOICE" = "1" ] || [ "$BIZ_MODE_CHOICE" = "bbc" ]; then
SELECTED_PLATFORM="platform"
log_info "已选择业务模式: BBC (B2B2C)"
break
elif [ "$BIZ_MODE_CHOICE" = "2" ] || [ "$BIZ_MODE_CHOICE" = "b2c" ]; then
SELECTED_PLATFORM="standard"
log_info "已选择业务模式: B2C"
break
else
log_error "无效的选项,请输入 1 或 2"
fi
done
echo ""
fi
# 将 PRODUCT_MODEL 写入 ECShopX 的 .env
docker exec "$CONTAINER_NAME" sh -c "cd /data/httpd/ECShopX && \
@@ -1337,6 +1528,7 @@ configure_frontend_env() {
local pc_url=${6:-"$PC_URL"}
local qiankun_entry_url=${7:-"$QIANKUN_ENTRY_URL"}
local target_container="$CONTAINER_NAME"
FRONTEND_ENV_CHANGED=false
# 检查主机目录是否存在
if [ ! -d "$project_dir" ]; then
@@ -1362,6 +1554,9 @@ configure_frontend_env() {
if ! docker ps --format '{{.Names}}' | grep -q "^${target_container}$" 2>/dev/null; then
log_info "容器 $target_container 未运行,配置主机目录的 .env 文件..."
local env_file="$project_dir/.env"
local env_before=""
local env_after=""
env_before=$(cat "$env_file" 2>/dev/null || true)
# 如果 .env 不存在,尝试从 .env.example 复制
if [ ! -f "$env_file" ]; then
@@ -1481,6 +1676,8 @@ configure_frontend_env() {
# 配置 ECShopX_web-frontend
if [ "$project_name" = "ECShopX_web-frontend" ]; then
local pc_default_country_code=""
# 使用 sed 修改或添加 NUXT_PUBLIC_API_BASE
if grep -q "^NUXT_PUBLIC_API_BASE=" "$env_file" 2>/dev/null; then
# macOS 和 Linux 兼容的 sed 命令
@@ -1493,35 +1690,49 @@ configure_frontend_env() {
echo "NUXT_PUBLIC_API_BASE=$api_base_url" >> "$env_file"
fi
log_success "已配置 NUXT_PUBLIC_API_BASE=$api_base_url"
# 配置 NUXT_PUBLIC_COMPANY_ID默认值为1
if grep -q "^NUXT_PUBLIC_COMPANY_ID=" "$env_file" 2>/dev/null; then
# macOS 和 Linux 兼容的 sed 命令
# 配置 PC 装修预览允许接收的后台 origin
if grep -q "^NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=" "$env_file" 2>/dev/null; then
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s|^NUXT_PUBLIC_COMPANY_ID=.*|NUXT_PUBLIC_COMPANY_ID=1|" "$env_file"
sed -i '' "s|^NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=.*|NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS|" "$env_file"
else
sed -i "s|^NUXT_PUBLIC_COMPANY_ID=.*|NUXT_PUBLIC_COMPANY_ID=1|" "$env_file"
sed -i "s|^NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=.*|NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS|" "$env_file"
fi
else
echo "NUXT_PUBLIC_COMPANY_ID=1" >> "$env_file"
echo "NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS" >> "$env_file"
fi
log_success "已配置 NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS"
# 配置 NUXT_PUBLIC_COMPANY_ID默认值为1已有值可能对应已安装店铺重跑脚本时不覆盖
if grep -q "^NUXT_PUBLIC_COMPANY_ID=" "$env_file" 2>/dev/null; then
log_info "NUXT_PUBLIC_COMPANY_ID 已存在,保留当前值"
else
echo "NUXT_PUBLIC_COMPANY_ID=1" >> "$env_file"
log_success "NUXT_PUBLIC_COMPANY_ID 不存在,已配置默认值 1"
fi
log_success "已配置 NUXT_PUBLIC_COMPANY_ID=1"
# 配置 NUXT_PUBLIC_DEFAULT_COUNTRY_CODE如果提供
if [ -n "$default_lang" ]; then
pc_default_country_code=$(pc_api_country_code_for_lang "$default_lang")
if grep -q "^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=" "$env_file" 2>/dev/null; then
# macOS 和 Linux 兼容的 sed 命令
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s|^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=.*|NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$default_lang|" "$env_file"
sed -i '' "s|^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=.*|NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$pc_default_country_code|" "$env_file"
else
sed -i "s|^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=.*|NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$default_lang|" "$env_file"
sed -i "s|^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=.*|NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$pc_default_country_code|" "$env_file"
fi
else
echo "NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$default_lang" >> "$env_file"
echo "NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$pc_default_country_code" >> "$env_file"
fi
log_success "已配置 NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$default_lang"
log_success "已配置 NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$pc_default_country_code"
fi
fi
env_after=$(cat "$env_file" 2>/dev/null || true)
if [ "$env_before" != "$env_after" ]; then
FRONTEND_ENV_CHANGED=true
log_info "$project_name .env 已更新"
fi
else
# 容器运行中,配置容器内的 .env 文件
# 检查容器内目录是否存在
@@ -1529,6 +1740,10 @@ configure_frontend_env() {
log_warning "容器 $target_container$container_path 目录不存在,跳过配置"
return 0
fi
local env_before=""
local env_after=""
env_before=$(docker exec "$target_container" sh -c "cd $container_path && [ -f .env ] && cat .env" 2>/dev/null || true)
# 在容器内配置 .env 文件
docker exec "$target_container" sh -c "
@@ -1633,6 +1848,8 @@ configure_frontend_env() {
# 配置 ECShopX_web-frontend
if [ "$project_name" = "ECShopX_web-frontend" ]; then
local pc_default_country_code=""
docker exec "$target_container" sh -c "
cd $container_path && \
if grep -q '^NUXT_PUBLIC_API_BASE=' .env 2>/dev/null; then
@@ -1642,31 +1859,52 @@ configure_frontend_env() {
fi
" 2>/dev/null || true
log_success "已配置容器内 NUXT_PUBLIC_API_BASE=$api_base_url"
docker exec "$target_container" sh -c "
cd $container_path && \
if grep -q '^NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=' .env 2>/dev/null; then
sed -i 's|^NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=.*|NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS|' .env
else
echo 'NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS' >> .env
fi
" 2>/dev/null || true
log_success "已配置容器内 NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS=$NUXT_PUBLIC_DECORATION_ADMIN_ORIGINS"
# 配置 NUXT_PUBLIC_COMPANY_ID默认值为1
# 配置 NUXT_PUBLIC_COMPANY_ID默认值为1:已有值可能对应已安装店铺,重跑脚本时不覆盖
docker exec "$target_container" sh -c "
cd $container_path && \
if grep -q '^NUXT_PUBLIC_COMPANY_ID=' .env 2>/dev/null; then
sed -i 's|^NUXT_PUBLIC_COMPANY_ID=.*|NUXT_PUBLIC_COMPANY_ID=1|' .env
true
else
echo 'NUXT_PUBLIC_COMPANY_ID=1' >> .env
fi
" 2>/dev/null || true
log_success "已配置容器内 NUXT_PUBLIC_COMPANY_ID=1"
if docker exec "$target_container" sh -c "cd $container_path && grep -q '^NUXT_PUBLIC_COMPANY_ID=' .env" 2>/dev/null; then
log_info "容器内 NUXT_PUBLIC_COMPANY_ID 已存在或已配置默认值"
else
log_warning "容器内 NUXT_PUBLIC_COMPANY_ID 配置失败"
fi
# 配置 NUXT_PUBLIC_DEFAULT_COUNTRY_CODE如果提供
if [ -n "$default_lang" ]; then
pc_default_country_code=$(pc_api_country_code_for_lang "$default_lang")
docker exec "$target_container" sh -c "
cd $container_path && \
if grep -q '^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=' .env 2>/dev/null; then
sed -i 's|^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=.*|NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$default_lang|' .env
sed -i 's|^NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=.*|NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$pc_default_country_code|' .env
else
echo 'NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$default_lang' >> .env
echo 'NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$pc_default_country_code' >> .env
fi
" 2>/dev/null || true
log_success "已配置容器内 NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$default_lang"
log_success "已配置容器内 NUXT_PUBLIC_DEFAULT_COUNTRY_CODE=$pc_default_country_code"
fi
fi
env_after=$(docker exec "$target_container" sh -c "cd $container_path && [ -f .env ] && cat .env" 2>/dev/null || true)
if [ "$env_before" != "$env_after" ]; then
FRONTEND_ENV_CHANGED=true
log_info "$project_name .env 已更新"
fi
fi
}
@@ -1695,48 +1933,29 @@ build_admin() {
log_error "ECShopX_admin-frontend/package.json 不存在"
return 1
fi
# 检查是否已有编译产物
if [ -d "$ADMIN_DIR/dist" ] && [ -f "$ADMIN_DIR/dist/index.html" ]; then
log_info "检测到已有编译产物,跳过编译"
log_info "如需重新编译,请删除 ECShopX_admin-frontend/dist 目录"
return 0
fi
# 检查容器内目录是否存在并确保正确挂载
log_info "检查容器内目录挂载状态..."
if ! check_container_directory "/data/httpd/ECShopX_admin-frontend" "$ADMIN_DIR" "ECShopX_admin-frontend"; then
return 1
fi
# 确认默认语言(如果还未选择)
if [ -z "$SELECTED_LANG" ]; then
echo ""
log_info "请选择默认语言:"
log_info " 1) 中文 (zhcn)"
log_info " 2) 英文 (en)"
echo ""
while true; do
read -r -p "请输入选项 (1 或 2默认: 1): " LANG_CHOICE < /dev/tty
LANG_CHOICE=${LANG_CHOICE:-1}
if [ "$LANG_CHOICE" = "1" ] || [ "$LANG_CHOICE" = "zhcn" ] || [ "$LANG_CHOICE" = "zh" ]; then
SELECTED_LANG="zhcn"
break
elif [ "$LANG_CHOICE" = "2" ] || [ "$LANG_CHOICE" = "en" ] || [ "$LANG_CHOICE" = "english" ]; then
SELECTED_LANG="en"
break
else
log_error "无效的选项,请输入 1 或 2"
fi
done
echo ""
log_info "已选择默认语言: $SELECTED_LANG"
echo ""
else
log_info "复用已选择的默认语言: $SELECTED_LANG"
load_existing_frontend_lang
log_info "配置 ECShopX_admin-frontend 的 .env 文件..."
configure_frontend_env "$ADMIN_DIR" "ECShopX_admin-frontend" "$API_BASE_URL" "" "$SELECTED_LANG" "$PC_URL" "$QIANKUN_ENTRY_URL"
# 检查是否已有编译产物;前端 .env 变化时必须重新编译
if [ -d "$ADMIN_DIR/dist" ] && [ -f "$ADMIN_DIR/dist/index.html" ]; then
if [ "$FRONTEND_ENV_CHANGED" = true ]; then
log_info "检测到已有编译产物,但前端 .env 已变化,需要重新编译"
else
log_info "检测到已有编译产物,跳过编译"
log_info "如需重新编译,请删除 ECShopX_admin-frontend/dist 目录"
return 0
fi
fi
# 配置前端项目的 .env 文件
ensure_selected_lang
log_info "配置 ECShopX_admin-frontend 的 .env 文件..."
configure_frontend_env "$ADMIN_DIR" "ECShopX_admin-frontend" "$API_BASE_URL" "" "$SELECTED_LANG" "$PC_URL" "$QIANKUN_ENTRY_URL"
@@ -1859,23 +2078,32 @@ build_pc() {
if ! ensure_web_container_running; then
return 1
fi
# 检查是否已有可启动的 Nuxt 生产产物(.nuxt 可能由 pnpm install/postinstall 生成,不能代表已编译完成)
if docker exec "$WEB_CONTAINER_NAME" sh -c "[ -f /data/httpd/ECShopX_web-frontend/.output/server/index.mjs ]" 2>/dev/null || \
[ -f "$PC_DIR/.output/server/index.mjs" ]; then
log_info "检测到已有 Nuxt 生产编译产物,跳过编译"
log_info "如需重新编译,请删除 ECShopX_web-frontend/.output 目录"
# 即使跳过编译也需要启动Nuxt服务
need_build=false
else
need_build=true
fi
# 检查容器内目录是否存在并确保正确挂载
log_info "检查容器内目录挂载状态..."
if ! check_container_directory "/data/httpd/ECShopX_web-frontend" "$PC_DIR" "ECShopX_web-frontend"; then
return 1
fi
load_existing_frontend_lang
log_info "配置 ECShopX_web-frontend 的 .env 文件..."
configure_frontend_env "$PC_DIR" "ECShopX_web-frontend" "$PC_API_URL" "" "$SELECTED_LANG"
# 检查是否已有可启动的 Nuxt 生产产物(.nuxt 可能由 pnpm install/postinstall 生成,不能代表已编译完成)
if docker exec "$WEB_CONTAINER_NAME" sh -c "[ -f /data/httpd/ECShopX_web-frontend/.output/server/index.mjs ]" 2>/dev/null || \
[ -f "$PC_DIR/.output/server/index.mjs" ]; then
if [ "$FRONTEND_ENV_CHANGED" = true ]; then
log_info "检测到已有 Nuxt 生产编译产物,但前端 .env 已变化,需要重新编译"
need_build=true
else
log_info "检测到已有 Nuxt 生产编译产物,跳过编译"
log_info "如需重新编译,请删除 ECShopX_web-frontend/.output 目录"
# 即使跳过编译也需要启动Nuxt服务
need_build=false
fi
else
need_build=true
fi
# 如果跳过编译直接启动Nuxt服务不需要确认语言
if [ "$need_build" = false ]; then
@@ -1903,34 +2131,7 @@ build_pc() {
# 只有在需要编译时才确认默认语言和配置.env
if [ "$need_build" = true ]; then
# 确认默认语言(如果还未选择)
if [ -z "$SELECTED_LANG" ]; then
echo ""
log_info "请选择默认语言:"
log_info " 1) 中文 (zhcn)"
log_info " 2) 英文 (en)"
echo ""
while true; do
read -r -p "请输入选项 (1 或 2默认: 1): " LANG_CHOICE < /dev/tty
LANG_CHOICE=${LANG_CHOICE:-1}
if [ "$LANG_CHOICE" = "1" ] || [ "$LANG_CHOICE" = "zhcn" ] || [ "$LANG_CHOICE" = "zh" ]; then
SELECTED_LANG="zhcn"
break
elif [ "$LANG_CHOICE" = "2" ] || [ "$LANG_CHOICE" = "en" ] || [ "$LANG_CHOICE" = "english" ]; then
SELECTED_LANG="en"
break
else
log_error "无效的选项,请输入 1 或 2"
fi
done
echo ""
log_info "已选择默认语言: $SELECTED_LANG"
echo ""
else
log_info "复用已选择的默认语言: $SELECTED_LANG"
fi
# 配置前端项目的 .env 文件
ensure_selected_lang
log_info "配置 ECShopX_web-frontend 的 .env 文件..."
configure_frontend_env "$PC_DIR" "ECShopX_web-frontend" "$PC_API_URL" "" "$SELECTED_LANG"
@@ -2102,14 +2303,7 @@ build_vshop() {
log_error "ECShopX_mobile-frontend/package.json 不存在"
return 1
fi
# 检查是否已有编译产物
if [ -d "$VSHOP_DIR/dist" ]; then
log_info "检测到已有编译产物,跳过编译"
log_info "如需重新编译,请删除 ECShopX_mobile-frontend/dist 目录"
return 0
fi
# 检查容器内目录是否存在并确保正确挂载
log_info "检查容器内目录挂载状态..."
if ! check_container_directory "/data/httpd/ECShopX_mobile-frontend" "$VSHOP_DIR" "ECShopX_mobile-frontend"; then
@@ -2125,37 +2319,28 @@ build_vshop() {
BUILD_MODE_NAME="BBC (B2B2C)"
fi
log_info "使用业务模式: $BUILD_MODE_NAME"
# 确认默认语言(如果还未选择)
if [ -z "$SELECTED_LANG" ]; then
echo ""
log_info "请选择默认语言:"
log_info " 1) 中文 (zhcn)"
log_info " 2) 英文 (en)"
echo ""
while true; do
read -r -p "请输入选项 (1 或 2默认: 1): " LANG_CHOICE < /dev/tty
LANG_CHOICE=${LANG_CHOICE:-1}
if [ "$LANG_CHOICE" = "1" ] || [ "$LANG_CHOICE" = "zhcn" ] || [ "$LANG_CHOICE" = "zh" ]; then
SELECTED_LANG="zhcn"
break
elif [ "$LANG_CHOICE" = "2" ] || [ "$LANG_CHOICE" = "en" ] || [ "$LANG_CHOICE" = "english" ]; then
SELECTED_LANG="en"
break
else
log_error "无效的选项,请输入 1 或 2"
fi
done
echo ""
log_info "已选择默认语言: $SELECTED_LANG"
echo ""
else
log_info "复用已选择的默认语言: $SELECTED_LANG"
fi
# 配置前端项目的 .env 文件
ensure_selected_lang
log_info "配置 ECShopX_mobile-frontend 的 .env 文件..."
configure_frontend_env "$VSHOP_DIR" "ECShopX_mobile-frontend" "$MOBILE_API_URL" "$SELECTED_PLATFORM" "$SELECTED_LANG"
# 检查是否已有编译产物;前端 .env 变化时必须重新编译
if [ -d "$VSHOP_DIR/dist" ]; then
if [ "$FRONTEND_ENV_CHANGED" = true ]; then
log_info "检测到已有编译产物,但前端 .env 已变化,需要重新编译 H5"
else
log_info "检测到已有编译产物,跳过编译"
log_info "如需重新编译,请删除 ECShopX_mobile-frontend/dist 目录"
return 0
fi
fi
if [ "$FRONTEND_ENV_CHANGED" = true ]; then
log_info "复用已更新的 ECShopX_mobile-frontend .env 配置"
else
log_info "配置 ECShopX_mobile-frontend 的 .env 文件..."
configure_frontend_env "$VSHOP_DIR" "ECShopX_mobile-frontend" "$MOBILE_API_URL" "$SELECTED_PLATFORM" "$SELECTED_LANG"
fi
log_info "安装 npm 依赖..."
# 使用绝对路径并先验证目录存在