基于SSM框架的在线游戏商城系统 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-03-263 浏览

文章摘要

基于SSM框架的在线游戏商城系统是一款专为数字游戏发行设计的电子商务平台,旨在解决传统游戏购买流程繁琐、库存管理低效及用户服务体验割裂的核心痛点。该系统通过集成游戏展示、在线交易与订单处理等核心模块,为游戏发行商与终端玩家构建了高效、安全的数字化交易通道,显著降低了运营成本并提升了用户购物满意度。系...

在数字游戏产业蓬勃发展的背景下,传统实体销售渠道与早期简单的线上店铺已难以满足快速交付、精准管理和用户体验一体化的市场需求。数字游戏交易平台应运而生,它整合了商品展示、在线支付、订单处理和密钥分发等核心环节,为游戏发行商和玩家构建了一个高效、安全的数字化交易环境。此类平台的核心价值在于显著降低运营成本,提升交易效率,并通过一体化的服务增强用户粘性。

系统采用经典的三层架构模型,前端展示层、后端业务逻辑层与数据持久层分离,确保了系统的可维护性和可扩展性。技术选型上,后端核心基于成熟的SSM框架组合构建。Spring Framework作为轻量级的控制反转容器,负责管理所有业务组件的生命周期和依赖关系,其面向切面编程能力为系统提供了统一的事务管理、安全控制和日志记录功能。Spring MVC模块则承担了Web请求的调度职责,通过DispatcherServlet将用户请求分发给对应的Controller进行处理,实现了模型、视图与控制的清晰分离。数据持久层选用MyBatis,它通过灵活的XML配置或注解方式,将Java对象与数据库表进行映射,其动态SQL特性极大地简化了复杂查询条件的拼接。前端界面采用JSP动态渲染技术,结合jQuery库实现丰富的客户端交互,如异步数据加载、表单验证和动态内容更新。项目依赖管理由Maven负责,数据库则选用关系型数据库MySQL,保证了数据存储的稳定性和一致性。

数据库设计是系统稳健运行的基石,共设计了11张核心数据表来支撑业务流转。其中,game表存储了所有游戏商品的核心信息,其设计体现了对游戏数字商品属性的深度理解。

