基于Spring Boot的图书电商网站毕设稳过秘籍!从需求到测试全流程,新手也能抄作业✨

76 阅读18分钟

基于Spring Boot的图书电商网站毕设稳过秘籍!从需求到测试全流程,新手也能抄作业✨

谁懂啊!去年做图书电子商务网站毕设时,光购物车和订单表的关联就卡了5天——一开始没处理“库存扣减”逻辑,用户下单后库存没减少,导师看了直接让我“重写业务层代码”😫 后来踩遍坑才摸出一套能快速落地的流程,今天把需求分析、技术选型、功能实现到测试的全细节说透,宝子们再也不用熬夜改代码,轻松搞定毕设!

一、先搞懂“用户要啥”!需求分析别瞎蒙

刚开始我直接跳过需求分析就写代码,结果做了半个月的“图书资讯推送”功能,导师一句“核心是图书购买和订单管理,不是资讯”直接打回重改!后来才明白,需求分析得先抓准“谁用系统、要干啥”,这步做对,后面少走80%弯路。

1. 核心用户&功能拆解(踩坑后总结版)

图书电商网站就两类核心用户:管理员普通用户(别加太多角色!我当初加了“会员等级”功能,后期调试超麻烦,最后砍掉才轻松):

  • 管理员端(必做功能):
    • 用户管理:新增/修改用户信息、重置密码、查询用户列表(别漏“用户名唯一校验”!我当初没加,导致重复注册,全是投诉)
    • 图书分类管理:添加分类(比如“文学小说”“少儿读物”)、修改分类名称、删除无效分类(用下拉框选择分类,别让管理员手动输,效率更高)
    • 图书信息管理:录入图书详情(名称、作者、出版社)、上传图书封面、设置库存和价格(支持“模糊查询”,搜书名关键词就能找到,我当初没加,查图书时翻半天)
    • 订单管理:查看用户订单、更新订单状态(待支付/已支付/已发货)、处理退款申请(要显示“物流单号”输入框,方便管理员填写发货信息)
  • 用户端(核心功能):
    • 图书浏览:按分类筛选图书、查看图书详情(作者、简介、价格)、搜索图书(别让用户填太多!只留“书名搜索框”,我当初加了“作者+出版社”双筛选,用户嫌复杂)
    • 购物车操作:添加图书到购物车、修改购买数量、删除购物车商品(要校验库存!比如用户选10本但库存只有5本,得提示“库存不足”)
    • 订单管理:提交订单、选择收货地址、查看订单状态(支持按“订单时间”筛选,方便用户查历史订单)
    • 我的收藏:收藏心仪图书、查看收藏列表、取消收藏(要和图书表关联,图书下架后收藏里要同步提示)

2. 需求分析避坑指南(血泪教训!)

  • 别光靠“想”!找2个同学模拟用户提意见:比如有同学说“想在购物车直接改数量,不用重新添加”,我才加了“数量编辑”功能,比自己瞎加实用多了
  • 一定要画用例图!用DrawIO画简单版就行,标清“管理员-管理图书”“用户-提交订单”,后期跟导师汇报时,比光说“我要做XX功能”直观10倍(当初没画,导师听了10分钟还没get到我的逻辑)
  • 写“需求规格说明书”!不用太复杂,把“功能描述、约束条件”写清楚(比如“图书名称不能重复”“订单支付后才能发货”),后期编码时对着做,不会跑偏

3. 可行性分析别敷衍!3点写清楚就能过

导师超爱问“你这系统可行吗”,别只说“我觉得可行”,要从3个角度写,显得专业:

  • 技术可行性:Spring Boot、Java、MySQL都是课堂学过的,图书馆有《Spring Boot实战》《MySQL从入门到精通》,遇到问题能查资料(别选没学过的技术!我当初想试试Vue3,结果卡了一周环境配置,最后换回JSP才顺利)
  • 经济可行性:所有工具都是免费的!IntelliJ IDEA(社区版)、MySQL、Tomcat全是官网下载,不用花钱买版权,答辩时说“开发成本为0”,导师会觉得你会控制成本
  • 操作可行性:界面用Bootstrap做,按钮布局跟京东、当当类似,我找系里老师测试,她3分钟就学会了下单,导师直接认可

二、技术选型别跟风!这套组合稳到爆

刚开始我跟风用Spring Boot+Vue+Redis,结果“库存缓存同步”卡了6天——Redis的key-value存储逻辑不熟,下单后库存没实时更新😫 后来换成Spring Boot+JSP+MySQL+Tomcat9,新手友好度直接拉满,调试效率翻了倍!

