项目重构: 整理目录结构, 更新前后端代码, 添加测试和数据库迁移
This commit is contained in:
76
demo/scripts/deploy/LINUX_DEPLOY_SCRIPT.sh
Normal file
76
demo/scripts/deploy/LINUX_DEPLOY_SCRIPT.sh
Normal file
@@ -0,0 +1,76 @@
|
||||
# Linux服务器部署命令(已修改为使用正确的镜像)
|
||||
|
||||
cd /home/ubuntu/spring-vue-app/backend
|
||||
|
||||
# 创建/更新 Dockerfile(使用正确的镜像)
|
||||
cat > Dockerfile << 'EOF'
|
||||
# 多阶段构建:构建阶段
|
||||
FROM maven:3.9-eclipse-temurin-21 AS builder
|
||||
WORKDIR /app
|
||||
|
||||
# 复制 pom.xml 并下载依赖(利用Docker缓存)
|
||||
COPY pom.xml .
|
||||
RUN mvn dependency:go-offline -B || true
|
||||
|
||||
# 复制源码
|
||||
COPY src ./src
|
||||
|
||||
# 打包应用(跳过测试)
|
||||
RUN mvn clean package -DskipTests -B
|
||||
|
||||
# 生产阶段
|
||||
FROM eclipse-temurin:21-jre
|
||||
WORKDIR /app
|
||||
|
||||
# 安装时区支持和wget(健康检查)
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
tzdata \
|
||||
wget \
|
||||
curl && \
|
||||
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
|
||||
echo "Asia/Shanghai" > /etc/timezone && \
|
||||
apt-get clean && \
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# 创建非root用户(安全考虑)
|
||||
RUN groupadd -r spring && useradd -r -g spring spring
|
||||
|
||||
# 创建必要的目录并设置权限
|
||||
RUN mkdir -p /app/uploads /app/temp /app/logs && \
|
||||
chown -R spring:spring /app
|
||||
|
||||
# 从构建阶段复制JAR文件(项目生成的JAR文件名:demo-0.0.1-SNAPSHOT.jar)
|
||||
COPY --from=builder --chown=spring:spring /app/target/demo-0.0.1-SNAPSHOT.jar app.jar
|
||||
|
||||
# 切换到非root用户
|
||||
USER spring
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
# JVM 参数优化(适配50人并发,建议2-4GB内存)
|
||||
ENV JAVA_OPTS="-Xmx2g -Xms1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/./urandom"
|
||||
|
||||
# 健康检查(检查应用是否响应,不依赖Actuator)
|
||||
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
|
||||
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/ || exit 1
|
||||
|
||||
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
|
||||
EOF
|
||||
|
||||
# 返回项目根目录
|
||||
cd /home/ubuntu/spring-vue-app
|
||||
|
||||
# 构建并启动服务
|
||||
sudo docker-compose build --no-cache
|
||||
sudo docker-compose up -d
|
||||
|
||||
# 等待服务启动
|
||||
sleep 30
|
||||
|
||||
# 检查服务状态
|
||||
sudo docker-compose ps
|
||||
|
||||
# 健康检查(不依赖Actuator,直接检查根路径)
|
||||
curl -f http://localhost:8080/ || echo "后端服务可能还在启动中,请稍后检查"
|
||||
curl -f http://localhost/ || echo "前端服务可能还在启动中,请稍后检查"
|
||||
44
demo/scripts/deploy/build-backend-for-baota.bat
Normal file
44
demo/scripts/deploy/build-backend-for-baota.bat
Normal file
@@ -0,0 +1,44 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo 后端打包脚本 - Windows
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
echo [1/3] 清理旧的构建文件...
|
||||
if exist target rmdir /s /q target
|
||||
if exist backend-dist.zip del backend-dist.zip
|
||||
|
||||
echo.
|
||||
echo [2/3] 使用Maven打包...
|
||||
echo 这可能需要几分钟时间,请耐心等待...
|
||||
call mvnw.cmd clean package -DskipTests
|
||||
if %errorlevel% neq 0 (
|
||||
echo 错误: Maven打包失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 打包完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo JAR包位置: target\demo-0.0.1-SNAPSHOT.jar
|
||||
echo 文件大小:
|
||||
dir target\demo-0.0.1-SNAPSHOT.jar | find "demo-0.0.1-SNAPSHOT.jar"
|
||||
echo.
|
||||
echo 部署到宝塔步骤:
|
||||
echo 1. 上传 target\demo-0.0.1-SNAPSHOT.jar 到服务器(如:/www/server/aigc-backend/app.jar)
|
||||
echo 2. 在服务器创建 application-prod.properties 配置文件
|
||||
echo 3. 在宝塔面板使用 Supervisor 或 Java项目管理器启动
|
||||
echo.
|
||||
echo 启动命令:
|
||||
echo java -jar app.jar --spring.profiles.active=prod
|
||||
echo.
|
||||
echo 注意事项:
|
||||
echo - 确保服务器已安装 Java 21 或更高版本
|
||||
echo - 确保MySQL数据库已创建并配置
|
||||
echo - 需要在服务器上创建 application-prod.properties 配置文件
|
||||
echo.
|
||||
pause
|
||||
53
demo/scripts/deploy/build-backend-for-baota.sh
Normal file
53
demo/scripts/deploy/build-backend-for-baota.sh
Normal file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
# 后端打包脚本 - Linux
|
||||
|
||||
echo "========================================"
|
||||
echo " 后端打包脚本 - Linux"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "[1/3] 清理旧的构建文件..."
|
||||
rm -rf target
|
||||
rm -f backend-dist.tar.gz
|
||||
rm -rf backend-dist
|
||||
|
||||
echo ""
|
||||
echo "[2/3] 使用Maven打包..."
|
||||
echo "这可能需要几分钟时间,请耐心等待..."
|
||||
./mvnw clean package -DskipTests
|
||||
if [ $? -ne 0 ]; then
|
||||
echo -e "${RED}错误: Maven打包失败${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "========================================"
|
||||
echo " 打包完成!"
|
||||
echo "========================================"
|
||||
echo ""
|
||||
echo -e "${GREEN}JAR包位置: target/demo-0.0.1-SNAPSHOT.jar${NC}"
|
||||
echo "文件大小:"
|
||||
ls -lh target/demo-0.0.1-SNAPSHOT.jar | awk '{print $5}'
|
||||
echo ""
|
||||
echo "部署到宝塔步骤:"
|
||||
echo "1. 上传 target/demo-0.0.1-SNAPSHOT.jar 到服务器(如:/www/server/aigc-backend/app.jar)"
|
||||
echo "2. 在服务器创建 application-prod.properties 配置文件"
|
||||
echo "3. 在宝塔面板使用 Supervisor 或 Java项目管理器启动"
|
||||
echo ""
|
||||
echo "启动命令:"
|
||||
echo " java -jar app.jar --spring.profiles.active=prod"
|
||||
echo ""
|
||||
echo "上传命令示例:"
|
||||
echo " scp target/demo-0.0.1-SNAPSHOT.jar root@your-server:/www/server/aigc-backend/app.jar"
|
||||
echo ""
|
||||
echo "注意事项:"
|
||||
echo "- 确保服务器已安装 Java 21 或更高版本"
|
||||
echo "- 确保MySQL数据库已创建并配置"
|
||||
echo "- 需要在服务器上创建 application-prod.properties 配置文件"
|
||||
echo ""
|
||||
141
demo/scripts/deploy/deploy-linux.sh
Normal file
141
demo/scripts/deploy/deploy-linux.sh
Normal file
@@ -0,0 +1,141 @@
|
||||
#!/bin/bash
|
||||
# Linux 云端部署脚本
|
||||
# 使用方法: ./deploy-linux.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 开始部署 AIGC 平台到 Linux 服务器..."
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 检查Java
|
||||
echo -e "${YELLOW}检查Java环境...${NC}"
|
||||
if ! command -v java &> /dev/null; then
|
||||
echo -e "${RED}❌ Java未安装,请先安装Java 21${NC}"
|
||||
echo "安装命令: sudo apt install -y openjdk-21-jdk"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
JAVA_VERSION=$(java -version 2>&1 | head -n 1)
|
||||
echo -e "${GREEN}✅ Java已安装: $JAVA_VERSION${NC}"
|
||||
|
||||
# 检查MySQL
|
||||
echo -e "${YELLOW}检查MySQL服务...${NC}"
|
||||
if ! systemctl is-active --quiet mysql && ! systemctl is-active --quiet mysqld; then
|
||||
echo -e "${RED}❌ MySQL服务未运行${NC}"
|
||||
echo "启动命令: sudo systemctl start mysql"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✅ MySQL服务运行中${NC}"
|
||||
|
||||
# 检查FFmpeg
|
||||
echo -e "${YELLOW}检查FFmpeg...${NC}"
|
||||
if ! command -v ffmpeg &> /dev/null; then
|
||||
echo -e "${YELLOW}⚠️ FFmpeg未安装,视频功能可能不可用${NC}"
|
||||
echo "安装命令: sudo apt install -y ffmpeg"
|
||||
else
|
||||
echo -e "${GREEN}✅ FFmpeg已安装${NC}"
|
||||
fi
|
||||
|
||||
# 检查应用目录
|
||||
APP_DIR="/app/aigc-platform"
|
||||
echo -e "${YELLOW}检查应用目录...${NC}"
|
||||
if [ ! -d "$APP_DIR" ]; then
|
||||
echo -e "${YELLOW}创建应用目录...${NC}"
|
||||
sudo mkdir -p $APP_DIR/{logs,uploads,temp,config,backend,frontend}
|
||||
sudo chown -R $USER:$USER $APP_DIR
|
||||
chmod -R 755 $APP_DIR
|
||||
fi
|
||||
echo -e "${GREEN}✅ 应用目录存在${NC}"
|
||||
|
||||
# 检查JAR文件
|
||||
JAR_FILE="$APP_DIR/backend/demo-0.0.1-SNAPSHOT.jar"
|
||||
if [ ! -f "$JAR_FILE" ]; then
|
||||
echo -e "${RED}❌ JAR文件不存在: $JAR_FILE${NC}"
|
||||
echo "请先上传JAR文件到服务器"
|
||||
exit 1
|
||||
fi
|
||||
echo -e "${GREEN}✅ JAR文件存在${NC}"
|
||||
|
||||
# 检查配置文件
|
||||
CONFIG_FILE="$APP_DIR/config/application-prod.properties"
|
||||
if [ ! -f "$CONFIG_FILE" ]; then
|
||||
echo -e "${YELLOW}⚠️ 配置文件不存在,请先创建配置文件${NC}"
|
||||
echo "配置文件路径: $CONFIG_FILE"
|
||||
fi
|
||||
|
||||
# 停止服务
|
||||
echo -e "${YELLOW}停止现有服务...${NC}"
|
||||
if systemctl is-active --quiet aigc-platform; then
|
||||
sudo systemctl stop aigc-platform
|
||||
echo -e "${GREEN}✅ 服务已停止${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}服务未运行${NC}"
|
||||
fi
|
||||
|
||||
# 备份旧版本
|
||||
echo -e "${YELLOW}备份旧版本...${NC}"
|
||||
BACKUP_DIR="$APP_DIR/backup/$(date +%Y%m%d_%H%M%S)"
|
||||
mkdir -p $BACKUP_DIR
|
||||
if [ -f "$JAR_FILE" ]; then
|
||||
cp "$JAR_FILE" "$BACKUP_DIR/" 2>/dev/null || true
|
||||
echo -e "${GREEN}✅ 备份完成: $BACKUP_DIR${NC}"
|
||||
fi
|
||||
|
||||
# 检查systemd服务文件
|
||||
SERVICE_FILE="/etc/systemd/system/aigc-platform.service"
|
||||
if [ ! -f "$SERVICE_FILE" ]; then
|
||||
echo -e "${YELLOW}⚠️ Systemd服务文件不存在${NC}"
|
||||
echo "请先创建服务文件: $SERVICE_FILE"
|
||||
echo "参考文档: LINUX_DEPLOYMENT_GUIDE.md"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 重新加载systemd
|
||||
echo -e "${YELLOW}重新加载systemd配置...${NC}"
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# 启动服务
|
||||
echo -e "${YELLOW}启动服务...${NC}"
|
||||
sudo systemctl start aigc-platform
|
||||
|
||||
# 等待启动
|
||||
echo -e "${YELLOW}等待服务启动...${NC}"
|
||||
sleep 5
|
||||
|
||||
# 检查状态
|
||||
if systemctl is-active --quiet aigc-platform; then
|
||||
echo -e "${GREEN}✅ 部署成功!${NC}"
|
||||
echo ""
|
||||
echo "服务状态:"
|
||||
sudo systemctl status aigc-platform --no-pager -l
|
||||
echo ""
|
||||
echo "查看日志: sudo journalctl -u aigc-platform -f"
|
||||
echo "停止服务: sudo systemctl stop aigc-platform"
|
||||
echo "重启服务: sudo systemctl restart aigc-platform"
|
||||
else
|
||||
echo -e "${RED}❌ 部署失败!${NC}"
|
||||
echo ""
|
||||
echo "查看错误日志:"
|
||||
sudo journalctl -u aigc-platform -n 50 --no-pager
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 测试健康检查
|
||||
echo -e "${YELLOW}测试健康检查...${NC}"
|
||||
sleep 2
|
||||
if curl -f http://localhost:8080/actuator/health > /dev/null 2>&1; then
|
||||
echo -e "${GREEN}✅ 健康检查通过${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}⚠️ 健康检查失败,请检查日志${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}🎉 部署完成!${NC}"
|
||||
|
||||
|
||||
|
||||
74
demo/scripts/deploy/deploy-to-server.sh
Normal file
74
demo/scripts/deploy/deploy-to-server.sh
Normal file
@@ -0,0 +1,74 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ============================================
|
||||
# AIGC项目部署脚本(沙箱测试环境)
|
||||
# ============================================
|
||||
|
||||
echo "🚀 开始部署 AIGC 项目到生产服务器..."
|
||||
|
||||
# 配置变量
|
||||
SERVER="root@vionow.com"
|
||||
REMOTE_DIR="/opt/aigc"
|
||||
JAR_FILE="target/demo-0.0.1-SNAPSHOT.jar"
|
||||
FRONTEND_DIR="frontend/dist"
|
||||
|
||||
# 检查JAR文件是否存在
|
||||
if [ ! -f "$JAR_FILE" ]; then
|
||||
echo "❌ JAR文件不存在,请先运行 mvnw clean package"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 检查前端文件是否存在
|
||||
if [ ! -d "$FRONTEND_DIR" ]; then
|
||||
echo "❌ 前端dist目录不存在,请先运行 npm run build"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 1. 上传后端JAR文件
|
||||
echo "📦 上传后端JAR文件..."
|
||||
scp "$JAR_FILE" "$SERVER:$REMOTE_DIR/"
|
||||
|
||||
# 2. 上传前端文件
|
||||
echo "📦 上传前端文件..."
|
||||
scp -r "$FRONTEND_DIR"/* "$SERVER:/var/www/html/"
|
||||
|
||||
# 3. 在服务器上重启服务
|
||||
echo "🔄 重启服务..."
|
||||
ssh "$SERVER" << 'ENDSSH'
|
||||
# 停止旧服务
|
||||
echo "⏹️ 停止旧服务..."
|
||||
pkill -f demo-0.0.1-SNAPSHOT.jar
|
||||
sleep 3
|
||||
|
||||
# 启动新服务
|
||||
echo "▶️ 启动新服务..."
|
||||
cd /opt/aigc
|
||||
nohup java -jar demo-0.0.1-SNAPSHOT.jar \
|
||||
--spring.profiles.active=prod \
|
||||
--spring.config.additional-location=file:./application-prod.properties \
|
||||
> app.log 2>&1 &
|
||||
|
||||
# 等待启动
|
||||
sleep 5
|
||||
|
||||
# 检查服务状态
|
||||
if pgrep -f demo-0.0.1-SNAPSHOT.jar > /dev/null; then
|
||||
echo "✅ 服务启动成功!"
|
||||
echo "📋 最新日志:"
|
||||
tail -n 20 app.log
|
||||
else
|
||||
echo "❌ 服务启动失败,请检查日志:"
|
||||
tail -n 50 app.log
|
||||
exit 1
|
||||
fi
|
||||
ENDSSH
|
||||
|
||||
echo ""
|
||||
echo "✅ 部署完成!"
|
||||
echo "🌐 访问地址:"
|
||||
echo " 前端:https://vionow.com"
|
||||
echo " 后端:https://vionow.com/api/"
|
||||
echo " Swagger:https://vionow.com/swagger-ui.html"
|
||||
echo ""
|
||||
echo "📋 查看实时日志:"
|
||||
echo " ssh $SERVER 'tail -f /opt/aigc/app.log'"
|
||||
168
demo/scripts/deploy/deploy.ps1
Normal file
168
demo/scripts/deploy/deploy.ps1
Normal file
@@ -0,0 +1,168 @@
|
||||
# deploy.ps1 - Spring Boot + Vue 项目 Docker 部署脚本
|
||||
|
||||
Write-Host "🚀 AIGC 平台 Docker 部署脚本" -ForegroundColor Green
|
||||
Write-Host ("=" * 60)
|
||||
|
||||
# 检查必要文件
|
||||
$requiredFiles = @("docker-compose.yml", "backend/Dockerfile", "frontend/Dockerfile", "frontend/nginx.conf")
|
||||
foreach ($file in $requiredFiles) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Write-Host "❌ 缺少必要文件: $file" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
Write-Host "✅ 所有必要文件检查通过" -ForegroundColor Green
|
||||
|
||||
# 检查 Docker 环境
|
||||
try {
|
||||
$dockerVersion = docker --version 2>&1
|
||||
$composeVersion = docker-compose --version 2>&1
|
||||
Write-Host "✅ Docker 环境: $dockerVersion" -ForegroundColor Green
|
||||
Write-Host "✅ Docker Compose: $composeVersion" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host "❌ Docker 未正确安装或启动" -ForegroundColor Red
|
||||
Write-Host " 请确保已安装 Docker Desktop 并已启动" -ForegroundColor Yellow
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 检查前端是否已构建
|
||||
if (-not (Test-Path "frontend/dist")) {
|
||||
Write-Host "`n⚠️ 前端未构建,开始构建前端..." -ForegroundColor Yellow
|
||||
Push-Location frontend
|
||||
try {
|
||||
if (Test-Path "package.json") {
|
||||
Write-Host " 安装依赖..." -ForegroundColor Cyan
|
||||
npm install
|
||||
Write-Host " 构建生产版本..." -ForegroundColor Cyan
|
||||
npm run build
|
||||
Write-Host "✅ 前端构建完成" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "⚠️ 未找到 package.json,跳过前端构建" -ForegroundColor Yellow
|
||||
}
|
||||
} catch {
|
||||
Write-Host "❌ 前端构建失败: $($_.Exception.Message)" -ForegroundColor Red
|
||||
Write-Host " 可以稍后手动构建: cd frontend && npm install && npm run build" -ForegroundColor Yellow
|
||||
} finally {
|
||||
Pop-Location
|
||||
}
|
||||
} else {
|
||||
Write-Host "✅ 前端已构建" -ForegroundColor Green
|
||||
}
|
||||
|
||||
# 停止现有服务
|
||||
Write-Host "`n🛑 停止现有服务..." -ForegroundColor Yellow
|
||||
docker-compose down 2>&1 | Out-Null
|
||||
|
||||
# 构建镜像
|
||||
Write-Host "`n📦 构建 Docker 镜像..." -ForegroundColor Cyan
|
||||
Write-Host " 这可能需要几分钟时间,请耐心等待..." -ForegroundColor Gray
|
||||
$buildResult = docker-compose build --no-cache 2>&1
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "❌ 镜像构建失败" -ForegroundColor Red
|
||||
Write-Host $buildResult -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
Write-Host "✅ 镜像构建完成" -ForegroundColor Green
|
||||
|
||||
# 启动服务
|
||||
Write-Host "`n🐳 启动所有服务..." -ForegroundColor Cyan
|
||||
docker-compose up -d
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "❌ 服务启动失败" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 等待服务启动
|
||||
Write-Host "`n⏳ 等待服务启动(60秒)..." -ForegroundColor Yellow
|
||||
Write-Host " 后端服务需要时间连接数据库并初始化..." -ForegroundColor Gray
|
||||
Start-Sleep -Seconds 60
|
||||
|
||||
# 检查服务状态
|
||||
Write-Host "`n🔍 检查服务状态..." -ForegroundColor Cyan
|
||||
docker-compose ps
|
||||
|
||||
# 健康检查
|
||||
Write-Host "`n🏥 服务健康检查..." -ForegroundColor Cyan
|
||||
|
||||
# 检查 MySQL 服务
|
||||
Write-Host " 检查 MySQL..." -ForegroundColor Gray
|
||||
$mysqlStatus = docker-compose ps mysql 2>&1 | Select-String "Up"
|
||||
if ($mysqlStatus) {
|
||||
Write-Host " ✅ MySQL 服务运行中" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " ⚠️ MySQL 服务可能未正常启动" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# 检查 Redis 服务
|
||||
Write-Host " 检查 Redis..." -ForegroundColor Gray
|
||||
$redisStatus = docker-compose ps redis 2>&1 | Select-String "Up"
|
||||
if ($redisStatus) {
|
||||
Write-Host " ✅ Redis 服务运行中" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " ⚠️ Redis 服务可能未正常启动" -ForegroundColor Yellow
|
||||
}
|
||||
|
||||
# 检查后端服务
|
||||
Write-Host " 检查后端服务..." -ForegroundColor Gray
|
||||
try {
|
||||
# 检查后端服务是否响应
|
||||
$backendTest = Invoke-WebRequest -Uri "http://localhost:8080" -TimeoutSec 5 -ErrorAction SilentlyContinue
|
||||
if ($backendTest.StatusCode -eq 200 -or $backendTest.StatusCode -eq 404 -or $backendTest.StatusCode -eq 302) {
|
||||
Write-Host " ✅ 后端服务可访问 (状态码: $($backendTest.StatusCode))" -ForegroundColor Green
|
||||
}
|
||||
} catch {
|
||||
# 尝试检查API端点
|
||||
try {
|
||||
$apiTest = Invoke-WebRequest -Uri "http://localhost:8080/api" -TimeoutSec 5 -ErrorAction SilentlyContinue
|
||||
Write-Host " ✅ 后端API可访问" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host " ⚠️ 后端服务可能还在启动中,请稍后检查" -ForegroundColor Yellow
|
||||
Write-Host " 查看日志: docker-compose logs backend" -ForegroundColor Gray
|
||||
Write-Host " 提示: 首次启动可能需要1-2分钟" -ForegroundColor Gray
|
||||
}
|
||||
}
|
||||
|
||||
# 检查前端服务
|
||||
Write-Host " 检查前端服务..." -ForegroundColor Gray
|
||||
try {
|
||||
$frontendResponse = Invoke-WebRequest -Uri "http://localhost" -TimeoutSec 5 -ErrorAction SilentlyContinue
|
||||
if ($frontendResponse.StatusCode -eq 200) {
|
||||
Write-Host " ✅ 前端服务运行正常" -ForegroundColor Green
|
||||
}
|
||||
} catch {
|
||||
Write-Host " ⚠️ 前端服务检查失败: $($_.Exception.Message)" -ForegroundColor Yellow
|
||||
Write-Host " 查看日志: docker-compose logs frontend" -ForegroundColor Gray
|
||||
}
|
||||
|
||||
# 显示访问信息
|
||||
Write-Host "`n" + ("=" * 60) -ForegroundColor Green
|
||||
Write-Host "🎉 部署完成!" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host "📍 访问地址:" -ForegroundColor Cyan
|
||||
Write-Host " 前端: http://localhost" -ForegroundColor White
|
||||
Write-Host " 后端API: http://localhost:8080" -ForegroundColor White
|
||||
Write-Host " API文档: http://localhost:8080/api" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "📍 数据库连接信息:" -ForegroundColor Cyan
|
||||
Write-Host " 地址: localhost:3306" -ForegroundColor White
|
||||
Write-Host " 用户: aigc_user" -ForegroundColor White
|
||||
Write-Host " 密码: aigc_password" -ForegroundColor White
|
||||
Write-Host " 数据库: aigc_platform" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "📍 Redis:" -ForegroundColor Cyan
|
||||
Write-Host " 地址: localhost:6379" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "📋 常用命令:" -ForegroundColor Yellow
|
||||
Write-Host " 查看所有服务日志: docker-compose logs -f" -ForegroundColor Gray
|
||||
Write-Host " 查看后端日志: docker-compose logs -f backend" -ForegroundColor Gray
|
||||
Write-Host " 查看前端日志: docker-compose logs -f frontend" -ForegroundColor Gray
|
||||
Write-Host " 查看服务状态: docker-compose ps" -ForegroundColor Gray
|
||||
Write-Host " 停止服务: docker-compose down" -ForegroundColor Gray
|
||||
Write-Host " 停止并删除数据: docker-compose down -v" -ForegroundColor Gray
|
||||
Write-Host " 重新部署: .\deploy.ps1" -ForegroundColor Gray
|
||||
Write-Host ""
|
||||
Write-Host "⚠️ 注意事项:" -ForegroundColor Yellow
|
||||
Write-Host " 1. 首次启动可能需要更长时间,请耐心等待" -ForegroundColor Gray
|
||||
Write-Host " 2. 如果服务未正常启动,请查看日志排查问题" -ForegroundColor Gray
|
||||
Write-Host " 3. 确保端口 80、8080、3306、6379 未被占用" -ForegroundColor Gray
|
||||
Write-Host ("=" * 60) -ForegroundColor Green
|
||||
71
demo/scripts/deploy/deploy.sh
Normal file
71
demo/scripts/deploy/deploy.sh
Normal file
@@ -0,0 +1,71 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Nginx 反向代理部署脚本
|
||||
|
||||
echo "🚀 开始部署 AIGC 平台..."
|
||||
|
||||
# 检查 Docker
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker 未安装,请先安装 Docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
echo "❌ Docker Compose 未安装,请先安装 Docker Compose"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 构建前端
|
||||
echo "📦 构建前端..."
|
||||
cd frontend
|
||||
if ! npm install; then
|
||||
echo "❌ 前端依赖安装失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! npm run build; then
|
||||
echo "❌ 前端构建失败"
|
||||
exit 1
|
||||
fi
|
||||
cd ..
|
||||
|
||||
# 检查前端构建产物
|
||||
if [ ! -d "frontend/dist" ]; then
|
||||
echo "❌ 前端构建产物不存在,请检查构建过程"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ 前端构建完成"
|
||||
|
||||
# 停止现有容器
|
||||
echo "🛑 停止现有容器..."
|
||||
docker-compose down
|
||||
|
||||
# 构建并启动服务
|
||||
echo "🔨 构建并启动服务..."
|
||||
docker-compose up -d --build
|
||||
|
||||
# 等待服务启动
|
||||
echo "⏳ 等待服务启动..."
|
||||
sleep 10
|
||||
|
||||
# 检查服务状态
|
||||
echo "📊 检查服务状态..."
|
||||
docker-compose ps
|
||||
|
||||
# 测试健康检查
|
||||
echo "🏥 测试健康检查..."
|
||||
if curl -f http://localhost/health > /dev/null 2>&1; then
|
||||
echo "✅ Nginx 健康检查通过"
|
||||
else
|
||||
echo "⚠️ Nginx 健康检查失败"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ 部署完成!"
|
||||
echo "🌐 前端地址: http://localhost"
|
||||
echo "🔗 API 地址: http://localhost/api"
|
||||
echo ""
|
||||
echo "查看日志: docker-compose logs -f"
|
||||
echo "停止服务: docker-compose down"
|
||||
|
||||
51
demo/scripts/utils/check_queue.ps1
Normal file
51
demo/scripts/utils/check_queue.ps1
Normal file
@@ -0,0 +1,51 @@
|
||||
# 检查队列状态的PowerShell脚本
|
||||
|
||||
Write-Host "=== 检查应用状态 ===" -ForegroundColor Green
|
||||
$port8080 = netstat -ano | findstr :8080
|
||||
if ($port8080) {
|
||||
Write-Host "✅ 应用正在运行 (端口8080)" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "❌ 应用未运行 (端口8080)" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-Host "`n=== 检查Java进程 ===" -ForegroundColor Green
|
||||
$javaProcesses = Get-Process | Where-Object {$_.ProcessName -like "*java*"}
|
||||
if ($javaProcesses) {
|
||||
Write-Host "✅ 找到Java进程:" -ForegroundColor Green
|
||||
$javaProcesses | Select-Object Id, ProcessName, CPU | Format-Table
|
||||
} else {
|
||||
Write-Host "❌ 没有找到Java进程" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-Host "`n=== 尝试启动应用 ===" -ForegroundColor Yellow
|
||||
try {
|
||||
Write-Host "启动Spring Boot应用..." -ForegroundColor Yellow
|
||||
Start-Process -FilePath "java" -ArgumentList "-jar", "target/demo-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=dev" -WindowStyle Hidden
|
||||
Write-Host "✅ 应用启动命令已执行" -ForegroundColor Green
|
||||
|
||||
Write-Host "等待应用启动..." -ForegroundColor Yellow
|
||||
Start-Sleep -Seconds 30
|
||||
|
||||
Write-Host "`n=== 检查应用是否启动成功 ===" -ForegroundColor Green
|
||||
$port8080After = netstat -ano | findstr :8080
|
||||
if ($port8080After) {
|
||||
Write-Host "✅ 应用启动成功" -ForegroundColor Green
|
||||
|
||||
Write-Host "`n=== 测试诊断接口 ===" -ForegroundColor Green
|
||||
try {
|
||||
$response = Invoke-WebRequest -Uri "http://localhost:8080/api/diagnostic/queue-status" -Method GET -TimeoutSec 10
|
||||
Write-Host "✅ 诊断接口响应成功" -ForegroundColor Green
|
||||
Write-Host "响应内容:" -ForegroundColor Yellow
|
||||
$response.Content | ConvertFrom-Json | ConvertTo-Json -Depth 3
|
||||
} catch {
|
||||
Write-Host "❌ 诊断接口调用失败: $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
} else {
|
||||
Write-Host "❌ 应用启动失败" -ForegroundColor Red
|
||||
}
|
||||
} catch {
|
||||
Write-Host "❌ 启动应用失败: $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
|
||||
Write-Host "`n=== 检查完成 ===" -ForegroundColor Green
|
||||
|
||||
21
demo/scripts/utils/clear-expired-token.sh
Normal file
21
demo/scripts/utils/clear-expired-token.sh
Normal file
@@ -0,0 +1,21 @@
|
||||
# 清除过期JWT Token脚本
|
||||
|
||||
echo "=== 清除过期JWT Token ==="
|
||||
echo "问题:JWT token已过期,导致登录后立即被重定向"
|
||||
echo "解决:清除localStorage中的过期token,重新登录"
|
||||
|
||||
echo -e "\n🔧 解决方案:"
|
||||
echo "1. 打开浏览器开发者工具 (F12)"
|
||||
echo "2. 进入 Console 标签页"
|
||||
echo "3. 执行以下命令清除过期token:"
|
||||
echo ""
|
||||
echo "localStorage.removeItem('token')"
|
||||
echo "localStorage.removeItem('user')"
|
||||
echo "location.reload()"
|
||||
echo ""
|
||||
echo "4. 然后重新登录:"
|
||||
echo " - 用户名: admin"
|
||||
echo " - 密码: admin123"
|
||||
echo ""
|
||||
echo "✅ JWT过期时间已从24小时增加到7天"
|
||||
echo "✅ 清除过期token后重新登录即可正常工作"
|
||||
24
demo/scripts/utils/clear-localStorage.sh
Normal file
24
demo/scripts/utils/clear-localStorage.sh
Normal file
@@ -0,0 +1,24 @@
|
||||
# 清除旧localStorage数据脚本
|
||||
|
||||
echo "=== 清除旧localStorage数据 ==="
|
||||
echo "已修改token存储方式:从localStorage改为sessionStorage"
|
||||
echo "现在关闭页面时token会自动清除"
|
||||
|
||||
echo -e "\n🔧 清除步骤:"
|
||||
echo "1. 打开浏览器开发者工具 (F12)"
|
||||
echo "2. 进入 Console 标签页"
|
||||
echo "3. 执行以下命令清除旧的localStorage数据:"
|
||||
echo ""
|
||||
echo "localStorage.removeItem('token')"
|
||||
echo "localStorage.removeItem('user')"
|
||||
echo "console.log('已清除localStorage中的旧数据')"
|
||||
echo ""
|
||||
echo "4. 然后重新登录:"
|
||||
echo " - 用户名: admin"
|
||||
echo " - 密码: admin123"
|
||||
echo ""
|
||||
echo "✅ 修改内容:"
|
||||
echo "- token和用户信息现在存储在sessionStorage中"
|
||||
echo "- 关闭页面时自动清除,提高安全性"
|
||||
echo "- 刷新页面时保持登录状态"
|
||||
echo "- 401错误时自动清除sessionStorage"
|
||||
73
demo/scripts/utils/setup-paypal.bat
Normal file
73
demo/scripts/utils/setup-paypal.bat
Normal file
@@ -0,0 +1,73 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo PayPal配置一键设置脚本
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
set CONFIG_FILE=src\main\resources\application-dev.properties
|
||||
set SOURCE_FILE=application.properties.paypal-config
|
||||
|
||||
echo [1/3] 检查配置文件...
|
||||
if exist "%SOURCE_FILE%" (
|
||||
echo ✓ 找到PayPal配置文件
|
||||
) else (
|
||||
echo ✗ 配置文件不存在: %SOURCE_FILE%
|
||||
echo 请确保 application.properties.paypal-config 文件存在
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [2/3] 创建application-dev.properties...
|
||||
if not exist "src\main\resources" (
|
||||
mkdir src\main\resources
|
||||
)
|
||||
|
||||
if exist "%CONFIG_FILE%" (
|
||||
echo ! application-dev.properties 已存在
|
||||
set /p OVERWRITE="是否追加PayPal配置?(Y/N): "
|
||||
if /i "%OVERWRITE%"=="Y" (
|
||||
echo. >> "%CONFIG_FILE%"
|
||||
type "%SOURCE_FILE%" >> "%CONFIG_FILE%"
|
||||
echo ✓ PayPal配置已追加
|
||||
) else (
|
||||
echo - 跳过配置
|
||||
)
|
||||
) else (
|
||||
type "%SOURCE_FILE%" > "%CONFIG_FILE%"
|
||||
echo ✓ application-dev.properties 创建成功
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [3/3] 验证配置...
|
||||
if exist "%CONFIG_FILE%" (
|
||||
echo ✓ 配置文件存在: %CONFIG_FILE%
|
||||
findstr /c:"paypal.client-id" "%CONFIG_FILE%" >nul
|
||||
if %errorlevel%==0 (
|
||||
echo ✓ PayPal配置已添加
|
||||
) else (
|
||||
echo ✗ PayPal配置未找到
|
||||
)
|
||||
) else (
|
||||
echo ✗ 配置文件创建失败
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo ✓ PayPal配置完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 下一步:
|
||||
echo 1. 启动应用: mvn spring-boot:run
|
||||
echo 2. 查看日志确认PayPal初始化成功
|
||||
echo 3. 访问 http://localhost:8080/swagger-ui.html 查看API文档
|
||||
echo.
|
||||
echo 安全提醒:
|
||||
echo - application-dev.properties 已在 .gitignore 中
|
||||
echo - 不会被提交到版本控制系统
|
||||
echo - 请妥善保管你的PayPal凭证
|
||||
echo.
|
||||
pause
|
||||
36
demo/scripts/utils/start-frpc.bat
Normal file
36
demo/scripts/utils/start-frpc.bat
Normal file
@@ -0,0 +1,36 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ====================================
|
||||
echo 启动 FRP 客户端
|
||||
echo ====================================
|
||||
echo.
|
||||
|
||||
REM 检查 frpc.ini 是否存在
|
||||
if not exist "frpc.ini" (
|
||||
echo [错误] frpc.ini 配置文件不存在!
|
||||
echo 请先创建 frpc.ini 配置文件
|
||||
echo 可以参考 frpc.ini.example 文件
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM 检查 frpc.exe 是否存在
|
||||
if not exist "frpc.exe" (
|
||||
echo [错误] frpc.exe 不存在!
|
||||
echo 请先下载 FRP 客户端:
|
||||
echo https://github.com/fatedier/frp/releases
|
||||
echo 解压后,将 frpc.exe 放在当前目录
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo 正在启动 FRP 客户端...
|
||||
echo 配置文件: frpc.ini
|
||||
echo.
|
||||
|
||||
REM 启动 FRP 客户端
|
||||
frpc.exe -c frpc.ini
|
||||
|
||||
pause
|
||||
|
||||
|
||||
33
demo/scripts/utils/start-local.bat
Normal file
33
demo/scripts/utils/start-local.bat
Normal file
@@ -0,0 +1,33 @@
|
||||
@echo off
|
||||
chcp 65001 >nul
|
||||
echo ========================================
|
||||
echo AIGC 项目本地启动脚本
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
echo [1/2] 启动后端服务...
|
||||
start "后端服务" cmd /k ".\mvnw.cmd spring-boot:run"
|
||||
timeout /t 3 /nobreak >nul
|
||||
|
||||
echo [2/2] 启动前端服务...
|
||||
cd frontend
|
||||
start "前端服务" cmd /k "npm run dev"
|
||||
cd ..
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 启动完成!
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 访问地址:
|
||||
echo 前端: http://localhost:5173
|
||||
echo 后端: http://localhost:8080
|
||||
echo Swagger: http://localhost:8080/swagger-ui.html
|
||||
echo.
|
||||
echo 提示:
|
||||
echo - 后端首次启动需要 30-60 秒
|
||||
echo - 请等待服务完全启动后再访问
|
||||
echo - 关闭窗口即可停止服务
|
||||
echo.
|
||||
pause
|
||||
|
||||
33
demo/scripts/utils/start_with_dns_fix.ps1
Normal file
33
demo/scripts/utils/start_with_dns_fix.ps1
Normal file
@@ -0,0 +1,33 @@
|
||||
# 启动Spring Boot应用(修复DNS解析问题)
|
||||
# 添加JVM参数禁用DNS负缓存
|
||||
|
||||
Write-Host "=== 启动Spring Boot应用(带DNS修复) ===" -ForegroundColor Green
|
||||
|
||||
$jvmArgs = @(
|
||||
"-Dsun.net.inetaddr.ttl=60", # DNS成功缓存60秒
|
||||
"-Dsun.net.inetaddr.negative.ttl=10", # DNS失败缓存10秒(默认10分钟)
|
||||
"-Dnetworkaddress.cache.ttl=60", # 另一种DNS缓存设置
|
||||
"-Dnetworkaddress.cache.negative.ttl=10", # 另一种DNS负缓存设置
|
||||
"-jar",
|
||||
"target/demo-0.0.1-SNAPSHOT.jar",
|
||||
"--spring.profiles.active=dev"
|
||||
)
|
||||
|
||||
Write-Host "启动参数: java $($jvmArgs -join ' ')" -ForegroundColor Yellow
|
||||
|
||||
try {
|
||||
Start-Process -FilePath "java" -ArgumentList $jvmArgs -NoNewWindow -Wait:$false
|
||||
Write-Host "✅ 应用启动命令已执行" -ForegroundColor Green
|
||||
Write-Host "等待应用启动..." -ForegroundColor Yellow
|
||||
Start-Sleep -Seconds 5
|
||||
|
||||
# 检查是否启动成功
|
||||
$port8080 = netstat -ano | findstr :8080
|
||||
if ($port8080) {
|
||||
Write-Host "✅ 应用已启动 (端口8080)" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host "⚠ 应用可能还在启动中,请稍后检查日志" -ForegroundColor Yellow
|
||||
}
|
||||
} catch {
|
||||
Write-Host "❌ 启动失败: $($_.Exception.Message)" -ForegroundColor Red
|
||||
}
|
||||
84
demo/scripts/utils/test-paypal-payment.ps1
Normal file
84
demo/scripts/utils/test-paypal-payment.ps1
Normal file
@@ -0,0 +1,84 @@
|
||||
# PayPal支付测试脚本
|
||||
# 使用方法: .\test-paypal-payment.ps1
|
||||
|
||||
Write-Host "========================================" -ForegroundColor Cyan
|
||||
Write-Host "PayPal支付功能测试" -ForegroundColor Cyan
|
||||
Write-Host "========================================" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
# 检查应用是否运行
|
||||
Write-Host "[1/4] 检查应用状态..." -ForegroundColor Yellow
|
||||
try {
|
||||
$response = Invoke-WebRequest -Uri "http://localhost:8080/actuator/health" -TimeoutSec 3 -ErrorAction SilentlyContinue
|
||||
Write-Host "✓ 应用正在运行" -ForegroundColor Green
|
||||
} catch {
|
||||
Write-Host "✗ 应用未启动,请先运行: mvn spring-boot:run" -ForegroundColor Red
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "[2/4] 创建PayPal支付..." -ForegroundColor Yellow
|
||||
|
||||
# 生成随机订单号
|
||||
$orderId = "TEST" + (Get-Date -Format "yyyyMMddHHmmss")
|
||||
|
||||
$body = @{
|
||||
username = "testuser"
|
||||
orderId = $orderId
|
||||
amount = "10.00"
|
||||
method = "PAYPAL"
|
||||
} | ConvertTo-Json
|
||||
|
||||
try {
|
||||
$result = Invoke-RestMethod -Uri "http://localhost:8080/api/payment/paypal/create" `
|
||||
-Method Post `
|
||||
-ContentType "application/json" `
|
||||
-Body $body
|
||||
|
||||
Write-Host "✓ 支付创建成功!" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host "支付信息:" -ForegroundColor Cyan
|
||||
Write-Host " Payment ID: $($result.paymentId)" -ForegroundColor White
|
||||
Write-Host " 订单号: $orderId" -ForegroundColor White
|
||||
Write-Host " 金额: $10.00 USD" -ForegroundColor White
|
||||
Write-Host " PayPal Payment ID: $($result.externalTransactionId)" -ForegroundColor White
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "[3/4] 支付URL已生成" -ForegroundColor Yellow
|
||||
Write-Host " $($result.paymentUrl)" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
Write-Host "[4/4] 下一步操作:" -ForegroundColor Yellow
|
||||
Write-Host " 1. 在浏览器中打开上面的URL" -ForegroundColor White
|
||||
Write-Host " 2. 使用PayPal Sandbox测试账号登录" -ForegroundColor White
|
||||
Write-Host " 3. 点击 'Pay Now' 完成支付" -ForegroundColor White
|
||||
Write-Host " 4. 支付完成后会自动跳转回应用" -ForegroundColor White
|
||||
Write-Host ""
|
||||
|
||||
# 询问是否自动打开浏览器
|
||||
$open = Read-Host "是否在浏览器中打开支付URL? (Y/N)"
|
||||
if ($open -eq "Y" -or $open -eq "y") {
|
||||
Start-Process $result.paymentUrl
|
||||
Write-Host "✓ 已在浏览器中打开支付页面" -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "========================================" -ForegroundColor Cyan
|
||||
Write-Host "提示:" -ForegroundColor Yellow
|
||||
Write-Host "- 如果还没有创建Sandbox测试账号,请访问:" -ForegroundColor White
|
||||
Write-Host " https://developer.paypal.com/dashboard/accounts" -ForegroundColor Cyan
|
||||
Write-Host "- 创建 Personal 账号作为买家" -ForegroundColor White
|
||||
Write-Host "- 使用该账号登录并完成支付测试" -ForegroundColor White
|
||||
Write-Host "========================================" -ForegroundColor Cyan
|
||||
|
||||
} catch {
|
||||
Write-Host "✗ 创建支付失败" -ForegroundColor Red
|
||||
Write-Host "错误信息: $($_.Exception.Message)" -ForegroundColor Red
|
||||
Write-Host ""
|
||||
Write-Host "可能的原因:" -ForegroundColor Yellow
|
||||
Write-Host "1. PayPal配置未正确加载" -ForegroundColor White
|
||||
Write-Host "2. PayPal Client ID或Secret不正确" -ForegroundColor White
|
||||
Write-Host "3. 网络连接问题" -ForegroundColor White
|
||||
Write-Host ""
|
||||
Write-Host "请检查应用日志获取详细错误信息" -ForegroundColor Yellow
|
||||
}
|
||||
Reference in New Issue
Block a user