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

Spring Boot + jQuery 前后端分离图书管理系统:从接口设计到问题排查

基于 Spring Boot 和 jQuery 构建前后端分离图书管理系统,涵盖后端实体类设计、登录及列表接口开发、Mock 数据模拟策略,以及前端 AJAX 交互逻辑。重点解析调试过程中常见的 GET 与 POST 请求差异,强调参数位置、Body 格式一致性及安全性规范,帮助开发者快速定位接口联调问题并优化代码结构。

日志猎手发布于 2026/3/21更新于 2026/7/2134 浏览
Spring Boot + jQuery 前后端分离图书管理系统:从接口设计到问题排查

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

1. 项目准备与需求分析

这是一个相对完整的前后端分离案例,我们将从核心功能入手,先实现用户登录和图书列表展示。

文章配图

1.1 接口约定

登录接口

文章配图

图书列表展示

文章配图

字段说明:

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

2. 后端代码实现

2.1 实体类设计

首先定义 BookInfo 类,用于映射数据库中的图书信息。使用 Lombok 的 @Data 注解简化 Getter/Setter。

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

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

2.2 控制器开发

用户登录验证

在 UserController 中实现简单的登录逻辑,通过 Session 存储用户名。

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;
    }
}
获取图书列表

BookController 负责返回数据。初期为了演示方便,我们采用 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 数据的思考:

在实际开发中,环境可能不稳定或协同同事未完成接口时,Mock 数据能极大提升效率。将 Mock 逻辑封装成独立方法,不仅让代码整洁,后续接入真实数据库时也只需替换该方法内部逻辑,无需改动调用处。

3. 前端交互与调试

3.1 登录页逻辑

引入 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>

3.2 列表渲染优化

删除前端伪造的静态表格内容,改为动态获取后端数据并渲染。

function getBookList() {
    var finalHtml = '';
    $.ajax({
        type: "get",
        url: "/book/getList",
        success: function (result) {
            console.log(result);
            if (result != null) {
                for (var i = 0; i < result.length; i++) {
                    var book = result[i];
                    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);
            }
        }
    });
}

3.3 接口联调与问题排查

当效果不理想时,不要盲目改代码,先检查两端日志。

  1. 后端检查:使用 Postman 测试接口是否可达,确认参数接收是否正确,返回值是否符合预期。
  2. 前端检查:查看浏览器控制台 Console 日志,确认 Ajax 请求是否发送成功,响应数据格式是否匹配。

4. GET 与 POST 的实际区别

在实际开发中,GET 和 POST 的区别主要体现在参数位置和数据格式约定上,这也是面试和实战中的高频考点。

4.1 参数位置

  • GET:参数只能放在 URL 中(即 Postman 的 Params)。后端直接从 URL 解析,不存在格式歧义。
  • POST:参数既可以放在 URL,也可以放在 Body 中。实际开发中最常用的是 Body。

4.2 数据格式一致性

这是最容易踩坑的地方。一旦使用 POST 的 Body 传参,前后端必须严格约定格式:

  • 前端用 JSON,后端必须按 JSON 解析。
  • 前端用 form-data,后端也要用对应方式接收。
  • 前端用 x-www-form-urlencoded,后端也要对应。

否则会出现'前端传了,后端收不到'的经典问题。

4.3 语义与规范

  • 幂等性:GET 是幂等的,适合获取资源;POST 通常用于提交资源,非幂等。
  • 安全性:GET 参数暴露在 URL 中,不适合敏感信息;POST 参数在 Body 中,相对更安全(需配合 HTTPS)。
  • 缓存:缓存服务器通常只根据 URL 缓存 GET 请求。带 Body 的 GET 请求会导致缓存失效或行为异常。

虽然理论上 GET 可以带 Body,但大多数 HTTP 客户端、服务器和中间件(如 Nginx、CDN)并不支持,甚至直接丢弃。Postman 默认隐藏 GET 的 Body 输入框,正是为了引导开发者遵循最佳实践。

目录

  1. Spring Boot + jQuery 前后端分离图书管理系统实战
  2. 1. 项目准备与需求分析
  3. 1.1 接口约定
  4. 登录接口
  5. 图书列表展示
  6. 2. 后端代码实现
  7. 2.1 实体类设计
  8. 2.2 控制器开发
  9. 用户登录验证
  10. 获取图书列表
  11. 3. 前端交互与调试
  12. 3.1 登录页逻辑
  13. 3.2 列表渲染优化
  14. 3.3 接口联调与问题排查
  15. 4. GET 与 POST 的实际区别
  16. 4.1 参数位置
  17. 4.2 数据格式一致性
  18. 4.3 语义与规范
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于 Vue3 与 Django 的线上文献阅览平台
  • OpenClaw 和 Claude Code、Cursor、Copilot 有什么区别
  • 基于 AWS EC2 部署 ClawdBot 自建 AI 助手
  • Python 全栈开发与网络安全技术学习路径及实战指南
  • C++ 智能指针原理与核心实现解析
  • 基于 Trae 插件 Builder 模式开发包粽子小游戏
  • 前缀和算法详解:一维与二维前缀和
  • 大疆无人机开发实战:MSDK/PSDK/上云 API 指南
  • HQL 命名参数与 Query 接口的分页查询
  • 从 0 到 1 打造 RISC-V 智能家居中控:硬件固件通信全链路实战
  • SkyWalking Kafka 与 RabbitMQ 消息链路追踪实战
  • Windows 下安装 Python 的新思路:或许你根本不需要手动安装
  • LangChain 实战:工具调用与结构化输出
  • C++ 基础学习笔记(一)数据类型与 IO
  • Linux 进程概念:环境变量与进程地址空间
  • MySQL 用 ON DUPLICATE KEY UPDATE 做 Upsert
  • Java 对象比较:基本类型、equals 与排序接口
  • Spring Boot 核心模块详解:12 个模块功能与作用
  • 提升大模型系统体验的设计思路与方案
  • Whisper-Large-V3-Turbo:语音识别技术架构与性能分析

相关免费在线工具

  • 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