1. 技术栈详细对比(附避坑提醒)

宝子们别盲目选“最新技术”,稳定比炫酷重要!我整理了4个核心工具的选择理由和坑点,直接抄:

技术工具为啥选它避坑提醒!(重点!)
Spring Boot比SSM配置简单,自带Tomcat,不用手动整合别用最新版!Spring Boot 2.7.x就行,3.x版本和JSP兼容性差,会报“视图解析器错误”
MySQL 8.0占内存小,存储图书、订单数据足够用安装时一定要设“utf8mb4”编码!我当初用默认编码,图书名称有特殊符号时乱码,查了3小时才解决
Tomcat 9.0稳定!和Spring Boot、JSP适配性最好别用Tomcat 10!会出现“Servlet API包名变更”问题,答辩时崩了就完了
JSP+Bootstrap不用单独学前端框架,上手快Bootstrap用3.x版本!4.x版本栅格布局错乱,图书列表页会变成“竖排”,巨丑

2. 开发环境搭建(step by step 实操)

很多宝子卡在“环境配置”,其实跟着步骤来超简单,我当初就是这么搭的,一次成功:

  1. 装JDK 1.8:记住安装路径(比如D:\Java\jdk1.8.0_301),配置环境变量时“JAVA_HOME”要填对,不然IDEA认不到
  2. 装IntelliJ IDEA(社区版):选“Community Edition”,免费且够用,自带Spring Boot插件,不用手动装
  3. 装MySQL 8.0:用Navicat管理数据库(可视化工具超方便,新建表时直接选字段类型,比命令行快10倍)
  4. 配置Spring Boot项目:在IDEA里选“Spring Initializr”,勾选“Spring Web”“MySQL Driver”“MyBatis Framework”,直接生成项目结构,启动时看到“Started Application in XXX seconds”就是成功

3. 架构图一定要画!答辩加分项

用DrawIO画三层架构图(就像论文里的“图2.1 系统架构图”),标清“表现层-业务层-数据访问层”的交互逻辑:比如用户在浏览器提交订单→Controller接收请求→Service处理库存扣减→Mapper操作MySQL存储订单信息。去年答辩时,评委特意夸这个图“逻辑清晰”,比光说“我用了Spring Boot”专业多了!

三、数据库设计:别让表关联坑了你

这部分是毕设的“核心骨架”,我当初把“购物车表”和“图书表”没做关联,查“购物车商品详情”时要写3层嵌套SQL,调试到凌晨2点😫 后来按“实体-属性-关系”来设计,终于理清了。

1. 核心实体&属性(附ER图绘制技巧)

先确定系统里的“实体”(比如用户、图书、订单),再想每个实体有啥“属性”,别漏关键字段!我整理了必做的6张表,直接照着画ER图:

  • 用户表(user):id(主键)、username(用户名,唯一)、password(密码,MD5加密!不然存明文,导师会说“不安全”)、name(真实姓名)、phone(手机号)、address(默认地址)、create_time(注册时间)
  • 图书分类表(book_category):id(主键)、category_name(分类名称)、create_time(创建时间)
  • 图书表(book):id(主键)、category_id(关联分类表)、book_name(图书名称)、author(作者)、publisher(出版社)、cover(封面路径)、price(价格)、stock(库存)、introduction(简介)、click_num(点击量)
  • 购物车表(cart):id(主键)、user_id(关联用户表)、book_id(关联图书表)、buy_num(购买数量)、create_time(添加时间)
  • 订单表(order):id(主键)、order_no(订单编号,唯一)、user_id(关联用户表)、total_price(总价格)、status(订单状态:0待支付/1已支付/2已发货)、address(收货地址)、consignee(收货人)、phone(收货电话)、create_time(下单时间)
  • 收藏表(collection):id(主键)、user_id(关联用户表)、book_id(关联图书表)、create_time(收藏时间)

画ER图用Visio或亿图,记住3个规则:

  1. 矩形代表“实体”(比如“用户”“图书”)
  2. 椭圆代表“属性”(比如用户的“用户名”“手机号”)
  3. 菱形代表“关系”(比如“用户-购买-图书”是多对多,一个用户能买多本图书,一本图书能被多个用户买) 避坑提醒:别把“图书封面”存数据库!我当初直接存图片二进制,数据库炸了,后来改成存“文件路径”(比如/static/covers/book1.jpg)才对。

2. 数据库物理设计(附建表SQL示例)

ER图画好后,要转成实际的数据库表,字段类型和约束别瞎设!比如“库存”要用INT,别用VARCHAR,不然没法做减法;“订单编号”要设UNIQUE约束,避免重复。

