33基於Java簡單實現圖書館借書管理系統設計與實現

来源:https://www.cnblogs.com/projecthelp/archive/2023/05/08/17380976.html
-Advertisement-
Play Games

基於Java的簡單圖書館管理系統實現,圖書租借管理系統,租借系統,springboot圖書館管理系統,大學圖書管理系統,圖書借閱系統,圖書館借閱歸還系統。 ...


本章節給大家介紹一個基於Java簡單實現圖書館借書管理系統的設計與實現

項目概述

項目總體分為倆種角色,分別是管理員和閱讀者,管理員可以登錄系統中,進行圖書管理,上架下架圖書,對用戶進行管理、對讀者進行管理、查看借閱記錄管理等,讀者角色可以登錄系統查詢圖書信息、借閱和歸還圖書、查看個人借閱記錄、編輯個人信息等。

項目功能簡單,資料庫也只有4張表,分別為管理員表,讀者表,圖書表和借閱記錄表,但基本實現了圖書館對圖書借書的管理功能,大家可以在這個基礎上面靈活增加功能。
在這裡插入圖片描述

項目架構和內容獲取

採用B/S的架構實現,整體遵循MVC的設計思想,採用的是前後端分離的技術。

> 開發系統:Windows
> 架構模式:MVC/前後端分離
J> >DK版本:Java JDK1.8
> 開發工具:idea或者eclipse
> 資料庫版本: mysql
> 資料庫可視化工具: navicat
> 後端:java,spring,springmvc,springboot,mybatis,tomcat等
> 前端:html,css,javascript,vue等
> 更多詳細內容可點擊查看:http://projecthelp.top

項目實現

所有的代碼文件都有詳細的註釋,不用擔心看不懂代碼的。

  • BookController圖書的控制器類:
@RestController
@RequestMapping("/book")
public class BookController extends BaseController {
    @Resource
    private BookService bookService;

    /**
     * 分頁查詢所有數據
     *
     * @param page 分頁對象
     * @param book 查詢實體
     * @return 所有數據
     */
    @GetMapping("/list")
    public R selectAll(Page<Book> page, Book book) {
        return result(this.bookService.page(page, book));
    }

    /**
     * 添加圖書
     *
     * @param book 圖書
     * @return 是否添加成功
     */
    @PostMapping("/add")
    public R addBook(@RequestBody Book book) {
        return result(bookService.save(book));
    }

    /**
     * 修改圖書
     *
     * @param book 圖書
     * @return 是否修改成功
     */
    @PostMapping("/update")
    public R updateBook(@RequestBody Book book) {
        return result(bookService.updateById(book));
    }

    /**
     * 根據圖書編號批量刪除圖書
     *
     * @param isbns 圖書編號表
     * @return 是否刪除成功
     */
    @GetMapping("/delete")
    public R deleteBook(@RequestParam List<String> isbns) {
        return result(bookService.removeByIds(isbns));
    }

    //======================= 讀者操作介面 ======================

    /**
     * 借閱圖書
     *
     * @param isbn     圖書編號
     * @param readerId 讀者編號
     * @return 是否借閱成功
     */
    @GetMapping("/lendBook")
    public R lendBook(String isbn, Long readerId) {
        return result(bookService.lendBook(isbn, readerId));
    }

    /**
     * 歸還圖書
     *
     * @param isbn     圖書編號
     * @param readerId 讀者編號
     * @return 是否歸還成功
     */
    @GetMapping("/returnBook")
    public R returnBook(String isbn, Long readerId) {
        return result(bookService.returnBook(isbn, readerId));
    }
}
  • 圖書service的實現類:
@Service("bookService")
public class BookServiceImpl extends ServiceImpl<BookMapper, Book> implements BookService {
    @Resource
    private LendRecordService lendRecordService;

    /**
     * 分頁查詢圖書
     *
     * @param page 分頁
     * @param book 查詢信息
     * @return 圖書列表,圖書總計
     */
    @Override
    public Map<String, Object> page(Page<Book> page, Book book) {
        String author = book.getAuthor();
        String bookName = book.getBookName();

        QueryWrapper<Book> wrapper = new QueryWrapper<>();
        wrapper.lambda().like(!StringUtils.isEmpty(author), Book::getAuthor, author)
                .like(!StringUtils.isEmpty(bookName), Book::getBookName, bookName);

        Page<Book> selectPage = this.baseMapper.selectPage(page, wrapper);
        Map<String, Object> map = new HashMap<>();
        map.put("list", selectPage.getRecords());
        map.put("total", selectPage.getTotal());
        return map;
    }

