#!/bin/bash

# 结伴客后端服务启动脚本
# 用于启动Node.js后端服务

# 设置颜色变量
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 显示脚本使用说明
show_usage() {
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  start     启动后端服务"
    echo "  stop      停止后端服务"
    echo "  restart   重启后端服务"
    echo "  status    查看服务状态"
    echo "  help      显示帮助信息"
}

# 检查是否安装了Node.js
check_node() {
    if ! command -v node &> /dev/null; then
        echo -e "${RED}错误: 未找到Node.js，请先安装Node.js${NC}"
        exit 1
    fi
    
    NODE_VERSION=$(node -v)
    echo -e "${GREEN}✓ Node.js版本: ${NODE_VERSION}${NC}"
}

# 检查是否安装了npm
check_npm() {
    if ! command -v npm &> /dev/null; then
        echo -e "${RED}错误: 未找到npm，请先安装npm${NC}"
        exit 1
    fi
    
    NPM_VERSION=$(npm -v)
    echo -e "${GREEN}✓ npm版本: ${NPM_VERSION}${NC}"
}

# 检查依赖是否已安装
check_dependencies() {
    if [ ! -d "node_modules" ]; then
        echo -e "${YELLOW}警告: 未找到node_modules目录，正在安装依赖...${NC}"
        npm install
        if [ $? -ne 0 ]; then
            echo -e "${RED}错误: 依赖安装失败${NC}"
            exit 1
        fi
        echo -e "${GREEN}✓ 依赖安装完成${NC}"
    else
        echo -e "${GREEN}✓ 依赖已安装${NC}"
    fi
}

# 启动服务
start_service() {
    # 检查服务是否已经在运行
    if pgrep -f "node.*server.js" > /dev/null; then
        echo -e "${YELLOW}警告: 服务已在运行中${NC}"
        exit 1
    fi
    
    echo -e "${GREEN}正在启动结伴客后端服务...${NC}"
    
    # 设置环境变量
    export NODE_ENV=production
    export PORT=${PORT:-3200}
    
    # 启动服务并将其放到后台运行
    nohup npm start > server.log 2>&1 &
    SERVER_PID=$!
    
    # 将PID保存到文件
    echo $SERVER_PID > server.pid
    
    # 等待几秒钟让服务启动
    sleep 3
    
    # 检查服务是否成功启动
    if pgrep -f "node.*server.js" > /dev/null; then
        echo -e "${GREEN}✓ 服务启动成功${NC}"
        echo -e "${GREEN}✓ PID: ${SERVER_PID}${NC}"
        echo -e "${GREEN}✓ 日志文件: server.log${NC}"
        echo -e "${GREEN}✓ 访问地址: http://localhost:${PORT}${NC}"
    else
        echo -e "${RED}✗ 服务启动失败，请检查日志文件 server.log${NC}"
        rm -f server.pid
        exit 1
    fi
}

# 停止服务
stop_service() {
    if [ ! -f server.pid ]; then
        if pgrep -f "node.*server.js" > /dev/null; then
            echo -e "${YELLOW}警告: 找到正在运行的服务，但PID文件不存在${NC}"
            echo -e "${YELLOW}尝试查找并终止服务...${NC}"
            pkill -f "node.*server.js"
            sleep 2
            if pgrep -f "node.*server.js" > /dev/null; then
                echo -e "${RED}✗ 无法终止服务${NC}"
                exit 1
            else
                echo -e "${GREEN}✓ 服务已终止${NC}"
            fi
        else
            echo -e "${YELLOW}服务未在运行${NC}"
        fi
    else
        SERVER_PID=$(cat server.pid)
        if ps -p $SERVER_PID > /dev/null; then
            echo -e "${GREEN}正在停止服务 (PID: ${SERVER_PID})...${NC}"
            kill $SERVER_PID
            sleep 3
            if ps -p $SERVER_PID > /dev/null; then
                echo -e "${YELLOW}服务未响应，强制终止...${NC}"
                kill -9 $SERVER_PID
            fi
            rm -f server.pid
            echo -e "${GREEN}✓ 服务已停止${NC}"
        else
            echo -e "${YELLOW}PID文件存在但服务未在运行${NC}"
            rm -f server.pid
        fi
    fi
}

