✨ 新增启动脚本: - 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. 手动分别启动 - 调试使用 现在开发者只需一个命令即可启动完整的前后端开发环境!
238 lines
7.2 KiB
Bash
Executable File
238 lines
7.2 KiB
Bash
Executable File
#!/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
|