拓冰建站拓冰建站
首页 / 资讯中心 / 正文

微信小程序农产品销售平台:SSM后端与订单管理实践解析

简介一款基于微信小程序的农产品销售平台毕业设计资源包内含完整源码与开发说明面向计算机相关专业毕业生或需要快速搭建微信小程序Java后端项目的开发者。项目采用微信开发者工具、Java、SSM框架和MySQL数据库实现用户端注册登录、首页、农产品浏览以及管理员后台对每日特价、农产品分类、用户、订单等模块的全面管理。压缩包共1195个文件约14.86MB主要包含png图片素材、js逻辑、vue页面、java后端、json配置、wxss/wxml小程序样式与结构等类型覆盖前端界面与后端服务。已有331人学习下载。资源附开发说明文档可帮助理解项目结构、功能模块与运行方式数据库SQL脚本、环境配置文件等也一并提供适合作为课程设计或毕业设计参考便于二次开发与论文撰写。1. 微信小程序农产品销售平台的选题逻辑与技术栈拆解做了几个完整的小程序电商项目后再看这份“农产品销售平台”毕业设计源码最值得说的不是功能多少而是它把“旧技术栈”用在了“新载体”上后端是 Java SSMSpring Spring MVC MyBatis前端是微信小程序原生数据库 MySQL配套三键启动脚本和完整开发说明。这个组合在面试时反而抗打因为能讲清楚一条从前端 token 到后端拦截器再到数据库事务的完整链路比只会调云函数更能体现基本功。这套源码覆盖了两类用户普通用户注册登录、看首页、逛农产品、下单、进个人中心管理员管每日特价、农产品分类、品种、订单和系统配置。对想快速跑通“小程序商城类毕业设计”的人而言它比空壳商城多了一层“每日特价 订单状态流转”的业务细节适合直接在微信开发者工具里打开、改数据库连接串后边跑边改。2. SSM 后端接口设计与微信小程序请求链路2.1 为什么选 SSM 而不是 Spring Boot很多同学会问现在新项目不都用 Spring Boot 吗这份源码选 SSM一个原因是很多学校课程设计还在教 SSM 整合另一个原因是它更能暴露底层原理。微信小程序端的请求本质上还是 HTTP JSONSSM 的 DispatcherServlet 负责路由MyBatis 负责 SQLSpring 管事务。你在试完这个项目后如果想把 Controller 改成 Spring Boot其实只需要换掉配置类Service 和 Mapper 基本不用动。这让我想到选型时的一个原则毕业设计要拿得出“为什么这么选”的说法SSM 适合说明 Java Web 的基础组件协作方式。2.2 核心表结构与订单状态机整个业务按照“农产品 - 分类 - 品种 - 订单”展开最核心的是订单表。我建议你把数据库里的表名梳理清楚先看这几张基础表表名主要字段作用goodsid, name, category_id, price, stock, img农产品商品表goods_categoryid, name农产品分类goods_typeid, name品种挂在商品下userid, openid, nickname, phone小程序用户orderid, order_no, user_id, total_amount, status, pay_time订单主表order_detailid, order_id, goods_id, num, price订单明细special_priceid, goods_id, price, start_time, end_time每日特价这里最需要注意的是订单状态字段。源码中通常用Integer表示0 表示待支付1 表示待发货2 表示待收货3 表示已完成4 表示已取消。前端会展示成“待付款/待分享/待收货/已取消”后端在修改状态时要判断当前状态是否允许跳转比如支付后不能再取消。2.3 小程序 wx.request 与后端 Controller 的对接方式小程序端通过wx.request把数据发给后端后端 Controller 接收后返回Map结构的 JSON。典型的前端请求代码长这样wx.request({ url: http://localhost:8080/agri/goods/list, method: GET, data: { page: 1, limit: 10, categoryId: 0 }, header: { Content-Type: application/json, token: wx.getStorageSync(token) }, success(res) { if (res.data.code 0) { // 拿到商品列表并渲染 this.setData({ goodsList: res.data.data.records }); } else { wx.showToast({ title: res.data.msg, icon: none }); } } });对应的后端 Controller 写法是Controller RequestMapping(/goods) public class GoodsController { Autowired private GoodsService goodsService; ResponseBody RequestMapping(/list) public MapString, Object list( RequestParam(value page, defaultValue 1) Integer page, RequestParam(value limit, defaultValue 10) Integer limit, RequestParam(value categoryId, required false) Integer categoryId) { PageInfoGoods pageInfo goodsService.findPage(page, limit, categoryId); MapString, Object result new HashMap(); result.put(code, 0); result.put(data, pageInfo); return result; } }2.4 参数说明与常见错误前端data里的参数名比如page、limit、categoryId必须和后端RequestParam里的名字保持完全一致大小写也敏感否则拿不到categoryId。我在调试时遇到过一个问题wx.request默认的请求超时时间是 60 秒但开发时后端断点挂太久会导致回调一直不执行所以我在wx.request里都加timeout: 3000先快速暴露问题。另外要注意本地开发时微信开发者工具必须勾选“不校验合法域名”否则请求http://localhost:8080会被拦截。这一步是新手最容易卡住的点界面在“详情 - 本地设置”里而不是在编辑器右上角。后端返回的结构我建议统一为code msg data三层。小程序端直接判断code是否为 0不要判断整个 JSON 是否为空因为空数据和报错返回的 HTTP 200 并不代表业务成功。3. 小程序端页面逻辑与登录/购物车/订单实现3.1 页面划分与登录/购物车/订单实现小程序端的目录结构通常是pages/index、pages/goods、pages/cart、pages/order、pages/user其中“每日特价”可能挂在pages/index下面也可以独立成pages/daily。你不用急着重构先把 tabBar 的四个页面跑通首页、农产品列表、购物车、我的。订单页面可以从“我的”页面里的入口跳进去。页面与后端接口的对应关系很直接首页拉每日特价接口和分类接口农产品列表页按分类和品种筛选商品详情页里面加入购物车和立即购买。这里有个设计取舍购物车数据到底存本地还是存后端。源码里通常是把购物车列表存在wx.setStorageSync(cart)因为用户未登录时也可以浏览商品下单前再要求登录。我通常的做法是登录后把购物车同步到用户维度防止换设备后购物车丢失。3.2 登录态维护从 wx.login 到自定义登录态微信小程序登录不能直接用wx.login拿到的 code 去换 openid这个步骤必须放在后端完成因为appid和secret不能出现在小程序代码里。标准的流程是小程序端调用wx.login()获取临时 code把 code 通过wx.request发给后端后端用 code 去调微信接口jscode2session得到 openid后端查user表没有则插入一条新用户同时生成一个自定义 token 返回给前端前端把 token 存进wx.setStorageSync(token)。小程序端的登录代码可以写成wx.login({ success(res) { wx.request({ url: http://localhost:8080/agri/user/login, method: POST, data: { code: res.code, userInfo: this.data.userInfo }, success(resp) { const { token, userId } resp.data.data; wx.setStorageSync(token, token); wx.setStorageSync(userId, userId); } }); } });后端对应处理流程用伪代码描述public MapString, Object login(String code, String userInfo) { // 1. 请求微信接口获取 openid String openid WechatUtil.code2Session(code); // 2. 查用户表不存在则创建 User user userDao.findByOpenid(openid); if (user null) { user new User(); user.setOpenid(openid); user.setNickname(userInfo.get(nickName)); userDao.insert(user); } // 3. 生成 token可以用 UUID也可以自带 user_id String token UUID.randomUUID().toString().replace(-, ); tokenDao.save(token, user.getId()); return result { token: token, userId: user.getId() }; }3.3 购物车与订单的本地缓存与后端同步购物车如果只存本地加入购物车时比较简单但下单时要把cart里的商品传成订单明细。我建议在下单按钮触发时先校验商品库存把库存锁住再生成订单号。订单号可以用yyyyMMddHHmmss 用户id 随机数避免并发下重复。下单接口一次接收一个 JSON 数组后端事务里同时插入order和order_detail。一个常见的坑是商品价格从购物车本地缓存里取但用户在别处已经把价格改了或者每日特价过期了。所以下单时后端必须重新查询当前商品价格不能信前端传的totalPrice。服务端价格优先是电商项目的基本防线。如果特价表里商品处于活动时段后端应该按特价计费而不是商品原价。3.4 参数配置与常见问题小程序端需要配置app.js里的globalData.apiBaseUrl我建议不要硬编码在每一个页面。比如// app.js globalData: { apiBaseUrl: http://localhost:8080/agri }然后请求时统一拼路径。这样升级后端地址时只改一处。开发时还有一个很常见的问题真机调试时localhost指向手机本身不是电脑。你需要把地址换成电脑在局域网里的 IP并且确认微信开发者工具里勾选了“不校验合法域名”。后端 Tomcat 端口 8080 要注意防火墙是否放行否则手机上请求直接超时。4. 管理员后台管理模块与关键功能配置4.1 后台模块的登录校验与权限管理这份源码里管理员并不是微信小程序里的一个角色而是独立的 Web 后台登录入口。后台提供“管理员管理”“超级管理员”和“普通管理员”之类的划分但表结构里其实可以简化为admin表字段包含id, username, password, role。密码建议做 MD5 加盐或 BCrypt 处理如果源码里是明文你在讲解时一定要说清楚改进点并实际改成加密存储。后台常见的登录做法是登录成功后在session里保存管理员 id并通过拦截器校验未登录请求。拦截器配置在spring-mvc.xml里写法类似mvc:interceptors mvc:interceptor mvc:mapping path/admin/**/ mvc:exclude-mapping path/admin/login/ bean classcom.agri.interceptor.AdminLoginInterceptor/ /mvc:interceptor /mvc:interceptors4.2 每日特价管理每日特价在数据库里是special_price表它不直接修改goods.price而是单独配置价格和起止时间。这样做的好处是不影响商品原价活动结束后自动恢复。后台管理页面需要提供新增、编辑、删除特价同时要校验时间段是否重叠避免同一个商品在同一时间有两个特价。典型的处理逻辑是public boolean checkTimeRepeat(Integer goodsId, Date beginTime, Date endTime) { // 判断同一商品在 beginTime ~ endTime 之间是否存在记录 int count specialPriceMapper.countByGoodsIdAndTime(goodsId, beginTime, endTime); return count 0; }前端显示“每日特价”时也要判断当前时间是否在活动时间段内。源码里很可能用SYSDATE()来控制查询条件SELECT g.*, sp.price AS special_price FROM special_price sp LEFT JOIN goods g ON sp.goods_id g.id WHERE sp.start_time NOW() AND sp.end_time NOW()这里值得注意特价商品列表要查询多张表用LEFT JOIN而不是INNER JOIN否则活动只配置了一半时商品会漏显示。4.3 农产品管理农产品管理除了增删改查还有分类和品种的级联关系。“农产品分类”和“农产品品种”是两级维度比如分类是“水果”品种是“苹果”商品挂在品种下面。后台页面要考虑两点新增商品时分类和品种下拉框联动选择分类后再过滤品种删除分类前要检查有没有商品还在引用否则会把商品的展示弄坏。一个比较实用的做法是商品表里只存type_id通过type表再关联category_id。这样减少商品表的冗余字段也方便后续筛选。后台列表页展示商品时需要left join分类和品种把名称拼出来SQL 大致是SELECT g.*, t.name AS type_name, c.name AS category_name FROM goods g LEFT JOIN goods_type t ON g.type_id t.id LEFT JOIN goods_category c ON t.category_id c.id WHERE 114.4 订单管理订单管理是后台最复杂的模块它牵涉到状态更新、发货和统计。管理员查看订单列表时后端按status过滤订单详情再查明细表。发货操作就是把订单状态从“待发货”改成“待收货”同时记录发货时间SQL 如下UPDATE order SET status 2, ship_time NOW() WHERE id #{orderId} AND status 1这里用AND status 1是防止重复发货用受影响行数判断是否更新成功。订单金额统计可以用SUM 时间条件SELECT DATE(create_time) AS day, SUM(total_amount) AS amount FROM order WHERE status 3 AND create_time #{startTime} GROUP BY DATE(create_time) ORDER BY day DESC这个统计接口可以给后台首页展示用可以按天看销售趋势。5. 从 bat 脚本到发布构建、运行与常见踩坑拿到源码后你可能会看到1-install.bat、2-run.bat、3-build.bat以及一大堆.bak文件。这些.bak是开发者在改 bug 时留下的备份比如update-password.vue.bak说明后台前端是 Vue 写的main.css.bak是样式备份。发布前不用拿出来但可以给你的开发说明留个记录。三个 bat 脚本的分工很直接1-install.bat安装 npm 依赖通常执行npm install或cnpm install2-run.bat启动开发服务比如npm run serve用于本地联调后台管理页面3-build.bat执行npm run build把后台 Vue 项目打成静态文件放到 Tomcat 的webapps目录里。我一般会先看一遍 bat 里的路径是否相对当前目录因为双击运行时如果在错误目录可能找不到package.json。如果脚本是中文编码乱码可以用记事本打开另存为 ANSI 编码再运行。另外一个必须注意的点是.bak文件里可能含有数据库密码或旧接口地址比如模板里的 127.0.0.1。实际部署时一定要改application.properties或.yml里的数据库连接spring.datasource.urljdbc:mysql://localhost:3306/agri_platform?useUnicodetruecharacterEncodingutf-8useSSLfalse spring.datasource.usernameroot spring.datasource.password123456导入数据库时用 Navicat 或命令行执行 SQL 文件。如果 SQL 文件是 UTF-8 编码导入后中文不乱码但 Navicat 默认可能用 GBK导致表注释乱码。建议导入前右键数据库选择“运行 SQL 文件”并在连接属性里把编码设为 UTF-8。最后验证整个流程我习惯按这个顺序走先确认 MySQL 里 18 张表建好再启动 SSM 后端然后在微信开发者工具导入小程序目录修改app.js里的apiBaseUrl最后登录后台管理页。如果小程序请求报 404先看后端控制台有没有打印日志如果报 405看看前端请求方式是 GET 还是 POST和后端RequestMapping是否一致。这些排错顺序能解决掉大部分跑不起来的问题。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门