基于SSH框架的体育用品在线商城系统 - 源码深度解析

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

文章摘要

本项目是一款基于SSH(Struts2 + Spring + Hibernate)框架构建的体育用品在线商城系统,旨在为体育爱好者提供便捷、稳定的一站式购物体验。系统核心解决了传统体育用品零售渠道单一、信息不透明、选购效率低等痛点,通过线上集中展示商品、支持多条件筛选与搜索、集成购物车与订单管理,有...

在现代电子商务快速发展的背景下,体育用品行业面临着数字化转型的重要机遇。传统零售模式存在渠道单一、信息不透明、选购效率低等痛点,亟需通过技术手段实现业务创新。本文将深入分析一个采用SSH框架构建的企业级体育电商平台,从技术架构、数据库设计到核心功能实现进行全面剖析。

系统架构与技术栈

该平台采用经典的三层架构设计,前端展示层使用JSP动态页面技术,结合HTML、CSS和JavaScript实现丰富的用户交互体验。业务逻辑层基于Spring框架进行组织,通过依赖注入管理各个业务组件,利用AOP机制实现事务管理、日志记录等横切关注点。数据持久层采用Hibernate ORM框架,将Java对象与关系数据库进行映射,简化数据访问操作。

Struts2作为MVC框架负责请求分发和控制流转,其配置文件struts.xml中定义了完整的Action映射关系:

<struts>
    <package name="default" extends="struts-default">
        <action name="goods_*" method="{1}" class="goodsAction">
            <result name="success">/goods_{1}.jsp</result>
        </action>
        <action name="order_*" method="{1}" class="orderAction">
            <result name="success">/order_{1}.jsp</result>
        </action>
    </package>
</struts>

Spring的配置文件中定义了数据源、事务管理器以及各个Bean的依赖关系:

<beans>
    <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/sports_mall"/>
        <property name="user" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
                <value>Goods.hbm.xml</value>
                <value>Order.hbm.xml</value>
            </list>
        </property>
    </bean>
</beans>

数据库设计亮点分析

商品表设计优化

t_goods表的设计体现了电商系统的核心需求。goods_id作为主键采用自增策略,确保商品唯一标识。goods_shichangjia字段使用INT类型存储价格,避免了浮点数精度问题。特别值得注意的是goods_isnottejia和goods_isnottuijian字段采用字符串标识特价和推荐状态,这种设计便于扩展多种商品状态。

