基于SSH框架的移动端电商平台设计与实现 - 源码深度解析

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

文章摘要

本项目基于经典的SSH(Struts2 + Spring + Hibernate)技术栈,设计并实现了一个面向移动端的电商平台。该平台旨在解决传统电商系统在移动场景下交互体验不佳、业务流程割裂的核心痛点,通过整合用户管理与商品交易两大核心模块,为消费者提供流畅、安全的一站式购物服务。其核心业务价值在...

在移动互联网高速发展的时代背景下,传统电商系统面临着移动端适配不足、交互体验割裂的挑战。本项目采用经典的SSH(Struts2 + Spring + Hibernate)技术栈,构建了一个面向移动端的电商解决方案,旨在为中小型企业提供快速部署、易于维护的移动电商平台。

系统架构与技术栈设计

该电商平台采用典型的三层架构设计,每一层都充分发挥了SSH框架的优势。表现层基于Struts2框架,通过精心设计的拦截器链处理移动端HTTP请求,实现了统一的身份验证、参数校验和响应封装机制。业务逻辑层由Spring框架的IoC容器统一管理,利用声明式事务管理确保核心交易操作的原子性和一致性。数据持久层采用Hibernate实现对象关系映射,简化了数据库操作。

// Struts2拦截器配置示例
public class AuthenticationInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context = invocation.getInvocationContext();
        Map<String, Object> session = context.getSession();
        Object user = session.get("user");
        
        if (user == null) {
            return "login"; // 未登录用户重定向到登录页面
        }
        return invocation.invoke();
    }
}

Spring的配置文件中明确定义了业务组件之间的依赖关系,通过依赖注入实现松耦合架构:

<!-- Spring配置文件示例 -->
<bean id="userService" class="com.ecommerce.service.impl.UserServiceImpl">
    <property name="userDAO" ref="userDAO"/>
</bean>

<bean id="userDAO" class="com.ecommerce.dao.impl.UserDAOImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<!-- 事务管理配置 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

数据库设计深度分析

用户表(t_user)设计优化

用户表作为系统的核心基础表,在设计上充分考虑了移动端用户管理的特殊需求:

