跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Java大前端java

Spring Boot + jQuery 前后端分离图书管理系统实战

Spring Boot 结合 jQuery 实现前后端分离的图书管理系统,涵盖接口设计、数据 Mock 策略及调试技巧。后端通过 Controller 处理登录与列表查询,利用模拟数据解耦开发流程。前端使用 Ajax 请求交互,重点解析 GET 与 POST 在参数传递、安全性及格式约定上的核心差异。文章提供实际排查思路,帮助开发者理解 HTTP 协议细节,避免常见的前后端对接问题,适合初中级 Java 全栈学习者参考。

AiEngineer发布于 2026/3/26更新于 2026/7/2336 浏览
Spring Boot + jQuery 前后端分离图书管理系统实战

Spring Boot + jQuery 前后端分离图书管理系统实战

项目概述与接口设计

这是一个基于 Spring Boot 和 jQuery 的前后端分离案例。虽然系统功能相对完整,但为了演示核心流程,我们重点实现用户登录和图书列表展示这两个模块。

1. 登录接口

用户需要输入账号密码进行验证。成功后后端返回布尔值,前端根据结果跳转页面或提示错误。

2. 图书列表展示

登录后进入图书管理页,主要展示书籍的基本信息。字段定义如下:

字段说明
id图书 ID
bookName图书名称
author作者
count数量
price定价
publish出版社
status状态 (1-可借阅,其他 - 不可借阅)
statusCN中文状态描述

后端实现细节

实体类定义

首先定义 BookInfo 实体,注意字段类型与业务逻辑的对应关系。

import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;

@Data
public class BookInfo {
    private Integer id;           // 图书 ID
    private String bookName;      // 书名
    private String author;        // 作者
    private Integer count;        // 数量
    private BigDecimal price;     // 定价
    private String publish;       // 出版社
    private Integer status;       // 状态 0-不允许借阅 1-允许借阅
    private String statusCN;      // 状态中文含义
    private Date createTime;      
     Date updateTime;      
}
// 创建时间
private
// 更新时间

Controller 层开发

登录验证

使用 HttpSession 存储登录态,简单校验账号密码。

import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("login")
    public boolean login(String name, String password, HttpSession session) {
        if (!StringUtils.hasLength(name) || !StringUtils.hasLength(password)) {
            return false;
        }
        // 实际项目中应查询数据库并加密比对
        if ("admin".equals(name) && "admin".equals(password)) {
            session.setAttribute("userName", name);
            return true;
        }
        return false;
    }
}
获取图书列表

这里先采用 Mock 数据模拟数据库返回,方便前端联调。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

@RequestMapping("/book")
@RestController
public class BookController {
    
    @RequestMapping("/getList")
    public List<BookInfo> getList() {
        List<BookInfo> books = mockData();
        // 处理状态显示文案
        for (BookInfo book : books) {
            if (book.getStatus() == 1) {
                book.setStatusCN("可借阅");
            } else {
                book.setStatusCN("不可借阅");
            }
        }
        return books;
    }

    /**
     * 数据 Mock 方法
     */
    public List<BookInfo> mockData() {
        List<BookInfo> books = new ArrayList<>();
        for (int i = 0; i < 15; i++) {
            BookInfo book = new BookInfo();
            book.setId(i);
            book.setBookName("图书" + i);
            book.setAuthor("作者" + i);
            book.setCount(new Random().nextInt(100));
            book.setPrice(new BigDecimal(new Random().nextInt(100)));
            book.setPublish("出版社" + i);
            book.setStatus(i % 5 == 0 ? 2 : 1);
            books.add(book);
        }
        return books;
    }
}

关于 Mock 数据的建议: 在开发初期,数据库可能尚未就绪,或者环境不稳定。此时直接写死一个 mockData 方法比到处复制粘贴代码要规范得多。后续接入真实数据库时,只需替换该方法内部逻辑即可,保持接口结构不变。

前端交互与调试

登录逻辑

使用 jQuery 发起 Ajax 请求,处理响应后控制页面跳转。

<script src="js/jquery.min.js"></script>
<script>
function login() {
    $.ajax({
        type: "post",
        url: "/user/login",
        data: {
            name: $("#userName").val(),
            password: $("#password").val()
        },
        success: function (result) {
            if (result) {
                location.href = "book_list.html";
            } else {
                alert("账号或密码不正确!");
            }
        }
    });
}
</script>

列表渲染

移除硬编码的 HTML,改为动态请求后端数据并拼接表格行。

