三甲医院早上7点的挂号窗口永远排着长队,这是我开发这个系统的初衷。传统医院挂号存在三大痛点:患者排队耗时、医院管理低效、号源分配不均。这套基于SpringBoot+Vue+MySQL的线上挂号系统,用技术手段实现了"让数据多跑路,让患者少跑腿"的医疗服务升级。
系统采用前后端分离架构,前端Vue.js实现响应式用户界面,后端SpringBoot提供RESTful API,MySQL作为数据持久层。相比传统PHP架构,这种技术组合具有更好的可维护性和扩展性。我在三甲医院实习时亲眼目睹过黄牛倒号的现象,因此系统特别设计了防刷机制和实名认证模块。
关键设计原则:以三甲医院日门诊量3000-5000人为基准设计系统承载能力,所有接口响应时间控制在200ms以内
采用SpringBoot 2.7.3 + MyBatis-Plus组合,这是经过性能测试后的最优选型。基础依赖包括:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
核心模块划分:
数据库表设计特别注意了以下几点:
使用Vue 3 + Element Plus构建管理后台,Vant构建移动端H5。项目结构采用:
code复制src/
├── api/ # 接口封装
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex状态管理
└── views/ # 页面组件
关键页面性能优化:
配置了专门的从库处理报表查询,主库只处理事务操作。重要索引包括:
sql复制ALTER TABLE `registration_order`
ADD INDEX `idx_patient_date` (`patient_id`, `visit_date`);
ALTER TABLE `doctor_schedule`
ADD UNIQUE `uniq_doctor_date` (`doctor_id`, `work_date`);
针对高并发场景的解决方案:
排班系统需要考虑:
核心代码片段:
java复制public List<ScheduleVO> generateSchedule(Long deptId, LocalDate startDate, LocalDate endDate) {
// 1. 获取科室下所有医生
List<Doctor> doctors = doctorService.listByDept(deptId);
// 2. 排除请假医生
List<Long> onLeaveIds = leaveService.getOnLeaveDoctorIds(startDate, endDate);
// 3. 生成每日排班
return doctors.stream()
.filter(d -> !onLeaveIds.contains(d.getId()))
.flatMap(doctor -> {
// 每个医生生成时间段分配
return generateTimeSlots(doctor, startDate, endDate).stream();
})
.collect(Collectors.toList());
}
挂号流程的分布式锁实现:
java复制public boolean lockRegistration(Long scheduleId, Long patientId) {
String lockKey = "reg:lock:" + scheduleId;
String requestId = UUID.randomUUID().toString();
try {
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, requestId, 30, TimeUnit.SECONDS);
if (Boolean.TRUE.equals(locked)) {
// 检查号源余量
Integer remain = redisTemplate.opsForValue()
.decrement("schedule:remain:" + scheduleId);
if (remain >= 0) {
return true;
}
}
return false;
} finally {
// 确保只释放自己的锁
if (requestId.equals(redisTemplate.opsForValue().get(lockKey))) {
redisTemplate.delete(lockKey);
}
}
}
订单状态流转图:
code复制[待支付] --超时未支付--> [已取消]
[待支付] --支付成功--> [已支付] --就诊完成--> [已完成]
[已支付] --申请退款--> [退款中] --退款成功--> [已退款]
状态变更的审计日志记录策略:
采用三要素认证:
接口调用示例:
java复制public boolean verifyRealName(String idCard, String name, String mobile) {
// 调用第三方认证服务
RealNameAuthRequest request = new RealNameAuthRequest(idCard, name, mobile);
RealNameAuthResponse response = authClient.verify(request);
if (response.isSuccess()) {
// 记录认证信息
patientService.updateAuthStatus(userId, true);
return true;
}
return false;
}
多维度防御体系:
风险控制规则配置示例:
yaml复制anti-spam:
rules:
- name: IP_LIMIT
type: IP
limit: 5
period: 3600
- name: NEW_USER_LIMIT
type: USER
limit: 2
period: 86400
condition: "registerTime > now()-86400"
推荐生产环境配置:
Nginx关键配置:
nginx复制upstream backend {
server 192.168.1.100:8080 weight=5;
server 192.168.1.101:8080 weight=5;
keepalive 32;
}
server {
listen 80;
server_name hospital-reg.com;
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
必备监控指标:
使用Prometheus + Grafana搭建监控看板,关键告警规则:
yaml复制groups:
- name: hospital-alert
rules:
- alert: HighLatency
expr: api_http_response_time_seconds{quantile="0.99"} > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "High latency detected on {{ $labels.path }}"
技术章节建议结构:
图表规范要求:
演示脚本设计:
常见答辩问题准备:
可扩展功能模块:
有价值的数据分析:
使用Flink实时计算框架的示例:
java复制DataStream<RegistrationEvent> stream = env
.addSource(new KafkaSource<>())
.keyBy(event -> event.getDeptId())
.window(TumblingEventTimeWindows.of(Time.hours(1)))
.aggregate(new DeptCountAggregate());
现象:Vue前端访问SpringBoot接口出现CORS错误
解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.maxAge(3600);
}
}
典型问题:
可靠的回调处理流程:
现象:运行一段时间后出现连接池耗尽
排查工具:
最终解决方案:
yaml复制spring:
datasource:
druid:
initial-size: 5
max-active: 20
min-idle: 5
max-wait: 60000
系统最终实现指标:
三个值得改进的方面:
在实际部署中发现,三甲医院的网络环境比预想的复杂,内网穿透方案需要特别设计。另外医院HIS系统的对接往往需要定制开发,这在项目初期容易被低估。建议后续开发者提前与医院信息科确认接口规范,预留足够的对接时间。