Java实现命令行图书管理系统(附完整源码)

MABO-mb 2025-06-05 10:15:39编程技术
616

在信息技术飞速发展的今天,图书管理系统已成为图书馆和各类机构不可或缺的一部分。为了提升图书管理的效率和用户体验,本文将介绍一个基于Java语言开发的命令行图书管理系统。该系统不仅实现了基本的图书管理功能,还通过面向对象的设计理念,使得代码结构清晰、易于维护和扩展。通过本系统的学习和实践,读者可以深入了解Java编程的基本概念和设计模式,为进一步学习其他技术打下坚实的基础。

一、项目概述

本文将介绍如何使用Java实现一个基于命令行的图书管理系统。系统支持管理员普通用户两种角色,提供图书的增删改查、借阅归还等功能。项目采用面向对象设计原则,代码结构清晰,适合Java初学者学习。

二、系统功能架构

Java实现命令行图书管理系统(附完整源码)

graph TD

    A[图书管理系统] --> B[图书管理]

    A --> C[用户管理]

    B --> D[添加图书]

    B --> E[删除图书]

    B --> F[查找图书]

    B --> G[显示图书]

    B --> H[借阅归还]

    C --> I[管理员]

    C --> J[普通用户] 

三、核心类设计 

1. 图书类(Book)

属性: 

  • 书名

  • 作者

  • 价格

  • 类型

  • 借阅状态

 代码实现

package book_management.book;
// 关于具体书本的类
public class Book {
    private String bookName; //书名
    private String author; //作者
    private Double price; //价格
    private String type; //类别
    private Boolean isBorrowed; //借阅状态,false是未借出,true是借出

    public Book(String bookName, String author, Double price, String type) {
        this.bookName = bookName;
        this.author = author;
        this.price = price;
        this.type = type;
        this.isBorrowed = false;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setBorrowed(Boolean borrowed) {
        isBorrowed = borrowed;
    }

    public String getBookName() {
        return bookName;
    }

    public String getAuthor() {
        return author;
    }

    public Double getPrice() {
        return price;
    }

    public String getType() {
        return type;
    }

    public Boolean getBorrowed() {
        return isBorrowed;
    }
}

2. 书架类(BookList)

 使用ArrayList管理图书集合:

public class BookList {
    //存放所有具体的书本对象 - 动态数据
    private final List<Book> books = new ArrayList<>();
    // 保存当前所有书本的名称 - 动态数据
    private final List<String> bookNames = new ArrayList<>();

    public BookList() {
        //在类加载时,将静态变量初始化,相当于图书馆中默认的藏书
        //四大名著作为默认书籍添加到图书馆中
        addBook(new Book("三国演义", "罗贯中", 83.5, "小说"));
        addBook(new Book("水浒传", "施耐庵", 65.5, "小说"));
        addBook(new Book("西游记", "吴承恩", 55.5, "小说"));
        addBook(new Book("红楼梦", "曹雪芹", 66.6, "小说"));

    }
    public void addBook(Book book) {
        books.add(book);
        bookNames.add(book.getBookName());
    }

    // 获取书籍数量
    public int getSize() {
        return books.size();
    }

    // 获取指定书籍
    public Book getBook(int index) {
        if (index >= 0 && index < books.size()) {
            return books.get(index);
        }
        return null;
    }

    // 添加删除方法
    public void removeBook(int index) {
        if (index >= 0 && index < books.size()) {
            String bookName = books.get(index).getBookName();
            books.remove(index);
            bookNames.remove(bookName);
        }
    }

    // 添加查找方法
    public int findBookIndex(String bookName) {
        for (int i = 0; i < books.size(); i++) {
            if (books.get(i).getBookName().equals(bookName)) {
                return i;
            }
        }
        return -1;
    }
}

3. 操作接口(IOperation) 

public interface IOperation {
    void work(BookList bookList, Scanner scanner);
}

四、功能实现

1. 查找图书(FindOperation) 

实现逻辑

  1. 接收用户输入的书名

  2. 遍历书架匹配图书

