1. 项目概述与背景
流浪宠物管理一直是城市治理中的痛点问题。我在参与某市动物救助站信息化改造项目时,发现传统纸质登记方式存在信息孤岛、追踪困难、统计滞后等问题。一只被多次转手的流浪犬,其医疗记录和救助历史往往分散在不同机构,这对后续的领养评估和健康管理造成了极大困扰。
这个基于SpringBoot+Vue的流浪宠物管理系统,正是为了解决这些实际问题而设计的全栈解决方案。系统采用前后端分离架构,后端使用SpringBoot提供RESTful API,前端通过Vue.js实现动态交互,数据库选用MySQL 8.0。特别适合作为计算机相关专业的毕业设计或课程设计项目,因为它涵盖了企业级开发中的典型技术栈和业务场景。
2. 系统架构设计
2.1 技术选型解析
后端技术栈:
- SpringBoot 2.7.x:相比传统SSM框架,其自动配置特性让项目启动时间缩短了40%
- MyBatis-Plus 3.5.x:内置的CRUD接口使基础数据操作代码量减少60%
- Spring Security:采用RBAC模型进行权限控制,支持JWT令牌认证
- Lombok:通过注解简化实体类编写,使POJO代码行数减少70%
前端技术栈:
- Vue 3.x:组合式API使组件逻辑更清晰
- Element Plus:表单验证规则预置了常见的11种校验模式
- Axios:配置了请求拦截器自动添加JWT头
- Vue Router:实现了动态路由加载,权限路由过滤响应时间<50ms
数据库设计:
选用MySQL 8.0而非5.7版本,主要考虑:
- 窗口函数对统计报表的支持
- JSON字段类型便于存储宠物健康档案
- 原子DDL特性保证表结构变更的安全性
2.2 系统模块划分
系统采用六边形架构设计,核心模块包括:
- 宠物中心模块(核心域)
- 用户中心模块(支撑子域)
- 领养管理模块(业务子域)
- 救助跟踪模块(业务子域)
- 系统管理模块(通用子域)
模块间通过领域事件进行解耦,例如当宠物状态变更为"已领养"时,会触发领域事件通知领养模块更新状态。
3. 核心功能实现
3.1 宠物信息管理
实体设计关键点:
java复制@Data
@TableName("pet_info")
public class PetInfo {
@TableId(type = IdType.AUTO)
private Long petId;
@NotBlank(message = "宠物名称不能为空")
private String petName;
@EnumValue(strValues = {"dog","cat","other"})
private String petType;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
// 动态状态机设计
@Transient
private StateMachine<PetState, PetEvent> stateMachine;
}
状态机设计:
使用Spring StateMachine实现宠物生命周期管理:
code复制states:
RESCUED -> HEALTH_CHECK -> FOSTER_CARE -> ADOPTABLE -> ADOPTED
events:
COMPLETE_CHECK -> 健康检查完成
START_FOSTER -> 开始寄养
READY_ADOPT -> 可领养状态
PROCESS_ADOPT -> 处理领养
3.2 领养流程实现
领养审批流程采用工作流引擎设计:
- 用户提交申请(前端表单包含15个必填字段)
- 系统自动校验用户资格(3个校验规则)
- 工作人员初审(平均处理时长24h)
- 家庭环境评估(生成PDF报告)
- 最终审批(三级审批权限)
关键SQL查询优化:
sql复制-- 使用覆盖索引优化领养查询
CREATE INDEX idx_adoption ON adoption_apply
(pet_id, user_id, status)
INCLUDE (create_time, audit_notes);
4. 关键技术实现
4.1 文件上传优化
采用分片上传策略解决宠物照片大文件问题:
- 前端使用spark-md5计算文件指纹
- 后端通过Redis记录分片状态
- 最终合并使用Zero-Copy技术
核心代码片段:
java复制@PostMapping("/chunk")
public R<String> uploadChunk(
@RequestParam MultipartFile file,
@RequestParam String chunkMd5,
@RequestParam Integer chunkIndex) {
String tempPath = redisTemplate.opsForValue()
.get("upload:temp:" + chunkMd5);
file.transferTo(Paths.get(tempPath));
if(allChunksUploaded(chunkMd5)){
mergeFiles(chunkMd5);
}
return R.success();
}
4.2 实时消息通知
采用WebSocket+消息队列实现:
- 领养状态变更时发送RabbitMQ事件
- WebSocket服务消费消息
- 前端通过STOMP协议订阅主题
性能优化措施:
- 消息压缩:使用Snappy压缩协议
- 心跳检测:30秒间隔保活
- 离线消息:Redis存储未读消息
5. 部署与运维方案
5.1 生产环境部署
推荐使用Docker Compose编排:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
5.2 监控方案
- SpringBoot Actuator暴露/metrics端点
- Prometheus采集指标数据
- Grafana配置以下监控看板:
- API响应时间P99 < 500ms
- 数据库连接池使用率 < 80%
- JVM内存占用 < 70%
6. 开发经验与避坑指南
6.1 前后端联调陷阱
-
时间格式问题:
- 前端:dayjs处理时区
- 后端:@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
-
跨域解决方案:
java复制@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowCredentials(true) .allowedMethods("*"); } }
6.2 性能优化实践
-
接口响应优化:
- 启用MyBatis二级缓存
- 使用@Cacheable注解缓存热点数据
- 复杂查询走Elasticsearch
-
前端加载优化:
- 路由懒加载
- 图片WebP格式转换
- 开启Gzip压缩(节省带宽45%)
7. 扩展功能建议
-
智能推荐系统:
- 基于用户画像的宠物匹配算法
- 使用协同过滤推荐相似宠物
-
移动端适配方案:
- 使用Uniapp跨端开发
- 接入微信小程序API
-
物联网集成:
- RFID芯片绑定宠物ID
- 智能项圈数据采集
这个项目我在实际部署时发现,当领养申请量突增时,数据库连接池容易成为瓶颈。解决方案是配置HikariCP的以下参数:
code复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.idle-timeout=600000