#!/usr/bin/env bash set -u SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$SCRIPT_DIR" SERVER_DIR="$ROOT_DIR/server" BACKEND_PORT="${PORT:-8002}" FRONTEND_PORT="${FRONTEND_PORT:-5173}" BACKEND_PID="" FRONTEND_PID="" echo "==========================================" echo " 启动 AI Chat 平台 (前端 + 后端)" echo "==========================================" require_file() { local path="$1" local message="$2" if [[ ! -e "$path" ]]; then echo "[错误] $message" exit 1 fi } kill_port() { local port="$1" local pids if ! command -v lsof >/dev/null 2>&1; then return 0 fi pids="$(lsof -ti :"$port" 2>/dev/null || true)" if [[ -n "$pids" ]]; then echo "[系统] 端口 $port 已被占用,正在停止旧进程..." kill $pids 2>/dev/null || true sleep 1 pids="$(lsof -ti :"$port" 2>/dev/null || true)" if [[ -n "$pids" ]]; then kill -9 $pids 2>/dev/null || true fi fi } cleanup() { local exit_code=$? trap - SIGINT SIGTERM EXIT echo echo "[系统] 正在关闭所有服务..." if [[ -n "$FRONTEND_PID" ]] && kill -0 "$FRONTEND_PID" 2>/dev/null; then kill "$FRONTEND_PID" 2>/dev/null || true fi if [[ -n "$BACKEND_PID" ]] && kill -0 "$BACKEND_PID" 2>/dev/null; then kill "$BACKEND_PID" 2>/dev/null || true fi wait "$FRONTEND_PID" 2>/dev/null || true wait "$BACKEND_PID" 2>/dev/null || true exit "$exit_code" } trap cleanup SIGINT SIGTERM EXIT require_file "$ROOT_DIR/package.json" "未找到前端 package.json" require_file "$SERVER_DIR/main.py" "未找到后端入口 server/main.py" require_file "$SERVER_DIR/.venv/bin/python" "未找到后端虚拟环境,请先在 server/.venv 安装依赖" if ! command -v npm >/dev/null 2>&1; then echo "[错误] 未找到 npm" exit 1 fi kill_port "$BACKEND_PORT" kill_port "$FRONTEND_PORT" echo "[系统] 正在启动后端服务器..." cd /home/mt/Projects/ai-chat-ui/server if [ -d ".venv" ]; then source .venv/bin/activate # 使用 -u 参数强制不缓冲输出,实时显示日志 python3 -u main.py & BACKEND_PID=$! else echo "[错误] 未找到虚拟环境 (.venv)。请先创建。" fi # 等待一小段时间确保后端启动 sleep 2 if ! kill -0 "$BACKEND_PID" 2>/dev/null; then echo "[错误] 后端启动失败" exit 1 fi echo "[系统] 正在启动前端服务器..." cd /home/mt/Projects/ai-chat-ui # 启动 vite 开发服务器 npm run dev & FRONTEND_PID=$! echo "==========================================" echo " 服务已启动,按 Ctrl+C 停止" echo "------------------------------------------" echo " 前端: http://localhost:$FRONTEND_PORT" echo " 后端: http://localhost:$BACKEND_PORT" echo "==========================================" wait "$BACKEND_PID" "$FRONTEND_PID"