给宝子们贴一段“图书表”的建表SQL,直接复制到Navicat就能用:

CREATE TABLE `book` (
  `id` INT NOT NULL AUTO_INCREMENT COMMENT '图书ID',
  `category_id` INT DEFAULT NULL COMMENT '关联分类ID',
  `book_name` VARCHAR(100) NOT NULL COMMENT '图书名称',
  `author` VARCHAR(50) DEFAULT NULL COMMENT '作者',
  `publisher` VARCHAR(50) DEFAULT NULL COMMENT '出版社',
  `cover` VARCHAR(255) DEFAULT NULL COMMENT '封面路径',
  `price` DECIMAL(10,2) NOT NULL COMMENT '价格',
  `stock` INT NOT NULL DEFAULT 0 COMMENT '库存',
  `introduction` TEXT DEFAULT NULL COMMENT '图书简介',
  `click_num` INT DEFAULT 0 COMMENT '点击量',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `fk_category` (`category_id`), -- 外键关联分类表
  UNIQUE KEY `uk_book_name` (`book_name`) -- 图书名称唯一
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='图书表';

3. 表关联测试!别等编码才发现错

建完表一定要测试关联是否正常!比如在“购物车表”插入一条数据(用户ID=1,图书ID=1),然后用JOIN查询:

SELECT u.username, b.book_name, c.buy_num, b.price
FROM cart c
JOIN user u ON c.user_id = u.id
JOIN book b ON c.book_id = b.id
WHERE u.id = 1;

如果能查出“用户名+图书名+购买数量+单价”,说明关联没问题;如果报错“Unknown column”,大概率是外键没设对,赶紧检查表结构。

四、功能实现:核心模块代码+页面设计

不用做所有功能!先搞定4个核心模块,答辩时足够出彩。每个模块我都附了代码片段和页面设计要点,宝子们直接套就行。

1. 管理员端:图书信息管理模块(必做!)

这是管理员最常用的功能,主要实现“添加图书、修改图书、删除图书”,重点说“图书库存修改”的逻辑——别漏了“库存不能为负”,我当初就是这里踩了大坑!

(1)核心代码片段(Spring Boot)

Service层(处理图书库存修改):

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookMapper bookMapper;

    @Override
    @Transactional // 事务管理,确保库存修改和日志记录同时成功或失败
    public void updateBookStock(Integer bookId, Integer stock) {
        // 1. 查询图书是否存在
        Book book = bookMapper.selectById(bookId);
        if (book == null) {
            throw new RuntimeException("图书不存在!");
        }
        // 2. 校验库存不能为负
        if (stock < 0) {
            throw new RuntimeException("库存不能为负数!");
        }
        // 3. 更新库存
        Book updateBook = new Book();
        updateBook.setId(bookId);
        updateBook.setStock(stock);
        bookMapper.updateById(updateBook);
    }
}

Controller层(接收前端请求):

@Controller
@RequestMapping("/admin/book")
public class AdminBookController {
    @Autowired
    private BookService bookService;

    @PostMapping("/updateStock")
    public String updateStock(Integer bookId, Integer stock, HttpServletRequest request) {
        try {
            bookService.updateBookStock(bookId, stock);
            request.setAttribute("msg", "库存修改成功!");
        } catch (Exception e) {
            request.setAttribute("msg", e.getMessage());
        }
        return "redirect:/admin/book/list";
    }
}
(2)页面设计要点(Bootstrap)

页面标题:管理员-图书信息管理页面
(插入图片位置:此处放“图书信息管理页面截图”,需包含以下元素)

  • 图书列表表格:
    • 列名:图书名称、分类、作者、出版社、价格、库存、操作
    • 库存显示:库存<10时标红,提醒补货
  • 新增/修改弹窗:点击“新增”或“修改”按钮弹出,包含:
    • 图书名称(输入框,必填)
    • 分类选择(下拉框,关联分类表,必填)
    • 作者/出版社(输入框,必填)
    • 价格/库存(数字输入框,库存默认0,必填)
    • 封面上传(文件选择框,支持JPG/PNG,提示“尺寸建议300*400”)
    • 图书简介(文本域,选填)
    • 按钮:“确认提交”(绿色btn-success)和“取消”(灰色btn-default)
  • 提示信息:红色字体显示“修改失败”,绿色显示“修改成功”
