一、项目简介
随着互联网医院、家庭医生和慢病随访场景的发展,传统线下就诊正在逐步与线上医疗服务融合。本项目实现一个轻量级的 智能远程医疗系统:患者可以在线建档并提交远程预约,医生可以查看问诊请求、进入模拟视频诊室、更新问诊状态、填写诊断结论和电子处方。
项目定位是 CSDN 教学型 Python 全栈项目,重点展示从数据库建模、后端接口、前端交互到部署运行的完整流程。为了便于读者本地运行,技术栈选择 FastAPI + SQLite + 原生 HTML/CSS/JavaScript,不依赖复杂前端框架,也不强制连接第三方音视频服务。
系统核心能力包括:
- 患者档案管理:姓名、年龄、联系方式、地址、既往病史。
- 在线医生列表:科室、职称、在线状态和擅长方向。
- 远程预约问诊:选择患者、医生、时间并提交症状描述。
- 问诊状态流转:待接诊、问诊中、已完成。
- 远程诊室编号:创建预约时自动生成模拟视频房间号。
- 诊断与电子处方:医生完成问诊后填写诊断和处方。
- 数据看板:统计患者数、医生数、预约数、待接诊数和已完成数。
二、技术栈
| 层次 | 技术 | 说明 |
|---|---|---|
| 后端框架 | FastAPI | 提供 RESTful API 和 Swagger 文档 |
| ASGI 服务 | Uvicorn | 本地运行 FastAPI 服务 |
| 数据库 | SQLite | 轻量级文件数据库,便于演示 |
| ORM | SQLAlchemy | 定义数据表、关系和查询逻辑 |
| 数据校验 | Pydantic | 请求和响应结构校验 |
| 前端 | HTML/CSS/JavaScript | 原生页面,无需打包工具 |
| 通信方式 | Fetch API | 浏览器调用后端接口 |
三、系统架构
项目采用经典前后端分离架构:
text
浏览器前端
├── 患者建档表单
├── 预约问诊表单
├── 医生列表
└── 问诊状态操作
│ fetch JSON
▼
FastAPI 后端
├── main.py:接口路由
├── schemas.py:请求响应模型
├── crud.py:业务逻辑
├── models.py:数据库模型
└── database.py:SQLite 连接
│ SQLAlchemy
▼
SQLite 数据库 telemedicine.db
前端只负责展示和用户交互,后端负责数据校验、业务状态更新和持久化。SQLite 数据库文件在后端首次启动时自动创建。
四、功能模块
1. 患者档案模块
患者是远程问诊流程的起点。系统支持创建和查询患者档案,字段包括姓名、年龄、性别、手机号、地址和既往病史。
2. 医生资源模块
医生数据包含姓名、科室、职称、在线状态和擅长方向。项目启动时会自动初始化 3 条医生数据,方便直接测试预约流程。
3. 远程预约模块
患者选择在线医生并填写预约时间、症状描述后,后端创建一条预约记录,同时自动生成一个模拟视频诊室编号,例如 RM-1-2。
4. 问诊状态模块
预约记录的状态支持:
- 待接诊:患者刚提交预约。
- 问诊中:医生点击开始问诊。
- 已完成:医生填写诊断和处方后结束问诊。
5. 诊断处方模块
问诊完成时,医生可以录入诊断结果和电子处方。真实医疗系统还需要签名、审方、处方流转等合规能力,本项目保留为教学演示。
6. 数据看板模块
看板接口汇总患者数、医生数、预约数、待接诊数、已完成数以及科室分布,帮助管理人员快速了解平台运行状态。
五、数据库/数据模型设计
系统包含 3 张核心表:
patients 患者表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| name | String | 姓名 |
| age | Integer | 年龄 |
| gender | String | 性别 |
| phone | String | 手机号 |
| address | String | 地址 |
| history | Text | 既往病史 |
| created_at | DateTime | 创建时间 |
doctors 医生表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| name | String | 医生姓名 |
| department | String | 科室 |
| title | String | 职称 |
| online_status | String | 在线状态 |
| expertise | Text | 擅长方向 |
appointments 预约问诊表
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Integer | 主键 |
| patient_id | Integer | 患者 ID |
| doctor_id | Integer | 医生 ID |
| scheduled_time | String | 预约时间 |
| symptom | Text | 症状描述 |
| status | String | 问诊状态 |
| video_room | String | 模拟远程诊室编号 |
| diagnosis | Text | 诊断结论 |
| prescription | Text | 电子处方 |
| created_at | DateTime | 创建时间 |
模型代码位于 backend/app/models.py:
python
class Appointment(Base):
__tablename__ = "appointments"
id = Column(Integer, primary_key=True, index=True)
patient_id = Column(Integer, ForeignKey("patients.id"), nullable=False)
doctor_id = Column(Integer, ForeignKey("doctors.id"), nullable=False)
scheduled_time = Column(String(40), nullable=False)
symptom = Column(Text, nullable=False)
status = Column(String(20), default="待接诊")
video_room = Column(String(80), default="")
diagnosis = Column(Text, default="")
prescription = Column(Text, default="")
六、后端接口设计
接口统一使用 /api 前缀:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health |
健康检查 |
| GET | /api/dashboard |
获取统计看板 |
| POST | /api/patients |
创建患者 |
| GET | /api/patients |
查询患者列表 |
| POST | /api/doctors |
创建医生 |
| GET | /api/doctors |
查询医生列表 |
| POST | /api/appointments |
创建远程预约 |
| GET | /api/appointments |
查询预约列表,可按状态过滤 |
| PATCH | /api/appointments/{id} |
更新问诊状态、诊断、处方 |
预约创建接口示例:
json
POST /api/appointments
{
"patient_id": 1,
"doctor_id": 2,
"scheduled_time": "2026-06-05T10:30",
"symptom": "发热、咳嗽两天,希望远程问诊"
}
后端会返回带有 video_room 的预约记录。
七、前端页面设计
前端页面位于 frontend/:
index.html:页面结构,包含数据卡片、患者表单、预约表单、医生列表和问诊列表。style.css:响应式布局和卡片式 UI。app.js:调用后端 API,处理表单提交和状态更新。
页面主要区域如下:
- 顶部 Banner:展示系统名称和刷新按钮。
- 数据看板:展示患者数、医生数、预约数等统计指标。
- 患者建档:录入基础健康档案。
- 远程预约:选择患者、医生和预约时间。
- 在线医生:展示科室、职称、在线状态、擅长方向。
- 问诊列表:支持开始问诊、完成问诊并填写诊断处方。
八、核心代码讲解
1. 数据库连接
database.py 使用 SQLite 文件数据库,并通过 SessionLocal 为每个请求提供数据库会话:
python
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
2. FastAPI 路由
main.py 在启动时创建表结构,并注册跨域中间件,方便本地 HTML 页面直接访问接口:
python
Base.metadata.create_all(bind=engine)
app = FastAPI(title="智能远程医疗系统")
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"])
创建预约的接口非常简洁:
python
@app.post("/api/appointments", response_model=schemas.Appointment)
def create_appointment(data: schemas.AppointmentCreate, db: Session = Depends(get_db)):
return crud.create_appointment(db, data)
3. 业务逻辑
crud.py 中的 create_appointment 负责生成远程诊室编号并保存预约:
python
def create_appointment(db: Session, data: schemas.AppointmentCreate):
room = f"RM-{data.patient_id}-{data.doctor_id}"
appointment = models.Appointment(**data.model_dump(), video_room=room)
db.add(appointment)
db.commit()
db.refresh(appointment)
return appointment
4. 前端交互
前端使用 Fetch API 封装统一请求方法:
javascript
async function request(path, options = {}) {
const res = await fetch(`${API}${path}`, {
headers: { 'Content-Type': 'application/json' },
...options,
});
if (!res.ok) throw new Error(await res.text());
return res.json();
}
更新问诊状态时,前端调用 PATCH 接口:
javascript
await request(`/appointments/${id}`, {
method: 'PATCH',
body: JSON.stringify({ status: '问诊中' })
});
九、部署与运行步骤
1. 解压项目
bash
unzip 76_fullstack_project.zip
cd project
2. 启动后端
bash
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000
后端启动后可以访问:
3. 打开前端
方式一:直接双击或浏览器打开 frontend/index.html。
方式二:在项目根目录启动静态服务:
bash
python3 -m http.server 8080
然后访问:
text
http://127.0.0.1:8080/frontend/
4. 测试流程
- 新建一个患者档案。
- 选择患者和医生,填写症状并提交预约。
- 在问诊列表点击"开始问诊"。
- 点击"完成并开方",录入诊断和处方。
- 查看统计看板是否同步更新。
十、项目总结
本文完成了一个可运行的 Python 全栈项目------智能远程医疗系统。项目虽然轻量,但覆盖了全栈开发中的关键环节:数据建模、接口设计、业务逻辑、前端页面、跨域访问、SQLite 持久化和本地部署。
如果继续扩展,可以加入以下功能:
- 用户登录、角色权限和 JWT 鉴权。
- 医生排班、号源管理和预约冲突校验。
- WebRTC 或第三方 SDK 实现真实音视频问诊。
- 检验报告上传、图片病历识别和 AI 辅助分诊。
- 处方审核、电子签名和审计日志。
- Docker Compose 部署和 Nginx 反向代理。
通过这个项目,你可以快速掌握 FastAPI 全栈项目的基本组织方式,并进一步拓展为更完整的互联网医疗平台。