温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着中医药事业的快速发展,传统中医诊所面临患者信息管理分散、处方记录纸质化、复诊跟踪困难等痛点。传统的人工挂号、手写病历和纸质处方不仅效率低下,还容易出现信息丢失、数据难以统计等问题。建设一套面向中医诊所的信息管理系统,能够将患者档案、辨证论治记录、中药处方、复诊随访等核心业务数字化,帮助诊所提升运营效率、规范诊疗流程,并为后续的数据分析和科研积累提供基础。
本系统基于 Java Spring Boot 框架开发,采用前后端分离架构,后端提供 RESTful API,前端通过 Web 页面进行交互。系统覆盖诊所日常诊疗的核心环节,包括患者管理、医生排班、挂号预约、病历记录、中药处方开具、收费结算和统计分析等模块,具有较强的实用性和可扩展性。
2. 系统技术栈
本系统采用成熟稳定的 Java 生态技术栈,兼顾开发效率与运行性能,具体如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | Spring Boot 2.7 | 快速构建独立运行的 Web 服务,简化配置 |
| 持久层框架 | MyBatis-Plus | 简化 CRUD 操作,内置分页与条件构造器 |
| 数据库 | MySQL 8.0 | 存储患者、医生、处方等业务数据 |
| 权限认证 | Spring Security + JWT | 实现登录认证与接口权限控制 |
| 接口文档 | Knife4j(Swagger 增强) | 自动生成在线接口文档,便于前后端联调 |
| 前端框架 | Vue 3 + Element Plus | 构建管理后台界面,组件丰富、开发高效 |
| 构建工具 | Maven | 管理项目依赖与构建打包 |
| 缓存 | Spring Data Redis | 缓存热点数据,如医生排班信息 |
3. 系统核心功能模块
系统围绕中医诊所日常业务,划分为以下核心功能模块:
- 患者管理:维护患者基本信息、过敏史、既往病史,支持按姓名、手机号快速检索。
- 医生管理:管理医生档案、职称、擅长领域和排班信息。
- 挂号预约:支持线上预约与现场挂号,自动校验号源余量。
- 病历管理:记录四诊信息(望闻问切)、辨证分型、治则治法。
- 处方管理:开具中药处方,支持药材明细、剂量、用法用量录入,自动计算金额。
- 收费结算:对接处方与诊疗项目,生成收费单并记录支付状态。
- 统计分析:按日、按月统计就诊人次、处方量、营收等核心指标。
4. 数据库设计
系统核心数据表包括患者表、医生表、挂号表、病历表、处方表、处方明细表和收费表。下面给出患者表和处方明细表的核心结构设计。
-- 患者信息表 CREATE TABLE patient ( id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL COMMENT '患者姓名', gender TINYINT COMMENT '性别 0-女 1-男', phone VARCHAR(20) COMMENT '手机号', birth_date DATE COMMENT '出生日期', allergy_history VARCHAR(255) COMMENT '过敏史', medical_history TEXT COMMENT '既往病史', created_time DATETIME DEFAULT CURRENT_TIMESTAMP, updated_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- 处方明细表 CREATE TABLE prescription_item ( id BIGINT PRIMARY KEY AUTO_INCREMENT, prescription_id BIGINT NOT NULL COMMENT '处方主表ID', herb_name VARCHAR(50) NOT NULL COMMENT '药材名称', dosage DECIMAL(8,2) COMMENT '剂量(克)', unit VARCHAR(20) COMMENT '单位', price DECIMAL(8,2) COMMENT '单价', amount DECIMAL(8,2) COMMENT '金额小计', remark VARCHAR(255) COMMENT '备注(如先煎、后下)' );5. 核心代码实现
下面选取系统中最具代表性的几个核心代码片段进行说明,包括实体类、挂号接口、处方开具和 JWT 认证过滤器。
5.1 患者实体类
@Data @TableName("patient") public class Patient { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer gender; private String phone; private LocalDate birthDate; private String allergyHistory; private String medicalHistory; private LocalDateTime createdTime; private LocalDateTime updatedTime; }5.2 挂号预约接口
@RestController @RequestMapping("/api/registration") public class RegistrationController { @Resource private RegistrationService registrationService; @PostMapping("/appoint") public Result<Long> appoint(@RequestBody RegistrationDTO dto) { // 校验号源余量,若已满则返回业务异常 Long registrationId = registrationService.createAppointment(dto); return Result.success(registrationId); } }5.3 处方开具服务
@Service public class PrescriptionServiceImpl implements PrescriptionService { @Resource private PrescriptionMapper prescriptionMapper; @Resource private PrescriptionItemMapper itemMapper; @Override @Transactional(rollbackFor = Exception.class) public Long createPrescription(PrescriptionDTO dto) { // 1. 保存处方主表 Prescription prescription = new Prescription(); prescription.setPatientId(dto.getPatientId()); prescription.setDoctorId(dto.getDoctorId()); prescription.setDiagnosis(dto.getDiagnosis()); prescription.setTotalAmount(dto.getItems().stream() .map(PrescriptionItemDTO::getAmount) .reduce(BigDecimal.ZERO, BigDecimal::add)); prescriptionMapper.insert(prescription); // 2. 保存处方明细 for (PrescriptionItemDTO itemDTO : dto.getItems()) { PrescriptionItem item = new PrescriptionItem(); item.setPrescriptionId(prescription.getId()); item.setHerbName(itemDTO.getHerbName()); item.setDosage(itemDTO.getDosage()); item.setUnit(itemDTO.getUnit()); item.setPrice(itemDTO.getPrice()); item.setAmount(itemDTO.getAmount()); item.setRemark(itemDTO.getRemark()); itemMapper.insert(item); } return prescription.getId(); } }5.4 JWT 认证过滤器
@Component public class JwtAuthenticationFilter extends OncePerRequestFilter { @Resource private JwtTokenProvider tokenProvider; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String token = resolveToken(request); if (token != null && tokenProvider.validateToken(token)) { String username = tokenProvider.getUsername(token); // 将用户信息放入 SecurityContext,供后续接口鉴权使用 UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>()); SecurityContextHolder.getContext().setAuthentication(authentication); } chain.doFilter(request, response); } private String resolveToken(HttpServletRequest request) { String bearer = request.getHeader("Authorization"); if (bearer != null && bearer.startsWith("Bearer ")) { return bearer.substring(7); } return null; } }6. 系统架构与部署
系统采用经典的前后端分离架构。前端 Vue 应用通过 Nginx 部署,后端 Spring Boot 服务以 Jar 包形式运行,数据库使用 MySQL,缓存使用 Redis。前后端通过 RESTful API 通信,接口统一返回 Result 包装对象,包含状态码、消息和数据三部分,便于前端统一处理异常。
在部署层面,后端服务可通过 Docker 容器化部署,配合 Docker Compose 一键编排 MySQL、Redis 和应用服务,降低环境搭建成本。生产环境建议启用 HTTPS,并将 JWT 密钥、数据库密码等敏感配置放入环境变量或配置中心管理。
7. 总结与展望
本文围绕基于 Java Spring Boot 的中医诊所信息管理系统,介绍了项目的背景意义、技术选型、核心功能模块、数据库设计以及关键代码实现。该系统能够有效提升中医诊所的数字化管理水平,规范诊疗流程,减少人工差错。
后续可在现有基础上进一步扩展智能辨证辅助、中药库存管理、电子病历共享、移动端患者服务等能力,并结合大数据分析为诊所运营决策提供更深入的支持。