随着宠物医疗行业的快速发展,传统的手工记录方式已无法满足现代化宠物医院的管理需求。信息记录零散、数据查询效率低下、业务流程缺乏标准化等问题严重制约了医院的服务质量与运营效率。为此,我们设计并实现了一套专业的宠物医疗管理平台,通过数字化手段全面提升宠物医院的管理水平。
系统架构与技术栈
该平台采用经典的SSM(Spring + Spring MVC + MyBatis)框架组合,构建了分层清晰、易于维护的企业级应用架构。
技术架构层次:
- 表现层:基于JSP和jQuery实现动态页面交互,提供友好的用户界面
- 控制层:Spring MVC框架处理HTTP请求,通过注解驱动简化控制器开发
- 业务层:Spring IoC容器管理业务组件,实现低耦合的依赖注入
- 持久层:MyBatis框架负责数据持久化,支持灵活的SQL映射和动态查询
- 数据层:MySQL数据库存储业务数据,确保数据的一致性和完整性
<!-- Maven依赖配置示例 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
数据库设计亮点分析
宠物美容关系表设计
pet_beauty_rel表的设计体现了复杂业务关系的优雅处理:
CREATE TABLE `pet_beauty_rel` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`beauty_id` bigint(20) DEFAULT NULL COMMENT '美容服务ID',
`pet_id` bigint(20) DEFAULT NULL COMMENT '宠物ID',
`host_id` bigint(20) DEFAULT NULL COMMENT '主人ID',
PRIMARY KEY (`id`),
KEY `FK_PET` (`pet_id`),
KEY `FK_BEAUTY` (`beauty_id`),
KEY `FK_USER` (`host_id`),
CONSTRAINT `FK_BEAUTY` FOREIGN KEY (`beauty_id`) REFERENCES `t_beauty` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_PET` FOREIGN KEY (`pet_id`) REFERENCES `t_pet` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_USER` FOREIGN KEY (`host_id`) REFERENCES `t_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='宠物美容关系表'
设计亮点:
- 级联操作优化:使用
ON DELETE CASCADE确保数据一致性,当关联记录删除时自动清理关系数据 - 复合索引策略:为三个外键字段分别建立索引,优化多表关联查询性能
- 业务语义明确:通过关系表清晰表达"宠物-美容服务-主人"之间的三元关系
管理员表设计
tb_admin表的设计展示了用户管理的最佳实践:
CREATE TABLE `tb_admin` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_name` varchar(64) DEFAULT NULL COMMENT '用户名',
`password` varchar(64) DEFAULT NULL COMMENT '密码',
`true_name` varchar(32) DEFAULT NULL COMMENT '真实姓名',
`gender` int(11) DEFAULT NULL COMMENT '性别',
`entry_time` datetime DEFAULT NULL COMMENT '入职时间',
`salary` decimal(10,2) DEFAULT NULL COMMENT '薪资',
`position` varchar(255) DEFAULT NULL COMMENT '职位',
`phone_number` varchar(64) DEFAULT NULL COMMENT '电话号码',
`updated` datetime DEFAULT NULL COMMENT '更新时间',
`created` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='管理员表'
设计亮点:
- 审计字段完备:包含
created和updated时间戳,支持操作追溯 - 数据类型精准:薪资使用
decimal(10,2)确保财务计算的精确性 - 字段长度优化:根据业务需求合理设置varchar长度,平衡存储效率与扩展性