CREATE TABLE `t_goods` (
  `goods_id` int(11) NOT NULL DEFAULT 0 COMMENT '商品ID',
  `goods_name` longtext DEFAULT NULL COMMENT '商品名称',
  `goods_miaoshu` longtext DEFAULT NULL COMMENT '商品描述',
  `goods_pic` longtext DEFAULT NULL COMMENT '商品图片',
  `goods_yanse` longtext DEFAULT NULL COMMENT '商品颜色',
  `goods_shichangjia` int(11) DEFAULT NULL COMMENT '商品市场价',
  `goods_isnottejia` longtext DEFAULT NULL COMMENT '是否特价',
  `goods_isnottuijian` longtext DEFAULT NULL COMMENT '是否推荐',
  `goods_catelog_id` int(11) DEFAULT NULL COMMENT '商品分类ID',
  `goods_del` longtext DEFAULT NULL COMMENT '删除标记',
  `goods_dianji` int(11) DEFAULT NULL COMMENT '点击量',
  `goods_kucun` int(11) DEFAULT NULL COMMENT '库存数量',
  PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='商品表'

订单业务表关系设计

订单模块采用主从表结构设计,t_order表存储订单基本信息,t_orderitem表记录订单明细。这种设计符合数据库范式要求,有效减少了数据冗余。order_jine字段在订单表中存储总金额,避免了每次查询时都需要关联计算。

CREATE TABLE `t_order` (
  `order_id` int(11) NOT NULL DEFAULT 0 COMMENT '订单ID',
  `order_bianhao` varchar(300) DEFAULT '' COMMENT '订单编号',
  `order_date` varchar(300) DEFAULT '' COMMENT '订单日期',
  `order_zhuangtai` varchar(600) DEFAULT '' COMMENT '订单状态',
  `order_jine` int(11) DEFAULT NULL COMMENT '订单金额',
  `order_songhuodizhi` varchar(300) DEFAULT '' COMMENT '送货地址',
  `order_fukuangfangshi` varchar(300) DEFAULT '' COMMENT '付款方式',
  `order_user_id` int(11) DEFAULT NULL COMMENT '用户ID',
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='订单表'

订单管理界面

核心功能实现深度解析

商品管理与展示模块

商品管理模块采用DAO模式实现数据持久化操作。GoodsDAO接口定义了商品数据访问的基本方法:

public interface GoodsDAO {
    void save(Goods goods);
    void delete(Integer goodsId);
    void update(Goods goods);
    Goods findById(Integer goodsId);
    List<Goods> findAll();
    List<Goods> findByCatalog(Integer catalogId);
    List<Goods> findHotGoods(Integer limit);
}

GoodsService业务层实现了商品的核心逻辑,包括库存检查、价格计算等业务规则:

@Service
public class GoodsService {
    @Autowired
    private GoodsDAO goodsDAO;
    
    public List<Goods> getGoodsByCondition(String keyword, Integer catalogId, 
                                         Integer minPrice, Integer maxPrice) {
        StringBuilder hql = new StringBuilder("from Goods where 1=1");
        Map<String, Object> params = new HashMap<>();
        
        if (keyword != null && !keyword.trim().isEmpty()) {
            hql.append(" and goodsName like :keyword");
            params.put("keyword", "%" + keyword + "%");
        }
        
        if (catalogId != null) {
            hql.append(" and goodsCatelogId = :catalogId");
            params.put("catalogId", catalogId);
        }
        
        if (minPrice != null) {
            hql.append(" and goodsShichangjia >= :minPrice");
            params.put("minPrice", minPrice);
        }
        
        if (maxPrice != null) {
            hql.append(" and goodsShichangjia <= :maxPrice");
            params.put("maxPrice", maxPrice);
        }
        
        return goodsDAO.findByHQL(hql.toString(), params);
    }
}

商品详情页面

购物车与订单处理系统

购物车功能采用Session存储临时数据,OrderAction负责处理订单创建流程:

public class OrderAction extends ActionSupport {
    private Order order;
    private List<OrderItem> orderItems;
    
    public String createOrder() {
        // 验证用户登录状态
        User user = (User) session.get("user");
        if (user == null) {
            return "login";
        }
        
        // 计算订单总金额
        Integer totalAmount = 0;
        for (OrderItem item : orderItems) {
            Goods goods = goodsService.findById(item.getGoodsId());
            totalAmount += goods.getGoodsShichangjia() * item.getGoodsQuantity();
            
            // 库存检查
            if (goods.getGoodsKucun() < item.getGoodsQuantity()) {
                addActionError("商品库存不足: " + goods.getGoodsName());
                return "error";
            }
        }
        
        order.setOrderJine(totalAmount);
        order.setOrderUserId(user.getUserId());
        order.setOrderDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        
        // 生成订单编号
        order.setOrderBianhao("DD" + System.currentTimeMillis());
        
        orderService.saveOrder(order, orderItems);
        return "success";
    }
}

订单明细处理采用批量插入优化性能:

@Repository
public class OrderItemDAOImpl implements OrderItemDAO {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    
    @Transactional
    public void batchSave(List<OrderItem> orderItems) {
        for (int i = 0; i < orderItems.size(); i++) {
            hibernateTemplate.save(orderItems.get(i));
            if (i % 20 == 0) {
                hibernateTemplate.flush();
                hibernateTemplate.clear();
            }
        }
    }
}

购物车功能

用户管理与权限控制

用户表设计采用扩展字段策略,user_one1到user_one12等备用字段为系统功能扩展提供了灵活性。用户服务层实现完整的身份验证逻辑:

@Service
public class UserService {
    @Autowired
    private UserDAO userDAO;
    
    public User login(String username, String password) {
        String hql = "from User where userName = ? and userPw = ?";
        List<User> users = userDAO.findByHQL(hql, username, MD5Util.encode(password));
        
        if (users != null && users.size() > 0) {
            User user = users.get(0);
            updateLoginInfo(user); // 更新登录信息
            return user;
        }
        return null;
    }
    
    public boolean register(User user) {
        // 用户名唯一性验证
        if (userDAO.findByUsername(user.getUserName()) != null) {
            throw new BusinessException("用户名已存在");
        }
        
        // 密码加密存储
        user.setUserPw(MD5Util.encode(user.getUserPw()));
        user.setUserType(1); // 普通用户
        
        return userDAO.save(user);
    }
}

权限控制通过拦截器实现:

public class AuthInterceptor implements Interceptor {
    public String intercept(ActionInvocation invocation) throws Exception {
        Map<String, Object> session = invocation.getInvocationContext().getSession();
        User user = (User) session.get("user");
        
        if (user == null) {
            return "login";
        }
        
        // 管理员权限验证
        String actionName = invocation.getProxy().getActionName();
        if (actionName.startsWith("admin_") && user.getUserType() != 0) {
            throw new AuthorizationException("无权限访问");
        }
        
        return invocation.invoke();
    }
}

用户登录界面

实体模型设计

Hibernate映射文件精确定义了对象关系映射规则。商品实体映射配置展示了如何将Java对象与数据库表进行关联:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.sportsmall.entity.Goods" table="t_goods">
        <id name="goodsId" column="goods_id" type="integer">
            <generator class="identity"/>
        </id>
        
        <property name="goodsName" column="goods_name" type="string" length="300"/>
        <property name="goodsMiaoshu" column="goods_miaoshu" type="text"/>
        <property name="goodsPic" column="goods_pic" type="text"/>
        <property name="goodsYanse" column="goods_yanse" type="string" length="100"/>
        <property name="goodsShichangjia" column="goods_shichangjia" type="integer"/>
        <property name="goodsIsnottejia" column="goods_isnottejia" type="string" length="10"/>
        <property name="goodsIsnottuijian" column="goods_isnottuijian" type="string" length="10"/>
        <property name="goodsCatelogId" column="goods_catelog_id" type="integer"/>
        <property name="goodsDel" column="goods_del" type="string" length="10"/>
        <property name="goodsDianji" column="goods_dianji" type="integer"/>
        <property name="goodsKucun" column="goods_kucun" type="integer"/>
    </class>
</hibernate-mapping>

订单与订单明细的一对多关系通过Hibernate关联映射实现:

@Entity
@Table(name = "t_order")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer orderId;
    
    private String orderBianhao;
    private String orderDate;
    private String orderZhuangtai;
    private Integer orderJine;
    private String orderSonghuodizhi;
    private String orderFukuangfangshi;
    private Integer orderUserId;
    
    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private Set<OrderItem> orderItems = new HashSet<>();
    
    // getter和setter方法
}

功能展望与优化方向

性能优化方案

  1. 引入Redis缓存层:将热门商品信息、用户会话数据等高频访问数据缓存至Redis,显著提升系统响应速度。实现商品详情缓存示例:
@Service
public class GoodsServiceWithCache {
    @Autowired
    private RedisTemplate<String, Goods> redisTemplate;
    
    public Goods getGoodsWithCache(Integer goodsId) {
        String cacheKey = "goods:" + goodsId;
        Goods goods = redisTemplate.opsForValue().get(cacheKey);
        
        if (goods == null) {
            goods = goodsDAO.findById(goodsId);
            if (goods != null) {
                redisTemplate.opsForValue().set(cacheKey, goods, 30, TimeUnit.MINUTES);
            }
        }
        return goods;
    }
}
  1. 数据库读写分离:配置MySQL主从复制,将读操作分发到从库,写操作集中到主库,提升系统并发处理能力。

架构升级建议

  1. 微服务化改造:将单体应用拆分为商品服务、订单服务、用户服务等独立微服务,采用Spring Cloud框架实现服务治理:
# application.yml 微服务配置示例
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        
server:
  port: 8081

feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000
  1. 消息队列集成:使用RabbitMQ处理异步任务,如订单创建后的库存扣减、邮件通知等:
@Component
public class OrderMessageProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendOrderCreatedMessage(Order order) {
        OrderMessage message = new OrderMessage(order.getOrderId(), 
                                              order.getOrderBianhao(), 
                                              System.currentTimeMillis());
        rabbitTemplate.convertAndSend("order.exchange", 
                                   "order.created", 
                                   message);
    }
}

