毕业设计实战:基于Spring Boot的华强北商城二手手机管理系统全栈开发

54 阅读11分钟

一、项目背景:二手手机电商数字化的迫切需求

在移动互联网深度渗透消费领域的当下,传统二手手机交易模式正面临三大核心痛点交易效率低(线下交易受地域限制,供需匹配耗时)、信息不透明(商品成色、售后保障缺乏统一展示渠道)、管理分散(商家靠Excel记录库存,用户订单追踪困难)。据行业调研显示,2023年国内二手手机线上交易渗透率虽达55%,但中小商家数字化管理覆盖率不足30%,大量交易仍依赖传统模式,制约业务增长。

为破解这一困境,基于Spring Boot的华强北商城二手手机管理系统应运而生。系统以“交易透明化、管理规范化、服务一体化”为核心目标,采用B/S架构构建适配二手手机交易场景的全流程管理平台,整合商品展示、在线下单、订单追踪、评价互动等功能,建立“管理员统筹-商家运营-用户消费”的三级应用模式,推动二手手机交易从“线下分散”向“线上系统化”转型。

二、技术架构:二手手机管理系统的全栈技术选型

项目围绕“稳定性、可扩展性、易用性”三大原则,选用成熟的Java技术栈,确保核心业务(如商品管理、订单流转)高效运转:

技术模块具体工具/技术核心作用
后端框架Spring Boot 2.x快速构建RESTful API,简化配置,支持事务管理与依赖注入
数据库MySQL 8.0安全存储商品信息、用户数据、订单记录,支持高效查询与关联操作
前端技术Vue + Bootstrap + JavaScript构建响应式界面,实现商品预览、购物车交互等动态功能
架构模式B/S(Browser/Server)无需安装客户端,通过浏览器即可访问,降低用户使用门槛
开发工具IntelliJ IDEA提供代码提示、调试功能,提升开发效率
服务器Tomcat 9.0部署Web应用,保障系统7×24小时稳定运行

三、项目全流程:6步完成二手手机管理系统开发

3.1 第一步:需求分析——明确核心价值与角色功能

针对传统二手手机交易的“效率低、不透明、管理散”痛点,系统聚焦“交易全流程线上化”,明确四大角色的核心需求:

3.1.1 角色与核心功能

角色核心功能
游客浏览商品列表、查看新闻资讯、了解商品详情(不含购买权限)
注册用户账号注册/登录、商品购买、购物车管理、订单查询、商品评价、个人信息修改
商家商品上架/下架、库存管理、订单处理(接单/发货)、个人店铺信息维护
管理员用户账号审核、商品分类管理、订单监控、新闻发布、轮播图配置、评价审核

3.1.2 非功能性需求

  • 安全性:用户密码加密存储,角色权限严格隔离(如游客无法修改商品信息);
  • 易用性:界面贴合电商使用习惯,关键操作(如下单、查订单)路径不超过3步;
  • 稳定性:支持100+用户同时在线操作,订单提交响应时间<2秒;
  • 可扩展性:预留支付接口、会员积分等扩展模块,后续可快速集成。

3.2 第二步:系统设计——构建架构与数据库

3.2.1 系统总体架构

采用分层设计,职责清晰,便于维护:

  1. 表现层:通过Vue + Bootstrap实现前端界面,区分“用户前台”“商家后台”“管理员后台”三大视图;
  2. 业务逻辑层:基于Spring Boot实现核心服务,如用户认证、商品管理、订单流转、评价审核;
  3. 数据持久层:通过MyBatis实现数据库交互,支持复杂查询(如按商品成色筛选)与事务控制。

3.2.2 核心数据库设计

系统设计12张核心数据表,覆盖“用户-商品-订单-评价”全链路,关键表结构如下:

表名核心字段作用
yonghu(用户表)id、username(用户名)、password(加密密码)、yonghu_phone(手机号)存储用户基本信息与登录凭证
shangpin(商品表)id、shangpin_name(商品名)、shangpin_old_money(原价)、shangpin_new_money(二手价)、shangpin_kucun_number(库存)记录二手手机商品信息(成色、配置、价格等)
shangpin_order(订单表)id、shangpin_order_uuid_number(订单编号)、shangpin_id(商品ID)、yonghu_id(用户ID)、shangpin_order_types(订单状态)追踪订单从“待付款”到“已完成”的全状态
shangpin_pingjia(评价表)id、shangpin_id(商品ID)、yonghu_id(用户ID)、pingfen(评分)、pingjianeirong(评价内容)存储用户对商品的评价,支持管理员审核
news(新闻表)id、news_name(标题)、news_content(内容)、insert_time(发布时间)发布二手手机行业资讯、平台活动通知

