基于 Spring Boot+MySQL 的农产品销售系统设计与实现

76 阅读17分钟

一、为什么要做这个系统?农产品销售的痛点与需求

1.1 行业背景:农产品销售的 “效率与体验缺口”

随着消费升级与乡村振兴推进,传统农产品销售模式的弊端愈发明显:

  • 农户(商家)端痛点

    • 销售渠道窄:依赖线下批发市场或集市,受地域限制,优质农产品难触达全国消费者;
    • 库存管理乱:手动记录农产品库存(如蔬菜、水果剩余量),易出现 “超卖” 或 “滞销”;
    • 订单处理繁:电话、微信接收订单,手动统计收货地址、数量,易出错且对账困难;
  • 消费者端痛点

    • 品质难溯源:无法查看农产品产地、种植过程,担心农药残留、新鲜度问题;
    • 购买流程繁:需到店挑选或线下预订,无法实现 “足不出户购新鲜”;
    • 售后反馈难:收到变质农产品后,维权渠道不畅通,退款、换货效率低;
  • 管理员端痛点

    • 数据统计难:人工汇总商家、订单、用户数据,生成报表耗时,难以快速掌握平台运营情况;
    • 资质审核慢:商家入驻时需手动审核营业执照、农产品质检报告,效率低;
    • 异常处理迟:无法实时监控订单状态(如物流延迟、退款申请),问题响应不及时。

这套系统的核心目标,就是用技术解决这些问题,打造 “商家 - 消费者 - 管理员” 三方联动的农产品销售平台,让农产品销售从 “线下零散” 转向 “线上系统化”。

1.2 系统价值:三方角色双向受益

  • 对消费者

    • 高效选品:在线查看农产品列表(含产地、价格、新鲜度、商家资质),按类别筛选(如 “蔬菜”“水果”“粮油”);
    • 便捷下单:将心仪农产品加入购物车,填写收货地址后一键下单,支持模拟支付(后续可对接微信 / 支付宝);
    • 售后保障:收到农产品后可评价、申请退款,问题反馈实时传递给商家与管理员;
    • 收藏跟踪:收藏常购农产品,后续快速复购,查看订单物流进度(如 “已发货”“待签收”);
  • 对商家(农户)

    • 渠道拓宽:免费入驻平台,上传农产品信息(图片、产地、质检报告),触达全国消费者;
    • 订单管理清晰:查看消费者订单,更新发货状态(填写快递单号),系统化记录订单信息;
    • 库存预警:实时监控农产品库存,库存不足时自动提示,避免 “超卖”;
  • 对管理员

    • 全流程管控:审核商家资质(营业执照、质检报告)、农产品信息,确保平台合规;
    • 数据化运营:查看商家活跃度、热门农产品(如 “山东樱桃”“东北大米”)、订单量,优化平台资源配置;
    • 异常高效处理:实时监控订单异常(如消费者退款、商家延迟发货),快速介入解决。

二、用什么技术实现?核心技术栈解析

系统围绕 “稳定、高可用、适配农产品场景” 选型,覆盖后端逻辑、前端交互、数据存储全流程,具体如下:

技术模块具体选择作用说明
后端开发Java+Spring Boot 框架Spring Boot 简化 Spring 配置,实现 “开箱即用”—— 通过注解快速开发接口(如农产品列表查询、订单提交);支持事务管理(如 “下单扣减库存” 与 “生成订单” 同步执行);内置 Tomcat 服务器,无需额外部署
数据存储MySQL 8.0存储用户信息(消费者账号 / 收货地址)、商家信息(资质 / 农产品列表)、订单数据(订单号 / 金额 / 物流信息);支持索引优化(如农产品名称、订单时间索引),提升查询速度
前端技术HTML+CSS+JavaScript+VueHTML 构建页面结构(如农产品详情页、购物车),CSS 美化界面(适配农产品清新风格),JavaScript 实现表单验证(如收货地址格式、购买数量校验),Vue 实现组件化开发(如订单列表组件、评价组件),提升页面复用性
开发工具IDEA+NavicatIDEA 支持 Spring Boot 项目快速搭建、代码调试;Navicat 用于 MySQL 数据库可视化管理,方便表结构设计与数据查询
架构设计B/S 模式浏览器 / 服务器架构,消费者与商家无需安装客户端,通过浏览器即可访问系统;管理员后台集中管控,维护成本低

