基于SSM框架的在线农产品销售平台 - 源码深度解析

JavaScriptHTMLCSSSSM框架MySQL
2026-02-274 浏览

文章摘要

本项目是基于SSM(Spring+SpringMVC+MyBatis)框架技术栈构建的在线农产品销售平台,核心目标是为农产品供应商与消费者搭建一个高效、可信的数字化交易桥梁。平台深度聚焦农产品流通环节中信息不对称、销售渠道单一、交易信任度低等核心痛点,通过标准化的在线商城功能,实现农产品的信息透明化...

在当前数字化经济高速发展的背景下,传统农产品流通领域面临着信息不对称、销售渠道有限、交易环节冗长等核心挑战。为有效应对这些痛点,我们设计并实现了一个基于SSM(Spring+SpringMVC+MyBatis)技术栈的B2C农产品电子商务平台——“农产优联”。该平台旨在构建一个连接优质农产品供应商与终端消费者的高效、透明、可信的在线交易环境,通过标准化的电商功能模块,实现农产品信息的数字化展示、便捷安全的在线交易以及全流程的订单管理。

平台采用经典的三层架构设计,确保了系统的高内聚、低耦合特性。Spring Framework作为核心控制反转(IoC)容器,统一管理业务逻辑层(Service)的Bean生命周期与事务 demarcation,通过声明式事务管理(@Transactional)保障了涉及多表操作的业务(如订单创建与库存扣减)的原子性与一致性。Web展现层由SpringMVC框架负责,其通过DispatcherServlet统一调度HTTP请求,并利用HandlerMapping、Controller及ViewResolver等组件实现请求的路由、处理与视图渲染。为增强系统安全性,还自定义实现了拦截器(Interceptor),用于进行用户身份验证与操作日志记录。数据持久层选用MyBatis框架,其通过灵活的XML配置方式将Java对象与数据库表进行映射,支持动态SQL编写,能够高效完成复杂查询,例如根据多条件(品类、价格区间、产地)筛选农产品。

前端交互界面采用JSP动态页面技术,并结合jQuery库进行AJAX异步数据交互,为用户提供了流畅的商品浏览、购物车增删、订单提交等操作体验。整体技术选型成熟稳定,架构清晰,为平台的可靠性、可维护性及后续功能扩展奠定了坚实基础。

数据库架构设计与核心表分析

一个稳健的数据库设计是电商平台高效运行的基石。本项目共设计了11张核心数据表,以下重点分析product(农产品信息表)、order(订单主表)和order_item(订单明细表)这三张关键表的结构与设计亮点。

1. 农产品信息表 (product)

该表是平台商品体系的核心,存储了所有上线销售农产品的详细信息。其设计充分考虑了农产品的特殊属性。

