基于SSM框架的在线盲盒商城与管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MavenMySQL
2026-02-0715 浏览

文章摘要

本项目是一款基于SSM(Spring+SpringMVC+MyBatis)框架开发的在线盲盒商城及后台管理系统,旨在为消费者提供趣味性的盲盒购物体验,同时为运营方提供标准化的商品与订单管理能力。系统核心解决了传统线上零售缺乏惊喜感、用户复购率低的痛点,通过随机化商品发放机制激发用户的收藏欲和购买兴趣...

在当今电商市场同质化竞争日益激烈的背景下,传统线上零售模式面临着用户审美疲劳和复购率下降的挑战。潮玩盲盒作为一种新兴的消费模式,通过随机化体验成功激发了用户的收藏欲望和购买兴趣。本项目采用SSM框架构建了一个功能完备的在线盲盒交易平台,为消费者提供沉浸式的开盒体验,同时为运营方提供标准化的管理工具。

系统架构与技术栈

该平台采用经典的三层架构设计,表现层使用SpringMVC框架处理前端请求和视图渲染,业务层通过Spring IoC容器管理服务组件,数据持久化层基于MyBatis实现数据库操作。前端采用JSP动态页面技术,配合jQuery实现丰富的交互效果。

技术栈配置如下:

<dependencies>
    <!-- Spring核心依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    
    <!-- MyBatis集成 -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>
    
    <!-- 数据库连接池 -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>
</dependencies>

Spring配置文件中定义了数据源和事务管理:

@Configuration
@EnableTransactionManagement
@ComponentScan("com.service")
public class SpringConfig {
    
    @Bean
    public DataSource dataSource() {
        DruidDataSource ds = new DruidDataSource();
        ds.setUrl("jdbc:mysql://localhost:3306/blindbox_mall");
        ds.setUsername("root");
        ds.setPassword("123456");
        return ds;
    }
    
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

数据库设计亮点分析

订单消息表(ordermsg)的精细化设计

订单表的设计体现了对盲盒业务特性的深度理解。除了常规的订单字段外,特别添加了goodstype字段区分商品类型,fid字段支持订单拆分和合并,delstatus软删除标志确保数据完整性。

CREATE TABLE `ordermsg` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `ddno` varchar(255) DEFAULT NULL COMMENT '订单号',
  `memberid` varchar(255) DEFAULT NULL COMMENT '会员ID',
  `productid` varchar(255) DEFAULT NULL COMMENT '产品ID',
  `num` int(11) DEFAULT NULL COMMENT '数量',
  `total` double(255,2) DEFAULT NULL COMMENT '总金额',
  `fkstatus` varchar(255) DEFAULT NULL COMMENT '付款状态',
  `shstatus` varchar(11) DEFAULT NULL COMMENT '发货状态',
  `addr` varchar(255) DEFAULT NULL COMMENT '收货地址',
  `savetime` varchar(255) DEFAULT NULL COMMENT '保存时间',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `shfs` varchar(255) DEFAULT NULL COMMENT '送货方式',
  `zffs` varchar(255) DEFAULT NULL COMMENT '支付方式',
  `saver` varchar(255) DEFAULT NULL COMMENT '保存者',
  `isdd` varchar(255) DEFAULT NULL COMMENT '是否到达',
  `fid` varchar(255) DEFAULT NULL COMMENT '父级ID',
  `goodsid` varchar(255) DEFAULT NULL COMMENT '商品ID',
  `goodstype` varchar(255) DEFAULT NULL COMMENT '商品类型',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注信息',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COMMENT='订单消息表'

索引优化策略:

-- 为高频查询字段建立复合索引
CREATE INDEX idx_member_status ON ordermsg(memberid, fkstatus, shstatus);
CREATE INDEX idx_ddno ON ordermsg(ddno);
CREATE INDEX idx_savetime ON ordermsg(savetime);

产品表(product)的多维度分类设计

产品表支持两级分类体系,通过fidsid字段实现灵活的品类管理。issjistj字段控制商品上下架和推荐状态,满足运营需求。

CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `productno` varchar(255) DEFAULT NULL COMMENT '产品编号',
  `productname` varchar(255) DEFAULT NULL COMMENT '产品名称',
  `filename` varchar(255) DEFAULT NULL COMMENT '文件名',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  `tprice` decimal(10,2) DEFAULT NULL COMMENT '促销价格',
  `fid` varchar(255) DEFAULT NULL COMMENT '父分类ID',
  `sid` varchar(255) DEFAULT NULL COMMENT '子分类ID',
  `content` text DEFAULT NULL COMMENT '产品描述',
  `delstatus` varchar(255) DEFAULT NULL COMMENT '删除状态',
  `issj` varchar(255) DEFAULT NULL COMMENT '是否上架',
  `istj` varchar(255) DEFAULT NULL COMMENT '是否推荐',
  `saver` varchar(255) DEFAULT NULL COMMENT '保存者',
  `productid` varchar(255) DEFAULT NULL COMMENT '产品ID',
  `leibie` varchar(255) DEFAULT NULL COMMENT '类别',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=196 DEFAULT CHARSET=utf8 COMMENT='产品表'

核心功能实现

盲盒购买与随机开盒机制

前端通过jQuery实现开盒动画效果,后端采用权重算法实现随机商品分配。控制器处理购买请求时,确保事务的原子性。

@Controller
@RequestMapping("/blindbox")
public class BlindBoxController {
    