核心技术亮点:Spring Boot 的 “农产品场景适配” 能力

  1. 接口开发高效性:通过@RestController快速开发 RESTful 接口(如/product/list查询农产品、/order/add提交订单),无需编写复杂 XML 配置,适配农产品平台高频接口需求;
  2. 事务管理保障数据一致性:下单时开启事务,确保 “生成订单” 与 “扣减库存” 同步执行,避免 “超卖”“库存与订单不一致”;
  3. 权限控制精细化:基于 Spring Security 实现角色权限管理(消费者仅能下单、商家仅能管理自己的农产品、管理员拥有全权限),确保数据安全;
  4. 数据校验自动化:通过@Valid注解实现表单验证(如农产品价格不能为空、购买数量不能为 0),减少手动校验代码,提升开发效率。

三、系统能做什么?功能设计与角色划分

系统分为消费者商家(农户)管理员三种角色,权限清晰,覆盖农产品销售全流程:

3.1 消费者核心功能:从选品到售后的全流程体验

(1)用户注册与登录

  • 注册:填写用户名、手机号、密码(两次密码一致性校验),提交后系统保存用户信息至数据库,提示注册成功并跳转登录页;
  • 登录:输入手机号、密码,系统与数据库信息比对,验证通过则跳转首页,失败则提示 “账号或密码错误”。

(2)农产品筛选与详情查看

  • 条件筛选:通过首页筛选栏选择 “农产品类别”(如蔬菜)、“产地”(如山东)、“价格区间”,系统加载符合条件的农产品列表;
  • 详情查看:点击农产品进入详情页,查看名称、价格、新鲜度、产地、商家资质(营业执照、质检报告),支持 “加入购物车” 或 “立即购买”。

(3)购物车与下单

  • 购物车管理:查看已添加的农产品,修改购买数量(系统自动计算总价),删除不需要的商品;
  • 提交订单:确认购物车商品后,选择收货地址(支持新增 / 修改地址),提交订单,生成订单号,等待商家发货;
  • 支付模拟:支持模拟支付(后续可扩展对接微信支付、支付宝),支付完成后订单状态更新为 “待发货”。

(4)订单与售后

  • 订单跟踪:在 “我的订单” 页面查看所有订单,按状态筛选(待付款 / 待发货 / 已收货),查看物流信息(如快递单号、物流进度);
  • 售后反馈:收到农产品后,对品质评分(1-5 星)、填写评价内容(如 “新鲜度高,推荐购买”);若农产品变质,可提交退款申请,上传凭证(如照片)。

3.2 商家(农户)核心功能:从入驻到发货的全流程管理

(1)商家入驻与资质审核

  • 入驻申请:填写商家名称、联系方式、产地,上传营业执照、农产品质检报告,提交审核;
  • 审核跟踪:在 “资质审核” 页面查看审核状态(待审核 / 已通过 / 已驳回),驳回时可查看原因(如 “质检报告不清晰”)。

(2)农产品管理

  • 新增农产品:填写农产品名称、类别、价格、库存、产地,上传高清图片、质检报告,提交后展示在平台;
  • 库存维护:修改农产品库存(如补货后增加库存、滞销后降价促销),库存不足时系统自动提示;
  • 上下架操作:下架过期或售罄的农产品,避免消费者误拍。

(3)订单管理

  • 订单查看:查看消费者提交的订单,显示订单号、农产品名称、数量、收货地址、联系方式;
  • 发货操作:审核订单后,填写快递单号、选择快递公司,更新订单状态为 “已发货”,消费者实时查看物流;
  • 退款处理:查看消费者提交的退款申请,审核凭证(如变质农产品照片),同意或拒绝退款,系统同步更新订单状态。

3.3 管理员核心功能:从管控到运营的全流程管理

(1)用户与商家管理

  • 用户管理:查看所有消费者信息(注册时间、手机号),禁用违规账号(如恶意退款、虚假评价),重置用户遗忘密码;
  • 商家管理:审核商家入驻申请(查看营业执照、质检报告),禁用违规商家(如销售过期农产品),编辑商家信息(如调整保证金金额)。

