基于SSH框架的宠物商城管理系统 - 源码深度解析

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

文章摘要

本系统是基于SSH(Struts2 + Spring + Hibernate)集成框架开发的宠物商城综合管理平台,旨在为中小型宠物店或线上宠物销售商提供一体化的商品管理与在线交易解决方案。其核心业务价值在于通过信息化手段解决了传统宠物用品销售中商品信息混乱、库存更新不及时、线上线下业务割裂等核心痛点...

在传统宠物用品销售行业中,商家常常面临商品信息管理混乱、库存更新不及时、线上线下业务割裂等痛点。针对这些问题,我们设计并实现了一套基于SSH集成框架的宠物电商综合管理平台,通过信息化手段实现了从宠物信息维护、商品上架到订单处理的全流程数字化管理。

系统架构与技术栈

该平台采用经典的三层MVC架构,技术选型上使用成熟的SSH(Struts2 + Spring + Hibernate)框架组合。表现层基于Struts2框架,通过Action类接收前端请求并调用业务逻辑,利用Struts2的拦截器机制实现权限校验与数据验证。业务层由Spring框架的IoC容器统一管理Service组件,通过声明式事务管理确保核心业务操作的数据一致性。数据持久化层基于Hibernate实现,通过对象关系映射将业务实体与数据库表关联,利用HQL面向对象查询语言简化复杂数据操作。

<!-- Spring配置示例 -->
<bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.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>
        </props>
    </property>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

数据库设计亮点分析

商品表(shangpin)的精细化设计

商品表的设计体现了电商系统对商品属性的全面考量。除基本字段外,还包含了hot(热门标识)、tuijian(推荐标识)、zuixin(新品标识)等营销标签字段,便于前端实现个性化商品展示。价格字段采用double类型存储,同时设置hyjia(会员价)和dazhe(折扣)字段支持灵活的定价策略。

CREATE TABLE `shangpin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dazhe` int(11) NOT NULL COMMENT '打折',
  `hot` int(11) NOT NULL COMMENT '热门',
  `hyjia` int(11) NOT NULL COMMENT '会员价',
  `jiage` double DEFAULT NULL COMMENT '价格',
  `jieshao` text DEFAULT NULL COMMENT '介绍',
  `name` varchar(2000) DEFAULT NULL COMMENT '名称',
  `pubren` varchar(255) DEFAULT NULL COMMENT '发布人',
  `pubtime` datetime DEFAULT NULL COMMENT '发布时间',
  `spno` varchar(255) DEFAULT NULL COMMENT '商品编号',
  `sptype` varchar(255) DEFAULT NULL COMMENT '商品类型',
  `sptypeid` int(11) NOT NULL COMMENT '商品类型ID',
  `tuijian` int(11) NOT NULL COMMENT '推荐',
  `tupian` varchar(255) DEFAULT NULL COMMENT '图片',
  `zuixin` int(11) NOT NULL COMMENT '最新',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=gb2312 COLLATE=gb2312_chinese_ci COMMENT='商品表'

订单项表(dingdanitems)的分离设计

订单项表采用与主订单表分离的设计,有效解决了订单数据的范式化问题。通过ddno字段与订单主表关联,每个订单项独立记录商品快照信息(spnamespimagejiage等),确保即使商品信息后续发生变化,订单历史数据仍能保持一致性。

