项目四-图书管理系统

news2024/9/24 9:23:18

1.创建项目

流程与之前的项目一致,不再进行赘述。

2.需求定义

需求:
1. 登录: ⽤⼾输⼊账号,密码完成登录功能
2. 列表展⽰: 展⽰图书

3.前端界面测试

无法启动!!!--->记得加入mysql相关操作记得在yml进行配置

配置后启动成功!!

我们在测试前端的时候同时可以对用户的需求进行分析。

3.1 需求分析

3.1.1 用户登录

3.1.2 图书列表 

根据需求可以得知, 后端需要提供两个接口
1. 账号密码校验接口: 根据输入用户名和密码校验登录是否通过
获取参数:用户名和密码
返回:true或者false
2. 图书列表: 提供图书列表信息
直接返回所有的图书数据

4.接口定义

4.1 登录接口

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

4.2 图书列表展示

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

5.服务器代码

5.1 建包

目前我们先建立四个包,

由于现在还没有引入数据库,

dao是mock的数据。

controller是表现层,

model是图书类,

逻辑是controller调用service(写一些逻辑代码),service调用controller。

5.2 建立数据类

5.2.1 图书添加接口

5.2.1.1 图书类(model)

//@Data 注解会帮助我们⾃动⼀些⽅法, 包含getter/setter, equals, toString等

package com.example.demo.model;
import lombok.Data;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.Date;
@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;
}
5.2.1.2 数据层(dao/mapper)

//数据访问层: 负责数据访问操作,包括数据的增、删、改、查

//mock了一些假信息

package com.example.demo.dao;

