1. 项目概述:SpringBoot+Vue宠物爱心领养服务系统
去年参与某动物保护组织的IT系统升级时,发现国内流浪动物领养仍高度依赖微信群和Excel表格管理。这种原始方式导致领养信息碎片化、审核流程不透明、后续追踪困难等问题。为此我们开发了这套基于SpringBoot+Vue的宠物领养平台,上线半年已促成300+次成功领养。系统核心功能包括:
- 流浪动物信息数字化管理(含健康档案、行为特征等15个维度的结构化数据)
- 智能匹配算法(根据领养人居住环境、养宠经验等自动推荐合适宠物)
- 全流程追踪(从申请到回访的完整生命周期管理)
- 志愿者协作系统(任务分配、活动管理等功能)
关键数据:系统采用SpringBoot 2.7 + Vue3组合,前后端分离架构。数据库使用MySQL 8.0,配合Redis缓存热点数据。实测在2核4G服务器上可支撑500+并发请求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构设计解析
2.1 技术栈选型考量
后端选择SpringBoot的三大理由:
- 快速迭代:动物救助机构通常没有专职IT团队,SpringBoot的约定优于配置特性大幅降低开发门槛
- 生态丰富:整合了:
- Spring Security用于权限控制
- MyBatis-Plus处理宠物数据CRUD
- Quartz调度定时生成领养报告
- 监控完善:通过Actuator端点实时监控:
- 领养申请成功率(当前82%)
- 平均响应时间(约230ms)
前端Vue3的优势体现:
- 组件化开发:将宠物卡片、申请表等封装为可复用组件
- 响应式设计:适配手机端志愿者现场录入需求
- 状态管理:使用Pinia管理全局状态如用户登录信息
2.2 数据库关键表设计
sql复制CREATE TABLE `pet_info` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '宠物名字',
`health_status` enum('HEALTHY','RECOVERING','CRITICAL') NOT NULL,
`vaccination` json DEFAULT NULL COMMENT '疫苗接种记录',
`location_geohash` varchar(12) NOT NULL COMMENT '地理编码',
PRIMARY KEY (`id`),
SPATIAL KEY `idx_geo` (`location_geohash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
特别注意:疫苗接种记录采用JSON类型存储,便于记录多剂次疫苗信息。地理编码使用Geohash算法,方便后续实现"附近可领养"功能。
3. 核心功能实现细节
3.1 智能匹配算法实现
基于协同过滤改进的领养匹配模型:
java复制public List<PetVO> recommendPets(Long userId) {
// 1. 获取用户特征向量
double[] userVector = getUserFeatureVector(userId);
// 2. 计算候选宠物相似度
return petMapper.selectList(null).stream()
.map(pet -> {
double[] petVector = getPetFeatureVector(pet);
double score = cosineSimilarity(userVector, petVector);
return new PetVO(pet, score);
})
.sorted(Comparator.comparing(PetVO::getScore).reversed())
.limit(10)
.collect(Collectors.toList());
}
特征维度包括:
- 用户侧:住房面积、工作时间、养宠经验等
- 宠物侧:活动需求、亲人程度、护理难度等
3.2 领养流程状态机设计
使用Spring StateMachine实现状态流转:
mermaid复制stateDiagram
[*] --> PENDING_REVIEW
PENDING_REVIEW --> HOME_VISIT: 初审通过
PENDING_REVIEW --> REJECTED: 初审不通过
HOME_VISIT --> APPROVED: 家访合格
HOME_VISIT --> REJECTED: 家访不合格
APPROVED --> COMPLETED: 签订协议
COMPLETED --> FOLLOW_UP_1: 1周回访
FOLLOW_UP_1 --> FOLLOW_UP_3: 3个月回访
避坑指南:状态机需要持久化到数据库,我们采用自定义Repository实现。注意处理并发状态修改问题,建议使用乐观锁机制。
4. 部署与性能优化
4.1 容器化部署方案
Docker Compose编排文件关键配置:
yaml复制services:
app:
image: adopt-platform:1.0
environment:
- SPRING_PROFILES_ACTIVE=prod
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
redis:
image: redis:6-alpine
command: redis-server --save 60 1 --loglevel warning
4.2 缓存策略实践
采用多级缓存架构:
- 热点宠物信息:Redis缓存(TTL 30分钟)
- 静态资源:Nginx本地缓存+CDN
- 列表查询结果:Caffeine本地缓存
缓存击穿解决方案示例:
java复制@Cacheable(value = "petDetail", key = "#petId", cacheManager = "redisCacheManager")
public PetDetailDTO getPetDetail(Long petId) {
// 使用Redisson分布式锁防止缓存击穿
RLock lock = redissonClient.getLock("petLock:" + petId);
try {
lock.lock(5, TimeUnit.SECONDS);
return petMapper.selectDetailById(petId);
} finally {
lock.unlock();
}
}
5. 典型问题排查实录
5.1 图片上传失败问题
现象:志愿者上传宠物照片时报413 Request Entity Too Large
排查过程:
- 检查Nginx配置:发现client_max_body_size默认为1M
- 检查SpringBoot配置:spring.servlet.multipart.max-file-size=10MB
- 检查云存储桶策略:限制单文件5MB
解决方案:
nginx复制# Nginx配置调整
client_max_body_size 10M;
5.2 定时任务重复执行
现象:凌晨的领养报告生成任务有时会执行两次
原因分析:
- Quartz集群模式下存在时钟不同步问题
- 应用重启时触发恢复执行
最终方案:
properties复制# application.properties
spring.quartz.properties.org.quartz.jobStore.isClustered=true
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
6. 扩展功能开发建议
值得增加的三个功能:
- 宠物行为评估视频分析:使用OpenCV分析上传视频中的宠物行为特征
- 领养人信用评分:整合支付宝芝麻信用等第三方数据
- 智能客服:基于NLP的常见问题自动应答
性能优化方向:
- 地理查询优化:将Geohash升级为真正的GIS空间索引
- 图片处理:使用WebP格式替代JPEG,节省30%带宽
- 异步处理:将邮件通知等非核心操作放入RabbitMQ队列
这套系统在实际运行中最大的收获是:技术方案必须适配使用场景。比如我们最初设计了复杂的宠物匹配算法,但实际发现志愿者更需要的是一键导出Excel功能。建议开发同类系统时,先深入一线工作流程,再决定技术实现方式。
