基于Spring Boot的社区健康体检信息系统
2026/8/24 1:43:18 网站建设 项目流程

一、项目背景与意义

随着我国“健康中国2030”战略的深入推进和人口老龄化进程的加快,基层社区的健康管理服务需求日益凸显。传统的社区健康体检多采用纸质记录、人工统计的方式,存在信息孤岛、数据易丢失、统计分析困难、居民健康档案更新滞后等诸多痛点。构建一个信息化、智能化的社区健康体检管理系统,对于提升基层公共卫生服务效率、实现居民全生命周期健康管理、助力分级诊疗制度落地具有重要的现实意义。

本系统旨在为社区卫生服务中心打造一个集居民档案管理、体检预约登记、项目执行记录、报告生成与解读、健康数据趋势分析于一体的综合管理平台。通过该系统,医护人员可以高效完成体检流程,居民可以便捷查询个人健康档案与报告,管理者可以实时掌握社区整体健康状况,为疾病预防和健康干预提供数据支撑。

二、技术栈选型与架构

2.1 后端技术栈 (Spring Boot)

  • 核心框架: Spring Boot 2.7.x (提供快速启动和自动配置)
  • Web层: Spring MVC (处理HTTP请求)
  • 数据持久层:
    • Spring Data JPA (简化数据库操作)
    • Hibernate (ORM框架)
    • MySQL 8.0 (关系型数据库,存储核心业务数据)
  • 安全与权限: Spring Security + JWT (实现用户认证与接口鉴权)
  • API文档: SpringDoc OpenAPI 3 (Swagger UI,生成在线API文档)
  • 其他工具:
    • Lombok (简化POJO代码)
    • MapStruct (对象转换)
    • Hibernate Validator (参数校验)

2.2 前端技术栈 (可选,供参考)

  • 框架: Vue 3 + Element Plus 或 React + Ant Design
  • 状态管理: Pinia (Vue) 或 Redux Toolkit (React)
  • HTTP客户端: Axios
  • 图表库: ECharts 或 AntV G2 (用于健康数据可视化)

2.3 系统架构概览

系统采用经典的前后端分离架构。前端负责页面渲染和用户交互,通过RESTful API与后端通信。后端采用分层架构:

  • Controller层: 接收请求,参数校验,返回响应。
  • Service层: 核心业务逻辑实现。
  • Repository层: 数据访问接口,由JPA实现。
  • Model/Entity层: 数据实体,与数据库表映射。

同时,引入DTO(Data Transfer Object)进行层间数据传输,避免暴露实体细节。

三、核心功能模块与数据库设计

3.1 核心实体与关系

  • 用户 (User): 系统使用者,包括居民、医生、管理员,继承自同一基类,通过角色(Role)区分权限。
  • 居民健康档案 (ResidentHealthRecord): 核心实体,与用户关联,包含基本信息、既往史、家族史等。
  • 体检套餐 (PhysicalExamPackage): 预定义的体检项目组合。
  • 体检预约 (ExamAppointment): 记录居民预约的套餐、时间、状态。
  • 体检项目结果 (ExamItemResult): 记录每次体检中各个具体项目(如血压、血糖)的测量结果。
  • 体检报告 (ExamReport): 汇总一次体检的所有项目结果,生成总体结论与建议。

3.2 核心表结构示例 (DDL片段)

