毕业设计实战:基于SpringBoot的动漫商城管理系统设计与实现全攻略

0 阅读11分钟

毕业设计实战:基于SpringBoot的动漫商城管理系统设计与实现全攻略

在开发“基于SpringBoot的动漫商城管理系统”毕业设计时,曾因“订单状态与商品库存数据不同步”踩过关键坑——初期未设计清晰的订单状态机和库存联动机制,导致用户下单后库存未及时扣减、订单支付超时后库存未回滚、购物车与订单数据脱节,耗费4天重构订单管理模块、引入订单状态流转和库存联动机制才解决问题📝。基于此次实战经验,本文精简拆解核心开发流程,附避坑要点与实操细节,为同类毕设提供可落地的实施参考。

一、需求分析:聚焦商品+订单双核心,避免功能冗余

部分同学易陷入“功能堆砌”误区,比如我曾耗时2天开发“动漫角色地图”模块,最终因偏离“商品管理、购物车、订单处理、库存管理”核心需求被导师要求删减。明确“商品发布→用户浏览→加入购物车→下单支付→库存扣减→订单完成”的业务闭环,是降低返工率的关键。

1. 核心角色与功能(精简版)

角色核心功能
管理员用户管理、商品类型管理、动漫商品管理、订单管理、系统管理(轮播图、动漫资讯、在线咨询)
用户注册登录、动漫商品浏览/搜索/收藏/评论、购物车管理、下单支付、订单查询、个人中心、在线咨询

2. 需求避坑要点

  • 拒绝空想调研:邀请15名动漫爱好者和5名商家模拟“用户浏览商品→加入购物车→下单支付→管理员发货→确认收货”完整流程,基于“用户需要知道订单状态和库存情况”需求,增设“订单状态跟踪”和“库存预警”模块,实用性远大于冗余的“角色地图”;
  • 明确约束条件:提前规定“商品编号自动生成(格式:DM+年月日+序号)”“下单时扣减库存,支付失败自动回滚”“订单状态包括未支付、已支付、已发货、已完成、已取消”“购物车商品数量不能超过库存”,为系统实现提供明确依据。

二、技术选型:稳定框架+订单联动,新手可上手

前期曾尝试引入Redis缓存商品库存,因数据一致性难保证且学习成本高,调试耗时3天。最终确定“成熟框架+数据库事务”组合:

技术工具选型理由避坑提醒
Spring Boot 2.x + MyBatis-Plus快速开发,简化配置,高效实现CRUD和业务逻辑,声明式事务管理方便事务注解@Transactional记得在Service层添加;下单和库存扣减必须加事务
Vue 2.x + ElementUI组件丰富,快速构建前后台界面,表格和表单组件好用订单状态用标签展示;库存不足时红色标识
MySQL 5.7存储用户、商品、订单、购物车等核心业务数据金额字段用Decimal类型;事务要保证订单和库存一致性
Thymeleaf(可选)服务端模板引擎,适合快速开发后台管理界面毕设时间充裕可统一用Vue

三、数据库设计:业务关联清晰,支撑商品-订单-库存闭环

数据库设计直接影响后续开发效率。前期因未设计“订单状态字段”和“库存联动机制”,导致用户下单后库存未同步更新、订单取消后库存未回滚。

1. 核心表结构(精选12张表)

  • 管理员表(users):id、username、password(MD5加密)、role、addtime;
  • 用户表(yonghu):id、zhanghao(账号)、mima(密码)、nicheng(昵称)、xingbie(性别)、shouji(手机)、touxiang(头像)、money(余额)、addtime;
  • 商品类型表(shangpinleixing):id、shangpinleixing(商品类型)、addtime;
  • 动漫商品表(dongmanshangpin):id、shangpinbianhao(商品编号)、shangpinmingcheng(商品名称)、tupian(图片)、shangpinleixing(商品类型)、pinpai(品牌)、chandi(产地)、shangpinxiangqing(商品详情)、onelimittimes(单限)、alllimittimes(库存)、price(价格)、clicktime、addtime;
  • 购物车表(cart):id、tablename(商品表名)、userid(用户id)、goodid(商品id)、goodname(商品名称)、picture(图片)、buynumber(购买数量)、price(单价)、discountprice(会员价)、addtime;
  • 订单表(orders):id、orderid(订单编号)、tablename(商品表名)、userid(用户id)、goodid(商品id)、goodname(商品名称)、picture(图片)、buynumber(购买数量)、price(价格)、total(总价格)、type(支付类型)、status(订单状态)、address(地址)、tel(电话)、consignee(收货人)、remark(备注)、logistics(物流)、addtime;
  • 地址表(address):id、userid(用户id)、address(地址)、name(收货人)、phone(电话)、isdefault(是否默认地址)、addtime;
  • 收藏表(shoucang):id、userid、refid(商品id)、tablename、name、picture、type(收藏类型)、addtime;
  • 动漫资讯表(dongmanzixun):id、title(标题)、introduction(简介)、picture(图片)、content(内容)、addtime;
  • 在线咨询表(zaixianzixun):id、userid、adminid、ask(提问)、reply(回复)、isreply(是否回复)、addtime;
  • 商品评论表(shangpinpinglun):id、refid(商品id)、userid、nickname、content(评论内容)、reply(回复内容)、addtime;
  • token表(token):id、userid、username、tablename、role、token、addtime、expiratedtime。

