Spring Boot圖書管理系統項目實戰-7.借閱圖書

導航:

pre:  6.圖書管理

next:8.續借圖書

 

只挑重點的講,具體的請看項目源碼。

1.項目源碼

需要的朋友請給個贊,並留下郵箱,給你們發!

 

2.頁面設計

2.1 bookBorrow.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>
<!-- 內容主體區域 -->
<div>
    <!--<div class="demoTable" style="padding: 15px">
        搜索:
        <div class="layui-inline">
            <input class="layui-input" id="find" autocomplete="off">
        </div>
        <button class="layui-btn" data-type="reload" id="queryRole">搜索</button>
    </div>-->
    <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="readerCode" name="readerCode" 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>

                <button class="layui-btn" data-type="reload" id="search">搜索</button>
            </div>

        </div>

        <table id="tb-book" lay-filter="tb-book"></table>

    </div>
    <table id="tb_bookBorrow" lay-filter="tb_bookBorrow"></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">&#xe608;</i>新增</button>
        <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="remove"><i class="layui-icon">&#xe640;</i>刪除
        </button>
        <button class="layui-btn layui-btn-sm" lay-event="refresh"><i class="layui-icon">&#xe666;</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">&#xe642;</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;
        });

        element.on('tab(demo)', function(data){
            var src=$(".layui-tab-item.layui-show").find("iframe").attr("src");
            $(".layui-tab-item.layui-show").find("iframe").attr("src",src);
        });

        //第一個實例
         userTable = table.render({
            elem: '#tb_bookBorrow'
            , height: 515
            , url: ctx+'api/bookBorrow/getPageResult' //數據接口
            , page: true //開啓分頁
            , toolbar: '#book-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: 'borrowStatus', title: '狀態', width: 80,templet:showStatus}
                , {field: 'readerCode', title: '讀者編碼', width: 160}
                , {field: 'readerName', title: '讀者姓名', width: 160}
                , {field: 'readerSex', title: '讀者性別', width: 120}
                , {field: 'readerPhone', title: '讀者電話', width: 160}
                , {field: 'bookIsbn', title: '圖書ISBN', width: 160}
                , {field: 'bookName', title: '圖書名稱', width: 160}
                , {field: 'bookAuthor', title: '圖書作者', width: 120}
                , {field: 'bookCategory', title: '圖書分類', width: 120}
                , {field: 'bookLocation', title: '圖書位置', width: 180}
                , {field: 'bookTotal', title: '圖書數量', width: 120}
                , {field: 'bookLeft', title: '圖書剩餘', width: 120}
                , {field: 'borrowDate', title: '借閱日期', width: 120,templet:'<div>{{ layui.util.toDateString(d.borrowDate, "yyyy-MM-dd") }}</div>'}
                , {field: 'returnDate', title: '應還日期', width: 120,templet:'<div>{{ layui.util.toDateString(d.returnDate, "yyyy-MM-dd") }}</div>'}
                , {field: 'borrowDays', title: '借閱天數', width: 120}
                , {field: 'remark', title: '備註', width: 180}
                , {fixed: 'right', title: '操作', toolbar: '#barOps', width: 120}
            ]
             ]
        });


        //工具欄事件
        table.on('toolbar(tb_bookBorrow)', 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', '680px'],
                        content: ['bookBorrowAdd']
                    });
                    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/bookBorrow/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_bookBorrow)', function (obj) {
            var data = obj.data;
            // 修改
            if (obj.event === 'edit') {
                top.layer.open({
                    type: 2,
                    offset: '10px',
                    title: "修改借閱",
                    area: ['800px', '680px'],
                    content: [ctx+'bookBorrowEdit/'+data.id]
                });
            }
        });

        // 搜索
        $('#search').click(function () {
            var readerCode = $('#readerCode').val();
            var isbn = $('#isbn').val();
            table.reload('tb_bookBorrow', {
                url: ctx+'api/bookBorrow/getPageResult'
                ,where: {
                    readerCode:readerCode,isbn:isbn
                }
                ,page: {
                    curr: 1
                }
            });
        });
    });

    // 借閱狀態
    function showStatus(data) {
        var status = data.borrowStatus;
        var result;
        if (status == 0) {
            result = '<a class="" style="color:#FF5722">未還</a>';
        }
        if (status == 1) {
            result = '<a class="" style="color:#009688">已還</a>';
        }
        if (status == 2) {
            result = '<a class="" style="color:#FF5722">逾期</a>';
        }
        return result;
    }


</script>
</body>

</html>

3.借閱管理service

/**
 * @Description: 借閱圖書服務
 * @Author laoxu
 * @Date 2020/1/12
 **/
@Service
public class BookBorrowService extends AbstractService {
    public void add(BookBorrowVO entity) {
        //String username = SecurityUtil.getLoginUser();
        insert("bookBorrowMapper.insert",entity);
    }

    public void modify(BookBorrowVO entity) {
        update("bookBorrowMapper.update",entity);
    }

    public void remove(Long id) {
        delete("bookBorrowMapper.delete",id);
    }

    public void removes(Long[] ids) {
        delete("bookBorrowMapper.deletes",ids);
    }

    public void returnBook(Map<String, Object> param) {
        delete("bookBorrowMapper.return",param);
    }

    public BookBorrowVO get(Long id) {
        return selectOne("bookBorrowMapper.select",id);
    }

    public List<BookBorrow> getParentList(Long id) {
        return selectList("bookBorrowMapper.selectParentList",id);
    }

    public int count(Map<String, Object> param) {
        return selectOne("bookBorrowMapper.count",param);
    }