CREATE TABLE `product` (
  `product_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(255) NOT NULL COMMENT '产品名称',
  `category_id` int(11) NOT NULL COMMENT '所属二级分类ID',
  `price` decimal(10,2) NOT NULL COMMENT '单价',
  `stock` int(11) NOT NULL DEFAULT '0' COMMENT '库存数量',
  `image_url` varchar(500) DEFAULT NULL COMMENT '主图URL',
  `description` text COMMENT '商品详情描述',
  `origin` varchar(100) DEFAULT NULL COMMENT '产地',
  `shelf_life` varchar(50) DEFAULT NULL COMMENT '保质期',
  `storage_method` varchar(100) DEFAULT NULL COMMENT '储存方式',
  `is_active` tinyint(1) DEFAULT '1' COMMENT '是否上架(1是,0否)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`product_id`),
  KEY `idx_category_id` (`category_id`),
  KEY `idx_is_active` (`is_active`),
  CONSTRAINT `fk_product_category` FOREIGN KEY (`category_id`) REFERENCES `product_category_second` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='农产品信息表';

设计亮点分析:

  • 字段完备性:除了常规的product_namepricestock外,专门为农产品设计了origin(产地)、shelf_life(保质期)、storage_method(储存方式)等字段,体现了业务领域的特殊性,增强了消费者对商品的信任度。
  • 软删除与状态管理:通过is_active字段实现商品的软删除(下架),而非物理删除,便于数据恢复和历史数据分析。
  • 索引优化:对category_idis_active字段建立了索引,极大地优化了前台按品类浏览商品和后台管理商品列表的查询性能。
  • 外键约束:通过外键fk_product_category与二级分类表关联,确保了数据的一致性和完整性。

2. 订单主表 (order) 与订单明细表 (order_item)

订单系统采用主表-明细表的结构进行设计,这是电商领域的标准实践,有效解决了订单与商品之间的“一对多”关系。

CREATE TABLE `order` (
  `order_id` varchar(32) NOT NULL COMMENT '订单号(非自增,业务生成)',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
  `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '订单状态(0:待付款,1:已付款/待发货,2:已发货,3:已完成,4:已取消)',
  `shipping_address` varchar(500) NOT NULL COMMENT '收货地址',
  `receiver_name` varchar(50) NOT NULL COMMENT '收货人姓名',
  `receiver_phone` varchar(20) NOT NULL COMMENT '收货人电话',
  `payment_time` datetime DEFAULT NULL COMMENT '支付时间',
  `delivery_time` datetime DEFAULT NULL COMMENT '发货时间',
  `completion_time` datetime DEFAULT NULL COMMENT '完成时间',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`order_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status` (`status`),
  CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单主表';

CREATE TABLE `order_item` (
  `item_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(32) NOT NULL COMMENT '订单ID',
  `product_id` int(11) NOT NULL COMMENT '商品ID',
  `product_name` varchar(255) NOT NULL COMMENT '商品名称(快照)',
  `product_price` decimal(10,2) NOT NULL COMMENT '下单时单价(快照)',
  `quantity` int(11) NOT NULL COMMENT '购买数量',
  `total_price` decimal(10,2) NOT NULL COMMENT '商品项总价',
  PRIMARY KEY (`item_id`),
  KEY `idx_order_id` (`order_id`),
  CONSTRAINT `fk_item_order` FOREIGN KEY (`order_id`) REFERENCES `order` (`order_id`),
  CONSTRAINT `fk_item_product` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单明细表';

设计亮点分析:

  • 数据快照:在order_item表中,存储了product_nameproduct_price的快照。这是至关重要的设计,即使后续商品信息(如名称、价格)发生变更,订单历史记录依然能准确反映下单时的真实情况,保证了交易记录的不可篡改性。
  • 状态流设计order表的status字段清晰定义了订单的生命周期状态(待付款→已付款→已发货→已完成),为前后台的订单流程管理提供了明确的依据。
  • 业务主键order_id使用业务生成的字符串(如时间戳+随机数)而非数据库自增ID,避免了自增ID带来的信息泄露和可预测性问题,更符合业务安全要求。

核心功能模块深度解析

1. 商品展示与多条件检索

前台首页和商品列表页的核心功能是向用户清晰、高效地展示商品,并支持灵活的筛选。后端通过MyBatis的动态SQL能力实现。

后端Controller层代码 (ProductController.java):

@Controller
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private ProductService productService;

    @RequestMapping("/list")
    public String listProducts(@RequestParam(value = "categoryId", required = false) Integer categoryId,
                               @RequestParam(value = "keyword", required = false) String keyword,
                               @RequestParam(value = "minPrice", required = false) Double minPrice,
                               @RequestParam(value = "maxPrice", required = false) Double maxPrice,
                               Model model) {
        // 构建查询条件对象
        ProductQuery query = new ProductQuery();
        query.setCategoryId(categoryId);
        query.setKeyword(keyword);
        query.setMinPrice(minPrice);
        query.setMaxPrice(maxPrice);
        query.setIsActive(1); // 只查询上架商品

        // 调用Service层获取商品列表
        List<Product> productList = productService.getProductListByQuery(query);
        model.addAttribute("productList", productList);
        model.addAttribute("query", query);

        return "product/list";
    }
}

MyBatis Mapper XML 动态SQL (ProductMapper.xml):

<select id="selectByQuery" parameterType="com.agrimall.model.query.ProductQuery" resultMap="BaseResultMap">
    SELECT 
    <include refid="Base_Column_List" />
    FROM product
    WHERE is_active = 1
    <if test="categoryId != null">
        AND category_id = #{categoryId}
    </if>
    <if test="keyword != null and keyword != ''">
        AND (product_name LIKE CONCAT('%', #{keyword}, '%') OR description LIKE CONCAT('%', #{keyword}, '%'))
    </if>
    <if test="minPrice != null">
        AND price >= #{minPrice}
    </if>
    <if test="maxPrice != null">
        AND price &lt;= #{maxPrice}
    </if>
    ORDER BY create_time DESC
</select>

商品详情页 (图示:商品详情页,清晰展示了农产品图片、价格、产地、保质期等关键信息)

2. 购物车管理与订单生成

购物车是连接浏览与购买的关键环节,涉及复杂的会话管理和业务逻辑。

购物车添加商品Service层代码 (CartService.java):

@Service
public class CartService {

    @Autowired
    private ProductMapper productMapper;

    /**
     * 向购物车(Session中)添加商品
     * @param cart 购物车对象(存储在Session中)
     * @param productId 商品ID
     * @param quantity 数量
     * @return 操作结果信息
     */
    public String addItem(Cart cart, Integer productId, Integer quantity) {
        // 1. 校验商品是否存在且已上架
        Product product = productMapper.selectByPrimaryKey(productId);
        if (product == null || product.getIsActive() == 0) {
            return "商品不存在或已下架";
        }
        // 2. 校验库存
        if (product.getStock() < quantity) {
            return "商品库存不足";
        }

        // 3. 添加商品项到购物车Map中
        CartItem item = cart.getItems().computeIfAbsent(productId, k -> new CartItem());
        item.setProduct(product);
        item.setQuantity(item.getQuantity() + quantity);
        item.setTotalPrice(product.getPrice().multiply(new BigDecimal(item.getQuantity())));

        // 4. 重新计算购物车总价
        cart.recalculateTotal();
        return "添加成功";
    }
}

加入购物车 (图示:用户将选中的农产品加入购物车)

订单生成Service层代码 (OrderService.java) - 重点展示事务管理:

@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private OrderItemMapper orderItemMapper;
    @Autowired
    private ProductMapper productMapper;

    @Transactional(rollbackFor = Exception.class) // 声明式事务管理
    public String createOrder(Order order, List<OrderItem> orderItems) throws Exception {
        // 1. 插入订单主记录
        orderMapper.insertSelective(order);

        // 2. 批量插入订单明细,并扣减库存
        for (OrderItem item : orderItems) {
            orderItemMapper.insertSelective(item);

            // 扣减库存,使用乐观锁防止超卖
            int affectedRows = productMapper.reduceStock(item.getProductId(), item.getQuantity());
            if (affectedRows == 0) {
                // 库存不足,抛出异常触发事务回滚
                throw new Exception("商品ID为 " + item.getProductId() + " 的库存不足,订单创建失败");
            }
        }
        return order.getOrderId();
    }
}

对应的库存扣减SQL (ProductMapper.xml):

<update id="reduceStock">
    UPDATE product 
    SET stock = stock - #{quantity}, 
        update_time = NOW() 
    WHERE product_id = #{productId} 
    AND stock >= #{quantity}
</update>

确认订单 (图示:用户在确认订单页面核对商品、金额和收货地址信息)

3. 后台管理系统:商品与订单管理

后台管理系统是平台运营的核心,提供了全面的数据管理能力。

农产品管理Controller (AdminProductController.java):

@Controller
@RequestMapping("/admin/product")
public class AdminProductController {

    @RequestMapping("/manage")
    public String productManage(Model model,
                                @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                                @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
        // 使用PageHelper进行分页
        PageHelper.startPage(pageNum, pageSize);
        List<Product> productList = productService.getAllProductsForAdmin();
        PageInfo<Product> pageInfo = new PageInfo<>(productList);
        model.addAttribute("pageInfo", pageInfo);
        return "admin/product_manage";
    }

    @PostMapping("/updateStatus")
    @ResponseBody
    public ResponseEntity<String> updateProductStatus(@RequestParam Integer productId, 
                                                      @RequestParam Boolean isActive) {
        Product product = new Product();
        product.setProductId(productId);
        product.setIsActive(isActive ? 1 : 0);
        int result = productMapper.updateByPrimaryKeySelective(product);
        if (result > 0) {
            return ResponseEntity.ok("操作成功");
        } else {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("操作失败");
        }
    }
}

农产品管理后台 (图示:管理员在后台对农产品进行上架、下架、编辑等管理操作)

订单管理后台 (图示:后台订单管理界面,管理员可以查看订单详情、更新发货状态等)

实体模型与对象映射

SSM框架的核心优势在于其优雅的对象关系映射(ORM)。以下是核心实体类ProductOrder的简化定义,它们与数据库表结构紧密对应。

Product实体类 (Product.java):

public class Product {
    private Integer productId;
    private String productName;
    private Integer categoryId;
    private BigDecimal price;
    private Integer stock;
    private String imageUrl;
    private String description;
    private String origin;
    private String shelfLife;
    private String storageMethod;
    private Integer isActive;
    private Date createTime;
    private Date updateTime;

    // 省略getter和setter方法
    // ...
}

Order实体类 (Order.java):

public class Order {
    private String orderId;
    private Integer userId;
    private BigDecimal totalAmount;
    private Integer status;
    private String shippingAddress;
    private String receiverName;
    private String receiverPhone;
    private Date paymentTime;
    private Date deliveryTime;
    private Date completionTime;
    private Date createTime;
    private Date updateTime;

    // 关联的订单项列表,体现一对多关系
    private List<OrderItem> orderItems;

    // 省略getter和setter方法
    // ...
}

未来功能展望与技术优化方向

“农产优联”平台已具备完整的电商核心功能,为进一步提升竞争力与用户体验,可考虑以下优化方向:

  1. 引入全文搜索引擎:随着商品SKU的增长,基于数据库LIKE的搜索会遇到性能瓶颈。可引入Elasticsearch或Solr等全文搜索引擎,实现对商品名称、描述、产地等字段的高性能、高相关性搜索,并支持拼音搜索、错别字纠错等高级功能。
  2. 构建微服务架构:将单体应用拆分为用户中心、商品服务、订单服务、库存服务等独立的微服务。使用Spring Cloud Alibaba套件(Nacos, Sentinel, Seata)进行服务治理,提高系统弹性、可扩展性和技术异构能力。
  3. 实现分布式事务:在微服务架构下,订单创建涉及多个服务,需要可靠的分布式事务解决方案。可采用Seata的AT模式或基于消息队列的最终一致性方案(如RocketMQ事务消息)来保证数据一致性。
  4. 集成第三方支付与物流API:接入微信支付、支付宝等主流支付渠道,提升支付便捷性。同时,对接顺丰、菜鸟等物流公司的API,实现自动获取运单号和物流轨迹跟踪,完善履约环节。
  5. 开发移动端应用:开发基于React Native或Flutter的跨平台移动APP,或构建微信小程序版本。移动端能更好地满足用户随时随地下单的需求,并通过推送消息提升用户复购率。

该平台的成功实践证明了SSM这一经典JavaEE技术栈在构建中型电商项目上的强大生命力。其清晰的分层架构、严谨的数据库设计以及面向对象的编程模型,为平台的稳定运行和持续迭代提供了坚实保障。

本文关键词
SSM框架农产品销售平台源码解析在线交易系统数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章