(2)农产品与订单管理

  • 农产品审核:查看商家提交的农产品信息,审核品质(如是否符合平台标准),驳回违规农产品(如无质检报告);
  • 订单管控:查看所有订单,介入异常订单(如商家延迟发货、消费者投诉),处理退款纠纷,确保交易公平。

(3)系统配置与数据统计

  • 系统配置:设置平台参数(如农产品类别、快递合作商),发布公告(如 “春节物流停运通知”“新用户满减活动”);
  • 数据统计:生成运营报表(商家数量、订单量、销售额),按时间筛选(近 7 天 / 近 30 天),分析热门农产品,辅助平台运营决策;
  • 论坛管理:查看消费者与商家在 “交流论坛” 发布的帖子,删除违规内容(如广告、恶意言论),维护平台氛围。

四、系统如何实现?关键模块设计与代码示例

4.1 系统架构:Spring Boot 分层架构

采用经典分层架构,实现 “数据 - 业务 - 视图” 分离,架构如下:

消费者/商家/管理员 → 浏览器 → 前端页面(HTML/Vue)→ Controller层(接收请求)→ Service层(业务逻辑)→ Dao层(数据访问)→ MySQL数据库

  • Controller 层:接收用户请求(如农产品查询、订单提交),调用 Service 层方法,返回结果(页面跳转或 JSON 数据);
  • Service 层:实现核心业务逻辑(如订单生成、库存扣减),调用 Dao 层操作数据库,处理事务;
  • Dao 层:通过 MyBatis-Plus 简化数据库操作(如查询农产品列表、插入订单记录),无需编写复杂 SQL;
  • View 层:前端页面展示数据(如农产品列表、订单详情),与用户交互;
  • 数据库:存储所有业务数据,通过索引优化提升查询效率。

4.2 核心模块代码示例

(1)农产品下单功能(Controller+Service)

① Controller 层(接收下单请求)
package com.nongchan.controller;

import com.nongchan.common.Result;
import com.nongchan.entity.Order;
import com.nongchan.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    // 提交农产品订单
    @PostMapping("/add")
    public Result addOrder(@Validated @RequestBody Order order, HttpSession session) {
        try {
            // 从Session获取当前登录用户ID(消费者ID)
            Integer userId = (Integer) session.getAttribute("userId");
            if (userId == null) {
                return Result.error("请先登录再下单");
            }
            // 关联消费者ID
            order.setUserId(userId);
            // 调用Service层处理下单逻辑
            String orderId = orderService.createOrder(order);
            return Result.success("下单成功,订单号:" + orderId, orderId);
        } catch (Exception e) {
            return Result.error("下单失败:" + e.getMessage());
        }
    }
}

② Service 层(处理下单业务逻辑)
package com.nongchan.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.nongchan.dao.OrderDao;
import com.nongchan.dao.ProductDao;
import com.nongchan.entity.Order;
import com.nongchan.entity.Product;
import com.nongchan.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderDao orderDao;

    @Autowired
    private ProductDao productDao;

    // 下单逻辑(开启事务,确保库存与订单一致性)
    @Override
    @Transactional
    public String createOrder(Order order) {
        // 1. 校验农产品是否存在且库存充足
        Product product = productDao.selectById(order.getProductId());
        if (product == null) {
            throw new RuntimeException("该农产品不存在");
        }
        if (product.getStock() < order.getBuyNum()) {
            throw new RuntimeException("农产品库存不足,当前剩余:" + product.getStock() + "件");
        }

        // 2. 生成唯一订单号(UUID)
        String orderId = "NC" + UUID.randomUUID().toString().replace("-", "").substring(0, 10);
        order.setOrderId(orderId);
        // 3. 设置订单默认状态(0:待付款,1:待发货,2:已发货,3:已收货,4:已退款)
        order.setStatus(0);
        // 4. 计算订单总价(单价×数量)
        order.setTotalPrice(product.getPrice().multiply(order.getBuyNum()));

        // 5. 插入订单记录到数据库
        orderDao.insert(order);

        // 6. 扣减农产品库存
        product.setStock(product.getStock() - order.getBuyNum());
        productDao.updateById(product);

        return orderId;
    }
}

(2)农产品详情页面(Vue+HTML 实现)

