当前位置: 首页 > article >正文

案例:图书管理

掌握图书管理案例的实现,能够使用Spring Boot整合Thymeleaf完成图书管理案例。

1.任务需求

 (1)项目使用Spring Boot整合Thymeleaf,项目展示的页面效果全部通过Thymeleaf的模板文件实现。

(2)查询所有图书。访问http://localhost:8080/book/list时,查询所有图书,并展示在页面中。

(3)选择性显示按钮。当Session中存在用户角色为“ADMIN”时,显示“新增”按钮,否则不显示该按钮。

(4)按条件查询图书。单击“查询”按钮时,根据搜索框中的查询条件查询对应的图书信息。

(5)借阅图书。当图书状态为可借阅时,对应的“借阅”按钮为可用状态,并且单击“借阅”按钮时,将当前申请借阅图书的编号异步发送到后台。

2.任务实现

(1)Spring Boot整合Thymeleaf

SpringBoot为Thymeleaf 提供了一系列默认配置,Spring Boot项目中只要引入Thymeleaf 的启动器,项目启动时就会自动进行对应配置,因此Spring Boot整合Thymeleaf只需在创建的Spring Boot项目中添加Thymeleaf 启动器即可。

(2)创建实体类

图书管理页面中包含2个实体对象,分别为用户实体和图书实体,并且当前还没有学习Spring Boot和持久层技术的整合,在此,选择通过一个类封装一些图书数据,页面展示的图书信息都从这个类中获取数据。需要创建用户类、图书类和数据类,具体代码如下所示。

import  java.io.Serializable;
public  class  User implements  Serializable {
private  String name; //用户名称
private  String role; //用户角色
public  User(String name, String role) {
this .name = name;
this .role = role;
}
public  String getName() {
return  name;
}
public  void  setName(String name) {
this .name = name;
}
public  String getRole() {
return  role;
}
public  void  setRole(String role) {
this .role = role;
}
}
import  java.io.Serializable;
public  class  Book {
private  Integer id; //图书编号
private  String name; //图书名称
private  String author; //图书作者
private  String press; //图书出版社private  String status; //图书状态public  Book(Integer id, String name, String author,String press, String status) {
this .id = id;
this .name = name;
this .press = press;
this .author = author;
this .status = status;
}public  Integer getId() {
return  id;
}public  void  setId(Integer id) {
this .id = id;
}public  String getName() {
return  name;
}public  void  setName(String name) {
this .name = name;
}public  String getPress() {
return  press;
}public  void  setPress(String press) {
this .press = press;
}public  String getAuthor() {
return  author;
}public  void  setAuthor(String author) {
this .author = author;
}public  String getStatus() {
return  status;
}public  void  setStatus(String status) {
this .status = status;
}@Override
public  String toString() {
return  "Book{" +
"id=" + id +
", name='" + name + ''' +
", author='" + author + ''' +
", press='" + press + ''' +
", status='" + status + ''' +
'
}';
}
}
import  java.util.ArrayList;
public  class  Data {
public  static  ArrayList<Book> getData(){
ArrayList<Book> books=new  ArrayList<>();
books.add(new  Book(1,"楚辞","屈原","中国文联出版社","0"));
books.add(new  Book(2,"纳兰词","纳兰性德","中国文联出版社","1"));
books.add(new  Book(3,"西游记","吴承恩","中国文联出版社","2"));
return  books;
}
}

 (3)创建控制器类

在控制器类中创建对应的方法接收和响应页面发送的请求,具体代码如下所示。

import  org.springframework.stereotype.Controller;
import  org.springframework.ui.Model;
import  org.springframework.web.bind.annotation.PathVariable;
import  org.springframework.web.bind.annotation.RequestMapping;
import  javax.servlet.http.HttpSession;
import  java.util.ArrayList;
@Controller
@RequestMapping("book")
public  class  BookController {
//获取所有图书信息
ArrayList<Book> books = Data.getData();
/**
* 查询所有图书
*/
@RequestMapping("list")
public  String findBook(Model model, HttpSession session){
session.setAttribute("user",new  User("zhangsan","ADMIN"));
model.addAttribute("books",books);
return  "books";
}
/**
*按条件查询图书
*/
@RequestMapping("search")
public  String searchBook(Book book,Model model,HttpSession session){
ArrayList<Book> bs=new  ArrayList<>();
String bname=book.getName();
String bauthor=book.getAuthor();
if (bname.isEmpty()&&bauthor.isEmpty()){
bs=books;
}else {
for  (Book b : books) {
if ((!bname.isEmpty()&&b.getName().contains(bname))||
(!bauthor.isEmpty()&&b.getAuthor().contains(bauthor))){
bs.add(b);
}
}
}
session.setAttribute("user",new  User("zhangsan","ADMIN"));
model.addAttribute("books",bs);
return  "books";
}
/**
*获取借阅图书的编号
*/
@RequestMapping("find/{id}")
public  String findBook(@PathVariable("id") Integer id){
System.out.println("申请借阅图书的id:"+id);
return  "books";
}
}