-- 居民健康档案表 CREATE TABLE `resident_health_record` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_id` bigint NOT NULL COMMENT '关联用户ID', `id_card` varchar(18) NOT NULL COMMENT '身份证号', `name` varchar(50) NOT NULL COMMENT '姓名', `gender` tinyint DEFAULT NULL COMMENT '性别 (0:女, 1:男)', `birth_date` date DEFAULT NULL COMMENT '出生日期', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `address` varchar(200) DEFAULT NULL COMMENT '住址', `allergy_history` text COMMENT '过敏史', `past_medical_history` text COMMENT '既往病史', `family_history` text COMMENT '家族病史', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_user_id` (`user_id`), UNIQUE KEY `uk_id_card` (`id_card`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='居民健康档案'; -- 体检项目结果表 CREATE TABLE exam_item_result ( id bigint NOT NULL AUTO_INCREMENT, appointment_id bigint NOT NULL COMMENT '关联预约ID', item_code varchar(50) NOT NULL COMMENT '项目编码 (如: BP_SYSTOLIC)', item_name varchar(100) NOT NULL COMMENT '项目名称 (如: 收缩压)', result_value varchar(100) DEFAULT NULL COMMENT '结果值', result_unit varchar(20) DEFAULT NULL COMMENT '单位 (如: mmHg)', reference_range varchar(100) DEFAULT NULL COMMENT '参考范围', abnormal_flag tinyint DEFAULT '0' COMMENT '是否异常 (0:正常, 1:异常)', measure_time datetime DEFAULT NULL COMMENT '测量时间', operator_id bigint DEFAULT NULL COMMENT '操作员(医生)ID', PRIMARY KEY (id), KEY idx_appointment_id (appointment_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='体检项目结果';

四、核心代码实现解析

4.1 实体类定义 (使用JPA与Lombok)

import lombok.Data; import javax.persistence.*; import java.time.LocalDate; import java.time.LocalDateTime; @Entity @Table(name = "resident_health_record") @Data public class ResidentHealthRecord { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @OneToOne @JoinColumn(name = "user_id", unique = true, nullable = false) private User user; @Column(name = "id_card", unique = true, nullable = false, length = 18) private String idCard; @Column(nullable = false, length = 50) private String name; @Column private Integer gender; // 0: female, 1: male @Column(name = "birth_date") private LocalDate birthDate; @Column(length = 20) private String phone; @Column(length = 200) private String address; @Lob @Column(name = "allergy_history") private String allergyHistory; @Lob @Column(name = "past_medical_history") private String pastMedicalHistory; @Lob @Column(name = "family_history") private String familyHistory; @Column(name = "create_time", updatable = false) private LocalDateTime createTime; @Column(name = "update_time") private LocalDateTime updateTime; @PrePersist protected void onCreate() { createTime = LocalDateTime.now(); updateTime = LocalDateTime.now(); } @PreUpdate protected void onUpdate() { updateTime = LocalDateTime.now(); } }

4.2 数据访问层 (Spring Data JPA Repository)

import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import java.util.Optional; public interface ResidentHealthRecordRepository extends JpaRepository<ResidentHealthRecord, Long>, JpaSpecificationExecutor<ResidentHealthRecord> { Optional&lt;ResidentHealthRecord&gt; findByIdCard(String idCard); Optional&lt;ResidentHealthRecord&gt; findByUserId(Long userId); boolean existsByIdCard(String idCard); }

4.3 业务逻辑层 (Service)

import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class ResidentHealthRecordService { private final ResidentHealthRecordRepository recordRepository; private final ResidentHealthRecordMapper recordMapper; // MapStruct Mapper /** 创建或更新居民健康档案 */ @Transactional public ResidentHealthRecordDTO createOrUpdateRecord(ResidentHealthRecordCreateDTO createDTO) { // 1. 参数校验 (已通过@Valid) // 2. 检查身份证号是否已存在(更新场景除外) if (createDTO.getId() == null && recordRepository.existsByIdCard(createDTO.getIdCard())) { throw new BusinessException("该身份证号已存在健康档案"); } // 3. DTO 转 Entity ResidentHealthRecord record = recordMapper.toEntity(createDTO); // 4. 关联用户 (此处简化,实际应从安全上下文获取) // record.setUser(currentUser); // 5. 保存 ResidentHealthRecord savedRecord = recordRepository.save(record); // 6. Entity 转 DTO 返回 return recordMapper.toDTO(savedRecord); } /** 根据身份证号查询健康档案 */ public ResidentHealthRecordDTO getRecordByIdCard(String idCard) { return recordRepository.findByIdCard(idCard) .map(recordMapper::toDTO) .orElseThrow(() -> new ResourceNotFoundException("未找到该身份证号的健康档案")); } /** 分页查询居民健康档案 */ public Page&lt;ResidentHealthRecordDTO&gt; getRecordsByPage(RecordQueryDTO queryDTO, Pageable pageable) { Specification&lt;ResidentHealthRecord&gt; spec = buildSpecification(queryDTO); Page&lt;ResidentHealthRecord&gt; recordPage = recordRepository.findAll(spec, pageable); return recordPage.map(recordMapper::toDTO); } private Specification&lt;ResidentHealthRecord&gt; buildSpecification(RecordQueryDTO queryDTO) { return (root, query, cb) -> { List&lt;Predicate&gt; predicates = new ArrayList&lt;&gt;(); if (StringUtils.hasText(queryDTO.getName())) { predicates.add(cb.like(root.get("name"), "%" + queryDTO.getName() + "%")); } if (StringUtils.hasText(queryDTO.getIdCard())) { predicates.add(cb.equal(root.get("idCard"), queryDTO.getIdCard())); } // ... 更多查询条件 return cb.and(predicates.toArray(new Predicate[0])); }; } }

4.4 控制层 (Controller) 与 RESTful API

import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @RestController @RequestMapping("/api/health-records") @RequiredArgsConstructor @Tag(name = "居民健康档案管理", description = "居民健康档案的增删改查接口") public class ResidentHealthRecordController { private final ResidentHealthRecordService recordService; @PostMapping @Operation(summary = "创建或更新健康档案") public ResponseEntity&lt;ResidentHealthRecordDTO&gt; createOrUpdateRecord( @Valid @RequestBody ResidentHealthRecordCreateDTO createDTO) { ResidentHealthRecordDTO result = recordService.createOrUpdateRecord(createDTO); return ResponseEntity.ok(result); } @GetMapping("/{idCard}") @Operation(summary = "根据身份证号查询健康档案") public ResponseEntity&lt;ResidentHealthRecordDTO&gt; getRecordByIdCard(@PathVariable String idCard) { ResidentHealthRecordDTO record = recordService.getRecordByIdCard(idCard); return ResponseEntity.ok(record); } @GetMapping @Operation(summary = "分页查询健康档案") public ResponseEntity&lt;Page&lt;ResidentHealthRecordDTO&gt;&gt; getRecordsByPage( @ModelAttribute RecordQueryDTO queryDTO, @PageableDefault(size = 10, sort = "createTime,desc") Pageable pageable) { Page&lt;ResidentHealthRecordDTO&gt; page = recordService.getRecordsByPage(queryDTO, pageable); return ResponseEntity.ok(page); } }

4.5 体检报告生成服务 (核心业务逻辑示例)

@Service @RequiredArgsConstructor public class ExamReportService { private final ExamAppointmentRepository appointmentRepository; private final ExamItemResultRepository itemResultRepository; /** 生成体检报告 */ @Transactional public ExamReportDTO generateReport(Long appointmentId) { // 1. 获取预约及项目结果 ExamAppointment appointment = appointmentRepository.findById(appointmentId) .orElseThrow(() -> new ResourceNotFoundException("体检预约不存在")); List&lt;ExamItemResult&gt; itemResults = itemResultRepository.findByAppointmentId(appointmentId); // 2. 分析结果,判断异常项 List&lt;ExamItemResultDTO&gt; abnormalItems = itemResults.stream() .filter(ExamItemResult::getAbnormalFlag) .map(this::convertToDTO) .collect(Collectors.toList()); // 3. 生成总体结论与建议 (简化版规则引擎) String overallConclusion = generateConclusion(abnormalItems); String healthAdvice = generateAdvice(abnormalItems); // 4. 组装报告DTO ExamReportDTO report = new ExamReportDTO(); report.setAppointmentId(appointmentId); report.setResidentName(appointment.getResident().getName()); report.setExamDate(appointment.getExamDate()); report.setItemResults(convertToDTOs(itemResults)); report.setAbnormalItems(abnormalItems); report.setOverallConclusion(overallConclusion); report.setHealthAdvice(healthAdvice); report.setGenerateTime(LocalDateTime.now()); report.setDoctorName("系统生成"); // 实际应关联医生 // 5. 可在此处持久化报告实体 (ExamReport) // examReportRepository.save(reportEntity); return report; } private String generateConclusion(List&lt;ExamItemResultDTO&gt; abnormalItems) { if (abnormalItems.isEmpty()) { return "本次体检各项指标均在正常参考范围内,健康状况良好。"; } long criticalCount = abnormalItems.stream() .filter(item -> "CRITICAL".equals(item.getAbnormalLevel())) .count(); if (criticalCount > 0) { return "发现" + criticalCount + "项关键指标异常,建议立即就医复查。"; } return "发现" + abnormalItems.size() + "项指标异常,建议关注并定期复查。"; } // ... 其他方法 }

五、总结与展望

本文详细介绍了基于Spring Boot的社区健康体检信息系统的技术栈选型、架构设计、核心功能与代码实现。该系统利用Spring Boot生态的高效与便捷,快速构建了稳定可靠的后端服务。通过清晰的层次划分与模块化设计,保证了代码的可维护性与可扩展性。

未来可扩展方向包括:

  1. 数据智能化: 集成机器学习模型,对历史体检数据进行趋势预测与疾病风险预警。
  2. 移动端适配: 开发微信小程序或APP,方便居民随时查看报告、接收健康提醒。
  3. 第三方对接: 与区域医疗平台、医保系统对接,实现数据互联互通。
  4. 体检流程无纸化: 结合二维码、PAD等设备,实现全流程电子化操作。

该系统的建设是推动社区健康管理数字化转型的重要一步,能够切实提升基层医疗服务能力,增强居民的健康获得感与幸福感。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询