基于Vue和cube-UI的养殖管理APP毕业设计实战教程

发布时间:2026/9/15 10:47:31
基于Vue和cube-UI的养殖管理APP毕业设计实战教程 简介面向大学生毕业设计项目实训的Vue养殖类APP项目源码基于Vue.js与cube-UI组件库开发适合正在准备毕业设计或希望提升前端实战能力的学生。压缩包大小约5.98MB主要内容为Vue项目源码涵盖Vue基础、组件化设计、状态管理、路由配置、API接口调用、cube-UI界面搭建及移动端适配等关键知识点可帮助读者完整理解移动端应用的开发流程。项目从零实现一个养殖类APP利用cube-UI快速构建规范美观的界面同时结合Vuex进行状态管理、Vue Router实现页面导航并通过axios与后端交互能有效锻炼从组件拆分到打包部署的全链路能力。已有645人学习下载适合作为课程设计、毕业设计以及Vue入门后的进阶练习参考。1. 养殖类APP毕业设计用Vuecube-UI做出来的系统为什么能打毕设答辩时做商城和订餐系统的同学都被评委追问“你的系统有什么实际意义”而做养殖管理APP的那个反而轻松过关因为他的选题直接落到了“猪场管理”这个具体业务上录投喂记录、看生长曲线、刷环境监控。这类项目用Vue 2 cube-UI来搭是最稳的组合cube-UI是滴滴开源的移动端组件库内置Form、Chart、Slide、Dialog这些业务组件风格统一不需要自己拼UI。本文就拿一个典型的养殖APP猪舍管理做例子把工程搭建、数据录入、看板展示、视频监控、打包部署和答辩验证整条链路完整跑一遍你照着做就能复现一个能演示、能答辩、能扩展的养殖类APP毕业设计项目。2. 搭建Vue养殖APP工程骨架环境配置、依赖安装与数据模型2.1 vue-cli初始化项目并引入cube-UI注意版本兼容养殖APP的移动端页面密度高、输入项多用原生CSS手写表单和弹窗会拖慢进度。cube-UI这类成熟的移动端UI库能直接提供表单校验、日期选择、图表和轮播所以先别急着写业务代码把工程和环境配好是第一优先级。创建一个新的Vue 2项目并接入cube-UI终端依次执行node -v # 确认Node版本Vue 2 cube-UI建议用14~16 npm install -g vue/cli # 安装vue-cli脚手架 vue create livestock-app # 创建项目选择Vue 2预设 cd livestock-app npm install cube-ui --save vue add cube-ui # 通过插件自动配置按需引入和主题变量vue add cube-ui会把babel.config.js自动改写为module.exports { presets: [vue/cli-plugin-babel/preset], plugins: [ [ cube-ui, { postCompile: true, // 开启后编译样式按需打包 theme: true // 允许覆盖主题变量如主色 } ] ] }这里的关键是postCompile: truecube-UI的样式会跟随项目的Less变量编译你可以把主色改成养殖场的绿色或者品牌色而不是固定用默认蓝色。theme: true配合src/theme/theme.styl里的变量修改比如$color-primary。如果你不想用插件也可以直接在main.js里import Cube from cube-ui; Vue.use(Cube)做全量引入但那样打包体积会大不少毕设答辩时如果被问到性能优化按需引入是更好的回答。2.2 养殖域的数据表设计与路由结构做养殖类APP业务数据模型是最能体现“毕业设计工作量”的部分。以猪舍管理为例核心实体有四张表分别是猪舍、批次、投喂记录和健康监测记录。表结构如下表名关键字段说明pest_househouse_id, area, capacity, temperature, humidity猪舍基础信息与实时环境数据batchbatch_id, house_id, breed, count, start_date养殖批次关联某猪舍feedingfeed_id, batch_id, feed_type, amount, feed_time投喂记录按批次归属health_recordrecord_id, batch_id, weight, temperature, status抽检体重、体温与健康状态前端路由按移动端管理APP的常规结构来划分/home养殖看板展示猪舍概览和异常告警/house猪舍列表点击进入详情/house/:id猪舍详情页包含视频监控和传感器数据/record投喂记录录入页/alarm异常告警中心路由表可以统一写在src/router/index.js里后续第4章会说明如何在页面间传递批次ID和设备编号。2.3 用cube-UI的Form组件做投喂记录录入页录入页是养殖APP的高频页面饲养员每天要记录多栏猪的投喂情况。cube-UI的Form组件支持字段配置化把表单项定义成schema对象页面里只写少量模板代码即可template cube-form :modelmodel :schemaschema submitsubmitHandler/cube-form /template script export default { data() { const model { batchId: , feedType: , amount: , feedTime: new Date() } const schema { fields: [ { type: select, modelKey: batchId, label: 批次编号, props: { options: [ { text: 2024-03批次, value: B001 }, { text: 2024-04批次, value: B002 } ] }, rules: { required: true, message: 请选择养殖批次 } }, { type: input, modelKey: feedType, label: 饲料类型, props: { placeholder: 如育肥猪配合饲料 }, rules: { required: true, message: 请输入饲料类型 } }, { type: input, modelKey: amount, label: 投喂量(kg), props: { type: number, placeholder: 请输入投喂量 }, rules: { required: true, message: 请输入投喂量 } } ] } return { model, schema } }, methods: { submitHandler(e) { e.preventDefault() // 通过API提交到后端成功后弹出提示 this.$createToast({ type: correct, txt: 投喂记录已保存, time: 1500 }).show() } } } /script这个配置里modelKey对应数据对象中的字段名rules声明校验规则props透传给底层原生表单控件。cube-form自带校验拦截提交时若字段为空会直接给出错误提示不会触发submitHandler这让表单开发省掉大量手写if判断。你可以在rule里配置pattern做自定义正则校验比如投喂量只允许数字和小数点。3. cube-UI核心组件在养殖看板中的实战图表、轮播与告警3.1 用cube-chart绘制体重生长曲线数据来自批次记录养殖APP里最有说服力的功能就是生长曲线把一个批次在不同时间点的平均体重画成折线图直接反映饲喂方案的效果。cube-UI内置了cube-chart组件它基于ECharts封装使用起来比直接操作ECharts简单在页面中引入后配置type和data即可template cube-chart typeline :dataweightChartData :optionschartOptions /cube-chart /template script export default { data() { return { weightChartData: { dimensions: [date], // 维度字段作为横轴 measures: [avgWeight], // 度量字段作为纵轴 source: [ { date: 04-01, avgWeight: 12.5 }, { date: 04-15, avgWeight: 21.3 }, { date: 05-01, avgWeight: 33.8 }, { date: 05-15, avgWeight: 47.2 } ] }, chartOptions: { xAxis: { type: category }, yAxis: { name: 体重(kg) } } } } } /scriptdimensions声明了横轴字段measures声明纵轴字段source就是接口返回的原始数据数组。后端只需返回这种二维表结构前端不用做数据转换。要注意的是cube-chart在数据更新时是整体重绘所以如果后续需要追加新的称重数据直接替换source数组触发响应式更新即可不需要手动调用ECharts的setOption。为了满足毕设的“数据分析”要求你还可以在chartOptions里加一个markLine把目标体重设成参考线饲养员一眼就能看出当前批次是否达标。3.2 用cube-slide和cube-scroll搭出养殖场看板首页看板首页是APP的门面通常用轮播图放养殖场实景或宣传图下方用可滚动列表展示猪舍状态卡片。cube-UI的cube-slide组件实现轮播非常轻量数据数组里放图片地址和跳转配置template cube-slide :dataslides changeonSlideChange/cube-slide /template script export default { data() { return { slides: [ { url: require(../assets/slide1.jpg), title: 标准化猪舍 }, { url: require(../assets/slide2.jpg), title: 自动饲喂线 } ] } }, methods: { onSlideChange(index) { console.log(当前轮播索引, index) } } } /scriptcube-slide支持autoPlay、interval和loop属性配置默认自动轮播并循环播放。猪舍状态列表用cube-scroll包裹它提供移动端的下拉刷新和上拉加载能力cube-scroll refscroll :datahouseList pulling-downrefreshHouses pulling-uploadMoreHouses ul classhouse-list li v-foritem in houseList :keyitem.house_id clickgoDetail(item.house_id) span{{ item.house_name }}/span span温度 {{ item.temperature }}℃/span span湿度 {{ item.humidity }}%/span /li /ul /cube-scrollpulling-down和pulling-up事件分别对应下拉刷新和上拉加载接口请求完成后需要调用this.$refs.scroll.forceUpdate()告知滚动组件数据已更新。这是毕设演示时很容易被忽略的细节不调用forceUpdate滚动组件会认为数据没有变化下拉刷新的loading状态会卡住。3.3 用Dialog和Toast处理环境异常告警配合vue路由跳转养殖中最怕温湿度超标轻则影响生长速度重则造成牲畜死亡。APP里可以在看板首页定时轮询环境数据一旦温度超过阈值就弹出cube-dialog告警同时用cube-toast做轻提示template cube-dialog :visible.syncalertVisible title环境异常告警 content1号猪舍温度已达到32.5℃超过设定阈值30℃ confirmgoHouseDetail /cube-dialog /template script export default { data() { return { alertVisible: false, currentAlertHouse: null } }, methods: { checkEnvironment() { // 模拟接口返回的环境数据 const data { house_id: H001, temperature: 32.5, threshold: 30 } if (data.temperature data.threshold) { this.currentAlertHouse data.house_id this.alertVisible true } }, goHouseDetail() { this.alertVisible false this.$router.push(/house/${this.currentAlertHouse}) } } } /scriptcube-dialog的visible.sync做了双向绑定关闭按钮和确认按钮都会自动同步状态。confirm事件里跳转路由把用户带到出问题的猪舍详情页。轻提示场景用this.$createToast即可比如“保存成功”“网络异常”它会自动在屏幕上居中显示并在指定时间后消失。实际项目中我一般会把checkEnvironment放到mounted里执行一次再用setInterval每30秒轮询一次同时需要在beforeDestroy里清除定时器避免离开页面后还继续弹告警。4. 养殖监控与后台联调vue播放m3u8、路由传参与axios封装4.1 用video.js在APP里播放养殖场摄像头的m3u8监控流养殖类APP通常要接入猪舍摄像头做实时监控摄像头的RTSP流无法直接在浏览器播放需要先通过流媒体服务如ZLMediaKit或SRS转成HLS协议输出m3u8地址。前端播放m3u8最常用的方案是video.js安装时同时引入hls.js运行时会自动处理npm install video.js --save页面中的播放器代码template div video refvideoPlayer classvideo-js vjs-default-skin/video /div /template script import videojs from video.js import video.js/dist/video-js.css export default { data() { return { player: null } }, mounted() { const liveUrl http://your-server:8080/live/house01.m3u8 // 替换为实际m3u8地址 this.player videojs(this.$refs.videoPlayer, { autoplay: true, controls: true, sources: [{ src: liveUrl, type: application/x-mpegURL }] }) this.player.on(error, () { this.$createToast({ type: warn, txt: 视频流加载失败请检查网络, time: 2000 }).show() }) }, beforeDestroy() { if (this.player) { this.player.dispose() // 离开页面必须销毁播放器实例 } } } /scripttype: application/x-mpegURL告诉video.js这是一个HLS流video.js内部会调用hls.js完成分片拉流。答辩时如果评委问“为什么不用flv格式”你可以回答HLS基于HTTP协议天然穿透防火墙移动端兼容性好但延迟一般在3到5秒如果要做低延迟监控可以改用FLV flv.js方案但需要后端配合。另外dispose()一定不能漏否则页面切换后播放器后台仍在拉流既耗流量又导致内存泄漏。在4G弱网环境下m3u8播放会频繁卡顿建议在error事件里给用户明确的提示而不是让画面一直黑屏。4.2 vue路由参数传递批次ID与设备编号跨组件同步状态在养殖APP中从看板页点击某个猪舍进入详情页需要把猪舍ID传过去从猪舍详情进入投喂记录页需要带批次ID和设备编号。vue-router传递参数分两种方式一种是路径参数一种是query参数。典型的写法// 带路径参数跳转 this.$router.push({ path: /house/${houseId} }) // 带query参数跳转 this.$router.push({ path: /record, query: { batchId: B001, deviceNo: CAM-01 } })在目标组件里分别用this.$route.params.houseId和this.$route.query.batchId读取。路径参数适合表达层级关系比如“猪舍下的详情”query参数适合表达附加条件比如“从哪个设备跳过来的”。答辩时经常被问到一个问题如果用query传对象页面的URL会变得很长且无法序列化函数所以项目中只传基础字段复杂对象统一用Vuex或事件总线传递。另外要注意$route和$router是两个对象$route是当前路由信息$router是路由实例可以执行跳转很多新手在这个地方容易写混。4.3 axios拦截器封装与Spring Boot接口联调养殖APP的数据最终要落到后端毕设项目最常配的后端是Spring Boot前端通过axios加载数据。把axios封装成统一实例避免每个页面重复写baseURL和错误处理// src/api/http.js import axios from axios const service axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 环境变量区分开发/生产 timeout: 10000 }) // 请求拦截器统一加token service.interceptors.request.use( config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${token} } return config }, error Promise.reject(error) ) // 响应拦截器统一处理错误码 service.interceptors.response.use( response { const res response.data if (res.code ! 0) { // 业务错误统一弹toast this.$createToast({ type: warn, txt: res.msg, time: 2000 }) return Promise.reject(new Error(res.msg)) } return res.data }, error { if (error.response error.response.status 401) { // 登录过期跳转登录页 } return Promise.reject(error) } ) export default service接口定义单独建一个src/api/livestock.jsimport request from ./http export function getHouseList(params) { return request({ url: /api/house/list, method: get, params }) } export function getGrowthCurve(batchId) { return request({ url: /api/batch/growth, method: get, params: { batchId } }) } export function saveFeedingRecord(data) { return request({ url: /api/feeding, method: post, data }) }这样页面里调用getHouseList().then(data { this.houseList data })即可不需要关心axios实例细节。开发调试时建议在Chrome上装Vue Devtools配合vue.config.js里配置的代理转发把/api前缀代理到本地Spring Boot端口能避免跨域问题。如果毕设演示时用手机访问开发机注意手机和电脑要在同一局域网且Spring Boot启动时把server.address设为0.0.0.0否则手机连不上接口。5. 打包发布、布局异常修复与毕业设计答辩验证技巧5.1 vue打包后布局异常的排查思路很多同学开发环境一切正常npm run build之后部署到服务器发现页面变形、样式丢失或白屏。第一个要查的是资源路径默认打包后资源是绝对路径/js/xxx.js如果部署在子目录下就会404。在vue.config.js里设置module.exports { publicPath: ./ // 使用相对路径适配子目录部署 }第二个常见问题是cube-UI样式异常如果你手动引入单个组件而不是走vue add cube-ui的按需编译打包时可能样式未包含。解决方式是在main.js里显式import cube-ui/lib/cube.css或者回到postCompile方案重新构建。第三个问题是移动端适配的viewport丢失检查public/index.html里有没有meta nameviewport contentwidthdevice-width, initial-scale1.0, maximum-scale1.0, user-scalableno如果没有viewport标签移动端页面会按980px宽度渲染整个布局全部错乱这是打包后布局异常最常见的原因。如果还用了postcss-px-to-viewport做屏幕适配打包时要排除node_modules目录否则cube-UI的组件样式也会被转换导致间距错乱。5.2 cube-UI按需加载与性能瘦身毕设答辩时性能优化是加分项。cube-UI提供了按需加载的babel插件方案只打包用到的组件能显著减少vendor.js体积。通过vue add cube-ui安装后babel配置里已经自动加上了插件使用时直接import { Toast, Dialog, Form } from cube-ui不需要Vue.use(Cube)全量注册但每个组件要手动Vue.use(Toast)。除了组件按需还可以用路由懒加载让看板页和录入页分离打包减小首屏加载量const Home () import(../views/Home.vue) const Record () import(../views/Record.vue)一键构建后查看dist目录里各chunk的体积如果某个chunk超过300KB就得考虑是否把ECharts图表抽成懒加载。cube-UI的Chart组件体积较大只在详情页用了生长曲线的场景下把详情页改造成异步组件效果很明显。5.3 答辩现场的演示与验证清单毕业设计答辩现场最容易翻车提前准备一份验证清单比较稳妥。第一项是弱网容错用Chrome DevTools的网络面板设置Slow 3G打开APP确认页面有加载状态且接口失败时有Toast提示而不是白屏。第二项是缓存问题多次登录和退出登录确认token清理干净。第三项是不同设备适配找一台iPhone和一台安卓手机各测一遍录入页的表单对齐、图表缩放和m3u8播放如果时间有限至少要在Android Chrome和iOS Safari两个浏览器上验证。第四项是打包产物验证本地跑npm run build后用http-server dist起服务再在手机浏览器访问确认打包后图片能加载、路由刷新不404——如果出现404在vue.config.js里配置history路由的fallback为true。按照这套流程走完答辩时的演示会顺利很多评委问“你怎么保证系统稳定性”时你也能用这些验证细节给出具体回答。本文还有配套的精品资源点击获取