#!/bin/bash # www.tlyq.cc 内容管理脚本 # 兼容 macOS (Bash 3.2+) / Ubuntu / Rocky Linux # 用法:bash edit-site-cc.sh set -e # ============================================================ # 配置 # ============================================================ SERVER="tgz" SRC_DIR="/tmp/project-extract-2/turing-engine" TRANS="src/lib/translations.ts" FOOTER="src/components/Footer.tsx" CONTACT="src/app/contact/page.tsx" NEWS="src/app/news/page.tsx" # ANSI 颜色 GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' RED='\033[0;31m' NC='\033[0m' log() { printf "${GREEN}[✓]${NC} %s\n" "$1"; } warn() { printf "${YELLOW}[!]${NC} %s\n" "$1"; } err() { printf "${RED}[✗]${NC} %s\n" "$1"; } info() { printf "${CYAN}[i]${NC} %s\n" "$1"; } # 在服务器上执行命令 rsh() { ssh "$SERVER" "$@"; } # 获取 translations.ts 中指定 marker 的行号 # 用法: get_line "marker" [nth] nth=1 返回第1个匹配,nth=2 返回第2个 get_line() { local marker="$1" local nth="${2:-1}" rsh "grep -n \"$marker\" $SRC_DIR/$TRANS | sed -n '${nth}p' | cut -d: -f1" } # 在服务器文件中批量插入多行 # 用法: insert_lines ... # 行号从大到小排序后依次插入,保证行号准确性 insert_lines() { local args=("$@") local pairs="" local i=0 while [ $i -lt $# ]; do local ln="${args[$i]}" local ct="${args[$((i+1))]}" # 构造 python 元组列表: (line_num, content) if [ -n "$pairs" ]; then pairs="$pairs," fi # 转义内容中的反斜杠和引号 pairs="$pairs($ln, \"$(printf '%s' "$ct" | sed 's/\\/\\\\/g; s/"/\\"/g')\")" i=$((i+2)) done ssh "$SERVER" python3 - <${ZH_MS_LINE} && /date:.*title:/{printf \" %d: %s\\n\", NR, \$0}' $SRC_DIR/$TRANS" echo "" printf "请输入要修改的条目行号: " read LINE_NUM [ -z "$LINE_NUM" ] && { err "行号不能为空"; return; } # 验证行号是否有效 VALID=$(rsh "sed -n '${LINE_NUM}p' $SRC_DIR/$TRANS | grep -c 'date:.*title:' || true") if [ "$VALID" != "1" ]; then err "该行不是有效的历程条目" return fi # 计算对应的英文行号 OFFSET=$((LINE_NUM - ZH_MS_LINE)) EN_LINE_NUM=$((EN_MS_LINE + OFFSET)) # 显示当前值 info "当前中文内容:" rsh "sed -n '${LINE_NUM}p' $SRC_DIR/$TRANS" info "当前英文内容:" rsh "sed -n '${EN_LINE_NUM}p' $SRC_DIR/$TRANS" echo "" printf "${YELLOW}--- 新的中文信息 ---${NC}\n" printf "日期: " read ZH_DATE [ -z "$ZH_DATE" ] && { err "日期不能为空"; return; } printf "标题: " read ZH_TITLE [ -z "$ZH_TITLE" ] && { err "标题不能为空"; return; } printf "描述: " read ZH_DESC [ -z "$ZH_DESC" ] && { err "描述不能为空"; return; } echo "" printf "${YELLOW}--- New English Info ---${NC}\n" printf "Date: " read EN_DATE [ -z "$EN_DATE" ] && { err "Date is required"; return; } printf "Title: " read EN_TITLE [ -z "$EN_TITLE" ] && { err "Title is required"; return; } printf "Description: " read EN_DESC [ -z "$EN_DESC" ] && { err "Description is required"; return; } echo "" printf "确认修改? (y/n): " read confirm [ "$confirm" != "y" ] && { warn "已取消"; return; } # 替换中文行 ZH_NEW=" { date: '$ZH_DATE', title: '$ZH_TITLE', desc: '$ZH_DESC' }," # 转义替换内容中的特殊字符 ZH_NEW_ESC=$(printf '%s' "$ZH_NEW" | sed 's/[&/\\]/\\&/g') rsh "sed -i '${LINE_NUM}s/.*/${ZH_NEW_ESC}/' $SRC_DIR/$TRANS" # 替换英文行 EN_NEW=" { date: '$EN_DATE', title: '$EN_TITLE', desc: '$EN_DESC' }," EN_NEW_ESC=$(printf '%s' "$EN_NEW" | sed 's/[&/\\]/\\&/g') rsh "sed -i '${EN_LINE_NUM}s/.*/${EN_NEW_ESC}/' $SRC_DIR/$TRANS" log "发展历程已更新(中英文)" ask_deploy } # ============================================================ # 功能 4:部署到服务器 # ============================================================ deploy() { printf "${CYAN}--- 部署 www.tlyq.cc ---${NC}\n" echo "" LOCAL_DIR="/Users/niuniu/programs/docker/www-cc/src" REMOTE_DIR="$SRC_DIR" DEPLOY_DIR="/root/docker/www-cc/html" # 从服务器同步最新源码到本地 info "从服务器同步最新源码..." rsync -az --delete --exclude='node_modules' --exclude='.next' --exclude='out' \ "$SERVER:$REMOTE_DIR/" "$LOCAL_DIR/" 2>/dev/null || { warn "rsync 不可用,使用 scp..." rm -rf "$LOCAL_DIR" mkdir -p "$LOCAL_DIR" scp -r "$SERVER:$REMOTE_DIR/." "$LOCAL_DIR/" 2>/dev/null rm -rf "$LOCAL_DIR/node_modules" "$LOCAL_DIR/.next" "$LOCAL_DIR/out" } log "打包源码..." cd "$LOCAL_DIR" COPYFILE_DISABLE=1 tar czf /tmp/www-src.tar.gz --exclude='node_modules' --exclude='.next' --exclude='out' . log "上传到服务器..." scp /tmp/www-src.tar.gz "$SERVER:/tmp/www-src.tar.gz" log "服务器上构建并部署..." ssh "$SERVER" "cd $REMOTE_DIR && rm -rf .next out src && tar xzf /tmp/www-src.tar.gz && npm install && rm -rf .next out && npm run build && rm -rf ${DEPLOY_DIR:?}/* && cp -r out/* $DEPLOY_DIR/" echo "" log "验证部署..." URL="https://www.tlyq.cc" STATUS=$(ssh "$SERVER" "curl -s -o /dev/null -w '%{http_code}' -k '$URL'") if [ "$STATUS" = "200" ]; then log "部署成功!访问 $URL" else warn "返回状态码: $STATUS,请检查" fi echo "" show_menu } # ============================================================ # 通用:询问是否部署 # ============================================================ ask_deploy() { echo "" printf "是否立即部署到服务器? (y/n): " read d if [ "$d" = "y" ]; then deploy else warn "未部署,修改仅在服务器源码中生效" info "稍后可选择菜单 4) 部署到服务器" show_menu fi } # ============================================================ # 启动 # ============================================================ show_menu