(4)创建模板文件

在resources\templates目录下创建名称为books的HTML文件作为模板文件,并将模板文件中通过Thymeleaf的属性和标准表达式引入样式文件,以及获取数据进行展示,具体代码如下所示。

<!DOCTYPE HTML><html xmlns:th="http://www.thymeleaf.org"><head><meta charset="utf-8"><title>图书管理</title><link rel="stylesheet" th:href="@{/css/bootstrap.css}"><link rel="stylesheet" th:href="@{/css/AdminLTE.css}"><link rel="stylesheet" th:href="@{/css/pagination.css}"><script th:src="@{/js/jquery.min.js}"></script></head><body><div class="box-body"><div class="pull-left" th:if="${#session.getAttribute('user').role =='ADMIN'}"><div class="btn-group"><button type="button" class="btn btn-default"> 新增</button></div></div><!--数据搜索 --><div class="pull-right"><div class="has-feedback"><form th:action="@{/book/search}" method="post">图书名称:<input name="name">&nbsp&nbsp&nbsp&nbsp图书作者:<input name="author">&nbsp&nbsp&nbsp&nbsp<input class="btn btn-default" type="submit" value="查询"></form></div></div><div class="table-box"><!-- 数据表格 --><table id="dataList" class="table table-bordered table-striped table-hover text-center"><thead><tr><th>图书名称</th><th>图书作者</th><th>出版社</th><th>图书状态</th><th>操作</th></tr></thead><tbody><th:block th:each="book : ${books}"><tr><td th:text="${book.name}"/></td><td th:text="${book.author}"></td><td th:text="${book.press}"></td><td><th:block th:if="${book.status == '0'}">可借阅</th:block><th:block th:if="${book.status =='1'}">借阅中</th:block><th:block th:if="${book.status =='2'}">归还中</th:block></td><td class="text-center"><button th:if="${book.status =='0'}" type="button" class="btn bg-olive btn-xs"th:onclick="findBookById([[${book.id}]]);"> 借阅</button><button th:if="${book.status =='1' ||book.status =='2'}" type="button"class="btn bg-olive btn-xs"disabled="true">借阅</button></td></tr></th:block></tbody></table></div></div></body><script>function findBookById(id) {$.get("/book/find/" + id)}</script></html>

 (5)测试图书管理

启动项目,在浏览器中访问http://localhost:8080/book/list查询所有图书信息。

 

在搜索框中输入查询条件后单击“查询”按钮,按条件查询图书信息,以查询图书名称中包含“辞”字的图书信息为例。

单击图书《楚辞》的“借阅”按钮,此时IDEA控制台中输出图书对应的id。

 

相关文章:

案例:图书管理

掌握图书管理案例的实现&#xff0c;能够使用Spring Boot整合Thymeleaf完成图书管理案例。 1.任务需求 &#xff08;1&#xff09;项目使用Spring Boot整合Thymeleaf&#xff0c;项目展示的页面效果全部通过Thymeleaf的模板文件实现。 &#xff08;2&#xff09;查询所有图书。…...

Docker和Dify学习笔记

文章目录 1 docker学习1.1 基本命令使用1.1.1 docker ps查看当前正在运行的镜像1.1.2 docker stop停止容器1.1.3 docker compose容器编排1.1.4 docker网络[1] 进入到容器里面敲命令[2] docker network ls[3] brige网络模式下容器访问宿主机的方式 2 Dify的安装和基础使用2.1 下…...

【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计

欢迎来到Java集合框架系列的第一篇文章&#xff01;&#x1f339; 本系列文章将以通俗易懂的语言&#xff0c;结合实际开发经验&#xff0c;带您深入理解Java集合框架的设计智慧。&#x1f339; 若文章中有任何不准确或需要改进的地方&#xff0c;欢迎大家指出&#xff0c;让我…...

VSCode创建VUE项目(四)增加用户Session管理

将用户信息存储或者更新到Session sessionStorage.setItem("userID",loginform.value.username); sessionStorage.setItem(loginTime, Date.now()); 获取Session信息 const storedUserInfo sessionStorage.getItem(userID); const loginTime sessionStorage.get…...

线性代数(1)用 excel 计算鸡兔同笼

线性代数excel计算鸡兔同笼 案例&#xff1a;鸡兔同笼问题的三种解法&#xff08;递进式教学&#xff09;一、问题描述二、方程式解法&#xff08;基础版&#xff09;步骤解析 三、线性代数解法&#xff08;进阶版&#xff09;1. 方程组转化为矩阵形式2. 矩阵求解&#xff08;逆…...

