【JavaEE进阶】 图书管理系统开发日记——壹

文章目录

  • 🌲序言
  • 🌴前端代码的引入
  • 🎋约定前后端交互接口
  • 🍃后端服务器代码实现
    • 🚩UserController.java
    • 🚩BookController.java
  • ⭕总结

🌲序言

该图书管理系统,博主将一步一步进行实现。一边学习新的知识,一边对该项目进行完善。

所以此时所用技术或方法不对的地方后面都会进行一系列的修改和提升,有心去的小伙伴可以跟着博主一起开始这一段旅程。

🌴前端代码的引入

关于前端相关代码的书写与修改,由于博主是搞后端的,所以博主这里就不讲解了,这里直接给出。

遇事问春风乄的gitee

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

前端界面展示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🎋约定前后端交互接口

我们先实现部分功能如下:

在这里插入图片描述
在这里插入图片描述

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

  1. 账号密码校验接⼝:根据输⼊⽤⼾名和密码校验登录是否通过

  2. 图书列表:提供图书列表信息

接⼝定义

[URL]
POST /user/login
[请求参数]
name=admin&password=admin
[响应]
true //账号密码验证成功
false//账号密码验证失败

图书列表展⽰

[URL]
POST /book/getList
[请求参数][响应]
返回图书列表
[
	{
		"id": 1,
		"bookName": "活着",
		"author": "余华",
		"count": 270,
		"price": 20,
		"publish": "北京⽂艺出版社",
		"status": 1,
		"statusCN": "可借阅"
	},
...
]

字段说明

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

🍃后端服务器代码实现

这里我们使用应用分层的思想,分别创建四个包如下:
在这里插入图片描述

  • controller:里面存放接收前端发送的请求,对请求进⾏处理,并响应数据的代码

  • service:里面存放处理具体的业务逻辑的代码。

  • dao:里面负责数据访问操作,包括数据的增、删、改、查

  • model:里面存放一些固体对象

接下来每个包下面创建以下文件
在这里插入图片描述

🚩UserController.java

UserController.java 里面存放的是登录相关的代码,负责实现登录用户名与密码的验证。这里并没有进行分层(后续会进行分层)

由于没有连接数据库,咱们这里只用字符串代替验证。访问路径遵守接口文档的规定即可。代码实现如下:

@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("遇事为春风乄".equals(name) && "666666".equals(password)){
            session.setAttribute("userName",name);
            return true;
        }
        //账号密码错误
        return false;
    }
}

🚩BookController.java

关于图书列表展示这里我做了一个应用分层

BookController.java这里面实现的图书列表信息的返回。具体实现逻辑我放在了BookService.java里面。

因为当前阶段并没有导入数据库,所以我们这里也是使用内存进行存储。并在BookDao.java进行了数据增加操作

对于Book类我放在了BookInfo.java中进行实现,并且在管理对象方面,使用了spring进行管理

代码实现较简单,这里就不进行讲解了。代码实现如下:
UserController.java

@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("遇事为春风乄".equals(name) && "666666".equals(password)){
            session.setAttribute("userName",name);
            return true;
        }
        //账号密码错误
        return false;
    }
}

BookController.java

@RequestMapping("/book")
@RestController
public class BookController {
    @Autowired
    private BookService bookService;
    @RequestMapping("/getList")
    public List<BookInfo> getList(){
       //获取数据
        List<BookInfo> books = bookService.getBookList();
        return books;
    }
}

BookService.java

@Component

public class BookService {
    @Autowired
    private BookDao bookDao ;
    public List<BookInfo> getBookList(){
        List<BookInfo> books = bookDao.mockData();
        for (BookInfo book:books){
            if (book.getStatus()==1){
                book.setStatusCN("可借阅");
            }else {
                book.setStatusCN("不可借阅");
            }
        }
        return books;
    }
}

BookDao.java

@Component
public class BookDao {
    /**
     * 数据Mock 获取图书信息
     * @return
     */
    List<BookInfo> books = new ArrayList<>();
    public List<BookInfo> mockData(){
        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;
    }
}