    /**
     * 借閱圖書
     * 根據圖書的isbn編號借閱圖書
     * 如果當前圖書未被借閱(status為0),修改status為1,同時新增一條借閱記錄
     *
     * @param isbn     圖書編號
     * @param readerId 讀者編號
     * @return 是否借閱成功
     */
    @Override
    public boolean lendBook(String isbn, Long readerId) {
        Book book = this.baseMapper.selectById(isbn);
        book.setStatus("1");
        int res = this.baseMapper.updateById(book);

        // 新增借閱記錄
        LendRecord lendRecord = new LendRecord();
        lendRecord.setIsbn(isbn);
        lendRecord.setReaderId(readerId);
        lendRecord.setLendDate(new Date());
        boolean save = lendRecordService.save(lendRecord);

        return res == 1 && save;
    }

    /**
     * 歸還圖書
     *
     * @param isbn     圖書編號
     * @param readerId 讀者編號
     * @return 是否歸還成功
     */
    @Override
    public boolean returnBook(String isbn, Long readerId) {
        Book book = this.baseMapper.selectById(isbn);
        book.setStatus("0");
        int res = this.baseMapper.updateById(book);

        // 更新借閱記錄狀態
        QueryWrapper<LendRecord> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(LendRecord::getStatus, "0").eq(LendRecord::getIsbn, isbn).eq(LendRecord::getReaderId, readerId);
        LendRecord lendRecord = lendRecordService.getOne(wrapper);
        lendRecord.setReturnDate(new Date());
        lendRecord.setStatus("1");
        boolean update = lendRecordService.update(lendRecord, wrapper);

        return res == 1 && update;

    }
}
  • 系統登錄處理控制器LoginController:
@RestController
public class LoginController extends BaseController {
    @Resource
    private AdminService adminService;
    @Resource
    private ReaderService readerService;

    /**
     * 登錄
     *
     * @param loginBody 登錄信息
     * @return 隨機字元串uuid
     */
    @PostMapping("/login")
    public R login(@RequestBody LoginBody loginBody) {
        String username = loginBody.getUsername();
        String password = loginBody.getPassword();
        String role = loginBody.getRole();
        Object user = null;

        if (!StringUtils.isEmpty(role)) {
            if ("reader".equals(role)) {
                // 讀者登錄
                QueryWrapper<Reader> wrapper = new QueryWrapper<>();
                wrapper.lambda().eq(Reader::getUsername, username).eq(Reader::getPassword, password);
                user = readerService.getOne(wrapper);
            } else if ("admin".equals(role)) {
                // 管理員登錄
                QueryWrapper<Admin> wrapper = new QueryWrapper<>();
                wrapper.lambda().eq(Admin::getUsername, username).eq(Admin::getPassword, password);
                user = adminService.getOne(wrapper);
            }
        }

        if (user != null) { // 登錄成功
            String uuid = UUIDUtils.getUUID();
            Long userId = "admin".equals(role) ? ((Admin) user).getId() : ((Reader) user).getReaderId();
            LoginUser.addUser(uuid, role, userId);
            LoginUser.addVisitCount(); // 訪問數量加1
            return result(uuid, "登錄成功!");
        } else {
            return result(R.ERROR, "登錄失敗! 賬號或密碼錯誤!");
        }
    }

    /**
     * 獲取用戶信息
     *
     * @param token 令牌
     * @return 用戶信息
     */
    @GetMapping("/getInfo")
    public R getInfo(String token) {
        if (!StringUtils.isEmpty(token)) {
            User u = LoginUser.getUserByToken(token);
            if (u != null) {
                // token驗證成功
                String role = u.getRole();
                Long userId = u.getUserId();
                Object user = null;

                if ("reader".equals(role)) {
                    // 獲取讀者信息
                    QueryWrapper<Reader> wrapper = new QueryWrapper<>();
                    wrapper.lambda().eq(Reader::getReaderId, userId);
                    user = readerService.getOne(wrapper);
                } else if ("admin".equals(role)) {
                    // 獲取管理員信息
                    QueryWrapper<Admin> wrapper = new QueryWrapper<>();
                    wrapper.lambda().eq(Admin::getId, userId);
                    user = adminService.getOne(wrapper);
                }
                return result(user);
            }
        }
        return result(R.SUCCESS, "暫未登錄!");
    }