功能扩展规划

  1. 智能推荐系统:基于用户行为数据构建商品推荐引擎,采用协同过滤算法实现个性化推荐:
@Service
public class RecommendationService {
    public List<Goods> getPersonalizedRecommendations(Integer userId) {
        // 基于用户历史行为计算相似度
        List<UserBehavior> behaviors = userBehaviorDAO.findByUserId(userId);
        Map<Integer, Double> itemScores = new HashMap<>();
        
        for (UserBehavior behavior : behaviors) {
            List<SimilarItem> similarItems = similarityDAO.findSimilarItems(behavior.getGoodsId());
            for (SimilarItem similar : similarItems) {
                double score = itemScores.getOrDefault(similar.getSimilarGoodsId(), 0.0);
                score += behavior.getWeight() * similar.getSimilarity();
                itemScores.put(similar.getSimilarGoodsId(), score);
            }
        }
        
        return sortAndFilterRecommendations(itemScores);
    }
}

销售数据分析

该体育电商平台通过SSH框架的有机整合,构建了稳定可靠的电商基础设施。分层架构设计确保了系统的可维护性和扩展性,而精细的数据库设计为业务发展奠定了坚实基础。未来通过引入缓存、微服务、消息队列等现代技术手段,可以进一步提升系统性能和用户体验,为体育用品行业的数字化转型提供有力支撑。

本文关键词
SSH框架体育用品在线商城电商平台源码解析

上下篇

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