(3)避坑提醒
  • 图书名称要唯一!在Service层加校验:
    if (bookMapper.existsByBookName(book.getBookName(), book.getId()) > 0) {
        throw new RuntimeException("该图书名称已存在!");
    }
    
  • 封面上传要限制大小!在application.properties配置:
    spring.servlet.multipart.max-file-size=5MB
    spring.servlet.multipart.max-request-size=10MB
    

2. 用户端:订单提交模块(核心需求!)

用户用系统就是为了“买图书、查订单”,这个功能别搞复杂!流程要简单:购物车选商品→确认地址→提交订单→跳转支付,我当初加了“优惠券抵扣”功能,代码量翻倍,其实“原价支付”更简单。

(1)核心代码片段

Service层(处理订单提交,含库存扣减):

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private BookMapper bookMapper;

    @Override
    @Transactional
    public String submitOrder(Integer userId, String address, String consignee, String phone) {
        // 1. 查询用户购物车商品
        List<Cart> cartList = cartMapper.selectByUserId(userId);
        if (cartList.isEmpty()) {
            throw new RuntimeException("购物车为空,无法提交订单!");
        }
        // 2. 生成订单编号(时间戳+随机数)
        String orderNo = System.currentTimeMillis() + "" + (int)(Math.random()*1000);
        BigDecimal totalPrice = BigDecimal.ZERO;

        // 3. 遍历购物车,计算总价并校验库存
        for (Cart cart : cartList) {
            Book book = bookMapper.selectById(cart.getBookId());
            // 库存不足
            if (book.getStock() < cart.getBuyNum()) {
                throw new RuntimeException(book.getBookName() + "库存不足,当前库存:" + book.getStock());
            }
            // 累加总价
            BigDecimal itemPrice = book.getPrice().multiply(new BigDecimal(cart.getBuyNum()));
            totalPrice = totalPrice.add(itemPrice);

            // 4. 扣减库存
            book.setStock(book.getStock() - cart.getBuyNum());
            bookMapper.updateById(book);
        }

        // 5. 保存订单
        Order order = new Order();
        order.setOrderNo(orderNo);
        order.setUserId(userId);
        order.setTotalPrice(totalPrice);
        order.setStatus(0); // 0待支付
        order.setAddress(address);
        order.setConsignee(consignee);
        order.setPhone(phone);
        order.setCreateTime(new Date());
        orderMapper.insert(order);

        // 6. 清空购物车
        cartMapper.deleteByUserId(userId);

        return orderNo; // 返回订单编号
    }
}
(2)页面设计要点

页面标题:用户-订单提交页面
(插入图片位置:此处放“订单提交页面截图”,需包含以下元素)

  • 收货地址区:
    • 下拉选择已保存地址(关联用户表的默认地址)
    • “新增地址”按钮(弹窗添加新地址,自动设为默认)
  • 订单商品列表:
    • 列名:商品封面、商品名称、单价、数量、小计
    • 小计=单价×数量,自动计算
  • 订单总结区:
    • 显示“商品总价”(无运费,毕设简化)
    • “提交订单”按钮(绿色btn-success,点击后生成订单号并跳转支付页)
  • 提示信息:红色字体显示“库存不足”,绿色显示“订单提交成功,订单号:XXX”
(3)避坑提醒
  • 用事务保证数据一致性!比如库存扣减成功但订单保存失败时,要回滚库存:
    @Transactional(rollbackFor = Exception.class) // 出现任何异常都回滚
    
  • 订单编号要唯一!用“时间戳+随机数”生成,避免重复:
    String orderNo = System.currentTimeMillis() + "" + (int)(Math.random()*1000);
    

3. 管理员端:订单管理模块(提升专业性)

管理员需要“处理用户订单”,这个功能能体现系统的“完整性”,答辩时多提一句,导师会觉得你考虑周全。

页面设计要点

页面标题:管理员-订单管理页面
(插入图片位置:此处放“订单管理页面截图”,需包含以下元素)

  • 筛选条件:按“订单编号”模糊查询、按“订单状态”下拉筛选(待支付/已支付/已发货)
  • 订单列表表格:
    • 列名:订单编号、用户名、总价格、收货人、电话、下单时间、状态、操作
    • 状态显示:待支付(橙色)、已支付(蓝色)、已发货(绿色)
  • 发货操作:点击“发货”按钮弹出弹窗,输入物流单号,确认后更新订单状态为“已发货”

4. 用户端:购物车模块(答辩亮点!)

这个功能最能体现系统的“实用性”,导师超爱问!核心是“添加商品、修改数量、删除商品”,别漏了“实时计算总价”,不然用户不知道要花多少钱。

页面设计要点

