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

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-02-097 浏览

文章摘要

本项目是基于SSM(Spring+SpringMVC+MyBatis)框架构建的农产品在线销售与智能物流平台,旨在打通农产品从生产源头到消费者的数字化流通渠道。平台的核心业务价值在于解决传统农产品交易中信息不透明、流通环节冗长、物流效率低下等核心痛点。通过整合线上销售与物流调度,平台能够帮助农户直接...

在农产品流通领域,传统模式面临着信息不对称、流通环节多、物流效率低等核心挑战。针对这些痛点,我们设计并实现了一个集在线销售与智能物流于一体的综合性平台——"农鲜直达"智能供应链系统。该系统采用成熟的SSM(Spring+SpringMVC+MyBatis)技术架构,构建了一个从生产源头到终端消费者的数字化流通渠道。

系统架构与技术栈

该平台采用经典的三层架构设计,每一层都承担着明确的职责。表现层基于SpringMVC框架,通过DispatcherServlet统一处理HTTP请求,利用注解驱动的控制器实现RESTful风格的API接口。业务逻辑层由Spring框架管理,通过依赖注入和面向切面编程实现事务管理、安全控制等横切关注点。数据持久层采用MyBatis框架,通过XML映射文件实现灵活的SQL操作。

技术栈配置如下:

<dependencies>
    <!-- Spring核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.3.8</version>
    </dependency>
    
    <!-- MyBatis集成 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>
    
    <!-- 数据库连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.6</version>
    </dependency>
</dependencies>

数据库设计亮点分析

订单表(ordermsg)的精细化设计

订单表的设计体现了对业务复杂性的充分考虑。该表采用宽表设计,将订单核心信息、支付状态、物流信息等字段整合在一起,减少了多表关联查询的性能开销。

CREATE TABLE `ordermsg` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `ddno` varchar(255) DEFAULT NULL COMMENT '订单号',
  `memberid` varchar(255) DEFAULT NULL COMMENT '会员ID',
  `productid` varchar(255) DEFAULT NULL COMMENT '商品ID',
  `num` int(11) DEFAULT NULL COMMENT '购买数量',
  `total` double(255,2) DEFAULT NULL COMMENT '订单总金额',
  `fkstatus` varchar(255) DEFAULT NULL COMMENT '付款状态',
  `shstatus` varchar(11) DEFAULT NULL COMMENT '收货状态',
  `addr` varchar(255) DEFAULT NULL COMMENT '收货地址',
  `savetime` varchar(255) DEFAULT NULL COMMENT '下单时间',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `shfs` varchar(255) DEFAULT NULL COMMENT '送货方式',
  `zffs` varchar(255) DEFAULT NULL COMMENT '支付方式',
  `saver` varchar(255) DEFAULT NULL COMMENT '操作人',
  `isdd` varchar(255) DEFAULT NULL COMMENT '是否订单',
  `fid` varchar(255) DEFAULT NULL COMMENT '父级ID',
  `goodsid` varchar(255) DEFAULT NULL COMMENT '商品ID',
  `goodstype` varchar(255) DEFAULT NULL COMMENT '商品类型',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `baozhuang` varchar(255) DEFAULT NULL COMMENT '包装信息',
  `company` varchar(255) DEFAULT NULL COMMENT '快递公司',
  `danhao` varchar(255) DEFAULT NULL COMMENT '快递单号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单表'

设计亮点分析:

  1. 状态字段分离设计:将fkstatus(付款状态)、shstatus(收货状态)、delstatus(删除状态)分离存储,便于状态独立管理和查询优化
  2. 物流信息完整性:包含company(快递公司)和danhao(快递单号)字段,实现物流信息的完整追踪
  3. 灵活的扩展性:通过goodstype字段支持多种商品类型,baozhuang字段记录包装要求,满足农产品特殊需求

商品表(product)的层次化分类

商品表采用父子分类机制,通过fid(父级分类ID)和sid(子级分类ID)实现商品的多级分类管理,支持灵活的品类扩展。

CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `productno` varchar(255) DEFAULT NULL COMMENT '商品编号',
  `productname` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `filename` varchar(255) DEFAULT NULL COMMENT '商品图片',
  `price` decimal(10,2) DEFAULT NULL COMMENT '现价',
  `tprice` decimal(10,2) DEFAULT NULL COMMENT '原价',
  `fid` varchar(255) DEFAULT NULL COMMENT '父级分类ID',
  `sid` varchar(255) DEFAULT NULL COMMENT '子级分类ID',
  `content` text DEFAULT NULL COMMENT '商品详情',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `issj` varchar(255) DEFAULT NULL COMMENT '是否上架',
  `istj` varchar(255) DEFAULT NULL COMMENT '是否推荐',
  `saver` varchar(255) DEFAULT NULL COMMENT '添加人',
  `productid` varchar(255) DEFAULT NULL COMMENT '商品ID',
  `leibie` varchar(255) DEFAULT NULL COMMENT '类别',
  `cx` varchar(255) DEFAULT NULL COMMENT '促销信息',
  `ps` varchar(255) DEFAULT NULL COMMENT '配送信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=147 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品表'

