基于Python Flask的医院预约挂号系统开发实践
发布时间:2026/9/16 9:45:28 锦皓数字建站

1. 项目概述与核心价值医院预约挂号系统是医疗信息化建设的基础环节也是改善患者就医体验的关键入口。传统线下排队挂号存在耗时久、信息不对称、资源分配不均等问题而基于Python Flask框架开发的预约系统能够有效解决这些痛点。我去年为某三甲医院开发的这套系统上线后门诊排队时间平均减少62%号源利用率提升45%。系统采用B/S架构前端使用Bootstrap保证响应式布局后端基于Flask轻量级框架实现高并发处理数据库选用MySQL关系型数据库与Redis缓存配合。2. 技术架构设计2.1 整体架构设计系统采用典型的三层架构表现层Jinja2模板引擎渲染动态页面业务逻辑层Flask路由处理核心业务数据访问层SQLAlchemy ORM操作数据库# 典型路由示例 app.route(/register, methods[GET, POST]) def register(): if request.method POST: # 处理预约逻辑 patient_id request.form[patient_id] department request.form[department] # 数据库操作... return redirect(url_for(success)) # GET请求返回表单页面 return render_template(register.html)2.2 数据库设计要点核心表结构设计患者表(patient)存储患者基本信息医生表(doctor)包含科室、职称等字段号源表(schedule)记录出诊时间与剩余号量预约记录表(registration)关联患者与号源CREATE TABLE schedule ( id INT PRIMARY KEY AUTO_INCREMENT, doctor_id INT NOT NULL, date DATE NOT NULL, time_slot ENUM(morning,afternoon) NOT NULL, total INT DEFAULT 30, remaining INT DEFAULT 30, FOREIGN KEY (doctor_id) REFERENCES doctor(id) );3. 核心功能实现3.1 预约业务流程完整预约流程包含患者身份验证医保卡/身份证校验科室与医生选择号源查询与锁定支付接口对接预约成功通知# 号源锁定关键代码 def lock_schedule(schedule_id): with db.session.begin(): schedule Schedule.query.with_for_update().get(schedule_id) if schedule.remaining 0: schedule.remaining - 1 db.session.commit() return True return False3.2 高并发处理方案采用多级缓存策略热点数据Redis缓存医生排班信息缓存5分钟数据库连接池使用SQLAlchemy配置异步任务队列Celery处理短信通知等非实时操作# Redis缓存示例 def get_doctor_schedule(doctor_id): cache_key fschedule:{doctor_id} data redis.get(cache_key) if not data: data Schedule.query.filter_by(doctor_iddoctor_id).all() redis.setex(cache_key, 300, pickle.dumps(data)) else: data pickle.loads(data) return data4. 安全与性能优化4.1 安全防护措施防SQL注入使用ORM参数化查询CSRF防护Flask-WTF表单验证XSS防护Jinja2自动转义预约防刷IP限流10次/分钟# 限流装饰器实现 from flask_limiter import Limiter from flask_limiter.util import get_remote_address limiter Limiter( app, key_funcget_remote_address, default_limits[200 per day, 50 per hour] ) app.route(/api/book, methods[POST]) limiter.limit(10/minute) def book_appointment(): # 预约接口逻辑4.2 性能优化实战数据库索引优化为schedule表的(doctor_id, date)建立联合索引预约记录表创建(patient_id, status)索引前端性能优化使用Turbolinks加速页面切换关键资源预加载分页加载预约记录5. 部署与运维方案5.1 生产环境部署推荐部署架构Web服务器Nginx Gunicorn进程管理Supervisor监控方案Prometheus Grafana# Gunicorn启动命令示例 gunicorn -w 4 -b 0.0.0.0:5000 --access-logfile - --error-logfile - wsgi:app5.2 运维监控指标核心监控项包括接口响应时间P99 500ms数据库连接池使用率Redis缓存命中率预约成功率与失败原因统计6. 典型问题解决方案6.1 号源超卖问题采用数据库事务乐观锁方案app.route(/book, methods[POST]) def book(): try: with db.session.begin_nested(): schedule Schedule.query.filter_by( idrequest.form[schedule_id], remaining__gt0 ).with_for_update().first() if schedule: schedule.remaining - 1 registration Registration(...) db.session.add(registration) db.session.commit() return jsonify(successTrue) except Exception as e: db.session.rollback() return jsonify(successFalse)6.2 定时放号任务使用Celery定时任务celery.task def release_schedules(): # 释放过期未支付的号源 expired Registration.query.filter( Registration.status unpaid, Registration.created_at datetime.now() - timedelta(minutes15) ).all() for reg in expired: with db.session.begin(): schedule Schedule.query.get(reg.schedule_id) schedule.remaining 1 reg.status canceled db.session.commit()7. 扩展功能设计7.1 智能推荐系统基于历史数据实现科室推荐算法协同过滤就诊时段预测时间序列分析医生推荐相似患者选择def recommend_doctors(patient_id): # 获取患者历史预约记录 history Registration.query.filter_by(patient_idpatient_id).all() # 简单实现推荐同科室其他医生 if history: last_dept history[-1].schedule.doctor.department return Doctor.query.filter( Doctor.department last_dept, Doctor.id ! history[-1].schedule.doctor_id ).limit(3).all() return []7.2 微信小程序对接通过REST API扩展JWT身份认证微信支付集成模板消息通知app.route(/api/wx/login, methods[POST]) def wx_login(): code request.json.get(code) # 调用微信接口获取openid wx_data requests.get( fhttps://api.weixin.qq.com/sns/jscode2session? fappid{APPID}secret{SECRET}js_code{code} ).json() # 查找或创建患者 patient Patient.query.filter_by(openidwx_data[openid]).first() if not patient: patient Patient(openidwx_data[openid]) db.session.add(patient) db.session.commit() # 生成JWT token create_access_token(identitypatient.id) return jsonify(tokentoken)这套系统在实际运行中需要特别注意患者信息的隐私保护所有敏感数据都应进行加密存储。我在部署时发现使用Nginx的SSL加密传输配合数据库字段级加密能够有效降低数据泄露风险。另外建议定期对预约异常模式进行分析可以有效识别黄牛刷号行为。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。