import com.example.demo.model.BookInfo;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class BookDao {
    public List<BookInfo> mockData(){
        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;
    }
}
5.2.1.3 业务逻辑层(service

业务逻辑层: 处理具体的业务逻辑

package com.example.demo.service;

import com.example.demo.dao.BookDao;
import com.example.demo.model.BookInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.awt.print.Book;
import java.util.List;

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

5.2.1.4 控制层(controller)
@RestController
@RequestMapping("/book")
public class BookController {
    @RequestMapping("/getList")
    public List<BookInfo> getList(){
        BookService bookService=new BookService();
        return bookService.getBookList();
    }
}
5.2.1.5 测试前端接口 

上面完成了图书页面展示,我们先来测试以下前端接口

成功!!!

5.2.1.6 前后端交互 

我们想要页面加载时就显示图书信息,可以直接写ajax相关语句

为了美观,我们定义一个函数,在函数内部写相关语句,在进行调用。

            getBookList();
            function getBookList() {
                $.ajax({
                    type: "post",
                    url: "/book/getList",
                    //我们想把相关语句,存入<tbody>内,循环
                    success: function(result){
                        console.log(result);//控制台进行打印,方便我们进行检查,看我们是否从服务器拿到信息,可以定位错误
                        if(result!=null){
                            var finalHtml="";
                            for(var book of result){
                                finalHtml += '<tr>';
                                finalHtml += '<td><input type="checkbox" name="selectBook" value="1" 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><div class="op">';
                                finalHtml += '<a href="book_update.html?bookId=' + book.id +'">修改</a>';
                                finalHtml += '<a href="javascript:void(0)" onclick="deleteBook('+book.id+')">删除</a>';
                                finalHtml += '</div></td>';
                                finalHtml += "</tr>";
                            }
                        }
                        $("tbody").html(finalHtml);
                    }
                });
            }

正确!!!

 5.2.2 用户登录接口

5.2.2.1 控制层
    @RequestMapping("/login")
    public Boolean login(String password, String admin, HttpSession session){
        //账号为空,错误
        if(!StringUtils.hasLength(password)||!StringUtils.hasLength(admin)){
            return false;
        }
        if("admin".equals(admin)&&"password".equals(password)){
            session.setAttribute("admin",admin);
            return true;
        }
        return false;
    }
5.2.2.2 测试

 成功!!!

5.2.2.3 前后端交互
 function login() {
            $.ajax({
                type: "post",
                url: "/user/login",
                data:{
                    admin: $("#userName").val(),
                    password: $("#password").val()
                },
                success: function(result){
                    if(result==true){
                        location.href = "book_list.html";
                    }else{
                        alert("账号或密码不正确!!!");
                    }
                }
            });
            
        }

输入密码正确,成功!!! 

未完!!!

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

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

相关文章

vue2高德地图选点

<template><el-dialog :title"!dataForm.id ? 新建 : isDetail ? 详情 : 编辑" :close-on-click-modal"false" :visible.sync"show" class"rv-dialog rv-dialog_center" lock-scroll width"74%" :before-close&q…

2024最新华为OD机试试题库全 -【二叉树计算】- C卷

1. 🌈题目详情 1.1 ⚠️题目 给出一个二叉树如下图所示: 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 1.2 �…

电平输入检测-定时器输入捕获

目录 一&#xff0c;引入 二&#xff0c;具体结构 三&#xff0c;实现步骤 四&#xff0c;PWM输入模式 一&#xff0c;引入 上篇博客&#xff0c;我们对于定时器的计数核心——时基单元作了细致的了解。这篇博文&#xff0c;我们来介绍定时器的四大功能模块之一——输入捕获…

无忧微服务:如何实现大流量下新版本的发布自由

作者&#xff1a;项良、十眠 微服务上云门槛降低&#xff0c;用好微服务才是关键 据调研数据显示&#xff0c;约 70% 的生产故障是由变更引起的。在阿里云上的企业应用如茶百道、极氪汽车和来电等&#xff0c;他们是如何解决变更引起的稳定性风险&#xff0c;实现了在白天高流…

如祺出行冲刺上市:三年被罚款270万元,销售费用远高于研发开支

3月26日&#xff0c;Chenqi Technology Limited&#xff08;如祺出行&#xff09;再次递交招股书&#xff0c;准备在港交所主板上市&#xff0c;中金公司、华泰国际、农银国际为其联席保荐人。据贝多财经了解&#xff0c;如祺出行曾于2023年8月递表。 相较于此前招股书&#xf…

稀碎从零算法笔记Day32-LeetCode:每日温度

算是引出“单调栈”这种数据结构&#xff0c;后面会用这个思想处理下接雨水问题 前言&#xff1a;单调栈模式匹配——题目中提到“求第一个最大/最小的元素” 题型&#xff1a;栈、单调栈、数组 链接&#xff1a;739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 来源…

企业数据资源入表全攻略:五步法助你轻松驾驭数据新时代

随着数字化浪潮的汹涌而至&#xff0c;企业数据资源已成为推动业务发展的核心动力。然而&#xff0c;如何将这些无形的数据资产转化为有形的企业价值&#xff0c;却是众多企业面临的难题。近日&#xff0c;有关部门发布的“企业数据资源‘五步法’入表路径解析暂行规定”&#…

YOLOv9 实战指南:打造个性化视觉识别利器,从零开始训练你的专属测试集

论文地址&#xff1a;YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information GitHub&#xff1a;WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information (github.com)…

Unity 背包系统中拖拽物体到指定位置或互换位置效果的实现

在Unity中&#xff0c;背包系统是一种常见的游戏系统&#xff0c;可以用于管理和展示玩家所持有的物品、道具或装备。 其中的拖拽功能非常有意思&#xff0c;具体功能就是玩家可以通过拖拽物品图标来移动物品在背包中的位置&#xff0c;或者将物品拖拽到其他位置或界面中&…

Q-Day提前?IBM警告:「量子+AI」将触发巨大风险!

Q-Day&#xff0c;即量子计算机强大到足以破解当前加密方案的时刻&#xff0c;原本被视为一个从近期到长期可能面临的挑战&#xff0c;而非刻不容缓的现实问题。然而&#xff0c;最新的研究发现似乎加速了这一天的到来。 IBM的研究团队在一篇论文中提出&#xff0c;混合量子经典…

linux 区别:mount 一个目录到另外一个目录,目录软链接 (*)

Linux命令200例&#xff1a;mount将文件系统挂载到指定目录下&#xff08;常用&#xff09; https://blog.csdn.net/qq_21891743/article/details/132220283 Linux磁盘卸载 https://blog.csdn.net/Mcy7ycM/article/details/124347504 能否通俗易懂&#xff0c;深入浅出地解释…

【数据结构】顺序表的实现——静态分配

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

ZNB20罗德与施瓦茨ZNB20网络分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 ZNB20 矢量网络分析仪具有高达 140 dB 的宽动态范围&#xff08;在 10 Hz IF 带宽时&#xff09;、低于 0.004 dB RMS 的低迹线噪声&#xff08;在 10 kHz IF 带宽时&#xff09;以及高达 的高输出功率13 dBm&#xff0c;可在…

Zabbix-告警

基本概念 一、介绍 自定义的监控项默认不会自动报警 首页也不会提示错误 需要配置触发器与报警动作才可以自动报警 二、触发器 表达式&#xff0c;如内存不足300M&#xff0c;用户超过30个等 当触发条件发生后&#xff0c;会导致一个触发事件 触发事件会执行某个动作 …

网络编程综合项目-多用户通信系统

文章目录 1.项目所用技术栈本项目使用了java基础&#xff0c;面向对象&#xff0c;集合&#xff0c;泛型&#xff0c;IO流&#xff0c;多线程&#xff0c;Tcp字节流编程的技术 2.通信系统整体分析主要思路&#xff08;自己理解&#xff09;1.如果不用多线程2.使用多线程3.对多线…

ssh 公私钥(github)

一、生成ssh公私钥 生成自定义名称的SSH公钥和私钥对&#xff0c;需要使用ssh-keygen命令&#xff0c;这是大多数Linux和Unix系统自带的标准工具。下面&#xff0c;简单展示如何使用ssh-keygen命令来生成具有自定义名称的SSH密钥对。 步骤 1: 打开终端 首先&#xff0c;打开我…

vue前端工程化

前言 本文介绍的是有关于vue方面的前端工程化实践&#xff0c;主要通过实践操作让开发人员更好的理解整个前端工程化的流程。 本文通过开发准备阶段、开发阶段和开发完成三个阶段开介绍vue前端工程化的整体过程。 准备阶段 准备阶段我将其分为&#xff1a;框架选择、规范制…

AI智能分析网关智慧食安监管系统方案

3.15晚会刚过不久&#xff0c;淀粉肠的“屈辱”终于得以洗清&#xff0c;但某些品牌奶茶、梅菜扣肉、预制菜等等&#xff0c;生产过程仍是触目惊心。如何提升食品安全管理水平&#xff0c;保障食品从生产到消费环节的质量和安全&#xff1f;TSINGSEE青犀智利用智能分析网关V4Ea…

mysql--事务四大特性与隔离级别

事务四大特性与隔离级别 mysql事务的概念事务的属性事务控制语句转账示例 并发事务引发的问题脏读脏读场景 不可重复读幻读幻读场景 事务的隔离级别读未提交读已提交可重复读&#xff08;MySQL默认&#xff09; 总结 mysql事务的概念 事务就是一组操作的集合&#xff0c;他是一…

x86的内存分段机制

8086 是 Intel 公司第一款 16 位处理器&#xff0c;诞生于 1978 年&#xff0c;所以说它很古老。 一.8086 的通用寄存器 8086 处理器内部共有 8 个 16 位的通用处理器&#xff0c;分别被命名为 AX、 BX、 CX、 DX、 SI、 DI、 BP、 SP。如下图所示。 “通用”的意思是…