🚀 完善前后端启动脚本和文档

✨ 新增启动脚本:
- 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. 手动分别启动 - 调试使用

现在开发者只需一个命令即可启动完整的前后端开发环境!
This commit is contained in:
lanmus 2025-08-24 12:19:47 +08:00
parent 8591ad3233
commit d5f11e43bd
5 changed files with 655 additions and 5 deletions

View File

@ -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

222
STARTUP_GUIDE.md Normal file
View File

@ -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. 使用停止脚本清理环境后重试

46
dev-start.sh Executable file
View File

@ -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"

237
start-full-project.sh Executable file
View File

@ -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

101
stop-full-project.sh Executable file
View File

@ -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}"