a1354013-alt/plateau-breaker
GitHub: a1354013-alt/plateau-breaker
PlateauBreaker 是一个基于 FastAPI 和 Vue 3 的全栈健康追踪系统,旨在通过记录每日指标并运用规则逻辑自动检测与分析体重停滞期。
Stars: 0 | Forks: 0
# PlateauBreaker
PlateauBreaker 是一个小型的全栈应用,用于记录每日健康指标并检测体重停滞期。
- Backend: FastAPI + SQLModel (SQLite)
- Frontend: Vue 3 + PrimeVue + Pinia + Chart.js
## 核心功能
- 记录每日指标:体重、睡眠、卡路里、蛋白质、运动、步数、备注
- Dashboard KPI(7 天平均值)+ 趋势图表(7/14/30 天)
- 停滞期分析(基于最近 7 天评估规则)
- 原因分析(基于最近 7 天评估主要因素)
## 仓库布局
- `backend/`: FastAPI 服务(提供 `/api/...`)
- `backend/data/`: 用于开发/运行时数据的默认本地 SQLite 位置;不属于发布产物的一部分
- `backend/alembic/` + `backend/alembic.ini`: schema 变更的迁移入口
- `frontend/`: Vue 应用(Vite 开发服务器 + 生产构建)
- `PlateauBreaker_Technical_Guide.md`: API + 规则 + 数据流
## 前置条件
- Node.js + npm(用于前端)
- Python 3.11(用于后端;CI 使用 3.11)
### Node 版本(用于可复现安装的必需项)
- 本仓库通过 `.nvmrc` 锁定 Node 版本(`20.19.0`)。
- 如果你使用 asdf,可以使用 `.tool-versions`。
- 前端还在 `frontend/package.json` 中声明了 `engines.node`。
- 使用 Node 20.19+ 以避免 lockfile 偏移,并确保 `npm ci` 在干净环境中正常工作。
- 前端通过 `frontend/.npmrc`(`engine-strict=true`)强制执行此要求,因此 `npm ci` 会在 Node 版本错误时快速失败。
#### 示例 (nvm)
```
nvm install 20.19.0
nvm use 20.19.0
node -v
```
## 快速开始(本地)
### 1) Backend
```
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt -c constraints.txt
python -m pip install -r requirements-dev.txt -c constraints.txt
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
```
### 2) Frontend
```
cd frontend
npm ci
npm run dev
```
默认情况下,前端调用 `/api`(参见 `frontend/src/services/api.ts`)。
- 在开发环境中,Vite 将 `/api` 代理到 `http://localhost:8000`(参见 `frontend/vite.config.ts`)。
- 在生产环境中,你可以通过 `VITE_API_BASE_URL` 覆盖 API 基础路径(参见 `.env.example`)。
## 生产构建(前端)
```
cd frontend
npm ci
npm run build
```
构建输出位于 `frontend/dist/`。
注意:前端附带 `frontend/.npmrc`,用于将 npm 缓存保留在 `frontend/.npm-cache` 中。这避免了在受限环境中依赖全局用户缓存;该缓存可以安全删除,并且不包含在提交/发布中。
## 测试
### Backend
```
cd backend
python -m pip install -r requirements.txt -c constraints.txt
python -m pip install -r requirements-dev.txt -c constraints.txt
pytest -q
```
### Frontend
```
cd frontend
npm ci
npm test
```
## CI(推荐)
- GitHub Actions workflow: `.github/workflows/ci.yml`
- Frontend 任务运行 `npm ci`、`npm test -- --run`、`npm run build`,然后进行发布打包冒烟测试:
- `python scripts/make_release_zip.py --out-dir release`
- `python scripts/validate_release_zip.py --out-dir release`
- Backend 任务使用 `constraints.txt` 中的锁定依赖集在 Python 3.11 上运行 `pytest -q`。
## 种子数据(可选)
如果你希望在本地 SQLite 数据库中包含示例记录:
```
cd backend
.\.venv\Scripts\Activate.ps1
python seed_data.py
```
如果数据库已有记录,种子脚本将在不修改数据的情况下退出。
## 没有数据时会发生什么?
- Dashboard 显示空状态,提示你添加记录。
- 分析需要 **在过去 7 个日历日(截至今天)内至少有 5 天的记录** 才能返回有意义的结果。
- 如果你最近的记录 **超过 7 天**,Dashboard 将显示 **过期** 警告,以避免对“最新”指标的误导性解读。
## KPI 定义(快速参考)
- `weight_change_7d`: 仅当你有 **今天** 和 **正好 7 天前** 的记录时才可用;否则为 `null`。
## 配置(环境变量)
参见 `.env.example` 作为起点。
### Backend
- `PLATEAUBREAKER_DB_PATH`
- 可选。
- 绝对路径,或相对于 `backend/` 的路径(例如:`data/plateaubreaker.sqlite3`)。
- 默认值:`backend/data/plateaubreaker.sqlite3`。
- `backend/data/` 是本地运行时数据目录,不是可部署资产。发布 zip 不得包含它。
- `CORS_ORIGINS`
- 可选。
- 允许的源列表,以逗号分隔。
- 默认值:`http://localhost:5173,http://127.0.0.1:5173`。
## 打包干净的交付 zip
本仓库包含一个辅助脚本,用于创建干净的发布 zip。
发布内容(可部署):
- `backend/`(源代码,排除 `backend/tests` 和本地 `backend/data`)
- `frontend/dist/`(生产构建输出)
- `README.md`
```
# Optional: clean local build artifacts first
powershell -ExecutionPolicy Bypass -File .\scripts\clean_artifacts.ps1
powershell -ExecutionPolicy Bypass -File .\scripts\clean_artifacts.ps1 -All
# Build frontend first (required for packaging)
cd frontend
npm ci
npm run build
cd ..
powershell -ExecutionPolicy Bypass -File .\scripts\make_release_zip.ps1
```
zip 文件创建在 `release/` 下。
跨平台替代方案(适用于 Linux/macOS/Windows):
```
python scripts/make_release_zip.py --out-dir release
python scripts/validate_release_zip.py --out-dir release
```
### 源码包 vs 发布包
- **源码包**(用于开发备份/审查):包含仓库源代码树。如果必须将其打包,请运行 `scripts/clean_artifacts.ps1 -All`
并排除工作目录痕迹,如 `.git`、`node_modules/`、`dist/`、`.npm-cache/`、`__pycache__/`、IDE 文件夹和本地数据库。
- 工作区/源码 zip 可能仍包含仅供审查或机器本地的痕迹,例如 `.git`、`.vscode`、本地 SQLite 数据和其他开发者上下文。将其视为源材料,而非正式交付物。
- **发布包**(正式交付/部署):使用上述脚本生成的发布 zip。它有意保持严格,仅包含
可部署内容(`backend/` 源代码,包括 Alembic 迁移文件 + `frontend/dist/` + `README.md`)。
- 正式交接、部署和外部共享应始终使用 `release/` 下生成的发布 zip,而不是临时的源码 zip。
## 部署说明(最低要求)
- 提供前端(静态 `dist/`)并运行后端 API。
- 确保后端对 SQLite 路径具有写入权限(或设置 `PLATEAUBREAKER_DB_PATH`)。
- 为你部署的前端域名配置 `CORS_ORIGINS`。
### 部署前端(SPA history 模式)
路由器使用 HTML5 history 模式(`createWebHistory`)。你的静态主机必须将未知路由重写为 `index.html`,
否则刷新 `/analysis` 或 `/records` 将导致 404。
示例 (Nginx):
```
location / {
try_files $uri $uri/ /index.html;
}
```
## 数据库迁移(后端)
本项目在 `backend/alembic/` 下包含一个最小化的 Alembic 设置,用于 schema 演进。
**责任规则(重要):**
- **全新/空白环境**(尚无 SQLite 文件,或数据库没有表):API 服务器将在启动时自动引导创建表,以便于使用。
- **现有环境**(数据库已有表):服务器 **从不** 应用 schema 变更;请使用 **Alembic 迁移**。
- **生产部署**:在启动 API 服务器 **之前** 运行 `alembic upgrade head`。
- `backend/data/` 仅是 SQLite 的默认本地存储位置。它被排除在发布 zip 之外,并在运行时根据需要重新创建。
```
cd backend
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements-dev.txt -c constraints.txt
alembic upgrade head
```
服务器引导(`create_db_and_tables`)仅在数据库为空时运行。它不是一个迁移系统。
标签:AV绕过, Chart.js, FastAPI, KPI指标, Pinia, PrimeVue, SQLite, SQLModel, Vite, Vue 3, 个人健康, 云计算, 代码示例, 仪表盘, 体重追踪, 健康管理, 健身日志, 全栈应用, 减肥助手, 后端开发, 平台期检测, 数据分析, 规则引擎, 趋势图, 逆向工具