    @Resource
    private ProductService productService;
    @Resource
    private OrderService orderService;
    
    @RequestMapping("/buy")
    @ResponseBody
    @Transactional
    public Map<String, Object> buyBlindBox(HttpServletRequest request) {
        Map<String, Object> result = new HashMap<>();
        try {
            String memberId = (String) request.getSession().getAttribute("memberid");
            String seriesId = request.getParameter("seriesId");
            int quantity = Integer.parseInt(request.getParameter("quantity"));
            
            // 获取盲盒系列中的所有商品及其权重
            List<Product> products = productService.getProductsBySeries(seriesId);
            List<Product> randomProducts = new ArrayList<>();
            
            // 基于权重的随机算法
            for (int i = 0; i < quantity; i++) {
                Product randomProduct = getRandomProductByWeight(products);
                randomProducts.add(randomProduct);
            }
            
            // 创建订单
            String orderNo = orderService.createOrder(memberId, randomProducts);
            
            result.put("success", true);
            result.put("orderNo", orderNo);
            result.put("products", randomProducts);
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", "购买失败:" + e.getMessage());
        }
        return result;
    }
    
    private Product getRandomProductByWeight(List<Product> products) {
        // 实现权重随机算法
        int totalWeight = products.stream().mapToInt(Product::getWeight).sum();
        int random = new Random().nextInt(totalWeight);
        int current = 0;
        
        for (Product product : products) {
            current += product.getWeight();
            if (random < current) {
                return product;
            }
        }
        return products.get(0);
    }
}

盲盒购买流程

订单管理后台

管理员可以查看和处理所有订单,支持按状态筛选和批量操作。订单详情页面展示完整的交易信息。

@Controller
@RequestMapping("/admin/order")
public class AdminOrderController {
    
    @Resource
    private OrderMsgDAO orderMsgDAO;
    
    @RequestMapping("/list")
    public String orderList(HttpServletRequest request) {
        String status = request.getParameter("status");
        String keyword = request.getParameter("keyword");
        
        Map<String, Object> params = new HashMap<>();
        if (status != null && !status.isEmpty()) {
            params.put("fkstatus", status);
        }
        if (keyword != null && !keyword.isEmpty()) {
            params.put("keyword", keyword);
        }
        
        List<OrderMsg> orderList = orderMsgDAO.findByParams(params);
        request.setAttribute("orderList", orderList);
        request.setAttribute("status", status);
        request.setAttribute("keyword", keyword);
        
        return "admin/order_list";
    }
    