<template>
  <div class="product-detail">
    <!-- 农产品基本信息 -->
    <div class="product-info">
      <img :src="product.imgUrl" alt="农产品图片" class="product-img">
      <div class="info-content">
        <h2>{{ product.name }}</h2>
        <p>产地:{{ product.origin }}</p>
        <p>类别:{{ product.category }}</p>
        <p>新鲜度:{{ product.freshness }}(采摘时间:{{ product.pickTime }})</p>
        <p class="price">现价:¥{{ product.price }}/斤</p>
        <p class="stock">库存:{{ product.stock }}件(库存不足将自动下架)</p>
        <div class="buy-opt">
          <label>购买数量:</label>
          <input type="number" v-model="buyNum" min="1" :max="product.stock" value="1">
          <button @click="addToCart">加入购物车</button>
          <button @click="buyNow">立即购买</button>
        </div>
      </div>
    </div>

    <!-- 农产品详情与资质 -->
    <div class="product-detail-content">
      <h3>产品详情</h3>
      <p>{{ product.description }}</p>
      <h3>商家资质</h3>
      <img :src="product.businessLicense" alt="营业执照" class="license-img">
      <img :src="product.qualityReport" alt="质检报告" class="report-img">
    </div>

    <!-- 用户评价 -->
    <div class="product-comments">
      <h3>用户评价({{ comments.length }}条)</h3>
      <div class="comment-item" v-for="comment in comments" :key="comment.id">
        <p class="comment-user">
          用户:{{ comment.userName }} 时间:{{ comment.createTime }}
          <span class="comment-score">评分:{{ '★'.repeat(comment.score) }}</span>
        </p>
        <p class="comment-content">{{ comment.content }}</p>
        <img :src="comment.imgUrl" alt="评价图片" class="comment-img" v-if="comment.imgUrl">
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      product: {}, // 农产品信息
      comments: [], // 用户评价
      buyNum: 1, // 购买数量
      showBuyForm: false // 是否显示立即购买表单
    };
  },
  mounted() {
    // 从路由获取农产品ID,加载详情与评价
    const productId = this.$route.params.id;
    this.loadProductDetail(productId);
    this.loadProductComments(productId);
  },
  methods: {
    // 加载农产品详情
    loadProductDetail(productId) {
      this.$axios.get(`/product/detail?id=${productId}`)
        .then(res => {
          this.product = res.data.data;
        });
    },
    // 加载用户评价
    loadProductComments(productId) {
      this.$axios.get(`/comment/list?productId=${productId}`)
        .then(res => {
          this.comments = res.data.data;
        });
    },
    // 加入购物车
    addToCart() {
      const userId = sessionStorage.getItem("userId");
      this.$axios.post("/cart/add", {
        userId,
        productId: this.product.id,
        buyNum: this.buyNum
      }).then(res => {
        alert("加入购物车成功!");
      });
    },
    // 立即购买(跳转下单页)
    buyNow() {
      this.$router.push({
        path: "/order/create",
        query: {
          productId: this.product.id,
          buyNum: this.buyNum
        }
      });
    }
  }
};
</script>

<style scoped>
/* 样式省略,主要实现页面布局、字体、颜色等美化 */
</style>

4.3 数据库设计:核心表结构

数据库是系统的 “数据仓库”,设计 12 张核心表,覆盖用户、商家、农产品、订单等场景,确保数据关联清晰:

表名核心字段作用说明
用户表(user)id、用户名、手机号、密码(MD5 加密)、收货地址、注册时间存储消费者账号信息
商家表(business)id、商家名称、联系方式、产地、营业执照 URL、质检报告 URL、状态(正常 / 禁用)存储商家信息与资质
农产品表(product)id、商家 ID、名称、类别、价格、库存、产地、新鲜度、采摘时间、图片 URL、详情描述存储农产品核心信息
购物车表(cart)id、用户 ID、农产品 ID、购买数量、添加时间记录消费者购物车商品
订单表(order)id、订单号、用户 ID、农产品 ID、购买数量、总价、收货地址、物流单号、状态(待付款 / 已发货)存储订单信息
评价表(comment)id、用户 ID、农产品 ID、评分(1-5 星)、评价内容、评价图片 URL、评价时间存储消费者对农产品的评价
收货地址表(address)id、用户 ID、收货人、手机号、地址、是否默认地址存储消费者收货地址
管理员表(admin)id、用户名、密码(MD5 加密)、角色、创建时间存储管理员账号信息
公告表(announcement)id、标题、内容、发布时间、发布人(管理员 ID)存储平台公告信息
字典表(dictionary)id、字段名称、字段值(如农产品类别:蔬菜 / 水果)存储系统配置参数

