🎓 一、 选题背景:为什么选这个题?
同学们,毕设想拿高分,要么技术牛,要么**“产品力”强。这个选题就是典型的产品力爆表**:
- 击中痛点(情感共鸣):流浪动物救助是社会热点,而“云养宠”完美解决了年轻人“爱宠但无法饲养”的矛盾。答辩时,你给老师展示一张刚救助时脏兮兮的小猫,再展示一张“云养”一个月后白白胖胖的照片,视觉冲击力满分。
- 功能新颖(拒绝同质化):别人的宠物系统只能 CRUD,你的系统支持**“订阅式云养”、“成长时间轴”、“领养全流程追踪”**,瞬间拉开差距。
- 技术落地简单:
- 云养= 只有订阅者可见的相册。
- 救助= 宠物信息录入。
- 领养= 表单审批流。
🏗️ 二、 系统架构设计
为了体现系统的“平台化”属性,我们将架构描述为救助端 + 云养端 + 管理端三位一体。
1. 技术栈选型
- 后端:Spring Boot 2.7+、MyBatis Plus
- 前端:Vue 3 + Element Plus +Timeline 组件 (核心)
- 文件存储:MinIO 或 本地磁盘映射 (存猫猫狗狗照片)
- 数据库:MySQL 8.0
2. 系统逻辑架构图 (Mermaid)
这张图展示了从“发现流浪动物”到“云养互动”再到“最终领养”的闭环。
🛠️ 三、 项目亮点包装(Project Highlights)
这部分要把“相册”吹成“数字孪生”。
1. 订阅式“云养”互动模式
包装话术:针对无法线下领养的用户,系统创新性地设计了**“云养订阅机制”。用户通过虚拟认养(点击订阅),即可建立与流浪动物的数字连接**。系统会自动聚合该宠物的救助日记、医疗记录和生活萌照,生成可视化的“生命成长时间轴”,提供沉浸式的情感陪伴体验。
2. 基于 RBAC 的领养风控审批流
包装话术:为了对生命负责,防止二次遗弃,系统内置了严格的领养资格审核工作流。采用“提交申请 -> 线上初审(住房/收入证明) -> 线下家访 -> 签署协议”的多级状态机管理。只有审核通过后,宠物的状态才会从“待领养”变更为“已被带回家”,实现了救助闭环。
3. 流浪地图与救援大数据
包装话术:系统集成了GIS 可视化技术(其实就是 ECharts 地图),将每一次救助的地点标记在地图上,形成了“城市流浪动物热力图”。这不仅展示了救助站的成果,也为后续的定点投放绝育诱捕笼(TNR)提供了数据决策支持。
💻 四、 核心功能实现(保姆级代码)
核心在于:怎么实现“只有订阅的人才能看照片”以及“成长时间轴”。
1. 核心表结构设计
宠物基本信息表 (sys_pet)
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
id | BIGINT | 主键 | - |
nickname | VARCHAR | 昵称 | 如:大黄 |
status | TINYINT | 状态 | 0:流浪, 1:救助中, 2:云养中, 3:已领养 |
health_status | VARCHAR | 健康状况 | 如:猫瘟康复中 |
rescue_loc | VARCHAR | 救助地点 | - |
云养订阅关系表 (sys_cloud_subscribe)
这就是“关注”表,记录谁云养了谁。
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
id | BIGINT | 主键 | - |
user_id | BIGINT | 用户ID | “云铲屎官” |
pet_id | BIGINT | 宠物ID | “主子” |
subscribe_time | DATETIME | 开始时间 | 计算“云养天数”用 |
宠物成长日志表 (sys_growth_log)
这就是相册表,也就是“云养”的核心内容。
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
id | BIGINT | 主键 | - |
pet_id | BIGINT | 宠物ID | - |
content | VARCHAR | 文字描述 | 如:今天第一次吃猫罐头 |
img_urls | TEXT | 照片/视频地址 | 多张图用逗号分隔 |
log_date | DATE | 记录日期 | 用于生成时间轴 |
2. 难点代码:发布动态与时间轴查询 (CloudRaisingService.java)
@ServicepublicclassCloudRaisingService{@AutowiredprivateGrowthLogMapperlogMapper;@AutowiredprivateCloudSubscribeMappersubscribeMapper;/** * 管理员发布宠物的最新动态(发照片) */publicvoidpublishUpdate(LongpetId,Stringcontent,StringimgUrls){GrowthLoglog=newGrowthLog();log.setPetId(petId);log.setContent(content);log.setImgUrls(imgUrls);// 图片上传逻辑在Controller处理,这里存URLlog.setLogDate(newDate());logMapper.insert(log);// (可选) 可以在这里加一个 WebSocket 推送,通知订阅者“你的猫更新了!”}/** * 用户查看自己云养宠物的“成长时间轴” */publicList<TimelineVo>getPetTimeline(LonguserId,LongpetId){// 1. 鉴权:判断用户是否订阅了这只宠物Integercount=subscribeMapper.selectCount(newQueryWrapper<CloudSubscribe>().eq("user_id",userId).eq("pet_id",petId));if(count==0){thrownewRuntimeException("请先点击‘云养’,解锁它的成长日记!");}// 2. 查询日志,按时间倒序List<GrowthLog>logs=logMapper.selectList(newQueryWrapper<GrowthLog>().eq("pet_id",petId).orderByDesc("log_date"));// 3. 封装成前端 Timeline 需要的格式returnlogs.stream().map(log->{TimelineVovo=newTimelineVo();vo.setDate(DateUtil.format(log.getLogDate(),"yyyy-MM-dd"));vo.setTitle("第 "+DateUtil.betweenDay(rescueDate,log.getLogDate())+" 天");vo.setImages(Arrays.asList(log.getImgUrls().split(",")));vo.setContent(log.getContent());returnvo;}).collect(Collectors.toList());}}📸 五、 运行效果展示 (答辩 PPT 必杀技)
这部分要突出**“萌”和“治愈”**。
- 宠物详情页(未订阅):
- 展示宠物基本信息(名字、品种、救助故事)。
- 下方有一个带锁的区域,显示模糊的照片,按钮提示:“点击加入云养,解锁Ta的私密日记”。
- 云养时间轴(订阅后):
- 这是一个 Vue 的
<el-timeline>组件。 - 2023-10-01:【图:脏兮兮的流浪猫】文字:刚救助回来,很凶,怕人。
- 2023-10-15:【图:洗完澡吃罐头】文字:终于肯让人摸了,原来是大美猫!
- 2023-11-01:【图:在睡觉】文字:长胖了 2 斤,睡得很香。
- 注:这种强烈的对比图,是拿分的关键。
- 领养申请页:
- 严肃的表单风格:要求填写“是否有固定住房”、“是否封窗”、“同住人是否同意”。体现系统的严谨性。
🗣️ 六、 答辩防御术(高情商回答)
Q1: 你的“云养”和朋友圈发照片有什么区别?
A (升华版):"老师,本质上确实都是信息流的展示。但朋友圈是社交属性,本系统是垂直领域的服务属性。
- 数据结构化:我的系统以‘宠物’为核心维度,构建了完整的生命周期档案,而朋友圈是碎片化的。
- 转化闭环:云养的最终目的是为了**‘线下领养’**。系统通过云养积累用户对宠物的情感,当用户条件成熟时,可以一键将‘云养’转化为‘领养’,这是一个完整的救助漏斗模型。"
(解析:用“漏斗模型”和“生命周期”这些词,瞬间拉开和朋友圈的档次。)
Q2: 如果领养人领养后弃养了怎么办?系统怎么管?
A (功能延伸版):“系统设计了**‘领养后回访’**功能。
宠物状态变为‘已领养’后,系统会生成定期的回访任务(如第1个月、第3个月、第6个月),提醒管理员联系领养人上传最新照片。如果领养人失联或拒绝回访,会被系统拉入黑名单,全平台公示,防止其再次领养。这也体现了系统对生命负责的态度。”
总结:
这个项目不需要写复杂的算法。你只需要去小红书或者微博的“流浪动物救助”超话,下载几十张猫猫狗狗的前后对比照,填到数据库里。
演示的时候,把那个“时间轴”一拉,看着猫咪从小脏猫变成小公主,这种治愈感能让答辩现场的气氛瞬间变得很温情。老师也是人,谁能拒绝修勾修猫呢?