CREATE TABLE `game` (
  `game_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '游戏ID',
  `title` varchar(200) NOT NULL COMMENT '游戏标题',
  `platform` varchar(50) NOT NULL COMMENT '游戏平台(如PC, PS4, Xbox)',
  `price` decimal(10,2) NOT NULL COMMENT '游戏价格',
  `discount_rate` decimal(3,2) DEFAULT '1.00' COMMENT '折扣率(默认1表示无折扣)',
  `inventory` int(11) NOT NULL COMMENT '库存数量',
  `description` text COMMENT '游戏描述',
  `cover_image_url` varchar(500) DEFAULT NULL COMMENT '封面图URL',
  `release_date` date DEFAULT NULL COMMENT '发售日期',
  `developer` varchar(100) DEFAULT NULL COMMENT '开发商',
  `publisher` varchar(100) DEFAULT NULL COMMENT '发行商',
  `status` tinyint(4) DEFAULT '1' COMMENT '状态(1:上架,0:下架)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`game_id`),
  KEY `idx_platform` (`platform`),
  KEY `idx_status` (`status`),
  KEY `idx_price` (`price`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='游戏商品表';

该表结构设计亮点在于:

  1. 灵活的定价与促销机制price字段与discount_rate字段分离,便于计算折后价和实施复杂的促销策略。discount_rate默认值为1.00,简化了无折扣时的业务逻辑。
  2. 完善的元数据管理:除了基本的价格库存,还包含了platform(平台)、developer(开发商)、release_date(发售日期)等字段,支持多维度的商品筛选和展示。
  3. 状态管理与软删除status字段实现了商品的上架与下架控制,避免了物理删除数据,保证了数据的历史可追溯性。
  4. 自动化时间戳create_timeupdate_time字段由数据库自动维护,精确记录了数据的生命周期。

另一核心表order的设计则确保了交易流程的准确性和完整性。

CREATE TABLE `order` (
  `order_id` varchar(32) NOT NULL COMMENT '订单号(唯一)',
  `user_id` int(11) NOT NULL COMMENT '用户ID',
  `total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额',
  `actual_amount` decimal(10,2) NOT NULL COMMENT '实付金额',
  `order_status` tinyint(4) NOT NULL COMMENT '订单状态(0:待支付,1:已支付,2:已发货,3:已完成,4:已取消)',
  `payment_method` varchar(20) DEFAULT NULL COMMENT '支付方式',
  `payment_time` datetime DEFAULT NULL COMMENT '支付时间',
  `shipping_address` text NOT NULL COMMENT '收货地址(此处为密钥发送地址,如邮箱)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`order_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status` (`order_status`),
  KEY `idx_create_time` (`create_time`),
  CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

该表的关键设计包括:

  1. 订单号生成order_id采用字符串类型而非自增ID,通常由时间戳、随机数等方式生成,更适合分布式环境且能避免信息泄露。
  2. 金额分离total_amount(总金额)和actual_amount(实付金额)分开存储,清晰记录了原价与经过折扣、优惠券等减免后的最终价格,便于对账和数据分析。
  3. 状态流转order_status字段明确定义了订单从生成到完结的全部状态,是订单流程控制的核心。
  4. 外键约束:通过外键fk_order_useruser表关联,保证了数据的一致性和参照完整性。

系统的核心业务逻辑由Java代码实现。以下是商品浏览与搜索功能的Service层实现片段,展示了如何利用MyBatis的动态SQL进行多条件查询。

@Service
public class GameServiceImpl implements GameService {

    @Autowired
    private GameMapper gameMapper;

    @Override
    public PageInfo<Game> getGamesByCondition(String keyword, String platform, BigDecimal minPrice, BigDecimal maxPrice, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        Map<String, Object> params = new HashMap<>();
        if (StringUtils.isNotBlank(keyword)) {
            params.put("keyword", "%" + keyword + "%");
        }
        params.put("platform", platform);
        params.put("minPrice", minPrice);
        params.put("maxPrice", maxPrice);
        // 只查询上架状态的商品
        params.put("status", 1);

        List<Game> gameList = gameMapper.selectByCondition(params);
        return new PageInfo<>(gameList);
    }
}

对应的MyBatis Mapper XML文件中的SQL映射,展示了动态SQL的强大功能。

<!-- GameMapper.xml -->
<select id="selectByCondition" parameterType="map" resultMap="BaseResultMap">
    SELECT * FROM game
    WHERE status = #{status}
    <if test="keyword != null and keyword != ''">
        AND (title LIKE #{keyword} OR description LIKE #{keyword})
    </if>
    <if test="platform != null and platform != ''">
        AND platform = #{platform}
    </if>
    <if test="minPrice != null">
        AND price >= #{minPrice}
    </if>
    <if test="maxPrice != null">
        AND price &lt;= #{maxPrice}
    </if>
    ORDER BY create_time DESC
</select>

购物车和订单生成是交易流程的核心。以下是向购物车添加商品的Controller层代码。

@Controller
@RequestMapping("/cart")
public class CartController {

    @Autowired
    private CartService cartService;

    @PostMapping("/add")
    @ResponseBody
    public ResponseEntity<Map<String, Object>> addToCart(@RequestParam Integer gameId,
                                                         HttpSession session) {
        Map<String, Object> result = new HashMap<>();
        try {
            User currentUser = (User) session.getAttribute("currentUser");
            if (currentUser == null) {
                result.put("success", false);
                result.put("message", "请先登录");
                return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(result);
            }

            cartService.addOrUpdateCartItem(currentUser.getUserId(), gameId, 1);
            result.put("success", true);
            result.put("message", "添加成功");
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "系统错误: " + e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(result);
        }
    }
}

游戏商城首页 图1:系统首页,展示了游戏分类、热门推荐和搜索功能,界面清晰直观。

下单过程中,事务管理至关重要,确保库存扣减和订单创建的一致性。以下代码展示了使用Spring声明式事务管理的Service方法。

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private GameMapper gameMapper;
    @Autowired
    private OrderDetailMapper orderDetailMapper;

    @Override
    @Transactional(rollbackFor = Exception.class) // 声明式事务管理
    public String createOrder(Order order, List<CartItem> cartItems) throws BusinessException {
        // 1. 校验库存并扣减
        for (CartItem item : cartItems) {
            Game game = gameMapper.selectByPrimaryKey(item.getGameId());
            if (game.getInventory() < item.getQuantity()) {
                throw new BusinessException("商品 [" + game.getTitle() + "] 库存不足");
            }
            // 扣减库存
            game.setInventory(game.getInventory() - item.getQuantity());
            gameMapper.updateByPrimaryKeySelective(game);
        }

        // 2. 生成订单号(示例:时间戳+随机数)
        String orderId = generateOrderId();
        order.setOrderId(orderId);

        // 3. 插入订单主表
        orderMapper.insertSelective(order);

        // 4. 插入订单明细
        for (CartItem item : cartItems) {
            OrderDetail detail = new OrderDetail();
            detail.setOrderId(orderId);
            detail.setGameId(item.getGameId());
            detail.setQuantity(item.getQuantity());
            detail.setUnitPrice(item.getUnitPrice());
            orderDetailMapper.insertSelective(detail);
        }

        return orderId;
    }

    private String generateOrderId() {
        return System.currentTimeMillis() + "" + (new Random().nextInt(900) + 100);
    }
}

购物车页面 图2:购物车页面,用户可在此管理待购买商品,确认数量与总价。

用户支付成功后,系统需要更新订单状态并触发后续发货流程(如发送游戏密钥)。以下是一个简化的支付回调处理逻辑。

@Controller
@RequestMapping("/payment")
public class PaymentCallbackController {

    @Autowired
    private OrderService orderService;

    @PostMapping("/notify")
    @ResponseBody
    public String handlePaymentNotify(@RequestParam String orderId,
                                      @RequestParam String transactionId) {
        try {
            // 1. 验证支付通知的合法性(如签名),此处省略
            // ...

            // 2. 根据订单ID查询订单
            Order order = orderService.getOrderById(orderId);
            if (order == null) {
                return "fail";
            }

            // 3. 检查订单状态,避免重复处理
            if (order.getOrderStatus() != OrderStatus.WAITING_PAYMENT.getCode()) {
                return "success"; // 已处理过,直接返回成功
            }

            // 4. 更新订单状态为已支付
            order.setOrderStatus(OrderStatus.PAID.getCode());
            order.setPaymentTime(new Date());
            order.setTransactionId(transactionId);
            orderService.updateOrder(order);

            // 5. 触发发货逻辑(如调用密钥发放服务)
            gameKeyDeliveryService.deliverGameKeys(orderId);

            return "success";
        } catch (Exception e) {
            // 记录日志,并返回失败,让支付平台重试
            return "fail";
        }
    }
}

订单管理界面 图3:订单管理界面,用户可查看订单状态、支付信息及发货详情。

系统的实体模型严格遵循数据库设计,并通过MyBatis-Generator等工具生成。以Order实体为例,其Java类与数据库表结构完全对应。

public class Order {
    private String orderId;
    private Integer userId;
    private BigDecimal totalAmount;
    private BigDecimal actualAmount;
    private Integer orderStatus;
    private String paymentMethod;
    private Date paymentTime;
    private String shippingAddress; // 存储邮箱等收货信息
    private Date createTime;
    private Date updateTime;

    // 省略getter和setter方法
}

为了进一步提升“星流游戏商城”的竞争力和用户体验,未来可以考虑以下几个优化方向:

  1. 引入缓存机制提升性能:使用Redis等内存数据库缓存热门游戏信息、首页数据。这能极大减少对MySQL的直接查询,提高系统响应速度。例如,将游戏分类、热销榜等不常变化的数据存入Redis并设置过期时间。
  2. 实现分布式会话管理:当前系统可能依赖Tomcat的HttpSession,这在单机部署时没问题,但扩展到集群环境会存在会话丢失问题。可采用Spring Session集成Redis,将用户会话信息集中存储,实现多台应用服务器间的会话共享。
  3. 集成第三方支付与登录:除了内置支付流程,可集成支付宝、微信支付等主流支付渠道,提升支付转化率。同时,支持第三方账号(如Steam、微信)快捷登录,降低用户注册门槛。
  4. 构建微服务架构:随着业务复杂度的增加,可将单体应用拆分为用户中心、商品服务、订单服务、库存服务、支付服务等独立的微服务。使用Spring Cloud Alibaba套件(Nacos, Sentinel, Seata等)进行服务治理、流量控制和分布式事务管理,提高系统的弹性、可维护性和可扩展性。
  5. 增强后台数据分析功能:在后台管理系统中集成数据报表模块,利用ECharts等可视化库展示销售趋势、用户行为分析、商品热度等数据,为运营决策提供数据支持。这需要构建专门的数据分析层或数仓,对订单和用户数据进行ETL处理。

该数字游戏交易平台通过严谨的分层架构设计、合理的数据库表结构以及清晰的业务代码实现,为中小型游戏发行商提供了一个功能完备、稳定可靠的在线销售解决方案。其技术栈选型成熟稳定,代码结构规范,具备了良好的可扩展性和可维护性,为后续的功能迭代和性能优化奠定了坚实的基础。

本文关键词
SSM框架在线游戏商城源码解析系统架构数据库设计

上下篇

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