From d5f11e43bd630b853b0ed985f9f9ac49ae9c22f8 Mon Sep 17 00:00:00 2001 From: lanmus <397979320@qq.com> Date: Sun, 24 Aug 2025 12:19:47 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20=E5=AE=8C=E5=96=84=E5=89=8D?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E5=90=AF=E5=8A=A8=E8=84=9A=E6=9C=AC=E5=92=8C?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✨ 新增启动脚本: - start-full-project.sh: 完整的前后端启动脚本,含环境检查 - dev-start.sh: 开发环境快速启动脚本 - stop-full-project.sh: 停止所有服务的脚本 📖 新增文档: - STARTUP_GUIDE.md: 详细的启动指南和故障排除 - 更新 README.md: 添加项目结构说明和启动脚本介绍 🔧 功能特点: - ✅ 自动环境检查(Java、Node.js、MongoDB) - ✅ 智能进程管理和端口清理 - ✅ 详细的启动日志和状态检查 - ✅ 交互式和静默启动模式 - ✅ 完整的故障排除指南 🎯 适配新项目结构: - 后端:项目根目录 (Spring Boot) - 前端:frontend/ 子目录 (Vue.js) - 一键启动完整的前后端开发环境 📋 三种启动方式: 1. dev-start.sh - 开发快速启动 ⭐ 推荐 2. start-full-project.sh - 完整启动检查 3. 手动分别启动 - 调试使用 现在开发者只需一个命令即可启动完整的前后端开发环境! --- README.md | 54 +++++++++- STARTUP_GUIDE.md | 222 +++++++++++++++++++++++++++++++++++++++ dev-start.sh | 46 ++++++++ start-full-project.sh | 237 ++++++++++++++++++++++++++++++++++++++++++ stop-full-project.sh | 101 ++++++++++++++++++ 5 files changed, 655 insertions(+), 5 deletions(-) create mode 100644 STARTUP_GUIDE.md create mode 100755 dev-start.sh create mode 100755 start-full-project.sh create mode 100755 stop-full-project.sh diff --git a/README.md b/README.md index 6a69b2c..43ad1e9 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ - ✅ **共享操作**:任何用户都可以上传、下载、删除、重命名所有文件 - ✅ **保留认证**:用户登录验证和基本权限控制仍然有效 - ✅ **元数据保留**:文件的创建者信息仍保存在数据库中 +- ✅ **前端集成**:前端Vue.js项目已集成到仓库中 (`frontend/` 目录) +- ✅ **一键启动**:提供完整的前后端启动脚本 ## 🔧 核心改造内容 @@ -22,9 +24,10 @@ 3. **文件操作公共化** - 所有文件操作适配公共空间 4. **用户目录管理适配** - 不再创建用户专属目录 -### 前端兼容性 -- ✅ **无需修改** - 前端代码完全兼容,无需任何变更 -- ✅ **API向后兼容** - 保持原有接口参数,仅后端逻辑调整 +### 前端集成 +- ✅ **完整集成** - 前端Vue.js项目已集成到仓库 +- ✅ **API兼容** - 保持原有接口参数,仅后端逻辑调整 +- ✅ **一站式开发** - 一个仓库包含完整前后端代码 ## 🎯 适用场景 @@ -96,15 +99,31 @@ - MongoDB 4.4+ - Maven 3.6+ -### 构建和运行 +### 🚀 快速启动 (推荐) + +#### 一键启动前后端 +```bash +# 开发环境快速启动 +./dev-start.sh + +# 或完整启动 (含环境检查) +./start-full-project.sh +``` + +#### 手动构建和运行 ```bash # 构建项目 mvn clean package -DskipTests -# 运行 +# 运行后端 java -jar target/clouddisk-*.jar + +# 启动前端 (另开终端) +cd frontend/ && npm install && npm run dev ``` +> 📖 详细启动说明请查看:[STARTUP_GUIDE.md](./STARTUP_GUIDE.md) + ### Docker 部署 #### 🎯 方案1:从Git仓库构建部署(推荐) @@ -127,6 +146,31 @@ docker-compose up -d - **自动构建**:支持从Git仓库直接构建Docker镜像 - **持续集成**:修改代码后重新构建即可更新 +## 📁 项目结构 + +``` +jmalcloud/ +├── src/ # 🔧 后端Java源码 +│ ├── main/java/ # Spring Boot主代码 +│ └── test/java/ # 单元测试代码 +├── frontend/ # 🎨 前端Vue.js项目 +│ ├── src/ # Vue组件和页面 +│ ├── public/ # 静态资源 +│ └── package.json # NPM依赖配置 +├── docker-compose*.yml # 🐳 多种Docker部署配置 +├── *.sh # 🚀 启动和构建脚本 +├── *.md # 📖 详细文档 +└── pom.xml # 📦 Maven项目配置 +``` + +### 🔧 启动脚本说明 + +| 脚本 | 用途 | 推荐场景 | +|------|------|----------| +| `dev-start.sh` | 快速启动前后端 | 日常开发 ⭐ | +| `start-full-project.sh` | 完整启动含检查 | 首次部署 | +| `stop-full-project.sh` | 停止所有服务 | 清理环境 | + ## 📝 变更日志 ### v2.15.0-public-space diff --git a/STARTUP_GUIDE.md b/STARTUP_GUIDE.md new file mode 100644 index 0000000..172fe6b --- /dev/null +++ b/STARTUP_GUIDE.md @@ -0,0 +1,222 @@ +# 🚀 JmalCloud 前后端启动指南 + +> 完整的前后端集成项目启动说明 + +## 📋 项目结构确认 + +### ✅ 前后端代码完整性检查 + +**后端代码** (根目录): +- ✅ `src/main/` - Java源代码 +- ✅ `src/test/` - 测试代码 +- ✅ `pom.xml` - Maven配置 +- ✅ `target/` - 编译输出 + +**前端代码** (`frontend/` 目录): +- ✅ `src/` - Vue.js源代码 +- ✅ `package.json` - NPM配置 +- ✅ `vue.config.js` - Vue CLI配置 +- ✅ `public/` - 静态资源 + +## ⚙️ 环境要求 + +### 后端要求 +- ☑️ **Java**: 21+ (推荐) +- ☑️ **Maven**: 3.6+ +- ☑️ **MongoDB**: 4.4+ (需要运行中) + +### 前端要求 +- ☑️ **Node.js**: ^16 或 ^18 (package.json指定) +- ☑️ **npm**: 自带或yarn +- ☑️ **Vue CLI**: 自动安装 + +## 🚀 启动方式 + +### 方式1:开发环境快速启动 ⭐️ 推荐 + +```bash +# 一键启动前后端 (后台运行) +./dev-start.sh +``` + +**特点**: +- ✅ 最简单快速 +- ✅ 后台运行,不占用终端 +- ✅ 适合日常开发 + +**访问地址**: +- 🌐 前端:http://localhost:9528 +- 🔌 后端:http://localhost:8088 + +### 方式2:完整交互式启动 + +```bash +# 完整的启动过程,带环境检查 +./start-full-project.sh +``` + +**特点**: +- ✅ 完整的环境检查 +- ✅ 详细的启动日志 +- ✅ 交互式选项 +- ✅ 自动健康检查 + +### 方式3:手动分别启动 + +**启动后端**: +```bash +# 设置环境变量 +export MONGODB_URI="mongodb://localhost:27017/jmalcloud" + +# 启动Spring Boot +mvn spring-boot:run -Dspring-boot.run.profiles=dev +``` + +**启动前端**: +```bash +cd frontend/ + +# 安装依赖 (首次运行) +npm install + +# 设置环境变量 +export NODE_OPTIONS="--openssl-legacy-provider" +export VUE_APP_BASE_API="/api" +export API="http://localhost:8088" + +# 启动Vue开发服务器 +npm run dev +``` + +## 🛑 停止服务 + +```bash +# 停止所有服务 +./stop-full-project.sh +``` + +## 📊 服务管理 + +### 查看运行状态 +```bash +# 检查端口占用 +lsof -ti:8088 # 后端 +lsof -ti:9528 # 前端 + +# 检查进程 +ps aux | grep spring-boot +ps aux | grep vue-cli-service +``` + +### 查看日志 +```bash +# 实时查看日志 +tail -f backend.log # 后端日志 +tail -f frontend.log # 前端日志 + +# 或同时查看 +tail -f backend.log frontend.log +``` + +## 🔧 常见问题解决 + +### 1. Node.js版本问题 +如果Node.js版本不匹配: + +```bash +# 使用nvm管理Node.js版本 +nvm install 18 +nvm use 18 + +# 或设置兼容选项 +export NODE_OPTIONS="--openssl-legacy-provider" +``` + +### 2. 端口冲突 +修改端口配置: + +```bash +# 修改后端端口 +export SERVER_PORT=8089 + +# 修改前端端口 +export PORT=9529 +``` + +### 3. MongoDB连接失败 +```bash +# 启动MongoDB +brew services start mongodb-community # macOS +# 或 +systemctl start mongod # Linux + +# 检查连接 +mongosh --eval "db.adminCommand('ping')" +``` + +### 4. Maven构建失败 +```bash +# 清理并重新构建 +mvn clean compile + +# 跳过测试 +mvn spring-boot:run -DskipTests +``` + +### 5. 前端依赖安装失败 +```bash +cd frontend/ + +# 清理缓存 +npm cache clean --force +rm -rf node_modules package-lock.json + +# 重新安装 +npm install +``` + +## 🎯 开发建议 + +### 推荐的开发流程 +1. **首次启动**:使用 `./start-full-project.sh` 进行完整检查 +2. **日常开发**:使用 `./dev-start.sh` 快速启动 +3. **调试问题**:查看对应的日志文件 +4. **停止服务**:使用 `./stop-full-project.sh` 完整停止 + +### 默认访问地址 +| 服务 | 地址 | 说明 | +|------|------|------| +| **前端主页** | http://localhost:9528 | Vue.js开发服务器 | +| **后端API** | http://localhost:8088 | Spring Boot应用 | +| **健康检查** | http://localhost:8088/public/health | 后端状态检查 | +| **API文档** | http://localhost:8088/swagger-ui/ | 接口文档 | + +### 登录信息 +- **用户名**:`admin` +- **密码**:`123456` + +## 📁 项目文件说明 + +| 文件 | 说明 | 用途 | +|------|------|------| +| `start-full-project.sh` | 完整启动脚本 | 生产级启动,含环境检查 | +| `dev-start.sh` | 开发快速启动 | 日常开发使用 | +| `stop-full-project.sh` | 停止脚本 | 清理所有服务和端口 | +| `backend.log` | 后端日志 | Spring Boot运行日志 | +| `frontend.log` | 前端日志 | Vue CLI开发服务器日志 | + +## 💡 提示 + +1. **首次运行**建议使用 `./start-full-project.sh` 进行环境检查 +2. **前端首次启动**会自动安装依赖,请耐心等待 +3. **后端首次启动**需要编译,大约需要1-2分钟 +4. **MongoDB必须先启动**,否则后端会连接失败 +5. **端口占用**时脚本会自动清理旧进程 + +## 🆘 获得帮助 + +如果遇到问题: +1. 检查对应的日志文件 +2. 确认环境要求是否满足 +3. 尝试手动启动排查问题 +4. 使用停止脚本清理环境后重试 diff --git a/dev-start.sh b/dev-start.sh new file mode 100755 index 0000000..f0ae3fb --- /dev/null +++ b/dev-start.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# JmalCloud 开发环境快速启动脚本 + +set -e + +# 颜色定义 +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +echo -e "${BLUE}⚡ JmalCloud 开发环境快速启动${NC}" +echo -e "${BLUE}==============================${NC}" + +# 检查项目结构 +if [ ! -f "pom.xml" ] || [ ! -d "frontend" ]; then + echo "❌ 项目结构不完整,请确保在正确的项目根目录" + exit 1 +fi + +echo -e "${YELLOW}🔧 启动后端 (后台)...${NC}" +# 后端静默启动 +export MONGODB_URI="mongodb://localhost:27017/jmalcloud" +nohup mvn spring-boot:run -Dspring-boot.run.profiles=dev > backend.log 2>&1 & +echo "后端PID: $!" + +echo -e "${YELLOW}🎨 启动前端 (后台)...${NC}" +# 前端静默启动 +cd frontend +export NODE_OPTIONS="--openssl-legacy-provider" +export VUE_APP_BASE_API="/api" +export API="http://localhost:8088" +nohup npm run dev > ../frontend.log 2>&1 & +echo "前端PID: $!" +cd .. + +echo -e "${GREEN}✅ 启动完成!${NC}" +echo -e "${GREEN}🌐 前端: http://localhost:9528${NC}" +echo -e "${GREEN}🔌 后端: http://localhost:8088${NC}" +echo "" +echo -e "${YELLOW}📋 查看日志:${NC}" +echo " tail -f backend.log" +echo " tail -f frontend.log" +echo "" +echo -e "${YELLOW}🛑 停止服务:${NC}" +echo " ./stop-full-project.sh" diff --git a/start-full-project.sh b/start-full-project.sh new file mode 100755 index 0000000..957f104 --- /dev/null +++ b/start-full-project.sh @@ -0,0 +1,237 @@ +#!/bin/bash +# JmalCloud 完整前后端启动脚本 +# 适配新的集成项目结构:backend(根目录) + frontend(子目录) + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 配置参数 +BACKEND_PORT=${BACKEND_PORT:-8088} +FRONTEND_PORT=${FRONTEND_PORT:-9528} +BACKEND_LOG="backend.log" +FRONTEND_LOG="frontend.log" +FRONTEND_DIR="frontend" + +echo -e "${BLUE}🚀 JmalCloud 完整前后端启动脚本${NC}" +echo -e "${BLUE}=================================${NC}" + +# 检查必要工具 +check_requirements() { + echo -e "${YELLOW}📋 检查运行环境...${NC}" + + # 检查Java + if ! command -v java &> /dev/null; then + echo -e "${RED}❌ Java 未安装,请先安装Java 21+${NC}" + exit 1 + fi + + local java_version=$(java -version 2>&1 | head -n1 | cut -d'"' -f2) + echo -e "${GREEN}☑️ Java版本: ${java_version}${NC}" + + # 检查Maven + if ! command -v mvn &> /dev/null; then + echo -e "${RED}❌ Maven 未安装,请先安装Maven${NC}" + exit 1 + fi + + # 检查Node.js + if ! command -v node &> /dev/null; then + echo -e "${RED}❌ Node.js 未安装,请先安装Node.js${NC}" + exit 1 + fi + + local node_version=$(node --version) + echo -e "${GREEN}☑️ Node.js版本: ${node_version}${NC}" + + # 检查npm + if ! command -v npm &> /dev/null; then + echo -e "${RED}❌ npm 未安装${NC}" + exit 1 + fi + + # 检查MongoDB连接 + echo -e "${YELLOW}🔍 检查MongoDB连接...${NC}" + if command -v mongosh &> /dev/null; then + if mongosh --eval "db.adminCommand('ping')" --quiet > /dev/null 2>&1; then + echo -e "${GREEN}☑️ MongoDB 连接正常${NC}" + else + echo -e "${YELLOW}⚠️ MongoDB 连接失败,请确保MongoDB已启动${NC}" + fi + else + echo -e "${YELLOW}⚠️ 未发现mongosh,请确保MongoDB已启动${NC}" + fi +} + +# 停止现有进程 +stop_existing_processes() { + echo -e "${YELLOW}🛑 停止现有进程...${NC}" + + # 停止Java进程 + local java_pids=$(ps aux | grep 'java.*spring-boot:run\|java.*clouddisk' | grep -v grep | awk '{print $2}') + if [ ! -z "$java_pids" ]; then + echo "停止Java进程: $java_pids" + echo $java_pids | xargs kill -15 + sleep 2 + # 强制杀死 + echo $java_pids | xargs kill -9 2>/dev/null || true + fi + + # 停止Node进程 + local node_pids=$(ps aux | grep 'node.*vue-cli-service' | grep -v grep | awk '{print $2}') + if [ ! -z "$node_pids" ]; then + echo "停止Node.js进程: $node_pids" + echo $node_pids | xargs kill -15 + sleep 2 + echo $node_pids | xargs kill -9 2>/dev/null || true + fi + + # 清理端口占用 + for port in $BACKEND_PORT $FRONTEND_PORT; do + local pid=$(lsof -ti:$port) + if [ ! -z "$pid" ]; then + echo "清理端口 $port 占用进程: $pid" + kill -9 $pid 2>/dev/null || true + fi + done + + echo -e "${GREEN}✅ 进程清理完成${NC}" +} + +# 启动后端 +start_backend() { + echo -e "${YELLOW}🔧 启动后端服务...${NC}" + + # 检查pom.xml + if [ ! -f "pom.xml" ]; then + echo -e "${RED}❌ 未找到pom.xml,请确保在项目根目录运行${NC}" + exit 1 + fi + + # 设置环境变量 + export JAVA_HOME=${JAVA_HOME:-$(java -XshowSettings:properties -version 2>&1 | grep 'java.home' | awk '{print $3}')} + export MONGODB_URI=${MONGODB_URI:-"mongodb://localhost:27017/jmalcloud"} + export SERVER_PORT=$BACKEND_PORT + + echo "MongoDB URI: $MONGODB_URI" + echo "后端端口: $BACKEND_PORT" + + # 启动Spring Boot + nohup mvn spring-boot:run -Dspring-boot.run.profiles=dev > $BACKEND_LOG 2>&1 & + local backend_pid=$! + + echo "后端进程ID: $backend_pid" + echo -e "${GREEN}✅ 后端启动命令已执行${NC}" +} + +# 启动前端 +start_frontend() { + echo -e "${YELLOW}🎨 启动前端服务...${NC}" + + # 检查前端目录 + if [ ! -d "$FRONTEND_DIR" ]; then + echo -e "${RED}❌ 未找到前端目录: $FRONTEND_DIR${NC}" + exit 1 + fi + + cd $FRONTEND_DIR + + # 检查package.json + if [ ! -f "package.json" ]; then + echo -e "${RED}❌ 前端目录中未找到package.json${NC}" + exit 1 + fi + + # 安装依赖(如果需要) + if [ ! -d "node_modules" ]; then + echo -e "${YELLOW}📦 安装前端依赖...${NC}" + npm install + fi + + # 设置环境变量 + export NODE_OPTIONS="--openssl-legacy-provider" + export VUE_APP_BASE_API="/api" + export API="http://localhost:$BACKEND_PORT" + export PORT=$FRONTEND_PORT + + echo "前端API地址: $API" + echo "前端端口: $FRONTEND_PORT" + + # 启动Vue开发服务器 + nohup npm run dev > ../$FRONTEND_LOG 2>&1 & + local frontend_pid=$! + + cd .. + + echo "前端进程ID: $frontend_pid" + echo -e "${GREEN}✅ 前端启动命令已执行${NC}" +} + +# 检查服务状态 +check_services() { + echo -e "${YELLOW}⏳ 等待服务启动...${NC}" + sleep 10 + + # 检查后端 + echo -e "${BLUE}🔍 检查后端状态...${NC}" + if curl -s "http://localhost:$BACKEND_PORT/public/health" > /dev/null 2>&1; then + echo -e "${GREEN}✅ 后端服务运行正常${NC}" + else + echo -e "${YELLOW}⚠️ 后端服务可能还在启动中...${NC}" + echo -e "${YELLOW}📋 检查后端日志: tail -f $BACKEND_LOG${NC}" + fi + + # 检查前端 + echo -e "${BLUE}🔍 检查前端状态...${NC}" + if curl -s "http://localhost:$FRONTEND_PORT" > /dev/null 2>&1; then + echo -e "${GREEN}✅ 前端服务运行正常${NC}" + else + echo -e "${YELLOW}⚠️ 前端服务可能还在启动中...${NC}" + echo -e "${YELLOW}📋 检查前端日志: tail -f $FRONTEND_LOG${NC}" + fi +} + +# 显示访问信息 +show_access_info() { + echo -e "${GREEN}🎉 启动完成!${NC}" + echo -e "${BLUE}=================================${NC}" + echo -e "${GREEN}🌐 前端访问地址: ${YELLOW}http://localhost:$FRONTEND_PORT${NC}" + echo -e "${GREEN}🔌 后端API地址: ${YELLOW}http://localhost:$BACKEND_PORT${NC}" + echo -e "${GREEN}📊 后端健康检查: ${YELLOW}http://localhost:$BACKEND_PORT/public/health${NC}" + echo -e "${BLUE}=================================${NC}" + echo "" + echo -e "${YELLOW}📋 管理命令:${NC}" + echo -e " 查看后端日志: ${BLUE}tail -f $BACKEND_LOG${NC}" + echo -e " 查看前端日志: ${BLUE}tail -f $FRONTEND_LOG${NC}" + echo -e " 停止服务: ${BLUE}./stop-full-project.sh${NC}" + echo "" + echo -e "${GREEN}💡 提示: 初次启动可能需要较长时间,请耐心等待...${NC}" +} + +# 主函数 +main() { + check_requirements + stop_existing_processes + start_backend + start_frontend + check_services + show_access_info + + # 询问是否查看日志 + echo "" + read -p "🔍 是否查看实时日志?(y/N): " view_logs + if [[ $view_logs =~ ^[Yy]$ ]]; then + echo -e "${YELLOW}📋 显示实时日志 (Ctrl+C 退出)...${NC}" + tail -f $BACKEND_LOG $FRONTEND_LOG + fi +} + +# 脚本入口 +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + main "$@" +fi diff --git a/stop-full-project.sh b/stop-full-project.sh new file mode 100755 index 0000000..03183e3 --- /dev/null +++ b/stop-full-project.sh @@ -0,0 +1,101 @@ +#!/bin/bash +# JmalCloud 完整前后端停止脚本 + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +BACKEND_PORT=${BACKEND_PORT:-8088} +FRONTEND_PORT=${FRONTEND_PORT:-9528} + +echo -e "${BLUE}🛑 JmalCloud 服务停止脚本${NC}" +echo -e "${BLUE}=============================${NC}" + +# 停止Java后端进程 +echo -e "${YELLOW}🔧 停止后端服务...${NC}" +java_pids=$(ps aux | grep 'java.*spring-boot:run\|java.*clouddisk' | grep -v grep | awk '{print $2}') +if [ ! -z "$java_pids" ]; then + echo "发现Java进程: $java_pids" + echo $java_pids | xargs kill -15 + sleep 3 + + # 检查是否还有进程存在 + remaining_java=$(ps aux | grep 'java.*spring-boot:run\|java.*clouddisk' | grep -v grep | awk '{print $2}') + if [ ! -z "$remaining_java" ]; then + echo "强制终止Java进程: $remaining_java" + echo $remaining_java | xargs kill -9 + fi + echo -e "${GREEN}✅ 后端服务已停止${NC}" +else + echo -e "${GREEN}✅ 未发现运行中的后端服务${NC}" +fi + +# 停止Node.js前端进程 +echo -e "${YELLOW}🎨 停止前端服务...${NC}" +node_pids=$(ps aux | grep 'node.*vue-cli-service\|npm.*dev' | grep -v grep | awk '{print $2}') +if [ ! -z "$node_pids" ]; then + echo "发现Node.js进程: $node_pids" + echo $node_pids | xargs kill -15 + sleep 3 + + # 检查是否还有进程存在 + remaining_node=$(ps aux | grep 'node.*vue-cli-service\|npm.*dev' | grep -v grep | awk '{print $2}') + if [ ! -z "$remaining_node" ]; then + echo "强制终止Node.js进程: $remaining_node" + echo $remaining_node | xargs kill -9 + fi + echo -e "${GREEN}✅ 前端服务已停止${NC}" +else + echo -e "${GREEN}✅ 未发现运行中的前端服务${NC}" +fi + +# 清理端口占用 +echo -e "${YELLOW}🧹 清理端口占用...${NC}" +for port in $BACKEND_PORT $FRONTEND_PORT; do + pid=$(lsof -ti:$port 2>/dev/null || true) + if [ ! -z "$pid" ]; then + echo "清理端口 $port 占用进程: $pid" + kill -9 $pid 2>/dev/null || true + echo -e "${GREEN}✅ 端口 $port 已清理${NC}" + fi +done + +# 清理日志文件(可选) +echo -e "${YELLOW}🗑️ 清理日志文件...${NC}" +if [ -f "backend.log" ]; then + > backend.log + echo -e "${GREEN}✅ 后端日志已清理${NC}" +fi + +if [ -f "frontend.log" ]; then + > frontend.log + echo -e "${GREEN}✅ 前端日志已清理${NC}" +fi + +echo -e "${GREEN}🎉 所有服务已停止!${NC}" +echo -e "${BLUE}=============================${NC}" +echo -e "${GREEN}📋 状态检查:${NC}" + +# 最终检查 +backend_check=$(lsof -ti:$BACKEND_PORT 2>/dev/null || echo "") +frontend_check=$(lsof -ti:$FRONTEND_PORT 2>/dev/null || echo "") + +if [ -z "$backend_check" ]; then + echo -e "${GREEN}✅ 后端端口 $BACKEND_PORT 已释放${NC}" +else + echo -e "${RED}❌ 后端端口 $BACKEND_PORT 仍被占用${NC}" +fi + +if [ -z "$frontend_check" ]; then + echo -e "${GREEN}✅ 前端端口 $FRONTEND_PORT 已释放${NC}" +else + echo -e "${RED}❌ 前端端口 $FRONTEND_PORT 仍被占用${NC}" +fi + +echo "" +echo -e "${YELLOW}💡 提示: 如需重新启动,请运行 ./start-full-project.sh${NC}"