简化结构
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -1,24 +0,0 @@
|
|||||||
[project]
|
|
||||||
name = "tielu-railway-management"
|
|
||||||
version = "1.0.0"
|
|
||||||
description = "Railway Project Management System"
|
|
||||||
readme = "README.md"
|
|
||||||
requires-python = ">=3.12"
|
|
||||||
dependencies = [
|
|
||||||
"fastapi>=0.104.1",
|
|
||||||
"uvicorn>=0.24.0",
|
|
||||||
"sqlalchemy>=2.0.23",
|
|
||||||
"pymysql>=1.1.0",
|
|
||||||
"cryptography>=41.0.7",
|
|
||||||
"pydantic>=2.5.0",
|
|
||||||
"python-dotenv>=1.0.0",
|
|
||||||
"apscheduler>=3.10.4",
|
|
||||||
"pandas>=2.1.3",
|
|
||||||
"python-multipart>=0.0.6",
|
|
||||||
"openpyxl>=3.1.5",
|
|
||||||
]
|
|
||||||
|
|
||||||
[tool.uv.index]
|
|
||||||
url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
|
|
||||||
python-install-mirror = "https://mirror.nju.edu.cn/github-release/indygreg/python-build-standalone"
|
|
||||||
default = true
|
|
||||||
29
setup.sh
29
setup.sh
@@ -1,29 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# 注意:此脚本应在 WSL 或 Linux 环境中运行
|
|
||||||
|
|
||||||
# 提示用户输入密码
|
|
||||||
read -s -p "请输入sudo密码: " sudo_password
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# 定义一个函数来执行需要sudo的命令
|
|
||||||
run_with_sudo() {
|
|
||||||
echo "$sudo_password" | sudo -S bash -c "$1"
|
|
||||||
}
|
|
||||||
|
|
||||||
# 安装unzip
|
|
||||||
run_with_sudo "apt update"
|
|
||||||
|
|
||||||
# 给本地工具添加执行权限
|
|
||||||
chmod +x ./cloud-bin-amd64/uv
|
|
||||||
|
|
||||||
# 临时将本地工具目录添加到PATH
|
|
||||||
export PATH="$(pwd)/cloud-bin-amd64:$PATH"
|
|
||||||
|
|
||||||
# 配置pip源并使用 uv 安装Python依赖
|
|
||||||
echo "正在配置 PyPI 源并同步依赖..."
|
|
||||||
uv sync
|
|
||||||
uv pip install -r pyproject.toml
|
|
||||||
if [ ! -d ".venv" ]; then
|
|
||||||
echo "没有找到有虚拟环境"
|
|
||||||
fi
|
|
||||||
# source .venv/bin/activate
|
|
||||||
177
start_daemon.sh
177
start_daemon.sh
@@ -1,177 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# 铁路项目管理系统 - 后台运行启动脚本
|
|
||||||
# 使用方法: ./start_daemon.sh [端口号]
|
|
||||||
# 默认端口: 8000
|
|
||||||
|
|
||||||
# 设置端口号,默认为8000
|
|
||||||
PORT=${1:-3002}
|
|
||||||
|
|
||||||
# 设置日志文件路径
|
|
||||||
LOG_DIR="logs"
|
|
||||||
ACCESS_LOG="$LOG_DIR/access.log"
|
|
||||||
ERROR_LOG="$LOG_DIR/error.log"
|
|
||||||
APP_LOG="$LOG_DIR/app.log"
|
|
||||||
PID_FILE="$LOG_DIR/app.pid"
|
|
||||||
|
|
||||||
# 临时添加.venv/bin到PATH
|
|
||||||
export PATH=$PATH:$(pwd)/.venv/bin
|
|
||||||
# 临时添加./cloud-bin-amd64/到PATH
|
|
||||||
export PATH=$PATH:$(pwd)/cloud-bin-amd64
|
|
||||||
|
|
||||||
# 激活虚拟环境
|
|
||||||
source .venv/bin/activate
|
|
||||||
|
|
||||||
# 创建日志目录
|
|
||||||
mkdir -p "$LOG_DIR"
|
|
||||||
|
|
||||||
echo "=== 铁路项目管理系统后台启动脚本 ==="
|
|
||||||
echo "端口: $PORT"
|
|
||||||
echo "日志目录: $LOG_DIR"
|
|
||||||
|
|
||||||
# 清理端口函数
|
|
||||||
kill_process_on_port() {
|
|
||||||
local port=$1
|
|
||||||
echo "检查端口 ${port} 的进程..."
|
|
||||||
|
|
||||||
# Linux系统使用不同的命令查找占用端口的进程
|
|
||||||
if command -v lsof >/dev/null 2>&1; then
|
|
||||||
# 使用lsof
|
|
||||||
pid=$(lsof -ti :${port})
|
|
||||||
elif command -v netstat >/dev/null 2>&1; then
|
|
||||||
# 使用netstat
|
|
||||||
pid=$(netstat -tlnp 2>/dev/null | grep ":${port} " | awk '{print $7}' | cut -d'/' -f1)
|
|
||||||
elif command -v ss >/dev/null 2>&1; then
|
|
||||||
# 使用ss
|
|
||||||
pid=$(ss -tlnp | grep ":${port} " | sed 's/.*pid=\([0-9]*\).*/\1/')
|
|
||||||
else
|
|
||||||
echo "警告: 无法找到 lsof、netstat 或 ss 命令,跳过端口检查"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$pid" ] && [ "$pid" != "" ]; then
|
|
||||||
echo "发现端口 ${port} 被占用,PID: ${pid},正在杀死进程..."
|
|
||||||
kill -9 $pid 2>/dev/null
|
|
||||||
sleep 2
|
|
||||||
echo "已杀死端口 ${port} 的进程"
|
|
||||||
else
|
|
||||||
echo "端口 ${port} 未被占用"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 停止已运行的服务函数
|
|
||||||
stop_service() {
|
|
||||||
if [ -f "$PID_FILE" ]; then
|
|
||||||
local old_pid=$(cat "$PID_FILE")
|
|
||||||
if ps -p $old_pid > /dev/null 2>&1; then
|
|
||||||
echo "停止已运行的服务 (PID: $old_pid)..."
|
|
||||||
kill $old_pid
|
|
||||||
sleep 3
|
|
||||||
if ps -p $old_pid > /dev/null 2>&1; then
|
|
||||||
echo "强制停止服务..."
|
|
||||||
kill -9 $old_pid
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
rm -f "$PID_FILE"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查Python环境
|
|
||||||
check_python() {
|
|
||||||
if ! command -v python3 >/dev/null 2>&1; then
|
|
||||||
echo "错误: 未找到 python3"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 检查虚拟环境
|
|
||||||
if [ -d ".venv" ]; then
|
|
||||||
echo "激活虚拟环境..."
|
|
||||||
source .venv/bin/activate
|
|
||||||
elif [ -d "venv" ]; then
|
|
||||||
echo "激活虚拟环境..."
|
|
||||||
source venv/bin/activate
|
|
||||||
else
|
|
||||||
echo "警告: 未找到虚拟环境,使用系统Python"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查依赖
|
|
||||||
check_dependencies() {
|
|
||||||
echo "检查依赖包..."
|
|
||||||
python3 -c "import fastapi, uvicorn" 2>/dev/null
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "错误: 缺少必要的依赖包 (fastapi, uvicorn)"
|
|
||||||
echo "请运行: pip install -r requirements.txt"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 主函数
|
|
||||||
main() {
|
|
||||||
# 停止已运行的服务
|
|
||||||
stop_service
|
|
||||||
|
|
||||||
# 清理端口
|
|
||||||
kill_process_on_port $PORT
|
|
||||||
|
|
||||||
# 检查环境
|
|
||||||
check_python
|
|
||||||
check_dependencies
|
|
||||||
|
|
||||||
echo "启动服务..."
|
|
||||||
echo "启动时间: $(date)" > "$APP_LOG"
|
|
||||||
echo "端口: $PORT" >> "$APP_LOG"
|
|
||||||
echo "=================================" >> "$APP_LOG"
|
|
||||||
|
|
||||||
# 后台启动服务
|
|
||||||
nohup python3 -m uvicorn app.main:app \
|
|
||||||
--host 0.0.0.0 \
|
|
||||||
--port $PORT \
|
|
||||||
--access-log \
|
|
||||||
--log-level info \
|
|
||||||
>> "$APP_LOG" 2>&1 &
|
|
||||||
|
|
||||||
# 保存PID
|
|
||||||
echo $! > "$PID_FILE"
|
|
||||||
|
|
||||||
# 等待服务启动
|
|
||||||
sleep 3
|
|
||||||
|
|
||||||
# 检查服务是否启动成功
|
|
||||||
if ps -p $(cat "$PID_FILE") > /dev/null 2>&1; then
|
|
||||||
echo "✅ 服务启动成功!"
|
|
||||||
echo "🌐 访问地址: http://localhost:$PORT"
|
|
||||||
echo "📖 API文档: http://localhost:$PORT/docs"
|
|
||||||
echo "📋 ReDoc文档: http://localhost:$PORT/redoc"
|
|
||||||
echo "📄 日志文件: $APP_LOG"
|
|
||||||
echo "🔍 进程ID: $(cat $PID_FILE)"
|
|
||||||
echo ""
|
|
||||||
echo "查看日志: tail -f $APP_LOG"
|
|
||||||
echo "停止服务: ./stop.sh 或 kill $(cat $PID_FILE)"
|
|
||||||
|
|
||||||
# 创建停止脚本
|
|
||||||
cat > stop.sh << EOF
|
|
||||||
#!/bin/bash
|
|
||||||
if [ -f "$PID_FILE" ]; then
|
|
||||||
PID=\$(cat "$PID_FILE")
|
|
||||||
echo "停止服务 (PID: \$PID)..."
|
|
||||||
kill \$PID
|
|
||||||
rm -f "$PID_FILE"
|
|
||||||
echo "服务已停止"
|
|
||||||
else
|
|
||||||
echo "未找到运行中的服务"
|
|
||||||
fi
|
|
||||||
EOF
|
|
||||||
chmod +x stop.sh
|
|
||||||
|
|
||||||
else
|
|
||||||
echo "❌ 服务启动失败,请查看日志: $APP_LOG"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 捕获退出信号
|
|
||||||
trap 'echo "脚本被中断"; exit 1' INT TERM
|
|
||||||
|
|
||||||
# 运行主函数
|
|
||||||
main
|
|
||||||
121
start_server.sh
121
start_server.sh
@@ -1,121 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# 铁路项目管理系统 - 直接运行启动脚本
|
|
||||||
# 使用方法: ./start_server.sh [端口号]
|
|
||||||
# 默认端口: 8000
|
|
||||||
|
|
||||||
# 设置端口号,默认为8000
|
|
||||||
PORT=${1:-3002}
|
|
||||||
|
|
||||||
echo "=== 铁路项目管理系统启动脚本 ==="
|
|
||||||
echo "端口: $PORT"
|
|
||||||
echo "按 Ctrl+C 停止服务"
|
|
||||||
|
|
||||||
# 清理端口函数
|
|
||||||
kill_process_on_port() {
|
|
||||||
local port=$1
|
|
||||||
echo "检查端口 ${port} 的进程..."
|
|
||||||
|
|
||||||
# Linux系统使用不同的命令查找占用端口的进程
|
|
||||||
if command -v lsof >/dev/null 2>&1; then
|
|
||||||
# 使用lsof
|
|
||||||
pid=$(lsof -ti :${port})
|
|
||||||
elif command -v netstat >/dev/null 2>&1; then
|
|
||||||
# 使用netstat
|
|
||||||
pid=$(netstat -tlnp 2>/dev/null | grep ":${port} " | awk '{print $7}' | cut -d'/' -f1)
|
|
||||||
elif command -v ss >/dev/null 2>&1; then
|
|
||||||
# 使用ss
|
|
||||||
pid=$(ss -tlnp | grep ":${port} " | sed 's/.*pid=\([0-9]*\).*/\1/')
|
|
||||||
else
|
|
||||||
echo "警告: 无法找到 lsof、netstat 或 ss 命令,跳过端口检查"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$pid" ] && [ "$pid" != "" ]; then
|
|
||||||
echo "发现端口 ${port} 被占用,PID: ${pid},正在杀死进程..."
|
|
||||||
kill -9 $pid 2>/dev/null
|
|
||||||
sleep 2
|
|
||||||
echo "已杀死端口 ${port} 的进程"
|
|
||||||
else
|
|
||||||
echo "端口 ${port} 未被占用"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查Python环境
|
|
||||||
check_python() {
|
|
||||||
if ! command -v python3 >/dev/null 2>&1; then
|
|
||||||
echo "错误: 未找到 python3"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# 检查虚拟环境
|
|
||||||
if [ -d ".venv" ]; then
|
|
||||||
echo "激活虚拟环境..."
|
|
||||||
source .venv/bin/activate
|
|
||||||
elif [ -d "venv" ]; then
|
|
||||||
echo "激活虚拟环境..."
|
|
||||||
source venv/bin/activate
|
|
||||||
else
|
|
||||||
echo "警告: 未找到虚拟环境,使用系统Python"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查依赖
|
|
||||||
check_dependencies() {
|
|
||||||
echo "检查依赖包..."
|
|
||||||
python3 -c "import fastapi, uvicorn" 2>/dev/null
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
echo "错误: 缺少必要的依赖包 (fastapi, uvicorn)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 显示服务信息
|
|
||||||
show_service_info() {
|
|
||||||
echo ""
|
|
||||||
echo "=================================="
|
|
||||||
echo "✅ 服务启动成功!"
|
|
||||||
echo "🌐 访问地址: http://localhost:$PORT"
|
|
||||||
echo "📖 API文档: http://localhost:$PORT/docs"
|
|
||||||
echo "📋 ReDoc文档: http://localhost:$PORT/redoc"
|
|
||||||
echo "🔍 健康检查: http://localhost:$PORT/health"
|
|
||||||
echo "=================================="
|
|
||||||
echo ""
|
|
||||||
}
|
|
||||||
|
|
||||||
# 清理函数
|
|
||||||
cleanup() {
|
|
||||||
echo ""
|
|
||||||
echo "正在停止服务..."
|
|
||||||
# uvicorn会自动处理SIGTERM信号
|
|
||||||
exit 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# 主函数
|
|
||||||
main() {
|
|
||||||
# 清理端口
|
|
||||||
kill_process_on_port $PORT
|
|
||||||
|
|
||||||
# 检查环境
|
|
||||||
check_python
|
|
||||||
check_dependencies
|
|
||||||
|
|
||||||
# 捕获退出信号
|
|
||||||
trap cleanup SIGINT SIGTERM
|
|
||||||
|
|
||||||
echo "启动服务..."
|
|
||||||
|
|
||||||
# 显示服务信息(在后台执行,延迟3秒显示)
|
|
||||||
(sleep 3 && show_service_info) &
|
|
||||||
|
|
||||||
# 直接启动服务(前台运行)
|
|
||||||
python3 -m uvicorn app.main:app \
|
|
||||||
--host 0.0.0.0 \
|
|
||||||
--port $PORT \
|
|
||||||
--reload \
|
|
||||||
--access-log \
|
|
||||||
--log-level info
|
|
||||||
}
|
|
||||||
|
|
||||||
# 运行主函数
|
|
||||||
main
|
|
||||||
Reference in New Issue
Block a user