function getBookList() {
    var finalHtml = '';
    $.ajax({
        type: "get",
        url: "/book/getList",
        success: function (result) {
            console.log(result);
            if (result != null) {
                for (var book of result) {
                    finalHtml += "<tr><td><input type='checkbox' name='selectBook' value='" + book.id + "'></td>";
                    finalHtml += "<td>" + book.id + "</td>";
                    finalHtml += "<td>" + book.bookName + "</td>";
                    finalHtml += "<td>" + book.author + "</td>";
                    finalHtml += "<td>" + book.count + "</td>";
                    finalHtml += "<td>" + book.price + "</td>";
                    finalHtml += "<td>" + book.publish + "</td>";
                    finalHtml += "<td><div>" + book.statusCN + "</div></td>";
                    finalHtml += "<td><a href='book_update.html?bookId=" + book.id + "'>修改</a>";
                    finalHtml += "<a href='javascript:void(0)' onclick='deleteBook(" + book.id + ")'>删除</a></td>";
                    finalHtml += "</tr>";
                }
                $("tbody").html(finalHtml);
            }
        }
    });
}

GET 与 POST 的核心差异

在实际开发中,很多新手容易混淆 GET 和 POST。其实区别主要体现在参数位置、数据格式约定以及语义上。

1. 参数传递位置

  • GET: 参数只能放在 URL 中(Query String)。例如 ?id=1&name=test。
  • POST: 参数可以放在 URL,也可以放在 Request Body 中。实际开发中最常用的是 Body。

2. 数据格式约定

这是最容易踩坑的地方。

  • GET: 因为参数都在 URL 里,后端解析方式固定,通常不会出现格式不一致的问题。
  • POST: 如果参数放在 Body 中,前后端必须严格约定格式。比如前端传 JSON,后端就得用 @RequestBody 接收;前端传表单数据,后端就得用 @RequestParam 或 @ModelAttribute。一旦格式对不上,就会出现'前端传了,后端收不到'的经典问题。

3. 安全性与长度限制

  • GET: 受 URL 长度限制,不适合传输大量数据。且参数暴露在地址栏,不适合敏感信息。
  • POST: 理论上无大小限制,参数在 Body 中,相对更安全(当然仍需配合 HTTPS)。

4. 语义与幂等性

  • GET: 语义是'获取资源',应该是幂等的(多次请求结果一致),适合缓存。
  • POST: 语义是'提交资源',通常不是幂等的(如创建订单),不建议缓存。

注意:虽然 HTTP 协议标准允许 GET 带 Body,但大多数浏览器、服务器中间件(如 Nginx)并不支持或会忽略它。Postman 等工具默认隐藏 GET 的 Body 输入框,正是为了引导开发者遵循最佳实践,避免兼容性问题。

排查思路总结

遇到前后端对接问题时,不要盲目改代码,按以下步骤检查:

  1. 抓包确认:使用 Postman 或浏览器 Network 面板,看请求是否真的发出去了,参数是否正确。
  2. 后端日志:在 Controller 入口打印参数,确认后端是否接收到数据。如果没收到,检查 Content-Type 或参数名拼写。
  3. 返回值检查:如果参数对了但结果不对,检查业务逻辑或数据库状态。
  4. 前端渲染:确认 Ajax 回调函数中的数据结构是否与预期一致,特别是数组遍历时的变量作用域问题。

目录

  1. Spring Boot + jQuery 前后端分离图书管理系统实战
  2. 项目概述与接口设计
  3. 1. 登录接口
  4. 2. 图书列表展示
  5. 后端实现细节
  6. 实体类定义
  7. Controller 层开发
  8. 登录验证
  9. 获取图书列表
  10. 前端交互与调试
  11. 登录逻辑
  12. 列表渲染
  13. GET 与 POST 的核心差异
  14. 1. 参数传递位置
  15. 2. 数据格式约定
  16. 3. 安全性与长度限制
  17. 4. 语义与幂等性
  18. 排查思路总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 英文论文 AI 率检测:IThenticate 与 Turnitin 系统对比
  • OpenClaw 本地极简部署与 QQ 机器人接入教程
  • 2024 年 AI 大模型行业报告:国内外格局与关键技术解析
  • AI 绘画描述关键词逻辑优化:从语义理解到生成效率提升
  • Elasticsearch 与 Kibana 时区及日期显示问题解析
  • LangChain Agent Skills 实战:构建 GitHub 仓库分析能力
  • Qwen2.5-VL 多模态模型 LoRA 微调实战:LLaMA-Factory WebUI 指南
  • ripgrep跨平台使用指南:Windows、macOS与Linux安装配置
  • Nginx 部署前端 Vue 项目实战指南
  • Python 构建跨平台前端界面:Flet 库详解
  • CSS 核心机制解析:层叠、继承与优先级实战
  • C++ STL 容器 vector 详解:定义、访问与操作
  • Web 触发离线升级:Systemd 异步机制与 A/B 状态机切换详解
  • 毕业论文如何降低 AI 检测率:实战经验与技巧指南
  • 前端面试核心知识点与常见问题整理
  • OpenClaw 接入通义千问、文心一言与 DeepSeek 配置指南
  • 计算机视觉高级应用与前沿技术发展
  • SBUS 协议详解:从原理、硬件接口到 STM32 代码实现
  • Seedance 2.0 多模态视频生成操作指南
  • ZeroClaw 开源:基于 Rust 的轻量级 AI Agent 框架

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online