#!/usr/bin/env bash
|
set -euo pipefail
|
# shellcheck source=lib.sh
|
source "$(dirname "$0")/lib.sh"
|
|
start_backend() {
|
if is_running "$BACKEND_PID"; then
|
echo "后端已在运行 (PID $(cat "$BACKEND_PID"))"
|
return 0
|
fi
|
if [[ ! -x "$ROOT/backend/.venv/bin/uvicorn" ]]; then
|
echo "未找到 backend/.venv,请先安装依赖:cd backend && python3 -m venv .venv && pip install -r requirements.txt"
|
exit 1
|
fi
|
cd "$ROOT/backend"
|
nohup .venv/bin/uvicorn app.main:app --host 127.0.0.1 --port "$BACKEND_PORT" \
|
>>"$LOG_DIR/backend.log" 2>&1 &
|
echo $! >"$BACKEND_PID"
|
echo "后端已启动 → http://127.0.0.1:$BACKEND_PORT (PID $(cat "$BACKEND_PID"), 日志 $LOG_DIR/backend.log)"
|
}
|
|
_record_vite_pid() {
|
sleep 1
|
local vite_pid
|
vite_pid="$(pgrep -f "$ROOT/frontend/node_modules/.bin/vite" | head -1 || true)"
|
if [[ -n "$vite_pid" ]]; then
|
echo "$vite_pid" >"$FRONTEND_PID"
|
fi
|
}
|
|
start_frontend_dev() {
|
if is_running "$FRONTEND_PID"; then
|
echo "前端 dev 已在运行 (PID $(cat "$FRONTEND_PID"))"
|
return 0
|
fi
|
if [[ ! -d "$ROOT/frontend/node_modules" ]]; then
|
echo "未找到 frontend/node_modules,请先执行:cd frontend && npm install"
|
exit 1
|
fi
|
cd "$ROOT/frontend"
|
nohup npm run dev >>"$LOG_DIR/frontend-dev.log" 2>&1 &
|
echo $! >"$FRONTEND_PID"
|
_record_vite_pid
|
echo "前端 dev → http://0.0.0.0:$FRONTEND_DEV_PORT (PID $(cat "$FRONTEND_PID" 2>/dev/null || echo ?), 日志 $LOG_DIR/frontend-dev.log)"
|
}
|
|
start_frontend_prod() {
|
if is_running "$FRONTEND_PID"; then
|
echo "前端已在运行 (PID $(cat "$FRONTEND_PID"))"
|
return 0
|
fi
|
if [[ ! -d "$ROOT/frontend/node_modules" ]]; then
|
echo "未找到 frontend/node_modules,请先执行:cd frontend && npm install"
|
exit 1
|
fi
|
"$(dirname "$0")/build-frontend.sh"
|
cd "$ROOT/frontend"
|
nohup npm run preview >>"$LOG_DIR/frontend.log" 2>&1 &
|
echo $! >"$FRONTEND_PID"
|
_record_vite_pid
|
echo "前端生产 → http://0.0.0.0:$FRONTEND_PORT (vite preview, PID $(cat "$FRONTEND_PID" 2>/dev/null || echo ?), 日志 $LOG_DIR/frontend.log)"
|
}
|
|
start_frontend() {
|
if [[ "$FRONTEND_MODE" == "dev" ]]; then
|
start_frontend_dev
|
else
|
start_frontend_prod
|
fi
|
}
|
|
case "${1:-all}" in
|
backend) start_backend ;;
|
frontend) start_frontend ;;
|
dev)
|
FRONTEND_MODE=dev
|
start_backend
|
start_frontend_dev
|
;;
|
all)
|
start_backend
|
start_frontend
|
;;
|
*)
|
echo "用法: $0 [all|dev|backend|frontend]"
|
echo " all 默认生产:build + Node vite preview @ $FRONTEND_PORT"
|
echo " dev 开发:vite dev @ $FRONTEND_DEV_PORT + 后端 $BACKEND_PORT"
|
exit 1
|
;;
|
esac
|