    public List<BookBorrow> getList(Map<String, Object> param) {
        return selectList("bookBorrowMapper.selectList",param);
    }

    public List<BookBorrowVO> getPageResult(Map<String, Object> param) {
        return selectList("bookBorrowMapper.selectPageResult",param);
    }


    public int checkBorrow(BookBorrowVO entity){
        return selectOne("bookBorrowMapper.countBorrow",entity);
    }

    public int getBorrowCount(String date){
        return selectOne("bookBorrowMapper.selectBorrowCount",date);
    }

    public int getReturnCount(String date){
        return selectOne("bookBorrowMapper.selectReturnCount",date);
    }
}

4.借閱管理controller

/**
 * @Description: 借閱圖書控制器
 * @Author laoxu
 * @Date 2020/1/12 23:24
 **/
@RestController
@RequestMapping("/api/bookBorrow")
public class BookBorrowController {
    @Autowired
    BookBorrowService bookBorrowService;

    @Autowired
    BookReaderService bookReaderService;

    @Autowired
    BookService bookService;

    /**
     * 保存(新增/修改)
     *
     * @param entity
     * @return
     */
    @PostMapping("/save")
    public Result<String> modify(@RequestBody BookBorrowVO entity) {
        Long id = entity.getId();
        if(id!=null){
            bookBorrowService.modify(entity);
        }else{
            Map<String,Object> param = new HashMap<>();
            param.put("isbn",entity.getBookIsbn());
            param.put("code",entity.getReaderCode());
            //1.檢查讀者編號是否存在
            if(bookReaderService.count(param)==0){
                return ResultUtil.fail("讀者不存在!");
            }
            //2.檢查圖書編號是否存在
            if(bookService.count(param)==0){
                return ResultUtil.fail("圖書不存在!");
            }
            //3.檢查該讀者是否已經借過此書
            int count = bookBorrowService.checkBorrow(entity);
            if(count>0){
                return ResultUtil.fail("您已借過該圖書!");
            }
            //4.檢查圖書剩餘
            Book book = bookService.getByIsbn(entity.getBookIsbn());
            int leftNumber = book.getLeftNumber();
            if(leftNumber<1){
                return ResultUtil.fail("圖書剩餘數量爲0!");
            }
            //5.扣減圖書剩餘
            book.setLeftNumber(leftNumber-1);
            bookService.modify(book);
            //6.保存借閱記錄
            bookBorrowService.add(entity);
        }


        return ResultUtil.ok();
    }


    @PostMapping("/remove")
    public Result<String> remove(@RequestBody Long[] ids) {
        bookBorrowService.removes(ids);
        return ResultUtil.ok();
    }

    /**
     *  歸還
     * @param ids
     * @return
     */
    @PostMapping("/return")
    @Transactional
    public Result<String> returnBook(@RequestBody Long[] ids) {
        // 1.增加圖書庫存
        Book entity = null;
        for (Long id: ids) {
            entity = bookService.getByIsbn(bookBorrowService.get(id).getBookIsbn());
            entity.setLeftNumber(entity.getLeftNumber()+1);
            bookService.modify(entity);
        }
        // 2.更新借閱狀態
        Map<String,Object> param = new HashMap<>();
        param.put("ids", ids);
        param.put("borrowStatus",1);
        bookBorrowService.returnBook(param);

        return ResultUtil.ok();
    }

    @GetMapping("/get")
    public Result<BookBorrowVO> get(@RequestParam("id") Long id) {
        BookBorrowVO entity = bookBorrowService.get(id);

        return ResultUtil.ok(entity);
    }

    @GetMapping("/getPageResult")
    public ResultBean<List<BookBorrowVO>> getPageResult(
            @RequestParam(required = false) Integer[] borrowStatus,
            @RequestParam(required = false) String readerCode,
            @RequestParam(required = false) String isbn,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer limit) {

        Map<String, Object> param = new HashMap<>();
        // 統計記錄數
        int totalRows = bookBorrowService.count(param);
        // 計算起始行號
        int offset = (page - 1) * limit;
        int rows = limit;

        param.put("offset", offset);
        param.put("rows", rows);
        param.put("borrowStatus",borrowStatus);
        param.put("readerCode",readerCode);
        param.put("isbn",isbn);

        // 獲取當前頁結果集
        List<BookBorrowVO> entities = bookBorrowService.getPageResult(param);

        ResultBean result = new ResultBean(0, "查詢成功", totalRows, entities);

        return result;

    }

    @GetMapping("/getBorrowStat")
    public Result<Map<String,Object>> getBorrowStat(){
        Map<String,Object> map = new HashMap<>();
        List<String> days = DateUtil.getDaysBetwwen(6);

        map.put("columnName",days);
        BorrowStatVO borrowVO = new BorrowStatVO();
        BorrowStatVO returnVO = new BorrowStatVO();
        borrowVO.setName("借");
        returnVO.setName("還");
        borrowVO.setType("bar");
        returnVO.setType("bar");
        List<Integer> borrowData = new ArrayList<>();
        List<Integer> returnData = new ArrayList<>();
        for (String day:days) {
            borrowData.add(bookBorrowService.getBorrowCount(day));
            returnData.add(bookBorrowService.getReturnCount(day));
        }
        borrowVO.setData(borrowData);
        returnVO.setData(returnData);

        List<BorrowStatVO> list = new ArrayList<>();
        list.add(borrowVO);
        list.add(returnVO);

        map.put("columnValue",list);

        return ResultUtil.ok(map);

    }
}

 

 

需要源碼的朋友留下郵箱:)

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章