BookInfo.java

@Data
@Component
public class BookInfo {
    //图书ID
    private Integer id;
    //书名
    private String bookName;
    //作者
    private String author;
    //数量
    private Integer count;
    //定价
    private BigDecimal price;
    //出版社
    private String publish;
    //状态 0-⽆效 1-允许借阅 2-不允许借阅
    private Integer status;

    private String statusCN;
    //创建时间
    private Date createTime;
    //更新时间
    private Date updateTime;
}

⭕总结

关于《【JavaEE进阶】 图书管理系统开发日记——壹》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

秒懂Precision精确率、Recall召回率-附代码和案例

经常有同学目标检测评价指标含糊不清这次带你通俗易懂了解该知识 强烈推荐的博客&#xff1a; 更多有用知识&#xff0c;请点我 //☏:qq1309399183// 深度学习视觉必做项目 计算 precision&#xff08;精确率&#xff09;**和 recall&#xff08;召回率&#xff09;是评估分类…

Linux设备驱动开发学习笔记(等待队列,锁,字符驱动程序,设备树,i2C...)

1. 内核工具和辅助函数 1.1宏container_of container_of函数可以通过结构体的成员变量检索出整个结构体 函数原型&#xff1a; /* pointer 指向结构体字段的指针 container_type 结构体类型 container_field 结构体字段名称 返回值是一个指针 */ container_of(pointer, con…

智慧水务平台有哪些应用场景?

随着城市化进程的加速&#xff0c;城市水资源管理面临着越来越多的挑战。如何实现高效、智能的水资源管理&#xff0c;成为了城市管理者亟待解决的问题。智慧水务平台作为新一代信息技术在水务领域的深度应用&#xff0c;为城市水资源管理提供了全新的解决方案。 智慧水务平台的…

Tensorflow2.0笔记 - 基础数学运算

本笔记主要记录基于元素操作的,-,*,/,//,%,**,log,exp等运算&#xff0c;矩阵乘法运算&#xff0c;多维tensor乘法相关运算 import tensorflow as tf import numpy as nptf.__version__#element-wise运算&#xff0c;对应元素的,-,*,/,**,//,% tensor1 tf.fill([3,3], 4) ten…

动手学深度学习5 矩阵计算

矩阵计算--矩阵怎么求导数 1. 导数和微分2. 偏导数3. 梯度1. 向量-标量求导2. 向量-向量求导3. 拓展到矩阵 4. 链式法则5. 小结QA练习 课程安排&#xff1a; 视频&#xff1a;https://www.bilibili.com/video/BV1eZ4y1w7PY/?spm_id_fromautoNext&vd_sourceeb04c9a33e87ce…

如何选择第三方电子合同平台?

说起第三方电子合同平台大家可能有点不了解&#xff0c;陕西CA来给大家解释解释&#xff1a;第三方电子合同平台是一种提供电子合同服务的第三方机构&#xff0c;可以提供电子合同的签署、管理、存储、公证等服务&#xff0c;保障电子合同的有效性和合法性。 第三方电子合同平台…

vue 里 props 类型为 Object 时设置 default: () => {} 返回的是 undefined 而不是 {}?

问题 今天遇到个小坑&#xff0c;就是 vue 里使用 props 传参类型为 Object 的时候设置 default: () > {} 报错&#xff0c;具体代码如下 <template><div class"pre-archive-info"><template v-if"infoData.kaimo ! null">{{ infoD…

如何使用Docker本地部署Wiki.js容器并结合内网穿透实现知识库共享

文章目录 1. 安装Docker2. 获取Wiki.js镜像3. 本地服务器打开Wiki.js并添加知识库内容4. 实现公网访问Wiki.js5. 固定Wiki.js公网地址 不管是在企业中还是在自己的个人知识整理上&#xff0c;我们都需要通过某种方式来有条理的组织相应的知识架构&#xff0c;那么一个好的知识整…

用冒泡排序谈默认参数应用