2. 关键业务SQL示例

示例SQL(查询用户订单及商品信息):

-- 查询用户的订单记录,包含商品信息和订单状态
SELECT 
    o.*,
    d.shangpinleixing,
    d.pinpai
FROM orders o
LEFT JOIN dongmanshangpin d ON o.goodid = d.id
WHERE o.userid = #{userId}
ORDER BY o.addtime DESC

关键避坑:下单时需校验库存并扣减;订单支付超时需自动取消并回滚库存;购物车结算需批量创建订单项。

四、核心功能实现:7大模块满足答辩需求

无需复杂功能,优先完成以下7个核心模块,其中订单与库存联动是答辩重点。

1. 用户管理(基础模块)

  • 核心逻辑:用户注册登录、个人信息维护、余额管理;
  • 页面设计:注册登录界面;个人中心显示头像、昵称、余额、订单列表;
  • 代码要点(用户注册):
public void addYonghu(Yonghu user) {
    // 校验账号是否重复
    LambdaQueryWrapper<Yonghu> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(Yonghu::getZhanghao, user.getZhanghao());
    if (yonghuMapper.selectCount(wrapper) > 0) {
        throw new RuntimeException("账号已存在");
    }
    user.setMoney(0f);
    user.setAddtime(new Date());
    yonghuMapper.insert(user);
}

2. 动漫商品管理(核心资源模块)

  • 核心逻辑:管理员发布商品(名称、类型、品牌、产地、价格、库存、详情)→用户浏览、搜索、收藏、评论;
  • 页面设计:商品卡片式展示,显示名称、图片、价格、库存;详情页展示完整信息;
  • 代码要点(商品发布与库存管理):
@Transactional
public void addDongmanshangpin(Dongmanshangpin product) {
    // 生成商品编号
    String bianhao = "DM" + new SimpleDateFormat("yyyyMMdd").format(new Date()) 
                     + String.format("%04d", new Random().nextInt(10000));
    product.setShangpinbianhao(bianhao);
    product.setAddtime(new Date());
    dongmanshangpinMapper.insert(product);
    
    log.info("管理员发布了商品:{}", product.getShangpinmingcheng());
}

// 库存扣减
public void reduceStock(Long productId, int quantity) {
    Dongmanshangpin product = dongmanshangpinMapper.selectById(productId);
    if (product.getAlllimittimes() < quantity) {
        throw new RuntimeException("库存不足");
    }
    product.setAlllimittimes(product.getAlllimittimes() - quantity);
    dongmanshangpinMapper.updateById(product);
}

// 库存回滚(订单取消时)
public void rollbackStock(Long productId, int quantity) {
    Dongmanshangpin product = dongmanshangpinMapper.selectById(productId);
    product.setAlllimittimes(product.getAlllimittimes() + quantity);
    dongmanshangpinMapper.updateById(product);
}

3. 购物车管理(交易准备模块)

  • 核心逻辑:用户将商品加入购物车→修改数量→确认结算;
  • 页面设计:购物车列表显示商品名称、图片、单价、数量、总价;支持删除和修改数量;
  • 代码要点(购物车添加):
public void addCart(Cart cart) {
    // 校验是否已存在
    LambdaQueryWrapper<Cart> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(Cart::getGoodid, cart.getGoodid())
           .eq(Cart::getUserid, cart.getUserid());
    Cart existCart = cartMapper.selectOne(wrapper);
    
    if (existCart != null) {
        existCart.setBuynumber(existCart.getBuynumber() + cart.getBuynumber());
        cartMapper.updateById(existCart);
    } else {
        cart.setAddtime(new Date());
        cartMapper.insert(cart);
    }
}

