项目实战_图书管理系统(简易版)

你能学到什么

  • 一个简单的项目——图书管理系统(浏览器:谷歌)
  • 基础版我们只做两个功能(因为其它的功能涉及的会比较多,索性就放在升级版里了,基础版先入个门)
      1. 登录: ⽤⼾输⼊账号,密码完成登录功能
      1. 列表展⽰: 展⽰图书
  • 升级版将会在下个博客发布

正文

成品效果展示

在这里插入图片描述

在这里插入图片描述

新建项目

在这里插入图片描述

前端代码准备

由于主做后端,写前端代码有些吃力,可以在我分享的网盘中拿到下面的前端文件
链接: https://pan.baidu.com/s/1J9LCqfNmpG6CKykj3l772A?pwd=qqu2
提取码: qqu2
在这里插入图片描述

测试前端代码

然后运行整个程序,使用浏览器,访问http://127.0.0.1:8080/login.html
看看是否能正常显示,也能访问其他html文件看看是否能正常显示。如果能正常显示就说明复制过来的前端代码没问题,不要计较前端加载的那些数据,那些都是假数据,后期那些代码是需要我们改的。

直接添加Mybatis依赖发生的问题

在这里插入图片描述
运行结果:

在这里插入图片描述

由于我们没有配置数据库信息,所以会发生报错,解决方案:

  • 1,配置数据库信息
  • 2,先将Mybatis的依赖删掉,在用的时候在手动添加上,再配置数据库(注意无论是删除还是添加,最好每进行一步刷新一次Maven,这样就不会有缓存问题了)

这两个就是Mybatis的依赖:
在这里插入图片描述

编写后端代码

需求分析

根据需求可以得知, 后端需要提供两个接⼝

  1. 登录账号密码校验接⼝: 根据输⼊⽤⼾名和密码校验登录是否通过
  2. 图书列表: 提供图书列表信息

登录接口

在这里插入图片描述

有了需求文档我们就知道了下一步该做什么,要想验证密码和用户名正不正确,前端肯定会向后端发送用户名和密码。此时我们只需要将用户传过来的用户名和密码和我们存储的用户名和密码对比,如果相同就返回true,反之,返回false。
这里为了方便起见我们就先将用户名和密码写死
name:zhangsan
password:123456
接下就是写代码了,为了实现应用分层,我还是在Controller包里写controller代码

package com.example.blogssystems_blogs.Controller;import jakarta.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
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("zhangsan".equals(name) && "123456".equals(password)){//如果正确,就将该信息储存在session里session.setAttribute("username",name);return true;}return false;}}

测试登录代码

我们使用Postman来测试一下
在这里插入图片描述

图书列表展示接口

在这里插入图片描述
接下来就是获取图书列表接口了,我们知道要想返回图书信息,我们得先有一个图书类啊,用来描述图书

在这里插入图片描述
图书实体类代码:

package com.example.blogssystems_blogs.model;import lombok.Data;import java.math.BigDecimal;
import java.util.Date;@Data
public class BookInfo {//图书IDprivate Integer id;//书名private String bookName;//作者private String author;//数量private Integer count;//定价,BigDecimal有兴趣的可以查一查这个类型private BigDecimal price;//出版社private String publish;//状态 0-⽆效 1-允许借阅   2-不允许借阅private Integer status;//statusCN是根据status来改变的,比如:status是0——》statusCN就是 “不可借阅”//                                 status是1——》statusCN就是 ”可借阅“//                                 status是2——》statusCN就是 “不可借阅”//本质上statusCN这个属性就是根据status的状态来改变对前端页面的显示(反过来想一想:你总不可能在前端直接显示0,1,2吧//或者如果你直接使用statusCN,那样传参会很麻烦,之后升级版会有更简单的方法(使用枚举))private String statusCN;//创建时间,这里的Date是util包里的(先用起来,下面会说)private Date createTime;//更新时间private Date updateTime;
}
  • BigDecimal 的官方文档
    在这里插入图片描述
    其实说人话:BigDecimal就是精确的小数,可以和BigInteger类比一下,至于多精确,那还得看官方文档,这里就不深究了。
  • 这是Date的官方文档
    在这里插入图片描述

图书类都创建好了,接下来就是提供图书信息的功能了

package com.example.blogssystems_blogs.Controller;import com.example.blogssystems_blogs.model.BookInfo;
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  =  mockBookData();//在这里就将StatusCN用上了,就是这样用的for (BookInfo book: books) {if(book.getStatus() == 1){book.setStatusCN("可借阅");}else{book.setStatusCN("不可借阅");}}return books;}//创建一个假的图书列表,由于我们还没有引进数据库,所以就先将就一下private List<BookInfo> mockBookData() {List<BookInfo> books = new ArrayList<>();for (int i = 0; i < 5; i++) {BookInfo book = new BookInfo();book.setId(i);book.setBookName("书籍" + i);book.setAuthor("作者" + i);book.setCount(i * 5 + 3);book.setPrice(new BigDecimal(new Random().nextInt(100)));book.setPublish("出版社" + i);book.setStatus(1);books.add(book);}return books;}
}