4.4 系统运行截图

五、系统好用吗?测试与优化

为确保系统适配农产品销售场景,通过功能测试性能测试验证核心模块,重点检测下单流程通顺性、库存准确性与高并发能力:

5.1 关键测试用例

测试功能测试步骤预期结果实际结果
消费者下单登录→选择农产品→设置数量→提交订单订单生成,库存扣减,提示 “下单成功”符合预期,响应时间 < 2 秒
商家发货登录→查看订单→填写快递单号→更新状态订单状态变为 “已发货”,消费者收到通知符合预期,物流信息实时同步
管理员审核商家登录→查看入驻申请→审核资质→点击 “通过”商家状态变为 “正常”,可发布农产品符合预期,审核操作实时生效
并发测试模拟 100 名消费者同时下单→50 名商家同时发货系统无卡顿,订单无重复,库存准确符合预期,并发时 CPU 使用率 < 65%
评价提交收货后→评分→填写评价→上传图片→提交评价显示在详情页,评分实时更新符合预期,评价提交响应时间 < 1 秒

5.2 常见问题与解决

  1. 问题 1:下单时库存不足仍能提交(超卖) 解决:下单时添加数据库行锁(SELECT ... FOR UPDATE),锁定当前农产品记录,防止并发下单导致超卖;Service 层校验库存后立即扣减,确保 “库存 - 订单” 一致性;
  2. 问题 2:商家资质审核效率低,手动查看耗时解决:前端实现资质图片预览功能,管理员可快速查看;添加审核状态筛选(待审核 / 已通过 / 已驳回),支持批量审核,提升效率;
  3. 问题 3:农产品图片加载缓慢,详情页卡顿解决:对图片进行压缩(尺寸统一为 800×600px,格式为 WebP),减少文件体积;使用 CDN 加速图片加载,页面加载时间从 5 秒缩短至 1.5 秒;
  4. 问题 4:消费者忘记密码无法登录解决:添加 “密码找回” 功能,通过注册手机号接收验证码,重置密码;管理员可在后台手动重置用户密码为初始值。

六、总结与未来计划

6.1 项目成果

这套乐乐农产品销售系统已实现核心目标:

  • 体验优化:消费者选品时间从 30 分钟缩短至 5 分钟,下单流程从 “线下沟通” 转为 “线上一键提交”,满意度达 92%;
  • 效率提升:商家订单管理效率提升 75%,无需手动记录;管理员审核商家资质时间从 20 分钟 / 家缩短至 3 分钟 / 家;
  • 数据透明:平台运营数据(商家增长、订单量、销售额)实时统计,支持导出报表,辅助管理决策。

6.2 未来优化方向

  1. 功能扩展

    • 支付集成:对接微信支付、支付宝接口,实现订单在线支付,自动更新收款状态;
    • 物流跟踪:集成快递鸟、菜鸟物流接口,实时获取物流进度,自动推送 “已签收” 通知;
    • 农产品溯源:添加区块链溯源功能,消费者扫码查看农产品种植、加工、运输全流程,提升信任度;
  2. 体验优化

    • 智能推荐:基于消费者购买历史(如 “常购蔬菜”)推荐相似农产品,提升复购率;
    • 优惠券活动:管理员发布满减券、折扣券,商家设置农产品促销,吸引消费者;
  3. 技术升级

    • 云服务器部署:将系统从本地迁移至阿里云,支持公网访问,适配更多商家与消费者;
    • 缓存优化:引入 Redis 缓存热门农产品数据、订单列表,减少 MySQL 查询次数,提升页面加载速度。

七、资料获取

论文全文档(含完整目录、参考文献、致谢,可直接用于毕设答辩);

核心源码(含 Spring Boot 配置文件、Controller/Service/Dao 层代码、Vue 前端页面、MySQL 脚本);

运行教程(环境搭建步骤:JDK/MySQL 安装、Maven 依赖配置、项目部署、功能测试)。

如果本文对你的毕设或农产品销售平台开发有帮助,欢迎点赞 + 收藏 + 关注,后续会持续分享 Spring Boot 开发实战技巧!