4. 订单管理(核心业务流程)

  • 核心逻辑:用户确认下单→创建订单→扣减库存→支付→发货→确认收货;
  • 页面设计:订单列表显示订单编号、商品名称、数量、总价、状态;支持支付、取消、确认收货;
  • 代码要点(订单创建与状态流转):
@Transactional
public Orders createOrder(Long userId, List<Cart> cartItems, Address address) {
    // 1. 生成订单编号
    String orderId = "DD" + System.currentTimeMillis();
    Orders mainOrder = null;
    
    for (Cart cart : cartItems) {
        // 2. 校验库存
        Dongmanshangpin product = dongmanshangpinMapper.selectById(cart.getGoodid());
        if (product.getAlllimittimes() < cart.getBuynumber()) {
            throw new RuntimeException("商品 " + product.getShangpinmingcheng() + " 库存不足");
        }
        
        // 3. 创建订单项
        Orders order = new Orders();
        order.setOrderid(orderId);
        order.setUserid(userId);
        order.setGoodid(cart.getGoodid());
        order.setGoodname(cart.getGoodname());
        order.setPicture(cart.getPicture());
        order.setBuynumber(cart.getBuynumber());
        order.setPrice(cart.getPrice());
        order.setTotal(cart.getPrice() * cart.getBuynumber());
        order.setStatus("未支付");
        order.setAddress(address.getAddress());
        order.setTel(address.getPhone());
        order.setConsignee(address.getName());
        order.setAddtime(new Date());
        ordersMapper.insert(order);
        
        // 4. 扣减库存
        reduceStock(cart.getGoodid(), cart.getBuynumber());
        
        // 5. 删除购物车记录
        cartMapper.deleteById(cart.getId());
        
        if (mainOrder == null) mainOrder = order;
    }
    
    // 6. 设置订单超时自动取消(定时任务)
    scheduleOrderTimeout(orderId);
    
    log.info("用户 {} 创建订单 {}", userId, orderId);
    return mainOrder;
}

// 订单支付
@Transactional
public void payOrder(String orderId) {
    // 更新订单状态
    LambdaUpdateWrapper<Orders> wrapper = new LambdaUpdateWrapper<>();
    wrapper.eq(Orders::getOrderid, orderId)
           .eq(Orders::getStatus, "未支付")
           .set(Orders::getStatus, "已支付");
    int updated = ordersMapper.update(null, wrapper);
    
    if (updated == 0) {
        throw new RuntimeException("订单状态异常,请刷新后重试");
    }
    
    log.info("订单 {} 支付成功", orderId);
}

// 订单取消(超时或用户主动取消)
@Transactional
public void cancelOrder(String orderId) {
    // 1. 查询订单项
    List<Orders> orderList = ordersMapper.selectList(
        new LambdaQueryWrapper<Orders>().eq(Orders::getOrderid, orderId)
    );
    
    // 2. 回滚库存
    for (Orders order : orderList) {
        if ("已支付".equals(order.getStatus())) {
            rollbackStock(order.getGoodid(), order.getBuynumber());
        }
    }
    
    // 3. 更新订单状态
    LambdaUpdateWrapper<Orders> wrapper = new LambdaUpdateWrapper<>();
    wrapper.eq(Orders::getOrderid, orderId)
           .in(Orders::getStatus, "未支付", "已支付")
           .set(Orders::getStatus, "已取消");
    ordersMapper.update(null, wrapper);
    
    log.info("订单 {} 已取消", orderId);
}

5. 订单超时自动取消(定时任务)

@Component
public class OrderTimeoutTask {
    
    @Scheduled(cron = "0 */5 * * * ?") // 每5分钟执行一次
    @Transactional
    public void cancelTimeoutOrders() {
        // 查询超过30分钟未支付的订单
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, -30);
        Date timeout = calendar.getTime();
        
        List<Orders> timeoutOrders = ordersMapper.selectList(
            new LambdaQueryWrapper<Orders>()
                .eq(Orders::getStatus, "未支付")
                .lt(Orders::getAddtime, timeout)
                .groupBy(Orders::getOrderid)
        );
        
        Set<String> orderIds = timeoutOrders.stream()
            .map(Orders::getOrderid)
            .collect(Collectors.toSet());
        
        for (String orderId : orderIds) {
            cancelOrder(orderId);
            log.info("订单 {} 超时自动取消", orderId);
        }
    }
}