    @RequestMapping("/updateStatus")
    @ResponseBody
    @Transactional
    public Map<String, Object> updateOrderStatus(@RequestParam String orderId, 
                                               @RequestParam String statusType,
                                               @RequestParam String statusValue) {
        Map<String, Object> result = new HashMap<>();
        try {
            OrderMsg order = orderMsgDAO.findById(Integer.parseInt(orderId));
            if ("fkstatus".equals(statusType)) {
                order.setFkstatus(statusValue);
            } else if ("shstatus".equals(statusType)) {
                order.setShstatus(statusValue);
            }
            orderMsgDAO.update(order);
            result.put("success", true);
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", e.getMessage());
        }
        return result;
    }
}

订单管理界面

用户地址管理

用户可管理多个收货地址,支持设置默认地址。地址数据与用户ID关联,确保数据隔离。

@Controller
@RequestMapping("/member/address")
public class AddressController {
    
    @Resource
    private AddressDAO addressDAO;
    
    @RequestMapping("/list")
    public String addressList(HttpServletRequest request) {
        String memberId = (String) request.getSession().getAttribute("memberid");
        List<Address> addressList = addressDAO.findByMemberId(memberId);
        request.setAttribute("addressList", addressList);
        return "member/address_list";
    }
    
    @RequestMapping("/setDefault")
    @ResponseBody
    @Transactional
    public Map<String, Object> setDefaultAddress(@RequestParam int addressId, 
                                               HttpServletRequest request) {
        Map<String, Object> result = new HashMap<>();
        try {
            String memberId = (String) request.getSession().getAttribute("memberid");
            
            // 取消当前所有默认地址
            addressDAO.cancelAllDefault(memberId);
            
            // 设置新的默认地址
            Address address = addressDAO.findById(addressId);
            address.setIsmr("是");
            addressDAO.update(address);
            
            result.put("success", true);
        } catch (Exception e) {
            result.put("success", false);
            result.put("message", e.getMessage());
        }
        return result;
    }
    
    @RequestMapping("/save")
    @Transactional
    public String saveAddress(Address address, HttpServletRequest request) {
        String memberId = (String) request.getSession().getAttribute("memberid");
        address.setMemberid(memberId);
        
        if (address.getId() == 0) {
            addressDAO.save(address);
        } else {
            addressDAO.update(address);
        }
        
        return "redirect:list.do";
    }
}

购物车功能实现

购物车支持商品添加、数量修改和批量删除,通过Session存储临时数据。

@Component
public class CartService {
    
    public void addToCart(HttpServletRequest request, int productId, int quantity) {
        HttpSession session = request.getSession();
        Map<Integer, CartItem> cart = getCart(session);
        
        Product product = productDAO.findById(productId);
        if (cart.containsKey(productId)) {
            CartItem item = cart.get(productId);
            item.setQuantity(item.getQuantity() + quantity);
        } else {
            CartItem item = new CartItem(product, quantity);
            cart.put(productId, item);
        }
        
        session.setAttribute("cart", cart);
    }
    
    public void updateCart(HttpServletRequest request, int productId, int quantity) {
        HttpSession session = request.getSession();
        Map<Integer, CartItem> cart = getCart(session);
        
        if (quantity <= 0) {
            cart.remove(productId);
        } else {
            CartItem item = cart.get(productId);
            if (item != null) {
                item.setQuantity(quantity);
            }
        }
        
        session.setAttribute("cart", cart);
    }
    
    @SuppressWarnings("unchecked")
    private Map<Integer, CartItem> getCart(HttpSession session) {
        Map<Integer, CartItem> cart = (Map<Integer, CartItem>) session.getAttribute("cart");
        if (cart == null) {
            cart = new HashMap<>();
        }
        return cart;
    }
}

购物车界面

实体模型设计

系统采用标准的JavaBean实体类设计,每个实体对应数据库中的一张表。以下是About实体类的实现:

package com.entity;

import java.util.*;

public class About {
    private int id;
    private String content;
    
