在餐饮行业数字化转型的浪潮中,传统多商户管理模式面临着运营效率低下、数据分散、用户体验割裂等挑战。企业级多商户餐饮聚合平台应运而生,该系统采用经典的SSH(Struts2+Spring+Hibernate)技术架构,为餐饮集团、商业综合体及第三方服务平台提供了一套完整的在线点餐解决方案。
系统架构与技术栈设计
该平台采用典型的三层架构设计,各层职责分明。表现层基于Struts2框架构建,通过精心设计的Action类处理前端请求,实现页面导航和数据传递。业务逻辑层由Spring框架的IOC容器统一管理,通过声明式事务管理确保订单处理、库存更新等核心业务的数据一致性。数据持久层采用Hibernate ORM框架,将Java对象与数据库表进行映射,大幅简化了数据访问操作。
技术栈配置体现了企业级应用的稳定性要求:
<!-- Struts2核心配置 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.30</version>
</dependency>
<!-- Spring框架集成 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.18</version>
</dependency>
<!-- Hibernate ORM -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.7.Final</version>
</dependency>
Spring的配置文件中定义了完整的事务管理和Bean依赖注入:
<!-- 数据源配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ordering_db"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>
<!-- Hibernate会话工厂 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
<!-- 声明式事务管理 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
数据库架构深度解析
店铺表(t_dianpu)设计优化
店铺表作为多商户体系的核心,其设计充分考虑了业务扩展性:
CREATE TABLE `t_dianpu` (
`id` int(11) NOT NULL DEFAULT 0 COMMENT '店铺ID',
`loginname` varchar(255) DEFAULT NULL COMMENT '登录名',
`loginpw` varchar(255) DEFAULT NULL COMMENT '登录密码',
`mingcheng` varchar(500) DEFAULT NULL COMMENT '店铺名称',
`zhuying` varchar(500) DEFAULT NULL COMMENT '主营业务',
`lianxiren` varchar(255) DEFAULT NULL COMMENT '联系人',
`dianhua` varchar(255) DEFAULT NULL COMMENT '联系电话',
`tai` varchar(255) DEFAULT NULL COMMENT '状态',
`del` varchar(255) DEFAULT NULL COMMENT '删除标志',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='店铺表'
设计亮点分析:
- 状态管理精细化:
tai字段支持"待审核"、"已通过"、"已拒绝"、"停用"等多种状态,实现完整的商户生命周期管理 - 软删除机制:
del字段采用逻辑删除而非物理删除,确保历史数据完整性 - 业务分类明确:
zhuying字段长度设置为500字符,支持详细的经营范围描述 - 索引优化策略:在实际部署中应补充
loginname唯一索引和tai状态索引
订单系统表关系设计
订单模块采用主从表结构设计,确保数据一致性:
CREATE TABLE `t_order` (
`order_id` int(11) NOT NULL COMMENT '订单ID',
`order_bianhao` varchar(200) DEFAULT NULL COMMENT '订单编号',
`order_date` varchar(50) DEFAULT NULL COMMENT '订单日期',
`userRealname` varchar(255) DEFAULT NULL COMMENT '用户真实姓名',
`userTel` varchar(255) 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 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 '商品数量',
`zt` varchar(255) DEFAULT NULL COMMENT '状态',
PRIMARY KEY (`orderItem_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单项表'
订单系统设计特点:
- 金额存储优化:
order_jine以分为单位存储,避免浮点数精度问题 - 订单编号唯一性:
order_bianhao采用业务规则生成,具备唯一性约束 - 扩展性考虑:订单项状态字段
zt支持"待处理"、"制作中"、"已完成"等状态跟踪 - 查询性能优化:通过
order_id建立外键关联,支持高效的订单详情查询

核心业务功能实现
多商户权限管理体系
系统实现了严格的三级权限控制,通过Spring Security进行权限验证:
// 商户登录验证核心逻辑
@Service("dianpuService")
@Transactional
public class DianpuService {
@Autowired
private DianpuDAO dianpuDAO;
public Dianpu login(String loginname, String loginpw) {
String hql = "from Dianpu where loginname=? and loginpw=? and tai='已通过' and del='no'";
List<Dianpu> list = dianpuDAO.findByHql(hql, loginname, loginpw);
return list.size() > 0 ? list.get(0) : null;
}
// 商户状态管理
public void updateStatus(Integer id, String status) {
Dianpu dianpu = dianpuDAO.findById(id);
if(dianpu != null) {
dianpu.setTai(status);
dianpuDAO.attachDirty(dianpu);
}
}
}
// Struts2商户登录Action
public class DianpuLoginAction extends ActionSupport {
private String loginname;
private String loginpw;
private Dianpu dianpu;
public String execute() {
DianpuService dianpuService = new DianpuService();
dianpu = dianpuService.login(loginname, loginpw);
if(dianpu != null) {
Map session = ActionContext.getContext().getSession();
session.put("dianpu", dianpu);
return "success";
} else {
this.addActionError("用户名或密码错误,或商户未通过审核!");
return "error";
}
}
// getter和setter方法
public String getLoginname() { return loginname; }
public void setLoginname(String loginname) { this.loginname = loginname; }
// ... 其他getter/setter
}

购物车与订单处理引擎
购物车模块采用Session临时存储,订单处理确保事务完整性:
// 购物车业务逻辑实现
@Service("cartService")
public class CartService {
// 添加商品到购物车
public void addToCart(HttpSession session, Integer goodsId, Integer quantity) {
Map<Integer, CartItem> cart = getCart(session);
Goods goods = goodsService.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);
}
session.setAttribute("cart", cart);
}
// 生成订单事务处理
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public Order createOrder(Order order, Map<Integer, CartItem> cart) {
try {
// 1. 保存主订单
orderDAO.save(order);
// 2. 保存订单项
for(CartItem item : cart.values()) {
OrderItem orderItem = new OrderItem();
orderItem.setOrder(order);
orderItem.setGoods(item.getGoods());
orderItem.setGoods_quantity(item.getQuantity());
orderItem.setZt("待处理");
orderItemDAO.save(orderItem);
// 3. 更新商品库存
Goods goods = item.getGoods();
goods.setKucun(goods.getKucun() - item.getQuantity());
goodsDAO.attachDirty(goods);
}
return order;
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
throw new RuntimeException("订单创建失败", e);
}
}
}

商品管理与评价系统
商品管理采用Hibernate实体映射,评价系统实现多表关联查询:
// 商品实体类映射
@Entity
@Table(name = "t_goods")
public class Goods implements java.io.Serializable {
private Integer id;
private String mingcheng;
private String jieshao;
private String fujian;
private Integer jiage;
private Integer kucun;
private Dianpu dianpu;
private Set<Pingjia> pingjias = new HashSet<Pingjia>(0);
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
public Integer getId() { return this.id; }
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dianpu_id")
public Dianpu getDianpu() { return this.dianpu; }
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "goods")
public Set<Pingjia> getPingjias() { return this.pingjias; }
// 其他getter/setter方法
}
// 评价查询服务
@Service("pingjiaService")
public class PingjiaService {
public List<Pingjia> findPingjiaByGoods(Integer goodsId) {
String hql = "from Pingjia p left join fetch p.user where p.goodsId = ? order by p.shijian desc";
return pingjiaDAO.findByHql(hql, goodsId);
}
// 统计商品平均评分
public Double getAverageScore(Integer goodsId) {
String hql = "select avg(p.xingji) from Pingjia p where p.goodsId = ?";
List<Double> result = pingjiaDAO.findByHql(hql, goodsId);
return result.get(0) != null ? result.get(0) : 0.0;
}
}

实体模型与数据持久化设计
Hibernate实体映射配置体现了对象关系映射的最佳实践:
<!-- Hibernate映射文件示例 -->
<hibernate-mapping>
<class name="com.model.Order" table="t_order">
<id name="order_id" column="order_id">
<generator class="identity"/>
</id>
<property name="order_bianhao" column="order_bianhao" type="string"/>
<property name="order_date" column="order_date" type="string"/>
<property name="userRealname" column="userRealname" type="string"/>
<property name="order_jine" column="order_jine" type="integer"/>
<!-- 一对多关联订单项 -->
<set name="orderItems" inverse="true" cascade="all-delete-orphan">
<key column="order_id"/>
<one-to-many class="com.model.OrderItem"/>
</set>
</class>
</hibernate-mapping>
Spring服务层通过注解方式管理事务:
// 综合业务服务类
@Service("orderingService")
@Transactional
public class OrderingService {
@Autowired
private DianpuDAO dianpuDAO;
@Autowired
private OrderDAO orderDAO;
@Autowired
private GoodsDAO goodsDAO;
// 多条件商户查询
@Transactional(readOnly = true)
public List<Dianpu> findDianpuByCondition(String mingcheng, String zhuying, String tai) {
StringBuilder hql = new StringBuilder("from Dianpu where del='no'");
List<Object> params = new ArrayList<>();
if(StringUtils.isNotBlank(mingcheng)) {
hql.append(" and mingcheng like ?");
params.add("%" + mingcheng + "%");
}
if(StringUtils.isNotBlank(zhuying)) {
hql.append(" and zhuying like ?");
params.add("%" + zhuying + "%");
}
if(StringUtils.isNotBlank(tai)) {
hql.append(" and tai = ?");
params.add(tai);
}
return dianpuDAO.findByHql(hql.toString(), params.toArray());
}
}

系统优化与功能扩展展望
性能优化方向
- 缓存层引入:集成Redis缓存热点数据
// Redis缓存配置示例
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}
}
// 缓存应用示例
@Service
public class GoodsService {
@Cacheable(value = "goods", key = "#goodsId")
public Goods findById(Integer goodsId) {
return goodsDAO.findById(goodsId);
}
}
数据库读写分离:配置MySQL主从复制,提升查询性能
静态资源CDN加速:商品图片等静态资源使用CDN分发
功能扩展建议
- 移动端适配:开发响应式前端或独立的移动APP
<!-- 响应式布局示例 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
@media (max-width: 768px) {
.goods-list { grid-template-columns: repeat(2, 1fr); }
.order-form { padding: 10px; }
}
</style>
- 智能推荐系统:基于用户行为数据实现个性化推荐
// 推荐算法基础实现
@Service
public class RecommendationService {
public List<Goods> recommendGoods(Integer userId) {
// 基于协同过滤的推荐逻辑
List<Order> userOrders = orderDAO.findByUserId(userId);
Set<Integer> similarUsers = findSimilarUsers(userId);
return calculateRecommendations(userId, similarUsers);
}
}
- 实时消息通知:集成WebSocket实现订单状态实时推送
@ServerEndpoint("/order/status")
@Component
public class OrderStatusEndpoint {
@OnOpen
public void onOpen(Session session) {
// WebSocket连接建立逻辑
}
@OnMessage
public void onMessage(String message, Session session) {
// 处理客户端消息
}
}
微服务架构改造:将系统拆分为商户服务、订单服务、用户服务等独立微服务
大数据分析平台:集成ELK栈进行运营数据分析
该餐饮聚合平台通过严谨的架构设计和深度的业务逻辑实现,为多商户餐饮管理提供了可靠的技术支撑。系统在保持SSH框架稳定性的同时,具备良好的扩展性和维护性,为后续的技术演进和功能扩展奠定了坚实基础。