6. 地址管理(收货模块)

  • 核心逻辑:用户维护收货地址(收货人、电话、地址),支持设置默认地址;
  • 页面设计:地址列表显示收货人、电话、地址、默认标识;支持增删改查;
  • 代码要点:设置默认地址时取消其他默认地址。

7. 在线咨询(客服模块)

  • 核心逻辑:用户提交咨询问题→管理员回复;
  • 页面设计:咨询列表显示提问内容、回复内容、状态;
  • 代码要点:支持未回复消息提醒。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、动漫商城特色功能设计(关键加分项)

动漫商城管理系统的核心在于“商品-购物车-订单-库存全流程联动”,以下是实测有效的设计方案:

1. 商品-购物车-订单全流程追溯

环节记录内容可追溯信息
商品发布商品编号、名称、类型、品牌、价格、库存什么商品、多少钱、还有多少
购物车商品名称、数量、单价、总价加了什么、加了多少
订单创建订单编号、商品信息、收货地址、订单状态什么时候买的、发到哪、什么状态
库存扣减商品ID、扣减数量、剩余库存扣了多少、还剩多少
订单支付支付时间、支付金额付了多少钱、什么时候付的

2. 库存预警机制

// 定时任务:检查库存低于阈值的商品
@Component
public class StockAlertTask {
    
    @Scheduled(cron = "0 0 9 * * ?") // 每天上午9点执行
    public void checkStock() {
        List<Dongmanshangpin> list = dongmanshangpinMapper.selectList(null);
        for (Dongmanshangpin product : list) {
            if (product.getAlllimittimes() <= 5) {
                log.warn("商品 {} 库存不足,当前库存:{}", 
                    product.getShangpinmingcheng(), product.getAlllimittimes());
                // 可发送通知给管理员
            }
        }
    }
}

3. 热门商品推荐

-- 基于销量和收藏量推荐热门商品
SELECT 
    d.*,
    COUNT(DISTINCT o.id) as order_count,
    COUNT(DISTINCT s.id) as collect_count,
    (COUNT(DISTINCT o.id) * 0.6 + COUNT(DISTINCT s.id) * 0.4) as hot_score
FROM dongmanshangpin d
LEFT JOIN orders o ON d.id = o.goodid AND o.status = '已完成'
LEFT JOIN shoucang s ON d.id = s.refid AND s.type = '1'
GROUP BY d.id
ORDER BY hot_score DESC
LIMIT 10

六、测试与答辩:流程演示为主,突出商城购物闭环

1. 核心测试用例

测试场景操作步骤预期结果
商品发布全流程管理员发布商品→用户查看商品信息正确显示;库存正确
购物车流程用户添加商品到购物车→修改数量购物车记录保存;总价自动计算
下单支付流程用户下单→支付→库存扣减订单生成;库存减少;订单状态更新
订单取消流程用户取消订单→库存回滚订单状态更新为已取消;库存恢复
超时自动取消订单30分钟未支付订单自动取消;库存回滚

2. 答辩准备技巧

  • 演示流程:分角色演示(管理员端 + 用户端)→ 管理员发布动漫商品 → 用户注册登录 → 用户浏览商品 → 用户加入购物车 → 用户下单 → 用户支付 → 库存扣减 → 管理员发货 → 用户确认收货 → 订单完成 → 展示完整的商品-购物车-订单-库存管理闭环;
  • 业务讲解:准备一页PPT展示系统功能结构图(图4-1),说明每个模块的作用和角色定位;
  • 技术亮点:重点讲解下单与库存扣减的事务一致性、订单超时自动取消、库存回滚机制;
  • 突出问题解决:讲清“如何保证库存不超卖”(下单时扣减库存+事务)、“订单超时如何自动取消”(定时任务+状态检测)、“购物车与订单如何关联”(结算时批量创建订单项);提前预判“为什么要设计订单超时自动取消”,回答“释放未支付订单占用的库存,提高库存周转率”。

结语

本文核心是“聚焦商品-订单-库存核心业务、实现电商购物闭环、设计完整的动漫商城管理系统”。毕设无需复杂系统,把商品管理+购物车+订单管理+库存联动的业务逻辑讲透、实现一个可运行的动漫商城管理系统、展示完整的购物闭环,即可成为答辩亮点。

若需完整项目源码(带详细注释)、测试数据SQL脚本、订单超时取消完整代码,可在评论区留言“SpringBoot动漫商城系统”获取;开发中遇问题(如事务一致性、库存并发控制、订单状态流转),也可留言咨询~ 祝毕设顺利!🎉