    public int getId() {
        return id;
    }
    
    public void setId(int id) {
        this.id = id;
    }
    
    public String getContent() {
        return content;
    }
    
    public void setContent(String content) {
        this.content = content;
    }
    
    @Override
    public String toString() {
        return "About [content=" + content + ", id=" + id + "]";
    }
}

Product实体类包含盲盒商品的所有业务属性:

package com.entity;

import java.math.BigDecimal;

public class Product {
    private int id;
    private String productno;
    private String productname;
    private String filename;
    private BigDecimal price;
    private BigDecimal tprice;
    private String fid;
    private String sid;
    private String content;
    private String delstatus;
    private String issj;
    private String istj;
    private String saver;
    private String productid;
    private String leibie;
    private int weight; // 随机权重
    
    // Getter和Setter方法
    public int getId() { return id; }
    public void setId(int id) { this.id = id; }
    
    public String getProductno() { return productno; }
    public void setProductno(String productno) { this.productno = productno; }
    
    // 其他getter/setter方法...
    
    public int getWeight() { return weight; }
    public void setWeight(int weight) { this.weight = weight; }
}

功能展望与优化方向

1. 引入Redis缓存提升性能

当前系统频繁查询商品信息和用户数据,可引入Redis缓存热点数据。

@Service
public class ProductServiceWithCache {
    
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Resource
    private ProductDAO productDAO;
    
    private static final String PRODUCT_KEY_PREFIX = "product:";
    private static final long CACHE_EXPIRE = 3600; // 1小时
    
    public Product getProductById(int id) {
        String key = PRODUCT_KEY_PREFIX + id;
        Product product = (Product) redisTemplate.opsForValue().get(key);
        if (product == null) {
            product = productDAO.findById(id);
            if (product != null) {
                redisTemplate.opsForValue().set(key, product, CACHE_EXPIRE, TimeUnit.SECONDS);
            }
        }
        return product;
    }
}

2. 消息队列处理高并发订单

使用RabbitMQ或Kafka异步处理订单创建和库存扣减,提升系统吞吐量。

@Component
public class OrderMessageProducer {
    
    @Resource
    private RabbitTemplate rabbitTemplate;
    
    public void sendOrderMessage(OrderMessage orderMessage) {
        rabbitTemplate.convertAndSend("order.exchange", "order.create", orderMessage);
    }
}

@Component
public class OrderMessageConsumer {
    
    @RabbitListener(queues = "order.queue")
    @Transactional
    public void processOrderMessage(OrderMessage orderMessage) {
        // 异步处理订单业务逻辑
        orderService.processOrderAsync(orderMessage);
    }
}

3. 微服务架构改造

将单体应用拆分为用户服务、商品服务、订单服务等微服务,提升系统可维护性和扩展性。

4. 移动端适配与PWA支持

开发响应式界面,支持PWA技术,让用户获得接近原生应用的体验。

5. 智能推荐系统

基于用户行为数据构建推荐算法,提升商品转化率。

@Service
public class RecommendationService {
    
    public List<Product> getPersonalizedRecommendations(String memberId) {
        // 基于协同过滤或内容推荐的算法实现
        return recommendationEngine.generateRecommendations(memberId);
    }
}

总结

该盲盒电商平台通过SSM框架实现了完整的在线交易功能,数据库设计合理考虑了业务特性,代码结构清晰易于维护。系统在用户体验方面通过随机开盒机制创造了独特的购物乐趣,在管理功能方面提供了全面的运营支持。基于当前架构,通过引入缓存、消息队列和微服务等现代技术手段,可以进一步提升系统的性能和可扩展性,为业务增长提供坚实的技术基础。

本文关键词
SSM框架在线盲盒商城源码解析数据库设计订单管理

上下篇

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