graph TB
subgraph "数据采集层"
A[罕见病新闻网站] -->|爬取| B[rare_disease_bot Python 爬虫]
B -->|Playwright| C[浏览器自动化]
C -->|LangChain + Qwen3-max| D[智能分析 & 翻译]
D -->|生成 Markdown| E[server/articles/ YYYYMMDD/域名/]
E -->|专业版| F[markdown_professional/]
E -->|小白版| G[markdown_simplified/]
end
subgraph "数据导入层"
H[Vercel Build] -->|prebuild 脚本| I[import-articles.js]
I -->|读取 Markdown| E
I -->|解析元数据| J[提取标题/分类/链接]
J -->|REST API| K[Supabase PostgreSQL]
end
subgraph "应用服务层"
K -->|查询| L[Nuxt Server API]
L -->|/api/notes| M[文章列表 API]
L -->|/api/notes/:id| N[文章详情 API]
L -->|POST /api/notes| O[创建文章 API]
end
subgraph "前端展示层"
M -->|SSR| P[Nuxt 3 应用]
N -->|SSR| P
O -->|SSR| P
P -->|Vue 3 + TypeScript| Q[文章列表页]
P -->|Markdown-it| R[文章详情页]
P -->|编辑功能| S[文章编辑页]
end
subgraph "部署层"
T[GitHub 仓库] -->|CI/CD| H
H -->|部署| U[Vercel www.raredisease.top]
U -->|访问| Q
U -->|访问| R
U -->|访问| S
end
style A fill:#e1f5ff
style B fill:#fff4e1
style D fill:#ffe1f5
style K fill:#e1ffe1
style P fill:#f0e1ff
style U fill:#ffe1e1
graph TB
subgraph "贡献者开发阶段"
A[贡献者 Fork 仓库] -->|克隆到本地| B[创建功能分支 feat/xxx]
B -->|编写代码| C[本地开发]
C -->|提交代码| D[git commit]
D -->|推送到 GitHub| E[git push origin feat/xxx]
E -->|在 GitHub 创建| F[Pull Request 到下游仓库]
end
subgraph "下游仓库: demongodYY/info_platform_fork"
F -->|等待 Owner 审查| G{Owner 审查 PR}
G -->|需要修改| H[贡献者修改代码]
H -->|更新 PR| G
G -->|审查通过| I[Owner 合并 PR 到 main 分支]
end
subgraph "Vercel 部署阶段"
I -->|触发条件检查| J{是否 Owner 在 main 分支的提交?}
J -->|是| K[Vercel CI/CD 自动触发部署]
J -->|否| L[不触发部署 ⚠️ 其他贡献者提交]
K -->|构建应用| M[执行 prebuild 脚本]
M -->|导入文章数据| N[部署到生产环境]
N -->|访问| O[www.raredisease.top ✅ 网站更新]
end
subgraph "自动同步到上游仓库"
I -->|触发 GitHub Actions| P[检查 Vercel 部署状态]
P -->|等待最多 10 分钟| Q{部署成功?}
Q -->|失败| R[停止流程 不创建 PR]
Q -->|成功/超时| S[检查代码变更]
S -->|对比上游仓库| T{是否有差异?}
T -->|无差异| U[无需同步]
T -->|有差异| V{已存在 未合并的 PR?}
V -->|是| W[跳过,不创建新 PR 等待现有 PR 处理]
V -->|否| X[自动创建 PR 到上游仓库]
end
subgraph "上游仓库: OpenRareDisease/info_platform"
X -->|等待维护者审查| Y[上游仓库维护者 审查并合并]
W -->|等待现有 PR 处理| Y
Y -->|合并完成| Z[✅ 代码同步完成]
end
style A fill:#e1f5ff
style I fill:#fff4e1
style K fill:#ffe1f5
style O fill:#e1ffe1
style X fill:#f0e1ff
style Z fill:#e1ffe1
style L fill:#ffe1e1
style R fill:#ffe1e1
Rare Disease Info Platform
一个基于 Nuxt 3 的罕见病文章平台,集成了智能新闻爬虫系统,用于收集、翻译和展示罕见病相关的新闻文章。
🌐 在线访问: www.raredisease.top
🏗️ 架构图
graph TB subgraph "数据采集层" A[罕见病新闻网站] -->|爬取| B[rare_disease_botPython 爬虫] B -->|Playwright| C[浏览器自动化] C -->|LangChain + Qwen3-max| D[智能分析 & 翻译] D -->|生成 Markdown| E[server/articles/
YYYYMMDD/域名/] E -->|专业版| F[markdown_professional/] E -->|小白版| G[markdown_simplified/] end subgraph "数据导入层" H[Vercel Build] -->|prebuild 脚本| I[import-articles.js] I -->|读取 Markdown| E I -->|解析元数据| J[提取标题/分类/链接] J -->|REST API| K[Supabase
PostgreSQL] end subgraph "应用服务层" K -->|查询| L[Nuxt Server API] L -->|/api/notes| M[文章列表 API] L -->|/api/notes/:id| N[文章详情 API] L -->|POST /api/notes| O[创建文章 API] end subgraph "前端展示层" M -->|SSR| P[Nuxt 3 应用] N -->|SSR| P O -->|SSR| P P -->|Vue 3 + TypeScript| Q[文章列表页] P -->|Markdown-it| R[文章详情页] P -->|编辑功能| S[文章编辑页] end subgraph "部署层" T[GitHub 仓库] -->|CI/CD| H H -->|部署| U[Vercel
www.raredisease.top] U -->|访问| Q U -->|访问| R U -->|访问| S end style A fill:#e1f5ff style B fill:#fff4e1 style D fill:#ffe1f5 style K fill:#e1ffe1 style P fill:#f0e1ff style U fill:#ffe1e1
✨ 功能特性
🛠️ 技术栈
前端框架
后端服务
工具库
子项目:rare_disease_bot
部署
📁 项目结构
🚀 快速开始
环境要求
1. 安装依赖
2. 配置环境变量
创建
.env文件(如果不存在):3. 运行开发服务器
访问 http://localhost:3000 查看应用。
4. 构建生产版本
构建时会自动执行
prebuild脚本,将server/articles/目录下当天的文章导入到 Supabase。5. 预览生产构建
📝 使用 rare_disease_bot 爬虫
rare_disease_bot是一个独立的 Python 子项目,用于爬取罕见病新闻。需要手动在本地运行爬虫来爬取文章。安装爬虫依赖
配置爬虫环境变量
在
rare_disease_bot/.env文件中配置:运行爬虫
爬虫工作流程
markdown_professional/- 专业版中文翻译(保持原文专业性)markdown_simplified/- 小白版中文翻译(通俗易懂)server/articles/YYYYMMDDHHMM/域名/目录数据更新流程
爬虫运行完成后,需要将代码提交并推送到 GitHub,然后创建 Pull Request 才会触发 CI/CD 部署:
自动导入流程:
prebuild脚本(server/scripts/import-articles.js)server/articles/目录下当天的文章(按年月日匹配)markdown_professional/目录下的专业版文章详细使用说明请参考 rare_disease_bot/README.md
🚢 部署到 Vercel
1. 连接 GitHub 仓库
在 Vercel 中导入你的 GitHub 仓库。
2. 配置环境变量
在 Vercel 项目设置中添加以下环境变量:
SUPABASE_URLSUPABASE_KEYSUPABASE_SERVICE_KEY3. 部署
Vercel 会自动检测 Nuxt 项目并配置构建命令。
构建流程
npm run buildprebuild脚本(server/scripts/import-articles.js)server/articles/目录下当天的文章(按年月日匹配,格式:YYYYMMDDHHMM)markdown_professional/目录下的专业版文章📚 开发指南
代码规范
项目使用 ESLint 和 Prettier 进行代码规范检查:
Git Hooks
项目配置了 Husky,在提交前会自动:
运行 lint-staged:
运行所有测试:
pnpm test运行所有测试确保所有检查通过后才能成功提交代码。
测试
项目使用 Vitest 作为测试框架:
详细测试配置请参考 TEST_SETUP.md
🔧 技术细节
数据流程
爬取阶段:
rare_disease_bot爬取文章server/articles/YYYYMMDDHHMM/域名/目录提交阶段:
导入阶段:
prebuild脚本markdown_professional/专业版文章展示阶段:
手动创建文章
除了通过爬虫自动爬取,你也可以在网站上手动创建文章:
标签一,标签二文章管理
API 路由
GET /api/notes- 获取文章列表GET /api/notes/[id]- 获取文章详情POST /api/notes- 创建新文章PATCH /api/notes/[id]- 更新文章数据库结构
文章存储在 Supabase 的
notes表中,包含以下字段:id- UUIDtitle- 标题content- Markdown 内容category- 分类(逗号分隔)source- 原文链接published_at- 发布时间updated_by- 更新者🔄 开发流程
由于 Vercel 免费版限制(只能关联个人 private 仓库),且只有在
main分支上 Owner 的 merge 或 push 才能触发 CD,本项目采用以下开发流程:流程说明
在下游仓库开发并提交 PR
Owner 合并触发 CD
main分支main分支上 Owner 的 merge 或 push 才会触发 Vercel CI/CD 自动部署自动同步到上游仓库
完整开发流程图
graph TB subgraph "贡献者开发阶段" A[贡献者 Fork 仓库] -->|克隆到本地| B[创建功能分支feat/xxx] B -->|编写代码| C[本地开发] C -->|提交代码| D[git commit] D -->|推送到 GitHub| E[git push origin feat/xxx] E -->|在 GitHub 创建| F[Pull Request
到下游仓库] end subgraph "下游仓库: demongodYY/info_platform_fork" F -->|等待 Owner 审查| G{Owner 审查 PR} G -->|需要修改| H[贡献者修改代码] H -->|更新 PR| G G -->|审查通过| I[Owner 合并 PR
到 main 分支] end subgraph "Vercel 部署阶段" I -->|触发条件检查| J{是否 Owner 在
main 分支的提交?} J -->|是| K[Vercel CI/CD
自动触发部署] J -->|否| L[不触发部署
⚠️ 其他贡献者提交] K -->|构建应用| M[执行 prebuild 脚本] M -->|导入文章数据| N[部署到生产环境] N -->|访问| O[www.raredisease.top
✅ 网站更新] end subgraph "自动同步到上游仓库" I -->|触发 GitHub Actions| P[检查 Vercel 部署状态] P -->|等待最多 10 分钟| Q{部署成功?} Q -->|失败| R[停止流程
不创建 PR] Q -->|成功/超时| S[检查代码变更] S -->|对比上游仓库| T{是否有差异?} T -->|无差异| U[无需同步] T -->|有差异| V{已存在
未合并的 PR?} V -->|是| W[跳过,不创建新 PR
等待现有 PR 处理] V -->|否| X[自动创建 PR
到上游仓库] end subgraph "上游仓库: OpenRareDisease/info_platform" X -->|等待维护者审查| Y[上游仓库维护者
审查并合并] W -->|等待现有 PR 处理| Y Y -->|合并完成| Z[✅ 代码同步完成] end style A fill:#e1f5ff style I fill:#fff4e1 style K fill:#ffe1f5 style O fill:#e1ffe1 style X fill:#f0e1ff style Z fill:#e1ffe1 style L fill:#ffe1e1 style R fill:#ffe1e1
关键触发点说明
Vercel 部署触发条件 ⚠️
demongodYY) 在main分支上的 merge 或 pushGitHub Actions 同步触发条件
main分支上的提交(merge 或 push)部署流程
main分支prebuild脚本导入文章数据详细步骤说明
步骤 1: 贡献者开发代码
步骤 2: 创建 Pull Request
base: main←compare: feat/your-feature-name步骤 3: Owner 合并触发部署 ⚠️
重要:只有 Owner 合并 PR 到
main分支后,才会触发后续流程:Owner 审查并合并 PR
main分支Vercel 自动部署(自动触发,无需手动操作)
main分支的提交prebuild脚本导入文章数据GitHub Actions 自动同步(自动触发,无需手动操作)
步骤 4: 上游仓库合并(可选)
工作流程示例
配置要求
重要:要启用自动同步功能,需要配置以下内容:
**Personal Access Token (PAT)**:
PAT的 secretpublic_repo权限(如果上游仓库是公开的)Workflow 权限:
🤝 贡献指南
我们欢迎所有形式的贡献!请查看 CONTRIBUTING.md 了解如何开始。
快速开始:
git checkout -b feat/amazing-feature)git commit -m 'feat: 添加新功能')git push origin feat/amazing-feature)📖 相关文档
📄 License
本项目采用 MIT License 开源协议。