# 查看服务状态
status_service() {
    if [ -f server.pid ]; then
        SERVER_PID=$(cat server.pid)
        if ps -p $SERVER_PID > /dev/null; then
            echo -e "${GREEN}✓ 服务正在运行 (PID: ${SERVER_PID})${NC}"
        else
            echo -e "${RED}✗ PID文件存在但服务未在运行${NC}"
        fi
    else
        if pgrep -f "node.*server.js" > /dev/null; then
            echo -e "${GREEN}✓ 服务正在运行${NC}"
        else
            echo -e "${YELLOW}服务未在运行${NC}"
        fi
    fi
}

# 查看日志
tail_logs() {
    if [ -f server.log ]; then
        tail -f server.log
    else
        echo -e "${RED}日志文件不存在${NC}"
    fi
}

# 主逻辑
main() {
    # 获取命令行参数
    ACTION=${1:-"start"}
    
    case "$ACTION" in
        start)
            check_node
            check_npm
            check_dependencies
            start_service
            ;;
        stop)
            stop_service
            ;;
        restart)
            stop_service
            sleep 2
            check_node
            check_npm
            check_dependencies
            start_service
            ;;
        status)
            status_service
            ;;
        logs)
            tail_logs
            ;;
        help)
            show_usage
            ;;
        *)
            echo -e "${RED}未知选项: $ACTION${NC}"
            show_usage
            exit 1
            ;;
    esac
}

# 执行主逻辑
main "$@"
```
```
@echo off
title 结伴客后端服务启动脚本

setlocal enabledelayedexpansion

:: 设置颜色
for /f "delims=" %%i in ('echo prompt $E^| cmd') do set "ESC=%%i"

:: 检查Node.js是否安装
echo 检查Node.js环境...
node -v >nul 2>&1
if %errorlevel% neq 0 (
    echo %ESC%[91m错误: 未找到Node.js，请先安装Node.js%ESC%[0m
    pause
    exit /b 1
) else (
    for /f %%i in ('node -v') do set NODE_VERSION=%%i
    echo %ESC%[92m✓ Node.js版本: %NODE_VERSION%%ESC%[0m
)

:: 检查npm是否安装
echo 检查npm环境...
npm -v >nul 2>&1
if %errorlevel% neq 0 (
    echo %ESC%[91m错误: 未找到npm，请先安装npm%ESC%[0m
    pause
    exit /b 1
) else (
    for /f %%i in ('npm -v') do set NPM_VERSION=%%i
    echo %ESC%[92m✓ npm版本: %NPM_VERSION%%ESC%[0m
)

:: 检查依赖是否安装
if not exist "node_modules" (
    echo %ESC%[93m警告: 未找到node_modules目录，正在安装依赖...%ESC%[0m
    npm install
    if !errorlevel! neq 0 (
        echo %ESC%[91m错误: 依赖安装失败%ESC%[0m
        pause
        exit /b 1
    )
    echo %ESC%[92m✓ 依赖安装完成%ESC%[0m
) else (
    echo %ESC%[92m✓ 依赖已安装%ESC%[0m
)

:: 设置默认端口
if "%PORT%"=="" set PORT=3200

:: 启动服务
echo %ESC%[92m正在启动结伴客后端服务...%ESC%[0m
echo 服务将在端口 %PORT% 上运行
echo 日志将输出到 server.log 文件

npm start > server.log 2>&1

if %errorlevel% equ 0 (
    echo %ESC%[92m✓ 服务启动成功%ESC%[0m
) else (
    echo %ESC%[91m✗ 服务启动失败，请检查日志文件 server.log%ESC%[0m
)

pause
