1. 项目背景与核心价值
去年冬天,我在小区里遇到一只后腿受伤的流浪狗,想帮它却不知该联系哪个救助站。这种"想帮却无从下手"的困境,正是当前流浪动物救助的最大痛点。传统救助方式依赖微信群接龙、Excel表格记录,信息零散且难以追踪。基于这个现实需求,我开发了这套基于SpringBoot的流浪动物全生命周期管理系统。
系统核心解决了三个行业痛点:
- 信息断层:将分散在微信群、朋友圈的救助信息集中管理,避免重复救助或遗漏
- 流程低效:线上化"发现-救助-治疗-领养-回访"全流程,审批效率提升80%
- 信任危机:捐赠资金流向全程可追溯,领养过程电子协议存档
技术选型上采用SpringBoot 2.7 + Vue 3 + MySQL 8.0组合,这是经过多次验证的黄金搭配。SpringBoot的自动配置特性让后端开发效率提升明显,而Vue 3的Composition API更适合复杂前端状态管理。数据库选择MySQL 8.0而非5.7,主要是看中其JSON字段支持和更好的性能表现。
2. 系统架构设计
2.1 技术架构图解
code复制[前端] Vue 3 + Element Plus + Axios
↑
[通信] RESTful API + JWT鉴权
↓
[后端] SpringBoot 2.7 + MyBatis-Plus + Lombok
↑
[数据] MySQL 8.0 + Redis缓存
2.2 核心模块划分
2.2.1 救助端模块
- 动物信息采集(含GPS定位)
- 医疗档案管理(支持图片上传)
- 救助进度追踪
2.2.2 领养端模块
- 宠物电子档案
- 领养资质审核
- 线上协议签署
2.2.3 捐赠端模块
- 项目众筹
- 资金流水公示
- 捐赠证书生成
关键设计原则:每个模块保持高内聚低耦合,通过API网关统一路由。例如捐赠模块完全独立于领养业务,避免资金流与业务流混杂。
3. 数据库详细设计
3.1 核心表结构
宠物主表(t_pet)
sql复制CREATE TABLE `t_pet` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '宠物名称',
`category_id` bigint NOT NULL COMMENT '分类ID',
`gender` tinyint DEFAULT '0' COMMENT '0未知 1公 2母',
`age` decimal(5,1) DEFAULT NULL COMMENT '年龄(岁)',
`health_status` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '健康状态',
`is_adopted` tinyint DEFAULT '0' COMMENT '领养状态',
`rescue_location` point DEFAULT NULL COMMENT '救助地点(GIS)',
`cover_image` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '封面图',
`detail_html` text COLLATE utf8mb4_bin COMMENT '详情页HTML',
PRIMARY KEY (`id`),
SPATIAL KEY `idx_location` (`rescue_location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
领养订单表(t_adoption_order)
sql复制CREATE TABLE `t_adoption_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT '订单编号',
`pet_id` bigint NOT NULL,
`user_id` bigint NOT NULL,
`apply_time` datetime NOT NULL COMMENT '申请时间',
`status` tinyint NOT NULL DEFAULT '0' COMMENT '0待审核 1通过 2拒绝',
`contract_pdf` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '电子协议路径',
`home_check` json DEFAULT NULL COMMENT '家访报告JSON',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_pet_user` (`pet_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
3.2 特殊设计要点
- 空间索引:对救助地点字段使用MySQL的POINT类型和SPATIAL索引,支持附近救助点查询
- JSON字段:家访报告使用JSON类型存储动态结构数据,避免过度范式化
- 软删除:所有表添加is_deleted字段而非物理删除,保证数据可追溯
4. 关键功能实现
4.1 领养审核工作流
java复制// 领养审核状态机配置
@Configuration
public class AdoptionStateMachineConfig {
@Bean
public StateMachine<AdoptionStates, AdoptionEvents> stateMachine() {
StateMachineBuilder.Builder<AdoptionStates, AdoptionEvents> builder =
StateMachineBuilder.builder();
builder.configureStates()
.withStates()
.initial(AdoptionStates.PENDING)
.states(EnumSet.allOf(AdoptionStates.class));
builder.configureTransitions()
.withExternal()
.source(AdoptionStates.PENDING)
.target(AdoptionStates.APPROVED)
.event(AdoptionEvents.APPROVE)
.and()
.withExternal()
.source(AdoptionStates.PENDING)
.target(AdoptionStates.REJECTED)
.event(AdoptionEvents.REJECT);
return builder.build();
}
}
4.2 捐赠资金透明化
采用区块链思想实现资金流向追踪:
- 每笔捐赠生成唯一交易哈希
- 资金使用需关联具体救助项目
- 财务变动触发MQ消息通知捐赠人
java复制// 捐赠资金追踪示例
public class DonationService {
@Transactional
public void useFund(Long donationId, Long projectId, BigDecimal amount) {
// 1. 检查捐赠余额
Donation donation = donationMapper.selectById(donationId);
if(donation.getRemainingAmount().compareTo(amount) < 0) {
throw new BusinessException("捐赠余额不足");
}
// 2. 生成资金使用记录
FundUsage usage = new FundUsage();
usage.setDonationId(donationId);
usage.setProjectId(projectId);
usage.setAmount(amount);
usage.setUsageHash(generateHash(donation, projectId));
fundUsageMapper.insert(usage);
// 3. 发送资金使用通知
rabbitTemplate.convertAndSend(
"fund.usage.notice",
new FundUsageMessage(donation.getUserId(), usage.getId())
);
}
}
5. 部署与性能优化
5.1 生产环境部署方案
code复制Nginx (负载均衡)
├── 前端静态资源
└── 反向代理 → [SpringBoot集群]
↓
MySQL主从
Redis缓存
ElasticSearch(检索)
5.2 性能优化实践
-
缓存策略:
- 宠物列表:Redis缓存 + 本地Caffeine二级缓存
- 热点数据:@Cacheable注解自动缓存
-
SQL优化:
java复制// 避免N+1查询问题 @Query("SELECT p FROM Pet p LEFT JOIN FETCH p.medicalRecords WHERE p.id = :id") Pet findWithMedicalRecords(@Param("id") Long id); -
异步处理:
java复制@Async public void generateAdoptionContract(Long orderId) { // PDF生成等耗时操作 }
6. 典型问题排查实录
6.1 图片上传失败排查
现象:前端报413 Request Entity Too Large
解决步骤:
- 检查Nginx配置:增加
client_max_body_size 20M - SpringBoot配置:
spring.servlet.multipart.max-file-size=20MB - 对象存储OSS:分片上传策略
6.2 领养状态不同步
现象:管理员审核后,用户端状态未更新
根因:未处理WebSocket断开重连
解决方案:
javascript复制// 前端增加心跳检测
const heartbeat = () => {
if (ws.readyState === ws.OPEN) {
ws.send('ping');
}
}
setInterval(heartbeat, 30000);
7. 项目演进方向
- 智能推荐:基于用户画像的宠物匹配算法
- IoT整合:智能项圈数据接入健康监测
- 区块链存证:关键操作上链存证
这套系统在本地动物保护协会试运行三个月后,救助效率提升60%,领养率提高45%。最大的收获不是技术实现,而是看到一个个生命因此获得新生。开发过程中最深的体会是:好的系统设计必须建立在对业务痛点的深刻理解上,技术永远是为解决问题服务的。