1. 项目背景与核心需求分析
中医理疗馆作为传统医疗健康服务的重要载体,在数字化转型浪潮中面临着管理效率和服务体验的双重挑战。这个基于SpringBoot与Vue的前后端分离管理系统,正是为了解决以下行业痛点而生:
传统中医馆的运营瓶颈主要体现在:
- 手工记录患者档案和理疗方案,易丢失且难以统计分析
- 预约排班依赖电话或现场登记,高峰期易出现混乱
- 药材库存管理缺乏数字化手段,补货时机难以把握
- 医师经验难以沉淀为可复用的知识库
我们设计的系统需要实现四大核心模块:
- 智能预约调度:可视化展示各时段预约情况,自动冲突检测
- 患者全周期管理:从初诊建档到复诊追踪的完整电子病历
- 药材供应链管理:库存预警、采购建议与效期提醒
- 中医知识库:典型病例库、方剂模板与经络穴位数据库
提示:系统设计时要特别注意中医行业的特殊性,如需要支持舌苔照片上传、脉象记录等特色字段,这与普通医疗系统有显著差异。
2. 技术架构设计与选型依据
2.1 前后端分离架构优势
采用SpringBoot+Vue的分离架构,主要基于以下考虑:
- 解耦开发:前端团队可专注界面交互,后端团队专注业务逻辑
- 性能优化:静态资源由Nginx独立部署,减轻应用服务器压力
- 技术栈灵活性:未来可轻松替换前端框架(如React)而不影响后端
技术栈组成:
| 层级 | 技术选型 | 典型应用场景 |
|---|---|---|
| 前端 | Vue3 + Element Plus | 管理后台界面开发 |
| 网关 | Nginx | 负载均衡与静态资源托管 |
| 后端 | SpringBoot 2.7 | RESTful API开发 |
| 数据层 | MyBatis-Plus + MySQL | 数据持久化处理 |
| 安全 | JWT + Spring Security | 认证与授权管理 |
2.2 数据库设计要点
中医理疗业务需要特殊设计的表结构:
sql复制-- 典型表结构示例
CREATE TABLE `tcm_treatment` (
`id` bigint NOT NULL AUTO_INCREMENT,
`patient_id` bigint NOT NULL COMMENT '关联患者ID',
`diagnosis_result` text COMMENT '辨证结论',
`tongue_img` varchar(255) COMMENT '舌象照片路径',
`pulse_condition` varchar(50) COMMENT '脉象描述',
`treatment_method` enum('针灸','推拿','拔罐','艾灸') NOT NULL,
`prescription` json DEFAULT NULL COMMENT '中药处方(JSON格式)',
`follow_up_date` date COMMENT '建议复诊日期',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.3 关键接口设计规范
遵循RESTful设计原则的同时,需考虑中医业务特性:
POST /api/treatments创建理疗记录GET /api/treatments/{id}/meridian获取经络调理方案PATCH /api/prescriptions/{id}调整中药处方
3. 核心功能实现细节
3.1 智能预约调度系统
采用时间片管理算法实现:
java复制// 预约冲突检测核心逻辑
public boolean checkScheduleConflict(LocalDateTime startTime,
int durationMinutes,
Long therapistId) {
List<Appointment> existing = appointmentMapper.selectList(
new QueryWrapper<Appointment>()
.eq("therapist_id", therapistId)
.ge("end_time", startTime)
.le("start_time", startTime.plusMinutes(durationMinutes))
);
return !existing.isEmpty();
}
前端使用FullCalendar组件实现可视化排班:
vue复制<template>
<full-calendar
:options="calendarOptions"
@dateClick="handleDateClick"
@eventClick="handleEventClick"
/>
</template>
3.2 中医特色电子病历
需要处理的多媒体数据类型:
- 舌象照片(Base64编码存储)
- 脉象波形图(WebSocket实时采集)
- 经络检测报告(PDF附件)
使用SpringBoot文件上传组件:
java复制@PostMapping("/tongue-image")
public Result uploadTongueImage(@RequestParam MultipartFile file,
@RequestParam Long patientId) {
String path = fileStorageService.store(file);
tongueImageMapper.insert(new TongueImage(patientId, path));
return Result.success(path);
}
4. 系统部署与性能优化
4.1 生产环境配置建议
推荐部署方案:
code复制前端服务:Nginx (Docker容器化)
后端服务:SpringBoot Jar + JDK17
数据库:MySQL 8.0主从集群
缓存层:Redis 6.2
4.2 中医知识库检索优化
针对药材名称模糊查询的特殊需求:
java复制// 基于拼音助手的模糊查询
public List<Herb> searchHerbs(String keyword) {
QueryWrapper<Herb> wrapper = new QueryWrapper<>();
wrapper.like("name", keyword)
.or()
.like("pinyin", PinyinHelper.getPinyin(keyword));
return herbMapper.selectList(wrapper);
}
4.3 安全防护要点
中医处方数据需要特殊保护措施:
- 敏感字段加密:使用SM4国密算法加密处方内容
- 操作日志审计:记录所有病历修改操作
- 双因素认证:医师登录强制短信验证
5. 典型问题排查实录
5.1 跨域问题解决方案
中医馆常需对接第三方支付和医保系统,需配置精细化CORS策略:
java复制@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("https://clinic.example.com")
.allowedMethods("GET", "POST", "PUT")
.exposedHeaders("X-Auth-Token");
}
}
5.2 药材库存同步异常
使用Spring事务管理保证数据一致性:
java复制@Transactional
public void updateInventory(Long herbId, int quantity) {
herbMapper.updateStock(herbId, quantity);
inventoryLogMapper.insert(new InventoryLog(herbId, quantity));
if (getCurrentStock(herbId) < 0) {
throw new RuntimeException("库存不足");
}
}
在实际开发中,我们发现Element Plus的表格组件在处理500条以上药材数据时会出现渲染性能问题。最终的解决方案是采用虚拟滚动技术,通过vue-virtual-scroller组件实现:
vue复制<template>
<RecycleScroller
class="scroller"
:items="herbList"
:item-size="56"
key-field="id"
>
<template v-slot="{ item }">
<div class="herb-item">
<span>{{ item.name }}</span>
<span>{{ item.stock }}</span>
</div>
</template>
</RecycleScroller>
</template>
对于中医特有的经络穴位数据可视化,我们最终采用了基于D3.js的力导向图来展示穴位关联关系,这比传统的树形结构更符合中医理论中的经络网络概念。在实现过程中需要注意SVG渲染性能优化,建议对大型图谱采用Web Worker进行离线计算
