基于SSH框架的在线服装商城系统 - 源码深度解析

SSH框架JavaJavaScriptHTMLCSSMySQLJSP+Servlet
2026-02-103 浏览

文章摘要

本项目基于经典的SSH(Struts2 + Spring + Hibernate)框架技术栈,构建了一个功能完备的在线服装商城系统。其核心业务价值在于为中小型服装零售商提供了一个稳定、可维护的线上销售与管理一体化解决方案,有效解决了传统实体门店在商品展示、库存同步和跨地域销售方面的局限性。系统通过整...

在数字化浪潮席卷零售业的今天,传统服装门店面临着展示空间有限、库存同步困难、销售地域受限等多重挑战。一个稳定、高效且易于维护的在线销售平台,成为中小型服装零售商突破发展瓶颈的关键。本系统正是针对这一市场需求,采用经典的SSH技术栈,构建了一个集商品展示、在线交易、后台管理于一体的综合性服装电商解决方案。

系统采用典型的分层架构设计,确保了代码的高内聚、低耦合特性。表现层由Struts2框架负责,其强大的拦截器机制和OGNL表达式语言,为请求处理和数据流转提供了坚实基础。业务逻辑层依托Spring框架的IoC容器进行组件管理,通过依赖注入实现各Service组件间的解耦,并结合声明式事务管理保障核心业务的数据一致性。数据持久层则采用Hibernate实现对象关系映射,显著简化了数据库操作复杂度,其缓存机制和延迟加载特性进一步优化了系统性能。

数据库设计亮点

在数据库设计层面,系统采用了规范化的关系模型,围绕核心业务实体建立了清晰的数据关系。其中几个关键表的设计尤为值得深入探讨。

商品表(product)的设计体现了电商系统的核心要素:

CREATE TABLE `product` (
  `pid` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品ID',
  `pname` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `market_price` double DEFAULT NULL COMMENT '市场价',
  `shop_price` double DEFAULT NULL COMMENT '商城价',
  `image` varchar(255) DEFAULT NULL COMMENT '商品图片',
  `pdesc` varchar(255) DEFAULT NULL COMMENT '商品描述',
  `is_hot` int(11) DEFAULT NULL COMMENT '是否热销',
  `pdate` datetime DEFAULT NULL COMMENT '上架时间',
  `csid` int(11) DEFAULT NULL COMMENT '二级分类ID',
  PRIMARY KEY (`pid`),
  KEY `FKED8DCCEFB9B74E02` (`csid`),
  CONSTRAINT `FKED8DCCEFB9B74E02` FOREIGN KEY (`csid`) 
  REFERENCES `categorysecond` (`csid`)
) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8;

该表设计巧妙之处在于:通过market_priceshop_price双价格字段支持营销策略展示;is_hot标志位便于实现热销商品推荐功能;pdate上架时间字段为新品展示提供了数据支持;外键csid关联二级分类表,实现了商品的多级分类管理。InnoDB存储引擎的选择保障了事务安全性,自增主键优化了插入性能。

订单项表(orderitem)的设计展现了复杂业务关系的处理能力:

CREATE TABLE `orderitem` (
  `itemid` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单项ID',
  `count` int(11) DEFAULT NULL COMMENT '商品数量',
  `subtotal` double DEFAULT NULL COMMENT '小计金额',
  `pid` int(11) DEFAULT NULL COMMENT '商品ID',
  `oid` int(11) DEFAULT NULL COMMENT '订单ID',
  `uid` int(11) DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`itemid`),
  KEY `FKE8B2AB6166C01961` (`oid`),
  KEY `FKE8B2AB6171DB7AE4` (`pid`),
  CONSTRAINT `FKE8B2AB6171DB7AE4` FOREIGN KEY (`pid`) 
  REFERENCES `product` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8;

该表作为订单与商品之间的关联表,通过countsubtotal字段准确记录每个商品的购买数量和金额小计。多外键设计(pidoid)确保了数据的引用完整性,而独立的itemid主键为订单项管理提供了灵活性。这种设计支持一个订单包含多个商品项的典型电商场景。

核心功能实现

商品管理模块

商品管理作为系统的核心功能,提供了完整的CRUD操作。后台管理界面采用清晰的表格布局,支持按分类、关键词等多条件查询。

商品管理界面

对应的Struts2 Action负责处理商品相关的业务请求:

public class ProductAction extends ActionSupport implements ModelDriven<Product> {
    private Product product = new Product();
    private Integer pid;
    private ProductService productService;
    
