jmalcloud/start-full-project.sh
lanmus d5f11e43bd 🚀 完善前后端启动脚本和文档
✨ 新增启动脚本:
- 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. 手动分别启动 - 调试使用

现在开发者只需一个命令即可启动完整的前后端开发环境!
2025-08-24 12:19:47 +08:00

238 lines
7.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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