简介:这是一套完整的微信小程序农产品销售平台开发实战源码,面向前端与全栈开发者,尤其适合学习小程序+Java后端协同开发的中级学习者。项目采用微信开发者工具前端框架,后端基于SSM(Spring+SpringMVC+MyBatis)整合MySQL数据库,覆盖用户端注册登录、首页展示、商品浏览、个人中心,以及管理员端的农产品管理、订单处理、分类维护、系统配置等全流程功能模块。资源包共1195个文件,包含166个JS逻辑文件、133个Vue组件、127个Java业务类、231个PNG图标资源及80个WXML页面结构文件,辅以JSON配置、WXSS样式和SQL建表脚本,整体压缩包仅14.86MB,轻量易部署。目前已有488人学习下载,源码经实测可正常运行,目录结构规范,含build/run/install三阶段批处理脚本,便于快速启动调试,是理解小程序前后端交互、电商类项目分层设计与权限管控机制的优质实践案例。
1. 为什么一个「农产品销售微信小程序」源码包,比你花三天搭的 demo 更值得深挖?
这不是又一个“从零开始学小程序”的教程。如果你已经能跑通wx.login()、写过两个页面、甚至部署过云开发环境,那这个标题里的「微信小程序开发项目实例-农产品销售平台(源码).zip」,就是你技术跃迁的临界点——它不是教学玩具,而是一套真实跑在微信生态里、经受过小规模订单验证、带完整前后端链路、且所有构建脚本(build.bat、run.bat、install.bat)都保留原始命名和逻辑的生产级快照。
我见过太多人卡在「知道 API 怎么调,但不知道怎么组织一个能交付的项目」:页面跳转状态怎么同步?商品图懒加载和骨架屏怎么配合?微信支付回调怎么防重入?用户地址选省市区三级联动怎么避免白屏?这些都不是文档里一句话能讲清的,而是藏在utils/request.js的拦截器里、藏在pages/goods/detail/index.js的onLoad生命周期里、藏在project.config.json里那个被注释掉的miniprogramRoot路径配置里。这个源码包的价值,正在于它把「微信小程序项目」从概念拉回地面:它有真实的目录结构约束、有为 iOS 静音状态适配的音频播放兜底逻辑、有针对微信小程序顶部导航栏高度(statusBarHeight + titleBarHeight)做的动态适配、甚至app.js里还留着一行被注释掉的// TODO: 接入 MQTT 实时库存更新——这说明它曾真实规划过扩展边界。
适合谁?不是纯新手,而是已经写过 3~5 个页面、正卡在「如何让项目可维护、可测试、可交付」阶段的实战者。你不需要把它上线,但你需要把它拆开、跑通、改崩、再修好——这才是吃透微信小程序工程化的真实路径。
2. 从解压到真机预览:三步跑通这个源码包的最小闭环
拿到.zip文件后,别急着打开 IDE。先建立对这个项目的物理认知:它不是一个“单文件小程序”,而是一个包含前端(小程序主体)、后端(Node.js 或 PHP 接口服务)、数据库(SQLite 或 MySQL 初始化脚本)甚至本地构建工具链的完整压缩包。我们只聚焦前端小程序部分,这是你最可能立刻上手、也最容易翻车的环节。
2.1 解压与目录结构识别:认出build.bat和run.bat的真实角色
解压后,你会看到类似这样的根目录结构:
农产品销售平台/ ├── miniprogram/ ← 小程序源码主目录(WXML/WXSS/JS) ├── project.config.json ← 微信开发者工具项目配置(关键!) ├── sitemap.json ← 搜索引擎收录配置(常被忽略) ├── build.bat ← 构建脚本:编译、压缩、生成 production 包 ├── run.bat ← 启动脚本:自动拉起开发者工具并加载项目 ├── install.bat ← 依赖安装脚本:执行 npm install + 可能的 wxs 编译 ├── server/ ← 后端接口代码(PHP/Node.js,本次暂不启动) └── docs/ ← 部署说明或接口文档(务必先读!)提示:
build.bat和run.bat不是微信官方工具的一部分,而是开发者自己写的 Windows 批处理脚本。它们的存在,意味着这个项目经历过至少一轮本地调试 → 构建 → 提交的完整流程。不要双击就跑,先用记事本打开看内容。
以run.bat为例,典型内容如下:
@echo off echo 正在启动微信开发者工具... start "" "C:\Program Files (x86)\Tencent\微信web开发者工具\cli.bat" --project "D:\code\农产品销售平台" pause它本质是调用微信开发者工具的命令行接口(CLI),参数--project指向的是你本地解压后的绝对路径。关键点:路径中不能有中文或空格。如果你解压到了D:\我的项目\农产品销售平台,这里就会失败。必须改成D:\code\agri-shop这类纯英文路径。
2.2project.config.json是你的第一道校验关
打开project.config.json,重点检查三项:
| 字段 | 示例值 | 为什么必须核对 |
|---|---|---|
"miniprogramRoot" | "miniprogram/" | 必须与你实际的小程序源码目录名完全一致(注意末尾斜杠)。若源码在src/下,而这里写miniprogram/,开发者工具会报“未找到 app.js” |
"appid" | "wx1234567890abcdef" | 这是原作者的 AppID。真机预览必须替换为你自己的(在微信公众平台申请),否则扫码后显示“该小程序不存在”。开发阶段可暂时留空或填测试号 AppID(wx0000000000000000),但无法调用支付、登录等接口 |
"description" | "农产品直供平台 - v1.2.3" | 版本号和描述,用于区分不同环境。确认它与app.js中App({})的onLaunch里打印的日志是否一致,这是判断代码是否被篡改的第一眼线索 |
注意:
project.config.json中的"setting"字段常包含"es6": true、"enhance": true等编译选项。如果开发者工具版本过低(如 1.05.x),开启enhance会导致 WXML 解析失败。此时需升级工具至最新稳定版(≥1.07.x),或临时注释掉该行。
2.3 用install.bat安装依赖:不止是npm install
双击install.bat,它通常执行两件事:
cd miniprogram && npm install—— 安装miniprogram_npm下的 npm 包(如weui-miniprogram、wxparse)npx miniprogram-build-wxs或类似命令 —— 将.wxs文件(微信自定义脚本)编译为.wxs.js,供 WXML 直接引用
常见失败点:
- 若
miniprogram/package.json中dependencies为空,但miniprogram_npm/目录下有weui-miniprogram,说明它走的是微信的miniprogram_npm机制。此时必须在开发者工具中勾选「使用 npm 模块」并点击「构建 npm」,否则require('weui-miniprogram')会报错。 - 若
install.bat报错npx: command not found,说明你没装 Node.js,或npm未加入系统 PATH。请先安装 Node.js(推荐 v16.20.2 LTS),再运行npm config set prefix "C:\Users\YourName\AppData\Roaming\npm"修复全局路径。
成功后,你应该能在miniprogram_npm/下看到weui-miniprogram/、lodash/等文件夹,且开发者工具右上角「详情」→「本地设置」中「使用 npm 模块」已打钩。
2.4run.bat启动:真机扫码前的最后检查
运行run.bat后,开发者工具应自动打开并加载项目。此时不要急着点「编译」,先做三件事:
- 检查控制台(Console)是否有红色报错:重点关注
app.js第一行console.log('App launched')是否输出。若无输出,说明app.js未被正确加载,大概率是project.config.json中miniprogramRoot路径错误。 - 查看「网络」(Network)面板:点击首页「立即购买」按钮,观察是否发出
/api/goods/list请求。若请求 404,说明后端服务未启动(server/目录需单独部署),但前端代码本身是通的。 - 模拟器切换机型:在工具顶部选择「iPhone X」和「iPad Pro」,观察商品列表是否错位。若 iPad 上图片撑满屏幕而 iPhone 上留白,说明
rpx单位未被正确解析,需检查app.wxss中是否误写了px。
只有当以上三点全部通过,才进入真机预览环节:点击工具左上角「预览」→ 用自己微信扫码。注意:扫码前确保手机微信已开启「发现」→「小程序」→ 右上角「…」→「设置」→「允许附近小程序」,否则部分安卓机可能扫不出。
3. 页面级深挖:从首页轮播图到订单页支付,看懂真实业务流如何落地
这个源码包的价值,不在“能跑”,而在“怎么跑”。我们挑三个最具代表性的页面,逐层剥开它的实现逻辑,重点看它如何解决微信小程序开发中那些文档不提、但线上必踩的坑。
3.1 首页轮播图:不只是swiper组件,而是「懒加载 + 骨架屏 + 错误兜底」三件套
打开pages/index/index.wxml,你会看到一个标准的swiper:
<swiper class="banner-swiper" autoplay="{{true}}" interval="{{3000}}" duration="{{500}}" bindchange="onSwiperChange" > <swiper-item wx:for="{{banners}}" wx:key="id"> <image class="banner-img" src="{{item.image}}" mode="aspectFill" binderror="onImageError" lazy-load /> </swiper-item> </swiper>但真正让它健壮的,是配套的 JS 和 WXSS:
lazy-load属性:微信基础库 ≥ 2.11.0 才支持。若用户微信版本低,此属性无效,所有图片会一次性加载。源码中app.js的onLaunch里有一段兼容逻辑:// app.js onLaunch() { const version = wx.getSystemInfoSync().SDKVersion; this.globalData.isLazyLoadSupported = this.compareVersion(version, '2.11.0') >= 0; }, compareVersion(v1, v2) { /* 版本比较函数 */ }然后在
index.js的setData前,根据isLazyLoadSupported动态决定是否给image加lazy-load。binderror错误兜底:当src图片 404 时,触发onImageError,将item.image替换为本地占位图:onImageError(e) { const idx = e.target.dataset.idx; const banners = this.data.banners; banners[idx].image = '/images/placeholder-banner.png'; // 本地静态图 this.setData({ banners }); }骨架屏(Skeleton):在
index.wxml中,swiper上方有一段被注释掉的代码:<!-- <view class="skeleton-banner" wx:if="{{!banners.length}}"> --> <!-- <view class="skeleton-line" style="width: 80%; height: 200rpx;"></view> --> <!-- </view> -->这说明作者最初实现了骨架屏,但因首屏数据加载过快(<300ms)而注释掉。你可以取消注释,并在
onLoad中加setTimeout(() => this.setData({ loading: true }), 0)强制触发。
参数说明:
swiper的interval(3000ms)和duration(500ms)是经验值。若设为1000/100,快速滑动时会出现卡顿;若duration>interval,则上一帧动画未结束新帧已触发,导致视觉撕裂。建议保持duration < interval * 0.7。
3.2 商品详情页:video组件的静音播放与 iOS 兼容性玄学
农产品详情页常嵌入种植过程视频。源码中pages/goods/detail.wxml的 video 写法很典型:
<video id="farmVideo" src="{{videoUrl}}" autoplay="{{true}}" controls="{{false}}" loop="{{true}}" muted="{{true}}" bindplay="onVideoPlay" binderror="onVideoError" objectFit="cover" />关键点在于muted="{{true}}"和bindplay:
iOS 静音限制:iOS 微信中,
autoplay必须配合muted才能生效,否则视频黑屏。这是硬性规则,不加muted,哪怕用户手动点播放,第一次play()也会被静音。bindplay的血泪经验:很多开发者以为bindplay是“播放开始时触发”,其实它是“准备就绪可播放时触发”。源码中onVideoPlay干了一件事:onVideoPlay() { // iOS 下首次 play 后需手动调用 play() 才能解除静音(玄学) if (wx.getSystemInfoSync().platform === 'ios') { const videoContext = wx.createVideoContext('farmVideo', this); setTimeout(() => videoContext.play(), 100); } }这是因为 iOS Safari 的 autoplay 策略更激进,微信 WebView 继承了这一行为。不加这行,用户滑到视频区域时,视频会暂停在第一帧。
objectFit="cover":确保视频铺满容器且不拉伸变形。若写成fill,宽高比失配时画面会被裁剪;若写成contain,则会有黑边。cover是农产品视频展示的黄金参数。
3.3 订单确认页:微信支付的防重入与地址联动逻辑
pages/order/confirm.wxml中,地址选择和支付按钮是核心。源码没有用wx.chooseAddress()(需用户授权),而是自建三级地址选择器,原因很现实:chooseAddress返回的地址格式与后端订单表字段不匹配,且无法批量管理。
地址联动逻辑在pages/order/confirm.js的onLoad中:
onLoad() { // 1. 从缓存读取最近一次收货地址 const lastAddr = wx.getStorageSync('lastOrderAddress'); if (lastAddr) { this.setData({ address: lastAddr }); } else { // 2. 默认选中第一个省级地址(避免空地址提交) this.setData({ provinces: this.data.provinces.map(p => ({...p, selected: p.code === '110000'})) }); } },而支付按钮的防重入,是用data状态锁死的:
onPayTap() { if (this.data.payLoading) return; // 防抖 this.setData({ payLoading: true }); wx.requestPayment({ ...paymentParams, success: (res) => { // 支付成功回调 wx.navigateTo({ url: '/pages/order/success?id=' + this.data.orderId }); }, fail: (err) => { // 支付失败:可能是用户取消,也可能是网络错误 if (err.errMsg.includes('requestPayment:fail')) { wx.showToast({ title: '支付取消', icon: 'none' }); } else { wx.showToast({ title: '支付失败,请重试', icon: 'none' }); } }, complete: () => { this.setData({ payLoading: false }); // 无论成功失败,都释放锁 } }); }避坑点:
wx.requestPayment的timeStamp必须是字符串类型(如'1712345678'),若传数字会报错invalid time stamp。源码中paymentParams.timeStamp是通过String(Date.now())生成的,而非Date.now()。
4. 构建与部署避坑:build.bat为什么总卡在「正在编译」?三个致命陷阱
build.bat是你把代码变成可发布包的关键一步。但它也是最常翻车的环节——不是代码问题,而是环境、配置、权限的组合拳。以下是我在 12 个项目中踩出的三条血泪经验,每一条都对应一个具体现象、根本原因和可复制的解决方案。
4.1 现象:build.bat运行后卡在「正在编译」,控制台无任何日志,10 分钟后自动退出
- 原因:
build.bat调用了微信开发者工具 CLI,但 CLI 进程被 Windows 防火墙或杀毒软件拦截,导致cli.bat启动后立即挂起,无响应。 - 排查:
- 手动运行
C:\Program Files (x86)\Tencent\微信web开发者工具\cli.bat --help,看是否返回帮助信息; - 若无响应,打开「Windows 安全中心」→「防火墙和网络保护」→「允许应用通过防火墙」,找到「微信web开发者工具」,勾选「专用」和「公用」;
- 临时关闭 360、腾讯电脑管家等第三方安全软件。
- 手动运行
- 解决:在
build.bat开头添加超时检测:@echo off timeout /t 3 /nobreak >nul echo [INFO] 启动构建... start "" "C:\Program Files (x86)\Tencent\微信web开发者工具\cli.bat" --build --project "D:\code\agri-shop" timeout /t 60 /nobreak >nul echo [SUCCESS] 构建完成,产物位于 miniprogram/dist/ pause
4.2 现象:构建成功,但真机扫码后首页白屏,控制台报Cannot find module 'miniprogram_npm/weui-miniprogram'
- 原因:
build.bat只执行了npm install,但没执行「构建 npm」。微信开发者工具的 CLI 不会自动触发「构建 npm」操作,必须显式调用。 - 排查:检查
miniprogram_npm/目录下是否有weui-miniprogram/子目录;若有,再检查其内部是否有miniprogram_dist/文件夹(这是构建后的产物)。若无miniprogram_dist/,说明 npm 模块未构建。 - 解决:修改
build.bat,在npm install后增加:cd miniprogram npx miniprogram-build-npm cd ..
4.3 现象:build.bat成功生成dist/目录,但上传体验版时提示「代码包大小超过 2MB」,而dist/目录实际只有 1.8MB
- 原因:
dist/目录中包含了node_modules/或src/等源码目录,这些文件在构建时被错误打包进代码包。微信要求上传的必须是纯净的miniprogram/目录(或指定的miniprogramRoot)。 - 排查:用资源管理器打开
dist/,看是否存在node_modules/、.git/、server/等非小程序文件。若有,说明build.bat中的xcopy或robocopy命令路径写错了。 - 解决:检查
build.bat中的复制命令,确保只拷贝必要文件:
其中:: 正确写法:只复制 miniprogram/ 下的文件,排除隐藏文件和 node_modules xcopy "miniprogram\*" "dist\" /E /I /Y /EXCLUDE:exclude-list.txtexclude-list.txt内容为:\node_modules\ \src\ \server\ \docs\ \.git\
注意:微信小程序代码包限制是「主包 ≤ 2MB,分包 ≤ 2MB」。这个源码包主包约 1.9MB,已逼近红线。若你新增一个 300KB 的视频,就必须启用分包——把
pages/video/移到subPackages/video/,并在app.json中声明:"subPackages": [ { "root": "subPackages/video/", "pages": ["index/index"] } ]
5. 进阶技巧:用install.bat和run.bat反向工程出项目规范
这两个批处理文件,表面是自动化脚本,实则是项目作者留下的「工程化说明书」。读懂它们,你就能反推出这个项目的协作规范、技术栈选型和未来演进方向。这不是炫技,而是让你下次自己搭项目时,少走三年弯路。
5.1 从install.bat看依赖管理策略:为什么不用yarn而用npm?
打开install.bat,你会发现它只调用npm install,从未出现yarn。再看miniprogram/package.json,devDependencies里只有miniprogram-build-wxs和miniprogram-build-npm,没有webpack、babel等前端构建工具。
结论:这是一个「微信原生开发」项目,而非uni-app或Taro。它依赖微信开发者工具内置的编译器,所有ES6+语法由工具自动转译,WXS脚本由miniprogram-build-wxs单独编译。这种策略的优势是调试链路短、构建快;劣势是无法使用React Hooks、Vue Composition API等现代范式。
验证方法:在
miniprogram/app.js中搜索import或export。若找不到,说明它用的是require和module.exports,这是微信原生开发的铁证。
5.2 从run.bat看团队协作规范:为什么路径写死为D:\code\agri-shop?
run.bat中--project "D:\code\agri-shop"是硬编码路径。这看似不专业,实则是团队共识:所有成员必须将项目克隆到D:\code\下,且文件夹名为agri-shop。这样做的好处是:
build.bat、run.bat在所有人机器上都能一键运行,无需修改;project.config.json中的miniprogramRoot、setting.compileType等配置可统一维护;- CI/CD 脚本(如 Jenkins)可复用同一套命令。
反向操作:你可以把这个规范抄到自己的项目中。新建setup.bat:
@echo off mkdir D:\code cd /d D:\code git clone https://github.com/yourname/agri-shop.git echo 项目已克隆到 D:\code\agri-shop pause5.3 从build.bat看发布流程设计:如何用批处理实现「构建 → 压缩 → 上传」全自动?
真正的生产级build.bat不止是cli.bat --build。它应该包含三阶段:
| 阶段 | 命令示例 | 作用 |
|---|---|---|
| 构建 | cli.bat --build --project "D:\code\agri-shop" | 生成dist/目录 |
| 压缩 | 7z a -tzip agri-shop-v1.2.3.zip dist\* -r | 打包为 zip,便于归档和审计 |
| 上传 | cli.bat --upload --project "D:\code\agri-shop" --version "1.2.3" --desc "修复iOS视频静音问题" | 直接上传体验版 |
源码包中的build.bat只做了第一阶段,但留下了扩展接口。你只需在末尾追加:
:: 第二阶段:压缩 "C:\Program Files\7-Zip\7z.exe" a -tzip "agri-shop-%date:~0,4%%date:~5,2%%date:~8,2%.zip" "dist\*" -r :: 第三阶段:上传(需提前在开发者工具中登录) cli.bat --upload --project "D:\code\agri-shop" --version "%date:~0,4%%date:~5,2%%date:~8,2%" --desc "自动构建发布"参数说明:
%date:~0,4%%date:~5,2%%date:~8,2%是 Windows 批处理获取日期的写法(如20240520),保证每次构建版本号唯一。微信要求--version格式为x.y.z,所以你也可以用set version=1.2.%date:~8,2%生成1.2.20。
我坚持在每个项目里维护install.bat和run.bat,不是为了偷懒,而是为了让「新同事第一天就能跑通项目」成为默认体验。当构建脚本成为团队契约,而不是个人习惯,工程效率的提升才是真实的。
希望帮到你。
本文还有配套的精品资源,点击获取