【Spring+MyBatis】_图书管理系统(下篇)

news/2025/2/24 0:43:36/

图书管理系统上篇、中篇如下:

【Spring+MyBatis】_图书管理系统(上篇)-CSDN博客

【Spring+MyBatis】_图书管理系统(中篇)-CSDN博客


目录

功能5:删除图书

6.1 约定前后端交互接口

6.2 后端接口

6.3 前端页面

6.4 单元测试

功能6:批量删除图书

7.1 约定前后端交互接口

7.2 后端接口

7.3 前端页面

7.4 单元测试


功能5:删除图书

6.1 约定前后端交互接口

接口定义:/Book/deleteBook;

参数:id;

返回内容:字符串。为空则表示删除成功,不为空则表示删除失败,并返回错误信息;

采用逻辑删除方式,即通过update操作实现,具体做法是将status置为0,令前端页面无法获取

接口定义:/Book/updateBook;

参数:id,status;

返回内容:字符串。为空则表示删除成功,不为空则表示删除失败,并返回错误信息;

6.2 后端接口

BookController类和BookService类中均无需新增方法,通过updateBook实现;

BookInfoMapper接口也无需新增方法声明,

仅需在单元测试后端接口时根据updateBook方法的对应路由并传递id和status=0;

在编写前端页面时将ajax的url置为updateBook方法的对应路由即可;

6.3 前端页面

