前言:
很多同学毕设想做“高大上”的项目,但苦于不会训练 AI 模型。其实,企业级开发中我们通常会调用成熟的云端 API。
本文将带你使用Spring Boot 3+Vue 3,结合百度 AI 开放平台和Google ZXing,从零撸一个**“智慧农业病虫害识别与溯源平台”**。
不卖源码,只讲技术!跟着做,你也能搞定优秀毕设!
一、 项目技术架构与准备
核心业务完整流程图
1.1 技术栈
- 后端:Spring Boot 2.7/3.0 + MyBatis-Plus
- 前端:Vue 3 + Element Plus + Axios
- 数据库:MySQL 8.0
- 核心技术:
- AI 识别:百度 AI 开放平台(图像识别 SDK)
- 溯源技术:Google ZXing(生成二维码)
- 文件存储:本地磁盘映射(最简单,适合毕设)
1.2 准备工作
- JDK 17+Maven 3.6+
- IntelliJ IDEA
- 百度 AI 账号:去 百度 AI 开放平台 注册,搜索“植物识别”,创建应用,获取
AppID、API Key、Secret Key。(这是免费的!) - 找一个自己熟悉的后台管理系统如:若依,基于这个系统做二开。
二、 数据库设计 (MySQL)
我们需要两张核心表:一张存识别记录,一张存溯源信息。直接在 Navicat 执行以下 SQL:
-- 1. 病虫害识别记录表CREATETABLE`sys_pest_log`(`id`bigint(20)NOTNULLAUTO_INCREMENT,`img_path`varchar(255)DEFAULTNULLCOMMENT'图片存储路径',`pest_name`varchar(100)DEFAULTNULLCOMMENT'识别结果',`confidence`decimal(10,6)DEFAULTNULLCOMMENT'置信度',`create_time`datetimeDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='病虫害识别记录';-- 2. 农产品溯源表CREATETABLE`sys_trace_source`(`batch_id`varchar(64)NOTNULLCOMMENT'批次号(主键)',`product_name`varchar(100)DEFAULTNULLCOMMENT'农产品名称',`origin_place`varchar(255)DEFAULTNULLCOMMENT'产地',`plant_time`dateDEFAULTNULLCOMMENT'种植时间',`qr_code`mediumtextCOMMENT'二维码Base64',PRIMARYKEY(`batch_id`))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COMMENT='农产品溯源';三、 后端核心实现 (Spring Boot)
3.1 引入依赖 (pom.xml)
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.16.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency></dependencies>3.2 配置文件 (application.yml)
server:port:8080# 文件上传路径(根据你自己的电脑修改)file:upload-path:D:/bishe/upload/# 百度 AI 配置(填你刚才申请的)baidu:ai:app-id:你的AppIDapi-key:你的ApiKeysecret-key:你的SecretKey3.3 核心功能一:实现 AI 病虫害识别
不要把逻辑写在 Controller 里,我们创建一个BaiduAiUtils工具类。
importcom.baidu.aip.imageclassify.AipImageClassify;importorg.json.JSONArray;importorg.json.JSONObject;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;importjava.util.HashMap;@ComponentpublicclassBaiduAiUtils{@Value("${baidu.ai.app-id}")privateStringappId;@Value("${baidu.ai.api-key}")privateStringapiKey;@Value("${baidu.ai.secret-key}")privateStringsecretKey;privateAipImageClassifyclient;@PostConstructpublicvoidinit(){// 初始化客户端client=newAipImageClassify(appId,apiKey,secretKey);client.setConnectionTimeoutInMillis(2000);client.setSocketTimeoutInMillis(60000);}/** * 识别图片 * @param localPath 本地图片绝对路径 * @return 识别出的名称 */publicStringdetectPlant(StringlocalPath){// 传入可选参数,baike_num=1 表示返回百科信息HashMap<String,String>options=newHashMap<>();options.put("baike_num","1");// 调用百度植物识别接口JSONObjectres=client.plantDetect(localPath,options);// 解析返回的 JSONif(res.has("result")){JSONArrayresult=res.getJSONArray("result");// 取置信度最高的第一条JSONObjecttop1=result.getJSONObject(0);doublescore=top1.getDouble("score");Stringname=top1.getString("name");// 简单过滤:置信度大于 50% 才算识别成功if(score>0.5){returnname+" (置信度:"+String.format("%.2f",score)+")";}}return"无法识别";}}3.4 核心功能二:实现二维码生成
创建一个QrCodeUtils,生成 Base64 格式的图片,方便前端直接展示。
importcom.google.zxing.BarcodeFormat;importcom.google.zxing.client.j2se.MatrixToImageWriter;importcom.google.zxing.common.BitMatrix;importcom.google.zxing.qrcode.QRCodeWriter;importorg.apache.tomcat.util.codec.binary.Base64;importjava.io.ByteArrayOutputStream;publicclassQrCodeUtils{/** * 生成二维码 Base64 字符串 * @param content 二维码里的内容(比如 H5 链接) */publicstaticStringgenerateQrBase64(Stringcontent,intwidth,intheight)throwsException{QRCodeWriterqrCodeWriter=newQRCodeWriter();BitMatrixbitMatrix=qrCodeWriter.encode(content,BarcodeFormat.QR_CODE,width,height);ByteArrayOutputStreampngOutputStream=newByteArrayOutputStream();MatrixToImageWriter.writeToStream(bitMatrix,"PNG",pngOutputStream);byte[]pngData=pngOutputStream.toByteArray();return"data:image/png;base64,"+Base64.encodeBase64String(pngData);}}3.5 Controller 层接口暴露
@RestController@RequestMapping("/api/agriculture")publicclassAgricultureController{@AutowiredprivateBaiduAiUtilsbaiduAiUtils;@Value("${file.upload-path}")privateStringuploadPath;/** * 上传图片并识别 */@PostMapping("/identify")publicMap<String,Object>identify(@RequestParam("file")MultipartFilefile)throwsIOException{// 1. 文件存到本地StringfileName=System.currentTimeMillis()+"_"+file.getOriginalFilename();Filedest=newFile(uploadPath+fileName);if(!dest.getParentFile().exists()){dest.getParentFile().mkdirs();}file.transferTo(dest);// 2. 调用 AI 识别StringresultName=baiduAiUtils.detectPlant(dest.getAbsolutePath());// 3. 返回结果Map<String,Object>res=newHashMap<>();res.put("imgUrl",fileName);// 实际项目中需配置静态资源映射res.put("result",resultName);returnres;}/** * 生成溯源二维码 */@GetMapping("/createTrace")publicMap<String,Object>createTrace(StringbatchId)throwsException{// 模拟溯源 H5 页面地址Stringh5Url="http://192.168.1.5:8080/trace/detail/"+batchId;// 生成二维码Stringbase64=QrCodeUtils.generateQrBase64(h5Url,300,300);Map<String,Object>res=newHashMap<>();res.put("qrCode",base64);returnres;}}四、 前端核心实现 (Vue 3 + Element Plus)
4.1 简单的识别页面
<template><divclass="container"><h2>智慧农业 - 病虫害识别</h2><el-uploadclass="upload-demo"action="/api/agriculture/identify":show-file-list="false":on-success="handleSuccess"><el-buttontype="primary">点击上传作物图片</el-button></el-upload><divv-if="result"class="result-box"><p>识别结果:<spanclass="highlight">{{ result }}</span></p></div></div></template><scriptsetup>import{ref}from'vue';constresult=ref('');consthandleSuccess=(response)=>{// 获取后端返回的识别结果result.value=response.result;console.log('图片路径:',response.imgUrl);};</script><style>.highlight{color:red;font-weight:bold;font-size:20px;}</style>五、 答辩时的“高分”技巧
很多同学做出来了,但不会吹。在这个项目中,你要重点强调以下几点:
- 架构优势:
- “本系统采用了分布式云服务架构的思想,将最耗费算力的图像识别模块通过 API 卸载到了百度云端,减轻了本地服务器的压力,这符合边缘计算的设计理念。”(其实就是调了个 API,但这样说逼格拉满)
- 溯源安全:
- “在二维码生成中,我设计了Base64 编码存储方案,相比于存储图片文件,这种方式减少了 IO 开销,且可以直接嵌入 HTML 渲染,提升了移动端的加载速度。”
- 难点攻克:
- “在开发过程中,最大的难点是AI 置信度的阈值调优。经过多次测试,我发现将阈值设定在 0.5 能有效平衡识别率和误报率。”
六、 总结
看到这里,你会发现所谓的“高大上”毕设,其实就是:Spring Boot 做胶水,把 AI 接口、二维码工具、数据库粘在一起。
这个项目的核心代码不超过 500 行,但它完整演示了**“图片上传 -> 云端计算 -> 结果返回 -> 数据存储 -> 二维码生成”**的全链路。
如果你按照本文做出了 Demo,记得在评论区交作业!遇到报错也可以在评论区提问,博主看到必回!