毕业设计实战:基于SpringBoot+MySQL的流浪动物救助网站设计与实现,从需求到测试全流程拆解,新手也能轻松通关!
谁懂啊!当初做流浪动物救助网站毕设时,光动物领养表和领养审核表的外键关联就卡了4天——一开始没给领养审核表设“动物id”外键,查某只动物的所有领养申请时数据全串错,导师看了直接让我“重新画数据库E-R图”😫 后来踩遍无数坑才摸出一套高效落地流程,今天把需求分析、技术选型、功能实现到测试的细节全说透,宝子们不用再熬夜改代码,轻松搞定毕设!
一、先搞懂“流浪动物救助网站要啥”!需求分析别瞎蒙
刚开始我跳过需求分析就写代码,花两周加了个“流浪动物智能匹配领养人算法”,结果导师一句“核心是动物信息管理、领养审核、商品捐赠,不是复杂算法”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走90%弯路。
1. 核心用户&功能拆解(踩坑后总结版)
流浪动物救助网站就两类核心用户:管理员和普通用户(别加“志愿者子角色”!我当初加了后,权限逻辑混乱,志愿者能修改领养审核结果,最后砍掉才顺畅):
- 管理员端(必做功能):
- 动物管理:维护动物信息(新增/修改动物类型、状态、详情,上传动物图片)、管理领养/捐赠状态(标记“待领养”“已认领”)、按动物类型/状态筛选(我当初没加,找动物要翻几十页)
- 领养管理:审核领养申请(查看认领凭据、标记审核状态)、管理领养记录(导出数据、批量处理)、按申请人/动物名称筛选
- 用户管理:维护用户账号(新增/重置密码/禁用账号)、查看用户信息(姓名、手机号、余额)、按用户名/注册时间筛选
- 商品管理:维护商品信息(新增捐赠商品、设置库存/积分价格)、管理商品订单(处理发货、标记支付状态)、按商品类型/上架状态筛选
- 内容管理:公告发布(编辑通知内容、上传公告图片)、论坛管理(审核帖子、删除恶意言论)、留言回复(解答用户疑问)
- 用户端(核心功能):
- 动物操作:浏览动物列表(按类型/状态排序)、查看动物详情(照片、健康状况)、提交领养申请(上传认领凭据)、收藏关注动物
- 捐赠操作:浏览捐赠商品、加入购物车、提交订单(用积分/余额支付)、查看订单状态
- 互动操作:发布论坛帖子(分享领养故事)、给动物留言(咨询饲养问题)、浏览公告通知
- 个人中心:查看个人信息(领养记录、订单历史)、修改密码/联系方式、管理收货地址
2. 需求分析避坑指南(血泪教训!)
- 别光靠“空想”!找2个同学分别模拟管理员和用户提意见:比如有用户说“想快速区分待审核/已通过的领养申请”,我才加了“审核状态标色”(待审核标黄色/已通过标绿色/已拒绝标红色),比瞎加“智能匹配”实用多了
- 一定要画用例图!用DrawIO画简单版,标清“管理员-审核领养申请”“用户-提交捐赠订单”,跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听25分钟还没get到逻辑)
- 写“需求规格说明书”!不用复杂,把“功能描述、约束条件”写清楚(比如“动物认领凭据非空”“商品库存≥0”“领养申请时间不能选过去日期”),编码时对着做,不会跑偏
3. 可行性分析别敷衍!3点写清楚就能过
导师超爱问“你这系统可行吗”,别只说“我觉得可行”,从3个核心角度写,显得专业:
- 技术可行性:SpringBoot、MySQL、Vue、Java都是课堂学过的,图书馆有《SpringBoot实战》《MySQL数据库设计》,遇到问题能查资料(别用Vue3!我当初想试,前后端联调时图片上传接口卡了一周,换回Vue2才顺利)
- 经济可行性:所有工具全免费!Eclipse(社区版)、MySQL、Tomcat官网直接下,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你懂成本控制
- 操作可行性:界面参考主流公益平台(如动物救助站官网),按钮布局简洁,我找同学测试,5分钟就学会提交领养申请、下单捐赠,导师直接认可
二、技术选型别跟风!这套组合稳到爆
刚开始我跟风用SpringBoot+Vue3+Redis,结果“用户收藏动物缓存”卡了5天——Redis的持久化配置没设对,重启后收藏数据全丢😫 后来换成Java 8+SpringBoot 2.5.6+MySQL8.0+Tomcat9+Eclipse 2022+Vue2,新手友好度拉满,调试效率翻两倍!
1. 技术栈详细对比(附避坑提醒)
宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了5个核心工具的选择理由和坑点,直接抄:
| 技术工具 | 为啥选它 | 避坑提醒!(重点!) |
|---|---|---|
| Java 8 | 语法简洁,支持面向对象编程,学习资料丰富,SpringBoot 2.5.6对其兼容性最佳 | 别用Java 11+!部分SpringBoot依赖对高版本支持差,会出现“类加载失败”错误 |
| SpringBoot 2.5.6 | 简化配置(不用手动整合SSM),自带Tomcat插件,支持热部署,开发效率高 | 别用2.7+版本!新手容易踩“循环依赖”坑,调试时找不到报错原因 |
| MySQL 8.0 | 支持事务和外键,存动物、领养、商品数据足够用,占内存小,支持utf8mb4编码 | 安装时设“utf8mb4”编码!我当初用默认编码,动物名称含生僻字(如“玳瑁”)乱码,查2小时才解决 |
| Vue 2 | 上手简单,组件丰富,与SpringBoot联调顺畅,学习资料多 | 别用Vue 3!组合式API对新手不友好,且部分UI组件库支持差 |
| Eclipse 2022 | 对Java开发支持好,自带SpringBoot插件,调试工具直观,免费开源 | 别更到2023+版本!高版本对老电脑兼容性差,编译项目时经常卡顿 |
2. 开发环境搭建(step by step 实操)
很多宝子卡在“环境配置”,跟着步骤来超简单,我当初一次成功:
- 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置“JAVA_HOME”环境变量,Path中添加“%JAVA_HOME%\bin”,cmd输入“java -version”显示版本即成功
- 装Eclipse 2022(社区版):选“Eclipse IDE for Enterprise Java Developers”,首次打开勾选“Spring Boot Tools”“Vue.js”插件,自动安装
- 装MySQL 8.0:用Navicat管理(可视化工具超方便),新建数据库“stray_animal_rescue”,编码设“utf8mb4”,排序规则选“utf8mb4_general_ci”
- 配SpringBoot项目:在Eclipse中新建“Spring Starter Project”,勾选“Spring Web”“MyBatis Framework”“MySQL Driver”依赖,自动生成application.properties配置文件
- 测试连接:在application.properties中配置MySQL连接信息(url、用户名、密码),写一个“查询动物列表”接口,运行后能返回数据即完成初始化
3. 架构图一定要画!答辩加分项
用DrawIO画SpringBoot+Vue分层架构图,标清“前端(Vue页面)-控制层(Controller)-业务层(Service)-数据访问层(Mapper)-数据库(MySQL)”:比如用户点“提交领养申请”→Vue页面传请求→Controller接收→Service校验凭据→Mapper操作数据库→返回审核结果。去年答辩时,评委特意夸这图“逻辑清晰”,比光说“我用了SpringBoot+MySQL”专业多了!
三、数据库设计:别让表关联坑了你
这部分是毕设的“核心骨架”,我当初没关联“动物领养表”和“领养审核表”,查“某只动物的领养记录”要写3层嵌套SQL,调试到凌晨1点😫 后来按“实体-属性-关系”设计,终于理清了。
1. 核心实体&属性(附ER图绘制技巧)
先确定“实体”(管理员、用户、动物领养、领养审核、商品、订单、公告),再想“属性”,别漏关键字段!我整理了必做的12张表,直接照着画ER图:
- 用户表(yonghu):id(主键)、yonghu_name(用户姓名)、yonghu_phone(手机号)、yonghu_email(邮箱)、new_money(余额)、yonghu_photo(头像路径)、create_time(注册时间)
- 动物领养表(chongwu):id(主键)、chongwu_name(动物名称)、chongwu_types(动物类型)、chongwu_photo(动物图片)、chongwu_content(健康详情)、jieshu_types(认领状态:0=待领养,1=已认领)
- 领养审核表(chongwushenhe):id(主键)、chongwu_id(关联动物)、yonghu_id(关联用户)、chongwushenhe_text(认领凭据)、chongwushenhe_yesno_types(审核状态:0=待审核,1=已通过)
- 商品表(shangpin):id(主键)、shangpin_name(商品名称)、shangpin_photo(商品图片)、shangpin_kucun_number(库存)、shangpin_new_money(积分价格)、shangxia_types(是否上架:1=上架)
画ER图用Visio或亿图,记住3个规则:
- 矩形代表“实体”(比如“用户”“动物领养”)
- 椭圆代表“属性”(比如用户的“余额”“手机号”)
- 菱形代表“关系”(比如“用户-领养审核”是一对多,一个用户可提交多个领养申请;“动物领养-领养审核”是一对多,一只动物可有多条审核记录) 避坑提醒:别把“动物图片、认领凭据”存数据库!我当初存二进制导致数据库崩溃,改成存“文件路径”(比如/static/animal/cat1.jpg、/static/certificate/user1.pdf)才对。
2. 数据库物理设计(附建表SQL示例)
ER图画好后,转成实际表,字段类型和约束别瞎设!比如“积分价格”用DECIMAL(10,2),“库存”用INT,“手机号”设UNIQUE约束,避免重复。
给宝子们贴“动物领养表”和“领养审核表”的建表SQL,复制到Navicat就能用:
-- 动物领养表
CREATE TABLE `chongwu` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '动物ID',
`chongwu_name` VARCHAR(100) NOT NULL COMMENT '动物名称',
`chongwu_types` INT DEFAULT NULL COMMENT '动物类型(1-猫,2-狗,3-其他)',
`chongwu_photo` VARCHAR(200) DEFAULT NULL COMMENT '动物图片路径',
`chongwu_money` DECIMAL(10,2) DEFAULT 0.00 COMMENT '已获捐数值',
`jieshu_types` INT DEFAULT 0 COMMENT '认领状态(0-待领养,1-已认领)',
`chongwu_content` TEXT DEFAULT NULL COMMENT '动物详情(健康状况、性格)',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='动物领养表';
-- 领养审核表
CREATE TABLE `chongwushenhe` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '审核ID',
`chongwu_id` INT DEFAULT NULL COMMENT '关联动物ID(外键)',
`yonghu_id` INT DEFAULT NULL COMMENT '关联用户ID(外键)',
`chongwushenhe_text` VARCHAR(200) DEFAULT NULL COMMENT '认领凭据路径',
`chongwushenhe_yesno_types` INT DEFAULT 0 COMMENT '审核状态(0-待审核,1-已通过,2-已拒绝)',
`chongwushenhe_yesno_text` VARCHAR(200) DEFAULT NULL COMMENT '审核理由',
`create_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '申请时间',
PRIMARY KEY (`id`),
KEY `fk_animal_audit` (`chongwu_id`),
KEY `fk_user_audit` (`yonghu_id`),
CONSTRAINT `fk_animal_audit` FOREIGN KEY (`chongwu_id`) REFERENCES `chongwu` (`id`),
CONSTRAINT `fk_user_audit` FOREIGN KEY (`yonghu_id`) REFERENCES `yonghu` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='领养审核表';
3. 表关联测试!别等编码才发现错
建完表一定要测关联!比如在“动物领养表”插数据(id=1,名称=“橘猫”,类型=1,状态=0),在“领养审核表”插关联数据(用户ID=1,动物ID=1,凭据路径=/static/certificate/user1.pdf,状态=0),用JOIN查询“某只动物的领养申请”:
SELECT u.yonghu_name, u.yonghu_phone, a.chongwushenhe_text,
a.chongwushenhe_yesno_types, a.create_time
FROM chongwushenhe a
JOIN yonghu u ON a.yonghu_id = u.id
WHERE a.chongwu_id = 1;
如果能查出“用户名+手机号+凭据路径+审核状态+申请时间”,说明关联没问题;如果报错“Cannot add or update a child row”,大概率是外键没设对,赶紧检查表结构。
四、功能实现:核心模块操作+页面设计
不用做所有功能!先搞定3个核心模块,答辩时足够出彩。每个模块我都附关键操作逻辑和页面设计要点,宝子们直接套就行。
1. 管理员端:动物信息管理模块(必做!)
这是管理员的核心功能,实现“动物信息维护+状态同步”,重点说“动物类型校验”和“已认领状态联动”——别漏这两步,我当初就是这里踩了大坑!
(1)关键操作逻辑
- 新增动物前,校验“动物名称非空且唯一”“动物类型已在字典表定义”(缺一项提示“请完善动物信息”);
- 上传动物图片时,限制格式为JPG/PNG,大小≤5MB(避免占用过多服务器空间);
- 标记动物为“已认领”时,同步关闭该动物的所有待审核领养申请(避免重复审核)。
(2)页面设计要点(Vue+Bootstrap)
页面标题:管理员-动物信息管理页面
(插入图片位置:此处放“动物信息管理页面截图”,需包含以下元素)
- 筛选区:
- 输入框:动物名称(模糊查)
- 下拉框:动物类型(全部/猫/狗/其他)、认领状态(全部/待领养/已认领)
- 按钮:“查询”(蓝色btn-primary)、“新增动物”(绿色btn-success)
- 动物列表区:
- 表格列名:动物名称、类型、图片、已获捐数值、认领状态、操作
- 状态显示:待领养标黄色、已认领标绿色
- 操作按钮:“编辑”(橙色btn-warning)、“删除”(红色btn-danger)、“标记已认领”(仅待领养显示)
- 新增动物弹窗:
- 表单元素:动物名称(必填)、动物类型(下拉选,必填)、动物图片(上传框,JPG/PNG)、健康详情(文本域,必填)
- 按钮:“提交”(绿色)、“取消”(灰色)
(3)避坑提醒
- 动物名称唯一性校验!加逻辑:
// 动物名称唯一性校验 String animalName = chongwu.getChongwuName(); LambdaQueryWrapper<Chongwu> nameWrapper = new LambdaQueryWrapper<>(); nameWrapper.eq(Chongwu::getChongwuName, animalName); if (chongwuService.count(nameWrapper) > 0) { return Result.error("该动物名称已存在,请勿重复添加!"); } // 动物类型校验(需在字典表存在) Integer animalType = chongwu.getChongwuTypes(); LambdaQueryWrapper<Dictionary> typeWrapper = new LambdaQueryWrapper<>(); typeWrapper.eq(Dictionary::getDicCode, "animal_type").eq(Dictionary::getCodeIndex, animalType); if (dictionaryService.count(typeWrapper) == 0) { return Result.error("动物类型无效,请选择正确类型!"); }
2. 用户端:领养申请模块(核心需求!)
用户用系统的核心是“选动物-提交申请-查结果”,流程别复杂:浏览动物→查看详情→上传认领凭据→提交申请,我当初漏了“同一动物重复申请”校验,导致用户多次提交相同申请,补了半天逻辑才好。
(1)关键操作逻辑
- 提交申请前,校验“未重复申请该动物”“动物状态为待领养”(不满足提示“无法申请此动物”);
- 自动生成唯一“申请编号”(格式:ADT+日期+随机数),方便后续查询;
- 提交成功后,默认审核状态为“待审核”,同步显示“领养申请已提交,等待审核”提示。
(2)页面设计要点(Vue+Bootstrap)
页面标题:用户-领养申请页面
(插入图片位置:此处放“领养申请页面截图”,需包含以下元素)
- 动物详情区:
- 显示:动物图片(轮播展示)、名称、类型、健康详情、已获捐数值
- 按钮:“收藏动物”(空心星/实心星切换)、“提交领养申请”(绿色)
- 申请表单区(弹窗):
- 表单元素:申请人姓名(只读,关联用户信息)、手机号(只读)、认领凭据(上传框,PDF/JPG)、申请说明(文本域,选填,说明饲养条件)
- 按钮:“提交申请”(绿色btn-success)、“取消”(灰色)
- 我的申请区:
- 表格列名:申请编号、动物名称、申请时间、审核状态、操作
- 状态显示:待审核标黄色/已通过标绿色/已拒绝标红色
- 操作按钮:“查看详情”(蓝色)、“取消申请”(仅待审核显示)
(3)避坑提醒
- 重复申请校验与编号生成!加逻辑:
// 校验是否重复申请 LambdaQueryWrapper<Chongwushenhe> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(Chongwushenhe::getYonghuId, userId) .eq(Chongwushenhe::getChongwuId, animalId); if (chongwushenheService.count(wrapper) > 0) { return Result.error("您已申请过此动物,请勿重复提交!"); } // 校验动物状态 Chongwu animal = chongwuService.getById(animalId); if (animal.getJieshuTypes() != 0) { return Result.error("该动物已被领养,无法申请!"); } // 生成唯一申请编号 String uuid = "ADT" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + RandomUtils.nextInt(1000, 9999); chongwushenhe.setShenqingUuid(uuid); chongwushenhe.setChongwushenheYesnoTypes(0); // 0=待审核 chongwushenheService.save(chongwushenhe); return Result.success("领养申请已提交,等待审核!");
3. 管理员端:领养审核模块(答辩亮点!)
这个功能最能体现“救助流程闭环”,导师超爱问!核心是“查看申请-审核凭据-反馈结果”,别漏“审核理由必填”,不然用户不知道申请未通过原因。
页面设计要点(Vue+Bootstrap)
页面标题:管理员-领养审核页面
(插入图片位置:此处放“领养审核页面截图”,需包含以下元素)
- 筛选区:
- 输入框:申请人姓名(模糊查)、申请编号(精确查)
- 下拉框:审核状态(全部/待审核/已通过/已拒绝)、动物类型(全部/猫/狗/其他)
- 按钮:“查询”(蓝色)、“批量审核”(紫色btn-info)
- 审核列表区:
- 表格列名:申请编号、申请人、动物名称、申请时间、认领凭据、审核状态、操作
- 认领凭据:“查看”按钮(点击预览PDF)
- 操作按钮:待审核显示“通过”“拒绝”,已审核显示“查看详情”
- 审核弹窗:
- 只读信息:申请编号、申请人、动物名称、申请时间、认领凭据预览、申请说明
- 填写项:审核结果(单选“通过”“拒绝”)、审核理由(文本域,拒绝时必填)
- 按钮:“提交审核”(绿色)、“取消”(灰色)
(3)避坑提醒
- 审核理由校验与状态同步!加逻辑:
// 拒绝时校验审核理由 if (result == 2 && StringUtils.isEmpty(auditReason)) { return Result.error("拒绝领养需填写审核理由!"); } // 更新审核状态 Chongwushenhe audit = chongwushenheService.getById(auditId); audit.setChongwushenheYesnoTypes(result); // 1=通过,2=拒绝 audit.setChongwushenheYesnoText(auditReason); chongwushenheService.updateById(audit); // 若通过,同步动物状态为已认领 if (result == 1) { Chongwu animal = chongwuService.getById(audit.getChongwuId()); animal.setJieshuTypes(1); chongwuService.updateById(animal); } return Result.success("领养审核完成!");
五、测试别敷衍!这3步让答辩不翻车
很多宝子觉得“功能能跑就行”,结果答辩时评委一测就出问题!我当初没测“动物已认领后仍可申请”场景,导致系统允许无效申请,导师说“不符合救助逻辑”,当场扣分😫 测试一定要针对性做!
1. 功能测试(必测3个模块)
别全测!重点测“核心功能”,我整理了测试用例表,直接填结果:
(1)动物信息管理测试(表1:动物测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 动物名称重复新增 | 新增动物→填已存在名称→提交 | 提示“该动物名称已存在,请勿重复添加!” | ||
| 动物类型无效 | 新增动物→选未定义类型→提交 | 提示“动物类型无效,请选择正确类型!” | ||
| 正常新增动物 | 填唯一名称+选有效类型+上传图片+写详情→提交 | 提示“新增成功!”,列表显示该动物 |
(2)领养申请测试(表2:申请测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 重复申请同一动物 | 选已申请动物→提交申请→上传凭据 | 提示“您已申请过此动物,请勿重复提交!” | ||
| 申请已认领动物 | 选状态为“已认领”的动物→提交申请 | 提示“该动物已被领养,无法申请!” | ||
| 正常提交申请 | 选待领养动物→上传凭据→填说明→提交 | 提示“领养申请已提交,等待审核!” |
(3)领养审核测试(表3:审核测试用例)
| 测试场景 | 操作步骤 | 预期结果 | 实际结果 | 测试结论 |
|---|---|---|---|---|
| 拒绝审核不填理由 | 选待审核申请→点“拒绝”→不填理由→提交 | 提示“拒绝领养需填写审核理由!” | ||
| 审核通过同步状态 | 选待审核申请→点“通过”→填理由→提交 | 提示“领养审核完成!”,动物状态变为已认领 | ||
| 正常审核拒绝 | 选待审核申请→点“拒绝”→填理由→提交 | 提示“领养审核完成!”,申请状态变为已拒绝 |
2. 兼容性测试(容易忽略的点)
别只在自己电脑测!答辩时评委可能用不同浏览器,我当初没测IE,结果动物图片轮播加载失败,赶紧加兼容性JS才好:
- 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
- 分辨率测试:1920×1080、1366×768(别让页面出现横向滚动条,用Bootstrap的“container-fluid”布局,加“overflow-x: hidden”)
3. 测试报告要写好!答辩加分
把测试结果整理成“测试报告”,含“目的、范围、用例、结果、问题总结”,导师会觉得你“做事严谨”。比如:
- 问题总结:“IE浏览器下动物图片轮播加载失败,通过添加IE专属JS(if (navigator.userAgent.indexOf("MSIE") > 0) { ... })修复;已认领动物能申请,加状态校验修复”
- 测试结论:“核心功能(动物管理、领养申请、领养审核)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”
六、答辩准备:3个加分小技巧
毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给“良好”:
- 演示流程要顺畅:提前录演示视频(怕现场系统崩),按“管理员新增动物→用户提交领养申请→管理员审核申请→用户查看结果”的流程来,别跳步
- 重点讲“你解决了啥问题”:比如“一开始用户能重复申请动物,加重复校验解决;已认领动物能申请,加状态校验修复;表关联错误导致查不到审核记录,重新设计外键解决”,比光说“我用了SpringBoot+MySQL”有亮点
- 准备常见问题:导师大概率问“为啥选SpringBoot不选SSM”“数据多了怎么优化”,提前答:“SpringBoot简化配置,新手容易上手;数据多就加索引(如领养审核表的chongwu_id索引),优化查询速度,还能分表存储历史申请数据”
最后:毕设通关的小私心
以上就是基于SpringBoot+MySQL的流浪动物救助网站从0到1的避坑干货!毕设没那么难,关键是找对方法,别瞎做复杂功能。
需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“流浪动物救助网站”,我私发你;卡在某个模块(比如动物新增、领养审核),也可以留言,我看到必回!
点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