核心功能实现详解
管理员信息管理模块
管理员模块采用标准的CRUD操作模式,通过Spring MVC实现RESTful风格的API设计:
@Controller
@RequestMapping("/admin")
public class AdminController {
private static final Logger LOGGER = LoggerFactory.getLogger(AdminController.class);
@Autowired
AdminService adminService;
@RequestMapping(value = "adminList", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<EasyUIResult> queryAdminList(
@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "rows", defaultValue = "30") Integer rows, HttpSession session) {
try {
return ResponseEntity.ok(this.adminService.queryAdminList(page, rows, session));
} catch (Exception e) {
LOGGER.error("查询兽医列表出错! page = " + page + ", rows = " + rows, e);
}
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
}
}
技术特色:
- 分页查询优化:支持自定义页码和页面大小,避免大数据量查询的性能问题
- 统一异常处理:通过ResponseEntity封装HTTP状态码,提供一致的错误处理机制
- 日志记录完善:使用SLF4J记录操作日志,便于问题排查和系统监控
宠物美容服务管理
美容服务模块通过DTO模式实现数据传递,确保业务逻辑与数据展示的分离:
package com.szkingdom.ssm.bean;
public class BeautyDTO {
private Long id;
private String name;
public BeautyDTO() {
}
public BeautyDTO(Long id, String name) {
this.id = id;
this.name = name;
}
// Getter和Setter方法
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "BeautyDTO{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

宠物寄养管理功能
寄养管理涉及复杂的时间段管理和关联查询,通过MyBatis的动态SQL实现灵活的数据操作:
<!-- MyBatis映射文件示例 -->
<mapper namespace="com.szkingdom.ssm.mapper.CareMapper">
<select id="selectCareByConditions" parameterType="map" resultType="Care">
SELECT * FROM t_care
WHERE 1=1
<if test="petId != null">
AND pet_id = #{petId}
</if>
<if test="hostId != null">
AND host_id = #{hostId}
</if>
<if test="beginTime != null">
AND begin_time >= #{beginTime}
</if>
<if test="endTime != null">
AND end_time <= #{endTime}
</if>
ORDER BY begin_time DESC
</select>
</mapper>

宠物信息综合管理
宠物信息管理采用前后端分离的思想,前端通过jQuery Ajax与后端交互:
// 前端宠物信息查询示例
function queryPetList(page, rows) {
$.ajax({
url: '/pet/petList',
type: 'GET',
data: {
page: page || 1,
rows: rows || 30
},
success: function(result) {
if (result && result.rows) {
renderPetTable(result.rows);
initPagination(result.total, page, rows);
}
},
error: function(xhr, status, error) {
console.error('查询宠物列表失败:', error);
}
});
}

实体模型设计策略
系统采用领域驱动设计(DDD)思想,通过实体类准确表达业务概念:
// 服务层接口定义示例
public interface AdminService {
EasyUIResult queryAdminList(Integer page, Integer rows, HttpSession session);
Boolean saveAdmin(Admin admin);
Boolean updateAdmin(Admin admin);
Boolean deleteAdmin(Long id);
}
// 服务实现类
@Service
public class AdminServiceImpl implements AdminService {
@Autowired
private AdminMapper adminMapper;
@Override
@Transactional
public Boolean saveAdmin(Admin admin) {
admin.setCreated(new Date());
admin.setUpdated(new Date());
return adminMapper.insert(admin) == 1;
}
}
设计优势:
- 事务管理:使用Spring的声明式事务管理,确保数据操作的一致性
- 依赖注入:通过Spring IoC容器管理组件依赖,提高代码的可测试性
- 接口抽象:服务层通过接口定义契约,支持多实现和Mock测试
功能展望与优化方向
基于当前系统架构,以下优化方向可进一步提升平台能力:
1. 缓存层引入与性能优化
// Redis缓存集成示例
@Service
public class CachedAdminService implements AdminService {
@Autowired
private RedisTemplate<String, Admin> redisTemplate;
@Override
public Admin getAdminById(Long id) {
String cacheKey = "admin:" + id;
Admin admin = redisTemplate.opsForValue().get(cacheKey);
if (admin == null) {
admin = adminMapper.selectById(id);
if (admin != null) {
redisTemplate.opsForValue().set(cacheKey, admin, Duration.ofHours(1));
}
}
return admin;
}
}
2. 微服务架构改造
将单体应用拆分为宠物管理、用户服务、预约系统等微服务,通过Spring Cloud实现服务治理:
# Spring Cloud配置示例
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
gateway:
routes:
- id: pet-service
uri: lb://pet-service
predicates:
- Path=/api/pet/**
3. 移动端适配与PWA支持
通过响应式设计和PWA技术,提供接近原生应用的移动端体验:
<!-- 移动端适配示例 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="manifest" href="/manifest.json">
4. 大数据分析与智能推荐
集成Elasticsearch和机器学习组件,实现宠物健康趋势分析和个性化服务推荐:
// 健康数据分析服务
@Service
public class HealthAnalysisService {
public HealthTrend analyzePetHealthTrend(Long petId) {
// 基于历史数据进行分析预测
return machineLearningModel.predict(petId);
}
}
5. 消息队列集成与异步处理
使用RabbitMQ或Kafka处理高并发场景,如预约通知、报表生成等异步任务:
@Component
public class AppointmentNotificationSender {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendAppointmentReminder(Appointment appointment) {
rabbitTemplate.convertAndSend("appointment.exchange",
"reminder.routing.key",
appointment);
}
}
系统架构深度解析
Spring MVC请求处理流程
系统的请求处理遵循标准的Spring MVC工作流程:
// 拦截器配置示例
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// 身份验证逻辑
HttpSession session = request.getSession();
Admin admin = (Admin) session.getAttribute("admin");
if (admin == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
// Spring配置类
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/login");
}
}
MyBatis高级特性应用
系统充分利用MyBatis的高级特性实现复杂业务逻辑:
<!-- 复杂查询映射示例 -->
<select id="selectPetWithDetails" parameterType="long" resultMap="petDetailMap">
SELECT
p.*,
u.user_name as host_name,
b.name as beauty_service_name
FROM t_pet p
LEFT JOIN t_user u ON p.host_id = u.id
LEFT JOIN pet_beauty_rel pbr ON p.id = pbr.pet_id
LEFT JOIN t_beauty b ON pbr.beauty_id = b.id
WHERE p.id = #{id}
</select>
<resultMap id="petDetailMap" type="PetDetailDTO">
<id property="id" column="id"/>
<result property="name" column="name"/>
<association property="host" javaType="User">
<id property="id" column="host_id"/>
<result property="userName" column="host_name"/>
</association>
<collection property="beautyServices" ofType="BeautyDTO">
<id property="id" column="beauty_id"/>
<result property="name" column="beauty_service_name"/>
</collection>
</resultMap>
事务管理策略
系统采用声明式事务管理确保业务操作的数据一致性:
@Service
@Transactional
public class ComplexBusinessService {
@Autowired
private PetMapper petMapper;
@Autowired
private CareMapper careMapper;
@Transactional(rollbackFor = Exception.class)
public void completePetCareProcess(CareRecord careRecord) {
// 更新宠物状态
petMapper.updatePetStatus(careRecord.getPetId(), "IN_CARE");
// 创建寄养记录
careMapper.insert(careRecord);
// 更新关联的美容服务状态
updateRelatedBeautyServices(careRecord.getPetId());
// 如果任何步骤失败,整个事务回滚
}
}
该宠物医疗管理平台通过严谨的架构设计和精细的技术实现,为宠物医院提供了全面的数字化解决方案。系统不仅解决了传统管理方式的痛点,还为未来的技术演进和功能扩展奠定了坚实基础。随着技术的不断发展,平台将继续演进,为宠物医疗行业提供更加智能、高效的服务支持。