导航:

pre:  5.读者管理

next:7.借阅图书

只挑重点的讲,具体的请看项目源码。

1.项目源码

需要源码的朋友,请捐赠任意金额后留下邮箱发送:)

2.页面设计

2.1 book.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<title>图书管理</title>
<link rel="stylesheet" href="/static/layui/css/layui.css" th:href="@{/static/layui/css/layui.css}">
</head> <body>
<input type="text" id="ctx" hidden="hidden" th:value="${#request.getContextPath()}">
<!-- 内容主体区域 -->
<div>
<div class="search-div">
<div class="">
<div class="layui-inline">
<label class="layui-form-label">名称:</label>
<div class="layui-input-inline">
<input class="layui-input" id="name" name="name" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">ISBN:</label>
<div class="layui-input-inline">
<input class="layui-input" id="isbn" name="isbn" autocomplete="off">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">作者:</label>
<div class="layui-input-inline">
<input class="layui-input" id="author" name="author" autocomplete="off">
</div>
</div> <button class="layui-btn" data-type="reload" id="search">搜索</button>
</div> </div> <table id="tb-book" lay-filter="tb-book"></table> </div> <!--编辑表单-->
<script type="text/html" id="book-toolbar">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="add"><i class="layui-icon"></i>新增</button>
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="remove"><i class="layui-icon"></i>删除
</button>
<button class="layui-btn layui-btn-sm" lay-event="refresh"><i class="layui-icon"></i>刷新
</button>
</div>
<!--<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button>
<button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button>
<button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button>
</div>-->
</script> <script type="text/html" id="barOps">
<a class="layui-btn layui-btn-sm" lay-event="edit"><i class="layui-icon"></i> </a>
</script> <script src="/static/js/jquery-1.11.3.min.js" th:src="@{/static/js/jquery-1.11.3.min.js}"></script>
<script src="/static/layui/layui.all.js" th:src="@{static/layui/layui.all.js}"></script>
<script src="/static/js/util.js" th:src="@{/static/js/util.js}"></script> <!--ctx-->
<script th:replace="~{fragment::ctx}"/> <script>
var element, layer, laydate, table, form,userTable; function reload(){
userTable.reload();
} $(function () {
// 使用模块
layui.use(['element', 'layer', 'laydate', 'table', 'form'], function () {
element = layui.element;
layer = layui.layer;
laydate = layui.laydate;
table = layui.table;
form = layui.form;
}); //第一个实例
userTable = table.render({
elem: '#tb-book'
, height: 515
, url: ctx+'api/book/list' //数据接口
, page: true //开启分页
, toolbar: '#book-toolbar'
,id: 'tb-book'
/*,request: {
pageName: 'pageNo' //页码的参数名称,默认:page
,limitName: 'pageSize' //每页数据量的参数名,默认:limit
}
, response: {
statusName: 'code', //规定返回的状态码字段为code
statusCode: 200 //规定成功的状态码为200,默认为0
}
, parseData: function (res) {
return {
"code": res.code, //解析接口状态
"msg": res.msg, //解析提示文本
"count": res.records, //解析数据长度
"data": res.rows //解析数据列表
}
}*/
, cols: [
[ //表头
{type: 'checkbox', fixed: 'left'}
, {field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left',hide:true}
, {field: 'name', title: '图书名称', width: 180}
, {field: 'isbn', title: 'ISBN码', width: 160}
, {field: 'author', title: '作者', width: 80}
, {field: 'translator', title: '译者', width: 80}
, {field: 'categoryName', title: '图书分类', width: 160}
, {field: 'price', title: '图书单价', width: 120}
, {field: 'totalNumber', title: '藏书总量', width: 120}
, {field: 'leftNumber', title: '馆内剩余', width: 120}
, {field: 'publisherName', title: '出版社', width: 180}
, {field: 'pages', title: '页数', width: 80}
, {field: 'words', title: '字数', width: 80}
, {field: 'locationName', title: '存放位置', width: 120}
, {field: 'edition', title: '版次', width: 80}
, {field: 'registerTime', title: '登记日期', width: 120}
, {field: 'remark', title: '备注', width: 180}
, {fixed: 'right', title: '操作', toolbar: '#barOps', width: 120}
]
]
}); //监听表单提交
// 修改
form.on('submit(saveBook)', function (data) {
layer.alert(JSON.stringify(data.field));
$.ajax({
url: ctx+'api/book/save',
type: 'POST',
contentType: "application/json",
dataType: "json",
data: JSON.stringify(data.field),
success: function (result) {
if (result.code == 200) {
// layer.msg("修改成功!", {icon: 6});
cleanForm("#saveBook");
if(data.field.id.length>0){
layer.closeAll();//关闭所有的弹出层
}
userTable.reload();
}else {
layer.alert(result.message);
}
}
}); return false; }); //工具栏事件
table.on('toolbar(tb-book)', function (obj) {
var checkStatus = table.checkStatus(obj.config.id);
var checkData = checkStatus.data;
var ids = [];
switch (obj.event) {
// 新增
case 'add':
cleanForm("#saveBook"); top.layer.open({
type: 2,
offset: '10px',
title: "新增图书",
area: ['800px', '660px'],
content: ['bookAdd']
}); break;
// 删除
case 'remove':
if (checkData.length == 0) {
layer.alert('请选择要操作的行');
} else {
layer.confirm('确定要删除吗?', function (index) {
for (var i = 0; i < checkData.length; i++) {
ids.push(checkData[i].id);
}
//layer.alert(JSON.stringify(ids));
$.ajax({
url: ctx+'api/book/remove',
type: 'POST',
contentType: "application/json",
dataType: "json",
data: JSON.stringify(ids),
success: function (result) {
if (result.code == 200) {
setTimeout(function () {
layer.closeAll();//关闭所有的弹出层
userTable.reload();
}, 300);
}else {
layer.msg("操作失败!", {icon: 5});
}
}
});
});
}
break;
case 'refresh':
userTable.reload();
break;
case 'getCheckData':
layer.alert(JSON.stringify(data));
break;
case 'getCheckLength':
var data = checkStatus.data;
layer.msg('选中了:' + data.length + ' 个');
break;
case 'isAll':
layer.msg(checkStatus.isAll ? '全选' : '未全选')
break;
}
;
}); // 监听工具条
table.on('tool(tb-book)', function (obj) {
var data = obj.data;
// 修改
if (obj.event === 'edit') {
top.layer.open({
type: 2,
offset: '10px',
title: "修改图书",
area: ['800px', '660px'],
content: [ctx+'bookEdit/'+data.id]
});
}
}); // 搜索
$('#search').click(function () {
var name = $('#name').val();
var isbn = $('#isbn').val();
var author = $('#author').val();
table.reload('tb-book', {
url: ctx+'api/book/list'
,where: {
name:name,isbn:isbn,author:author
}
,page: {
curr: 1
}
});
});
}); </script>
</body> </html>

3.图书管理service

/**
* @Description: 图书服务
* @Author laoxu
* @Date 2019/5/2 9:26
**/
@Service
public class BookService extends AbstractService {
public void add(Book entity) {
//String username = SecurityUtil.getLoginUser();
insert("bookMapper.insert",entity);
} public void modify(Book entity) {
update("bookMapper.update",entity);
} public void remove(Long id) {
delete("bookMapper.delete",id);
} public void removes(Long[] ids) {
delete("bookMapper.deletes",ids);
} public Book get(Long id) {
return selectOne("bookMapper.select",id);
} public Book getByIsbn(String isbn) {
return selectOne("bookMapper.selectByIsbn",isbn);
} public List<Book> getParentList(Long id) {
return selectList("bookMapper.selectParentList",id);
} public int count(Map<String, Object> param) {
return selectOne("bookMapper.count",param);
} public List<Book> getList(Map<String, Object> param) {
return selectList("bookMapper.selectList",param);
} public List<Book> getPageResult(Map<String, Object> param) {
return selectList("bookMapper.selectPageResult",param);
} public int checkCode(Book entity){
return selectOne("bookMapper.countCode",entity);
} }

4.图书管理controller

/**
* @Description: 图书控制器
* @Author laoxu
* @Date 2019/5/2 10:16
**/
@RestController
@RequestMapping("/api/book")
public class BookController {
@Autowired
BookService bookService; /**
* 保存(新增/修改)
*
* @param entity
* @return
*/
@PostMapping("/save")
public Result<String> modify(@RequestBody Book entity) {
String code = entity.getIsbn();
int count = bookService.checkCode(entity);
if(count>0){
return ResultUtil.fail("ISBN已存在!");
}
if(entity.getId()!=null){
bookService.modify(entity);
}else{
bookService.add(entity);
} return ResultUtil.ok();
} @PostMapping("/remove")
public Result<String> remove(@RequestBody Long[] ids) {
bookService.removes(ids);
return ResultUtil.ok();
} @GetMapping("/get")
public Result<Book> get(@RequestParam("id") Long id) {
Book entity = bookService.get(id); return ResultUtil.ok(entity);
} @GetMapping("/list")
public ResultBean<List<Book>> getPageResult(
@RequestParam(required = false) String name,
@RequestParam(required = false) String isbn,
@RequestParam(required = false) String author,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer limit) { Map<String, Object> param = new HashMap<>(); // 计算起始行号
int offset = (page - 1) * limit;
int rows = limit; param.put("name",name);
param.put("isbn",isbn);
param.put("author",author);
param.put("offset", offset);
param.put("rows", rows); // 统计记录数
int totalRows = bookService.count(param); // 获取当前页结果集
List<Book> entities = bookService.getPageResult(param); ResultBean result = new ResultBean(0, "查询成功", totalRows, entities); return result; }
}

Spring Boot图书管理系统项目实战-6.图书管理的更多相关文章

  1. Spring Boot → 11:项目实战-账单管理系统完整版

    Spring Boot → 11:项目实战-账单管理系统完整版

  2. Spring Boot → 06:项目实战-账单管理系统

    Spring Boot → 06:项目实战-账单管理系统

  3. Java 架构师+高并发+性能优化+Spring boot大型分布式项目实战

    视频课程内容包含: 高级 Java 架构师包含:Spring boot.Spring cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.Zer ...

  4. 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚

    新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...

  5. 图书-技术-SpringBoot:《Spring Boot 企业级应用开发实战》

    ylbtech-图书-技术-SpringBoot:<Spring Boot 企业级应用开发实战> Spring Boot 企业级应用开发实战,全书围绕如何整合以 Spring Boot 为 ...

  6. Linux-基础学习(四)-部署图书管理系统项目

    部署图书管理项目需要以下软件 项目文件(django项目文件夹) 数据库文件(django项目对应的数据库文件) centos7(linux本体) nginx(反向代理以及静态文件收集) uWSGI( ...

  7. Django学习——分组查询、图书管理系统项目、wsgi, uwsgi, cgi, fastcgi

    1 分组查询 # 分组查询 # 查询每一个出版社id,以及图书平均价格(单表) # 原生sql # select publish_id,avg(price) from app01_book group ...

  8. 从零一起学Spring Boot之LayIM项目长成记(五)websocket

    前言 距离上一篇已经比较久的时间了,项目也是开了个头.并且,由于网上的关于Spring Boot的websocket讲解也比较多.于是我采用了另外的一个通讯框架 t-io 来实现LayIM中的通讯功能 ...

  9. Spring Boot会员管理系统——处理文件上传

    温馨提示 Spring Boot会员管理系统的中,需要涉及到Spring框架,SpringMVC框架,Hibernate框架,thymeleaf模板引擎.所以,可以学习下这些知识.当然,直接入门的话使 ...

  10. 使用Spring Boot开发Web项目(二)之添加HTTPS支持

    上篇博客使用Spring Boot开发Web项目我们简单介绍了使用如何使用Spring Boot创建一个使用了Thymeleaf模板引擎的Web项目,当然这还远远不够.今天我们再来看看如何给我们的We ...

随机推荐

  1. [转帖]Oracle23c On linux的简单安装

    Oracle23c On linux的简单安装 背景 Oracle11.2.0.4 发布之后 下一个版本是 Oracle12c 因为西方人比较不喜欢13这个数字, 尤其是犹太人出生的 拉里埃里森. 所 ...

  2. [转帖]linux查看端口及端口详解

    https://www.cnblogs.com/the-tops/p/6126941.html   今天现场查看了TCP端口的占用情况,如下图   红色部分是IP,现场那边问我是不是我的程序占用了tc ...

  3. [转帖]TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践

    返回全部 边城元元案例实践2022-08-02 复杂业务查询对于传统的关系型数据库来说是一种考验,而通过 TiKV 行存与 TiFlash 的列存结合使用就能很好地应对.本文根据 TUG 用户边城元元 ...

  4. [转帖]缓存与存储的一致性策略:从 CPU 到分布式系统

    https://zhuanlan.zhihu.com/p/151745863 在计算机系统设计实践中,我们常常会遇到下图所示架构: 为了解决单个存储器读吞吐无法满足要求的问题,常常需要在存储器上面增加 ...

  5. 京东云开发者|提高IT运维效率,深度解读京东云AIOps落地实践

    基于深度学习对运维时序指标进行异常检测,快速发现线上业务问题 时间序列的异常检测是实际应用中的一个关键问题,尤其是在 IT 行业.我们没有采用传统的基于阈值的方法来实现异常检测,而是通过深度学习提出了 ...

  6. vue动画 <transition-group> 使用半场动画

    <style> /* 给动画添加一组过度效果 */ .v-enter, .v-leave-to { opacity: 0.8; /* 从右向左进入 */ transform: transl ...

  7. Linux下rz命令上传文件失败处理

    在Linux服务器上使用rz命令上传文件时,有时候会遇到文件上传失败,此时会在当前目录下生成一堆大小为0的乱码文件,如下图所示: 这些文件有时候rm命令也无法删除,下面提供两种通过find命令删除的方 ...

  8. c++全局变量extern

    extern extern 是 C++ 中的一个关键字,用于声明一个变量或函数是在其他文件中定义的.它的作用是告诉编译器在链接时在其他文件中寻找该变量或函数的定义. 在 C++ 中,如果一个变量或函数 ...

  9. 服务器重装ip未更改,ssh连不上(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED)

    服务器重装ip未更改,ssh连不上 前言 原因 解决方法 服务器重装ip未更改,ssh连不上 前言 重装了虚拟机,ip还保留了,但是发现连不上了 @@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  10. SqlSugar新增数据

    1.插入方式 1.1 单条插入实体 //返回插入行数 db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现 //异步: await db.Inser ...