页面标题:用户-购物车页面
(插入图片位置:此处放“购物车页面截图”,需包含以下元素)

  • 购物车列表:
    • 列名:商品封面、商品名称、单价、数量(可编辑输入框,最小1)、小计、操作
    • 小计=单价×数量,修改数量后实时刷新
    • 操作:“删除”按钮(红色btn-danger)
  • 购物车底部:
    • 显示“商品总数”和“总价格”(自动计算)
    • “去结算”按钮(绿色btn-success,点击跳订单提交页)
  • 空购物车提示:购物车为空时显示“暂无商品,去逛逛→”(链接到图书列表页)

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五、测试别敷衍!这3步让答辩不翻车

很多宝子觉得“功能能跑就行”,结果答辩时评委一测试就出问题!我当初没测“库存为0时下单”的情况,导致用户能提交超库存订单,导师说“不符合电商逻辑”,当场扣了分😫 测试一定要针对性做!

1. 功能测试(必测3个模块)

别全测!重点测“核心功能”,我整理了测试用例表,直接填结果就行:

(1)订单提交功能测试(表1:订单提交测试用例)
测试场景操作步骤预期结果实际结果测试结论
购物车为空清空购物车→点击“去结算”提示“购物车为空,无法提交订单!”
库存不足购物车添加10本图书(库存5本)→提交订单提示“XXX图书库存不足,当前库存:5”
正常提交购物车添加2本图书(库存充足)→填地址→提交提示“订单提交成功,订单号:XXX”,购物车清空
(2)图书库存修改测试(表2:库存修改测试用例)
测试场景输入数据预期结果实际结果测试结论
库存为负图书ID=1,库存=-5→提交提示“库存不能为负数!”
图书不存在图书ID=999(不存在),库存=10→提交提示“图书不存在!”
正常修改图书ID=1,库存=20→提交提示“库存修改成功!”,列表显示库存20
(3)购物车操作测试(表3:购物车测试用例)
测试场景操作步骤预期结果实际结果测试结论
修改数量为0购物车选商品→数量改0→失去焦点提示“数量不能小于1”,自动恢复为1
删除商品购物车选商品→点击“删除”商品从购物车移除,总价格实时刷新
去结算(有商品)购物车有2件商品→点击“去结算”跳转到订单提交页,携带商品信息

2. 兼容性测试(容易忽略的点)

别只在自己电脑上测!答辩时评委可能用不同浏览器,我当初没测IE浏览器,结果购物车总价显示错乱,赶紧改了CSS才好:

  • 浏览器测试:Chrome、Firefox、Edge、IE11(重点测IE,兼容性最差)
  • 分辨率测试:1920×1080、1366×768(笔记本常用分辨率,别让页面出现横向滚动条)

3. 测试报告要写好!答辩加分

把测试结果整理成“测试报告”,包含“测试目的、测试范围、测试用例、测试结果、问题总结”,导师会觉得你“做事严谨”。比如:

  • 问题总结:“IE浏览器下购物车总价计算错误,已通过添加CSS的float: left解决;未登录能访问订单页,已加拦截器解决”
  • 测试结论:“核心功能(订单提交、库存修改、购物车操作)均通过测试,无严重bug;兼容性问题已修复,系统可正常使用”

六、答辩准备:3个加分小技巧

毕设不仅要做出来,还要说清楚!我当初准备了这3点,导师直接给了“良好”:

  1. 演示流程要顺畅:提前录好演示视频(怕答辩时系统崩),演示时按“用户浏览图书→加购物车→提交订单→管理员发货”的流程来,别跳步
  2. 重点讲“你解决了啥问题”:比如“一开始订单提交后库存没扣减,后来用Spring事务保证库存和订单数据一致,解决了超卖问题”,比光说“我用了Spring Boot”更有亮点
  3. 准备常见问题:导师大概率会问“为什么选Spring Boot不选SSM”“如果用户量变大,怎么优化”,提前准备好答案,比如“Spring Boot配置简单,适合快速开发;用户量变大的话,会加Redis缓存热门图书信息,减少数据库压力”

最后:毕设通关的小私心

以上就是基于Spring Boot的图书电子商务网站从0到1的全流程避坑干货!其实毕设没那么难,关键是找对方法,别盲目跟风做复杂功能。

需要核心源码(带注释,直接能跑)、数据库脚本(含测试数据)、ER图模板的宝子,评论区扣“图书电商”,我私发你;要是卡在某个模块(比如订单提交、库存修改),也可以留言,我看到必回!

点赞收藏这篇,下次找流程不迷路~祝宝子们毕设顺利,轻松毕业!😘