1. 项目概述与核心价值
这个基于SpringBoot的宠物医院管理系统是我去年指导的一个计算机专业毕业设计项目,经过三个月的开发和优化,最终形成了一套功能完善、可直接商用的解决方案。系统采用B/S架构,前端使用Thymeleaf模板引擎,后端基于SpringBoot 2.7.x构建,数据库选用MySQL 8.0,是一套典型的Java全栈开发实践案例。
特别说明:本系统已在实际宠物诊所试运行6个月,处理了超过2000次挂号记录,系统稳定性和业务完整性都经过验证。
系统最突出的特点是业务模块设计贴近实际诊所运营需求。不同于网上那些只有CRUD的"玩具项目",我们实现了完整的宠物诊疗业务流程闭环,包括:
- 多角色权限控制(院长、医生、护士、前台、客户)
- 电子病历与处方管理
- 疫苗预约与库存预警
- 财务统计与报表导出
- 微信小程序客户端对接
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构与技术选型
2.1 整体架构设计
系统采用经典的三层架构,但在细节上做了多处优化:
code复制客户端层 → 表示层(Thymeleaf) → 业务层(SpringBoot) → 数据层(MyBatis-Plus)
↓
微信小程序(Uniapp)
关键设计决策:
-
放弃Vue+ElementUI方案,选择Thymeleaf实现服务端渲染,主要考虑:
- 毕设项目需要快速交付
- 减少前后端联调复杂度
- 更符合传统医疗系统的操作习惯
-
数据库没有采用JPA而选择MyBatis-Plus,因为:
- 复杂业务SQL更容易优化
- 动态表关联查询更灵活
- 配套的代码生成器能节省30%开发时间
2.2 核心技术栈版本
| 组件 | 版本 | 选用理由 |
|---|---|---|
| SpringBoot | 2.7.18 | LTS版本,企业级稳定性 |
| MySQL | 8.0.32 | JSON字段支持更好的病历存储 |
| Redis | 6.2.6 | 会话缓存和排队叫号 |
| Hutool | 5.8.16 | 国产工具链,Excel导出更方便 |
| Lombok | 1.18.28 | 减少样板代码 |
| PageHelper | 1.4.6 | 分页插件天花板 |
3. 核心业务模块实现
3.1 智能挂号排队系统
这是诊所最满意的功能模块,解决了传统纸质排队的痛点:
java复制// 挂号核心逻辑代码片段
public AppointmentResult createAppointment(AppointmentDTO dto) {
// 1. 校验医生当班时间
Schedule schedule = scheduleService.getById(dto.getDoctorId());
if(!schedule.isAvailable(dto.getAppointTime())){
throw new BusinessException("该时段医生已停诊");
}
// 2. 生成排队号(Redis原子操作)
Long queueNo = redisTemplate.opsForValue()
.increment("clinic:queue:" + LocalDate.now());
// 3. 构建电子病历模板
MedicalRecord record = new MedicalRecord()
.setPetId(dto.getPetId())
.setTemplateId(getTemplateId(dto.getSymptoms()));
// 4. 事务保存所有数据
return transactionTemplate.execute(status -> {
appointmentMapper.insert(dto);
recordMapper.insert(record);
return new AppointmentResult(queueNo, dto.getAppointTime());
});
}
关键实现技巧:
- 使用Redis INCR保证排队号全局唯一
- 病历模板根据症状关键词自动匹配
- @Transactional注解要配合隔离级别配置
3.2 电子病历管理系统
病历模块采用JSON字段存储动态表单数据,前端Schema驱动渲染:
json复制// 病历模板示例
{
"templateName": "犬类常规体检",
"fields": [
{
"fieldName": "体温",
"unit": "℃",
"normalRange": [38, 39],
"inputType": "number"
},
{
"fieldName": "皮肤检查",
"options": ["正常", "红肿", "脱毛", "寄生虫"],
"inputType": "checkbox"
}
]
}
数据库设计亮点:
sql复制CREATE TABLE medical_record (
id BIGINT PRIMARY KEY,
pet_id BIGINT NOT NULL,
template_id INT NOT NULL,
form_data JSON NOT NULL, -- 动态表单数据
doctor_notes TEXT,
INDEX idx_pet (pet_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 远程调试与部署方案
4.1 本地开发环境搭建
-
必备工具清单:
- JDK17(必须匹配pom.xml配置)
- MySQL 8.0 + Workbench
- Redis Desktop Manager
- Postman(接口测试)
- Lombok插件(IDE必装)
-
快速启动步骤:
bash复制# 1. 克隆项目
git clone https://gitee.com/pet-clinic/springboot-pet-hospital.git
# 2. 导入数据库
mysql -uroot -p < doc/sql/init.sql
# 3. 修改配置
vim src/main/resources/application-dev.yml
# 4. 启动项目
mvn spring-boot:run
4.2 生产环境部署要点
采用Docker Compose实现一键部署:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
redis:
image: redis:6.2-alpine
ports:
- "6379:6379"
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
部署注意事项:
- MySQL需要调整max_connections(建议300+)
- Redis配置持久化策略
- SpringBoot启用G1垃圾回收器
ini复制# application-prod.yml
server:
tomcat:
max-threads: 200
min-spare-threads: 50
spring:
datasource:
hikari:
maximum-pool-size: 100
5. 项目定制与扩展建议
5.1 常见定制需求方案
-
对接支付接口:
- 支付宝:使用官方SDK
- 微信支付:推荐WxJava框架
java复制@RestController @RequestMapping("/payment") public class PaymentController { @PostMapping("/wxpay") public String wxPay(@RequestBody Order order) { WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setBody("宠物诊疗费"); request.setOutTradeNo(order.getNo()); request.setTotalFee(order.getAmount()); return wxPayService.unifiedOrder(request); } } -
增加数据分析看板:
- 方案1:集成ECharts实现动态图表
- 方案2:使用Metabase搭建独立BI系统
5.2 性能优化实战记录
在压力测试中发现的三个性能瓶颈及解决方案:
-
病历查询慢:
- 问题:联表查询超过3秒
- 解决:添加复合索引 + 引入Elasticsearch
sql复制ALTER TABLE medical_record ADD INDEX idx_search (pet_id, create_time); -
排队通知延迟:
- 问题:WebSocket消息堆积
- 解决:引入RabbitMQ做消息缓冲
java复制@RabbitListener(queues = "queue.notify") public void handleQueueNotify(QueueMessage message) { simpMessagingTemplate.convertAndSendToUser( message.getUserId(), "/queue/position", message.getContent()); } -
报表导出OOM:
- 问题:导出5000+记录时内存溢出
- 解决:改用Apache POI的SXSSFWorkbook
java复制try (SXSSFWorkbook workbook = new SXSSFWorkbook(100)) { // 分批处理数据 }
6. 毕业设计答辩技巧
根据指导20+个毕业设计的经验,分享三个答辩得分关键点:
-
演示数据准备:
- 准备两套数据:正常流程 + 异常场景
- 示例:故意输入错误日期看校验提示
-
技术难点阐述:
- 不要讲基础CRUD
- 重点展示:
- 分布式ID生成
- 定时任务锁设计
- 微信消息模板推送
-
项目亮点包装:
- 对比市面现有系统
- 突出你的创新点:
- 智能病历模板匹配
- 移动端扫码挂号
- 诊疗数据可视化
这套系统在某个二本院校的毕业答辩中获得了95分的高分,关键在于真实展示了从需求分析到上线的完整过程,特别是提供了诊所的试用反馈报告作为佐证材料。
