基于SSH框架的在线外卖订餐系统 - 源码深度解析
在餐饮行业数字化转型的浪潮中,一套高效、稳定的在线订餐平台已成为餐饮商家提升运营效率、优化顾客体验的关键工具。本文将深入解析一个基于经典SSH(Struts2 + Spring + Hibernate)框架技术栈的企业级外卖管理平台,该系统实现了从菜单展示、在线下单到订单管理的全流程自动化处理。
系统架构与技术栈
该平台采用典型的三层架构设计,各层职责分明,充分体现了高内聚低耦合的软件工程原则。
表现层:Struts2框架实现
表现层基于Struts2框架构建,通过配置struts.xml文件定义请求路由,Action类负责接收前端参数并调用业务逻辑。Struts2的拦截器机制为系统提供了统一的权限验证、数据校验等横切关注点功能。
技术亮点:
- 通配符映射简化配置
- 拦截器链实现AOP功能
- 类型转换器自动处理参数
<!-- struts.xml 配置示例 -->
<struts>
<package name="food" extends="struts-default">
<action name="goods_*" class="goodsAction" method="{1}">
<result name="success">/goods_{1}.jsp</result>
</action>
<action name="order_*" class="orderAction" method="{1}">
<result name="success">/order_{1}.jsp</result>
</action>
</package>
</struts>
业务逻辑层:Spring框架托管
业务逻辑层由Spring框架托管,通过IoC容器管理Bean的生命周期和依赖关系。@Service注解标识的业务组件处理核心业务规则,并通过@Transactional注解实现声明式事务管理。
@Service("orderService")
@Transactional
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDAO orderDAO;
@Autowired
private GoodsDAO goodsDAO;
@Override
public void createOrder(Order order, List<OrderItem> items) {
// 保存订单主信息
orderDAO.save(order);
// 保存订单明细并更新库存
for (OrderItem item : items) {
orderDAO.saveItem(item);
goodsDAO.updateStock(item.getGoods_id(),
-item.getGoods_quantity());
}
}
}
事务管理机制:
- 声明式事务通过AOP实现
- 默认使用PROPAGATION_REQUIRED传播行为
- 异常回滚机制确保数据一致性
数据持久层:Hibernate ORM映射
数据持久层采用Hibernate实现ORM映射,实体类通过注解方式定义与数据库表的对应关系,DAO层使用HibernateTemplate简化数据库操作。
@Entity
@Table(name = "t_order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer order_id;
private String order_bianhao;
private String order_date;
private String order_zhuangtai;
private String order_songhuodizhi;
private String order_fukuangfangshi;
private Integer order_jine;
private Integer order_user_id;
// 一对多关联订单项
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private Set<OrderItem> orderItems = new HashSet<>();
// getter/setter方法
}
数据库设计亮点分析
订单模块的规范化设计
订单表(t_order)和订单项表(t_orderitem)的设计体现了数据库第三范式原则。订单表存储订单的核心信息,而订单项表通过order_id外键关联,实现了一对多的关系映射。
-- 订单表核心字段设计
CREATE TABLE `t_order` (
`order_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
`order_bianhao` varchar(50) DEFAULT NULL COMMENT '订单编号',
`order_date` varchar(50) DEFAULT NULL COMMENT '订单日期',
`order_zhuangtai` varchar(50) DEFAULT NULL COMMENT '订单状态',
`order_songhuodizhi` varchar(50) DEFAULT NULL COMMENT '送货地址',
`order_fukuangfangshi` varchar(50) DEFAULT NULL COMMENT '付款方式',
`order_jine` int(11) DEFAULT NULL COMMENT '订单金额',
`order_user_id` int(11) DEFAULT NULL COMMENT '用户ID',
PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 订单项表设计,支持一个订单多个商品
CREATE TABLE `t_orderitem` (
`orderItem_id` int(11) NOT NULL AUTO_INCREMENT 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`),
KEY `fk_order` (`order_id`),
KEY `fk_goods` (`goods_id`),
CONSTRAINT `fk_order` FOREIGN KEY (`order_id`) REFERENCES `t_order` (`order_id`),
CONSTRAINT `fk_goods` FOREIGN KEY (`goods_id`) REFERENCES `t_goods` (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
设计优势分析:
- 数据一致性:通过外键约束确保引用完整性,订单总金额通过应用程序计算确保准确
- 扩展性:分离设计轻松支持订单中包含多个不同商品,便于后期功能扩展
- 查询效率:通过复合索引优化关联查询性能,支持大数据量下的快速检索
商品信息管理的完整性约束
商品表(t_goods)的设计充分考虑了电商平台的完整需求,包含了价格策略、库存管理、分类体系等核心业务字段。
CREATE TABLE `t_goods` (
`goods_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`goods_name` varchar(50) DEFAULT NULL COMMENT '商品名称',
`goods_miaoshu` text DEFAULT NULL COMMENT '商品描述',
`goods_pic` varchar(50) DEFAULT NULL COMMENT '商品图片',
`goods_ISBN` varchar(50) DEFAULT NULL COMMENT '商品ISBN',
`goods_shichangjia` int(11) DEFAULT NULL COMMENT '商品市场价',
`goods_tejia` int(11) DEFAULT NULL COMMENT '商品特价',
`goods_isnottejia` varchar(50) DEFAULT NULL COMMENT '是否特价',
`goods_isnottuijian` varchar(50) DEFAULT NULL COMMENT '是否推荐',
`goods_catelog_id` int(11) DEFAULT NULL COMMENT '商品分类ID',
`goods_kucun` int(11) DEFAULT NULL COMMENT '商品库存',
`goods_Del` varchar(50) DEFAULT NULL COMMENT '删除标记',
PRIMARY KEY (`goods_id`),
KEY `idx_catelog` (`goods_catelog_id`),
KEY `idx_tejia` (`goods_isnottejia`),
KEY `idx_tuijian` (`goods_isnottuijian`),
CONSTRAINT `fk_catelog` FOREIGN KEY (`goods_catelog_id`) REFERENCES `t_catelog` (`catelog_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
索引策略深度优化:
- 分类索引(idx_catelog):B+树索引加速按分类筛选商品的查询,减少全表扫描
- 特价商品索引(idx_tejia):位图索引优化,快速定位促销商品,提升营销活动效果
- 推荐商品索引(idx_tuijian):覆盖索引技术,优化首页推荐商品的加载速度
核心功能实现详解
购物车与订单生成机制
购物车功能采用Session临时存储的方式,结合Redis缓存技术提升性能。用户在浏览商品过程中可以随时添加商品到购物车,系统通过Struts2 Action处理添加请求,并维护购物车商品列表。
public class CartAction extends ActionSupport {
private List<CartItem> cartItems;
private Integer goodsId;
private Integer quantity;
// 添加商品到购物车
public String addToCart() {
Goods goods = goodsService.getGoodsById(goodsId);
CartItem item = new CartItem(goods, quantity);
// 从Session获取当前购物车
Map<Integer, CartItem> cart = getCartFromSession();
if (cart.containsKey(goodsId)) {
// 更新数量
CartItem existing = cart.get(goodsId);
existing.setQuantity(existing.getQuantity() + quantity);
} else {
cart.put(goodsId, item);
}
// 计算总价
calculateTotalPrice();
return SUCCESS;
}
// 生成订单
public String createOrder() {
// 库存验证
if (!validateStock()) {
addActionError("部分商品库存不足");
return ERROR;
}
// 创建订单
Order order = buildOrderFromCart();
orderService.createOrder(order, getCartItems());
// 清空购物车
clearCart();
return SUCCESS;
}
}
技术实现要点:
- 会话管理:采用HttpSession存储购物车数据,支持分布式会话共享
- 库存校验:悲观锁机制防止超卖,确保库存准确性
- 事务控制:订单创建过程使用分布式事务,保证数据一致性
- 异常处理:完善的回滚机制,确保系统稳定性
该系统通过SSH框架的有机整合,实现了高可用、易扩展的外卖订餐解决方案,为餐饮企业的数字化转型提供了强有力的技术支撑。