作为一名有多年Java开发经验的程序员,我最近完成了一个基于Spring Boot的宠物医院管理系统毕业设计项目。这个系统旨在为宠物医院提供一个高效便捷的信息化管理平台,整合了宠物档案管理、预约挂号、医生信息查询、宠物美容服务等核心功能模块。
在实际开发过程中,我发现宠物医院的信息化管理需求日益增长,但市面上成熟的解决方案并不多。通过这个项目,我不仅巩固了Spring Boot框架的使用技巧,还深入理解了宠物医疗行业的业务流程。系统采用B/S架构,前端使用Vue.js,后端基于Spring Boot,数据库选用MySQL,实现了多角色权限管理,包括普通用户、医生用户、护士用户和管理员四种角色。
在技术选型上,我主要考虑了以下几个因素:
后端技术栈:
前端技术栈:
系统采用典型的分层架构设计:
code复制┌───────────────────────────────────────┐
│ 表现层(View) │
│ ┌───────────────────────────────┐ │
│ │ Vue.js前端 │ │
└───┴───────────────────────────────┴──┘
↑↓
┌───────────────────────────────────────┐
│ 控制层(Controller) │
│ ┌───────────────────────────────┐ │
│ │ Spring MVC控制器 │ │
└───┴───────────────────────────────┴──┘
↑↓
┌───────────────────────────────────────┐
│ 服务层(Service) │
│ ┌───────────────────────────────┐ │
│ │ 业务逻辑处理 │ │
└───┴───────────────────────────────┴──┘
↑↓
┌───────────────────────────────────────┐
│ 持久层(DAO) │
│ ┌───────────────────────────────┐ │
│ │ MyBatis-Plus │ │
└───┴───────────────────────────────┴──┘
↑↓
┌───────────────────────────────────────┐
│ 数据库层 │
│ ┌───────────────────────────────┐ │
│ │ MySQL │ │
└───┴───────────────────────────────┴──┘
这种分层架构的优势在于:
系统采用RBAC(基于角色的访问控制)模型设计权限系统,包含以下核心表:
权限控制实现要点:
java复制// 示例:自定义权限注解
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@PreAuthorize("hasAnyRole('ADMIN', 'DOCTOR')")
public @interface DoctorOrAdminRequired {
}
// 在Controller方法上使用
@DoctorOrAdminRequired
@PostMapping("/appointments")
public ResponseEntity<?> createAppointment(@RequestBody AppointmentDTO dto) {
// 业务逻辑
}
宠物档案是系统的核心数据之一,设计时考虑了以下方面:
数据库表设计:
sql复制CREATE TABLE `pet_profile` (
`pet_profile_id` int NOT NULL AUTO_INCREMENT,
`ordinary_users` int DEFAULT NULL COMMENT '普通用户ID',
`user_name` varchar(64) DEFAULT NULL COMMENT '用户姓名',
`pet_name` varchar(64) DEFAULT NULL COMMENT '宠物名称',
`pet_species` varchar(64) DEFAULT NULL COMMENT '宠物种类',
`pet_age` varchar(64) DEFAULT NULL COMMENT '宠物年龄',
`pet_weight` varchar(64) DEFAULT NULL COMMENT '宠物体重',
`pet_gender` varchar(64) DEFAULT NULL COMMENT '宠物性别',
`pet_fur_color` varchar(64) DEFAULT NULL COMMENT '宠物毛色',
`vaccination_records` text COMMENT '疫苗接种记录',
`medical_history` text COMMENT '病史记录',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`pet_profile_id`),
KEY `idx_user` (`ordinary_users`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
业务逻辑实现要点:
预约挂号是系统的核心业务流程,涉及以下关键点:
状态机设计:
code复制[新建] → [待支付] → [已预约] → [就诊中] → [已完成]
↓ ↓
[取消预约] [缺席]
数据库表设计:
sql复制CREATE TABLE `make_an_appointment_for_registration` (
`make_an_appointment_for_registration_id` int NOT NULL AUTO_INCREMENT,
`doctor_users` int DEFAULT NULL COMMENT '医生用户ID',
`doctors_name` varchar(64) DEFAULT NULL COMMENT '医生姓名',
`doctors_department` varchar(64) DEFAULT NULL COMMENT '医生科室',
`ordinary_users` int DEFAULT NULL COMMENT '普通用户ID',
`pet_name` varchar(64) DEFAULT NULL COMMENT '宠物名称',
`appointment_time` datetime DEFAULT NULL COMMENT '预约时间',
`status` varchar(16) NOT NULL DEFAULT 'NEW' COMMENT '状态:NEW,PAID,CONFIRMED,CANCELLED,COMPLETED,ABSENT',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`make_an_appointment_for_registration_id`),
KEY `idx_doctor` (`doctor_users`),
KEY `idx_user` (`ordinary_users`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
业务逻辑实现要点:
在系统测试阶段,我们发现当多个用户同时预约同一位医生的同一时段时,会出现超预约的情况。解决方案是:
java复制@Transactional
public boolean makeAppointment(AppointmentDTO dto) {
// 1. 查询医生该时段剩余可预约数量
DoctorSchedule schedule = doctorScheduleMapper.selectForUpdate(dto.getDoctorId(), dto.getTimeSlot());
if (schedule.getAvailableCount() <= 0) {
throw new BusinessException("该时段已约满");
}
// 2. 减少可预约数量
int updated = doctorScheduleMapper.reduceAvailableCount(schedule.getId(), schedule.getVersion());
if (updated == 0) {
throw new ConcurrentBookingException("预约冲突,请重试");
}
// 3. 创建预约记录
Appointment appointment = convertToEntity(dto);
appointmentMapper.insert(appointment);
return true;
}
java复制public boolean makeAppointmentWithLock(AppointmentDTO dto) {
String lockKey = "appt_lock:" + dto.getDoctorId() + ":" + dto.getTimeSlot();
try {
// 尝试获取分布式锁,有效期10秒
boolean locked = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS);
if (!locked) {
throw new BusinessException("系统繁忙,请稍后再试");
}
// 执行业务逻辑
return makeAppointment(dto);
} finally {
// 释放锁
redisTemplate.delete(lockKey);
}
}
在支付和预约状态更新过程中,需要保证数据的一致性。我们采用以下方案:
java复制@Transactional
public PaymentResult processPayment(PaymentRequest request) {
// 1. 创建支付记录
PaymentRecord payment = createPaymentRecord(request);
paymentMapper.insert(payment);
// 2. 更新预约状态
appointmentMapper.updateStatus(request.getAppointmentId(), "PAID", "NEW");
// 3. 发送支付成功事件
PaymentSuccessEvent event = new PaymentSuccessEvent();
event.setPaymentId(payment.getId());
event.setAppointmentId(request.getAppointmentId());
rabbitTemplate.convertAndSend("payment.exchange", "payment.success", event);
// 4. 返回支付结果
return buildPaymentResult(payment);
}
针对系统性能瓶颈,我们实施了以下优化措施:
数据库优化:
缓存策略:
前端优化:
我们采用分层测试策略:
系统采用Docker容器化部署,部署架构如下:
code复制┌───────────────────────────────────────┐
│ Nginx负载均衡 │
└─────────────────┬─────────┬───────────┘
↓ ↓
┌───────────────┐ ┌───────┐ ┌───────────┐
│ Web应用节点1 │ │ 节点2 │ │ 节点3 │
└───────┬───────┘ └───┬───┘ └─────┬─────┘
↓ ↓ ↓
┌───────────────────────────────────────┐
│ Redis集群 │
└───────────────────────────────────────┘
↓
┌───────────────────────────────────────┐
│ MySQL集群 │
│ (主从复制+读写分离) │
└───────────────────────────────────────┘
部署步骤:
在开发这个宠物医院管理系统的过程中,我积累了一些宝贵的经验:
领域建模的重要性:在项目初期,我花了大量时间与宠物医院的工作人员沟通,了解他们的业务流程和痛点。这帮助我建立了准确的领域模型,避免了后期大量的返工。
技术选型的权衡:在技术选型时,我最初考虑使用Spring Cloud微服务架构,但考虑到项目规模和团队经验,最终选择了单体架构。这个决定大大简化了开发和部署的复杂度。
异常处理的经验:在支付模块开发中,我最初没有充分考虑各种异常情况,导致线上出现了一些问题。后来我完善了异常处理机制,添加了足够的日志和监控,大大提高了系统的稳定性。
性能优化的教训:在第一次压力测试时,系统在高并发下表现不佳。通过分析,我发现问题出在数据库查询上。添加适当的索引和优化查询语句后,性能提升了5倍以上。
文档的重要性:良好的文档不仅帮助团队成员理解系统,也为后续维护提供了便利。我坚持在代码中添加详细的注释,并维护了API文档和系统设计文档。
这个项目让我深刻理解了从需求分析到系统上线的完整软件开发流程。虽然过程中遇到了各种挑战,但解决问题的过程也让我收获了很多。未来,我计划继续完善这个系统,考虑添加AI辅助诊断、移动端应用等功能,进一步提升系统的实用性和用户体验。