  3. 输出查找结果

核心代码

public class FindOperation implements IOperation {
    @Override
    public void work(BookList bookList, Scanner scanner) {
        System.out.println("============ 查找书籍 ============");

        // 清除可能存在的换行符
        scanner.nextLine();

        System.out.println("请输入书名:");
        String name = scanner.nextLine(); // 等待用户输入

        boolean found = false;
        for (int i = 0; i < bookList.getSize(); i++) {
            if (bookList.getBook(i).getBookName().equals(name)) {
                Book book = bookList.getBook(i);
                System.out.printf("找到书籍: 《%s》 作者:%s 价格:%.2f 类型:%s%n",
                        book.getBookName(),
                        book.getAuthor(),
                        book.getPrice(),
                        book.getType());
                found = true;
                break;
            }
        }

        if (!found) {
            System.out.println("未找到书籍: " + name);
        }
        System.out.println("================================");
        System.out.println("按回车键返回菜单...");
        scanner.nextLine(); // 等待用户按回车
    }
}

2. 借阅图书(BorrowOperation)

sequenceDiagram

    用户->>系统: 输入借阅书名

    系统->>书架: 查找图书

    书架-->>系统: 返回图书对象

    系统->>图书: 标记为已借阅

    系统-->>用户: 显示借阅结果 

代码片段

if (book.getBorrowed()) {
    System.out.println("该图书已被借出");
} else {
    book.setBorrowed(true);
    System.out.println("借阅成功");
}

3. 归还图书(ReturnOperation) 

界面截图

Java实现命令行图书管理系统(附完整源码)

 代码片段

public void work(BookList bookList, Scanner scanner) {
        System.out.println("============ 归还书籍 ============");

        // 清除输入缓冲区
        scanner.nextLine();

        System.out.println("请输入要归还的书名:");
        String name = scanner.nextLine();

        boolean found = false;
        for (int i = 0; i < bookList.getSize(); i++) {
            Book book = bookList.getBook(i);
            if (book.getBookName().equals(name)) {
                if (book.getBorrowed()) {
                    book.setBorrowed(false);
                    System.out.println("归还成功!感谢您归还《" + name + "》");
                } else {
                    System.out.println("《" + name + "》未被借出,无需归还");
                }
                found = true;
                break;
            }
        }

        if (!found) {
            System.out.println("未找到书籍: " + name);
        }

五、用户系统设计

1. 用户基类(User)

public abstract class User {
    protected String userName;
    // 不同用户对应的权限,就在IOperation数组中
    protected IOperation[] operations;
    protected Scanner scanner;

    public User(String userName, Scanner scanner) {
        this.userName = userName;
        this.scanner = scanner;
    }

    // 根据用户的输入返回具体的操作编号
    //只有具体子类才知道菜单的功能是啥,强制要求所有具体子类必须实现此方法
    public abstract int menu();

    public void doOperation(int choice, BookList bookList) {
        if (choice > 0 && choice <= operations.length) {
            operations[choice - 1].work(bookList, scanner);
        } else if (choice != -1) {
            System.out.println("无效的选择!");
        }
    }
}

 2. 管理员(AdminUser)

功能菜单

  1. 新增图书

  2. 删除图书

  3. 查找图书

  4. 显示所有图书

  5. 退出系统

界面截图: 

Java实现命令行图书管理系统(附完整源码)

代码片段: 

 public int menu() {
        System.out.println("===================================");
        System.out.println("欢迎管理员" + super.userName + "登录MB的图书管理系统");
        System.out.println("1.增加书籍");
        System.out.println("2.删除书籍");
        System.out.println("3.修改书籍");
        System.out.println("4.查询书籍");
        System.out.println("5.查看书籍列表");
        System.out.println("-1.退出");
        System.out.println("请输入你的选择");
        try {
            int choice = scanner.nextInt();
            scanner.nextLine();
            System.out.println("===================================");
            return choice;
        }catch (InputMismatchException e) {
            System.out.println("输入无效,请输入数字!");
            scanner.nextLine();
            return -2;
        }
    }
}

 3. 普通用户(NormalUser)

菜单实现代码

