#!/bin/bash # =========================================== # 通过 SSH 在服务器上执行 SQL,设置指定用户的付费状态 # =========================================== set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" ENV_FILE="$PROJECT_ROOT/.env" get_ssh_host() { grep '^SSH_SERVER=' "$ENV_FILE" 2>/dev/null | head -1 | cut -d'=' -f2- | tr -d '"' | tr -d "'" | xargs } usage() { echo "用法: $0 [--permanent|--expires YYYY-MM-DD|--cancel]" echo "" echo " user_id 用户 ID(必填)" echo " --monthly 设为月会员(30天) --permanent 设为永久会员(is_member=true, membership_expires_at=NULL)" echo " --expires DATE 设为指定日期到期(格式: YYYY-MM-DD)" echo " --cancel 取消付费状态(is_member=false, membership_expires_at=NULL)" echo "" echo "示例:" echo " $0 1 --permanent # 用户 1 永久会员" echo " $0 1 --expires 2027-12-31 # 2027-12-31 到期" echo " $0 1 --cancel # 取消付费" exit 0 } # ---------- 参数解析 ---------- USER_ID=""; ACTION=""; EXPIRES_DATE="" while [[ $# -gt 0 ]]; do case "$1" in --permanent) ACTION="permanent" ;; --expires) ACTION="expires"; EXPIRES_DATE="$2"; shift ;; --monthly) ACTION="monthly" ;; --cancel) ACTION="cancel" ;; --dev) DB_NAME="milkydata_dev" ;; --help|-h) usage ;; *) USER_ID="$1" ;; esac shift done [ -z "$USER_ID" ] && usage [ -z "$ACTION" ] && usage # ---------- 连接信息 ---------- SSH_HOST=$(get_ssh_host) [ -z "$SSH_HOST" ] && { echo "错误: 未配置 SSH_SERVER"; exit 1; } DB_CONTAINER="1Panel-postgresql-FtMo" DB_USER="milkydata" : "${DB_NAME:=milkydata}" # 默认生产库 # ---------- 构建 SQL ---------- case "$ACTION" in permanent) SQL="UPDATE users SET is_member = true, membership_expires_at = NULL WHERE id = ${USER_ID};" DESC="永久会员" ;; monthly) SQL="UPDATE users SET is_member = true, membership_expires_at = NOW() + INTERVAL '30 days' WHERE id = ${USER_ID};" DESC="月会员(30天)" ;; expires) SQL="UPDATE users SET is_member = true, membership_expires_at = '${EXPIRES_DATE}' WHERE id = ${USER_ID};" DESC="到期: ${EXPIRES_DATE}" ;; cancel) SQL="UPDATE users SET is_member = false, membership_expires_at = NULL WHERE id = ${USER_ID};" DESC="取消付费" ;; esac echo "" echo "═══════════════════════════════════════" echo " 操作: 用户 ${USER_ID} → ${DESC}" echo " 数据库: ${DB_NAME}(${SSH_HOST})" echo "═══════════════════════════════════════" echo "" echo "当前状态:" CURRENT_SQL="SELECT id, name, is_member, membership_expires_at FROM users WHERE id = ${USER_ID};" ssh "$SSH_HOST" "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${CURRENT_SQL}\"" echo "" echo "将要执行:" echo " ${SQL}" echo "" read -p "确认执行? [y/N] " -n 1 -r; echo if [ "${REPLY:-N}" != "y" ] && [ "${REPLY:-N}" != "Y" ]; then echo "已取消"; exit 0; fi echo "" echo "执行中..." ssh "$SSH_HOST" "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${SQL}\"" && echo "✅ 操作成功" || echo "❌ 操作失败" echo "" echo "验证结果:" VERIFY_SQL="SELECT id, name, phone, type, is_member, is_admin, membership_expires_at FROM users WHERE id = ${USER_ID};" ssh "$SSH_HOST" "docker exec ${DB_CONTAINER} psql -U ${DB_USER} -d ${DB_NAME} -c \"${VERIFY_SQL}\"" echo ""