#!/bin/bash # ============================================ # 本地开发环境启动脚本 # 用法: ./dev-start.sh [选项] # 选项: # all - 启动所有服务(默认) # core - 启动核心服务(gateway + sys + frontend) # gateway - 仅启动网关 # sys - 仅启动系统服务 # cust - 仅启动客户服务 # proj - 仅启动项目服务 # req - 仅启动需求服务 # exp - 仅启动支出服务 # receipt - 仅启动票据服务 # file - 仅启动文件服务 # report - 仅启动报表服务 # frontend - 仅启动前端 # help - 显示帮助信息 # ============================================ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" APP_HOME="$(dirname "$SCRIPT_DIR")" LOG_DIR="${APP_HOME}/logs" # 创建日志目录 mkdir -p "${LOG_DIR}" # 服务端口配置 GATEWAY_PORT=8000 SYS_PORT=8100 CUST_PORT=8110 PROJ_PORT=8120 REQ_PORT=8130 EXP_PORT=8140 RECEIPT_PORT=8150 FILE_PORT=8600 REPORT_PORT=8700 FRONTEND_PORT=3000 # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查端口是否被占用 check_port() { local port=$1 if netstat -tlnp 2>/dev/null | grep -q ":${port} "; then return 0 # 端口被占用 fi return 1 # 端口空闲 } # 通用服务启动函数 # 参数: $1=服务名, $2=模块名, $3=端口, $4=主类名 start_service() { local name=$1 local module=$2 local port=$3 local main_class=$4 log_info "启动 ${name} 服务 (端口: ${port})..." if check_port ${port}; then log_warn "端口 ${port} 已被占用,跳过 ${name} 启动" return 0 fi cd "${APP_HOME}" nohup mvn -pl ${module} exec:java \ -Dexec.mainClass="${main_class}" \ > "${LOG_DIR}/${name}-console.log" 2>&1 & local pid=$! echo ${pid} > "${LOG_DIR}/${name}.pid" log_info "${name} 启动中... PID: ${pid}" # 等待启动完成 sleep 3 if check_port ${port}; then log_info "${name} 启动成功!" else log_warn "${name} 可能还在启动中,请检查日志: ${LOG_DIR}/${name}-console.log" fi } # 启动网关服务 start_gateway() { start_service "gateway" "fund-gateway" ${GATEWAY_PORT} "com.fundplatform.gateway.GatewayApplication" } # 启动系统服务 start_sys() { start_service "sys" "fund-sys" ${SYS_PORT} "com.fundplatform.sys.SysApplication" } # 启动客户服务 start_cust() { start_service "cust" "fund-cust" ${CUST_PORT} "com.fundplatform.cust.CustApplication" } # 启动项目服务 start_proj() { start_service "proj" "fund-proj" ${PROJ_PORT} "com.fundplatform.proj.ProjApplication" } # 启动需求服务 start_req() { start_service "req" "fund-req" ${REQ_PORT} "com.fundplatform.req.ReqApplication" } # 启动支出服务 start_exp() { start_service "exp" "fund-exp" ${EXP_PORT} "com.fundplatform.exp.ExpApplication" } # 启动票据服务 start_receipt() { start_service "receipt" "fund-receipt" ${RECEIPT_PORT} "com.fundplatform.receipt.ReceiptApplication" } # 启动文件服务 start_file() { start_service "file" "fund-file" ${FILE_PORT} "com.fundplatform.file.FileApplication" } # 启动报表服务 start_report() { start_service "report" "fund-report" ${REPORT_PORT} "com.fundplatform.report.ReportApplication" } # 启动前端服务 start_frontend() { log_info "启动管理后台前端 (端口: ${FRONTEND_PORT})..." cd "${APP_HOME}/fund-admin" # 检查 node_modules 是否存在 if [ ! -d "node_modules" ]; then log_info "安装前端依赖..." npm install fi # 查找可用端口 local port=${FRONTEND_PORT} while check_port ${port}; do port=$((port + 1)) if [ ${port} -gt 3010 ]; then log_error "无法找到可用端口 (3000-3010)" return 1 fi done if [ ${port} -ne ${FRONTEND_PORT} ]; then log_warn "端口 ${FRONTEND_PORT} 已被占用,使用端口 ${port}" fi nohup npm run dev -- --port ${port} --host 0.0.0.0 \ > "${LOG_DIR}/frontend-console.log" 2>&1 & local pid=$! echo ${pid} > "${LOG_DIR}/frontend.pid" log_info "前端启动中... PID: ${pid}" sleep 3 log_info "前端启动成功!访问地址: http://localhost:${port}" } # 启动核心服务 start_core() { log_info "==========================================" log_info "启动核心服务..." log_info "==========================================" start_gateway start_sys start_frontend log_info "==========================================" log_info "核心服务启动完成!" log_info "==========================================" } # 启动所有服务 start_all() { log_info "==========================================" log_info "启动本地开发环境(全部服务)..." log_info "==========================================" # 检查 Nacos if ! check_port 8848; then log_warn "Nacos (端口8848) 未运行,部分服务可能启动失败" log_warn "请先启动 Nacos 服务" fi # 检查 MySQL if ! check_port 3306; then log_warn "MySQL (端口3306) 未运行,数据库相关服务将启动失败" log_warn "请先启动 MySQL 服务" fi start_gateway start_sys start_cust start_proj start_req start_exp start_receipt start_file start_report start_frontend log_info "==========================================" log_info "本地开发环境启动完成!" log_info "==========================================" echo "" echo "服务地址:" echo " 网关: http://localhost:${GATEWAY_PORT}" echo " 系统: http://localhost:${SYS_PORT}" echo " 客户: http://localhost:${CUST_PORT}" echo " 项目: http://localhost:${PROJ_PORT}" echo " 需求: http://localhost:${REQ_PORT}" echo " 支出: http://localhost:${EXP_PORT}" echo " 票据: http://localhost:${RECEIPT_PORT}" echo " 文件: http://localhost:${FILE_PORT}" echo " 报表: http://localhost:${REPORT_PORT}" echo " 前端: http://localhost:${FRONTEND_PORT} (或查看日志获取实际端口)" echo "" echo "日志目录: ${LOG_DIR}" echo "停止服务: ./scripts/dev-stop.sh" } # 显示帮助 show_help() { echo "用法: $0 [选项]" echo "" echo "选项:" echo " all 启动所有服务(默认)" echo " core 启动核心服务(gateway + sys + frontend)" echo " gateway 仅启动网关服务" echo " sys 仅启动系统服务" echo " cust 仅启动客户服务" echo " proj 仅启动项目服务" echo " req 仅启动需求服务" echo " exp 仅启动支出服务" echo " receipt 仅启动票据服务" echo " file 仅启动文件服务" echo " report 仅启动报表服务" echo " frontend 仅启动前端服务" echo " help 显示此帮助信息" echo "" echo "服务端口:" echo " gateway: ${GATEWAY_PORT} | sys: ${SYS_PORT} | cust: ${CUST_PORT}" echo " proj: ${PROJ_PORT} | req: ${REQ_PORT} | exp: ${EXP_PORT}" echo " receipt: ${RECEIPT_PORT} | file: ${FILE_PORT} | report: ${REPORT_PORT}" echo "" echo "示例:" echo " $0 # 启动所有服务" echo " $0 core # 启动核心服务(网关+系统+前端)" echo " $0 sys cust # 启动系统和客户服务" echo " $0 frontend # 仅启动前端" } # 主入口 case "$1" in gateway) start_gateway ;; sys) start_sys ;; cust) start_cust ;; proj) start_proj ;; req) start_req ;; exp) start_exp ;; receipt) start_receipt ;; file) start_file ;; report) start_report ;; frontend) start_frontend ;; core) start_core ;; help|--help|-h) show_help ;; all|"") start_all ;; *) log_error "未知选项: $1" show_help exit 1 ;; esac