 public int menu() {
        System.out.println("===================================");
        System.out.println("欢迎用户" + super.userName + "登录MB的图书管理系统");
        System.out.println("1.显示书籍列表");
        System.out.println("2.查询书籍");
        System.out.println("3.借阅书籍");
        System.out.println("4.归还书籍");
        System.out.println("-1.退出");
        System.out.println("请输入你的选择");
        int choice = scanner.nextInt();
        scanner.nextLine();
        System.out.println("===================================");
        return choice;
    }
}

 六、主函数逻辑

程序启动流程

public class Main {
    public static void main(String[] args) {
        Scanner mainScanner = new Scanner(System.in);
        BookList bookList = new BookList();
        User user = login(mainScanner,bookList);

        while (true) {
            int choice = user.menu();
            if (choice == -1) {
                System.out.println("Bye ~~");
                break;
            }
            user.doOperation(choice, bookList);
        }
        mainScanner.close();
    }

    private static User login(Scanner scanner, BookList bookList) {
        System.out.println("请输入您的姓名 : ");
        String userName = scanner.nextLine();

        System.out.println("请输入您的身份,1表示普通用户,0表示管理员");
        int who = scanner.nextInt();

        if (who == 1) {
            return new NormalUser(userName, scanner);  // 1对应普通用户
        } else {
            return new AdminUser(userName, scanner,bookList);   // 0对应管理员
        }
    }
}

登录界面截图: 

Java实现命令行图书管理系统(附完整源码)

七、项目总结

技术亮点

  1. 采用面向接口编程,操作解耦

  2. 使用继承实现多态用户系统

  3. 异常处理完善,避免程序崩溃

扩展方向

  • 添加数据库持久化存储

  • 实现图书预约功能

  • 增加借阅期限管理

完整源码获取: java_se_code: Mb's Library Management System

本文详细介绍了如何使用Java开发一个基于命令行的图书管理系统,涵盖了图书管理系统的基本功能需求和实现方法。系统采用面向对象的设计理念,包括图书类、书架类、归还图书类等核心类的设计,并实现了管理员和普通用户两种角色的不同操作界面。通过该系统,读者可以掌握Java编程的基本技能,理解面向对象设计的优势,并为未来的项目开发积累宝贵的经验。

Java 图书管理系统
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Java日志管理框架:Log4j、SLF4J、Logback对比与使用方法详解
java主流日志框架中,Log4j 1.x作为早期标准,Log4j 2.x通过重构实现性能飞跃,Logback作为Log4j的继承者以原生SLF4J支持成为主流选择,而SLF4J作为日志门面,通过抽象层实现...
2025-09-15 编程技术
792

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
本文聚焦Java与MySQL协同环境下的全文检索优化实践,从索引策略、查询调优、参数配置到Java层优化,深入解析如何释放全文检索的潜力,为高并发、大数据量场景提供稳定高效的搜...
2025-09-13 编程技术
767

JavaScript 中 instanceof 的作用及使用方法详解
在 JavaScript 的类型检查体系中,instanceof 是一个重要的操作符,用于判断一个对象是否属于某个构造函数的实例或其原型链上的类型。本文ZHANID工具网将系统讲解 instanceof...
2025-09-11 编程技术
818

Java与MySQL数据库连接实战:JDBC使用教程
JDBC(Java Database Connectivity)作为Java标准API,为开发者提供了统一的数据访问接口,使得Java程序能够无缝连接各类关系型数据库。本文ZHANID工具网将以MySQL数据库为例...
2025-09-11 编程技术
668

JavaScript出现“undefined is not a function”错误的解决方法
在JavaScript开发中,TypeError: undefined is not a function 是最常见的运行时错误之一,通常表示代码尝试调用一个未定义(undefined)的值作为函数。本文ZHANID工具网将从...
2025-09-10 编程技术
718

Java集合框架:List、Set、Map的使用与区别详解
Java集合框架是JDK中提供的核心数据结构库,为开发者提供了高效、安全、可扩展的集合操作能力。本文ZHANID工具网将系统解析List、Set、Map三大核心接口的实现类及其使用场景,...
2025-09-09 编程技术
636