fbientrigo/westgard-sim
GitHub: fbientrigo/westgard-sim
面向临床实验室内部质量控制教学的可复现模拟器,支持偏倚、漂移、不精密度等场景模拟并配备学生端 Web 前端与抽认卡学习功能。
Stars: 0 | Forks: 0
# westgard-sim
用于临床实验室内部质量控制 (QC) 的可复现模拟器 + 本地创作工作流,用于生成 UI/web 使用的静态数据。
## TL;DR(可运行的最简流程)
在 PowerShell 中,从仓库根目录运行:
```
# 1) 创建/激活环境(仅首次)
py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
# 2) 验证环境和 catalogo
.\westgard_ops.ps1 -Action preflight
# 3) 打开 authoring UI
.\westgard_ops.ps1 -Action ui
# 4) 生成真实静态输出
.\westgard_ops.ps1 -Action release
# 5) 检查导出的结构
.\westgard_ops.ps1 -Action verify
```
如果仅执行 `-Action ui`,在运行 export/release 之前,系统不会自动在 `outputs/web_data` 中生成 payloads。
## 1. 环境要求
- Python `>=3.11`(在 `pyproject.toml` 中定义)
- Windows 上推荐使用 PowerShell 7+
- 可用的 `pip`
验证版本:
```
python --version
```
## 2. 环境配置(分步指南)
### Windows (PowerShell)
```
# 在 repo 根目录下
py -3.11 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txt
```
如果 PowerShell 阻止了脚本运行:
```
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\.venv\Scripts\Activate.ps1
```
### macOS / Linux (bash/zsh)
```
python3.11 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt
```
## 3. 主要命令
### 本地创作 UI
```
.\run_authoring_ui.ps1
```
或通过操作包装器:
```
.\westgard_ops.ps1 -Action ui
```
### 可复现的操作 Pipeline
```
.\westgard_ops.ps1 -Action preflight
.\westgard_ops.ps1 -Action release
.\westgard_ops.ps1 -Action verify
```
### 技术模拟与导出(无 UI)
```
python scripts/run_demo.py
python scripts/export_web_data.py --output-dir outputs/web_data
```
使用完整目录:
```
python scripts/export_web_data.py --catalog content/experiment_catalog.json --output-dir outputs/web_data
```
### 测试
```
pytest
```
### 抽认卡:编辑与导出
当前可编辑的卡组:
- `content/flashcards/westgard_qc_basics.deck.json`
详细指南:
- `docs/FLASHCARDS_GUIDE.md`
推荐使用仓库的 `.venv` 环境执行命令:
```
.\.venv\python.exe scripts\export_flashcards.py --deck content/flashcards/westgard_qc_basics.deck.json --output-dir outputs/flashcards/westgard_qc_basics
```
预期输出:
- `outputs/flashcards/westgard_qc_basics/westgard_qc_basics.csv`
- `outputs/flashcards/westgard_qc_basics/preview.html`
- `outputs/flashcards/westgard_qc_basics/flashcards.css`
- `outputs/flashcards/westgard_qc_basics/manifest.json`
- `outputs/flashcards/westgard_qc_basics/study_deck.json`
即时可视化检查点:
- 打开 `outputs/flashcards/westgard_qc_basics/preview.html`
- 将数据同步至 Web:`cd apps/student-web && npm run sync:data`
### Web 端抽认卡
学生 Web 端现已包含带有三个卡组及本地进度记录的交互式抽认卡功能。
推荐工作流:
```
# 1) 导出 deck
.\.venv\python.exe scripts\export_flashcards.py --deck content/flashcards/westgard_qc_basics.deck.json --output-dir outputs/flashcards/westgard_qc_basics
# 2) 将静态 assets 同步到 frontend
cd apps/student-web
npm run sync:data
# 3) 运行本地 web
npm run dev
```
Web 端路由:
- `/#/flashcards`
Web 端调用的文件:
- `public/flashcards/westgard_qc_basics/study_deck.json`
MVP 行为说明:
- 三个卡组:新卡、练习中和复习
- 无后端;进度保存在 `localStorage` 中
- 基础控制按钮:`Mostrar respuesta`、`Repetir`、`La supe`
- 如果答错卡片,则退回至卡组 1
- 如果答对卡片,则前进至下一个卡组
## 4. 生成 UI 数据的正确工作流
推荐的创作工作流如下:
1. `preflight`:验证文件、依赖项和 schema。
2. `ui`:编辑/验证创作目录。
3. `release`:构建技术目录 + 静态导出 + 验证 + 备份。
4. `verify`:对导出结果进行独立检查。
操作工作流的默认路径:
- 创作输入:`content/authoring_catalog.example.json`
- 生成的技术目录:`content/experiment_catalog.generated.json`
- Web 导出:`outputs/web_data`
- 备份:`outputs/backups`
执行 `release` 后的最小预期输出:
- `outputs/web_data/index.json`
- `outputs/web_data/experiments//manifest.json`
- `outputs/web_data/experiments//.json`
## 5. 学生端前端(包含在此仓库中)
前端位于 `apps/student-web`,直接调用由 Python 导出的契约数据。
### 快速本地工作流
1. 生成数据集:
```
.\westgard_ops.ps1 -Action release
```
2. 安装前端依赖(首次执行):
```
.\student_web_ops.ps1 -Action install
```
3. 同步数据集 + 可选的教育内容:
```
.\student_web_ops.ps1 -Action sync
```
4. 运行前端:
```
.\student_web_ops.ps1 -Action dev
```
### 在 GitHub Pages 上构建与部署
- 工作流:`.github/workflows/student-pages.yml`
- 该工作流会执行以下操作:
- 使用 Python 导出数据集,
- 使用 Python 导出抽认卡,
- 将 `outputs/web_data` 同步至 `apps/student-web/public/web_data`,
- 将 `outputs/flashcards` 同步至 `apps/student-web/public/flashcards`,
- 使用 Pages 的 base path 编译前端,
- 发布 `apps/student-web/dist`。
面向学生的预期最终 URL:
- `https://.github.io//`
- 如果仓库为 `.github.io`,则 URL 为 `https://.github.io/`
### 在 Vercel 上构建与部署
该前端也可以部署在 Vercel 上,而无需将教育内容迁移至 Supabase。
设置:
- 根目录 (Root Directory):`apps/student-web`
- 安装命令 (Install Command):`npm install`
- 构建命令 (Build Command):`npm run build:vercel`
- 输出目录 (Output Directory):`dist`
可选环境变量:
- `VITE_SUPABASE_URL`
- `VITE_SUPABASE_ANON_KEY`
如果缺少这些变量,应用程序仍可使用静态数据和 `localStorage` 中的进度正常运行。配置这些变量后,
将出现 magic link 登录选项,且抽认卡的进度会同步至 Supabase。手动 SQL 脚本位于
`apps/student-web/supabase/001_identity_and_progress.sql`。
## 6. 实验创建指南
要了解目录中的各个字段并进行正确编辑,请参阅:
- [docs/crear_experimento.md](docs/crear_experimento.md)
## 7. 项目结构
```
qc_lab_simulator/ # motor de simulacion, reglas, metricas, export
content/ # catalogos y contratos de authoring
apps/student-web/ # frontend React + TS para estudiantes
docs/ # guias operativas del piloto
scripts/ # scripts CLI para demo/build/export/ops
tests/ # pruebas automaticas
```
## 8. 相关文档(按需阅读)
总索引:
- `docs/README.md`
入门与操作:
- `docs/PILOT_QUICKSTART_5_MIN.md`
- `docs/BEA_PILOT_CHECKLIST.md`
创作 UI 使用说明:
- `docs/AUTHORING_MVP_TUTORIAL.md`
- `docs/AUTHORING_MVP_GUIDE.md`
- `docs/crear_experimento.md`
- `docs/FLASHCARDS_GUIDE.md`
学生前端:
- `apps/student-web/README.md`
- `docs/STUDENT_FRONTEND_PLAN.md`
- `docs/STUDENT_FRONTEND_GUIDE.md`
故障与恢复:
- `docs/PILOT_TROUBLESHOOTING.md`
- `docs/PILOT_RECOVERY_GUIDE.md`
## 9. 常见故障排查
- 在 `.ps1` 脚本中出现 `No se encontro Python` 错误:
- 在根目录创建 `.venv`,或者安装 Python 3.11 并将其添加到 PATH 中。
- UI 打开后但未显示导出的文件:
- 在 UI 中执行 `Build technical catalog` 和 `Export static web data`,或运行 `westgard_ops.ps1 -Action release`。
- 缺少依赖项导致错误:
- 在激活的环境下执行 `pip install -r requirements.txt`。
- `verify` 失败:
- 检查 `outputs/web_data/index.json` 以及错误提示中缺失的 manifests/payloads。
- 前端未显示实验内容:
- 执行 `.\student_web_ops.ps1 -Action sync` 并确认 `apps/student-web/public/web_data/index.json` 已生成。
## 10. 开源许可
MIT (`LICENSE`)。
标签:AI合规, Python, Westgard规则, 临床检验, 医疗健康, 后端开发, 数据模拟, 无后门, 质量控制, 逆向工具