    // 商品列表查询
    public String findAll() {
        PageBean<Product> pageBean = productService.findByPage(page);
        ValueStack.setValue("pageBean", pageBean);
        return "findAll";
    }
    
    // 商品添加功能
    public String save() {
        product.setPdate(new Date());
        productService.save(product);
        return "saveSuccess";
    }
    
    // 商品编辑功能
    public String edit() {
        product = productService.findByPid(pid);
        return "editSuccess";
    }
    
    // 商品更新功能
    public String update() {
        productService.update(product);
        return "updateSuccess";
    }
    
    @Override
    public Product getModel() {
        return product;
    }
    
    // Getter和Setter方法
    public void setProductService(ProductService productService) {
        this.productService = productService;
    }
}

Spring服务层通过注解方式管理事务和依赖注入:

@Service("productService")
@Transactional
public class ProductServiceImpl implements ProductService {
    
    @Autowired
    private ProductDao productDao;
    
    @Override
    @Transactional(readOnly = true)
    public PageBean<Product> findByPage(Integer page) {
        PageBean<Product> pageBean = new PageBean<>();
        pageBean.setPage(page);
        int limit = 10;
        pageBean.setLimit(limit);
        int totalCount = productDao.findCount();
        pageBean.setTotalCount(totalCount);
        int totalPage = (int) Math.ceil(totalCount / (double) limit);
        pageBean.setTotalPage(totalPage);
        int begin = (page - 1) * limit;
        List<Product> list = productDao.findByPage(begin, limit);
        pageBean.setList(list);
        return pageBean;
    }
    
    @Override
    public void save(Product product) {
        productDao.save(product);
    }
}

Hibernate数据访问层实现对象持久化操作:

@Repository("productDao")
public class ProductDaoImpl extends HibernateDaoSupport implements ProductDao {
    
    @Autowired
    public void setSessionFactory0(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }
    
    @Override
    public int findCount() {
        String hql = "select count(*) from Product";
        List<Long> list = (List<Long>) this.getHibernateTemplate().find(hql);
        if (list != null && list.size() > 0) {
            return list.get(0).intValue();
        }
        return 0;
    }
    
    @Override
    public List<Product> findByPage(int begin, int limit) {
        String hql = "from Product order by pdate desc";
        List<Product> list = this.getHibernateTemplate().execute(new HibernateCallback<List<Product>>() {
            @Override
            public List<Product> doInHibernate(Session session) throws HibernateException {
                Query query = session.createQuery(hql);
                query.setFirstResult(begin);
                query.setMaxResults(limit);
                return query.list();
            }
        });
        return list;
    }
}

购物车与订单处理

购物车功能采用Session存储方式,为用户提供临时的商品存储空间。订单生成过程涉及复杂的业务逻辑和事务控制。

添加到购物车

购物车核心业务逻辑实现:

public class Cart {
    // 购物项集合:key:商品pid, value:购物项
    private Map<Integer, CartItem> map = new HashMap<>();
    private double total; // 购物总金额
    
    // 添加购物车项
    public void addCart(CartItem cartItem) {
        Integer pid = cartItem.getProduct().getPid();
        if (map.containsKey(pid)) {
            CartItem existingItem = map.get(pid);
            existingItem.setCount(existingItem.getCount() + cartItem.getCount());
        } else {
            map.put(pid, cartItem);
        }
        total += cartItem.getSubtotal();
    }
    
    // 移除购物车项
    public void removeCart(Integer pid) {
        CartItem cartItem = map.remove(pid);
        total -= cartItem.getSubtotal();
    }
    
    // 清空购物车
    public void clearCart() {
        map.clear();
        total = 0;
    }
}

订单提交过程涉及多表操作,需要严格的事务管理:

@Service("orderService")
@Transactional
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderDao orderDao;
    
    @Autowired
    private ProductDao productDao;
    
    @Override
    public void save(Order order) {
        // 1. 保存订单基本信息
        order.setOrdertime(new Date());
        order.setState(1); // 1:未付款 2:已付款 3:已发货 4:已完成
        order.setTotal(order.getTotal());
        orderDao.save(order);
        
        // 2. 保存订单项并更新商品库存
        for (OrderItem orderItem : order.getOrderItems()) {
            orderItem.setOrder(order);
            orderDao.saveItem(orderItem);
            
            // 更新商品库存(实际项目中应有库存字段)
            Product product = orderItem.getProduct();
            // 这里简化处理,实际需要检查库存是否充足
            productDao.update(product);
        }
    }
}

用户权限管理

系统采用基于角色的访问控制,区分前台用户和后台管理员的不同权限。

用户登录界面

用户认证拦截器确保权限控制:

public class PrivilegeInterceptor extends MethodFilterInterceptor {
    
    @Override
    protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
        AdminUser adminUser = (AdminUser) ServletActionContext.getRequest()
                .getSession().getAttribute("existAdminUser");
        if (adminUser == null) {
            ActionSupport actionSupport = (ActionSupport) actionInvocation.getAction();
            actionSupport.addActionError("您还没有登录!没有权限访问!");
            return "loginFail";
        }
        return actionInvocation.invoke();
    }
}

实体模型设计

系统采用面向对象的领域模型设计,通过Hibernate映射将Java实体类与数据库表结构对应。以商品实体为例:

@Entity
@Table(name = "product")
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "pid")
    private Integer pid;
    
    @Column(name = "pname")
    private String pname;
    
    @Column(name = "market_price")
    private Double marketPrice;
    
    @Column(name = "shop_price")
    private Double shopPrice;
    
    @Column(name = "image")
    private String image;
    
    @Column(name = "pdesc")
    private String pdesc;
    
    @Column(name = "is_hot")
    private Integer isHot;
    
    @Column(name = "pdate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date pdate;
    
    // 多对一关联:商品属于某个二级分类
    @ManyToOne
    @JoinColumn(name = "csid")
    private CategorySecond categorySecond;
    
    // 一对多关联:商品对应多个订单项
    @OneToMany(mappedBy = "product")
    private Set<OrderItem> orderItems = new HashSet<>();
    
    // 构造函数、getter和setter方法
    public Product() {}
}

订单实体与订单项的一对多关系设计:

@Entity
@Table(name = "orders")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "oid")
    private Integer oid;
    
    @Column(name = "total")
    private Double total;
    
    @Column(name = "ordertime")
    @Temporal(TemporalType.TIMESTAMP)
    private Date ordertime;
    
    @Column(name = "state")
    private Integer state;
    
    @Column(name = "name")
    private String name;
    
    @Column(name = "addr")
    private String addr;
    
    @Column(name = "phone")
    private String phone;
    
    // 多对一关联:订单属于某个用户
    @ManyToOne
    @JoinColumn(name = "uid")
    private User user;
    
    // 一对多关联:订单包含多个订单项
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private Set<OrderItem> orderItems = new HashSet<>();
}

功能展望与优化

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

  1. 引入Redis缓存提升性能

    • 实现思路:将热门商品信息、分类数据等频繁读取但更新不频繁的数据存入Redis,减少数据库查询压力。使用Spring Cache抽象层统一管理缓存策略。
    @Service
    public class ProductService {
        @Cacheable(value = "products", key = "#page + '_' + #size")
        public Page<Product> getHotProducts(int page, int size) {
            // 数据库查询逻辑
        }
    }
    
  2. 增加消息队列处理高并发订单

    • 实现思路:使用RabbitMQ或Kafka处理秒杀场景下的订单创建请求,通过异步处理和流量削峰保障系统稳定性。订单请求先进入队列,再由消费者顺序处理。
  3. 微服务架构改造

    • 实现思路:将单体应用拆分为用户服务、商品服务、订单服务、支付服务等独立微服务。使用Spring Cloud体系实现服务注册发现、配置管理和链路追踪。
  4. 移动端适配与响应式设计

    • 实现思路:采用Bootstrap等前端框架实现响应式布局,或开发独立的移动端APP。RESTful API设计为多端提供统一的数据接口。
  5. 智能推荐功能增强

    • 实现思路:基于用户浏览历史和购买记录,使用协同过滤算法实现个性化商品推荐。集成机器学习框架提升推荐准确度。
  6. 多商户支持与SaaS化改造

    • 实现思路:重构用户体系,支持多个服装品牌商家独立入驻,各自管理商品和订单。实现平台化的电商SaaS解决方案。

总结

该服装电商平台通过SSH框架的有机整合,构建了一个功能完善、性能稳定的在线销售系统。分层架构设计确保了系统的可维护性和扩展性,严谨的数据库设计为业务发展提供了坚实的数据基础。从商品管理到订单处理,从用户权限到前端展示,系统各个环节都体现了成熟的技术方案和良好的工程实践。

随着电商行业的不断发展,系统在缓存优化、并发处理、架构演进等方面仍有提升空间。通过引入现代技术栈和架构理念,可以进一步提升系统的性能表现和业务承载能力,为服装零售商提供更加优质的数字化解决方案。该项目的技术实现为同类电商系统的开发提供了有价值的参考范例。

本文关键词
SSH框架在线服装商城电商系统源码解析数据库设计

上下篇

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