3.3 第三步:后端核心功能实现——Spring Boot落地

以“商品管理”“订单流转”“评价审核”三大核心场景为例,展示后端代码实现:

3.3.1 商品管理(商家功能)

@RestController
@RequestMapping("/api/shangpin")
public class ShangpinController {

    @Autowired
    private ShangpinService shangpinService;

    /**
     * 商家上架二手手机商品
     */
    @PostMapping("/add")
    public ResponseEntity<?> addShangpin(@RequestBody ShangpinDTO shangpinDTO,
                                        @RequestHeader("shangjiaId") Long shangjiaId) {
        try {
            // 1. 参数验证:商品名、价格、库存为必填项
            if (StringUtils.isEmpty(shangpinDTO.getShangpinName()) 
                || shangpinDTO.getShangpinNewMoney() == null 
                || shangpinDTO.getShangpinKucunNumber() == null) {
                return ResponseEntity.badRequest().body("商品名、价格、库存不能为空");
            }

            // 2. 构建商品实体(关联商家ID)
            Shangpin shangpin = new Shangpin();
            shangpin.setShangjiaId(shangjiaId);
            shangpin.setShangpinName(shangpinDTO.getShangpinName());
            shangpin.setShangpinTypes(shangpinDTO.getShangpinTypes()); // 商品分类(如"苹果""安卓")
            shangpin.setShangpinPhoto(shangpinDTO.getShangpinPhoto()); // 商品图片URL
            shangpin.setShangpinOldMoney(shangpinDTO.getShangpinOldMoney()); // 原价
            shangpin.setShangpinNewMoney(shangpinDTO.getShangpinNewMoney()); // 二手价
            shangpin.setShangpinKucunNumber(shangpinDTO.getShangpinKucunNumber()); // 库存
            shangpin.setShangxiaTypes(1); // 1-上架,0-下架
            shangpin.setCreateTime(new Date());

            // 3. 调用Service保存商品
            Shangpin result = shangpinService.saveShangpin(shangpin);
            return ResponseEntity.ok("商品上架成功,商品ID:" + result.getId());
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("商品上架失败:" + e.getMessage());
        }
    }

    /**
     * 商家修改商品库存
     */
    @PostMapping("/updateStock")
    public ResponseEntity<?> updateStock(@RequestParam Long shangpinId,
                                        @RequestParam Integer newStock,
                                        @RequestHeader("shangjiaId") Long shangjiaId) {
        try {
            // 1. 验证商品是否属于当前商家
            Shangpin shangpin = shangpinService.getByIdAndShangjiaId(shangpinId, shangjiaId);
            if (shangpin == null) {
                return ResponseEntity.badRequest().body("您无权修改该商品库存");
            }

            // 2. 更新库存(库存不能为负数)
            if (newStock < 0) {
                return ResponseEntity.badRequest().body("库存不能为负数");
            }
            shangpin.setShangpinKucunNumber(newStock);
            shangpinService.updateById(shangpin);

            return ResponseEntity.ok("库存更新成功,当前库存:" + newStock);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("库存更新失败:" + e.getMessage());
        }
    }
}

3.3.2 订单流转(用户-商家协同)

@RestController
@RequestMapping("/api/order")
public class OrderController {

    @Autowired
    private ShangpinOrderService orderService;

    @Autowired
    private ShangpinService shangpinService;

