当前位置: 首页 > news >正文

项目四-图书管理系统

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 {//图书IDprivate 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("账号或密码不正确!!!");}}});}

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

未完!!!

相关文章:

  • AcWing 173.矩阵距离
  • Excel·VBA数组平均分组问题
  • Kubernetes 知识体系 系列一
  • Python最强自动化神器!
  • MySQL 日志:undo log、redo log、binlog 有什么用?
  • iPhone的iOS系统:定义移动智能体验,引领科技潮流之巅
  • iOS - Runtime-API
  • 【爬虫基础】第3讲 常见浏览器User-Agent大全
  • C++从入门到精通——命名空间
  • 记录 AI绘图 Stable Diffusion的本地安装使用,可搭建画图服务端
  • 41-Vue-webpack基础
  • 6、kubenetes 卷
  • RAFT:让大型语言模型更擅长特定领域的 RAG 任务
  • nodejs的线程模型和libuv库的基本使用
  • Swagger3探索之游龙入海
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • gops —— Go 程序诊断分析工具
  • Linux gpio口使用方法
  • mac修复ab及siege安装
  • pdf文件如何在线转换为jpg图片
  • PHP 小技巧
  • php面试题 汇集2
  • python学习笔记 - ThreadLocal
  • React系列之 Redux 架构模式
  • spring-boot List转Page
  • Sublime text 3 3103 注册码
  • TCP拥塞控制
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 多线程 start 和 run 方法到底有什么区别?
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分布式事物理论与实践
  • 复杂数据处理
  • 规范化安全开发 KOA 手脚架
  • 缓存与缓冲
  • 利用jquery编写加法运算验证码
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 爬虫模拟登陆 SegmentFault
  • 实现简单的正则表达式引擎
  • 我从编程教室毕业
  • 仓管云——企业云erp功能有哪些?
  • 函数计算新功能-----支持C#函数
  • 积累各种好的链接
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #宝哥教你#查看jquery绑定的事件函数
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (26)4.7 字符函数和字符串函数
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Python) SOAP Web Service (HTTP POST)
  • (编译到47%失败)to be deleted
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (九十四)函数和二维数组
  • (七)Java对象在Hibernate持久化层的状态
  • (十八)三元表达式和列表解析