技术栈选择

后端框架: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改用线程池处理异步任务

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