CervixDetectAI 是一个基于 Quasar Framework 开发的宫颈癌影像 AI 辅助筛查 SaaS 云平台。本项目采用**"互联网+医疗"的电子商务 SaaS 模式,通过云端提供服务,医疗机构可按次、按年或定制化购买服务,极大降低了初始投入门槛,实现了筛查服务的 "即插即用"**。
创新维度
说明
🔬 技术创新
通过自研算法,在保持高准确率的同时,显著降低了计算成本和参数数量,使其能在基层医疗机构的普通硬件上流畅运行
💼 模式创新
采用 SaaS 云服务模式,实现宫颈癌筛查的普惠化,让基层医疗机构也能负担得起智能筛查服务
flowchart LR
A["🏥 基层医疗机构"] --"上传影像"--> B["☁️ 云端 AI 平台"]
B -->|"返回诊断报告"| A
A -->|"乡镇卫生院等"| A
Loading
功能
说明
📧 邮箱登录
支持邮箱 + 密码登录
📱 手机号登录
支持手机号 + 短信验证码登录
✨ 注册即登录
手机号登录时,新用户自动注册并登录
🧭 双路径注册向导
注册页采用“两步向导”,支持工号路径与邮箱路径分流填写
🔑 JWT 认证
accessToken(1小时)+ refreshToken(7天)双 Token 机制
🔒 忘记密码
通过短信验证码重置密码
🛡️ 阿里云验证码
集成 ESA AI 验证码,防止恶意注册
功能
说明
🏥 医院配置
支持多家医院配置(荆州市中心医院、武汉大学人民医院等)
👤 工号账号
支持“医院 + 工号 + 密码”登录,并提供工号注册路径
🎭 个人资料
头像上传(图仓远程 URL)、个人信息管理
⚙️ 系统设置
通知偏好、密码修改、隐私设置
功能
说明
📋 病例列表
查看所有病例记录,支持搜索和筛选
🔍 病例详情
查看完整的病例信息和分析结果
📊 状态跟踪
已完成、处理中、失败等状态管理
👥 患者管理
患者信息录入、扩展字段、病历查看
🧭 患者洞察
提供历史趋势、风险画像、时间线与检查对比
📏 基线模式
历史样本不足时显示“基线建立中 / 即时洞察”,避免伪造稳定趋势或统计结论
功能
说明
📤 图像上传
支持拖拽上传、多图上传
☁️ 图仓同步
影像本地持久化后异步同步图仓,异常时保留本地回退链路
📦 批量任务
单次最多 10 张影像,批量创建任务并返回成功/失败明细
🌐 远程 URL 分析
分析前优先使用图仓远程 URL,失败时自动回退本地路径
⚡ 阶段进度跟踪
0-90% 为阶段性进度估算,SUCCESS / FAILED 为可靠终态
🛡️ 超时与失败收口
默认 180 秒超时保护,预处理/模型异常会统一落为失败态
📈 结果展示
详细的诊断结果和置信度
💡 临床建议
提供专业的临床建议和生物标志物信息
🧭 结果标准化
AI 输出、手动结果写回、患者洞察与报告导出统一走结果标准化内核,风险等级与建议口径一致
📄 报告生成
自动生成医生归档版 PDF 报告,支持影像对比、关键指标、可疑区域、历史趋势与免责声明
🎛️ 增强视图控制
支持放大、缩小、全屏控制,AI 标注视图实时交互
🛑 分析取消
支持分析过程中取消操作
⚠️ 错误重试
AI 分析失败时显示错误信息并提供重新分析入口
🎚️ 参数配置
支持模型选择、灵敏度与置信度阈值调节
🧾 区域摘要卡
病例详情页改为全宽区域摘要卡展示离散病灶区域,避免与上方原图/标注图重复
功能
说明
🧠 双模式问答
支持深度思考模式与快速回复模式切换
🌊 SSE 流式输出
支持思考过程(reasoning)与正式回答(content)分流式展示
⏹️ 中断回复
生成过程中可随时停止 AI 回复,避免长响应阻塞
📜 Markdown 渲染
支持列表、代码块、表格、引用等 Markdown 输出,并做 HTML 安全净化
📌 上下文关联
自动结合当前病例分析结果、检查方式与历史对话生成回复
🎨 主题与可用性
已优化浅色/深色主题、自动滚动到最新内容、思考卡片展开折叠与状态提示
功能
说明
🔔 顶栏通知面板
提供铃铛入口、未读计数、通知列表、空状态与“全部已读”操作
🧩 通知模块拆分
主布局回归装配层,通知铃铛、导航抽屉、用户菜单与通知逻辑已拆为独立模块
🧭 通知跳转联动
按通知关联类型跳转病例详情或随访管理,并在点击后自动标记已读
✅ 分析完成通知
AI 分析结果落库后自动创建“报告分析完成”站内通知
⚠️ 高风险预警通知
风险等级为高/极高时自动追加“高风险病变预警”通知
⚙️ 通知偏好入口
API 设置页已提供“站内通知(in_app)”渠道开关与默认值
功能
说明
🗂️ 随访计划管理
支持创建、编辑、查看、完成、取消、重点关注等完整随访状态流转
🧩 一键预设模板
提供低/中/高风险、术后复查等预设模板,减少手动录入成本
⏰ 定时提醒任务
基于 node-cron 定期巡检,自动生成到期/逾期/高关注随访通知
📨 手动提醒
支持单条随访“立即提醒”,并向计划接收人及当前操作者同步投递站内通知
🛡️ 基础设施兜底
在 DB_SYNC=false 场景下仍会确保随访与通知依赖表可用,降低 500 风险
功能
说明
🧱 设计令牌统一
统一圆角、边框、阴影与玻璃化变量,提升跨页面视觉一致性
🌗 主题一致性
浅色/深色模式下通知面板、聊天面板、病例分析区域均保持可读性与层次感
🪟 玻璃与模糊增强
关键卡片增加渐变与高斯模糊层次,减少“条框感”并增强信息聚焦
📱 响应式细节修正
通知面板定位、弹层表现与移动端宽度策略优化,交互更稳定
🔐 认证页体验重塑
登录/注册页面统一视觉语义;注册页改为两步向导并支持短信通道深链跳转
📜 软著证书预览
认证品牌区与 API 设置页支持软件著作权卡片点击预览,深色主题同步适配
🪟 对话框主题细化
对话框渐变背景、文字层级与蒙版颜色统一到浅色/深色设计令牌
🎛️ 设置页控制台重构
设置页新增运行概览、分区卡片与日志时间轴,提升演示表达与操作反馈一致性
🌀 全站视觉统一
业务页统一渐变背景与蓝色圆角 Tab 强调色,跨页面风格更一致
🧪 前端静态校验补齐
新增 npm run typecheck 与回归检查清单,便于大改后快速做静态收口
📊 系统监控面板
实时 CPU 负载、内存使用、数据库连接池与分析队列状态监控
📥 患者批量导入
支持 .xlsx 文件拖拽上传、预览确认与模板下载
功能
说明
🛒 套餐购买
支持多种套餐选择(按次/按月/按年)
💰 支付集成
集成易支付(支付宝/微信/银行卡)
🎁 优惠计算
自动计算折扣和优惠价格
📜 订单管理
订单历史查询和状态跟踪
🔄 积分系统
购买套餐自动发放积分
🧭 页面拆分
订阅页聚焦套餐权益,AI 引擎与服务偏好独立到专门设置页
🧩 SaaS 定价重构
订阅页收敛为标准 SaaS pricing page,当前订阅状态、套餐主卡、能力矩阵与信任区分层更清晰
🎚️ 动态档位展示
顶部筛选联动周期套餐 / 单次开通;按月场景支持“连续包月 / 一月版”双档位切换
📈 临床指标可视化
模型指标区升级为“左侧雷达图 + 右侧核心数字”,强化 AI 医疗平台的专业展示力
✨ 微交互动效
套餐卡、切换器、软著卡与核心数字补齐显隐过渡、悬停浮起、按压反馈与数字滚动动画
功能
说明
📊 图表展示
使用 ECharts 可视化展示分析结果
📑 历史报告
访问历史分析报告
🧾 医生归档版 PDF
输出首页摘要、原始影像/AI 标注对比、关键指标、可疑区域明细、患者趋势曲线、临床建议与免责声明
🧭 历史趋势整合
导出时拉取患者最近 6 次分析结果,用于展示风险权重与置信度变化
🖼️ 远程影像兼容
前端即时导出与后端报告生成均兼容图仓 URL,失败时提供占位说明与本地回退
⬇️ 报告下载
支持 PDF 格式下载
flowchart TB
A[Quasar Framework] --> B[Vue 3]
A --> C[TypeScript]
A --> D[Vite]
B --> E[Composition API]
B --> F[Vue Router]
C --> G[类型安全]
D --> H[快速构建]
I([状态管理]) --> J[Pinia]
K([UI 组件]) --> L[Quasar Components]
M([HTTP 客户端]) --> N[Axios]
O([图表库]) --> P[ECharts]
Loading
技术
版本
用途
Quasar Framework
2.16.0
UI 框架
Vue
3.x
前端框架
TypeScript
5.x
类型系统
Pinia
Latest
状态管理
Vue Router
4.x
路由管理
Vite
Latest
构建工具
Axios
Latest
HTTP 客户端
ECharts
Latest
数据可视化
Capacitor
Latest
移动端打包
graph TD
A[Node.js] --> B[Express]
B --> C[RESTful API]
D[数据库] --> E[MySQL]
E --> F[Sequelize ORM]
G[认证] --> H[JWT]
H --> I[双 Token 机制]
J[第三方服务] --> K[阿里云短信]
J --> L[阿里云号码认证]
J --> M[通义千问大模型]
J --> N[易支付]
Loading
技术
版本
用途
Node.js
>=20.0
运行环境
Express
Latest
Web 框架
MySQL
5.7+/8.0+
数据库
Sequelize
Latest
ORM
JWT
Latest
认证
Multer
Latest
文件上传
PM2
Latest
进程管理
服务
用途
🔐 阿里云号码认证
一键登录/注册
📱 阿里云短信服务
短信验证码
🤖 通义千问大模型
AI 诊断建议
💳 易支付
支付接口
📧 腾讯云 SES
邮件推送
flowchart TB
PL["PublicLayout (公共页面)"]
ML["MainLayout (主界面)"]
VR["Vue Router (路由管理)"]
P["Pages (页面)"]
C["Components (组件)"]
S["Stores (Pinia)"]
SV["Services (API)"]
BE["后端 API"]
PL --> VR
ML --> VR
VR --> P
P --> C
C --> S
S --> SV
SV --> BE
Loading
erDiagram
User ||--o{ Patient : "creates"
Patient ||--o{ Study : "has"
Study ||--o| AnalysisTask : "triggers"
AnalysisTask ||--o| AnalysisResult : "produces"
AnalysisResult ||--o| MedicalReport : "generates"
Loading
CervixDetectAI/
├── 📁 src/ # 前端源代码
│ ├── 📁 assets/ # 静态资源
│ │ └── 📁 logos/ # 医院图标
│ ├── 📁 boot/ # Quasar 启动文件
│ │ └── axios.ts # Axios 配置
│ ├── 📁 components/ # 公共组件
│ │ ├── 📁 common/ # 通用组件
│ │ │ ├── AgreementDialog.vue # 用户协议对话框
│ │ │ ├── ThemeToggle.vue # 主题切换
│ │ │ └── AliCaptcha.vue # 阿里云 AI 验证码
│ │ ├── 📁 auth/ # 认证组件
│ │ │ ├── AuthBrandPanel.vue # 认证品牌面板
│ │ │ └── AuthSplitLayout.vue # 认证分栏布局
│ │ ├── 📁 chat/ # AI 聊天组件
│ │ │ └── AIChatPanel.vue # AI 聊天面板(病例详情页)
│ │ ├── 📁 layout/ # 布局组件
│ │ │ ├── MainNavDrawer.vue # 主导航抽屉
│ │ │ ├── HeaderUserMenu.vue # 顶栏用户菜单
│ │ │ └── NotificationBell.vue # 通知铃铛
│ │ ├── 📁 patients/ # 患者相关组件
│ │ │ ├── PatientForm.vue # 患者表单
│ │ │ ├── PatientDetail.vue # 患者详情
│ │ │ ├── PatientSelector.vue # 患者选择器
│ │ │ └── PatientImportDialog.vue # 患者批量导入对话框
│ │ ├── 📁 studies/ # 病例相关组件
│ │ │ ├── ImageUploader.vue # 影像上传
│ │ │ ├── ImageAnalyzer.vue # 影像标注
│ │ │ ├── StudyForm.vue # 病例表单
│ │ │ └── analyzer/ # 分析工具
│ │ │ ├── AnalyzerCanvas.vue
│ │ │ └── AnalyzerToolbar.vue
│ │ ├── 📁 settings/ # 设置相关组件
│ │ │ ├── EmailSecurityCard.vue # 邮箱安全卡片
│ │ │ └── DatabaseHealth.vue # 数据库健康状态
│ │ └── EssentialLink.vue # 侧边栏链接
│ ├── 📁 constants/ # 常量配置
│ │ ├── hospitals.ts # 医院配置
│ │ ├── navigation.ts # 导航配置
│ │ ├── preferences.ts # 用户偏好配置
│ │ └── softwareCopyrights.ts # 软件著作权配置
│ ├── 📁 layouts/ # 页面布局
│ │ ├── MainLayout.vue # 主应用布局
│ │ └── PublicLayout.vue # 公共页面布局
│ ├── 📁 pages/ # 页面组件
│ │ ├── DashboardPage.vue # 仪表盘
│ │ ├── StudiesPage.vue # 病例中心
│ │ ├── StudyDetailPage.vue # 病例详情
│ │ ├── UploadPage.vue # 上传分析
│ │ ├── PatientsPage.vue # 患者管理
│ │ ├── PatientInsightsPage.vue # 患者洞察
│ │ ├── FollowUpsPage.vue # 随访管理
│ │ ├── ReportsPage.vue # 报告中心
│ │ ├── LoginPage.vue # 登录页
│ │ ├── RegisterPage.vue # 注册页
│ │ ├── ApiSettingsPage.vue # 套餐订阅
│ │ ├── AiPreferencesPage.vue # AI 偏好设置
│ │ ├── ProfilePage.vue # 个人资料
│ │ ├── SettingsPage.vue # 系统设置
│ │ ├── SystemMonitorPage.vue # 系统监控
│ │ └── ... # 其他页面
│ ├── 📁 router/ # 路由配置
│ │ └── index.ts # 路由定义
│ ├── 📁 services/ # API 服务
│ │ ├── api.ts # Axios 封装
│ │ ├── apiClient.ts # API 客户端
│ │ ├── apiService.ts # API 服务
│ │ ├── chatService.ts # SSE 聊天流式服务
│ │ ├── modelService.ts # 模型服务
│ │ └── patientService.ts # 患者服务
│ ├── 📁 stores/ # Pinia 状态管理
│ │ ├── authStore.ts # 认证状态
│ │ ├── studyStore.ts # 病例数据
│ │ ├── patientStore.ts # 患者数据
│ │ ├── themeStore.ts # 主题状态
│ │ └── ... # 其他 Store
│ ├── 📁 utils/ # 工具函数
│ └── App.vue # 根组件
│
├── 📁 server/ # 后端服务器
│ ├── 📁 config/ # 配置文件
│ │ └── sequelize.js # 数据库配置
│ ├── 📁 models/ # Sequelize 模型
│ │ ├── User.js # 用户模型
│ │ ├── Patient.js # 患者模型
│ │ ├── Study.js # 病例模型
│ │ ├── StudyImage.js # 病例影像模型
│ │ ├── AnalysisTask.js # 分析任务模型
│ │ ├── AnalysisResult.js # 分析结果模型
│ │ ├── MedicalReport.js # 医疗报告模型
│ │ ├── SmsCode.js # 短信验证码模型
│ │ ├── EmailCode.js # 邮箱验证码模型
│ │ ├── Notification.js # 站内通知模型
│ │ ├── FollowUp.js # 随访计划模型
│ │ ├── Order.js # 订单模型
│ │ ├── UserAvatar.js # 用户头像模型
│ │ ├── AuditLog.js # 审计日志模型
│ │ ├── ReportShareLink.js # 报告分享链接模型
│ │ └── index.js # 模型关联
│ ├── 📁 routes/ # 路由控制器
│ │ ├── auth.js # 认证接口
│ │ ├── email-auth.js # 邮箱认证接口
│ │ ├── sms-auth.js # 短信认证接口
│ │ ├── studies.js # 病例管理
│ │ ├── patients.js # 患者管理
│ │ ├── patient-insights.js # 患者洞察
│ │ ├── analysis-tasks.js # 分析任务(异步队列)
│ │ ├── analyze.js # 影像上传分析
│ │ ├── chat.js # AI 聊天接口(SSE)
│ │ ├── reports.js # 报告管理
│ │ ├── followups.js # 随访管理
│ │ ├── notifications.js # 通知中心
│ │ ├── payment.js # 支付接口
│ │ ├── settings.js # 系统设置
│ │ ├── dashboard.js # 仪表盘数据
│ │ ├── system.js # 系统管理
│ │ ├── audit.js # 审计日志
│ │ └── import.js # 数据导入
│ ├── 📁 services/ # 业务逻辑
│ │ ├── qwenService.js # 通义千问分析/对话服务
│ │ ├── simpleAnalysisQueue.service.js # 异步任务队列
│ │ ├── followupScheduler.service.js # 随访定时调度
│ │ ├── notificationService.js # 站内通知服务
│ │ ├── paymentService.js # 支付服务
│ │ ├── sms.service.js # 短信服务
│ │ ├── email.service.js # 邮件服务
│ │ ├── tucang.service.js # 图仓存储服务
│ │ ├── studyImageStorage.service.js # 影像存储服务
│ │ ├── databaseCleanup.service.js # 数据库清理服务
│ │ ├── dataImport.service.js # 患者数据导入服务
│ │ ├── followupCompliance.service.js # 随访合规服务
│ │ ├── followupTemplate.service.js # 随访模板服务
│ │ └── reportGenerator.service.js # 报告生成服务
│ ├── 📁 middleware/ # 中间件
│ │ ├── auth.js # JWT 认证中间件
│ │ ├── auditLogger.js # 审计日志中间件
│ │ ├── rateLimiter.js # 限流中间件
│ │ └── requestLogger.js # 请求日志中间件
│ ├── 📁 scripts/ # 数据库脚本
│ │ ├── init-database.js # 数据库初始化
│ │ └── ... # 其他脚本
│ ├── 📁 constants/ # 常量配置
│ │ ├── followupTemplates.js # 随访模板常量
│ │ ├── reportTemplates.js # 报告模板常量
│ │ └── verification.js # 验证常量
│ ├── 📁 utils/ # 工具函数
│ │ ├── errorHandler.js # 错误处理器
│ │ ├── rateLimiter.js # 限流工具
│ │ └── validators.js # 验证器
│ ├── 📁 uploads/ # 上传文件目录
│ ├── 📁 reports/ # 生成的报告目录
│ ├── .env # 环境变量
│ ├── index.js # 服务器入口
│ └── package.json # 后端依赖
│
├── 📁 public/ # 静态资源
│ ├── logo.svg # 项目 Logo
│ └── favicon.ico # 网站图标
│
├── 📄 .env # 前端环境变量
├── 📄 quasar.config.ts # Quasar 构建配置
├── 📄 package.json # 前端依赖
├── 📄 tsconfig.json # TypeScript 配置
├── 📄 eslint.config.js # ESLint 配置
└── 📄 README.md # 项目说明
环境
版本要求
Node.js
>= 20.0.0
Bun
Latest
MySQL
5.7+ 或 8.0+
Git
Latest
CREATE DATABASE cervix_detect_ai
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
编辑 server/.env 文件:
# 数据库配置
DB_HOST = localhost
DB_PORT = 3306
DB_USER = root
DB_PASSWORD = your_password
DB_NAME = cervix_detect_ai
# JWT 配置
JWT_SECRET = your-secret-key-change-in-production-min-128-bits
JWT_ACCESS_EXPIRATION = 1h
JWT_REFRESH_EXPIRATION = 7d
# 服务器配置
PORT = 4000
NODE_ENV = development
cd server
node scripts/init-database.js
该脚本会自动创建以下数据表:
✅ users - 用户表
✅ patients - 患者信息表
✅ studies - 病例研究表
✅ study_images - 病例图像表
✅ analysis_tasks - AI 分析任务表
✅ analysis_results - 分析结果表
✅ medical_reports - 医疗报告表
✅ sms_codes - 短信验证码表
✅ email_codes - 邮箱验证码表
✅ orders - 订单表
✅ notifications - 站内通知表
✅ follow_ups - 随访计划表
✅ user_avatars - 用户头像表
并创建默认管理员账户:
邮箱: [email protected]
密码: admin123456
本项目使用 Bun 作为包管理器和极速运行环境,请先确保系统已全局安装 Bun:
# macOS / Linux / WSL
curl -fsSL https://bun.com/install | bash
# Windows (PowerShell)
powershell -c " irm bun.sh/install.ps1 | iex"
# 1. 克隆项目
git clone https://github.com/xingranya/CervixDetectAI.git
cd CervixDetectAI
# 2. 安装依赖
bun install
# 3. 启动开发服务器
quasar dev
前端将运行在: http://localhost:9000
# 1. 进入服务端目录
cd server
# 2. 安装依赖
bun install
# 3. 初始化数据库
bun scripts/init-database.js
# 4. 启动服务器
bun start
# 或使用开发模式
bun run dev
后端将运行在: http://localhost:4000
# 前端构建
quasar build
# 构建产物位于 dist/spa 目录
如需使用短信验证码、号码认证等功能,需在 server/.env 中配置:
# 阿里云号码认证
ALIYUN_ACCESS_KEY_ID = your_access_key_id
ALIYUN_ACCESS_KEY_SECRET = your_access_key_secret
ALIYUN_SMS_SIGN_NAME = 速通互联验证码
ALIYUN_SMS_TEMPLATE_CODE = 100001
# 阿里云 AI 验证码
ALIYUN_CAPTCHA_SCENEID_LOGIN = u1g43fza
ALIYUN_CAPTCHA_SCENEID_VERIFY = 1dynwu1h
# 易支付配置
EPAY_PID = your_epay_pid_here
EPAY_KEY = your_epay_key_here
EPAY_API_URL = https://mpay.qzz.io/xpay/epay/
EPAY_NOTIFY_URL = https://api.example.com/api/payment/notify
EPAY_RETURN_URL = https://api.example.com/api/payment/return
FRONTEND_RESULT_URL = https://app.example.com/ # /payment/result
# 允许的前端来源(逗号分隔)
CORS_ORIGINS = https://app.example.com,https://admin.example.com
# 通义千问 API
QWEN_API_KEY = your_qwen_api_key_here
QWEN_API_URL = https://dashscope.aliyuncs.com/compatible-mode/v1
QWEN_MODEL = qwen-vl-max
# 分析任务超时控制(毫秒,默认 180000)
ANALYSIS_TIMEOUT_MS = 180000
# 图仓基础配置
TUCANG_TOKEN = your_tucang_token_here
TUCANG_API_BASE_URL = https://api.tucang.cc
TUCANG_TIMEOUT_MS = 15000
TUCANG_RETRY_MAX = 2
TUCANG_TLS_REJECT_UNAUTHORIZED = true
# 图仓目录
TUCANG_STUDY_FOLDER_ID = your_study_folder_id_here
TUCANG_AVATAR_FOLDER_ID = your_avatar_folder_id_here
病例影像上传后会先写入本地持久化目录,再异步同步到图仓。
用户头像上传直接走内存缓冲区上传图仓,并将远程 URL 写回 avatar_url。
若图仓同步失败,病例影像仍保留本地路径,分析阶段自动使用回退链路。
🌐 EdgeOne Pages Blob 报告存储配置
# 报告存储提供方:local / edgeone-blob
REPORT_STORAGE_PROVIDER = local
# Blob Store 名称
EDGEONE_BLOB_STORE = reports-poc
# EdgeOne Pages 项目 ID
EDGEONE_PROJECT_ID = pages-heyujty4ymg1
# EdgeOne Pages API Token(由后端环境变量持有)
EDGEONE_API_TOKEN = your_edgeone_pages_api_token
# 读取一致性:strong / eventual
EDGEONE_BLOB_CONSISTENCY = strong
# EdgeOne 请求超时(毫秒)
EDGEONE_REQUEST_TIMEOUT_MS = 15000
REPORT_STORAGE_PROVIDER=local 时保持现有报告落本地磁盘行为。
切到 edgeone-blob 后,新生成的 PDF / Word / Excel 报告会先由后端生成,再由 Node 后端直连官方 @edgeone/pages-blob SDK 上传到 EdgeOne。
报告下载接口仍保持 GET /api/reports/:id/download 不变,前端无需改调用方式。
报告分享仍走后端受控接口 /api/reports/shared/:token,不依赖本地 Edge Functions 调试链路。
edge-functions/ 与 edgeone-pages-poc/ 当前仅保留为实验性边缘分发原型,不属于正式主链路。
# 腾讯云 SES 邮件推送
TENCENT_SECRET_ID = your_tencent_secret_id_here
TENCENT_SECRET_KEY = your_tencent_secret_key_here
TENCENT_SES_REGION = ap-guangzhou
TENCENT_SES_FROM_EMAIL = [email protected]
# 邮件模板 ID
TEMPLATE_ID_REGISTER = 42423
TEMPLATE_ID_RESET_PASSWORD = 42424
TEMPLATE_ID_CHANGE_EMAIL = 42475
TEMPLATE_ID_REPORT_READY = 42476
TEMPLATE_ID_REGISTER_SUCCESS = 42477
场景
模板键
模板 ID
触发入口
注册验证码
register
TEMPLATE_ID_REGISTER
POST /api/auth/email/send-code (type=register)
重置密码验证码
reset_password
TEMPLATE_ID_RESET_PASSWORD
POST /api/auth/email/send-code (type=reset_password)
更换邮箱验证码
change_email
TEMPLATE_ID_CHANGE_EMAIL=42475
POST /api/users/me/email/send-code
报告生成完成
report_ready
TEMPLATE_ID_REPORT_READY=42476
分析结果落库后自动触发
注册成功欢迎
register_success
TEMPLATE_ID_REGISTER_SUCCESS=42477
用户注册成功后自动触发
SettingsPage 与 ProfilePage 已统一为独立的“邮箱安全”卡片流程(输入新邮箱 -> 发送验证码 -> 确认更换)。
ForgotPasswordPage 已恢复邮箱通道可用,支持邮箱验证码直接重置密码。
新增前端复用组件:src/components/settings/EmailSecurityCard.vue,避免页面重复逻辑。
登录页:工号/邮箱/短信三通道视觉统一,支持 mode=phone 深链直达短信通道。
注册页:由平铺表单改为“两步向导”(先选路径,再填信息),工号与邮箱路径分流清晰。
注册补充资料中手机号定位为可选联系信息,不作为本页主注册凭据;提供“使用手机号验证码注册”快捷入口。
2026-03-21 :前端 UI 细节打磨:覆盖 15+ 页面无障碍 ARIA 标签、键盘 :focus-visible 样式、Dashboard 数字滚动动画(useCountUp)、欢迎语分时段问候、ReportsPage/PatientsPage 暗色模式完善、上传进度定时器内存泄漏修复、控制台日志清理。
2026-03-20 :分析任务队列化重构:simpleAnalysisQueue.service.js 实现内存队列(最大并发 3),通义千问超时从 60s 延长至 180s 并优化重试延迟与日志。
2026-03-12 :分析任务稳定性修复:后端新增统一失败收口与 180s 超时保护,异步预处理失败不再只记日志;qwenService 支持从围栏文本中提取首个 JSON;病例详情页轮询改为单飞行模式,并增加连续失败/高进度卡住保护。
2026-03-12 :主布局拆分为 NotificationBell、HeaderUserMenu、MainNavDrawer,通知逻辑收口到 useNotifications;病例中心改为查询状态驱动并同步 URL;studyStore 收口病例 mapper;随访“立即提醒”支持同步通知当前操作者。
2026-03-11 :ApiSettingsPage.vue 收敛为“套餐订阅”页,左侧导航将“订阅与AI设置”拆分为“套餐订阅”和“AI与偏好设置”,新增 AiPreferencesPage.vue 集中管理 AI 引擎与服务偏好。
2026-03-09 :认证页新增软件著作权卡片与证书预览对话框,AuthBrandPanel、ApiSettingsPage、AuthSplitLayout 同步完成交互与滚动适配。
2026-03-09 :对话框背景、边框、正文/辅助文字及蒙版颜色统一到浅色/深色设计令牌,随访页输入框补充 stack-label 优化标签显示。
2026-03-08 / 2026-03-03 :病例影像与头像上传链路重构为“本地持久化/内存缓冲 + 图仓同步”,AI 分析支持直接消费远程 URL,失败时自动回退本地路径。
完整接口与字段说明以 /api-docs (Swagger UI)和 /openapi.yaml 为准。
方法
路径
说明
POST
/register
工号或邮箱注册
POST
/login
邮箱登录
POST
/logout
登出
POST
/refresh
刷新 Token
GET
/me
获取当前用户信息
POST
/email/send-code
发送邮箱验证码
POST
/email/verify
校验邮箱验证码
POST
/email/reset-password
邮箱验证码重置密码
POST /api/auth/register 规则补充:password 必填;email 与 employee_id 至少其一。工号路径需同时提供 hospital_id。
用户邮箱变更 /api/users/me/email
方法
路径
说明
POST
/send-code
发送更换邮箱验证码
POST
/confirm
校验验证码并确认更换邮箱
方法
路径
说明
POST
/send-code
发送短信验证码
POST
/login
短信验证码登录
POST
/register
短信验证码注册
POST
/reset-password
短信验证码重置密码
方法
路径
说明
GET
/
获取病例列表
POST
/
创建新病例
GET
/:id
获取病例详情
PUT
/:id
更新病例信息
DELETE
/:id
删除病例
前端病例中心已改为“查询状态驱动”模式,status / patient_id / keyword / page / rowsPerPage 会与 URL 查询参数双向同步。
方法
路径
说明
POST
/
上传单张影像并创建任务(本地持久化后分析前优先使用图仓 URL)
GET
/:taskId
按任务 ID 查询状态
GET
/study/:studyId
按病例 ID 查询结果
单图分析链路说明:上传文件会先落地到安全临时目录并持久化为病例影像,后台分析前优先尝试同步图仓;若图仓不可用,则自动回退本地路径继续分析。
任务状态口径补充:progress 在 0-85% 区间为阶段性估算进度,用于表达“预处理 / 推理 / 报告生成”阶段;SUCCESS / FAILED 为真实终态。若模型调用超过默认 180s,任务会自动标记为 FAILED。
AI 任务管理 /api/analysis-tasks
方法
路径
说明
POST
/
创建单个分析任务(基于已有病例,分析前优先解析远程 URL)
POST
/batch
批量上传影像并创建任务(最多 10 张,支持部分成功与图仓异步同步)
GET
/
获取任务列表(支持分页与筛选)
GET
/:id
获取任务详情
PUT
/:id/status
更新任务状态和进度
POST
/:id/result
保存分析结果
DELETE
/:id
删除分析任务(软删除)
稳定性说明:POST /api/analysis-tasks、POST /api/analysis-tasks/batch 与 POST /api/analyze 现在共用统一失败收口逻辑。图像准备失败、路径解析失败、模型超时或后台触发异常都会显式写入 FAILED、error_message 与 completed_at,避免任务长时间停留在 PENDING / PROCESSING / 85%。
POST /api/studies/:id/images:上传成功后立即返回病例影像记录,随后异步尝试同步图仓,不阻塞主响应。
POST /api/analysis-tasks / POST /api/analysis-tasks/batch:任务触发前优先通过 prepareStudyImageForAnalysis 获取远程 URL,失败时回退本地绝对路径。
POST /api/users/me/avatar:头像上传走图仓缓冲区上传,UserAvatar 多尺寸字段当前写入同一远程 URL,并保留图像元数据。
方法
路径
说明
POST
/
基于病例上下文进行 AI 对话(SSE 流式返回,支持深度思考与中断)
方法
路径
说明
GET
/
获取报告列表
POST
/generate
生成 PDF / Word / Excel 报告
POST
/batch-export
批量导出报告 ZIP
GET
/:id
获取报告详情
GET
/:id/download
下载 PDF 报告
POST
/:id/share
创建报告分享链接
方法
路径
说明
GET
/
分页查询随访计划
POST
/
创建随访计划
PUT
/:id
编辑随访计划
PATCH
/:id/complete
标记随访完成
PATCH
/:id/cancel
取消随访计划
PATCH
/:id/high-attention
切换医生重点关注状态
POST
/:id/remind
立即发送站内提醒
POST /api/followups/:id/remind 会去重后通知 assigned_doctor_id、created_by 与当前操作者;响应体保留 notification,并新增 notifications 数组承载本次实际创建/命中的通知集合。
方法
路径
说明
GET
/
获取当前用户通知列表
GET
/unread-count
获取未读数量
PATCH
/:id/read
标记单条通知已读
PATCH
/read-all
全部标记已读
方法
路径
说明
POST
/create
创建支付订单
GET
/check/:out_trade_no
公开查询订单状态
POST
/notify
支付回调
GET
/return
支付返回跳转
GET
/orders
获取订单列表
方法
路径
说明
GET
/health
健康检查
GET
/stats
获取统计数据
POST
/database/cleanup
执行数据库清理
GET
/database/size
获取表大小统计
指标
数量
前端页面
24
前端组件
30+
后端接口
50+
数据模型
14
代码行数
143,759
pie title 功能完成度统计
"用户认证 100%" : 100
"病例管理 100%" : 100
"AI 分析 90%" : 90
"报告系统 100%" : 100
"订阅支付 100%" : 100
"系统设置 100%" : 100
Loading
# ESLint 检查
npm run lint
# TypeScript 类型检查
npm run typecheck
feat: 新功能
fix: 修复 Bug
docs: 文档更新
style: 代码格式调整
refactor: 代码重构
test: 测试相关
chore: 构建/工具变动
flowchart TB
A["用户登录"] --> B["验证用户名密码"]
B --> C{"验证结果"}
C -->|"成功"| D["生成双 Token"]
C -->|"失败"| E["返回错误"]
D --> F["返回给前端"]
D --> G["accessToken 1h · refreshToken 7d"]
Loading
accessToken 存储在内存中,有效期 1 小时
refreshToken 存储在 localStorage,有效期 7 天
前端自动刷新 Token 机制
后端使用 JWT 中间件验证受保护路由
配置项
值
验证码长度
6 位数字
有效期
5 分钟
发送频率限制
60 秒/次
每日上限
10 次/手机号
一次性使用
验证后标记已使用
配置项
值
最大文件大小
20MB(头像 5MB)
支持格式
JPG, PNG, JPEG, TIFF, BMP
病例影像存储
先本地持久化至 server/uploads/,再异步同步图仓;分析前优先使用图仓远程 URL,失败时自动回退本地路径
头像存储
内存缓冲区直传图仓,远程 URL 写入 avatar_url 字段
报告生成位置
server/reports/
所有表使用 utf8mb4_unicode_ci 字符集
时间字段统一使用 TIMESTAMP 或 DATETIME
软删除使用 deleted_at 字段
外键关联使用 Sequelize 的关联方法
详细计划见:docs/roadmap.md (2026-03-01 同步版)
当前项目已完成"AI 辅助诊断"的核心技术闭环,但同类产品在正规医院已普及。以下四个方向旨在跳出"拍片 → AI 看片 → 出报告"的同质化框架,探索真正的差异化创新路径。
方向一:从"检测"转向"预测" — 宫颈癌风险预测引擎
核心理念 :不做"看到病变告诉你有病变"的事后诊断,做"还没看到病变就告诉你未来风险多高"的事前预测。
维度
当前模式
创新方向
输入
一张宫颈影像
HPV 分型 + TCT + 年龄 + 免疫状态 + 生活习惯 + 既往筛查史
输出
"有没有病变"
"未来 1/3/5 年进展为 CIN2+ 的概率"
模型
单帧图像分类
多维度时序风险动态模型
价值
单次诊断辅助
个性化筛查间隔决策支持
参考 ASCCP 2019 Risk-Based Management 指南,将临床决策规则编码为 AI 可执行的个性化动态模型
每次新数据输入,风险曲线实时更新,实现"越查越精准"
创新本质 :范式转换 — 从"不拍片不能判断"变成"不拍片也能算风险"
方向二:从"医生工具"转向"患者自主" — 居家自采样筛查平台
核心理念 :中国宫颈癌筛查率低的根因不是技术不够,是女性不愿意去查。羞耻感、时间成本、交通成本才是真正的壁垒。
维度
当前模式
创新方向
场景
医院/诊所
居家自助完成
驱动方
医生主导
患者主导,医生兜底
采集
医生操作阴道镜
HPV 自采样试剂盒(已有成熟产品)
流程
挂号 → 排队 → 检查
App 风险自评 → 试剂盒寄送 → 结果回传
用户在 App 完成风险问卷(HPV 暴露史、疫苗接种、性伴侣数量等)
系统生成个性化筛查计划("建议每年查一次" 或 "可 3 年后再查")
对接 HPV 自采样试剂盒:在家采样寄送,结果回传 App
AI 结合自采样结果 + 问卷数据,给出综合风险评估
创新本质 :把宫颈癌筛查从"去医院"变成"在家完成",从根本上解决筛查率低的社会痛点
方向三:从"单次检测"转向"终身轨迹" — 宫颈健康数据主权平台
核心理念 :现在没有任何产品给女性一个"属于自己的宫颈健康档案"。数据都在医院系统里,患者看不到、带不走、换医院就断了。
维度
当前模式
创新方向
数据
每次检测孤立,报告看完就完
终身宫颈健康数字档案,串联所有记录
归属
数据存在医院 HIS 系统
患者拥有数据主权,可携带、可授权
分析
单次结果判断
时间维度风险演变图谱,AI 标注转折点
互操作
各医院数据孤岛
FHIR 标准导出,跨院转诊无需重复检查
从 25 岁首次筛查开始,建立个人宫颈健康时间线
每次 HPV 检测、TCT、活检、疫苗接种、治疗记录全部串联
AI 自动标注关键转折点("2025 年 HPV16 转阳" → "2026 年 LSIL 出现" → "2027 年转阴")
生成个人宫颈健康报告卡,可授权分享给不同医生
创新本质 :从"AI 检测工具"变成"宫颈健康数据主权平台"
方向四:从"辅助诊断"转向"消灭宫颈癌" — 区域消除作战平台
核心理念 :从"帮一个医生看好一个病人"变成"帮一个地区消灭一种癌症"。呼应 WHO 2030 消除宫颈癌战略。
维度
当前模式
创新方向
服务对象
单个医生/单家医院
区域卫健委/疾控中心
目标
提高诊断准确率
提高区域筛查覆盖率,量化消除进度
数据
单病例维度
区域维度公共卫生决策看板
闭环
筛查 → 出报告
筛查 → 转诊 → 确诊 → 治疗 → 随访全链路追踪
为区域搭建宫颈癌消除作战平台:地图展示适龄女性总数、已筛查人数、覆盖率、阳性率、转诊完成率
AI 自动识别高危未筛查人群,主动推送筛查提醒
追踪每位异常结果患者的转诊-确诊-治疗全链路,确保"筛了就要管到底"
产出可量化指标:"使用系统后,本地区宫颈癌筛查率从 X% 提升到 Y%"
创新本质 :产品价值从"医疗效率工具"升级为"公共卫生基础设施"
方向二 + 方向三 :患者自主筛查 + 终身健康轨迹
组合优势
说明
痛点最尖锐
中国筛查率低的根因不是技术,是"女性不去查"
技术可落地
已有前端、后端、AI、用户系统,加自采样对接 + 健康档案无需重写架构
故事最打动人
"让每一位女性在家就能掌控自己的宫颈健康",比"AI 辅助诊断"有温度
政策契合
呼应 WHO 2030 消除宫颈癌战略、国家两癌筛查政策
本项目仅供演示和学术研究 使用。
欢迎提交 Issue 和 Pull Request 来改进本项目!
Fork 本仓库
创建特性分支 (git checkout -b feature/AmazingFeature)
提交更改 (git commit -m 'feat: Add some AmazingFeature')
推送到分支 (git push origin feature/AmazingFeature)
提交 Pull Request
如有问题或建议,请通过以下方式联系我们: