基于SSM框架的医院电子病历管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MySQL
2026-02-078 浏览

文章摘要

本系统基于SSM(Spring+Spring MVC+MyBatis)框架构建,旨在为各级医院提供一个标准化、数字化的电子病历管理解决方案。其核心业务价值在于彻底改变传统纸质病历或信息孤岛式管理的低效模式,解决了病历信息记录不规范、查询追溯困难、医护人员协作效率低下以及数据安全难以保障等关键痛点。系...

在医疗信息化快速发展的今天,传统纸质病历管理模式已无法满足现代医疗机构对效率、安全和数据价值挖掘的需求。纸质病历存在易损毁、难检索、信息孤岛等问题,严重制约了医疗服务质量提升。针对这一痛点,我们设计并实现了一套基于SSM框架的医院电子病历管理平台,该平台采用成熟的Java技术栈,为医疗机构提供完整的数字化病历解决方案。

系统架构与技术栈设计

该平台采用经典的三层架构模式,确保系统的高内聚、低耦合特性。表现层使用JSP技术结合jQuery库实现动态页面交互,控制层基于Spring MVC框架处理业务请求,业务逻辑层由Spring框架统一管理,数据持久层则通过MyBatis实现对象关系映射。

技术栈配置示例:

<!-- Spring核心依赖 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.8</version>
</dependency>

<!-- MyBatis集成 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.6</version>
</dependency>

Spring框架的IoC容器负责管理所有Bean的生命周期,通过依赖注入实现各层之间的松耦合。AOP面向切面编程用于统一处理事务管理、日志记录等横切关注点。MyBatis的动态SQL能力极大简化了复杂病历查询条件的拼接操作,提升开发效率。

数据库设计亮点分析

用户权限管理体系

用户表t_yonghu的设计体现了精细化的权限控制思路:

CREATE TABLE `t_yonghu` (
  `yonghuId` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `yonghuName` varchar(255) DEFAULT NULL COMMENT '用户名',
  `yonghuPassword` varchar(255) DEFAULT NULL COMMENT '密码',
  `yonghuXingming` varchar(255) DEFAULT NULL COMMENT '用户姓名',
  `yonghuSex` int(11) DEFAULT NULL COMMENT '用户性别',
  `yonghuAge` int(11) DEFAULT NULL COMMENT '用户年龄',
  `yonghuPhone` varchar(255) DEFAULT NULL COMMENT '用户电话',
  `yonghuImg` varchar(255) DEFAULT NULL COMMENT '用户图片',
  `yhroleId` int(11) DEFAULT NULL COMMENT '角色ID',
  `yhroleName` varchar(255) DEFAULT NULL COMMENT '角色名称',
  `yhbumenId` int(11) DEFAULT NULL COMMENT '部门ID',
  `yhbumenName` varchar(255) DEFAULT NULL COMMENT '部门名称',
  PRIMARY KEY (`yonghuId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='用户表'

该表通过yhroleIdyhbumenId分别关联角色表和部门表,实现基于RBAC(基于角色的访问控制)的权限管理。值得注意的是,表中同时存储了角色名称和部门名称的冗余字段,这种设计虽然不符合第三范式,但在查询性能上具有明显优势,避免了多表连接操作。

扩展性良好的类型系统

类型表t_yxtype采用通用设计模式,支持系统未来的功能扩展:

CREATE TABLE `t_yxtype` (
  `yxtypeId` int(11) NOT NULL AUTO_INCREMENT COMMENT '类型ID',
  `yxtypeName` varchar(255) DEFAULT NULL COMMENT '类型名称',
  `yxtypeMark` varchar(255) DEFAULT NULL COMMENT '类型备注',
  PRIMARY KEY (`yxtypeId`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='类型表'

这种设计允许系统动态添加新的病历类型、诊断类型等,无需修改数据库结构。通过yxtypeMark字段提供额外的描述信息,增强了系统的可配置性。

医生登录界面

核心功能实现解析

多角色登录与权限控制

系统支持管理员、医生等不同角色的登录验证,通过Spring拦截器实现统一的权限校验:

@Component
public class AuthInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        
        HttpSession session = request.getSession();
        Integer roleId = (Integer) session.getAttribute("yhroleId");
        String requestURI = request.getRequestURI();
        
        // 权限验证逻辑
        if (roleId == null) {
            response.sendRedirect("/login");
            return false;
        }
        
        // 医生角色只能访问特定功能
        if (roleId == 2 && requestURI.contains("/admin/")) {
            response.sendRedirect("/accessDenied");
            return false;
        }
        
        return true;
    }
}

病历信息管理功能

病历管理模块采用面向对象的设计思想,实体类与数据库表严格映射:

@Entity
@Table(name = "t_bingli")
public class MedicalRecord {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer recordId;
    
    private String patientName;
    private String diagnosis;
    private String treatment;
    private Date createTime;
    private Integer doctorId;
    
    // 关联患者信息
    @ManyToOne
    @JoinColumn(name = "patientId")
    private Patient patient;
    
    // Getter和Setter方法
    public Integer getRecordId() { return recordId; }
    public void setRecordId(Integer recordId) { this.recordId = recordId; }
    
    // 其他getter/setter方法...
}

对应的MyBatis映射文件实现了复杂的查询逻辑:

<mapper namespace="com.hospital.mapper.MedicalRecordMapper">
    
    <select id="selectByConditions" parameterType="map" 
            resultType="MedicalRecord">
        SELECT r.*, p.patientName, d.doctorName
        FROM t_bingli r
        LEFT JOIN t_huanzhe p ON r.patientId = p.patientId
        LEFT JOIN t_doctor d ON r.doctorId = d.doctorId
        <where>
            <if test="patientName != null and patientName != ''">
                AND p.patientName LIKE CONCAT('%', #{patientName}, '%')
            </if>
            <if test="startDate != null">
                AND r.createTime >= #{startDate}
            </if>
            <if test="endDate != null">
                AND r.createTime <= #{endDate}
            </if>
        </where>
        ORDER BY r.createTime DESC
    </select>
    
</mapper>

病历管理界面

统计分析与报表生成

系统提供强大的数据统计功能,Spring Service层处理复杂的业务逻辑:

@Service
@Transactional
public class StatisticsService {
    
    @Autowired
    private MedicalRecordMapper recordMapper;
    
    public Map<String, Object> getDepartmentStatistics(Date startDate, Date endDate) {
        Map<String, Object> params = new HashMap<>();
        params.put("startDate", startDate);
        params.put("endDate", endDate);
        
        // 科室病例统计
        List<Map<String, Object>> deptStats = 
            recordMapper.countRecordsByDepartment(params);
        
        // 疾病类型统计
        List<Map<String, Object>> diseaseStats = 
            recordMapper.countRecordsByDiseaseType(params);
            
        Map<String, Object> result = new HashMap<>();
        result.put("departmentStats", deptStats);
        result.put("diseaseStats", diseaseStats);
        
        return result;
    }
}

对应的Controller层处理HTTP请求并返回JSON数据:

@RestController
@RequestMapping("/api/statistics")
public class StatisticsController {
    
    @Autowired
    private StatisticsService statisticsService;
    
    @GetMapping("/department")
    public ResponseEntity<Map<String, Object>> getDepartmentStats(
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
            @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) {
        
        try {
            Map<String, Object> stats = 
                statisticsService.getDepartmentStatistics(startDate, endDate);
            return ResponseEntity.ok(stats);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }
}

统计报表界面

实体模型设计策略

系统采用领域驱动设计(DDD)思想,将业务概念转化为实体模型。用户实体包含完整的身份信息和权限数据:

public class User {
    private Integer yonghuId;
    private String yonghuName;
    private String yonghuPassword;
    private String yonghuXingming;
    private Integer yonghuSex;
    private Integer yonghuAge;
    private String yonghuPhone;
    
    // 角色和部门信息
    private Integer yhroleId;
    private String yhroleName;
    private Integer yhbumenId;
    private String yhbumenName;
    
    // 业务方法
    public boolean hasPermission(String permissionCode) {
        // 基于角色的权限验证逻辑
        return rolePermissions.get(yhroleId).contains(permissionCode);
    }
    
    public boolean isInDepartment(Integer departmentId) {
        return yhbumenId.equals(departmentId);
    }
}

这种设计使得业务逻辑更加清晰,实体对象不仅包含数据,还封装了相关的业务行为。

功能展望与系统优化方向

缓存机制优化

当前系统在频繁查询场景下存在性能瓶颈,未来可引入Redis缓存层:

@Service
public class CachedMedicalRecordService {
    
    @Autowired
    private RedisTemplate<String, MedicalRecord> redisTemplate;
    @Autowired
    private MedicalRecordMapper recordMapper;
    
    private static final String CACHE_PREFIX = "medical_record:";
    
    public MedicalRecord getById(Integer recordId) {
        String cacheKey = CACHE_PREFIX + recordId;
        MedicalRecord record = redisTemplate.opsForValue().get(cacheKey);
        
        if (record == null) {
            record = recordMapper.selectById(recordId);
            if (record != null) {
                redisTemplate.opsForValue().set(cacheKey, record, 
                    Duration.ofMinutes(30));
            }
        }
        return record;
    }
}

微服务架构改造

随着业务规模扩大,可将单体应用拆分为微服务架构:

# docker-compose.yml 微服务配置示例
version: '3.8'
services:
  user-service:
    image: hospital/user-service:1.0
    ports:
      - "8081:8080"
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/hospital_user
  
  medical-record-service:
    image: hospital/record-service:1.0
    ports:
      - "8082:8080"
    depends_on:
      - user-service

移动端适配与响应式设计

增加移动端支持,采用响应式前端框架:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>电子病历平台</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container-fluid">
        <div class="row">
            <div class="col-12 col-md-3 sidebar">
                <!-- 响应式侧边栏 -->
            </div>
            <div class="col-12 col-md-9 main-content">
                <!-- 主要内容区域 -->
            </div>
        </div>
    </div>
</body>
</html>

大数据分析集成

集成大数据分析平台,实现医疗数据深度挖掘:

@Service
public class DataAnalysisService {
    
    public void exportMedicalDataForAnalysis() {
        // 将病历数据导出到Hadoop或Spark进行分析
        List<MedicalRecord> records = recordMapper.selectAllForAnalysis();
        
        // 生成医疗质量指标报告
        MedicalQualityReport report = 
            dataAnalyzer.generateQualityReport(records);
        
        // 存储分析结果
        reportRepository.save(report);
    }
}

安全增强措施

加强系统安全性,增加数据加密和操作审计:

@Component
public class SecurityEnhancedService {
    
    @Autowired
    private PasswordEncoder passwordEncoder;
    
    public String encryptSensitiveData(String data) {
        // 使用AES加密敏感医疗数据
        return aesEncryptor.encrypt(data);
    }
    
    public void auditUserAction(Integer userId, String action) {
        AuditLog log = new AuditLog();
        log.setUserId(userId);
        log.setAction(action);
        log.setTimestamp(new Date());
        log.setIpAddress(getClientIp());
        auditLogRepository.save(log);
    }
}

医生工作站界面

总结

该医院电子病历管理平台通过SSM框架的有机整合,构建了一个稳定、高效、易扩展的医疗信息管理系统。系统在数据库设计上充分考虑了医疗业务的特殊性,采用了合理的表结构设计和索引优化。在功能实现方面,通过精细的权限控制和模块化设计,满足了不同角色的使用需求。

平台的技术架构具有良好的扩展性,为后续的功能增强和技术升级奠定了坚实基础。通过引入缓存机制、微服务改造、移动端适配等优化措施,可以进一步提升系统的性能和用户体验。这套解决方案不仅解决了当前医疗机构的病历管理痛点,更为未来的智慧医疗建设提供了可靠的技术支撑。

本文关键词
SSM框架电子病历管理系统医院信息化源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章