当前位置:   article > 正文

Spring Boot图书管理系统项目实战-6.图书管理_项目实战spring 图书管理系统

项目实战spring 图书管理系统

导航:

pre:  5.读者管理

next:7.借阅图书

 

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

1.项目源码

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

 

2.页面设计

 

2.1 book.html

  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  6. <title>图书管理</title>
  7. <link rel="stylesheet" href="/static/layui/css/layui.css" th:href="@{/static/layui/css/layui.css}">
  8. </head>
  9. <body>
  10. <input type="text" id="ctx" hidden="hidden" th:value="${#request.getContextPath()}">
  11. <!-- 内容主体区域 -->
  12. <div>
  13. <div class="search-div">
  14. <div class="">
  15. <div class="layui-inline">
  16. <label class="layui-form-label">名称:</label>
  17. <div class="layui-input-inline">
  18. <input class="layui-input" id="name" name="name" autocomplete="off">
  19. </div>
  20. </div>
  21. <div class="layui-inline">
  22. <label class="layui-form-label">ISBN:</label>
  23. <div class="layui-input-inline">
  24. <input class="layui-input" id="isbn" name="isbn" autocomplete="off">
  25. </div>
  26. </div>
  27. <div class="layui-inline">
  28. <label class="layui-form-label">作者:</label>
  29. <div class="layui-input-inline">
  30. <input class="layui-input" id="author" name="author" autocomplete="off">
  31. </div>
  32. </div>
  33. <button class="layui-btn" data-type="reload" id="search">搜索</button>
  34. </div>
  35. </div>
  36. <table id="tb-book" lay-filter="tb-book"></table>
  37. </div>
  38. <!--编辑表单-->
  39. <script type="text/html" id="book-toolbar">
  40. <div class="layui-btn-container">
  41. <button class="layui-btn layui-btn-sm" lay-event="add"><i class="layui-icon">&#xe608;</i>新增</button>
  42. <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="remove"><i class="layui-icon">&#xe640;</i>删除
  43. </button>
  44. <button class="layui-btn layui-btn-sm" lay-event="refresh"><i class="layui-icon">&#xe666;</i>刷新
  45. </button>
  46. </div>
  47. <!--<div class="layui-btn-container">
  48. <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button>
  49. <button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button>
  50. <button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button>
  51. </div>-->
  52. </script>
  53. <script type="text/html" id="barOps">
  54. <a class="layui-btn layui-btn-sm" lay-event="edit"><i class="layui-icon">&#xe642;</i> </a>
  55. </script>
  56. <script src="/static/js/jquery-1.11.3.min.js" th:src="@{/static/js/jquery-1.11.3.min.js}"></script>
  57. <script src="/static/layui/layui.all.js" th:src="@{static/layui/layui.all.js}"></script>
  58. <script src="/static/js/util.js" th:src="@{/static/js/util.js}"></script>
  59. <!--ctx-->
  60. <script th:replace="~{fragment::ctx}"/>
  61. <script>
  62. var element, layer, laydate, table, form,userTable;
  63. function reload(){
  64. userTable.reload();
  65. }
  66. $(function () {
  67. // 使用模块
  68. layui.use(['element', 'layer', 'laydate', 'table', 'form'], function () {
  69. element = layui.element;
  70. layer = layui.layer;
  71. laydate = layui.laydate;
  72. table = layui.table;
  73. form = layui.form;
  74. });
  75. //第一个实例
  76. userTable = table.render({
  77. elem: '#tb-book'
  78. , height: 515
  79. , url: ctx+'api/book/list' //数据接口
  80. , page: true //开启分页
  81. , toolbar: '#book-toolbar'
  82. ,id: 'tb-book'
  83. /*,request: {
  84. pageName: 'pageNo' //页码的参数名称,默认:page
  85. ,limitName: 'pageSize' //每页数据量的参数名,默认:limit
  86. }
  87. , response: {
  88. statusName: 'code', //规定返回的状态码字段为code
  89. statusCode: 200 //规定成功的状态码为200,默认为0
  90. }
  91. , parseData: function (res) {
  92. return {
  93. "code": res.code, //解析接口状态
  94. "msg": res.msg, //解析提示文本
  95. "count": res.records, //解析数据长度
  96. "data": res.rows //解析数据列表
  97. }
  98. }*/
  99. , cols: [
  100. [ //表头
  101. {type: 'checkbox', fixed: 'left'}
  102. , {field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left',hide:true}
  103. , {field: 'name', title: '图书名称', width: 180}
  104. , {field: 'isbn', title: 'ISBN码', width: 160}
  105. , {field: 'author', title: '作者', width: 80}
  106. , {field: 'translator', title: '译者', width: 80}
  107. , {field: 'categoryName', title: '图书分类', width: 160}
  108. , {field: 'price', title: '图书单价', width: 120}
  109. , {field: 'totalNumber', title: '藏书总量', width: 120}
  110. , {field: 'leftNumber', title: '馆内剩余', width: 120}
  111. , {field: 'publisherName', title: '出版社', width: 180}
  112. , {field: 'pages', title: '页数', width: 80}
  113. , {field: 'words', title: '字数', width: 80}
  114. , {field: 'locationName', title: '存放位置', width: 120}
  115. , {field: 'edition', title: '版次', width: 80}
  116. , {field: 'registerTime', title: '登记日期', width: 120}
  117. , {field: 'remark', title: '备注', width: 180}
  118. , {fixed: 'right', title: '操作', toolbar: '#barOps', width: 120}
  119. ]
  120. ]
  121. });
  122. //监听表单提交
  123. // 修改
  124. form.on('submit(saveBook)', function (data) {
  125. layer.alert(JSON.stringify(data.field));
  126. $.ajax({
  127. url: ctx+'api/book/save',
  128. type: 'POST',
  129. contentType: "application/json",
  130. dataType: "json",
  131. data: JSON.stringify(data.field),
  132. success: function (result) {
  133. if (result.code == 200) {
  134. // layer.msg("修改成功!", {icon: 6});
  135. cleanForm("#saveBook");
  136. if(data.field.id.length>0){
  137. layer.closeAll();//关闭所有的弹出层
  138. }
  139. userTable.reload();
  140. }else {
  141. layer.alert(result.message);
  142. }
  143. }
  144. });
  145. return false;
  146. });
  147. //工具栏事件
  148. table.on('toolbar(tb-book)', function (obj) {
  149. var checkStatus = table.checkStatus(obj.config.id);
  150. var checkData = checkStatus.data;
  151. var ids = [];
  152. switch (obj.event) {
  153. // 新增
  154. case 'add':
  155. cleanForm("#saveBook");
  156. top.layer.open({
  157. type: 2,
  158. offset: '10px',
  159. title: "新增图书",
  160. area: ['800px', '660px'],
  161. content: ['bookAdd']
  162. });
  163. break;
  164. // 删除
  165. case 'remove':
  166. if (checkData.length == 0) {
  167. layer.alert('请选择要操作的行');
  168. } else {
  169. layer.confirm('确定要删除吗?', function (index) {
  170. for (var i = 0; i < checkData.length; i++) {
  171. ids.push(checkData[i].id);
  172. }
  173. //layer.alert(JSON.stringify(ids));
  174. $.ajax({
  175. url: ctx+'api/book/remove',
  176. type: 'POST',
  177. contentType: "application/json",
  178. dataType: "json",
  179. data: JSON.stringify(ids),
  180. success: function (result) {
  181. if (result.code == 200) {
  182. setTimeout(function () {
  183. layer.closeAll();//关闭所有的弹出层
  184. userTable.reload();
  185. }, 300);
  186. }else {
  187. layer.msg("操作失败!", {icon: 5});
  188. }
  189. }
  190. });
  191. });
  192. }
  193. break;
  194. case 'refresh':
  195. userTable.reload();
  196. break;
  197. case 'getCheckData':
  198. layer.alert(JSON.stringify(data));
  199. break;
  200. case 'getCheckLength':
  201. var data = checkStatus.data;
  202. layer.msg('选中了:' + data.length + ' 个');
  203. break;
  204. case 'isAll':
  205. layer.msg(checkStatus.isAll ? '全选' : '未全选')
  206. break;
  207. }
  208. ;
  209. });
  210. // 监听工具条
  211. table.on('tool(tb-book)', function (obj) {
  212. var data = obj.data;
  213. // 修改
  214. if (obj.event === 'edit') {
  215. top.layer.open({
  216. type: 2,
  217. offset: '10px',
  218. title: "修改图书",
  219. area: ['800px', '660px'],
  220. content: [ctx+'bookEdit/'+data.id]
  221. });
  222. }
  223. });
  224. // 搜索
  225. $('#search').click(function () {
  226. var name = $('#name').val();
  227. var isbn = $('#isbn').val();
  228. var author = $('#author').val();
  229. table.reload('tb-book', {
  230. url: ctx+'api/book/list'
  231. ,where: {
  232. name:name,isbn:isbn,author:author
  233. }
  234. ,page: {
  235. curr: 1
  236. }
  237. });
  238. });
  239. });
  240. </script>
  241. </body>
  242. </html>

 

3.图书管理service

  1. /**
  2. * @Description: 图书服务
  3. * @Author laoxu
  4. * @Date 2019/5/2 9:26
  5. **/
  6. @Service
  7. public class BookService extends AbstractService {
  8. public void add(Book entity) {
  9. //String username = SecurityUtil.getLoginUser();
  10. insert("bookMapper.insert",entity);
  11. }
  12. public void modify(Book entity) {
  13. update("bookMapper.update",entity);
  14. }
  15. public void remove(Long id) {
  16. delete("bookMapper.delete",id);
  17. }
  18. public void removes(Long[] ids) {
  19. delete("bookMapper.deletes",ids);
  20. }
  21. public Book get(Long id) {
  22. return selectOne("bookMapper.select",id);
  23. }
  24. public Book getByIsbn(String isbn) {
  25. return selectOne("bookMapper.selectByIsbn",isbn);
  26. }
  27. public List<Book> getParentList(Long id) {
  28. return selectList("bookMapper.selectParentList",id);
  29. }
  30. public int count(Map<String, Object> param) {
  31. return selectOne("bookMapper.count",param);
  32. }
  33. public List<Book> getList(Map<String, Object> param) {
  34. return selectList("bookMapper.selectList",param);
  35. }
  36. public List<Book> getPageResult(Map<String, Object> param) {
  37. return selectList("bookMapper.selectPageResult",param);
  38. }
  39. public int checkCode(Book entity){
  40. return selectOne("bookMapper.countCode",entity);
  41. }
  42. }

 

4.图书管理controller

 

  1. /**
  2. * @Description: 图书控制器
  3. * @Author laoxu
  4. * @Date 2019/5/2 10:16
  5. **/
  6. @RestController
  7. @RequestMapping("/api/book")
  8. public class BookController {
  9. @Autowired
  10. BookService bookService;
  11. /**
  12. * 保存(新增/修改)
  13. *
  14. * @param entity
  15. * @return
  16. */
  17. @PostMapping("/save")
  18. public Result<String> modify(@RequestBody Book entity) {
  19. String code = entity.getIsbn();
  20. int count = bookService.checkCode(entity);
  21. if(count>0){
  22. return ResultUtil.fail("ISBN已存在!");
  23. }
  24. if(entity.getId()!=null){
  25. bookService.modify(entity);
  26. }else{
  27. bookService.add(entity);
  28. }
  29. return ResultUtil.ok();
  30. }
  31. @PostMapping("/remove")
  32. public Result<String> remove(@RequestBody Long[] ids) {
  33. bookService.removes(ids);
  34. return ResultUtil.ok();
  35. }
  36. @GetMapping("/get")
  37. public Result<Book> get(@RequestParam("id") Long id) {
  38. Book entity = bookService.get(id);
  39. return ResultUtil.ok(entity);
  40. }
  41. @GetMapping("/list")
  42. public ResultBean<List<Book>> getPageResult(
  43. @RequestParam(required = false) String name,
  44. @RequestParam(required = false) String isbn,
  45. @RequestParam(required = false) String author,
  46. @RequestParam(defaultValue = "1") Integer page,
  47. @RequestParam(defaultValue = "10") Integer limit) {
  48. Map<String, Object> param = new HashMap<>();
  49. // 计算起始行号
  50. int offset = (page - 1) * limit;
  51. int rows = limit;
  52. param.put("name",name);
  53. param.put("isbn",isbn);
  54. param.put("author",author);
  55. param.put("offset", offset);
  56. param.put("rows", rows);
  57. // 统计记录数
  58. int totalRows = bookService.count(param);
  59. // 获取当前页结果集
  60. List<Book> entities = bookService.getPageResult(param);
  61. ResultBean result = new ResultBean(0, "查询成功", totalRows, entities);
  62. return result;
  63. }
  64. }

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/58217
推荐阅读
相关标签
  

闽ICP备14008679号