测试图书列表接口代码

我们还是使用Postman来发送请求。
可以看到没有任何问题
在这里插入图片描述

前端代码修改

前端登录

后端的代码确保正确了以后,就该修改前端代码了。由于我提供的前端代码只是个框架,所以还需要修改
我们先修改前端的登录页面:
前端只需要修改login函数里的代码就行了。

    <script>function login() {$.ajax({type:"post",url:"user/login",data:{name:$("#userName").val(),password:$("#password").val()},//ret是后端的返回值,如果是true说明账号密码正确,跳转至图书列表页面success:function (ret){if(ret == true){location.href = "book_list.html"}else{alert("账号或密码错误")}}});}</script>

测试前端登录代码

在这里插入图片描述

前端图书展示

在这里插入图片描述
代码:

function getBookList() {$.ajax({type:"post",url:"book/getList",success:function (ret) {if(ret != null){var finalHtml = "";for (var book of ret) {finalHtml+="<tr>";finalHtml+="<td><input type=\"checkbox\" name=\"selectBook\" value=\"+book.id+\" id=\"selectBook\" class=\"book-select\"></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>"+book.statusCN+"</td>";finalHtml+="<td>";finalHtml+="<div class=\"op\">";finalHtml+="<a href=\"book_update.html?bookId=4\">修改</a>";finalHtml+="<a href=\"javascript:void(0)\" οnclick=\"deleteBook(4)\">删除</a>";finalHtml+="</div>";finalHtml+="</td>";finalHtml+="</tr>";}$("tbody").html(finalHtml);}}});

测试图书展示代码

可以看到图书的显示没有任何问题
在这里插入图片描述

  • 注意:
    在这里插入图片描述

简易版只实现上述两个功能,如有兴趣还请看下一期的升级版,升级版将会实现页面上的各个功能,以及解决统一事务的处理方式。

一个小瑕疵

由于我的大意,将图书管理系统BooksSystem的名字起成了博客系统BlogsSystem,在写的时候我竟然一点都没有察觉,写完了才发现名字起的不对,如果要改,截图就都要一起改了,成本有点大,再加上最近也在准备升级版,希望大家见谅,凑合着看,很抱歉,以后我一定会严于律己,不再马虎的。出错的只有名字,不耽误图书管理的功能的,大家可以放心看内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392381.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

登录相关功能的优化【JWT令牌+拦截器+跨域】

登录相关功能的优化 登录后显示当前登录用户el-dropdown: Element - The worlds most popular Vue UI framework <el-dropdown style"float: right; height: 60px; line-height: 60px"><span class"el-dropdown-link" style"color: white;…

音视频开发 sdl库

介绍 SDL (Simple DirectMedia Layer) 是一个跨平台的开源多媒体库,它提供了底层访问多种硬件的接口,如音频、视频、输入设备等。它主要用于游戏开发,但也可用于其他类型的多媒体应用程序。下面是 SDL 的一些主要特点: 跨平台性: SDL 支持多种操作系统,包括 Windows、macOS、L…

HashMap中 put()方法的流程、扩容的思路(源码分析~)

文章目录 put() 方法的流程扩容流程为什么它会按照2的幂次方进行扩容呢&#xff1f; put() 方法的流程 下面我们通过分析源码来总结一下 put() 方法的流程 扩容流程 根据上图的分析&#xff0c;就可以总结出 HashMap 的扩容流程&#xff1a; 在插入元素时&#xff0c;会先…

C# 设计模式之原型模式

总目录 前言 在软件系统中&#xff0c;当创建一个类的实例的过程很昂贵或很复杂&#xff0c;并且我们需要创建多个这样类的实例时&#xff0c;如果我们用new操作符去创建这样的类实例&#xff0c;这未免会增加创建类的复杂度和耗费更多的内存空间&#xff0c;因为这样在内存中…

复现一下最近学习的漏洞(sqlab 1-10)

第一个问题&#xff1a;为什么不能用#来闭合单引号呢&#xff1f; 在进行URL地址栏传参的时候&#xff0c;是有一套编码规范的。他不会编码英文、数字和某些符号。但是#它会进行编码。也就是%23。&#xff08;先转ascii码&#xff0c;然后再转十六进制&#xff0c;之后加上%就是…

软甲测试定义和分类

软件测试定义 使用人工和自动手段来运行或测试某个系统的过程&#xff0c;其目的在于检验他是否满足规定的需求或弄清预期结果与实际结果之间的差别 软件测试目的 为了发现程序存在的代码或业务逻辑错误 – 第一优先级发现错误为了检验产品是否符合用户需求 – 跟用户要求实…

函数实例讲解(四)

文章目录 提取不重复值&#xff08;INDEX、MATCH、COUNTIF&#xff09;1、INDEX2、MATCH3、COUNTIF 提取不重复的值的经典套路&#xff08;LARGE、SMALL、ROW&#xff09;1、ROW2、LARGE3、SMALL&#xff09; 制作Excel动态查询表四舍五入函数(ROUND、ROUNDUP、ROUNDDOWN&#…

20240806 每日AI必读资讯

英伟达最强AI芯片曝重大设计缺陷&#xff0c;中国特供版意外曝光&#xff01; - 由于Blackwell GPU的设计缺陷&#xff0c;英伟达发货时间不得不推迟3个月 - GB200包含了2个Blackwell GPU和1个Grace CPU。问题出在连接2个Blackwell GPU的关键电路 - 意味着对于Meta、谷歌、微…

AI在医学领域:医学成像中针对深度神经网络(DNN)的对抗性攻击及其防御策略

关键词&#xff1a;对抗性攻击、医学图像、深度神经网络、模型安全、鲁棒性 机器学习&#xff08;ML&#xff09;是医学领域快速发展的一个分支&#xff0c;它利用计算机科学和统计学的方法来解决医学问题。众所周知&#xff0c;攻击者可能通过故意为机器学习分类器创建输入来…

VoNR网络架构与网元 IMS终端号码结构(VoLTE和VoNR适用)

目录 1. VoNR网络架构与网元 1.1 VoNR架构 vs VoLTE架构 1.2 回顾语音网络的演进与“分离” 1.3 TS23.228给出的5G的VoNR国际漫游 Home Routed 方案架构图 1.4 VoNR 网络架构图&#xff08;2022版&#xff09; 1.5 IMS 网元分类&#xff08;VoNR VoLTE 适用&#xff09…

LlamaIndex 实现 React Agent

React Agent 是指 LLM 对问题自行推理并调用外部工具解决问题&#xff0c;如下图所示&#xff0c;通过一些推理步骤最终找到想要的答案。 LlamaIndex 提供了实现 React Agent 的框架&#xff0c;通过框架可以轻松的实现上图中的步骤。那么&#xff0c;如果不用 LlamaIndex 应该…

【精选】6款一键生成论文的软件3000字论文网站

千笔-AIPassPaPer是一款功能强大且全面的AI论文写作工具&#xff0c;特别适合学术研究者和学生使用。它不仅能够一键生成高质量的论文初稿&#xff0c;还涵盖了700多个学科专业方向&#xff0c;满足各种学术需求。 一、千笔-AIPassPaPer 传送门&#xff1a;https://www.aipape…

汇昌联信数字做拼多多运营怎么入行?

拼多多作为中国领先的电商平台之一&#xff0c;近年来在数字运营领域展现出了强大的生命力和创新能力。汇昌联信数字作为一个潜在的新入行者&#xff0c;如何进入拼多多的运营领域&#xff0c;成为业界关注的焦点。本文旨在探讨汇昌联信数字如何通过有效的策略和方法&#xff0…

AttributeError: ‘ChatGLMTokenizer‘ object has no attribute ‘sp_tokenizer‘. 已解决

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

3GPP入门

官网地址 3GPP – The Mobile Broadband Standard 协议下载链接 Directory Listing /ftp/specs/archive 总纲 重点series Signalling protocols ("stage 3") - user equipment to network24 series信令Radio aspects25 series3G 基础LTE (Evolved UTRA), LTE-Adva…

锂电池生产工艺数字化的业务架构.pptx

搜索《方案驿站》公众号进行下载。

【AI落地应用实战】Amazon Bedrock + Amazon DynamoDB 数据设计与建模

一、Amazon DynamoDB简介 在当今数字化转型的浪潮中&#xff0c;企业对数据处理能力的需求日益增长&#xff0c;为了应对大规模数据和高并发访问的挑战&#xff0c;选择一款合适的数据库解决方案变得尤为重要。 Amazon DynamoDB&#xff0c;作为亚马逊云科技提供的一种完全托…

3.表的操作

目录 创建表 创建表案例&#xff1a; 查看表结构 修改表 1.增加新列 2.修改列的属性 3.删除列 4.修改表名 5.修改列 删除表 创建表 语法&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释信息],field2 datatype2 [COMMENT 注释…

k8s(六)---pod

六、pod&#xff08;k8s中最小的调度单元&#xff09; pod中可以有一个或多个容器 1、官网 2、简介 Pod是k8s中最小的调度单元、Pod具有命名空间隔离性 3、如何创建一个Pod资源&#xff08;主要两种方式&#xff09; 1&#xff09;kubctl run ①kubectl run nginx–imagereg…

【vulnhub】DC-2靶机

信息收集 靶机扫描 nmap 192.168.93.1/24 端口扫描 网页访问 发现访问不到&#xff0c;根据显示考虑IP未遵循重定向到域名 在本机的C:\Windows\System32\drivers\etc 修改hosts⽂件&#xff0c;添加192.168.93.136 dc-2 再次进行访问&#xff0c;可以访问到 点击flag&#x…