CREATE TABLE `t_user` (
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
  `user_pw` varchar(55) DEFAULT NULL COMMENT '用户密码',
  `user_realname` varchar(50) DEFAULT NULL COMMENT '真实姓名',
  `user_sex` varchar(50) DEFAULT NULL COMMENT '用户性别',
  `user_address` varchar(50) DEFAULT NULL COMMENT '用户地址',
  `user_tel` varchar(50) DEFAULT NULL COMMENT '用户电话',
  `user_del` varchar(50) DEFAULT NULL COMMENT '用户删除状态',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'

设计亮点分析:

  1. 密码安全设计user_pw字段长度为55字符,为密码加密算法(如BCrypt)预留了充足空间
  2. 软删除机制:通过user_del字段实现逻辑删除,保留用户数据的同时支持账户恢复功能
  3. 联系方式优化user_tel字段专门为移动端设计,支持手机号验证和短信功能扩展

商品表(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` varchar(4000) 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_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`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='商品表'

深度优化分析:

  1. 价格策略设计:同时维护市场价和特价字段,支持灵活的促销策略
  2. 库存管理goods_kucun字段实时跟踪库存变化,防止超卖现象
  3. 大文本支持goods_miaoshu字段使用4000字符长度,满足商品详情的富文本需求

订单系统表关系设计

订单系统采用主从表结构设计,确保数据的一致性和查询效率:

-- 订单主表
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 AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='订单表'

-- 订单明细表
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`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COMMENT='订单项表'

核心功能实现详解

用户身份验证与会话管理

系统实现了基于Struts2拦截器的统一身份验证机制,确保移动端API的安全访问:

// 用户登录验证核心代码
@Service("userService")
@Transactional
public class UserServiceImpl implements UserService {
    
    @Autowired
    private UserDAO userDAO;
    
    @Override
    public User login(String userName, String userPw) {
        String hql = "FROM User WHERE userName = :userName AND userPw = :userPw";
        Map<String, Object> params = new HashMap<>();
        params.put("userName", userName);
        params.put("userPw", MD5Util.encode(userPw)); // 密码MD5加密
        
        List<User> users = userDAO.find(hql, params);
        return users.isEmpty() ? null : users.get(0);
    }
    
    @Override
    @Transactional(readOnly = true)
    public boolean checkUserExists(String userName) {
        String hql = "SELECT COUNT(*) FROM User WHERE userName = :userName";
        Map<String, Object> params = Collections.singletonMap("userName", userName);
        Long count = userDAO.count(hql, params);
        return count > 0;
    }
}

用户登录界面

商品浏览与搜索功能

商品模块支持分类浏览、关键词搜索和特价商品筛选,为移动端用户提供便捷的商品发现体验:

// 商品搜索服务实现
@Service("goodsService")
@Transactional
public class GoodsServiceImpl implements GoodsService {
    
    @Autowired
    private GoodsDAO goodsDAO;
    
    @Override
    @Transactional(readOnly = true)
    public List<Goods> searchGoods(String keyword, Integer catelogId, 
                                  Boolean isTejia, Integer page, Integer size) {
        StringBuilder hql = new StringBuilder("FROM Goods WHERE goodsDel = 'no'");
        Map<String, Object> params = new HashMap<>();
        
        if (StringUtils.isNotBlank(keyword)) {
            hql.append(" AND (goodsName LIKE :keyword OR goodsMiaoshu LIKE :keyword)");
            params.put("keyword", "%" + keyword + "%");
        }
        
        if (catelogId != null) {
            hql.append(" AND goodsCatelogId = :catelogId");
            params.put("catelogId", catelogId);
        }
        
        if (isTejia != null) {
            hql.append(" AND goodsIsnottejia = :isTejia");
            params.put("isTejia", isTejia ? "是" : "否");
        }
        
        hql.append(" ORDER BY goodsId DESC");
        
        return goodsDAO.find(hql.toString(), params, page, size);
    }
    
    @Override
    @Transactional(readOnly = true)
    public Goods getGoodsDetail(Integer goodsId) {
        return goodsDAO.get(goodsId);
    }
}

商品详情页面

购物车与订单管理

购物车功能采用Session存储临时数据,订单生成时确保库存检查和事务一致性:

// 购物车业务逻辑实现
@Service("cartService")
@Transactional
public class CartServiceImpl implements CartService {
    
    @Autowired
    private GoodsService goodsService;
    
    @Autowired
    private OrderService orderService;
    
    @Override
    public void addToCart(HttpSession session, Integer goodsId, Integer quantity) {
        Map<Integer, CartItem> cart = getCart(session);
        Goods goods = goodsService.getGoodsDetail(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);
        }
    }
    
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String createOrder(HttpSession session, Order order, Integer userId) {
        Map<Integer, CartItem> cart = getCart(session);
        
        // 检查库存
        for (CartItem item : cart.values()) {
            if (item.getGoods().getGoodsKucun() < item.getQuantity()) {
                throw new RuntimeException("商品库存不足: " + item.getGoods().getGoodsName());
            }
        }
        
        // 生成订单
        order.setOrderDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        order.setOrderBianhao(generateOrderNumber());
        order.setOrderUserId(userId);
        
        List<OrderItem> orderItems = new ArrayList<>();
        int totalAmount = 0;
        
        for (CartItem item : cart.values()) {
            OrderItem orderItem = new OrderItem();
            orderItem.setGoodsId(item.getGoods().getGoodsId());
            orderItem.setGoodsQuantity(item.getQuantity());
            orderItem.setOrderId(order.getOrderId());
            
            int itemAmount = item.getGoods().getGoodsTejia() != null ? 
                           item.getGoods().getGoodsTejia() : item.getGoods().getGoodsShichangjia();
            totalAmount += itemAmount * item.getQuantity();
            
            orderItems.add(orderItem);
            
            // 扣减库存
            goodsService.updateStock(item.getGoods().getGoodsId(), 
                                   item.getGoods().getGoodsKucun() - item.getQuantity());
        }
        
        order.setOrderJine(totalAmount);
        orderService.saveOrder(order, orderItems);
        
        // 清空购物车
        clearCart(session);
        
        return order.getOrderBianhao();
    }
}

购物车页面

订单处理与状态管理

订单系统实现了完整的生命周期管理,支持状态跟踪和业务流程控制:

// 订单状态管理服务
@Service("orderService")
@Transactional
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderDAO orderDAO;
    
    @Autowired
    private OrderItemDAO orderItemDAO;
    
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveOrder(Order order, List<OrderItem> orderItems) {
        // 保存主订单
        orderDAO.save(order);
        
        // 保存订单明细
        for (OrderItem item : orderItems) {
            item.setOrderId(order.getOrderId());
            orderItemDAO.save(item);
        }
    }
    
    @Override
    @Transactional(readOnly = true)
    public List<Order> getUserOrders(Integer userId, String status, 
                                   Date startDate, Date endDate) {
        StringBuilder hql = new StringBuilder("FROM Order WHERE orderUserId = :userId");
        Map<String, Object> params = new HashMap<>();
        params.put("userId", userId);
        
        if (StringUtils.isNotBlank(status)) {
            hql.append(" AND orderZhuangtai = :status");
            params.put("status", status);
        }
        
        if (startDate != null) {
            hql.append(" AND orderDate >= :startDate");
            params.put("startDate", new SimpleDateFormat("yyyy-MM-dd").format(startDate));
        }
        
        if (endDate != null) {
            hql.append(" AND orderDate <= :endDate");
            params.put("endDate", new SimpleDateFormat("yyyy-MM-dd").format(endDate));
        }
        
        hql.append(" ORDER BY orderDate DESC");
        
        return orderDAO.find(hql.toString(), params);
    }
    
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateOrderStatus(Integer orderId, String newStatus) {
        Order order = orderDAO.get(orderId);
        if (order != null) {
            order.setOrderZhuangtai(newStatus);
            orderDAO.update(order);
        }
    }
}

订单确认页面

实体模型设计与Hibernate映射

系统采用标准的JPA注解方式进行实体类定义,确保与数据库表的精确映射:

// 商品实体类映射示例
@Entity
@Table(name = "t_goods")
public class Goods implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "goods_id")
    private Integer goodsId;
    
    @Column(name = "goods_name", length = 50)
    private String goodsName;
    
    @Column(name = "goods_miaoshu", length = 4000)
    private String goodsMiaoshu;
    
    @Column(name = "goods_pic", length = 50)
    private String goodsPic;
    
    @Column(name = "goods_shichangjia")
    private Integer goodsShichangjia;
    
    @Column(name = "goods_tejia")
    private Integer goodsTejia;
    
    @Column(name = "goods_isnottejia", length = 50)
    private String goodsIsnottejia;
    
    @Column(name = "goods_catelog_id")
    private Integer goodsCatelogId;
    
    @Column(name = "goods_kucun")
    private Integer goodsKucun;
    
    @Column(name = "goods_Del", length = 50)
    private String goodsDel;
    
    // 省略getter/setter方法
}

// 订单与订单项的一对多关系映射
@Entity
@Table(name = "t_order")
public class Order implements Serializable {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "order_id")
    private Integer orderId;
    
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<OrderItem> orderItems = new ArrayList<>();
    
    @Column(name = "order_bianhao", length = 50)
    private String orderBianhao;
    
    @Column(name = "order_date", length = 50)
    private String orderDate;
    
    @Column(name = "order_zhuangtai", length = 50)
    private String orderZhuangtai;
    
    // 其他字段省略...
}

功能展望与系统优化方向

基于当前系统架构,未来可以从以下几个方向进行深度优化和功能扩展:

1. 引入Redis缓存层提升性能

// 商品信息缓存示例
@Service
public class GoodsServiceWithCache {
    
    @Autowired
    private RedisTemplate<String, Goods> redisTemplate;
    
    @Autowired
    private GoodsDAO goodsDAO;
    
    public Goods getGoodsWithCache(Integer goodsId) {
        String cacheKey = "goods:" + goodsId;
        Goods goods = redisTemplate.opsForValue().get(cacheKey);
        
        if (goods == null) {
            goods = goodsDAO.get(goodsId);
            if (goods != null) {
                redisTemplate.opsForValue().set(cacheKey, goods, Duration.ofHours(1));
            }
        }
        return goods;
    }
}

2. 微服务架构改造

将单体应用拆分为用户服务、商品服务、订单服务等独立微服务,提升系统可扩展性和维护性。

3. 移动端API优化

增加GraphQL接口支持,允许移动端按需获取数据,减少网络传输量,提升用户体验。

4. 智能推荐系统集成

基于用户行为数据实现个性化商品推荐,提升转化率和用户粘性。

5. 多租户架构支持

改造系统支持SaaS化部署,为不同商户提供独立的电商平台实例。

总结

该移动电商平台通过成熟的SSH技术栈实现了稳定可靠的电商业务流程,在数据库设计、业务逻辑处理、用户交互体验等方面都进行了精心优化。系统架构清晰,代码可维护性强,为中小型企业快速部署移动电商业务提供了完整的技术解决方案。未来通过引入缓存、微服务等

本文关键词
SSH框架移动端电商平台系统架构数据库设计源码解析

上下篇

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