索引优化策略:

-- 创建复合索引提升查询性能
CREATE INDEX idx_product_category ON product(fid, sid, issj, delstatus);
CREATE INDEX idx_product_recommend ON product(istj, issj, delstatus);
CREATE INDEX idx_product_search ON product(productname, leibie);

地址表(address)的智能管理

地址表设计支持默认地址标记,通过ismr字段实现"一键设置默认地址"功能,优化用户体验。

CREATE TABLE `address` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(255) DEFAULT NULL COMMENT '收货人姓名',
  `tel` varchar(255) DEFAULT NULL COMMENT '联系电话',
  `addr` text DEFAULT NULL COMMENT '详细地址',
  `ismr` varchar(255) DEFAULT NULL COMMENT '是否默认地址',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `memberid` varchar(255) DEFAULT NULL COMMENT '会员ID',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='地址表'

核心功能实现

智能订单处理系统

订单处理模块采用状态机模式管理订单生命周期,从下单、支付、配送到完成的整个流程都有严格的状态控制。

订单控制器核心代码:

@Controller
@RequestMapping("/order")
public class OrderController extends BaseController {
    
    @Autowired
    private OrderService orderService;
    
    @RequestMapping("/create")
    @ResponseBody
    public Map<String, Object> createOrder(@RequestBody OrderDTO orderDTO, 
                                         HttpServletRequest request) {
        Map<String, Object> result = new HashMap<>();
        try {
            // 验证库存
            if (!orderService.checkStock(orderDTO.getProductid(), orderDTO.getNum())) {
                result.put("success", false);
                result.put("message", "库存不足");
                return result;
            }
            
            // 生成订单号
            String orderNo = generateOrderNo();
            orderDTO.setDdno(orderNo);
            
            // 计算总金额
            BigDecimal total = orderService.calculateTotal(orderDTO);
            orderDTO.setTotal(total.doubleValue());
            
            // 保存订单
            OrderMsg order = orderService.createOrder(orderDTO);
            
            // 扣减库存
            orderService.deductStock(orderDTO.getProductid(), orderDTO.getNum());
            
            result.put("success", true);
            result.put("orderNo", orderNo);
            result.put("orderId", order.getId());
            
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "订单创建失败:" + e.getMessage());
        }
        return result;
    }
    
    private String generateOrderNo() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String timeStr = sdf.format(new Date());
        Random random = new Random();
        return "DD" + timeStr + random.nextInt(1000);
    }
}

订单服务层实现:

@Service
@Transactional
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderMsgMapper orderMsgMapper;
    
    @Autowired
    private ProductMapper productMapper;
    
    @Override
    public boolean checkStock(String productId, Integer quantity) {
        Product product = productMapper.selectByPrimaryKey(productId);
        return product != null && product.getStock() >= quantity;
    }
    
    @Override
    public BigDecimal calculateTotal(OrderDTO orderDTO) {
        Product product = productMapper.selectByPrimaryKey(orderDTO.getProductid());
        if (product == null) {
            throw new RuntimeException("商品不存在");
        }
        return product.getPrice().multiply(new BigDecimal(orderDTO.getNum()));
    }
    
    @Override
    public OrderMsg createOrder(OrderDTO orderDTO) {
        OrderMsg order = new OrderMsg();
        BeanUtils.copyProperties(orderDTO, order);
        order.setFkstatus("待支付");
        order.setShstatus("待发货");
        order.setDelstatus("正常");
        order.setSavetime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        
        orderMsgMapper.insert(order);
        return order;
    }
}

订单管理界面

商品智能推荐引擎

基于用户行为和商品属性实现个性化推荐,通过istj(是否推荐)字段和热度算法相结合。

推荐算法实现:

@Service
public class RecommendationService {
    
    @Autowired
    private ProductMapper productMapper;
    
    @Autowired
    private OrderMsgMapper orderMsgMapper;
    
    /**
     * 获取热门推荐商品
     */
    public List<Product> getHotProducts(String category, HttpServletRequest request) {
        Map<String, Object> params = new HashMap<>();
        params.put("issj", "是"); // 只查询上架商品
        params.put("delstatus", "正常");
        
        if (StringUtils.isNotBlank(category)) {
            params.put("leibie", category);
        }
        
        // 按销量排序获取热门商品
        params.put("orderBy", "sales_count desc");
        params.put("limit", 10);
        
        return productMapper.selectByParams(params);
    }
    
    /**
     * 基于协同过滤的个性化推荐
     */
    public List<Product> getPersonalizedRecommendations(String memberId) {
        // 获取用户历史购买记录
        List<OrderMsg> userOrders = orderMsgMapper.selectByMemberId(memberId);
        
        if (userOrders.isEmpty()) {
            // 新用户返回热门商品
            return getHotProducts("", null);
        }
        
        // 提取用户偏好品类
        Set<String> preferredCategories = extractPreferredCategories(userOrders);
        
        // 基于品类偏好进行推荐
        return getRecommendationsByCategory(preferredCategories);
    }
    