在book_list.html页面增加:

 function deleteBook(bookId) {var isDelete = confirm("确认删除?");if (isDelete) {//删除图书$.ajax({type:"post",url: "/Book/updateBook",data: {id:bookId,status:0},success: function(result){if(result == ""){//    删除成功location.href="book_list.html";}else{//    删除失败alert(result);}}})}}

6.4 单元测试

1、通过Postman测试后端接口:

查看前端页面图书列表信息:

可见id=13的图书信息已经在前端页面不可见,

在服务器端查看日志:

查看数据库图书信息:

可见该图书信息并未真正删除,且status被置为0;

2、测试前端页面:

删除id=11的图书信息:

在数据库中查看图书信息:

可见数据库中该图书信息并未删除,且status被置为0;

功能6:批量删除图书

7.1 约定前后端交互接口

同功能5的删除单个图书即单个更新图书状态的思路,批量删除图书就是批量更新图书状态;

但当前实现的updateBook方法仅支持一个id作为参数,即接口不可复用,需单独编写接口;

接口定义:/Book/batchDelete;

参数:List<Integer> ids;

返回内容:字符串。为空则表示删除成功,不为空则表示删除失败,并返回错误信息;

7.2 后端接口

在BookController类中增加相关方法:

@RequestMapping("/batchDelete")public String batchDelete(@RequestParam List<Integer> ids){log.info("接收批量删除图书请求: 图书id:{}",ids);Integer  result=bookService.batchDelete(ids);if(result <=0){log.error("批量删除失败,图书id:{}",ids);return "批量删除失败,请联系管理员";}return "";}

在BookService类中增加相关方法:

    public Integer batchDelete(List<Integer> ids){Integer result=0;try{result=bookInfoMapper.batchDelete(ids);}catch (Exception e){log.error("批量删除图书失败:e{}",e);}return result;}

在BookInfoMapper接口中增加相关方法声明:

    Integer batchDelete(@Param("ids") List<Integer> ids);

为batchDelete方法配置对应xml文件的<update>标签:

<update id="batchDelete">update book_infoset status=0where id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></update>

注:使用集合作为参数时,若直接将元素用逗号连接作为参数传递会报错:

在Spring MVC传参部分曾有介绍,需使用@RequestParam注解:

【JavaEE】_Spring MVC项目使用数组与集合传参_java传参集合-CSDN博客文章浏览阅读1.2k次,点赞34次,收藏20次。本文介绍了在SpringMVC项目中如何使用数组和List接口进行参数传递,包括单个和多个同名参数处理,以及urlencode的应用。同时讲解了@RequestParam注解的使用,以确保正确接收和解析参数。 https://blog.csdn.net/m0_63299495/article/details/136489044

7.3 前端页面

 function batchDelete() {var isDelete = confirm("确认批量删除?");if (isDelete) {//获取复选框的idvar ids = [];$("input:checkbox[name='selectBook']:checked").each(function () {ids.push($(this).val());});console.log(ids);$.ajax({type: "post",url: "/Book/batchDelete?ids="+ids,success: function (result) {if(result == ""){//    删除成功location.href="book_list.html";}else{//    删除失败alert(result);}}});}}

7.4 单元测试

1、测试后端接口:

可在前端页面进行检查:

可见id为5和6的图书已经不可见;

查看服务器日志:

通过数据库查看图书信息:

可见id为5和6的图书的状态被置为0,且并未从数据库中删除;

2、测试前端页面:

查看服务器处日志:

 通过数据库查看id为5和6的图书信息,可见其status被置为0但并未从数据库删除:


http://www.ppmy.cn/news/1574513.html

相关文章

android 使用 zstd算法压缩文件

需要交叉编译 &#xff0c;流程如下 #1. 从GitHub拉取zstd源码 git clone https://github.com/facebook/zstd.git #2. 交叉编译Android版本的zstd cd build/cmake mkdir arm64-v8a cd arm64-v8a 设置ndk路径 export NDKxxx export ABIarm64-v8a export MINSDKVERSION30 设置…

构建 Next.js 应用时的安全保障与风险防范措施

在 Web 应用开发过程中&#xff0c;确保应用的安全性至关重要&#xff0c;这不仅能保护用户数据&#xff0c;还能防止应用本身遭受各种安全攻击。Next.js 作为一款备受欢迎的 React 框架&#xff0c;内置了许多安全功能和推荐做法&#xff0c;但开发者仍需清楚地了解潜在的安全…

Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复

一、日志管理 &#xff08;1&#xff09;基本介绍 日志文件是重要的系统信息文件&#xff0c;记录了如用户登录、系统启动、系统安全、邮件及各种服务等相关重要系统事件在安全方面&#xff0c;日志也至关重要&#xff0c;它能记录系统日常发生的各类事情&#xff0c;可用于检…

Day6 25/2/19 WED

【一周刷爆LeetCode&#xff0c;算法大神左神&#xff08;左程云&#xff09;耗时100天打造算法与数据结构基础到高级全家桶教程&#xff0c;直击BTAJ等一线大厂必问算法面试题真题详解&#xff08;马士兵&#xff09;】https://www.bilibili.com/video/BV13g41157hK?p4&v…

么是静态住宅IP,跨境电商为什么需要静态住宅IP

静态住宅IP是指直接分配给一台属于私人住宅网络的设备的固定IP地址&#xff0c;这种地址不会频繁更改。它们作为代理IP&#xff0c;使使用者能够通过这些代理服务器进行网络访问&#xff0c;而对外显示的则是该住宅的IP地址。由于这些IP地址属于真实的住宅或个人&#xff0c;并…

STM32MP157A单片机驱动--控制拓展版的灯实现流水效果

1.注册字符设备驱动 int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops) 功能&#xff1a;进行字符设备驱动的注册,申请了256个次设备号&#xff08;0-255&#xff09; 参数&#xff1a;major: >0:手动指定的当前驱动的主设…

百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合

不等了&#xff0c;就是现在&#xff01;百度搜索全量接入DeepSeek-R1满血版 百度搜索已正式全量接入DeepSeek-R1满血版&#xff0c;在宣布“将接入”仅过了24小时后。 就在宣布“将接入”仅24小时后&#xff0c;百度搜索 已正式全量接入 DeepSeek-R1满血版&#xff01;得益于…

目标跟踪(Object Tracking) vs. 目标识别(Object Recognition)

目标跟踪&#xff08;Object Tracking&#xff09; vs. 目标识别&#xff08;Object Recognition&#xff09; 目标跟踪和目标识别都是计算机视觉中的核心任务&#xff0c;但它们的目标、方法和应用场景有所不同。 1. 目标识别&#xff08;Object Recognition&#xff09; 概…