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