    private Set<String> extractPreferredCategories(List<OrderMsg> orders) {
        return orders.stream()
                .map(order -> productMapper.selectCategoryByProductId(order.getProductid()))
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
    }
}

商品详情页面

物流智能跟踪系统

物流模块整合多家快递公司接口,实现实时物流信息追踪和智能路径规划。

物流服务实现:

@Service
public class LogisticsService {
    
    @Autowired
    private OrderMsgMapper orderMsgMapper;
    
    /**
     * 更新物流信息
     */
    public void updateLogisticsInfo(String orderId, String company, String trackingNumber) {
        OrderMsg order = orderMsgMapper.selectByPrimaryKey(orderId);
        if (order != null) {
            order.setCompany(company);
            order.setDanhao(trackingNumber);
            order.setShstatus("已发货");
            orderMsgMapper.updateByPrimaryKey(order);
        }
    }
    
    /**
     * 查询物流轨迹
     */
    public LogisticsTrack getLogisticsTrack(String orderId) {
        OrderMsg order = orderMsgMapper.selectByPrimaryKey(orderId);
        if (order == null || StringUtils.isBlank(order.getDanhao())) {
            return null;
        }
        
        // 调用第三方物流接口
        return queryThirdPartyLogistics(order.getCompany(), order.getDanhao());
    }
    
    private LogisticsTrack queryThirdPartyLogistics(String company, String trackingNumber) {
        // 实现第三方物流接口调用逻辑
        // 支持多家快递公司:顺丰、圆通、中通等
        return logisticsApiClient.query(company, trackingNumber);
    }
}

物流信息添加界面

购物车与库存管理

购物车模块采用Redis缓存提升性能,库存管理确保数据一致性。

购物车服务核心代码:

@Service
public class CartService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private ProductMapper productMapper;
    
    private static final String CART_KEY_PREFIX = "cart:";
    
    /**
     * 添加商品到购物车
     */
    public void addToCart(String memberId, String productId, Integer quantity) {
        String cartKey = CART_KEY_PREFIX + memberId;
        
        // 检查商品是否存在且库存充足
        Product product = productMapper.selectByPrimaryKey(productId);
        if (product == null || !"是".equals(product.getIssj())) {
            throw new RuntimeException("商品不存在或已下架");
        }
        
        if (product.getStock() < quantity) {
            throw new RuntimeException("库存不足");
        }
        
        // 使用Hash存储购物车商品
        redisTemplate.opsForHash().put(cartKey, productId, quantity);
        
        // 设置过期时间(7天)
        redisTemplate.expire(cartKey, 7, TimeUnit.DAYS);
    }
    
    /**
     * 获取购物车商品列表
     */
    public List<CartItem> getCartItems(String memberId) {
        String cartKey = CART_KEY_PREFIX + memberId;
        Map<Object, Object> cartMap = redisTemplate.opsForHash().entries(cartKey);
        
        List<CartItem> cartItems = new ArrayList<>();
        for (Map.Entry<Object, Object> entry : cartMap.entrySet()) {
            String productId = (String) entry.getKey();
            Integer quantity = (Integer) entry.getValue();
            
            Product product = productMapper.selectByPrimaryKey(productId);
            if (product != null && "是".equals(product.getIssj())) {
                CartItem item = new CartItem();
                item.setProduct(product);
                item.setQuantity(quantity);
                item.setSubtotal(product.getPrice().multiply(new BigDecimal(quantity)));
                cartItems.add(item);
            }
        }
        
        return cartItems;
    }
}

购物车界面

实体模型设计

系统采用标准的JavaBean实体类设计,与数据库表结构严格对应,确保数据访问层的一致性。

基础实体类设计:

public class BaseEntity {
    protected Integer id;
    protected String delstatus;
    protected String savetime;
    
    // getter和setter方法
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    
    public String getDelstatus() { return delstatus; }
    public void setDelstatus(String delstatus) { this.delstatus = delstatus; }
    
    public String getSavetime() { return savetime; }
    public void setSavetime(String savetime) { this.savetime = savetime; }
}

@Entity
@Table(name = "product")
public class Product extends BaseEntity {
    private String productno;
    private String productname;
    private String filename;
    private BigDecimal price;
    private BigDecimal tprice;
    private String fid;
    private String sid;
    private String content;
    private String issj;
    private String istj;
    private String saver;
    private String leibie;
    private String cx;
    private String ps;
    private Integer stock;
    
    // 完整的getter和setter方法
    public String getProductno() { return productno; }
    public void setProductno(String productno) { this.productno = productno; }
    
    public String getProductname() { return productname; }
    public void setProductname(String productname) { this.productname = productname; }
    
    // ... 其他getter/setter方法
}

MyBatis映射文件配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
<mapper namespace="com.mapper.ProductMapper">
    
    <resultMap id="BaseResultMap" type="com.entity.Product">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="productno" property="productno" jdbcType="VARCHAR"/>
        <result column="productname" property="productname" jdbcType="VARCHAR"/>
        <result column="filename" property="filename" jdbcType="VARCHAR"/>
        <result column="price" property="
本文关键词
SSM框架农产品销售智能物流在线销售平台源码解析

上下篇

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