1. 项目背景与核心需求
在基层医疗机构中,"排队两小时,看诊五分钟"的现象仍然普遍存在。传统诊所运营模式主要依赖线下挂号、手写病历、电话改约和纸质公告,这种模式不仅给患者带来不便,也使得诊所管理效率低下。患者需要花费大量时间排队等候,而诊所方面则面临重复解释、资源错配和物资统计混乱等问题。
这套基于SpringBoot的诊所预约系统正是为了解决这些痛点而设计。系统将预约挂号、医生排班、诊治记录、药品耗材管理、费用结算和公告通知等核心业务流程全部搬到线上,实现诊所管理的数字化转型。通过该系统,患者可以在家中通过手机或电脑完成医生选择、时段预约和费用支付;医生可以提前掌握号源情况、查看患者病历;诊所管理者则能实时监控物资库存和运营数据。
提示:系统设计时特别考虑了基层诊所的实际运营场景,包括医生可能同时服务多个诊所、患者可能临时取消预约、药品库存需要实时更新等情况。
2. 系统架构与技术选型
2.1 整体架构设计
系统采用标准的B/S架构,分为表现层、业务逻辑层和数据访问层三层结构:
- 表现层:基于LayUI框架开发,响应式设计适配PC和移动端
- 业务逻辑层:SpringBoot框架实现核心业务逻辑
- 数据持久层:MyBatis-Plus简化数据库操作
- 数据库:MySQL 5.7/8.0存储业务数据
技术栈选择主要基于以下考虑:
- SpringBoot:简化配置、快速开发,内置Tomcat便于部署
- LayUI:轻量级前端框架,适合管理后台开发
- MySQL:关系型数据库,满足事务性操作需求
- Redis:缓存热点数据,提升系统响应速度
2.2 数据库设计关键表结构
系统核心数据表包括:
-
用户表(user):
- 字段:用户ID、姓名、年龄、性别、身份证号、手机号、住址
- 索引:手机号(唯一)、身份证号(唯一)
-
医生表(doctor):
- 字段:医生ID、姓名、所属诊所、专业领域、医龄、简介
- 外键:关联诊所表
-
预约表(appointment):
- 字段:预约ID、用户ID、医生ID、预约时间、状态(待支付/已支付/已取消/已完成)
- 约束:同一医生同一时段只能有一个有效预约
-
病历表(medical_record):
- 字段:病历ID、患者ID、医生ID、诊断结果、处方信息、创建时间
- 文本字段:使用MEDIUMTEXT存储详细病历内容
sql复制CREATE TABLE `appointment` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`doctor_id` bigint(20) NOT NULL,
`clinic_id` bigint(20) NOT NULL,
`appointment_time` datetime NOT NULL,
`status` tinyint(4) NOT NULL COMMENT '0-待支付 1-已支付 2-已取消 3-已完成',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_doctor_time` (`doctor_id`,`appointment_time`),
KEY `idx_user` (`user_id`),
KEY `idx_clinic` (`clinic_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
3. 核心功能模块实现
3.1 预约挂号流程实现
预约功能是系统的核心模块,其业务流程如下:
- 患者选择诊所和医生
- 系统展示该医生可预约时段(每30分钟为一个时段)
- 患者选择时段并提交预约请求
- 系统检查时段冲突并锁定号源15分钟
- 患者完成支付后预约生效
关键代码实现:
java复制@Transactional
public Result createAppointment(AppointmentDTO dto) {
// 检查时段是否可用
boolean available = appointmentMapper.checkTimeSlotAvailable(
dto.getDoctorId(), dto.getAppointmentTime());
if (!available) {
return Result.error("该时段已被预约");
}
// 锁定号源
int rows = appointmentMapper.lockTimeSlot(
dto.getDoctorId(), dto.getAppointmentTime());
if (rows == 0) {
return Result.error("锁定号源失败");
}
// 创建预约记录
Appointment appointment = new Appointment();
BeanUtils.copyProperties(dto, appointment);
appointment.setStatus(0); // 待支付状态
appointmentMapper.insert(appointment);
// 设置15分钟支付超时
redisTemplate.opsForValue().set(
"appointment:lock:" + appointment.getId(),
"1", 15, TimeUnit.MINUTES);
return Result.success(appointment.getId());
}
3.2 电子病历管理模块
电子病历模块实现了以下功能:
- 结构化病历录入(主诉、现病史、体格检查、诊断等)
- 处方开具与药品库存联动
- 病历模板管理
- 病历打印与导出PDF
病历数据采用JSON格式存储,便于扩展和检索:
json复制{
"chief_complaint": "反复头痛3天",
"history_of_present_illness": "患者3天前无明显诱因出现头痛...",
"physical_examination": "T36.5℃,P80次/分,R18次/分...",
"diagnosis": ["偏头痛"],
"treatment_plan": {
"medications": [
{
"name": "布洛芬缓释胶囊",
"spec": "0.3g*10粒",
"dosage": "0.3g q12h po",
"days": 3
}
],
"advice": "注意休息,避免劳累"
}
}
4. 系统部署与性能优化
4.1 部署方案
系统支持多种部署方式:
-
开发环境:
- IDEA/Eclipse + 本地MySQL
- 使用SpringBoot内置Tomcat调试
-
生产环境:
- 推荐使用Docker Compose部署:
yaml复制version: '3' services: app: image: openjdk:8-jdk-alpine ports: - "8080:8080" volumes: - ./app.jar:/app.jar command: ["java", "-jar", "/app.jar"] depends_on: - mysql - redis mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: clinic ports: - "3306:3306" volumes: - ./mysql-data:/var/lib/mysql redis: image: redis:alpine ports: - "6379:6379"
4.2 性能优化措施
-
缓存策略:
- 使用Redis缓存诊所信息、医生排班等热点数据
- 设置合理的过期时间(如诊所信息缓存1小时)
-
数据库优化:
- 为常用查询字段建立索引
- 大文本字段(如病历内容)单独存储
- 定期归档历史数据
-
并发控制:
- 使用乐观锁处理号源竞争
- 预约接口添加限流措施
java复制// 乐观锁实现示例
@Transactional
public boolean confirmAppointment(Long id, Long version) {
int rows = appointmentMapper.confirmWithVersion(id, version);
return rows > 0;
}
// 对应的Mapper方法
@Update("UPDATE appointment SET status = 1, version = version + 1
WHERE id = #{id} AND version = #{version}")
int confirmWithVersion(@Param("id") Long id, @Param("version") Long version);
5. 常见问题与解决方案
5.1 预约冲突问题
现象:多个用户同时预约同一时段时出现超卖
解决方案:
- 使用SELECT FOR UPDATE悲观锁
- 引入Redis分布式锁
- 前端限制频繁提交
5.2 病历数据安全问题
风险点:病历数据包含敏感个人信息
防护措施:
- 数据库字段加密存储
- 接口权限严格控制
- 操作日志完整记录
5.3 系统集成问题
场景:需要与医保系统或第三方支付对接
建议方案:
- 使用Spring Integration处理异构系统集成
- 定义清晰的接口规范
- 添加熔断机制
注意:在实际开发中,药品库存管理需要特别注意事务一致性。当医生开具处方时,需要确保药品扣减和处方保存要么同时成功,要么同时失败。
6. 扩展功能与二次开发
系统预留了多个扩展点供二次开发:
-
微信小程序集成:
- 通过Spring Security OAuth2实现微信登录
- 使用WebSocket推送预约状态变更
-
智能推荐功能:
- 基于历史数据推荐合适医生
- 实现智能分诊建议
-
数据统计分析:
- 使用ECharts展示诊所运营数据
- 患者就诊趋势分析
-
物联网设备对接:
- 对接智能血压计、体温计等设备
- 自动采集健康数据填入病历
对于毕业设计而言,可以重点实现核心预约和病历管理功能;实际商业项目中,则需要根据诊所具体需求进行功能扩展和性能优化。系统采用模块化设计,各功能模块相对独立,便于按需扩展。
