在农产品流通领域,传统模式面临着信息不对称、流通环节多、物流效率低等核心挑战。针对这些痛点,我们设计并实现了一个集在线销售与智能物流于一体的综合性平台——"农鲜直达"智能供应链系统。该系统采用成熟的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='订单表'
设计亮点分析:
- 状态字段分离设计:将
fkstatus(付款状态)、shstatus(收货状态)、delstatus(删除状态)分离存储,便于状态独立管理和查询优化 - 物流信息完整性:包含
company(快递公司)和danhao(快递单号)字段,实现物流信息的完整追踪 - 灵活的扩展性:通过
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="