导航:

pre:  4.基础信息管理

next:6.图书管理

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

1.项目源码

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

2.页面设计

<!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>
<!-- 内容主体区域 -->
<div>
<table id="tb-bookReader" lay-filter="tb-bookReader"></table>
</div> <!--编辑表单-->
<div class="layui-row" id="editBookReader" style="display:none;">
<div class="layui-col-md10">
<form class="layui-form layui-from-pane" id="saveBookReader" style="margin-top:20px"> <div class="layui-form-item">
<label class="layui-form-label">读者编码</label>
<div class="layui-input-block">
<input type="text" name="code" id="code" required lay-verify="required" autocomplete="off"
class="layui-input">
</div>
</div> <input type="hidden" name="id" id="id"> <div class="layui-form-item">
<label class="layui-form-label">读者姓名</label>
<div class="layui-input-block">
<input type="text" name="name" id="name" required lay-verify="required" autocomplete="off"
class="layui-input">
</div>
</div> <div class="layui-form-item">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<input type="radio" id="male" name="sex" value="男" title="男">
<input type="radio" id="female" name="sex" value="女" title="女">
</div>
</div> <div class="layui-form-item">
<label class="layui-form-label">联系电话</label>
<div class="layui-input-block">
<input type="text" name="phone" id="phone" required lay-verify="required" autocomplete="off"
class="layui-input">
</div>
</div> <div class="layui-form-item" style="margin-top:40px" id="check">
<div class="layui-input-block">
<button class="layui-btn layui-btn-submit " lay-submit="" lay-filter="saveBookReader">保存</button>
<!--<button type="reset" class="layui-btn layui-btn-primary">重置</button>-->
</div>
</div>
</form>
</div>
</div> <script type="text/html" id="bookReader-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>
</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; $(function () {
// 使用模块
layui.use(['element', 'layer', 'laydate', 'table', 'form'], function () {
element = layui.element;
layer = layui.layer;
laydate = layui.laydate;
table = layui.table;
form = layui.form;
}); form.on('radio',function (data) {
$("input[name='sex']").prop("checked",false);
$(data.elem).prop("checked",true);
}); //第一个实例
var userTable = table.render({
elem: '#tb-bookReader'
, height: 515
, url: ctx+'api/bookReader/getPageResult' //数据接口
, page: true //开启分页
, toolbar: '#bookReader-toolbar'
/*,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: 'code', title: '读者编码'}
, {field: 'name', title: '读者姓名'}
, {field: 'sex', title: '性别'}
, {field: 'phone', title: '联系电话'}
, {fixed: 'right', title: '操作', toolbar: '#barOps', width: 120}
]
]
}); //监听表单提交
// 修改
form.on('submit(saveBookReader)', function (data) {
//layer.alert(JSON.stringify(data.field));
data.field.sex=$('#sex input[checked]').attr('title'); data.field.sex=$("#male").prop("checked")==true?$("#male").attr("title"):$("#female").attr("title"); $.ajax({
url: ctx+'api/bookReader/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("#saveBookReader");
if(data.field.id.length>0){
layer.closeAll();//关闭所有的弹出层
}
userTable.reload();
}else {
layer.alert(result.message);
}
}
}); return false; }); //工具栏事件
table.on('toolbar(tb-bookReader)', function (obj) {
var checkStatus = table.checkStatus(obj.config.id);
var checkData = checkStatus.data;
var ids = [];
switch (obj.event) {
// 新增
case 'add':
cleanForm("#saveBookReader");
$("#male").prop("checked",true);
$("#female").prop("checked",false); form.render(); layer.open({
type: 1,
offset: '10px',
title: "新增读者",
area: ['500px', '400px'],
content: $("#editBookReader")
});
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/bookReader/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 '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-bookReader)', function (obj) {
var data = obj.data;
// 修改
if (obj.event === 'edit') {
$("#name").val(data.name);
$("#code").val(data.code);
$("#id").val(data.id);
$("#phone").val(data.phone); if(data.sex=='男'){
$("#male").prop("checked",true);
$("#female").prop("checked",false);
}
if(data.sex=='女'){
$("#male").prop("checked",false);
$("#female").prop("checked",true);
} form.render(); //更新全部 layer.open({
type: 1,
offset: '10px',
title: "修改读者",
area: ['500px', '400px'],
content: $("#editBookReader")
});
}
});
}); </script>
</body> </html>

3.读者管理service

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

4.读者管理controller

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

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

  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. 从零一起学Spring Boot之LayIM项目长成记(五)websocket

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

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

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

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

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

  9. 从零一起学Spring Boot之LayIM项目长成记(二) LayIM初体验

    前言 接上篇,已经完成了一个SpringBoot项目的基本搭建.那么现在就要考虑要做什么,怎么做的问题.所以本篇内容不多,带大家一起来简单了解一下要做的东西,之前有很多人不知道从哪里下手,那么今天我带 ...

  10. Spring Boot 从入门到实战汇总

    之前写过几篇spring boot入门到实战的博文,因为某些原因没能继续. 框架更新迭代很快,之前还是基于1.x,现在2.x都出来很久了.还是希望能从基于该框架项目开发的整体有一个比较系统的梳理,于是 ...

随机推荐

  1. 如何查找SpringBoot应用中的请求路径(不使用idea)

    背景 昨天有个同事向我咨询某个接口的物理表是哪个,由于公司业务较多.这块业务的确不是我负责的,也没有使用idea不能全局搜索(eclipse搜不到jar内的字符串),也就回复了不清楚. 除了自己写代码 ...

  2. linux环境C语言实现:h265与pcm封装成AVI格式

    ​ 前言 不知道是处于版权收费问题还是什么原因,H265现在也并没有非常广泛的被普及.将h265数据合成AVI的资料现在在网上也基本上没有.使用格式化工厂工具将h265数据封装成AVI格式,发现它在封 ...

  3. [转帖]2024年正常使用windows XP之一:系统下载篇

    https://zhuanlan.zhihu.com/p/347764175 半夏:2024年正常使用windows XP之一:系统下载篇 半夏:2024年正常使用windows XP之二:补丁及运行 ...

  4. [转帖]s3对象存储挂载到本地文件夹

    https://www.zhangzhuo.ltd/articles/2021/10/22/1634888049032.html 一.s3fs工具 s3fs-fuse 是一个采用 c++ 开发的开源应 ...

  5. [转帖]关于linux:NUMA架构下的内存延迟区别测试

    https://lequ7.com/guan-yu-linuxnuma-jia-gou-xia-de-nei-cun-yan-chi-qu-bie-ce-shi.html 当初的服务器物理机CPU个别 ...

  6. [转帖]Native Memory Tracking 详解(3):追踪区域分析(二)

    https://www.modb.pro/db/539804 上篇文章 Native Memory Tracking 详解(2):追踪区域分析(一) 中,分享了NMT追踪区域的部分内存类型--Java ...

  7. ZCube:在我的优惠券中的落地实践 | 京东云技术团队

    ​ 前言 我的优惠券作为营销玩法的一种运营工具,在营销活跃场中起到很至关重要的作用.如何更加高效的赋能业务,助理业务发展,灵活扩展业务,是我们一直追求和思考的方向 一.背景 1.1 现状 营销中台作为 ...

  8. 浅谈基于Web的跨平台桌面应用开发

    作者:京东物流 王泽知 近些年来,跨平台跨端一直是比较热门的话题,Write once, run anywhere,一直是我们开发者所期望的,跨平台方案的优势十分明显,对于开发者而言,可以做到一次开发 ...

  9. element-ui中Select 选择器列表内容居中

    <el-select class="my-el-select" v-model="tenantCont" placeholder="请输入机构标 ...

  10. docker 安装minio

    1.拉取镜像 docker pull minio/minio 2.运行容器 docker run -d -p 9000:9000 --name=minio --restart=always -e &q ...