Qt中多线程

在Qt中实现多线程主要有两种常用方式&#xff1a;基于QThread的子类化和QObjectmoveToThread的Worker模式。以下是详细说明和示例代码&#xff1a; 1. 传统方法&#xff1a;继承 QThread&#xff08;适用于简单任务&#xff09; #include <QThread> #include <QDebug…...

Grokking System Design 系统设计面试问题

《Grokking the System Design Interview》列举了多个经典的系统设计题目,通常按照 不同的业务场景和技术难点 进行分类。以下是一些常见的分类和题目示例: 1. 社交网络类 设计 Twitter(支持关注/取关、推文、Feed 流) 设计 Facebook Messenger(即时聊天,支持在线/离线状…...

Android Launcher3 首屏图标锁定技术方案解析

一、需求背景与技术挑战 在Android 13系统定制开发中&#xff0c;需实现Launcher首屏图标固定功能。该需求需在以下技术维度进行突破&#xff1a; 拖拽事件拦截机制&#xff1a;需精准识别拖拽目标区域 布局层级判定&#xff1a;准确识别第一屏的布局标识 跨屏操作限制&…...

hubilder打包ios app, 并上传TestFlight

目录 一 前提条件 不是该项目成员解决 1. 直接找到该项目的管理人员去设置你的账号 2. 直接重新生成APPID(一般不建议的&#xff0c;可以查看) 3. 如果是离职人员&#xff0c;可以让他将项目权限转让出来 - 如何转让应用 - DCloud问答 未申请ios证书和描述文件 APP ID 的…...

AI实干家:HK深度体验-【第7篇-新加坡与香港家办业务对比】

PART I 家族办公室&#xff08;家办&#xff09;的定义与统计口径分析 家族办公室&#xff08;Family Office, FO&#xff09;的统计口径因地区、政策及数据来源差异而有所不同&#xff0c;需结合官方定义与第三方研究综合判断&#xff1a; 一、家办定义与统计口径 核心定义&…...

Java集成MQTT和Kafka实现稳定、可靠、高性能的物联网消息处理系统

Java集成MQTT和Kafka实现高可用方案 1. 概述 在物联网(IoT)和分布式系统中,消息传递的可靠性和高可用性至关重要。本文将详细介绍如何使用Java集成MQTT和Kafka来构建一个高可用的消息处理系统。 MQTT(消息队列遥测传输)是一种轻量级的发布/订阅协议,适用于资源受限的设备和…...

【总结篇】java多线程,新建线程有几种写法,以及每种写法的优劣势

java多线程 新建线程有几种写法,以及每种写法的优劣势 [1/5]java多线程 新建线程有几种写法–继承Thread类以及他的优劣势[2/5]java多线程-新建线程有几种写法–实现Runnable接口以及他的优劣势[3/5]java多线程 新建线程有几种写法–实现Callable接口结合FutureTask使用以及他的…...

剑指 Offer II 107. 矩阵中的距离

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20107.%20%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E8%B7%9D%E7%A6%BB/README.md 剑指 Offer II 107. 矩阵中的距离 题目描述 给定一个由 0 和 1 组成的矩阵 mat …...

雅可比行列式

定义和推导 雅可比行列式&#xff0c;它是以n个n元函数的偏导数为元素的行列式。以下是雅可比式的推导过程&#xff1a; 二阶雅可比式的推导以二重积分中的极坐标变换为例&#xff0c;设 &#xff1a; &#xff0c;则 x 和 y 的全微分分别为&#xff1a; 可以将 dx 与 dy 视作…...

UMA架构下的GPU 显存

GPU 显存 (Graphics Memory) 在大多数现代设备&#xff08;包括 Android 手机、嵌入式设备等&#xff09;上&#xff0c;确实是使用 DDR&#xff08;Double Data Rate SDRAM&#xff09; 类型的内存。 不过&#xff0c;具体实现方式根据硬件架构有所不同&#xff0c;主要分为以…...

【大模型基础_毛玉仁】3.2 上下文学习

目录 3.2 上下文学习3.2.1 上下文学习的定义3.2.2 演示示例选择1&#xff09;直接检索2&#xff09;聚类检索3&#xff09;迭代检索 3.2.3 性能影响因素 3.2 上下文学习 随模型训练数据规模和参数量的扩大&#xff0c;大语言模型涌现出了上下文学习&#xff08;In-Context Lea…...

在 ARM 嵌入式 Linux 下使用 C/C++ 实现 MQTT

在 ARM 嵌入式 Linux 下使用 C/C 实现 MQTT 通信是一个常见的需求&#xff0c;尤其是在资源受限的环境中。以下是一个详细的教程&#xff0c;使用 Eclipse Paho C Client 库来实现 MQTT 客户端。 1. 安装 Eclipse Paho C Client 库 Eclipse Paho C Client 是一个轻量级的 MQTT…...

Oraclelinux问题-/var/log/pcp/pmlogger/目录超大

有套19c rac环境&#xff0c;操作系统是oracle linux 8.10&#xff0c;日常巡检时发现/var/log/pcp/pmlogger/目录超大&#xff0c;如下 [rootdb1 ~]# du -sh /var/log/pcp/pmlogger/* 468G /var/log/pcp/pmlogger/db 1.3G /var/log/pcp/pmlogger/oracle06-106 754M /…...

【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证

背景&#xff1a; vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现&#xff1a; rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…...

学习笔记 ASP.NET Core Web API 8.0部署到iis

一.修改配置文件 修改Program.cs配置文件将 if (app.Environment.IsDevelopment()) {app.UseSwagger();app.UseSwaggerUI(); }修改为 app.UseSwagger(); app.UseSwaggerUI(); 二.安装ASP.NET Core Runtime 8.0.14 文件位置https://dotnet.microsoft.com/en-us/download/do…...

Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用

散点图:数据分析的利器 在数据分析领域,散点图是一种直观且强大的可视化工具,广泛应用于揭示变量间的相关性以及识别数据集中的异常值。本文将深入探讨散点图的这两种关键功能,并结合实际案例与Python代码示例,带您全面了解散点图的应用。 一、散点图如何展示变量间的相…...

第5章:Docker镜像管理实战:构建、推送与版本控制

第5章:Docker镜像管理实战:构建、推送与版本控制 作者:DogDog_Shuai 阅读时间:约25分钟 难度:中级 目录 第5章:Docker镜像管理实战:构建、推送与版本控制 目录1. 引言2. Docker镜像基础 2.1 镜像结构...

Microsoft Edge浏览器的取证分析(基于Chromium)

概述 早在2019年&#xff0c;微软就用Chromium替换了EdgeHTML浏览器引擎&#xff0c;这是微软支持谷歌Chrome浏览器的一个开源项目。通过切换到Chromium&#xff0c;Edge与Chrome浏览器共享一个共同的架构&#xff0c;这意味着用于Chrome浏览器调查的取证技术也适用于Edge。 …...

汽车一键启动系统使用方便,舒适出行,轻松匹配

汽车一键启动系统 系统定义 移动管家汽车一键启动系统是装置在智能汽车上的一部分&#xff0c;是实现简约打火和熄火过程的一个按钮装置。它可以在原车钥匙锁头的位置改装&#xff0c;也能独立面板改装&#xff0c;现在很多高低配置的车辆都可安装。 功能特点 基本功能 启…...

C语言复习笔记--数组

今天继续来浅浅推进一下C语言的复习,这次是数组的复习,话不多说,正文开始. 数组的概念 数组是⼀组相同类型元素的集合,一种自定义类型.数组中元素个数不能为0.数组分为⼀维数组和多维数组&#xff0c;多维数组⼀般⽐较多⻅的是⼆维数组. 下面从一维数组说起. 一维数组的创建和…...

海康SDK协议在智联视频超融合平台中的接入方法

一. 海康SDK协议详解 海康SDK协议原理 海康SDK协议是海康威视为开发者提供的一套软件开发工具包&#xff0c;用于与海康设备&#xff08;如摄像头、NVR、DVR等&#xff09;进行通信和控制。其核心原理包括&#xff1a; 网络通信&#xff1a;基于TCP/IP协议&#xff0c;实现设…...

腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践

项目背景与发展历程 在金融科技快速发展的今天&#xff0c;股票分析作为投资决策的核心环节&#xff0c;正面临数据量激增和复杂性提升的挑战。传统股票分析依赖人工处理&#xff0c;效率低下且成本高昂&#xff0c;而人工智能&#xff08;AI&#xff09;的引入为这一领域带来…...

深入解析 SQL Server 锁机制:如何定位并解决表锁问题

在 SQL Server 中&#xff0c;锁是并发控制的关键机制&#xff0c;确保数据的完整性和一致性。然而&#xff0c;在高并发环境下&#xff0c;锁可能导致阻塞甚至死锁&#xff0c;影响系统性能。因此&#xff0c;理解 SQL Server 的锁机制&#xff0c;并掌握如何定位和解决锁问题…...

Spring Boot 异步返回对象深度解析

前言 在现代高并发、高响应的应用场景中&#xff0c;Spring Boot 的异步处理能力是提升系统吞吐量和用户体验的关键技术之一。无论是实时数据推送、大文件传输&#xff0c;还是复杂异步任务调度&#xff0c;Spring Boot 提供了多种灵活的异步处理机制以满足不同需求。本文将从…...

【工具】C#防沉迷进程监控工具使用手册

一、软件简介 本工具用于监控指定进程的运行时长&#xff0c;当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒&#xff0c;帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…...