前面在调用函数提到为了将信息打印到ofil中&#xff0c;前面提到的办法是 ofstream ofil("text_out1"); void bubble_sort(vector<int> vec){ } 在file scope中定义ofil&#xff0c;这是一个不受欢迎的举动。这样比较难在其他环境重用 一般的程序编写法则是&…

组态王软件安装教程6.51/6.53/5.55/6.60/7.5SP2版本组态软件

组态王软件是一款功能强大的工业自动化软件&#xff0c;以下是各个版本的主要特点&#xff1a; 组态王6.51&#xff1a;该版本是亚控科技在组态王6.0x系列版本成功应用后&#xff0c;广泛征询数千家用户的需求和使用经验&#xff0c;采取先进软件开发模式和流程&#xff0c;由…

私有仓库工具Nexus Maven如何部署并实现远程访问管理界面

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

服务器运维小技巧(一)——如何进行远程协助

服务器运维中经常会遇到一些疑难问题&#xff0c;需要安全工程师&#xff0c;或者其他大神远程协助。很多人会选择使用todesk或者向日葵等一些远控软件。但使用这些软件会存在诸多问题&#xff1a; 双方都需要安装软件&#xff0c;太麻烦需要把服务器的公钥/密码交给对方不知道…

.NetCore Flurl.Http 4.0.0 以上管理客户端

参考原文地址&#xff1a;Managing Clients - Flurl 管理客户端 Flurl.Http 构建在堆栈之上System.Net.Http。如果您熟悉HttpClient&#xff0c;那么您可能听说过这个建议&#xff1a;不要为每个请求创建一个新客户端&#xff1b;重复使用它们&#xff0c;否则将面临后…

C++ //练习 1.15 编写程序,包含第14页”再探编译“中讨论的常见错误。熟悉编译器生成的错误信息。

C Primer&#xff08;第5版&#xff09; 练习 1.15 练习 1.15 编写程序&#xff0c;包含第14页”再探编译“中讨论的常见错误。熟悉编译器生成的错误信息。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /******************…

Django关联已有数据库中已有的数据表

Django关联已有数据库中已有的数据表 兜兜转转&#xff0c;发现自己还得用Python写后端&#xff0c;无语。。。 在写Django项目时&#xff0c;一般是通过模型来创建表&#xff0c;以及通过ORM框架来实现数据的crud&#xff0c;现在的情况是&#xff0c;如果我们的数据表已经存…

在js文件中引入外部变量

需求背景: 有个ip地址需要在项目部署后修改为客户自己的,所以就把这个ip放到了外部进行管理,方便直接修改 实现方法: 第一步:在public文件夹下创建一个json文件,里面放的就是需要在外部进行管理,随时都可以修改的变量 第二步:在需要引变量的js文件中写入如下代码 结合第一步…

Javascript,到底要不要写分号?

小白随机在互联网上乱丢一些赛博垃圾&#xff0c;还望拨冗批评斧正。 要不要加分号&#xff1f; 先说结论&#xff1a;“不引起程序出错的前提下&#xff0c;加不加都可以&#xff0c;按自身习惯来。” 为什么JS可以不加分号&#xff1f; 实际上&#xff0c;行尾使用分号的风…

命令行参数环境变量和进程空间地址

文章目录 命令行参数环境变量进程地址空间 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 命令行参数 什么是命令行参数&#xff1f; 我…

【JavaEE进阶】 关于应用分层

文章目录 &#x1f38b;序言&#x1f343;什么是应⽤分层&#x1f38d;为什么需要应⽤分层&#x1f340;如何分层(三层架构)&#x1f384;MVC和三层架构的区别和联系&#x1f333;什么是高内聚低耦合⭕总结 &#x1f38b;序言 在我们进行项目开发时我们如果一股脑将所有代码都…

限流算法之固定窗口算法

文章目录 原理示例图 优缺点优点缺点 示例代码java 适用场景不推荐原因如下&#xff1a; 原理 固定窗口算法是一种常见的限流算法&#xff0c;它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内&#xff0c;对到达的请求进行计数&#x…