1. 项目概述
仁康医院预约挂号系统是一款基于SpringBoot框架开发的医疗信息化解决方案。作为一名参与过多个医疗系统开发的后端工程师,我深知传统医院挂号流程的痛点——患者需要早早排队、信息不透明、资源分配不均等问题。这个系统正是为了解决这些实际问题而设计的。
系统采用B/S架构,前端使用Vue.js,后端基于SpringBoot,数据库选用MySQL,是一套典型的Java Web应用。核心功能覆盖了从门诊挂号到住院管理的全流程,包括医生排班、科室管理、预约挂号、诊断报告、住院登记等模块。特别值得一提的是,我们设计了完善的权限控制系统,区分患者、医生和管理员三种角色,确保数据安全和操作合规性。
2. 技术选型与架构设计
2.1 技术栈解析
选择SpringBoot作为后端框架主要基于以下几个考虑:
- 快速开发:SpringBoot的自动配置和起步依赖大大减少了样板代码
- 微服务友好:为未来可能的系统扩展预留了空间
- 丰富的生态系统:与MyBatis、Spring Security等组件无缝集成
数据库选用MySQL 5.7版本,主要因为:
- 医院数据关系明确,适合关系型数据库
- 事务支持完善,保证挂号、支付等操作的ACID特性
- 社区支持良好,运维成本较低
前端采用Vue.js + ElementUI的组合,实现了前后端分离架构。这种选择带来了:
- 更好的用户体验:页面局部刷新,响应更快
- 开发效率提升:前端可以独立开发和部署
- 可维护性增强:清晰的组件化结构
2.2 系统架构设计
系统采用经典的三层架构:
- 表现层:Vue.js前端,负责用户交互和数据显示
- 业务逻辑层:SpringBoot后端,处理核心业务逻辑
- 数据访问层:MyBatis + MySQL,负责数据持久化
特别设计了API网关层处理跨域、鉴权和流量控制。安全方面整合了Spring Security,实现了基于角色的访问控制(RBAC)。
提示:在医疗系统中,数据安全尤为重要。我们所有敏感数据(如患者信息)都进行了加密存储,日志记录完整,符合医疗信息系统安全标准。
3. 核心功能实现
3.1 预约挂号模块
挂号流程是系统的核心,我们实现了以下关键功能:
- 医生排班管理:支持可视化排班,自动冲突检测
- 号源生成:根据排班自动生成可预约时段
- 预约规则:设置预约提前天数、取消时限等
核心代码片段(挂号逻辑):
java复制@Transactional
public AppointmentResult makeAppointment(AppointmentRequest request) {
// 验证号源是否可用
Schedule schedule = scheduleMapper.selectAvailableById(request.getScheduleId());
if (schedule == null || schedule.getRemain() <= 0) {
throw new BusinessException("号源已满");
}
// 检查是否重复预约
if (appointmentMapper.countUserAppointments(request.getUserId(),
request.getScheduleDate()) > 0) {
throw new BusinessException("同一天只能预约一次");
}
// 扣减号源
scheduleMapper.decreaseRemain(request.getScheduleId());
// 创建预约记录
Appointment appointment = new Appointment();
BeanUtils.copyProperties(request, appointment);
appointment.setStatus(AppointmentStatus.BOOKED);
appointmentMapper.insert(appointment);
return new AppointmentResult(appointment.getId());
}
3.2 住院管理模块
住院流程包括:
- 住院登记:医生发起,填写初步诊断
- 预交金管理:支持多次充值和退款
- 费用每日结算:自动生成费用清单
数据库设计关键表:
- 住院登记表(hospitalization)
- 预交金记录表(deposit)
- 每日费用表(daily_charge)
4. 数据库设计与优化
4.1 主要表结构
- 用户表(user):
sql复制CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '登录账号',
`password` varchar(100) NOT NULL COMMENT '加密密码',
`real_name` varchar(50) NOT NULL COMMENT '真实姓名',
`id_card` varchar(18) NOT NULL COMMENT '身份证号',
`phone` varchar(20) NOT NULL COMMENT '手机号',
`type` tinyint(4) NOT NULL COMMENT '1-患者 2-医生 3-管理员',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 医生排班表(schedule):
sql复制CREATE TABLE `schedule` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`doctor_id` bigint(20) NOT NULL,
`department_id` bigint(20) NOT NULL,
`schedule_date` date NOT NULL,
`time_period` varchar(20) NOT NULL COMMENT '上午/下午/晚上',
`total` int(11) NOT NULL COMMENT '总号源数',
`remain` int(11) NOT NULL COMMENT '剩余号源数',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1-有效 0-取消',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_doctor_time` (`doctor_id`,`schedule_date`,`time_period`),
KEY `idx_department_date` (`department_id`,`schedule_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4.2 性能优化措施
- 索引优化:在常用查询字段上建立合适索引
- 查询优化:使用JOIN替代子查询,避免SELECT *
- 缓存策略:对静态数据如医院介绍使用Redis缓存
- 分表策略:对增长快速的表如操作日志按年月分表
5. 系统安全与稳定性
5.1 安全措施
- 认证授权:JWT + Spring Security实现
- 数据安全:
- 密码加盐哈希存储
- 敏感字段加密
- SQL注入防护
- 操作审计:记录关键操作日志
5.2 高可用设计
- 服务降级:核心服务与非核心服务隔离
- 限流策略:Guava RateLimiter防止刷号
- 事务管理:确保挂号、支付等关键操作原子性
- 监控告警:集成Prometheus + Grafana
6. 部署与运维
6.1 环境要求
- JDK 1.8+
- MySQL 5.7+
- Redis 3.2+(可选,用于缓存)
- Tomcat 8+/Undertow
6.2 部署步骤
- 数据库初始化:
bash复制mysql -u root -p < init.sql
- 后端服务打包:
bash复制mvn clean package -DskipTests
- 前端构建:
bash复制npm install
npm run build
- 配置Nginx反向代理
6.3 常见问题排查
-
数据库连接失败:
- 检查application.yml中的JDBC配置
- 验证数据库服务是否正常运行
- 检查网络连接和防火墙设置
-
预约功能异常:
- 检查排班数据是否正常生成
- 验证事务是否生效
- 查看日志中的异常信息
7. 项目总结与扩展
在实际开发过程中,有几个关键点值得注意:
- 号源管理是核心难点,我们最终采用了乐观锁解决并发问题
- 医疗系统对数据一致性要求极高,事务边界需要仔细设计
- 与第三方支付系统对接时,要做好对账机制
未来可能的扩展方向:
- 接入医保系统
- 增加移动端APP
- 引入AI分诊功能
- 开发数据统计分析模块
这个项目让我深刻体会到,医疗信息化系统不仅要考虑技术实现,更要理解医疗行业的特殊需求和规范。每个功能设计都需要以患者体验为中心,同时满足医院的管理需求。