1. 项目概述
企业级疫苗发布和接种预约系统是针对公共卫生领域设计的一套信息化解决方案。在经历了多次突发公共卫生事件后,我深刻认识到传统疫苗管理方式的局限性——纸质登记效率低下、电话预约容易占线、库存信息更新不及时等问题严重制约了大规模接种的效率。这套系统正是为了解决这些痛点而设计的。
系统采用SpringBoot+Vue+MyBatis的主流技术栈,前后端分离架构,MySQL作为核心数据库。从技术选型到功能设计,都充分考虑了实际应用场景中的各种需求。我在开发过程中特别注重系统的稳定性、易用性和扩展性,确保能够应对高并发预约场景,同时为不同角色提供定制化的操作界面。
2. 系统架构设计
2.1 技术选型解析
后端选择SpringBoot框架主要基于以下几个考量:
- 快速开发:SpringBoot的自动配置和起步依赖大大减少了样板代码
- 生态丰富:可以方便地集成MyBatis、Redis、JWT等常用组件
- 易于部署:内嵌Tomcat,打包成jar即可运行
前端采用Vue.js框架的优势在于:
- 响应式数据绑定,自动更新DOM
- 组件化开发,便于功能复用
- 丰富的第三方库支持(如Element UI)
数据库选用MySQL 8.0版本,主要看中其:
√ 事务处理能力
√ JSON字段支持
√ 良好的性能表现
2.2 系统架构图
系统采用典型的三层架构:
- 表现层:Vue前端应用
- 业务逻辑层:SpringBoot服务
- 数据访问层:MyBatis+MySQL
关键组件说明:
- JWT用于身份认证
- Redis缓存热点数据
- Swagger用于API文档生成
- Lombok减少样板代码
3. 核心功能实现
3.1 疫苗信息管理模块
疫苗信息表设计考虑了以下业务需求:
sql复制CREATE TABLE `vaccine` (
`vaccine_id` bigint NOT NULL AUTO_INCREMENT,
`vaccine_name` varchar(50) NOT NULL COMMENT '疫苗名称',
`manufacturer` varchar(50) NOT NULL COMMENT '生产厂商',
`batch_number` varchar(30) NOT NULL COMMENT '批次号',
`stock_quantity` int NOT NULL DEFAULT '0' COMMENT '当前库存',
`expiry_date` date NOT NULL COMMENT '失效日期',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`vaccine_id`),
KEY `idx_expiry` (`expiry_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键业务逻辑实现:
- 库存预警:定时任务检查临近过期疫苗
- 批次管理:支持按批次追踪疫苗流向
- 信息发布:管理员后台可更新疫苗详情
3.2 接种点管理模块
接种点表设计特点:
sql复制CREATE TABLE `vaccination_site` (
`site_id` bigint NOT NULL AUTO_INCREMENT,
`site_name` varchar(50) NOT NULL,
`address` varchar(100) NOT NULL,
`open_time` time NOT NULL,
`close_time` time NOT NULL,
`max_daily_capacity` int NOT NULL COMMENT '单日最大接种量',
`vaccine_available` json DEFAULT NULL COMMENT '可接种疫苗列表',
PRIMARY KEY (`site_id`),
SPATIAL KEY `idx_location` (`address`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
业务实现要点:
- 地理围栏:通过地址解析获取经纬度
- 容量控制:每日预约量不超过max_daily_capacity
- 疫苗关联:使用JSON存储可接种疫苗ID
3.3 预约管理模块
预约表关键设计:
sql复制CREATE TABLE `appointment` (
`appointment_id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`site_id` bigint NOT NULL,
`vaccine_id` bigint NOT NULL,
`appoint_time` datetime NOT NULL,
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0-待确认 1-已完成',
`cancel_reason` varchar(200) DEFAULT NULL,
PRIMARY KEY (`appointment_id`),
KEY `idx_user` (`user_id`),
KEY `idx_site_time` (`site_id`,`appoint_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
核心业务流程:
- 用户选择接种点和时间
- 系统校验库存和容量
- 生成预约记录
- 发送短信通知
- 接种后更新状态
4. 关键技术实现
4.1 高并发预约处理
面对大规模接种需求,系统采用以下优化措施:
- Redis缓存:
java复制// 接种点余量缓存
@Cacheable(value = "siteCapacity", key = "#siteId+'_'+#date")
public int getAvailableCapacity(Long siteId, LocalDate date) {
// 查询数据库...
}
- 乐观锁控制:
java复制@Transactional
public boolean makeAppointment(AppointmentDTO dto) {
// 检查余量
int capacity = siteMapper.queryCapacity(dto.getSiteId(), dto.getAppointTime());
if(capacity <= 0) {
throw new BusinessException("该时段已约满");
}
// 更新余量
int rows = siteMapper.reduceCapacity(dto.getSiteId(), dto.getAppointTime());
if(rows == 0) {
throw new ConcurrentUpdateException("预约冲突,请重试");
}
// 创建预约记录...
}
- 消息队列削峰:
- 使用RabbitMQ处理预约请求
- 实现异步通知机制
4.2 安全控制方案
- JWT认证流程:
java复制public String generateToken(User user) {
return Jwts.builder()
.setSubject(user.getUsername())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET)
.compact();
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
return true;
} catch (Exception e) {
log.error("Invalid JWT token", e);
return false;
}
}
- 权限控制:
- 基于Spring Security实现RBAC
- 注解方式控制接口访问
java复制@PreAuthorize("hasRole('ADMIN')")
@PostMapping("/vaccine")
public Result addVaccine(@RequestBody Vaccine vaccine) {
// 管理员专属接口
}
5. 系统部署方案
5.1 环境要求
生产环境推荐配置:
- 服务器:4核8G以上
- JDK:1.8+
- MySQL:8.0+
- Redis:5.0+
- Nginx:最新稳定版
5.2 部署步骤
- 数据库初始化:
bash复制mysql -u root -p < schema.sql
mysql -u root -p < data.sql
- 后端服务部署:
bash复制nohup java -jar vaccine-system.jar --spring.profiles.active=prod > log.out 2>&1 &
- 前端部署:
bash复制npm run build
cp -r dist/* /usr/share/nginx/html/
- Nginx配置示例:
nginx复制server {
listen 80;
server_name vaccine.example.com;
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
}
}
6. 常见问题与解决方案
6.1 性能优化经验
- 数据库优化:
- 为常用查询字段添加索引
- 避免全表扫描
- 合理使用连接查询
- 缓存策略:
java复制// 多级缓存示例
public Vaccine getVaccineById(Long id) {
// 1. 查本地缓存
Vaccine vaccine = localCache.get(id);
if(vaccine != null) return vaccine;
// 2. 查Redis
vaccine = redisTemplate.opsForValue().get("vaccine:"+id);
if(vaccine != null) {
localCache.put(id, vaccine);
return vaccine;
}
// 3. 查数据库
vaccine = vaccineMapper.selectById(id);
if(vaccine != null) {
redisTemplate.opsForValue().set("vaccine:"+id, vaccine, 1, TimeUnit.HOURS);
localCache.put(id, vaccine);
}
return vaccine;
}
6.2 典型问题排查
- 预约超卖问题:
- 现象:同一时段预约数超过最大容量
- 原因:并发情况下库存校验失效
- 解决方案:采用乐观锁+Redis原子操作
- 定时任务异常:
- 现象:库存预警邮件未发送
- 排查步骤:
- 检查任务日志
- 验证邮件配置
- 测试单独执行任务
- 前端跨域问题:
- 现象:接口请求被浏览器拦截
- 解决方案:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*");
}
}
7. 扩展与优化方向
在实际使用过程中,我发现系统还可以在以下几个方面进行增强:
- 智能推荐:基于用户位置和历史记录,推荐最优接种点
- 数据分析:利用接种数据生成区域热力图和趋势预测
- 多平台支持:开发微信小程序、APP等多端应用
- 容灾方案:完善数据库备份和故障转移机制
一个特别实用的优化点是接种点排队预测功能。通过分析历史数据,可以预估各时段的排队时长,帮助用户选择最佳接种时间。这个功能在实测中显著提升了用户体验。