简介:智慧农场小程序.zip 是一套覆盖微信小程序前端与 PHP 后台的双端源码,面向农业信息化开发者、农场运营者以及想切入智慧农业赛道的小程序创业者。资源以租地种植、畜牧领养、智慧农场商城、拼购组团、签到积分商城、分销功能、物联网实时监测、积分兑换、农场直播对接等核心业务为主线,完整呈现了从用户下单、支付、后台管理到数据监测的闭环流程,便于开发者对照功能清单快速梳理租地订单、养殖记录、积分规则等关键模块。压缩包整体约 27.91MB,官方未提供文件总数与类型明细,但从资源描述可确认包含前端小程序模块与后台 PHP 业务模块,能支撑真实场景部署与二次开发。已有 759 人学习下载,适合具备 PHP 和微信小程序基础、希望快速搭建智慧农业应用或作为毕业设计、课程实训参考的开发者学习使用。
1. 收到智慧农场小程序.zip之后要做什么
拿到名为“智慧农场小程序.zip”的项目包,第一反应不是急着解压,而是先想清楚它最终要跑在哪。常见交付形态是前端小程序加后端接口服务,zip 是打包交付的唯一载体。你需要先识别里面的技术栈,再分别启动前端和后端,最后用微信开发者工具联调。这套流程适合刚接手此类源码包、想快速搭起来的人。下面按解压、识别、运行、排错的顺序讲,每一步都会给出可直接执行的命令和参数说明。
2. 解压与识别智慧农场小程序的技术栈
拿到zip之后第一步是安全解压。因为zip包可能因为下载不完整或压缩工具问题导致报错“invalid zip archive: could not find eocd”或“error read zip archive”。这种情况下,先检查文件大小,再换用命令行工具解压,而不是反复双击。
2.1 zip包快速解压与常见解压错误处理
如果你在Linux服务器上,用unzip命令;如果遇到中文文件名乱码,加-O GBK,或者改用Python的zipfile模块。Windows上推荐使用7-Zip或Bandizip,注意zip包经常是三层嵌套,第一层解出来是一个文件夹,里面又有frontend、backend和sql三个子目录。
# 1. 查看zip包内文件列表,确认有没有顶层目录 unzip -l smart_farm.zip | head -20 # 2. 解压到指定目录 unzip smart_farm.zip -d /opt/smart_farm # 3. 如果报中心目录损坏,尝试修复 zip -F smart_farm.zip --out smart_farm_fixed.zipunzip -l用于预览压缩包内文件列表,先看到顶层目录名,后续解压才清楚该把哪个目录导入开发者工具。-d指定解压目标位置,避免文件散落。zip -F尝试修复中心目录损坏,但文件内容缺失时无法恢复。遇到could not find eocd时,最常见原因是文件没有下载完整,核对文件大小和传输记录比硬修复更有效。
2.2 从目录结构判断前端和后端的边界
解压后用tree查看目录结构。如果前端有pages、manifest.json、App.vue,那就是uni-app工程;如果只有app.js、app.json、project.config.json,则是原生微信小程序。后端有pom.xml和src/main/java,一般是Spring Boot服务,有application.yml也佐证这一点;如果只有package.json,则可能是Node.js接口服务。
# 显示两层目录,过滤掉无用的依赖目录 tree -L 2 -I 'node_modules|dist|.git' .典型智慧农场项目中,frontend或client目录放小程序代码,backend或server目录放接口服务,sql或db目录放数据库初始化脚本,docs目录放接口文档。用下面这个表格可以快速对照,判断自己手上是哪一种组合。
| 目录特征 | 技术栈 | 启动前要做的事 |
|---|---|---|
manifest.json+.vue文件 | uni-app(编译为微信小程序) | npm install后执行npm run dev:mp-weixin |
app.js+app.json+project.config.json | 原生微信小程序 | 直接用微信开发者工具导入 |
pom.xml+application.yml | Spring Boot 后端 | 先导入SQL,再修改数据库连接,mvn package后跑jar |
package.json但无pom.xml | Node.js 接口服务 | npm install后按package.json中scripts启动 |
2.2.1 前端部分:uni-app与原生小程序的识别
如果你看到src目录下全是.vue文件,且根目录有manifest.json,那这是uni-app工程。直接用微信开发者工具导入源码会失败,需要先安装依赖,再编译出dist/dev/mp-weixin目录。
# uni-app仓库中常见的依赖安装和编译命令 cd frontend npm install --registry=https://registry.npmmirror.com npm run dev:mp-weixin--registry指定npm镜像源,能明显加快依赖下载。dev:mp-weixin是uni-app为微信小程序准备的开发模式,会监听文件变化并增量编译。若目录里已经有dist/dev/mp-weixin,说明别人编译过,但不要直接修改编译产物,所有改动都要落在src下,否则下次编译时会被覆盖。
原生小程序的结构更直接,app.json是全局配置,pages目录存放页面,utils里通常有请求封装。导入微信开发者工具时直接选择包含project.config.json的那一层即可。有时zip里把project.config.json改名或遗漏,会导致开发者工具提示“不是小程序项目”。
2.2.2 后端部分:接口服务与数据库脚本
后端如果是Maven工程,先在根目录执行mvn -DskipTests clean package,然后运行生成的jar。如果启动时缺少数据库驱动或配置文件,通常会在控制台直接打印Caused by。
有一个容易忽略的点:zip里的后端代码可能用的是本机绝对路径存放上传图片,比如E:/smart_farm/upload,换到Linux后这个路径不存在。需要全局搜索upload、file.path这类关键字,改成服务器上存在的目录。
3. 在微信开发者工具中跑通智慧农场小程序前端
打开微信开发者工具,选择小程序项目。导入前先确定是原生目录还是uni-app编译目录。导入后不要急着点编译,先看控制台有没有报错,再检查AppID和baseURL是否正确。
3.1 导入小程序项目并修正AppID与baseURL
打开微信公众平台注册一个小程序,拿到AppID。在开发者工具导入时填入这个AppID。如果只是本地调试,也可以选测试号,但测试号在很多能力上受限。智慧农场免不了要调摄像头、定位和支付接口,建议用正式的小程序账号。
打开config.js或utils/config.js,找到baseURL,这是小程序所有请求的根路径。
// config.js 常见配置项 export default { baseURL: 'http://10.0.2.2:8080/api', tokenKey: 'smart-farm-token', fileUploadURL: 'http://10.0.2.2:8080/api/file/upload' }10.0.2.2是安卓模拟器访问宿主机的地址,在真机上要改成电脑的局域网IP或已部署的服务器IP。开发者工具默认不允许访问http接口,需要在详情 -> 本地设置中勾选“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”。
提示:本地联调时如果一直报
request:fail,先确认后端服务是不是真的启动了,用浏览器直接打开http://localhost:8080/api/login看有没有返回。
3.2 动态设置小程序头部标题的常见做法
智慧农场的首页可能需要根据地块名称动态改变头部标题。在小程序里,头部标题有三层设置方式:全局的app.json、页面级别的page.json、以及运行时的wx.setNavigationBarTitle。
{ "window": { "navigationBarTitleText": "智慧农场", "navigationBarBackgroundColor": "#07c160" } }navigationBarTitleText是全局默认标题,所有页面在打开时会先显示这个值。navigationBarBackgroundColor是导航栏背景色,智慧农场项目里经常配合微信生态的绿色品牌色。
进入地块详情页时,需要把标题改成具体的地块名,比如“1号温室 - 番茄区”。在页面加载后调用wx.setNavigationBarTitle:
// 动态修改当前页面的导航栏标题 wx.setNavigationBarTitle({ title: '地块-' + this.data.plotName, fail: () => wx.showToast({ title: '标题设置失败', icon: 'none' }) });this.data.plotName是从后端接口拿到的地块名称。页面加载时先请求详情,再在回调里设置标题,顺序反了标题会拿不到值。fail回调处理微信版本或参数异常的情况,但一般很少触发。
3.2.1 页面级标题配置
如果某个页面的标题是固定的,比如“农场设备控制”,就不需要动JavaScript。在pages/device/index.json中单独写navigationBarTitleText,进入页面时立即生效,没有闪变。静态配置适合标题不随数据变化的场景。
3.2.2 通过动态标题匹配权限场景
智慧农场里部分页面会根据登录角色动态显示标题,比如管理员看到“农场总览”,普通操作员看到“今日任务”。这种场景在请求完成后判断角色字段,再调用wx.setNavigationBarTitle,同时把页面内的按钮权限也一并更新。
3.3 使用抓包快速验证小程序请求是否到达后端
如果页面一直转圈或白屏,需要确认请求是否发出。微信开发者工具自带的Network面板能直接看到请求地址和状态码,不需要额外配置。真机调试时,在详情里打开“真机调试”,手机上会出现vConsole悬浮窗,直接查看网络请求。使用外部抓包工具也可以观察,但微信小程序有防抓包机制,证书安装方式随版本变化,对初学者不友好。
如果看到请求返回401或500,按下面的表格排查。
| Network 状态 | 常见原因 | 处理方向 |
|---|---|---|
| 请求一直 pending | 后端没有启动,或baseURL不可达 | 先ping后端IP,再curl登录接口 |
| 返回401 | 请求头没有携带token | 检查登录后是否执行了wx.setStorageSync |
| 返回403 | 角色权限不足 | 核对用户角色与后端权限注解 |
| 返回500 | 数据库映射或接口异常 | 看后端日志的第一个Caused by |
4. 搭建智慧农场小程序后端接口与数据库
前端能打开只是第一步,智慧农场的看板数据、设备控制、历史记录都来自后端接口。这一章从数据库到接口自测,把后端服务完整跑起来。
4.1 初始化数据库并导入初始SQL
zip包里的sql目录通常有一个smart_farm.sql,里面创建数据库、用户表、设备表、地块表等。先创建数据库再导入,注意字符集。
mysql -u root -p -e "CREATE DATABASE smart_farm DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" mysql -u root -p smart_farm < sql/smart_farm.sqlutf8mb4是必须的,否则小程序里传的emoji或生僻字会报编码错误。utf8mb4_general_ci是校对规则,排序时大小写不敏感。如果sql文件里已经包含CREATE DATABASE,重复执行会报错。导入后检查核心表数量:
mysql -u root -p smart_farm -e "show tables;"看到用户表、地块表、设备表、农事记录表等,就说明数据库初始化完成。如果只有部分表,可能是sql脚本半途报错,需要重新导入。
4.2 修改application.yml中的数据库连接与文件上传路径
Spring Boot项目里,数据库配置在src/main/resources/application.yml。需要修改url、username、password三行,并确认driver-class-name与数据库版本匹配。
server: port: 8080 spring: datasource: # 数据库连接地址,按需修改为生产环境 url: jdbc:mysql://localhost:3306/smart_farm?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: yourpassword driver-class-name: com.mysql.cj.jdbc.Driver servlet: multipart: max-file-size: 20MB mybatis-plus: configuration: map-underscore-to-camel-case: trueserverTimezone=Asia/Shanghai必须加,否则MySQL 8及以上版本会在时间字段报错。characterEncoding=utf8与服务端编码保持一致,避免中文乱码。multipart.max-file-size控制单文件上传大小,智慧农场项目里田块照片经常会传原图,20MB比较合理。map-underscore-to-camel-case开启后,数据库字段create_time会自动映射为createTime,接口返回的JSON字段名才会和小程序端的res.data.createTime匹配。
常用配置参数汇总如下。
| 参数 | 作用 | 本地推荐值 |
|---|---|---|
spring.datasource.url | 数据库连接地址 | jdbc:mysql://localhost:3306/smart_farm |
server.port | 后端服务端口 | 8080,与前端baseURL保持一致 |
spring.servlet.multipart.max-file-size | 单文件上传大小限制 | 20MB |
除了数据库配置,还需要确认文件上传目录是否存在。很多智慧农场项目会把图片存到本地磁盘,配置里写的是file.upload-dir。如果目录不存在,调用上传接口时会直接抛FileNotFoundException,即使接口报了成功,小程序端也拿不到图片预览。手动创建目录后重启服务。
4.3 启动后端服务并用接口自测
启动后端通常有两种方式:IDE中直接运行启动类,或命令行执行jar包。推荐命令行方式,便于在服务器上部署。
cd backend mvn -DskipTests clean package java -jar target/smart-farm-0.0.1-SNAPSHOT.jar-DskipTests跳过单元测试,避免测试环境数据缺失导致构建中断。clean清理历史构建产物,防止旧class干扰。启动日志里看到Started SmartFarmApplication说明服务起来了。随后用curl验证登录接口:
curl -X POST http://localhost:8080/api/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"123456"}'如果返回200和token,说明认证链路通畅。如果返回404,检查Controller路径是否有/api前缀。如果返回500,看后端日志中堆栈的第一个Caused by。数据库连不上时的常见错误是Access denied for user或Communications link failure,分别对应密码错误和MySQL未启动。
4.3.1 登录与令牌返回参数
登录接口返回的JSON里,典型结构是{ "token": "xxx", "userId": 1, "roleName": "ADMIN" }。小程序端需要把token存入wx.setStorageSync,后续请求在请求头加Authorization: Bearer token。智慧农场部分接口需要管理员角色才能操作设备,所以roleName也要一并缓存。
// 小程序端登录后保存token的典型写法 const result = await request.post('/login', { username, password }); wx.setStorageSync('smart-farm-token', result.token); wx.setStorageSync('smart-farm-role', result.roleName);这里要把request封装里的header统一加上token,避免每个请求重复写。如果登录后请求仍然401,多半是token的key名没有对齐,后端看的是Authorization头,前端存的是小写authorization,大小写不敏感但值前面的Bearer前缀不能少。
4.3.2 跨域与端口配置的3个必调参数
本地联调最常遇到三个参数。第一是Spring Boot的server.port,如果前端baseURL写的8080,这里必须一致。第二是CORS的allowed-origin-patterns,开发阶段写*,上线后收紧到具体域名。第三是spring.jackson.date-format,不设置的话日期字段会返回时间戳格式,小程序端new Date()能解析,但表单回填时格式不一致会比较别扭。
spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghaitime-zone和serverTimezone必须统一,否则接口返回时间会差8个小时。这个坑在智慧农场的环境监测曲线里特别常见,时间轴偏移会让前端以为上报数据有延迟。
5. 从zip到上线的排错技巧与部署验证
最后这章专注于解压异常、导航栏高度和真机验证这三个高频问题。
5.1 常见zip包损坏、密码保护与解压失败处理
开发群中经常有人问invalid zip archive: could not find eocd。这个报错的含义是解压器在文件末尾找不到结束标记,最常见原因是zip包没有下载完整。先看文件字节数与原始大小是否一致,再换命令行工具解压,不要反复双击同一个图形窗口。error read zip archive则可能是磁盘空间不足或文件被占用。
对于带密码的zip包,市面上所谓密码移除工具基本不可靠。正确做法是联系交付方确认密码。如果只是测试环境,可以试试项目名缩写、团队名等弱密码。不要用在线解压网站上传源码包,那会把代码泄露出去。确实需要本地尝试时,可以用fcrackzip带字典跑,但8位以上混合密码基本没有性价比。
5.2 真机预览时导航栏与安全区适配
在开发者工具里正常的页面,真机上导航栏标题可能会被刘海屏遮挡。微信小程序的导航栏高度由系统决定,wx.getMenuButtonBoundingClientRect()可以拿到胶囊按钮的坐标,从而计算导航栏高度。智慧农场很多页面使用自定义导航栏,页面json中需要配置"navigationStyle": "custom",然后在顶部占位视图上写入计算出的高度。
// 获取胶囊信息并计算导航栏高度 const res = wx.getMenuButtonBoundingClientRect() const statusBarHeight = wx.getSystemInfoSync().statusBarHeight const navHeight = (res.top - statusBarHeight) * 2 + res.height这段代码在页面onLoad中执行一次,结果存到data里,用于绑定顶部占位视图的style="height: {{navHeight}}px"。res.top是胶囊按钮到屏幕顶部的距离,减去状态栏高度后乘2,再加胶囊高度,就是导航栏总高度。这个参数也适用于右上角自定义按钮的定位。
5.3 上线前用微信开发者工具体验版验证核心链路
最后在上传代码时,点击开发者工具右上角“上传”,填版本号后,在微信公众平台把该版本设为体验版。用微信扫码即可在真机上体验。重点验证登录、首页数据回填、农事记录提交和支付流程。如果支付报“由于小程序违规,支付功能暂时无法使用”,这属于微信侧的限制,需要在公众平台查看具体违规原因并申诉,代码上没法直接绕过。验证通过后再提交审核,审核周期一般为一到七天,期间要留意接口域名必须是HTTPS且已经配置到微信公众平台的白名单里。
本文还有配套的精品资源,点击获取