这个基于SpringBoot的宠物猫认养系统是我在完成毕业设计时开发的一个实际项目。作为一个长期关注动物福利的Java开发者,我发现现有的宠物领养流程存在诸多不便:信息不透明、手续繁琐、救助机构与领养者沟通不畅等问题。于是决定开发这个系统,用技术手段优化整个领养流程。
系统采用前后端分离架构,前端使用Vue.js+Element UI,后端基于SpringBoot+MyBatis,数据库选用MySQL 8.0。经过三个月的开发和测试,系统实现了宠物信息管理、在线申请、智能审核、电子合同等完整功能,目前已在小动物保护协会试运行,日均处理领养申请30+次。
提示:开发此类系统时,要特别注意数据安全和隐私保护,尤其是涉及用户身份证号、住址等敏感信息时,必须做好加密存储和传输。
后端选择SpringBoot主要基于以下几点考虑:
前端选用Vue.js而非React或Angular,主要因为:
系统主要分为六大核心模块:
| 模块名称 | 主要功能 | 技术实现 |
|---|---|---|
| 用户中心 | 注册登录、权限管理、个人资料 | Spring Security + JWT |
| 宠物管理 | 宠物信息CRUD、状态跟踪 | MyBatis + PageHelper |
| 领养流程 | 申请提交、审核、电子合同 | Activiti工作流 |
| 支付系统 | 领养费支付、退款处理 | 支付宝沙箱+微信支付 |
| 志愿者管理 | 招募、排班、考勤 | Quartz定时任务 |
| 数据统计 | 领养数据分析、报表生成 | ECharts + POI |
宠物信息采用富文本编辑,支持多图上传。关键实现代码如下:
java复制// 宠物信息实体类
@Data
@TableName("pet_info")
public class Pet {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String gender;
private String breed;
@TableField(typeHandler = JacksonTypeHandler.class)
private List<String> images; // 图片URL列表
private String healthStatus;
private String adoptionStatus;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
// 图片上传服务
@Service
public class FileService {
private final String uploadPath = "/var/www/pet-images/";
public List<String> uploadImages(MultipartFile[] files) {
return Arrays.stream(files)
.map(file -> {
String filename = UUID.randomUUID() + getExtension(file);
Path path = Paths.get(uploadPath + filename);
Files.copy(file.getInputStream(), path);
return "/images/" + filename;
})
.collect(Collectors.toList());
}
}
领养流程采用状态机设计模式,确保流程合规:
code复制申请提交 → 初审(自动) → 家访安排 → 终审 → 支付 → 签订电子合同 → 完成
状态转换的核心逻辑:
java复制public class AdoptionService {
@Transactional
public void processApplication(Long applicationId, String action) {
Application app = applicationMapper.selectById(applicationId);
switch (app.getStatus()) {
case "SUBMITTED":
if ("APPROVE".equals(action)) {
app.setStatus("FIRST_REVIEW");
// 触发自动审核规则
autoReviewService.review(app);
}
break;
case "FIRST_REVIEW":
// 其他状态处理...
}
applicationMapper.updateById(app);
}
}
为提高审核效率,开发了基于规则的智能初审:
java复制public class AutoReviewService {
public ReviewResult review(Application app) {
int score = 0;
// 规则1:年龄检查
if (app.getUser().getAge() >= 18) score += 30;
// 规则2:居住环境
switch (app.getHousingType()) {
case "HOUSE": score += 25; break;
case "APARTMENT": score += 15; break;
}
// 规则3:养宠经验
if (app.isHasPetExperience()) score += 20;
// 规则4:黑名单检查
if (blacklistService.check(app.getUserId())) {
return new ReviewResult(false, "在黑名单中");
}
return new ReviewResult(score >= 60, "得分: " + score);
}
}
使用区块链存证确保合同法律效力:
采用Docker Compose部署方案:
yaml复制version: '3'
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
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/pet_adoption
frontend:
build: ./frontend
ports:
- "80:80"
缓存策略:
数据库优化:
前端优化:
问题表现:同一只宠物被多人同时申请时,可能出现超领。
解决方案:采用乐观锁机制
java复制public class AdoptionController {
@PostMapping("/apply")
public Result apply(@RequestBody Application app) {
return petService.updatePetStatus(
app.getPetId(),
"AVAILABLE",
"PENDING",
() -> applicationService.createApplication(app)
);
}
}
@Service
public class PetService {
@Transactional
public Result updatePetStatus(Long petId, String expect, String newStatus, Runnable action) {
Pet pet = petMapper.selectById(petId);
if (!expect.equals(pet.getAdoptionStatus())) {
return Result.error("宠物状态已变更");
}
pet.setAdoptionStatus(newStatus);
if (petMapper.updateById(pet) > 0) {
action.run();
return Result.success();
}
return Result.error("操作失败");
}
}
问题:用户可能上传恶意文件
解决方案:
java复制public class FileUtil {
private static final Set<String> ALLOWED_EXTENSIONS =
Set.of("jpg", "jpeg", "png", "gif");
public static boolean isImageSafe(MultipartFile file) {
String ext = getExtension(file).toLowerCase();
if (!ALLOWED_EXTENSIONS.contains(ext)) {
return false;
}
try {
BufferedImage image = ImageIO.read(file.getInputStream());
return image != null; // 验证确实是图片
} catch (IOException e) {
return false;
}
}
}
领域模型设计要早确定:我在开发中期才发现领养流程需要支持不同救助机构的定制需求,导致大量重构。建议早期充分调研各机构的业务流程差异。
安全无小事:曾经因为未对用户上传的HTML内容转义导致XSS漏洞,现在所有用户输入都经过严格过滤和转义。
文档即代码:Swagger文档要随接口开发同步编写,我后来采用了SpringDoc OpenAPI,它能自动从代码注释生成最新文档。
监控很重要:系统上线后才发现某些查询性能很差,后来集成了Prometheus监控,能及时发现性能瓶颈。
这个项目让我深刻体会到,一个好的系统不仅要技术过关,更要真正解决用户的痛点。现在看到通过这个系统成功领养的猫咪们都有了温暖的家,是最有成就感的时刻。