在当今数字化消费趋势下,传统生鲜行业面临着信息不对称、供应链冗长、库存管理复杂等多重挑战。针对这些痛点,我们设计并实现了一套企业级生鲜电商平台,采用成熟的SSH(Struts2 + Spring + Hibernate)整合框架技术栈,构建了一个功能完整、性能稳定的在线交易系统。
系统采用经典的三层架构设计。表现层基于Struts2框架,通过Action类接收前端请求并调用业务逻辑,结合JSP页面和Struts标签库实现数据渲染。业务逻辑层由Spring框架托管,利用IoC容器统一管理Service组件,并通过AOP实现事务管理。数据持久层基于Hibernate实现ORM映射,通过SessionFactory和事务管理简化数据库操作。
数据库设计亮点分析
商品表(t_goods)的设计体现了良好的业务建模能力:
CREATE TABLE `t_goods` (
`goods_id` int(11) NOT NULL COMMENT '商品ID',
`goods_catelog_id` int(11) DEFAULT NULL COMMENT '商品分类ID',
`goods_name` varchar(66) DEFAULT NULL COMMENT '商品名称',
`goods_miaoshu` varchar(3000) DEFAULT NULL COMMENT '商品描述',
`goods_pic` varchar(50) DEFAULT NULL COMMENT '商品图片',
`goods_shichangjia` int(11) DEFAULT NULL COMMENT '商品市场价',
`goods_tejia` int(11) DEFAULT NULL COMMENT '商品特价',
`goods_isnottejia` varchar(50) DEFAULT NULL COMMENT '是否特价',
`goods_Del` varchar(50) DEFAULT NULL COMMENT '商品删除状态',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品表'
该表设计中,goods_miaoshu字段使用varchar(3000)类型,充分考虑了生鲜商品需要详细描述产地、保质期、存储条件等信息的业务需求。价格字段采用int类型存储分单位,避免浮点数精度问题。goods_isnottejia和goods_Del使用状态标识字段,支持灵活的营销策略和软删除功能。
订单表(t_order)与订单项表(t_orderitem)的关联设计展现了良好的规范化水平:
CREATE TABLE `t_order` (
`id` int(11) NOT NULL COMMENT '订单ID',
`bianhao` varchar(88) DEFAULT NULL COMMENT '订单编号',
`xiadanshi` varchar(50) DEFAULT NULL COMMENT '下单时间',
`userName` varchar(255) DEFAULT NULL COMMENT '用户名',
`userRealname` varchar(255) DEFAULT NULL COMMENT '用户真实姓名',
`userTel` varchar(255) DEFAULT NULL COMMENT '用户电话',
`songhuodizhi` varchar(50) DEFAULT NULL COMMENT '送货地址',
`fukuanfangshi` varchar(50) DEFAULT NULL COMMENT '付款方式',
`jine` int(11) DEFAULT NULL COMMENT '金额',
`zhuangtai` varchar(50) DEFAULT NULL COMMENT '订单状态',
`userId` int(11) DEFAULT NULL COMMENT '用户ID',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单表'
CREATE TABLE `t_orderitem` (
`orderItem_id` int(11) NOT NULL COMMENT '订单项ID',
`order_id` int(11) DEFAULT NULL COMMENT '订单ID',
`goods_id` int(11) DEFAULT NULL COMMENT '商品ID',
`goods_quantity` int(11) DEFAULT NULL COMMENT '商品数量',
PRIMARY KEY (`orderItem_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单项表'
这种设计遵循了数据库第三范式,订单主表存储订单基本信息,订单项表记录具体商品明细,支持一个订单包含多个商品的需求。bianhao字段采用varchar(88)为订单编号生成规则预留充足空间,zhuangtai字段支持订单状态跟踪。
核心功能实现
商品管理模块采用Hibernate实体映射技术,实现商品信息的CRUD操作:
@Entity
@Table(name = "t_goods")
public class Goods {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer goods_id;
private Integer goods_catelog_id;
private String goods_name;
private String goods_miaoshu;
private String goods_pic;
private Integer goods_shichangjia;
private Integer goods_tejia;
private String goods_isnottejia;
private String goods_Del;
// Getter和Setter方法
public Integer getGoods_id() { return goods_id; }
public void setGoods_id(Integer goods_id) { this.goods_id = goods_id; }
public String getGoods_name() { return goods_name; }
public void setGoods_name(String goods_name) { this.goods_name = goods_name; }
// 其他getter/setter方法...
}

购物车功能通过Spring Service层实现业务逻辑:
@Service
@Transactional
public class CartService {
@Autowired
private GoodsDAO goodsDAO;
public void addToCart(Integer goodsId, Integer quantity, Map<Integer, CartItem> cart) {
Goods goods = goodsDAO.findById(goodsId);
if (cart.containsKey(goodsId)) {
CartItem item = cart.get(goodsId);
item.setQuantity(item.getQuantity() + quantity);
} else {
CartItem newItem = new CartItem(goods, quantity);
cart.put(goodsId, newItem);
}
}
public BigDecimal calculateTotal(Map<Integer, CartItem> cart) {
return cart.values().stream()
.map(item -> item.getGoods().getGoods_tejia().multiply(new BigDecimal(item.getQuantity())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
}

订单处理模块使用Struts2 Action处理用户请求:
public class OrderAction extends ActionSupport {
private Order order;
private List<CartItem> cartItems;
@Autowired
private OrderService orderService;
public String createOrder() {
try {
// 验证购物车数据
if (cartItems == null || cartItems.isEmpty()) {
addActionError("购物车为空");
return ERROR;
}
// 生成订单编号
order.setBianhao(generateOrderNumber());
order.setXiadanshi(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// 保存订单
orderService.createOrder(order, cartItems);
return SUCCESS;
} catch (Exception e) {
addActionError("订单创建失败: " + e.getMessage());
return ERROR;
}
}
private String generateOrderNumber() {
return "ORD" + System.currentTimeMillis() + (int)(Math.random() * 1000);
}
}

用户认证与权限控制通过拦截器实现:
public class AuthInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Map<String, Object> session = invocation.getInvocationContext().getSession();
User user = (User) session.get("currentUser");
if (user == null) {
return "login"; // 跳转到登录页面
}
// 检查权限
String actionName = invocation.getProxy().getActionName();
if (!hasPermission(user, actionName)) {
return "noPermission";
}
return invocation.invoke();
}
private boolean hasPermission(User user, String actionName) {
// 权限验证逻辑
return true;
}
}

实体模型设计
系统采用面向对象的设计思想,通过Hibernate注解实现对象关系映射:
@Entity
@Table(name = "t_order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String bianhao;
private String xiadanshi;
private String userName;
private String userRealname;
private String userTel;
private String songhuodizhi;
private String fukuanfangshi;
private Integer jine;
private String zhuangtai;
private Integer userId;
private String email;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private Set<OrderItem> orderItems = new HashSet<>();
// 关联方法
public void addOrderItem(OrderItem item) {
orderItems.add(item);
item.setOrder(this);
}
}
@Entity
@Table(name = "t_orderitem")
public class OrderItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer orderItem_id;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
@ManyToOne
@JoinColumn(name = "goods_id")
private Goods goods;
private Integer goods_quantity;
// 业务逻辑方法
public BigDecimal getSubtotal() {
return goods.getGoods_tejia().multiply(new BigDecimal(goods_quantity));
}
}
功能展望与优化
基于当前系统架构,未来可从以下几个方向进行优化升级:
1. 引入Redis缓存层
@Service
public class GoodsServiceWithCache {
@Autowired
private RedisTemplate<String, Goods> redisTemplate;
@Cacheable(value = "goods", key = "#goodsId")
public Goods findGoodsWithCache(Integer goodsId) {
return goodsDAO.findById(goodsId);
}
@CacheEvict(value = "goods", key = "#goods.goods_id")
public void updateGoods(Goods goods) {
goodsDAO.update(goods);
}
}
2. 微服务架构改造 将单体应用拆分为商品服务、订单服务、用户服务等独立微服务,通过Spring Cloud实现服务治理。商品服务独立负责商品管理功能:
# application.yml for product-service
server:
port: 8081
spring:
application:
name: product-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
3. 消息队列集成 使用RabbitMQ处理高并发订单,实现异步处理和削峰填谷:
@Component
public class OrderMessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendOrderMessage(Order order) {
rabbitTemplate.convertAndSend("order.exchange", "order.create", order);
}
}
@Component
public class OrderMessageConsumer {
@RabbitListener(queues = "order.queue")
public void processOrder(Order order) {
// 异步处理订单逻辑
orderService.processOrderAsync(order);
}
}
4. 移动端适配与PWA技术 开发响应式前端,支持PWA(渐进式Web应用)特性,提升移动端用户体验:
// service-worker.js
self.addEventListener('fetch', (event) => {
if (event.request.url.includes('/api/goods')) {
event.respondWith(
caches.match(event.request)
.then(response => response || fetch(event.request))
);
}
});
5. 智能推荐系统 基于用户行为数据实现个性化商品推荐:
@Service
public class RecommendationService {
public List<Goods> recommendGoods(Integer userId) {
// 基于协同过滤算法实现推荐逻辑
return collaborativeFiltering(userId);
}
private List<Goods> collaborativeFiltering(Integer userId) {
// 实现推荐算法
return goodsDAO.findSimilarGoodsByUserBehavior(userId);
}
}
总结
该生鲜电商平台通过SSH框架的有机整合,构建了一个功能完善、架构清晰的企业级应用系统。数据库设计合理规范,核心业务模块实现严谨,为后续的功能扩展和性能优化奠定了坚实基础。未来通过引入缓存、微服务、消息队列等现代技术栈,可以进一步提升系统的 scalability 和用户体验,满足日益增长的业务需求。