基于SSH框架的多商户在线点餐管理系统 - 源码深度解析

JavaJavaScriptSSH框架HTMLCSSMySQLJSP+Servlet
2026-02-103 浏览

文章摘要

本项目是基于SSH(Struts2 + Spring + Hibernate)框架技术栈构建的多商户在线点餐管理系统,旨在为餐饮行业提供一个集中、高效、可扩展的线上运营平台。其核心业务价值在于解决了传统餐饮行业在数字化转型过程中面临的多商户管理混乱、订单处理效率低下、前后台数据割裂等核心痛点。系统通...

在餐饮行业数字化转型的浪潮中,传统多商户管理模式面临着运营效率低下、数据分散、用户体验割裂等挑战。企业级多商户餐饮聚合平台应运而生,该系统采用经典的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());
    }
}

商户管理界面

系统优化与功能扩展展望

性能优化方向

  1. 缓存层引入:集成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);
    }
}
  1. 数据库读写分离:配置MySQL主从复制,提升查询性能

  2. 静态资源CDN加速:商品图片等静态资源使用CDN分发

功能扩展建议

  1. 移动端适配:开发响应式前端或独立的移动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>
  1. 智能推荐系统:基于用户行为数据实现个性化推荐
// 推荐算法基础实现
@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);
    }
}
  1. 实时消息通知:集成WebSocket实现订单状态实时推送
@ServerEndpoint("/order/status")
@Component
public class OrderStatusEndpoint {
    
    @OnOpen
    public void onOpen(Session session) {
        // WebSocket连接建立逻辑
    }
    
    @OnMessage
    public void onMessage(String message, Session session) {
        // 处理客户端消息
    }
}
  1. 微服务架构改造:将系统拆分为商户服务、订单服务、用户服务等独立微服务

  2. 大数据分析平台:集成ELK栈进行运营数据分析

该餐饮聚合平台通过严谨的架构设计和深度的业务逻辑实现,为多商户餐饮管理提供了可靠的技术支撑。系统在保持SSH框架稳定性的同时,具备良好的扩展性和维护性,为后续的技术演进和功能扩展奠定了坚实基础。

本文关键词
SSH框架多商户系统在线点餐管理系统源码解析

上下篇

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