在城市流浪宠物救助与领养需求日益增长的背景下,传统 “线下登记 + 人工沟通” 的领养模式存在效率低、信息不透明等问题。本文将基于 Spring Boot 框架,从业务场景出发,拆解宠物领养系统的设计逻辑、核心功能实现与落地细节,用轻量化技术方案打造一套 “连接救助站、领养人、管理员” 的高效协作系统,全程以文字阐述为主,仅附核心代码辅助理解。
1. 需求拆解:明确三类用户的核心诉求
设计系统前,需先梳理不同角色的核心痛点,确保功能适配实际场景:
访客:想快速浏览可领养宠物的基础信息(如品种、健康状况、图片),了解领养流程,但不愿先注册 —— 需降低信息获取门槛,首页直接展示宠物列表,无需登录即可查看。
领养人:注册后希望便捷提交申请、实时跟踪审核进度,避免反复沟通 —— 需简化申请流程,自动填充个人信息,提供 “我的申请” 页面展示状态与审核反馈。
管理员:需高效管理宠物信息(新增、更新状态)、批量处理领养申请,同时记录操作日志便于追溯 —— 需提供后台管理界面,按 “待审核 / 已通过 / 已拒绝” 分类展示申请,支持一键审核。
基于以上需求,系统核心模块确定为:宠物信息管理、用户认证与授权、领养申请流程、管理员后台,后续扩展可增加 “领养后反馈”“宠物健康跟踪” 等功能。
2. 技术选型:兼顾轻量与扩展性
考虑到系统初期用户量不大,且需快速落地,选择成熟、易维护的技术栈:
后端:Spring Boot 2.7.x(自动配置减少冗余代码,快速集成第三方组件)+ MyBatis-Plus 3.5.x(简化数据库操作,自带分页、条件查询功能,降低 SQL 编写量)。
数据库:MySQL 8.0(关系型数据库适合存储结构化数据,如用户信息、申请记录,支持事务确保数据一致性)。
前端:Thymeleaf + Bootstrap 5(Thymeleaf 与 Spring Boot 无缝集成,无需前后端分离,适合快速开发;Bootstrap 提供响应式组件,适配 PC 端与移动端)。
安全:Spring Security(实现用户登录认证、角色权限控制,避免越权操作)。
工具:Lombok(简化实体类 get/set 方法)、Hutool(处理日期格式化、字符串校验等通用功能)。
这套技术栈无需复杂的环境配置,开发周期短,且后续可通过 “接口化改造” 扩展移动端,兼顾当前需求与未来扩展性。
数据库是系统的核心支撑,需围绕 “宠物 - 用户 - 申请” 的关联关系设计表结构,同时预留扩展字段应对后续需求变化。核心表设计如下:
1. 用户表(user):区分角色,存储关键信息
用户表需同时存储领养人与管理员信息,通过 “role” 字段区分角色(0 - 领养人,1 - 管理员),避免单独建表增加关联复杂度。关键字段包括:
基础认证:username(用户名,唯一)、password(加密存储,避免明文泄露)。
业务信息:real_name(真实姓名,用于领养手续)、phone(联系电话,便于救助站沟通)、address(居住地址,辅助审核居住环境)。
辅助字段:create_time(注册时间,用于统计用户增长)。
核心 SQL(建表语句):
2. 宠物表(pet):聚焦领养决策关键信息
宠物表需存储用户关注的核心信息,同时通过 “status” 字段同步领养状态,避免重复申请。关键字段包括:
基础信息:name(宠物名称)、type(类型:猫 / 狗 / 其他)、age(年龄,如 “1 岁”“3 个月”)、health(健康状况,如 “健康 / 已绝育 / 需定期服药”)。
辅助信息:description(性格描述,如 “温顺 / 活泼 / 怕生”,帮助领养人判断适配度)、image_url(图片 URL,直观展示宠物外观)。
状态控制:status(0 - 待领养,1 - 已领养,2 - 暂不领养,如生病治疗中)。
3. 领养申请表(adoption_apply):关联用户与宠物,记录审核流程
这张表是核心业务表,需关联用户 ID 与宠物 ID,同时记录申请全流程信息:
关联字段:user_id(申请人)、pet_id(申请领养的宠物),通过外键确保数据完整性。
流程字段:apply_reason(领养理由,管理员审核核心依据)、audit_status(审核状态:0 - 待审核,1 - 已通过,2 - 已拒绝)、audit_remark(审核备注,如拒绝原因)。
时间字段:apply_time(申请时间)、audit_time(审核时间,便于统计审核效率)。
其余表(如领养反馈表)可在系统上线后,根据用户反馈逐步添加,避免初期功能过重。
1. 基础架构:分层设计,降低耦合
按 “Controller(请求处理)→ Service(业务逻辑)→ Mapper(数据访问)→ Entity(实体)” 分层组织代码,每层职责单一,便于后续维护:
Controller:接收前端请求,参数校验后调用 Service,返回页面或数据(如宠物列表页、申请提交结果)。
Service:处理核心业务逻辑(如申请提交前校验宠物状态、审核通过后同步宠物状态),避免 Controller 包含复杂逻辑。
Mapper:通过 MyBatis-Plus 实现数据库操作,无需编写大量 SQL,复杂查询可自定义 XML。
Entity:与数据库表字段对应,用 Lombok 简化代码。
核心代码(Pet 实体类,Lombok 示例):
package com.example.petadoption.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
@Data // Lombok自动生成get/set/toString方法
@TableName("pet") // 关联数据库表名
public class Pet {
@TableId(type = IdType.AUTO) // 主键自增
private Integer id;
private String name; // 宠物名称
private String type; // 类型:猫/狗/其他
private String age; // 年龄
private String health; // 健康状况
private String description; // 性格描述
private String imageUrl; // 图片URL
private Integer status; // 状态:0-待领养,1-已领养,2-暂不领养
private LocalDateTime createTime; // 录入时间
}
2. 宠物列表与详情:满足用户浏览需求
(1)列表页:高效筛选,直观展示
用户浏览宠物时,核心需求是 “快速找到感兴趣的类型”,因此列表页需实现:
分页查询:避免数据过多导致页面加载缓慢,默认每页 6 条,支持页码切换。
类型筛选:提供 “猫 / 狗 / 其他” 筛选按钮,用户点击后仅展示对应类型宠物。
状态控制:访客与领养人仅能看到 “待领养” 状态的宠物,管理员可查看所有状态(用于后台管理)。
核心代码(PetController 列表查询):
package com.example.petadoption.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.petadoption.entity.Pet;
import com.example.petadoption.service.PetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/pet")
public class PetController {
@Autowired
private PetService petService;
// 分页查询宠物列表(支持类型筛选)
@GetMapping("/list")
public String getPetList(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "6") Integer pageSize,
@RequestParam(required = false) String type,
Model model) {
// 调用Service查询:仅普通用户展示待领养宠物(status=0)
IPage<Pet> petPage = petService.getPetPage(pageNum, pageSize, type, 0);
// 数据传入前端页面
model.addAttribute("petPage", petPage);
model.addAttribute("type", type); // 回显筛选条件
return "pet/list"; // 返回Thymeleaf模板(templates/pet/list.html)
}
}Service 层需处理 “用户角色判断”:若为管理员,查询时不限制 status;若为普通用户,强制筛选 status=0,避免看到已领养的宠物。
(2)详情页:补充关键信息,引导申请
详情页需展示列表页未体现的细节,如宠物过往经历、领养注意事项,同时提供 “我要领养” 按钮 —— 未登录用户点击后跳转登录页,已登录用户跳转申请表单页。
3. 领养申请:简化流程,确保数据完整
申请流程是核心交互,需在 “减少用户操作” 与 “收集必要信息” 之间平衡:
自动填充:表单自动带入当前登录用户的 real_name、phone,避免重复录入。
合法性校验:提交前校验 “宠物是否已领养”(若 status=1,提示 “该宠物已被领养”)、“是否重复申请”(查询该用户是否已申请此宠物且未审核)。
事务控制:申请提交成功后,需确保 “申请表新增记录” 与 “宠物状态暂锁”(可选,避免同时申请)的原子性,用 Spring 事务注解 @Transactional 实现。
核心代码(AdoptionService 申请提交):
package com.example.petadoption.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.petadoption.entity.AdoptionApply;
import com.example.petadoption.entity.Pet;
import com.example.petadoption.mapper.AdoptionApplyMapper;
import com.example.petadoption.service.AdoptionApplyService;
import com.example.petadoption.service.PetService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AdoptionApplyServiceImpl implements AdoptionApplyService {
@Autowired
private AdoptionApplyMapper applyMapper;
@Autowired
private PetService petService;
// 提交领养申请(事务控制)
@Override
@Transactional(rollbackFor = Exception.class)
public boolean submitApply(AdoptionApply apply) {
// 1. 校验宠物状态:是否为待领养(status=0)
Pet pet = petService.getById(apply.getPetId());
if (pet == null || pet.getStatus() != 0) {
throw new RuntimeException("该宠物暂无法申请领养");
}
4. 管理员审核:高效处理,反馈清晰
管理员审核时,需快速获取关键信息(申请人、宠物、领养理由),同时确保审核结果同步至用户:
列表分类:后台申请列表按 “待审核 / 已通过 / 已拒绝” 分类,待审核申请置顶,优先处理。
一键操作:审核通过 / 拒绝按钮,拒绝时需填写备注(如 “居住环境不适合大型犬”),备注会同步至用户的 “我的申请” 页面。
状态同步:审核通过后,自动将宠物 status 改为 1(已领养),避免其他用户申请。
1. 权限控制:避免越权操作
通过 Spring Security 实现角色权限控制:
访客:仅能访问首页、宠物列表、详情页、登录 / 注册页,无法进入 “我的申请”“管理员后台”。
领养人:可访问 “我的申请”“个人信息修改”,无法修改宠物信息、审核申请。
管理员:可访问所有后台页面,操作宠物管理、申请审核,但无法修改用户的个人信息(需用户自行修改)。
2. 用户体验优化:细节决定留存
图片懒加载:宠物列表页图片多,用懒加载减少初始加载时间,提升页面响应速度。
操作反馈:申请提交成功 / 失败、审核状态变更时,用弹窗提示结果,避免用户迷茫。
异常处理:访问不存在的宠物详情页时,跳转 404 页面并提供 “返回首页” 按钮;系统异常时,提示 “系统暂时无法访问,请稍后重试”,同时记录日志便于排查。
3. 数据安全:避免泄露与丢失
密码加密:用户密码用 BCrypt 加密存储,即使数据库泄露,也无法还原明文。
数据备份:定期备份 MySQL 数据库,避免因服务器故障导致数据丢失。
敏感信息保护:管理员后台查看申请时,隐藏用户的完整地址(如只显示 “北京市朝阳区”),保护用户隐私。
本文搭建的宠物领养系统,通过 Spring Boot 实现了核心业务流程,满足 “浏览 - 申请 - 审核” 的基础需求,同时兼顾用户体验与数据安全。后续可根据实际使用反馈,扩展以下功能:
领养后反馈:新增反馈表,领养人可上传宠物生活照片、描述适应情况,增强社区感。
智能推荐:基于用户浏览记录(如经常查看 “小型犬”),推荐相似类型宠物,提升匹配效率。
移动端适配:将核心接口改造为 RESTful API,开发小程序或 APP,方便用户随时查看申请进度。
这套系统的设计思路可复用至类似 “物品领养”“公益捐赠” 等场景,只需调整表结构与业务逻辑,即可快速落地。