资讯动态

基于Vue3的养宠记录平台:毕设从需求拆解到答辩交付全指南

发布时间:2026/10/5 11:42:04 来源:尧图企业网站定制
又到了一年一度毕业设计开题的时候。每年这时候后台收到的咨询里基于XX的XX平台[VUE]这种格式的题目占比相当高而养宠记录平台这个方向说实话我一直觉得被低估了——它不像电商、图书管理那样烂大街又天然带着用户注册登录 核心业务数据的增删改查 可视化统计这套标准的毕设组合拳用来展示Vue的技术栈能力非常合适。这篇文章我会直接从毕设落地的角度出发讲讲如果让我从零开始做一个基于Vue的养宠记录平台我会怎么拆分需求、设计数据表、组织前端工程以及在最后交付LW文档和源码时应该避开的坑。需要说明的是技术栈的前端用Vue是题目定死的所以后面的内容一律默认前端是Vue建议直接上Vue 3 Vite Pinia Element Plus这套组合后端可以从Spring Boot、Node.js、Python里选一个你顺手的。我自己演示用的示例会尽量做到语言无关重点是思路通不通。1. 先把养宠记录这个题目拆明白需求边界与功能清单很多同学拿到这种题目上来就建项目写代码写了两周发现这个也要做那个也要做最后哪个都没做完。这就是典型的没有先划清楚需求边界。毕设题目叫养宠记录平台关键词是记录——记住你的核心是帮用户把养宠过程中产生的信息数字化、结构化、可追溯而不是做一个宠物社交App也不是宠物电商。1.1 从我要是用户我最想记什么倒推功能我自己养过猫也养过狗站在真实铲屎官的角度养宠记录这件事最痛的点无非这几个:基本信息老忘这只宠物几号打的疫苗、用的什么牌子驱虫药、上次体内外驱虫是什么时候全靠微信聊天记录翻。成长数据散落体重变化、进食量、排泄情况今天记了明天不记根本形不成趋势。就医记录混乱什么时候生过病、在哪家医院看的、医生开了什么药、花了多少钱时间一长全忘了。日常排泄和喂食很规律偶尔出现异常比如一天拉了五次想回看前几天的记录做对比。这四条对应到系统里就是四块核心模块宠物档案管理、日常记录喂食/排泄/体重/活动、健康管理疫苗/驱虫/就医、统计报表。我建议功能清单就锁定在这四块上再加上用户注册登录和首页Dashboard一共六个模块非常完整也不臃肿。千万不要随手加宠物论坛领养中心在线问诊这类需求加了就是给自己埋雷。1.2 平台角色的设定建议有的同学喜欢做多角色平台管理员、普通用户、商家三种角色巴拉巴拉一堆。我的建议是毕业设计阶段只保留两类角色最合理普通用户注册登录后管理自己的宠物添加记录、查看统计。系统管理员查看用户列表、宠物总数、平台记录总览数据可以对违规内容做删除处理。平台这个后缀听起来好像一定要有很多人在上面互动但其实毕设答辩老师更看重的是你考虑到了一个真实系统该有的权限边界。你在系统里把普通用户和管理员的入口分开前端可以用路由守卫后端可以用拦截器就能把权限控制这块讲清楚这就已经超出绝大多数同题目的完成度了。1.3 给功能排优先级MVP先跑通再做加分项毕设的时间线通常在三到四个月你可能还要实习、上课、考研真正写代码的时间很可能只有两周到一个月。所以我强烈建议把功能分成两个批次第一批主干必须全部完成用户注册、登录、退出Token鉴权宠物档案的增删改查 上传头像日常记录喂食/体重/排泄的增删改查疫苗、驱虫、就医记录的管理带日期字段首页Dashboard数字卡片宠物数、今日记录数、待办提醒数简单的体重趋势图表第二批加分项有余力再做用药提醒的定时任务/到期提醒列表多宠物数据对比同一维度的折线图叠加消费记录模块自动汇总月开销Excel导出功能深色模式切换这套思路我在后面章节展开时会始终遵循先保证CRUD闭环完整、代码干净再考虑额外亮点。你只要把第一条路的六个模块全部做扎实答辩已经稳过了。2. 数据建模是毕设的隐形评分点表结构怎么设计决定你后期少改多少代码我见过太多人代码写得马马虎虎但数据库表设计得一团糟导致后面加功能就报错。毕设答辩时老师翻开你的数据库设计文档第一个看的就是表和表之间的关系合不合理。养宠记录平台的数据模型其实非常典型非常适合在论文里画E-R图。2.1 核心实体关系一个用户多只宠物一只宠物多条记录这是一个经典的一对多 一对多层级结构。核心数据表我建议这样设计user用户表id, username, password加密存储, nickname, avatar, create_timepet宠物表id, user_id外键, name, species猫/狗/其他, breed, birthday, gender, weight, avatar, remarkcare_record日常记录表id, pet_id外键, record_typefeed/weight/excretion/activity, content, record_datehealth_record健康档案表id, pet_id外键, health_typevaccine/deworming/medical, title, description, record_date, next_dateexpense_record消费记录表可选加分项id, pet_id, expense_type, amount, note, expense_date这里有个细节很多同学容易犯不要把宠物字段全写到一张表里。比如最近一次驱虫时间有人为了查询方便加在pet表里结果驱虫记录一更新pet表也要跟着改数据冗余不说还容易不一致。正确的做法是通过health_record表去查每种类型的最新一条记录查询时用ORDER BY record_date DESC LIMIT 1即可。2.2 字段类型与索引设计的几点建议主键统一用自增int或雪花id我习惯用自增毕设展示够用。时间字段统一DATETIME前端传字符串后端解析别混着TIMESTAMP和DATETIME用。身份证号这类加密字段不要存明文但毕设场景下用户密码用BCrypt加密一定要做这是安全意识的体现。注意密码字段长度要预留至少60位BCrypt生成的hash长度固定为60。所有外键字段都要建普通索引这个在答辩时如果老师问你做了哪些优化你可以很自然地答出对外键和常用查询字段建立了索引。2.3 后端接口设计RESTful风格是最省事的答案接口路径不需要搞得很花哨遵循基本的RESTful约定即可POST /api/user/register 用户注册 POST /api/user/login 用户登录 GET /api/user/info 获取当前登录用户信息 GET /api/pet/list 当前用户的宠物列表 POST /api/pet/add 添加宠物 PUT /api/pet/update 修改宠物信息 DELETE /api/pet/delete/{id} 删除宠物同时删除其下所有记录 GET /api/record/list?petIdxxtypexx 记录列表按宠物过滤 POST /api/record/add 添加记录 PUT /api/record/update 修改记录 DELETE /api/record/delete/{id} 删除记录 GET /api/health/list?petIdxx 健康记录列表 POST /api/health/add 添加疫苗/驱虫/就医记录 ...有几个问题你可能会遇到提前说删除宠物时它下面的记录怎么办我建议做级联删除。虽然逻辑删除听起来更高级但在数据量不大的毕设系统里物理级联删除反而干净而且代码好写——在Mapper里写一个DELETE FROM record WHERE pet_id ?即可。你要是想演示事务可以顺带讲讲这里使用了事务保证一致性是个不错的加分点。3. Vue前端工程搭建细节从目录设计到路由、状态管理、组件划分前端部分建议使用 Vue 3 的组合式APIComposition API工程化工具选Vite。理由很简单Vite启动快、配置少毕业论文里的开发环境搭建章节你能少写两页废话Vue 3 script setup写起来确实比Options API清爽很多。3.1 目录结构按视图 组件 组合式函数来分我推荐一个比较常规但也足够清晰的目录组织方式src/ ├── api/ # 接口请求封装axios实例 各模块接口 │ ├── request.js # axios封装拦截器在这里 │ ├── auth.js # 登录注册相关接口 │ ├── pet.js # 宠物档案接口 │ └── record.js # 日常记录接口 ├── assets/ # 静态资源 ├── components/ # 全局通用组件比如UploadAvatar、DataTable ├── composables/ # 组合式函数比如usePagination、useForm ├── router/ # 路由配置 │ └── index.js ├── stores/ # Pinia状态管理 │ ├── user.js # 用户状态 │ └── app.js # 应用状态侧边栏折叠等 ├── views/ # 页面级组件 │ ├── Login.vue │ ├── Register.vue │ ├── Dashboard.vue │ ├── pet/ │ │ ├── PetList.vue │ │ ├── PetForm.vue │ │ └── PetDetail.vue │ ├── record/ │ │ ├── RecordList.vue │ │ └── RecordForm.vue │ └── health/ │ ├── HealthList.vue │ └── HealthForm.vue ├── App.vue └── main.js这里我说一个很多毕设代码里的通病把请求直接写在组件里。比如某页面需要加载宠物列表就直接在onMounted里fetch然后每个页面复制粘贴一段请求代码。一旦接口地址改了你要全局搜索改上千行。正确的做法是src/api下按模块封装接口函数组件里只调用这些函数这是代码分层最基本的要求也是答辩时展示工程化思维的切入点。3.2 路由与权限守卫登录后才能进入系统路由设计上有两处值得写清楚第一按视图分层级。登录/注册页属于无布局路由而系统主界面统一用Layout布局包裹。这可以通过路由嵌套实现{ path: /, component: () import(/layouts/BasicLayout.vue), redirect: /dashboard, children: [ { path: dashboard, name: Dashboard, component: () import(/views/Dashboard.vue), meta: { title: 首页总览 } }, { path: pet, name: PetList, component: () import(/views/pet/PetList.vue), meta: { title: 宠物档案 } }, { path: record, name: RecordList, component: () import(/views/record/RecordList.vue), meta: { title: 日常记录 } }, { path: health, name: HealthList, component: () import(/views/health/HealthList.vue), meta: { title: 健康档案 } } ] }注意这里所有的component我都用的是() import()这种懒加载形式。答辩时被问到前端性能优化你可以直接拿这个说事路由级代码分割按需加载页面组件减少首屏包体积。第二全局前置守卫做登录校验。用Vue Router提供的beforeEach钩子实现未登录用户不能访问系统内部页面router.beforeEach((to, from, next) { const userStore useUserStore() if (to.path ! /login !userStore.isLoggedIn) { next({ path: /login, query: { redirect: to.fullPath } }) } else { next() } })这个逻辑虽然基础但如何从localStorage中恢复登录状态Token过期时前端如何处理比如跳转登录页清空本地缓存这两个延伸问题也建议提前想清楚答辩很爱问。我的习惯是在useUserStore初始化时读一次localStorage中存的token和用户信息axios拦截器里判断响应状态码为401时自动清除并跳转登录页这个套路基本通用。3.3 状态管理别乱放把用户信息交给Pinia就够了前面提到用Pinia管理用户状态这里我需要提醒一句不要把组件之间临时传的数据都放进store里。毕设级别的系统里store只放两类东西就够用户登录信息token、用户名、头像、角色全局UI状态侧边栏是否折叠、当前选中的宠物ID其他组件间数据传递优先通过props和事件完成。这样可以避免store变成一个大垃圾场状态管理这部分在论文里写起来也更有条理。另外如果有当前选中哪只宠物这种跨页面需求比如在宠物详情页里切换日常记录/健康档案两个Tab把它放在Pinia里确实比路由参数传id方便很多可以看作一个合理的全局状态用例。3.4 组件设计一个页面至少拆成列表 表单 弹窗三件套Vue的开发效率很大程度上体现在组件复用上。拿宠物档案管理这个页面来说我建议拆成三个文件PetList.vue— 负责表格展示、搜索栏、分页PetForm.vue— 负责新增/编辑的弹窗表单封装成DialogUploadAvatar.vue— 负责头像上传全局复用这样做的好处是新增宠物和编辑宠物共用一个表单组件只是通过form.initData是空对象还是已有宠物对象来区分。日常记录、健康记录模块同理。你在答辩时说页面采用组件化拆分表单组件复用率较高这句话是有实打实的代码支撑的。具体的实现上Element Plus的el-dialogel-formel-table这套三件套可以说是毕设标配网上demo也多我不具体展开了。但有一个坑必须提醒编辑弹窗打开时要给表单的每个字段赋初始值不要直接复用上次关闭时的残留数据。最简单的方式是打开弹窗时用Object.assign重置数据或者给el-dialog加destroy-on-close属性实测下来这个属性省了很多莫名其妙的bug。4. 养宠场景里的几个核心交互图片上传、到期提醒、统计图表功能模块都建好之后真正让你和课本idemo拉开差距的是这些养宠场景特有的交互细节。我挑三个最实用、也最能写进论文里的展开讲。4.1 宠物头像上传压缩 回显 持久化图片上传几乎是每个毕设系统绕不开的点。宠物头像、健康记录里的处方单照片都用得上。用Element Plus的el-upload实现上传是比较省力的方案但有两个细节要注意第一本地开发时的后端存储路径。你没有OSS账号也不想配MinIO的话最简单的方案是后端接口接收文件后保存到本地指定目录比如/upload/petAvatar/然后把访问URL返回给前端。这样在Vue里只需要把el-upload的action指向你的上传接口上传成功后拿返回的URL回填到表单的avatar字段。注意后端需要对文件的访问做静态资源映射否则图片在浏览器里无法显示。以Spring Boot为例Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/upload/**) .addResourceResolver(new PathResourceResolver() { Override protected Resource getResource(String resourcePath) throws IOException { return new FileSystemResource(upload/ resourcePath); } }); } }一般毕设项目里用FileSystemResource指向本地绝对路径http://localhost:8080/upload/xxx.jpg就能直接访问了。第二一定要做文件大小限制和类型过滤。这话我说了无数遍了但还是有人不做。el-upload的before-upload钩子里写一个简单判断const beforeUpload (file) { const isImage file.type.startsWith(image/) const isLt5M file.size / 1024 / 1024 5 if (!isImage) { ElMessage.error(只能上传图片文件) return false } if (!isLt5M) { ElMessage.error(图片大小不能超过5MB) return false } return true }5MB这个阈值配上前端压缩比如用canvas把图片压到指定尺寸再上传已经足够体面。你要是连压缩逻辑也写出来了这块在答辩时就是一个完整的前端文件预处理案例很能加分。4.2 疫苗/驱虫到期提醒前端展示 后端计算养宠记录平台里下次驱虫时间到了没是很有场景感的功能。实现思路其实不复杂健康记录表里存了next_date字段前端在Dashboard上设计一个待办提醒卡片遍历当前用户所有宠物的健康记录筛选出next_date在当前日期前后7天内的条目展示为乐乐 2天后需要做体内驱虫这样的提示。这里有一个经验之谈这个逻辑放在前端做虽然可行但如果宠物多、健康记录多请求数据要拉全量记录不优雅。更合理的做法是把是否到期的判断交给后端GET /api/health/reminder?days7后端在SQL里用日期函数直接过滤比如MySQL的DATE_SUB(NOW(), INTERVAL 7 DAY)和DATE_ADD(NOW(), INTERVAL 7 DAY)之间的数据都算临期提醒前端拿到列表直接渲染。这样的设计在论文里你还能顺带谈一句将查询逻辑下推到数据库层减少网络传输数据量。4.3 体重趋势可视化ECharts是真爱但记得处理空数据数据可视化是养宠记录这块最容易出彩的地方。体重变化折线图、消费柱状图、喂食频率饼图都可以用ECharts实现。Vue 3里用echarts核心包 vue-echarts组件库是比较顺滑的搭配也可以直接在onMounted里初始化实例。我给你一个最核心的建议把图表的配置数据和业务数据分开。你从后端拿到的是类似[{ date: 2024-01-01, weight: 4.2 }, { date: 2024-01-15, weight: 4.5 }]这样的原始数据前端需要把它map成ECharts需要的月份数组和数值数组再灌入option。不要在后端拼好ECharts的option结构否则图表的交互控制比如切换指标会变得很痛苦。另外一个常见的坑是空数据导致图表渲染报错或显示空白。所以在渲染图表前一定要判断数据数组长度是否为0if (weightData.length 0) { chart.showLoading({ text: 暂无体重记录, effect: bubble, }) } else { chart.hideLoading() chart.setOption(option) }这个小细节我在帮别人审代码时看到过至少五次——数据为空时ECharts的xAxis.data会是空数组直接报Error in mounted hook: Error: Component series.line not exists或者干脆白屏答辩演示时非常尴尬。提前处理好了这段代码是你很加分的健壮性设计。5. 从能跑到能交付LW文档、源码整理与答辩演示的实战经验很多同学代码写得很顺但最后栽在交付环节——LW文档写得稀烂压缩包打开没README答辩现场演示踩进自挖的坑。这部分我多花点篇幅讲因为它和代码质量同等重要。5.1 LW文档不要抄模板按问题的提出—解决过程—验证结果主线写毕业设计的LW文档我们那年叫论文或说明书你们叫LW一般包含开题、中期、终稿几个阶段但核心章节其实是固定的绪论研究背景与意义、国内外研究现状、本文主要工作相关技术介绍Vue、Element Plus、Pinia、后端框架、数据库系统分析可行性分析、需求分析、用例图、功能模块图系统设计总体架构图、功能设计、数据库设计E-R图 表结构系统实现核心功能实现的截图 关键代码片段 实现说明系统测试功能测试用例表 测试结果要避免的写法是介绍Vue时把官网的响应式、组件化、虚拟DOM直接抄一遍占了一页纸却说不出你项目里哪里用到了这些特性。比较靠谱的做法是每个技术特性都跟你的项目绑定着写。比如写组件化就配一段你拆分PetForm.vue复用的代码写数据驱动视图就用体重记录新增后列表和图表同步更新的例子。这样的文档一看就是真实做过项目的而不是纯凑字数。数据库设计这一节是最好出彩的地方。把E-R图画清楚每张表配上字段注释字段名、类型、约束、说明然后挑一两个核心业务的SQL查询比如查询当前用户所有宠物的最新体重记录讲讲思路这部分内容很容易达到你想要的细节丰富效果。5.2 源码交付前的三个必要动作清理、README、本地可跑通先说清理。由于毕设源码一般要上传到学校系统或者打包发给导师务必在交付前删除以下内容node_modules目录太占空间对方装依赖即可项目里残留的测试console.log本地数据库的账号密码硬编码尽可能改成config读取或者在README中写明默认账号IDE配置文件.idea/.vscode可选但建议把.vscode里带个人路径的配置删掉。然后是README。我用几句话总结一下一个能让对方快速跑起来的README必须包含的信息项目介绍一句话技术栈清单前端Vue版本、UI库、构建工具后端框架、数据库版本环境要求Node版本、Java版本、MySQL版本数据库初始化步骤提供sql/init.sql或自动执行的Flyway脚本启动步骤前端npm installnpm run dev后端如何启动写明端口默认账号如果有管理员账号写清楚方便答辩老师直接登录演示这里的核心思路是任何一步都不能依赖我来演示的时候你看着就行这种口头沟通。所有东西都要落到文档上。我遇到过一个很典型的情况学生把代码发给导师导师在自己电脑上跑不起来原因是学生本地装了MySQL 5.7导师是MySQL 8.0建表语句里某个字段类型直接报错。如果你在README里写明本项目使用MySQL 5.7测试8.0需注意xxx兼容性这个问题就规避了。还有如果你后端用了Redis一定要在README里写明需要本地启动Redis默认端口6379密码为空不然对方跑起来发现登录报错会非常崩溃。5.3 答辩演示Demo的动线设计按故事线操作不要满屏乱点答辩现场的演示环节我见过最差的演示是打开系统登录后从第一个菜单点到最后一个菜单每个页面停留不超过三秒没有讲解重点——老师根本不知道你想展示什么。比较好的演示方式是提前准备一条故事线比如从注册开始现场注册一个新用户顺便讲用户密码加密存储登录后进入空状态Dashboard显示初始统计为0添加一只宠物猫/狗上传头像填写生日、性别讲宠物档案设计进入日常记录连续添加一周的喂食和体重记录演示表单校验和数据联动切到体重图表页展示折线图如何随新增数据变化这里讲ECharts的配置和数据的响应式更新进入健康档案添加一条疫苗记录设置下次驱虫日期为7天后再回到Dashboard展示待办提醒卡片出现该事项最后切到管理员账号展示用户列表和平台总览这条线的妙处在于每一步都在验证一个功能点且前后有因果关联老师看完能立刻明白你的系统是活的。如果时间有限缩减版至少要把第3、4、6步做完整。说到这里我想提醒一个很细节但影响很大的点演示电脑的浏览器环境和屏幕分辨率。曾经有学生在答辩现场用投影仪演示他的页面用了固定宽度结果在投影上被拉伸变形表格被截断。提前用答辩现场的电脑调试一下或者至少把浏览器缩放比例调好这种低级意外完全可以通过提前踩点避免。6. 一些关于Vue的延伸思考面试时这道毕设题还能怎么讲如果这篇博文的读者里有人的目标不只是混过答辩而是想把这份毕设经历写进简历、在面试时候给面试官讲出亮点那我可以再往深挖一层。毕竟基于VUE的养宠记录平台这个题目本身的技术含量不算很高但你怎么讲它决定了面试官认为你是只会调库还是有一定工程思维。面试时你可以围绕这几个点主动展开为什么选Vue 3的组合式API标准答案可以是项目中有多个业务模块组合式API可以把同一个业务逻辑的相关代码比如获取宠物列表、按钮权限、筛选条件组织在一起相比Options API散落在data、methods、watch里更聚合、更易维护。再配合一个composables/usePetList.js的实际例子说服力很强。你们项目的权限控制是怎么做的把路由守卫 后端接口鉴权 Pinia存储用户信息和角色这条链路串起来讲一次就足以让面试官觉得你不是只做了登录页的UI。数据比较多的时候你怎么优化可以讲分页组件的封装、路由懒加载、图片按需压缩、后端接口对列表页只返回必要字段。虽然这些大部分是毕设场景的常规操作但你能把为什么这么做讲清楚就已经超过很多背八股文的候选人了。不过要泼一盆冷水面试官看你简历上写着基于VUE的养宠记录平台大概率心里预期不高所以你能讲出上面任意两个深入点就已经是超预期。真正拉开差距的不是项目多高大上而是你在项目里有没有做过决策——为什么这张表要这样设计为什么这个数据要放在Pinia里而不是sessionStorage为什么上传组件要包一层把这些决策讲清楚就是你区别于照着教程敲代码的那部分价值。另外我建议做完这个毕设之后如果你还有精力可以顺手把其中一两个模块升级一下比如接入图片直传OSS、给后端加上参数校验和全局异常处理器、加一个简单的操作日志表。这些升级点不一定要写进毕设里但可以作为你简历上后续优化方向来提比空泛地写熟悉Vue开发要好得多。啰嗦得差不多了最后给正在肝毕设的同学打个气。养宠记录平台这个题目胜在题材贴近生活功能需求清晰技术栈主流——你只要按照需求边界 → 数据模型 → 前端工程 → 核心交互 → 交付文档这条路径一步步走绝对可以产出一份对得起自己大学四年、经得起答辩老师追问的作品。我在做这类指导时最大的体会是毕设的难点从来不是你不会而是你不肯先花半天把思路捋清楚。希望这篇文章能帮你省掉那半天的纠结直接开始干活。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