基于spring boot的小型诊疗预约平台设计开发实现
Vue 3 + Element Plus(可选前后端分离架构):MySQL 8.0(关系型) + Redis(缓存):Spring Boot 2.7.x(稳定版):Swagger 3.0(API文档生成):RabbitMQ(预约提醒异步处理)
·
技术栈选择
后端框架:Spring Boot 2.7.x(稳定版)
数据库:MySQL 8.0(关系型) + Redis(缓存)
安全框架:Spring Security + JWT
前端技术:Vue 3 + Element Plus(可选前后端分离架构)
消息队列:RabbitMQ(预约提醒异步处理)
文档工具:Swagger 3.0(API文档生成)
测试工具:JUnit 5 + Mockito + Postman
核心功能模块设计
1. 用户管理模块
- 角色划分:患者、医生、管理员
- 功能:注册/登录、密码重置、个人信息维护
- 技术实现:Spring Security的
UserDetailsService扩展
2. 预约管理模块
- 患者端:
- 科室医生查询(Elasticsearch 可选)
- 可预约时段展示(基于Redis缓存)
- 预约提交(MySQL事务控制)
- 医生端:
- 预约列表查看
- 预约状态变更(确认/取消)
3. 排班管理模块
- 管理员端:
- 医生排班CRUD
- 冲突检测(自定义注解
@ScheduleConflictCheck)
- 患者端:
- 可视化排班表(Vue日历组件)
4. 支付与通知模块
- 支付集成:支付宝沙箱API
- 消息通知:
- SMS(阿里云短信服务)
- 站内信(WebSocket实时推送)
数据库设计(关键表)
用户表 user
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) UNIQUE NOT NULL,
`password` VARCHAR(100) NOT NULL,
`role` ENUM('PATIENT','DOCTOR','ADMIN') NOT NULL,
`phone` VARCHAR(20) NOT NULL
);
排班表 schedule
CREATE TABLE `schedule` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`doctor_id` BIGINT NOT NULL,
`day_of_week` TINYINT NOT NULL COMMENT '1-7对应周一到周日',
`start_time` TIME NOT NULL,
`end_time` TIME NOT NULL,
FOREIGN KEY (`doctor_id`) REFERENCES `user`(`id`)
);
预约表 appointment
CREATE TABLE `appointment` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`patient_id` BIGINT NOT NULL,
`schedule_id` BIGINT NOT NULL,
`status` ENUM('PENDING','CONFIRMED','CANCELLED') DEFAULT 'PENDING',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (`patient_id`) REFERENCES `user`(`id`),
FOREIGN KEY (`schedule_id`) REFERENCES `schedule`(`id`)
);
关键代码示例
JWT鉴权过滤器
public class JwtFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) {
String token = request.getHeader("Authorization");
if (StringUtils.hasText(token) && token.startsWith("Bearer ")) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(token.substring(7))
.getBody();
SecurityContextHolder.getContext()
.setAuthentication(new UsernamePasswordAuthenticationToken(
claims.getSubject(),
null,
AuthorityUtils.createAuthorityList(claims.get("role").toString())
));
}
chain.doFilter(request, response);
}
}
预约冲突检查注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ScheduleConflictCheck {
String doctorIdParam() default "doctorId";
String timeParam() default "startTime";
}
测试方案设计
1. 单元测试
- Service层:Mock数据库操作
@Test
void testCreateAppointment() {
when(patientRepository.findById(any())).thenReturn(Optional.of(new Patient()));
when(scheduleRepository.findById(any())).thenReturn(Optional.of(new Schedule()));
Appointment result = appointmentService.create(new AppointmentDTO());
assertNotNull(result.getId());
}
2. 集成测试
- 使用
@SpringBootTest测试API端点 - 示例:预约提交测试
@Test
void postAppointmentShouldReturn201() throws Exception {
mockMvc.perform(post("/api/appointments")
.contentType(MediaType.APPLICATION_JSON)
.content("{ \"patientId\":1, \"scheduleId\":1 }"))
.andExpect(status().isCreated());
}
3. 压力测试
- JMeter模拟高并发预约场景
- 监测指标:
- 数据库连接池活跃数(HikariCP监控)
- Redis缓存命中率
部署建议
容器化方案:
- Docker Compose编排MySQL+Redis+Spring Boot应用
- Nginx配置前端静态资源与API反向代理
监控方案:
- Prometheus + Grafana监控JVM指标
- ELK日志收集系统
以上方案可根据实际需求调整规模,例如:
- 小型诊所可简化支付模块为线下支付
- 单机部署可去掉RabbitMQ改用线程池处理异步任务







更多推荐
所有评论(0)