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

news2024/9/21 14:48:05

你能学到什么

  • 一个简单的项目——图书管理系统(浏览器:谷歌)
  • 基础版我们只做两个功能(因为其它的功能涉及的会比较多,索性就放在升级版里了,基础版先入个门)
      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 {
    //图书ID
    private 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.coloradmin.cn/o/1977358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华水2022年专升本计算机培养方案

华水2022年专升本计算机培养方案 文章目录 华水2022年专升本计算机培养方案计科第一学期第二学期第三学期第四学期 软工第一学期第二学期第三学期第四学期 计科 第一学期 通识必修课 大学外语线性代数离散数学 专业基础课 高级语言程序设计 专业选修课 Java 第二学期 通识…

我知道越来越多的专业摄影师在他们的修饰工作流程中使用 Portraiture,因为它可以让你在保持重要纹理的同时使皮肤非常光滑

Portraiture4.5新版功能亮点&#xff1a; 1. 高级皮肤修饰技术&#xff1a;4.5版本引入了更为先进的皮肤修饰算法&#xff0c;能够更自然地平滑皮肤&#xff0c;同时保留必要的皮肤纹理和细节&#xff0c;实现专业级别的人像修饰效果。 Portraiture4.5新版 2. 智能面部特征识…

计算机的错误计算(五十一)

摘要 探讨 的符号。 例1. 请确定 的符号[1]。 在计算过程中&#xff0c;若保留8位、16位、20位有效数字&#xff0c;则计算过程与结果分别如下: 若在Windows 10&#xff0c;Visual Studio 2010下计算&#xff1a; #include <math.h>double ysin(pow(2,(double)1…

Java11.0标准之重要特性及用法实例(二十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列…

(四)springboot2.7.6集成activit5.23.0之更换数据源

前面学习时&#xff0c;使用的内存数据库H2&#xff0c;实际使用时&#xff0c;一般会替换我们指定的数据库&#xff0c;这个时候要怎么配置呢&#xff1f; 1.查看activiti-spring-boot-starter-basic的spring.factories配置。 2.查看DataSourceProcessEngineAutoConfigurati…

诗意、甜美、可爱的水果:berry和cherry

我曾经在单词记忆的课上讲过&#xff0c;sweat(汗)和sweet(甜)的记忆之法&#xff0c;是甜这个单词sweet可以拟作甜丝丝来记忆&#xff0c;它是双写的-ee-结构&#xff0c;这样就能很好地与sweat相区别&#xff0c;同样desert(沙漠)和dessert(甜点)也是如此&#xff0c;和甜有关…

策略模式的一次应用

项目的需求是将一组图像按照相似度分类。 采用了模板匹配计算相似度的实现方式。 #include <opencv2/core.hpp> #include <openev2/core/utility.hpp> #include <opencv2/highqui.hpp> #include <openav2/imgproc.hpp> cv::Mat image matched; double …

基于微信小程序的游戏王交流平台设计与实现-计算机毕设 附源码 06533

基于微信小程序的游戏王交流平台设计与实现 摘要 本项目旨在设计并实现一款基于微信小程序的游戏王交流平台&#xff0c;旨在为广大游戏王爱好者提供一个交流互动的平台。通过该平台&#xff0c;用户可以分享游戏交流、分享卡片信息、参与线上比赛等活动&#xff0c;促进玩家之…

Python数据库连接全解析:5大方案实战对比

在本文中&#xff0c;我们将通过实际示例&#xff0c;深入探讨Python中5种主流的数据库连接方案。这些例子将帮助您更好地理解每种方法的特点和适用场景。 目录 不同方案说明1. DB-API&#xff1a;以sqlite3为例2. SQLAlchemy&#xff1a;ORM示例3. psycopg2&#xff1a;Postgr…

随身助手271个可用api接口网站php源码(随身助手API)

源码简介&#xff1a; 随身助手API&#xff0c;本次更新了271个可用接口&#xff0c;现在开源给大家使用&#xff0c;无后门无加密&#xff0c;放心使用。 {“标题”:”看图猜成语接口”,”小标题”:”随身助手API”,”地址”:”tianyi/LookIdiom.php”,”状态”:”正常”} {…

循环结构(三)——do-while语句

目录 &#x1f341;引言 &#x1f341;一、语句格式 &#x1f680;格式1 &#x1f680;格式2 &#x1f341;二、语句执行过程 &#x1f341;三、实例 &#x1f680;【例1】 &#x1f680;【例2】 &#x1f680;【例3】 &#x1f341;总结 &#x1f341;备注 &am…

升级学校管理方式!智慧校园学工系统期末评语功能详解

智慧校园学工系统的“期末评语”功能模块主要用于教师对学生一学期的学习表现进行全面评价&#xff0c;并给出个性化的反馈建议。这一模块旨在促进师生之间的沟通&#xff0c;帮助学生了解自己的学习情况和发展方向。 教师可以根据学生的学习态度、成绩变化、课堂参与度等方面…

TCP Analysis Flags 之 TCP Window Full

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

详解C/C++输入输出

前言 C/C输入输出很多&#xff0c;在不同的情况会用不同的输入输出&#xff0c;有的题目在输入时可能换一种输入输出就能不会TLE&#xff0c;有的输入可能要循环输入&#xff0c;但是可以换一种输入直接就能把所有数据输入进去。C/C有哪些常用的输入输出&#xff0c;在什么时候…

总线学习1--I2C

很久以前就听说总线这个词了&#xff0c;一直不懂&#xff0c;所以觉得很牛叉。。。这次有机会学习&#xff0c;就干脆一起看看吧。 1 环境介绍 说实话&#xff0c;计算机的学习最好还是有个环境&#xff0c;裸学真的要难一些。硬件学习其实难就难在搭环境&#xff0c;之前很多…

生物计算与纳米技术:交汇前沿的科学领域

在当今科技迅猛发展的时代&#xff0c;生物计算和纳米技术作为前沿科技领域的两个重要方向&#xff0c;正在逐渐融合并带来深远的影响。生物计算涉及使用生物系统进行计算和数据存储&#xff0c;而纳米技术则关注制造极小尺度的电子器件和材料科学。本文将深入探讨这两个领域的…

2.2 (1) 处理机调度

文章目录 处理机调度概念处理机调度层次高级调度&#xff08;作业调度&#xff09;中级调度&#xff08;内存调度&#xff09;低级调度&#xff08;进程调度/处理机调度&#xff09;三层调度的联系对比 进程调度的时机需要进行进程调度与切换的情况不能进行进程调度与切换的情况…

【Linux学习】文件系统 - 第一篇

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; &#x1f4d5;文章目录 &#x1f4da;基础知识铺垫&#x1f351;重新使用C语言文件接口---对比重定向&#x1f388;fopen函数&#x1f30f…

[云原生]三、Kubernetes(1.18)

主要内容: 1、kubernetes 简介 2、kubernetes 集群搭建  方式搭建  二进制方式搭建 3、 kubeadm kubernetes 核心技术  YAML 文件详解  kubectl 命令工具  Pod  Label  Controller 控制器 …

node.js使用NodeMachineID 生成唯一UUID和注意事项

node-machine-id用于获取或生成唯一的机器ID 如何使用 const { machineId, machineIdSync } require(node-machine-id) JSON.stringify(machineIdSync({original: true})) ;方法&#xff1a; machineIdSync 此函数同步获取操作系统本机UUID/GUID&#xff0c;默认情况下进行哈…