    /**
     * 獲取訪問數量
     *
     * @return 訪問數量
     */
    @GetMapping("/visitCount")
    public R visitCount() {
        return result(LoginUser.getVisitCount());
    }
}
  • 完整項目獲取
瀏覽器輸入 projecthelp.top 

部分功能展示

登錄頁面

管理員和讀者可以通過賬號密碼登錄系統中:
在這裡插入圖片描述

管理員角色

管理員首頁

管理員首頁展示了所有的借閱次數,總共訪問數,總共的圖書數量以及總共的讀者數量,同時還了圖表顯示:
在這裡插入圖片描述

圖書管理

管理員可以上架新的圖書,可以修改,刪除圖書:
在這裡插入圖片描述

讀者管理

管理員可以看到所有的系統讀者,還可以增加讀者,修改密碼等等:
在這裡插入圖片描述

借閱管理

管理員可以查看所有的系統圖書的借閱記錄:
在這裡插入圖片描述

讀者角色

圖書查詢

讀者可以通過圖書名稱或者圖書的作者查詢系統的圖書列表,對於未借閱的圖書,讀者可以點擊借閱即可借閱圖書,然後對於自己已借閱的圖書可以進行歸還:
在這裡插入圖片描述

查看自己的借閱記錄

對於讀者在系統上面的借閱記錄,可以在借閱管理進行查看:
在這裡插入圖片描述

個人信息

讀者可以在個人中心進行信息修改:
在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 3)OAuth2 Client 結合GitHub授權案例 本隨筆說明:這僅作為OAuth2 Client初次使用的案例,所以寫得很簡單,有許多的不足之處。 OAuth2 Client(OAuth2客戶端)是指使用OAuth2協議與授權伺服器進行通信並獲取訪問令牌的應用程式或服務。OAuth2客戶端代 ...
  • 大家好,我是3y,今天繼續來聊我的開源項目austin啊,但實際內容更新不多。這文章主是想吹下水,主要聊聊我在更新項目中學到的小技巧。 今天所說的小技巧可能有很多人都會,但肯定也會有跟我一樣之前沒用過的。 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】【釘釘】等消息 ...
  • 非科班,經歷了無數場秋招,現將面試京東的題目記錄如下: 一面 kafka在應用場景以及 項目 里的實現 bitmap底層 object里有哪些方法 hashmap相關 sychronized和reentrantlock相關問題以及鎖升級 cas和volatile 線程幾種狀態以及轉化 jvm記憶體模型 ...
  • 做業務的時候經常忘記@RequestParam註解參數,記錄一下 首先,我們要清楚@RequestParam是乾什麼的 @RequestParam:將請求參數綁定到你控制器的方法參數上,路徑上有個參數+? @RequestParam註解參數: 語法:@RequestParam(value=”參數名” ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記三十八之發送郵件 這一篇筆記介紹如何在 Django 中發送郵件。 在 Python 中,提供了 smtplib 的郵件模塊,而 Django 在這個基礎上對其進行了封裝,我們可以通過 django.core.mail 來調用。 以下是本 ...
  • 不要跳過這部分知識,對瞭解 NodeManager 本地目錄結構,和熟悉 Container 啟動流程有幫助。 一、分散式緩存介紹 主要作用就是將用戶應用程式執行時,所需的外部文件資源下載緩存到各個節點。 YARN 分散式緩存工作流程如下: 客戶端將應用程式所需的文件資源 (外部字典、JAR 包、二 ...
  • ​ 本文分享一個給力的Java後端面試題網站:面試梯。 網址:https://offer.skyofit.com 這套題真實、高頻、全面、有詳細答案、保你穩過面試,讓你成為offer收割機。題目包括:Java基礎、多線程、JVM、資料庫、Redis、Shiro、Spring、SpringBoot、M ...
  • 3.1一個簡單的Java語言程式 這是程式雖然很簡單,但是所有的Java程式都具有這種結構,因此還是值得花一些時間來研究的。首先,Java區分大小寫。如果出現了大小寫拼寫錯誤(例如:將main拼寫成Main),程式將無法運行。 下麵逐行的查看這段源代碼。關鍵字pubilc稱為訪問修飾符(access ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...