From ca9a9cedfd900b880cf9f30e47460c86d9e9f07d Mon Sep 17 00:00:00 2001 From: skyle1995 Date: Tue, 12 May 2026 03:37:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E7=BB=B4=E6=8A=A4?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E6=8B=A6=E6=88=AA=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 207 ++++++++++++++++++++++++++++++++------ config/config.go | 11 +- middleware/maintenance.go | 5 + 3 files changed, 190 insertions(+), 33 deletions(-) diff --git a/build.sh b/build.sh index f18e08b..22caea3 100755 --- a/build.sh +++ b/build.sh @@ -3,12 +3,91 @@ # 遇到错误立即退出 set -e +package_update_zip() { + local os=$1 + local arch=$2 + local output_dir=$3 + + local version + version="$(get_app_version)" || version="unknown" + + local exe_name="${APP_NAME}" + if [ "$os" = "windows" ]; then + exe_name="${APP_NAME}.exe" + fi + + local src_exe="dist/${output_dir}/${exe_name}" + if [ ! -f "$src_exe" ]; then + echo -e "${RED}❌ 未找到编译产物: ${src_exe}${NC}" + return 1 + fi + + if ! command -v zip >/dev/null 2>&1; then + echo -e "${RED}❌ 未找到 zip 命令,无法生成更新包(请安装 zip 工具)${NC}" + return 1 + fi + + mkdir -p "dist/packages" + local pkg_name="${APP_NAME}-${os}-${arch}-v${version}.zip" + local pkg_path="dist/packages/${pkg_name}" + + local tmp_dir + tmp_dir="$(mktemp -d)" + cp "$src_exe" "${tmp_dir}/${exe_name}" + + ( + cd "$tmp_dir" + zip -q -9 -r "$SCRIPT_DIR/${pkg_path}" "${exe_name}" + ) + rm -rf "$tmp_dir" + + echo -e "${GREEN}✅ 更新包已生成: ${pkg_path}${NC}" + + local sha256 + sha256="$(get_sha256_hex "$pkg_path")" || sha256="" + if [ -n "$sha256" ]; then + echo "${sha256} ${pkg_name}" > "${pkg_path}.sha256" + echo -e "${GREEN}✅ SHA256 已生成: ${pkg_path}.sha256${NC}\n" + else + echo -e "${YELLOW}⚠️ 未找到 shasum/sha256sum,跳过生成 SHA256 文件${NC}\n" + fi +} + +build_all_update_packages() { + echo -e "${BLUE}=====================================${NC}" + echo -e "${YELLOW}📦 开始构建所有架构更新包...${NC}" + echo -e "${BLUE}=====================================${NC}" + + build_backend "windows" "amd64" "windows_amd64" "Windows 64位" + package_update_zip "windows" "amd64" "windows_amd64" + + build_backend "linux" "arm64" "linux_arm64" "Linux ARM64" + package_update_zip "linux" "arm64" "linux_arm64" + + build_backend "linux" "amd64" "linux_amd64" "Linux 64位" + package_update_zip "linux" "amd64" "linux_amd64" + + build_backend "darwin" "arm64" "darwin_arm64" "macOS (Apple Silicon)" + package_update_zip "darwin" "arm64" "darwin_arm64" + + build_backend "darwin" "amd64" "darwin_amd64" "macOS (Intel)" + package_update_zip "darwin" "amd64" "darwin_amd64" + + echo -e "${GREEN}🎉 所有架构更新包已生成,产物已保存至 ./dist/packages 目录下!${NC}\n" +} + # ========================================== # 切换到脚本所在目录 # ========================================== SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" cd "$SCRIPT_DIR" +# ========================================== +# 项目配置 +# ========================================== +APP_NAME="NetworkAuth" +STATUS_FILE="constants/status.go" + # ========================================== # 颜色定义 # ========================================== @@ -22,6 +101,89 @@ NC='\033[0m' # No Color # 功能函数 # ========================================== +get_app_version() { + local status_file="${STATUS_FILE}" + if [ ! -f "$status_file" ]; then + echo "" + return 1 + fi + local line + line="$(awk -F'"' '/AppVersion[[:space:]]*=[[:space:]]*"/ {print $2; exit 0}' "$status_file")" + if [ -z "$line" ]; then + echo "" + return 1 + fi + echo "$line" + return 0 +} + +bump_patch_version() { + local current + current="$(get_app_version)" || return 1 + + local v="${current#v}" + v="${v#V}" + + local major minor patch + IFS='.' read -r major minor patch < "$tmp_file" + local rc=$? + if [ $rc -ne 0 ]; then + rm -f "$tmp_file" + echo -e "${RED}❌ 自动迭代版本失败:未找到 AppVersion 定义${NC}" + return 1 + fi + mv "$tmp_file" "$status_file" + + echo -e "${GREEN}✅ 版本号已迭代: ${current} -> ${next_version}${NC}" + return 0 +} + +get_sha256_hex() { + local file_path=$1 + if [ -z "$file_path" ] || [ ! -f "$file_path" ]; then + echo "" + return 1 + fi + if command -v shasum >/dev/null 2>&1; then + shasum -a 256 "$file_path" | awk '{print $1}' + return 0 + fi + if command -v sha256sum >/dev/null 2>&1; then + sha256sum "$file_path" | awk '{print $1}' + return 0 + fi + echo "" + return 1 +} + # 编译并拷贝前端 build_frontend() { echo -e "${BLUE}=====================================${NC}" @@ -54,9 +216,9 @@ build_backend() { local desc=$4 # 确定可执行文件名称 - local exe_name="NetworkAuth" - if [ "$os" = "NetworkAuth" ]; then - exe_name="NetworkAuth.exe" + local exe_name="${APP_NAME}" + if [ "${os}" = "windows" ]; then + exe_name="${APP_NAME}.exe" fi # 创建对应架构的输出目录 @@ -98,15 +260,10 @@ show_menu() { echo -e "${BLUE}=====================================${NC}" echo -e "${GREEN} 项目构建脚本菜单 ${NC}" echo -e "${BLUE}=====================================${NC}" - echo -e "1. 🚀 一键全部构建 (前端 + 所有架构后端)" - echo -e "2. 📦 仅编译所有后端架构" - echo -e "3. 🌐 仅编译前端并拷贝" - echo -e "-------------------------------------" - echo -e "4. 🪟 编译后端: Windows 64位" - echo -e "5. 🐧 编译后端: Linux ARM64" - echo -e "6. 🐧 编译后端: Linux 64位" - echo -e "7. 🍎 编译后端: macOS (Apple Silicon)" - echo -e "8. 🍎 编译后端: macOS (Intel)" + echo -e "1. 🔁 自动构建 + 生成更新包" + echo -e "2. 🚀 全部构建 (前端 + 后端)" + echo -e "3. 📦 编译所有后端架构" + echo -e "4. 🌐 仅编译前端并拷贝" echo -e "-------------------------------------" echo -e "0. ❌ 退出" echo -e "${BLUE}=====================================${NC}" @@ -118,40 +275,26 @@ show_menu() { # ========================================== while true; do show_menu - read choice + read -r choice echo "" case $choice in 1) + bump_patch_version build_frontend - build_all_backend + build_all_update_packages pause_and_return ;; 2) + build_frontend build_all_backend pause_and_return ;; 3) - build_frontend + build_all_backend pause_and_return ;; 4) - build_backend "windows" "amd64" "windows_amd64" "Windows 64位" - pause_and_return - ;; - 5) - build_backend "linux" "arm64" "linux_arm64" "Linux ARM64" - pause_and_return - ;; - 6) - build_backend "linux" "amd64" "linux_amd64" "Linux 64位" - pause_and_return - ;; - 7) - build_backend "darwin" "arm64" "darwin_arm64" "macOS (Apple Silicon)" - pause_and_return - ;; - 8) - build_backend "darwin" "amd64" "darwin_amd64" "macOS (Intel)" + build_frontend pause_and_return ;; 0) diff --git a/config/config.go b/config/config.go index a8cc395..9868157 100644 --- a/config/config.go +++ b/config/config.go @@ -131,7 +131,16 @@ func GetDefaultAppConfig() *AppConfig { // Init 初始化配置文件 func Init(cfgFilePath string) { if !filepath.IsAbs(cfgFilePath) { - cfgFilePath = filepath.Join(utils.GetRootDir(), cfgFilePath) + if wd, err := os.Getwd(); err == nil { + candidate := filepath.Clean(filepath.Join(wd, cfgFilePath)) + if _, statErr := os.Stat(candidate); statErr == nil { + cfgFilePath = candidate + } else { + cfgFilePath = filepath.Join(utils.GetRootDir(), cfgFilePath) + } + } else { + cfgFilePath = filepath.Join(utils.GetRootDir(), cfgFilePath) + } } currentConfigFilePath = cfgFilePath diff --git a/middleware/maintenance.go b/middleware/maintenance.go index 942c339..351a6db 100644 --- a/middleware/maintenance.go +++ b/middleware/maintenance.go @@ -21,6 +21,11 @@ func MaintenanceMiddleware() gin.HandlerFunc { path := c.Request.URL.Path + if !strings.HasPrefix(path, "/api") { + c.Next() + return + } + // 允许管理员后台相关接口(以便管理员登录关闭维护模式) // 包括登录页、登录接口、API接口、CSRF Token等 if strings.HasPrefix(path, "/api/admin") {