CREATE TABLE `dingdanitems` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ddno` varchar(255) DEFAULT NULL COMMENT '订单号',
  `des` varchar(255) DEFAULT NULL COMMENT '描述',
  `jiage` varchar(255) DEFAULT NULL COMMENT '价格',
  `shuliang` int(11) NOT NULL COMMENT '数量',
  `spid` int(11) NOT NULL COMMENT '商品ID',
  `spimage` varchar(255) DEFAULT NULL COMMENT '商品图片',
  `spname` varchar(255) DEFAULT NULL COMMENT '商品名称',
  `spno` varchar(255) DEFAULT NULL COMMENT '商品编号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=gb2312 COLLATE=gb2312_chinese_ci COMMENT='订单项表'

信息表(xinxi)的内容管理优化

信息表设计支持内容管理系统的核心功能,包含clickcount(点击量)、agreecount(赞同数)、againstcount(反对数)等互动指标,以及tuijian(推荐)、hot(热门)、zuixin(最新)等内容权重标识。lanmuidlanmuming字段支持多级栏目分类,满足复杂的内容组织需求。

核心功能实现

商品管理模块

商品管理模块为管理员提供完整的商品生命周期管理功能。通过Struts2的Action类处理商品CRUD操作,Hibernate实现数据持久化,Spring管理事务一致性。

商品发布界面

/**
 * 商品管理Action类
 */
public class ShangpinAction extends ActionSupport {
    private Shangpin shangpin;
    private List<Shangpin> shangpinList;
    private ShangpinService shangpinService;
    
    // 商品添加方法
    public String add() {
        try {
            shangpin.setPubtime(new Date());
            shangpinService.save(shangpin);
            this.addActionMessage("商品添加成功!");
            return SUCCESS;
        } catch (Exception e) {
            this.addActionError("商品添加失败:" + e.getMessage());
            return ERROR;
        }
    }
    
    // 商品列表查询
    public String list() {
        shangpinList = shangpinService.findAll();
        return SUCCESS;
    }
    
    // 热门商品查询
    public String findHot() {
        shangpinList = shangpinService.findByHot(1);
        return SUCCESS;
    }
}

商品服务层采用接口与实现分离的设计,便于单元测试和功能扩展:

/**
 * 商品服务接口
 */
public interface ShangpinService {
    void save(Shangpin shangpin);
    void update(Shangpin shangpin);
    void delete(Integer id);
    Shangpin findById(Integer id);
    List<Shangpin> findAll();
    List<Shangpin> findByHot(Integer hot);
    List<Shangpin> findByTuijian(Integer tuijian);
}

/**
 * 商品服务实现类
 */
@Service("shangpinService")
@Transactional
public class ShangpinServiceImpl implements ShangpinService {
    
    @Autowired
    private ShangpinDao shangpinDao;
    
    @Override
    @Transactional(readOnly = true)
    public List<Shangpin> findByHot(Integer hot) {
        return shangpinDao.findByHot(hot);
    }
    
    @Override
    public void save(Shangpin shangpin) {
        shangpinDao.save(shangpin);
    }
}

订单处理系统

订单处理模块实现完整的购物车到订单生成的业务流程。采用Hibernate的事务管理确保库存扣减和订单创建的原子性操作。

订单管理系统

/**
 * 订单业务逻辑实现
 */
@Service("dingdanService")
@Transactional
public class DingdanServiceImpl implements DingdanService {
    
    @Autowired
    private DingdanDao dingdanDao;
    
    @Autowired
    private ShangpinDao shangpinDao;
    
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void createDingdan(Dingdan dingdan, List<DingdanItems> items) {
        // 保存主订单
        dingdanDao.save(dingdan);
        
        // 保存订单项并更新库存
        for (DingdanItems item : items) {
            item.setDdno(dingdan.getDdno());
            dingdanDao.saveItem(item);
            
            // 更新商品库存
            Shangpin sp = shangpinDao.findById(item.getSpid());
            if (sp.getKucun() < item.getShuliang()) {
                throw new RuntimeException("库存不足");
            }
            sp.setKucun(sp.getKucun() - item.getShuliang());
            shangpinDao.update(sp);
        }
    }
}

用户权限管理

基于RBAC(基于角色的访问控制)模型实现权限管理系统,通过Acl实体类定义模块访问权限。

@Entity
public class Acl {
    @GenericGenerator(name = "generator", strategy = "increment")
    @Id
    @GeneratedValue(generator = "generator")
    private int id;
    private int moduleid;
    private String rolename;
    private String modulename;
    private String acl;
    private String des;
    
    // getter和setter方法
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public int getModuleid() {
        return moduleid;
    }
    
    public void setModuleid(int moduleid) {
        this.moduleid = moduleid;
    }
    
    // 其他getter/setter...
}

权限拦截器通过Struts2的拦截器机制实现:

/**
 * 权限验证拦截器
 */
public class PermissionInterceptor extends AbstractInterceptor {
    
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context = invocation.getInvocationContext();
        HttpSession session = context.getSession();
        User user = (User) session.getAttribute("currentUser");
        
        if (user == null) {
            return "login";
        }
        
        // 检查用户对当前模块的访问权限
        String namespace = invocation.getProxy().getNamespace();
        String actionName = invocation.getProxy().getActionName();
        
        if (!hasPermission(user, namespace, actionName)) {
            return "noPermission";
        }
        
        return invocation.invoke();
    }
    
    private boolean hasPermission(User user, String namespace, String actionName) {
        // 实现具体的权限验证逻辑
        return true;
    }
}

前台商城功能

前台商城为消费者提供商品浏览、搜索、加入购物车和下单功能。通过JSP页面展示商品信息,JavaScript实现交互效果。

商城首页

<!-- 商品列表展示JSP页面 -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<div class="product-list">
    <s:iterator value="shangpinList" var="sp">
        <div class="product-item">
            <div class="product-image">
                <img src="<s:property value="#sp.tupian"/>" alt="<s:property value="#sp.name"/>">
            </div>
            <div class="product-info">
                <h3><s:property value="#sp.name"/></h3>
                <p class="price">¥<s:property value="#sp.jiage"/></p>
                <s:if test="#sp.hyjia > 0">
                    <p class="member-price">会员价:¥<s:property value="#sp.hyjia"/></p>
                </s:if>
                <button onclick="addToCart(<s:property value="#sp.id"/>)">加入购物车</button>
            </div>
        </div>
    </s:iterator>
</div>

<script>
function addToCart(productId) {
    $.ajax({
        url: 'cart_add.action',
        type: 'post',
        data: {spid: productId, shuliang: 1},
        success: function(result) {
            alert('添加成功!');
            updateCartCount();
        }
    });
}
</script>

实体模型设计

系统采用面向对象的实体设计,通过Hibernate注解实现对象关系映射。每个实体类对应数据库中的一张表,通过JPA注解定义主键生成策略和字段映射。

/**
 * 商品实体类
 */
@Entity
@Table(name = "shangpin")
public class Shangpin {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    
    @Column(name = "name", length = 2000)
    private String name;
    
    @Column(name = "spno")
    private String spno;
    
    @Column(name = "jiage")
    private Double jiage;
    
    @Column(name = "hyjia")
    private Integer hyjia;
    
    @Column(name = "dazhe")
    private Integer dazhe;
    
    @Column(name = "sptype")
    private String sptype;
    
    @Column(name = "sptypeid")
    private Integer sptypeid;
    
    @Column(name = "jieshao", columnDefinition = "text")
    private String jieshao;
    
    @Column(name = "tupian")
    private String tupian;
    
    @Column(name = "hot")
    private Integer hot;
    
    @Column(name = "tuijian")
    private Integer tuijian;
    
    @Column(name = "zuixin")
    private Integer zuixin;
    
    @Column(name = "pubren")
    private String pubren;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "pubtime")
    private Date pubtime;
    
    // getter和setter方法
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id = id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    // 其他getter/setter...
}

功能展望与优化方向

1. 引入Redis缓存提升性能

当前系统在高并发场景下可能存在数据库访问瓶颈。可以引入Redis作为缓存层,将热门商品信息、用户会话数据等高频访问数据缓存到内存中。

/**
 * 商品服务缓存增强实现
 */
@Service
public class CachedShangpinService implements ShangpinService {
    
    @Autowired
    private ShangpinService delegate;
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    private static final String PRODUCT_KEY_PREFIX = "product:";
    private static final String HOT_PRODUCTS_KEY = "products:hot";
    
    @Override
    public List<Shangpin> findByHot(Integer hot) {
        // 先从缓存获取
        List<Shangpin> cached = (List<Shangpin>) redisTemplate.opsForValue().get(HOT_PRODUCTS_KEY);
        if (cached != null) {
            return cached;
        }
        
        // 缓存未命中,查询数据库
        List<Shangpin> result = delegate.findByHot(hot);
        // 设置缓存,过期时间30分钟
        redisTemplate.opsForValue().set(HOT_PRODUCTS_KEY, result, 30, TimeUnit.MINUTES);
        return result;
    }
}

2. 消息队列实现异步处理

订单创建、库存更新等核心业务可以引入消息队列实现异步处理,提升系统吞吐量和响应速度。

/**
 * 异步订单处理服务
 */
@Service
public class AsyncOrderService {
    
    @Autowired
    private JmsTemplate jmsTemplate;
    
    public void createOrderAsync(Dingdan dingdan, List<DingdanItems> items) {
        // 发送订单消息到队列
        Map<String, Object> orderMessage = new HashMap<>();
        orderMessage.put("dingdan", dingdan);
        orderMessage.put("items", items);
        
        jmsTemplate.convertAndSend("order.create.queue", orderMessage);
    }
    
    @JmsListener(destination = "order.create.queue")
    public void processOrderMessage(Map<String, Object> message) {
        Dingdan dingdan = (Dingdan) message.get("dingdan");
        List<DingdanItems> items = (List<DingdanItems>) message.get("items");
        
        // 异步处理订单创建逻辑
        dingdanService.createDingdan(dingdan, items);
    }
}

3. 微服务架构改造

随着业务规模扩大,可以考虑将单体应用拆分为微服务架构,如商品服务、订单服务、用户服务等独立部署。

# 商品服务配置示例
spring:
  application:
    name: product-service
  datasource:
    url: jdbc:mysql://localhost:3306/petmall_product
    username: root
    password: 123456
    
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

4. 移动端适配与PWA支持

开发响应式前端界面,支持PWA(渐进式Web应用)特性,提升移动端用户体验。

5. 智能推荐系统集成

基于用户行为数据构建商品推荐引擎,实现个性化商品推荐功能。

该宠物电商平台通过SSH框架的有机整合,构建了稳定可靠的企业级应用系统。清晰的架构分层、完善的数据库设计和丰富的功能模块为后续的技术升级和业务扩展奠定了坚实基础。随着技术的不断发展,平台有望通过引入新的技术栈和架构模式,持续提升系统性能和用户体验。

本文关键词
SSH框架宠物商城管理系统源码解析数据库设计电商系统

上下篇

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