    /**
     * 用户提交订单(购买二手手机)
     */
    @PostMapping("/create")
    public ResponseEntity<?> createOrder(@RequestBody OrderDTO orderDTO,
                                        @RequestHeader("yonghuId") Long yonghuId) {
        // 开启事务,确保订单创建与库存扣减原子性
        try {
            // 1. 验证商品是否存在且上架
            Shangpin shangpin = shangpinService.getById(orderDTO.getShangpinId());
            if (shangpin == null || shangpin.getShangxiaTypes() == 0) {
                return ResponseEntity.badRequest().body("商品不存在或已下架");
            }

            // 2. 验证库存是否充足
            if (shangpin.getShangpinKucunNumber() < orderDTO.getBuyNumber()) {
                return ResponseEntity.badRequest().body("库存不足,当前库存:" + shangpin.getShangpinKucunNumber());
            }

            // 3. 构建订单实体
            ShangpinOrder order = new ShangpinOrder();
            order.setShangpinOrderUuidNumber(UUID.randomUUID().toString().replace("-", "")); // 生成唯一订单号
            order.setShangpinId(shangpin.getId());
            order.setYonghuId(yonghuId);
            order.setBuyNumber(orderDTO.getBuyNumber());
            // 计算订单总价(二手价 × 购买数量)
            BigDecimal totalPrice = shangpin.getShangpinNewMoney()
                .multiply(new BigDecimal(orderDTO.getBuyNumber()));
            order.setShangpinOrderTruePrice(totalPrice);
            order.setShangpinOrderTypes(0); // 0-待付款,1-待发货,2-待收货,3-已完成
            order.setCreateTime(new Date());

            // 4. 保存订单 + 扣减库存
            orderService.saveOrderAndReduceStock(order, shangpin);

            return ResponseEntity.ok("订单创建成功,订单号:" + order.getShangpinOrderUuidNumber());
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("订单创建失败:" + e.getMessage());
        }
    }

    /**
     * 商家处理订单(发货)
     */
    @PostMapping("/ship")
    public ResponseEntity<?> shipOrder(@RequestParam String orderNumber,
                                      @RequestHeader("shangjiaId") Long shangjiaId) {
        try {
            // 1. 查找订单(需属于当前商家的商品)
            ShangpinOrder order = orderService.getByOrderNumberAndShangjiaId(orderNumber, shangjiaId);
            if (order == null) {
                return ResponseEntity.badRequest().body("订单不存在或无权处理");
            }

            // 2. 验证订单状态(仅待发货状态可处理)
            if (order.getShangpinOrderTypes() != 1) {
                return ResponseEntity.badRequest().body("订单状态错误,当前状态:" + getOrderStatusDesc(order.getShangpinOrderTypes()));
            }

            // 3. 更新订单状态为"待收货"
            order.setShangpinOrderTypes(2);
            order.setShipTime(new Date());
            orderService.updateById(order);

            return ResponseEntity.ok("订单发货成功,订单号:" + orderNumber);
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("订单发货失败:" + e.getMessage());
        }
    }

    // 辅助方法:转换订单状态为文字描述
    private String getOrderStatusDesc(Integer status) {
        Map<Integer, String> descMap = new HashMap<>();
        descMap.put(0, "待付款");
        descMap.put(1, "待发货");
        descMap.put(2, "待收货");
        descMap.put(3, "已完成");
        return descMap.getOrDefault(status, "未知状态");
    }
}

3.3.3 评价审核(管理员功能)

@RestController
@RequestMapping("/api/admin/comment")
public class AdminCommentController {

    @Autowired
    private ShangpinPingjiaService pingjiaService;

    /**
     * 管理员审核用户评价
     */
    @PostMapping("/audit")
    public ResponseEntity<?> auditComment(@RequestParam Long commentId,
                                         @RequestParam Integer auditResult, // 1-通过,0-拒绝
                                         @RequestParam(required = false) String auditRemark) {
        try {
            // 1. 查找评价记录
            ShangpinPingjia comment = pingjiaService.getById(commentId);
            if (comment == null) {
                return ResponseEntity.badRequest().body("评价记录不存在");
            }

            // 2. 更新审核状态
            comment.setSfsh(auditResult == 1 ? "是" : "否"); // sfsh:是否审核(是/否)
            comment.setShhf(auditRemark); // 审核回复(如拒绝原因)
            comment.setAuditTime(new Date());
            pingjiaService.updateById(comment);

            return ResponseEntity.ok(auditResult == 1 ? "评价审核通过" : "评价审核拒绝");
        } catch (Exception e) {
            return ResponseEntity.internalServerError().body("审核失败:" + e.getMessage());
        }
    }
}

3.4 第四步:前端界面实现——电商化交互设计

基于Vue + Bootstrap构建“三端分离”界面,确保不同角色操作便捷、视觉统一:

3.4.1 核心界面设计

  1. 用户前台

    • 首页:轮播图展示热门二手手机,分类导航(如“95新苹果”“9新安卓”),新品推荐区;
    • 商品详情页:多图预览商品成色、配置参数、用户评价(审核通过后展示),“加入购物车”“立即购买”按钮;
    • 订单中心:列表展示所有订单,标注状态(待付款/待收货),支持“取消订单”“确认收货”操作。
  2. 商家后台

    • 商品管理页:表格展示已上架商品,操作列提供“编辑库存”“下架”按钮,支持按商品名搜索;
    • 订单处理页:按状态筛选订单(待发货/已完成),操作列提供“发货”“查看详情”功能。
  3. 管理员后台

    • 用户管理页:审核新注册用户账号,支持“启用/禁用”操作;
    • 评价审核页:列表展示待审核评价,操作列提供“通过”“拒绝”按钮,可查看评价内容与商品关联信息。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3.4.2 设计亮点

  • 二手特色适配:商品详情页增加“成色说明”“售后保障”模块,解决二手交易信息不透明问题;
  • 操作便捷性:关键功能按钮固定位置(如“立即购买”在商品详情页底部),减少用户操作路径;
  • 响应式适配:在手机、电脑端自动调整布局(如手机端商品列表单列展示,电脑端双列展示)。

3.5 第五步:系统测试——验证功能与性能

通过黑盒测试(聚焦功能正确性)与压力测试(验证稳定性),确保系统满足实际使用需求:

3.5.1 功能测试(关键场景)

测试场景测试用例预期结果实际结果
用户下单选择商品(库存10),购买2台,提交订单订单创建成功,库存扣减为8符合预期
商家发货找到“待发货”订单,点击“发货”订单状态变为“待收货”,记录发货时间符合预期
评价审核管理员拒绝一条违规评价,填写理由评价状态变为“拒绝”,用户可查看拒绝理由符合预期
库存不足用户购买商品(库存1),下单数量2提示“库存不足”,订单创建失败符合预期

3.5.2 性能测试

  • 并发测试:模拟50名用户同时下单,系统响应时间<1.5秒,无订单重复或库存超卖;
  • 稳定性测试:系统连续运行72小时,处理1000+订单,无内存泄漏或数据库连接异常。

3.6 第六步:问题排查与优化

开发过程中针对核心问题制定解决方案,提升系统体验:

  1. 问题1:订单创建时库存超卖
    原因:高并发下未加锁,多个用户同时下单导致库存扣减异常。
    解决方案:使用Spring事务 + 数据库行锁(SELECT ... FOR UPDATE),确保库存扣减原子性。

  2. 问题2:商品图片加载慢
    原因:原图体积大,未做压缩处理。
    解决方案:前端使用图片懒加载,后端对上传图片进行压缩(限制分辨率为1080p),提升加载速度。

  3. 问题3:用户忘记密码无法找回
    原因:未设计密码重置功能。
    解决方案:新增“手机验证码重置密码”模块,通过短信接口发送验证码,验证后允许修改密码。

四、项目复盘:经验总结与扩展方向

4.1 开发收获与挑战

  • 核心挑战:二手商品“成色描述标准化”(通过设计下拉选择框,如“95新/90新”)、订单状态流转逻辑(需覆盖用户取消、商家拒单等异常场景);
  • 关键经验:数据库设计阶段需提前规划表关联(如订单表关联商品ID与用户ID),避免后期频繁修改表结构。

4.2 系统扩展方向

  1. 支付功能集成:对接支付宝、微信支付接口,实现“下单-支付”闭环;
  2. 会员积分体系:用户购买商品获得积分,积分可抵扣部分金额,提升用户粘性;
  3. AI成色检测:接入图像识别接口,自动识别二手手机成色,减少人工描述误差;
  4. 移动端适配:开发微信小程序,支持用户在手机端快速下单、查订单。

五、项目资源

本项目提供完整开发资料,可直接用于毕业设计或二次开发:

  • 源码:后端Spring Boot工程、前端Vue页面;
  • 数据库:MySQL建表语句、初始测试数据(含示例商品、用户账号);
  • 文档:部署教程(含环境配置步骤)、API接口说明、测试报告;
  • 设计图:系统功能结构图、数据库ER图、界面原型图。

如果本文对您的Spring Boot学习、电商类毕业设计有帮助,欢迎点赞+收藏+关注,后续会分享更多二手电商系统开发细节与问题解决方案!