1. 项目背景与核心需求
医院体检管理系统作为医疗信息化建设的重要组成部分,其核心价值在于实现体检业务流程的数字化、标准化和智能化管理。传统体检机构普遍面临以下痛点:
- 手工登记效率低下,高峰期排队现象严重
- 检查结果分散在各科室,难以统一归档
- 报告生成周期长,医生工作负荷大
- 缺乏数据分析能力,难以挖掘健康趋势
基于SpringBoot的解决方案具有天然优势:
- 快速开发特性可缩短项目周期
- 自动配置机制降低技术复杂度
- 丰富的starter生态便于功能扩展
- 内嵌Tomcat简化部署流程
提示:选择SpringBoot作为毕业设计技术栈时,建议版本控制在2.7.x系列,这是目前企业应用最稳定的LTS版本。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型
| 层级 | 技术方案 | 选型理由 |
|---|---|---|
| 前端 | Thymeleaf + Bootstrap | 服务端渲染适合管理系统类项目,降低前后端分离带来的复杂度 |
| 持久层 | MyBatis + PageHelper | 灵活SQL编写适合复杂业务查询,分页插件简化开发 |
| 安全控制 | Spring Security | 提供完善的认证授权机制,支持RBAC模型 |
| 缓存 | Redis | 高频访问数据(如科室信息)缓存,提升系统响应速度 |
| 文件处理 | Apache POI + EasyExcel | 支持体检报告导出为Excel/PDF格式 |
| 消息队列 | RabbitMQ | 异步处理大批量体检数据导入/导出任务 |
2.2 模块划分
code复制com.hospital.healthcheck
├── config - 安全/异常处理配置
├── controller - 体检业务API入口
├── service - 核心业务逻辑层
│ ├── impl - 服务实现
├── dao - 数据持久层
├── entity - 领域模型
├── util - 工具类库
├── exception - 自定义异常
└── task - 定时任务
3. 核心功能实现
3.1 体检预约模块
采用策略模式处理不同用户类型的预约规则:
java复制public interface AppointmentStrategy {
boolean validate(AppointmentDTO dto);
}
@Service
@RequiredArgsConstructor
public class AppointmentService {
private final Map<String, AppointmentStrategy> strategyMap;
public String createAppointment(AppointmentDTO dto) {
String userType = dto.getUserType();
strategyMap.get(userType + "Strategy").validate(dto);
// 持久化逻辑...
}
}
关键业务约束:
- 团体预约需提前3个工作日
- VIP客户可预约当天号源
- 同一项目7天内不可重复预约
3.2 检查结果录入
使用责任链模式实现结果校验:
java复制public abstract class ResultValidator {
protected ResultValidator next;
public void setNext(ResultValidator next) {
this.next = next;
}
public abstract void validate(CheckItem item);
}
// 具体校验器实现
public class RangeValidator extends ResultValidator {
@Override
public void validate(CheckItem item) {
if(item.getValue() < item.getMin() || item.getValue() > item.getMax()) {
throw new BizException("数值超出正常范围");
}
if(next != null) next.validate(item);
}
}
3.3 报告生成优化
采用模板引擎+异步生成方案:
- 使用Freemarker定义报告模板
- 通过RabbitMQ异步处理生成任务
- 生成完成后通过WebSocket通知前端
java复制@RabbitListener(queues = "report.queue")
public void generateReport(ReportTask task) {
Map<String, Object> data = buildReportData(task);
String html = templateEngine.process("report_template", data);
pdfGenerator.generate(html, task.getSavePath());
wsHandler.sendNotify(task.getUserId(), "REPORT_READY");
}
4. 数据库设计要点
4.1 核心表结构
sql复制CREATE TABLE `t_check_project` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '项目名称',
`category` tinyint NOT NULL COMMENT '1常规 2专项',
`price` decimal(10,2) NOT NULL,
`department_id` int NOT NULL COMMENT '执行科室',
`ref_range` json DEFAULT NULL COMMENT '参考值范围',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='体检项目表';
CREATE TABLE `t_appointment` (
`id` varchar(32) NOT NULL,
`user_id` bigint NOT NULL,
`mobile` varchar(20) NOT NULL,
`appoint_date` date NOT NULL,
`time_slot` tinyint NOT NULL COMMENT '时间段',
`status` tinyint DEFAULT '0' COMMENT '0待确认 1已预约 2已取消',
`create_time` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_date` (`user_id`,`appoint_date`)
) ENGINE=InnoDB COMMENT='预约记录';
4.2 性能优化实践
- 体检结果表按年度分表:
t_check_result_2023 - 建立组合索引加速查询:
sql复制ALTER TABLE t_check_record ADD INDEX `idx_user_project` (`user_id`, `project_id`); - 大文本字段(如影像报告)单独存储
5. 典型业务场景实现
5.1 体检套餐组合
使用装饰器模式实现灵活组合:
java复制public interface HealthPackage {
String getName();
BigDecimal getPrice();
List<CheckProject> getProjects();
}
public class BasicPackage implements HealthPackage {
// 基础实现
}
public class PackageDecorator implements HealthPackage {
private final HealthPackage wrapped;
public PackageDecorator(HealthPackage wrapped) {
this.wrapped = wrapped;
}
@Override
public String getName() {
return wrapped.getName();
}
// 其他方法默认实现...
}
public class MaleDecorator extends PackageDecorator {
public MaleDecorator(HealthPackage wrapped) {
super(wrapped);
}
@Override
public List<CheckProject> getProjects() {
List<CheckProject> list = super.getProjects();
list.addAll(getMaleSpecificProjects());
return list;
}
}
5.2 异常结果预警
基于规则引擎实现:
java复制@Scheduled(cron = "0 0 18 * * ?")
public void checkAbnormalResults() {
List<CheckResult> results = resultMapper.selectUnprocessedAbnormal();
results.forEach(result -> {
RuleEngineInput input = buildRuleInput(result);
RuleEngineOutput output = ruleEngine.execute(input);
if(output.isNeedAlert()) {
alertService.sendSms(result.getUserId(), output.getSuggestions());
}
});
}
6. 安全防护方案
6.1 敏感数据保护
- 体检结果加密存储:
java复制@ColumnTransformer(
read = "AES_DECRYPT(UNHEX(result_value), '${aes.key}')",
write = "HEX(AES_ENCRYPT(?, '${aes.key}'))"
)
private String resultValue;
- 接口权限控制示例:
java复制@PreAuthorize("hasRole('DOCTOR') || #userId == authentication.principal.id")
@GetMapping("/results/{userId}")
public List<CheckResult> getUserResults(@PathVariable Long userId) {
return resultService.getByUser(userId);
}
6.2 防XSS攻击
- 全局过滤器处理参数:
java复制@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain chain) {
String[] sensitiveWords = {"script", "javascript", "eval"};
for(String word : sensitiveWords) {
if(request.getQueryString().contains(word)) {
throw new SecurityException("包含危险参数");
}
}
chain.doFilter(new XssRequestWrapper(request), response);
}
- PDF导出安全处理:
java复制public void sanitizePdfContent(String html) {
PolicyFactory policy = new HtmlPolicyBuilder()
.allowElements("p", "table", "tr", "td")
.allowAttributes("class").onElements("table")
.toFactory();
return policy.sanitize(html);
}
7. 毕业设计扩展建议
- 健康趋势分析:集成ECharts实现可视化
- 移动端适配:开发微信小程序预约入口
- 智能推荐:基于历史数据推荐体检项目
- 体检报告OCR:支持纸质报告扫描录入
- 数据大屏:展示实时体检数据看板
实现数据看板的代码片段:
java复制@GetMapping("/dashboard")
public DashboardVO getDashboardData() {
return new DashboardVO(
appointmentService.getTodayCount(),
resultService.getAbnormalRate(),
projectService.getTopProjects(5)
);
}
注意事项:毕业设计答辩时应重点展示技术选型的合理性、解决的实际问题,以及相比传统方案的改进点。建议录制系统主要功能演示视频作为备用方案。
