1. 项目概述
这个SpringBoot疫苗预约系统是一个典型的医疗信息化解决方案,我在去年参与过某三甲医院的类似项目开发。这类系统本质上是通过技术手段解决公共卫生服务中的资源分配问题,特别是在大规模疫苗接种期间,能有效避免人群聚集和资源浪费。
系统采用SpringBoot作为基础框架,这是目前企业级Java开发的事实标准。它内置了Tomcat服务器,通过简单的starter依赖就能快速集成各种常用组件。我在实际开发中发现,相比传统的SSM框架,SpringBoot能减少约40%的配置工作量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能设计
2.1 预约管理模块
这个模块是整个系统的核心,我们采用了分时段的预约机制。具体实现上,每个接种点可以设置自己的工作时间段,系统会自动将每个时段划分为若干时间片(通常15-30分钟一个间隔)。
关键数据结构设计:
java复制@Entity
public class TimeSlot {
@Id
@GeneratedValue
private Long id;
private LocalDateTime startTime;
private LocalDateTime endTime;
private Integer maxCapacity; // 该时段最大预约人数
private Integer bookedCount; // 已预约人数
@ManyToOne
private VaccinationSite site;
}
注意:时间片设计要考虑并发控制,我们使用了乐观锁机制来防止超订问题。
2.2 接种点管理
接种点信息管理采用了分级展示的设计:
- 省级管理员可以看到全省所有接种点
- 市级管理员只能看到本市接种点
- 接种点管理员只能管理自己的接种点
权限控制通过Spring Security实现,核心配置如下:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/province/**").hasRole("PROVINCE_ADMIN")
.antMatchers("/city/**").hasRole("CITY_ADMIN")
.antMatchers("/site/**").hasRole("SITE_ADMIN")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
3. 技术架构详解
3.1 后端技术栈
系统采用经典的三层架构:
- 表现层:Spring MVC + Thymeleaf模板引擎
- 业务层:Spring事务管理
- 持久层:Spring Data JPA + QueryDSL
数据库选型方面,我们对比了MySQL和PostgreSQL后选择了MySQL 8.0,主要考虑因素:
- 医院IT部门已有MySQL运维经验
- 预约系统的数据关系相对简单
- MySQL的JSON类型足以满足动态字段需求
3.2 前端技术选型
虽然可以使用Vue/React等现代框架,但考虑到:
- 医院内网环境可能限制npm依赖下载
- 系统管理员多为非技术人员
最终选择了最基础的方案:
- Bootstrap 4布局
- jQuery处理DOM操作
- ECharts用于数据可视化
4. 数据库设计要点
4.1 核心表结构
主要表包括:
- 用户表(account)
- 接种点表(vaccination_site)
- 疫苗库存表(vaccine_stock)
- 预约记录表(appointment)
- 接种记录表(vaccination_record)
关系示意图:
code复制account ||--o{ appointment : "1:N"
vaccination_site ||--o{ vaccine_stock : "1:N"
vaccination_site ||--o{ appointment : "1:N"
appointment ||--|| vaccination_record : "1:1"
4.2 性能优化措施
- 为高频查询字段添加索引:
sql复制CREATE INDEX idx_appointment_user ON appointment(user_id);
CREATE INDEX idx_appointment_timeslot ON appointment(timeslot_id);
- 使用数据库连接池(HikariCP配置示例):
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
5. 开发环境搭建
5.1 基础环境准备
推荐使用以下工具组合:
- JDK 11(LTS版本)
- IntelliJ IDEA 2021+
- MySQL 8.0+
- Maven 3.6+
在Windows环境下需要特别注意:
- 设置JAVA_HOME环境变量
- MySQL安装时要选择utf8mb4字符集
- 配置Maven镜像使用阿里云仓库
5.2 项目初始化步骤
- 使用Spring Initializr生成基础项目
- 添加必要依赖:
xml复制<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 其他依赖... -->
</dependencies>
- 配置application.yml:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/vaccine_db
username: root
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
6. 典型问题解决方案
6.1 并发预约控制
我们遇到过"超卖"问题,即同一时段被超额预约。最终采用两种方案结合:
- 数据库层面:使用SELECT FOR UPDATE悲观锁
- 应用层面:Redis分布式锁
核心代码片段:
java复制@Transactional
public Appointment createAppointment(Long userId, Long timeSlotId) {
// 检查时段余量
TimeSlot slot = timeSlotRepository.findById(timeSlotId)
.orElseThrow(...);
if(slot.getBookedCount() >= slot.getMaxCapacity()) {
throw new BusinessException("该时段已约满");
}
// 创建预约记录
Appointment appt = new Appointment();
appt.setUserId(userId);
appt.setTimeSlotId(timeSlotId);
appointmentRepository.save(appt);
// 更新时段计数
slot.setBookedCount(slot.getBookedCount() + 1);
timeSlotRepository.save(slot);
return appt;
}
6.2 批量预约处理
在团体预约场景下,我们实现了批量处理接口。关键点:
- 使用Spring Batch处理大批量数据
- 实现CSV模板导入导出
- 添加异步处理状态查询
7. 部署实施方案
7.1 服务器环境
推荐配置:
- CPU: 4核以上
- 内存: 8GB+
- 磁盘: 100GB+ SSD
- OS: CentOS 7/8
7.2 部署流程
- 打包应用:
bash复制mvn clean package -DskipTests
- 数据库初始化:
sql复制CREATE DATABASE vaccine_db CHARACTER SET utf8mb4;
- 启动应用:
bash复制java -jar vaccine-system.jar --spring.profiles.active=prod
7.3 监控配置
建议添加:
- Spring Boot Actuator健康检查
- Prometheus + Grafana监控
- ELK日志收集
8. 项目扩展方向
在实际使用中,我们发现还可以增加:
- 短信/邮件提醒服务
- 疫苗接种电子凭证
- 数据分析看板
- 移动端小程序接入
特别是电子凭证功能,可以通过集成CA数字证书来实现可信认证。我们在二期项目中使用了国密SM2算法来实现这个功能。
