在移动互联网高速发展的时代背景下,传统电商系统面临着移动端适配不足、交互体验割裂的挑战。本项目采用经典的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='用户表'
设计亮点分析:
- 密码安全设计:
user_pw字段长度为55字符,为密码加密算法(如BCrypt)预留了充足空间 - 软删除机制:通过
user_del字段实现逻辑删除,保留用户数据的同时支持账户恢复功能 - 联系方式优化:
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='商品表'
深度优化分析:
- 价格策略设计:同时维护市场价和特价字段,支持灵活的促销策略
- 库存管理:
goods_kucun字段实时跟踪库存变化,防止超卖现象 - 大文本支持:
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技术栈实现了稳定可靠的电商业务流程,在数据库设计、业务逻辑处理、用户交互体验等方面都进行了精心优化。系统架构清晰,代码可维护性强,为中小型企业快速部署移动电商业务提供了完整的技术解决方案。未来通过引入缓存、微服务等