96 lines
3.2 KiB
Bash
Executable File
96 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 部门关键任务追踪看板 · 启动脚本
|
||
# 用法: ./run.sh 正常启动
|
||
# PORT=8771 ./run.sh 换端口启动
|
||
# DEV=1 ./run.sh 开发模式(改 Python/前端/.env 自动重启,浏览器自动刷新)
|
||
# NO_OPEN=1 ./run.sh 启动后不自动打开浏览器
|
||
set -euo pipefail
|
||
cd "$(dirname "$0")"
|
||
|
||
PORT="${PORT:-8770}"
|
||
XLSX="${XLSX:-/Users/jiliu/WorkSpace/定开管理/软件开发部管理工作执行表.xlsx}"
|
||
STAFF_XLSX="${STAFF_XLSX:-/Users/jiliu/WorkSpace/unissense/部门管理/软件开发部人员名单.xlsx}"
|
||
|
||
echo "==> 部门关键任务追踪看板"
|
||
|
||
# ---------- 1. 选择带依赖的 Python 解释器 ----------
|
||
CANDIDATES=(
|
||
"./.venv/bin/python"
|
||
"/Users/jiliu/.workbuddy/binaries/python/envs/default/bin/python"
|
||
"$(command -v python3 2>/dev/null || true)"
|
||
"/usr/bin/python3"
|
||
)
|
||
PY=""
|
||
FALLBACK=""
|
||
for c in "${CANDIDATES[@]}"; do
|
||
[ -n "$c" ] && [ -x "$c" ] || continue
|
||
[ -z "$FALLBACK" ] && FALLBACK="$c"
|
||
if "$c" -c "import fastapi, uvicorn, sqlalchemy" >/dev/null 2>&1; then
|
||
PY="$c"; break
|
||
fi
|
||
done
|
||
|
||
if [ -z "$PY" ]; then
|
||
PY="$FALLBACK"
|
||
if [ -z "$PY" ]; then
|
||
echo "!! 没有找到 Python 3,请先安装后再运行。" >&2
|
||
exit 1
|
||
fi
|
||
echo "==> 缺少依赖,正在安装到 $PY"
|
||
"$PY" -m pip install -r requirements.txt || {
|
||
echo "!! 依赖安装失败,请手动执行:" >&2
|
||
echo " $PY -m pip install -r requirements.txt" >&2
|
||
exit 1
|
||
}
|
||
fi
|
||
echo " 使用解释器:$PY"
|
||
|
||
# ---------- 2. 端口占用检查(已在运行就直接给出地址) ----------
|
||
if curl -s -o /dev/null --max-time 2 "http://127.0.0.1:${PORT}/health" 2>/dev/null; then
|
||
echo "==> 端口 ${PORT} 上已有服务在运行"
|
||
echo " 看板地址: http://127.0.0.1:${PORT}"
|
||
echo " (要重启请先在原窗口按 Ctrl+C,或执行:lsof -ti:${PORT} | xargs kill)"
|
||
exit 0
|
||
fi
|
||
|
||
# ---------- 3. 首次运行:建库 + 导入历史数据 ----------
|
||
if [ ! -f data/board.db ]; then
|
||
echo "==> 首次运行,初始化数据库"
|
||
"$PY" scripts/init_db.py
|
||
if [ -f "$XLSX" ]; then
|
||
echo "==> 导入历史数据:$XLSX"
|
||
"$PY" scripts/import_excel.py "$XLSX"
|
||
echo "==> 拆分定开项目"
|
||
"$PY" scripts/migrate_custom.py
|
||
else
|
||
echo " (未找到 Excel 源文件,跳过历史数据导入:$XLSX)"
|
||
fi
|
||
if [ -f "$STAFF_XLSX" ]; then
|
||
echo "==> 导入人员名单:$STAFF_XLSX"
|
||
"$PY" scripts/import_staff.py "$STAFF_XLSX"
|
||
else
|
||
echo " (未找到人员名单,跳过人力库导入:$STAFF_XLSX)"
|
||
fi
|
||
fi
|
||
|
||
# ---------- 4. 启动 ----------
|
||
# 开发模式:uvicorn 默认只监听 *.py,这里补上前端文件与 .env
|
||
RELOAD_ARGS=()
|
||
if [ "${DEV:-0}" = "1" ]; then
|
||
RELOAD_ARGS=(--reload
|
||
--reload-include "*.js" --reload-include "*.css" --reload-include "*.html"
|
||
--reload-include ".env")
|
||
fi
|
||
|
||
URL="http://127.0.0.1:${PORT}"
|
||
echo "==> 启动服务: $URL"
|
||
echo " API 文档: $URL/api/docs"
|
||
echo " 停止服务: Ctrl+C"
|
||
echo
|
||
|
||
if [ "${NO_OPEN:-0}" != "1" ]; then
|
||
( sleep 3; open "$URL" >/dev/null 2>&1 || true ) &
|
||
fi
|
||
|
||
exec "$PY" -m uvicorn app.main:app --host 127.0.0.1 --port "$PORT" ${RELOAD_ARGS[@]+"${RELOAD_ARGS[@]}"}
|