图书管理系统

本文详细介绍了使用JavaSE创建一个简单的图书管理系统,包括Book类的定义、BookList类的书架管理、User类的用户权限区分(管理员和普通用户),以及实现基本操作如添加、删除、查找和借阅图书的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[JavaSE]图书管理系统的建立

  1. 框架的建立

    ​ 首先需要明确建立的图书管理系统要有什么:

    ​ 1.要有书 2.要有用户 3.管理员与普通用户的权限与操作

    所以我们分别创建三个package:Book、Operation、User

    在这里插入图片描述

    ​ 三个package里存放各自对应的对象。接下来按照所需往里面加入类。

  2. 定义书和书架

    <1>Book类–书籍

    ​ 图书管理自然需要有书,所以我们定义Book类,在Book类中定义基本信息,例如:书名、作者、书价格、书类型、借阅状态等等,通过private关键字进行封装,最后定义代码对其进行获取与填入。

    package Book;
    
    public class Book {
        private String name;
        private String author;
        private String type;
        private int price;
        private boolean isBorrowed;
    
        public Book(String name, String author, String type, int price) {
            this.name = name;
            this.author = author;
            this.type = type;
            this.price = price;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getAuthor() {
            return author;
        }
    
        public void setAuthor(String author) {
            this.author = author;
        }
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    
        public boolean isBorrowed() {
            return isBorrowed;
        }
    
        public void setBorrowed(boolean borrowed) {
            isBorrowed = borrowed;
        }
    
        @Override
        public String toString() {
            return "Book{" +
                    "name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", type='" + type + '\'' +
                    ", price=" + price +
                    ", isBorrowed=" + isBorrowed +
                    '}';
        }
    }
    

    ​ 定义构造方法、Getting和Setting方法以及重写toString方法,这样就可以对私有的成员变量赋值以及获取,并通过toString方法打印Book的信息,这样对Book的相关操作就完成了。

    <2>BookList类–书架

    ​ 有书自然就有存放书的书架。建立BookList类:

    package Book;
    
    public class BookList{
    
        private int usedSize;//当前书架上实际存放书的数量
        private Book[] books;
        private static final int DEFAULT_CAPACITY = 10;
    
        public BookList() {
            this.books = new Book[DEFAULT_CAPACITY];
            this.usedSize = 0;
        }
    
        public int getUsedSize() {
            return usedSize;
        }
    
        public void setUsedSize(int usedSize) {
            this.usedSize = usedSize;
        }
    
        public Book[] getBooks() {
            return books;
        }
    
        public void setBook(int pos,Book book) {
            books[pos] = book;
        }
    
        public Book getBook(int pos) {
            return books[pos];
        }
    }
    

    ​ 在此类中,我们定义了usedSize变量来判断书架上实际有多少书;定义数组Book[] book来存放书。在构造方法中,初始化数组(这里我定义数组大小为10,所以最多存放10本书,可以根据自己的需求更改)以及初始化usedSize=0。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KFNPMArY-1692520617526)(C:\Users\均先生\AppData\Roaming\Typora\typora-user-images\image-20230820154544969.png)]

  3. 用户权限与管理员权限

    3.1构思

    ​ 用户分为普通用户和管理员用户,所以创建AdminUser和NormalUser类。因为这两个类中有相同的操作,所以定义User类是管理员和普通用户继承User类,构成向上转型。

    User

    package User;
    
    import Book.BookList;
    import Operation.IOOperation;
    
    public abstract class User {
        protected String name;
        protected IOOperation[] ioOperations;
    
        public User(String name) {
            this.name = name;
        }
    
        public abstract int menu();
    
        public void doOperation(int choice, BookList bookList) {
            ioOperations[choice].work(bookList);
        }
    }
    

    我还定义了一个接口

    package Operation;
    
    import Book.BookList;
    
    public interface IOOperation {
        void work(BookList bookList);
    }
    
    3.2管理员用户
    package User;
    
    import Operation.*;
    
    import java.util.Scanner;
    
    public class AdminUser extends User{
    
        public AdminUser(String name) {
            super(name);
            this.ioOperations = new IOOperation[]{
                    new ExitOperation(),
                    new FindOperation(),
                    new AddOperation(),
                    new DelOperation(),
                    new ShowOperation()
            };
        }
    
        @Override
        public int menu() {
            System.out.println("=============================");
            System.out.println("1、查找图书");
            System.out.println("2、新增图书");
            System.out.println("3、删除图书");
            System.out.println("4、显示图书");
            System.out.println("0、退出系统");
            System.out.println("=============================");
    
            w:{
                System.out.println("请选择你的操作:");
                Scanner scan = new Scanner(System.in);
                int choice = scan.nextInt();
    
                while (choice > 4 || choice < 0) {
                    System.out.println("请重新输入!");
                    break w;
                }
                return choice;
            }
            return menu();
        }
    }
    

    ​ 重写父类的抽象方法menu来创造目录,再在构造方法中根据所写目录来初始对象

    在这里插入图片描述

    ​ 当输入的数字不在可选目录中来会跳转来重新输入。

    3.3 普通用户

    与AdminUser类基本一致,只需更改目录即可

    package User;
    
    import Operation.*;
    
    import java.util.Scanner;
    
    public class NormalUser extends User{
        public NormalUser(String name) {
            super(name);
            this.ioOperations = new IOOperation[]{
                    new ExitOperation(),
                    new FindOperation(),
                    new BorrwoedOperation(),
                    new ReturnOperation()
            };
        }
    
        @Override
        public int menu() {
            System.out.println("=============================");
            System.out.println("1、查找图书");
            System.out.println("2、借阅图书");
            System.out.println("3、归还图书");
            System.out.println("0、退出图书");
            System.out.println("=============================");
    
            w:{
                System.out.println("请选择你的操作:");
                Scanner scan = new Scanner(System.in);
                int choice = scan.nextInt();
    
                while (choice > 3 || choice < 0) {
                    System.out.println("请重新输入!");
                    break w;
                }
                return choice;
            }
            return menu();
        }
    }
    
  4. 用户与管理员操作的定义

    在这里插入图片描述

    4.1新增图书
    package Operation;
    
    import Book.BookList;
    
    import Book.Book;
    import java.util.Scanner;
    
    public class AddOperation implements IOOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("新增图书!");
    
            Scanner scan = new Scanner(System.in);
            System.out.print("请输入书名:");
            String name = scan.nextLine();
    
            System.out.print("请输入作者:");
            String author = scan.nextLine();
    
            System.out.print("请输入书籍类型:");
            String type = scan.nextLine();
    
            System.out.print("请输入书籍价格:");
            int price = scan.nextInt();
    
            Book book = new Book(name, author, type, price);
    
            //检测书架是否有此书
            int currentSize = bookList.getUsedSize();
            for (int i = 0; i < currentSize; i++) {
                Book book1 = bookList.getBook(i);
                if (book1.getName().equals(name)) {
                    System.out.println("有这本书了!");
                    return;
                }
            }
            if (currentSize == bookList.getBooks().length) {
                System.out.println("书架满了,无法再放入!");
            } else {
                bookList.setBook(currentSize, book);
                bookList.setUsedSize(currentSize + 1);
            }
        }
    }
    

    ​ 分为三种情况:书架已有此书、书架满了以及书架没有此书,需要全部考虑。

    4.2删除图书
    package Operation;
    
    import Book.Book;
    import Book.BookList;
    
    import java.util.Scanner;
    
    public class DelOperation implements IOOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("删除图书");
            System.out.println("请输入你要删除图书的名称:");
            Scanner in = new Scanner(System.in);
            String name = in.nextLine();
            int currentSize = bookList.getUsedSize();
            int pos = -1;
    
            int i = 0;
            for (; i < currentSize; i++) {
                Book book = bookList.getBook(i);
                if (book.getName().equals(name)) {
                    pos = i;
                    break;
                }
            }
    
            if (i == currentSize) {
                System.out.println("没有图书删除!");
                return;
            }else {
                int j = pos;
                for (; i < currentSize - 1; j++) {
                    Book book = bookList.getBook(j+1);
                    bookList.setBook(j,book);
                }
                bookList.setBook(j,null);
                bookList.setUsedSize(currentSize-1);
            }
        }
    }
    

    ​ 两种情况:书架有此书、书架没有这本书。

    ​ 当有此书时,让pos等于该书所在下标,然后从此位置开始将后面的内容往前移动,最后usedSize-1;

    4.3查找图书
    package Operation;
    
    import Book.Book;
    import Book.BookList;
    
    import java.util.Scanner;
    
    public class FindOperation implements IOOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("查找图书");
            Scanner in = new Scanner(System.in);
            String name = in.nextLine();
    
            int currentSize = bookList.getUsedSize();
            //遍历数组查找
            for (int i = 0; i < currentSize; i++) {
                Book book1 = bookList.getBook(i);
                if (book1.getName().equals(name)) {
                    System.out.println("找到了这本书,信息如下");
                    System.out.println(book1);
                    return;
                }
            }
            System.out.println("没有找到这本书!");
        }
    }
    

    遍历数组查询,找了就直接return终止,若遍历完了没有就代表没有这本书。

    4.4展示图书
    package Operation;
    
    import Book.BookList;
    
    import Book.Book;
    
    public class ShowOperation implements IOOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("展示所有书籍");
            int currentSize = bookList.getUsedSize();
            if (currentSize == 0) {
                System.out.println("暂时没有书籍!");
            }
            for (int i = 0; i < currentSize; i++) {
                Book book = bookList.getBook(i);
                System.out.println(book);
            }
    
        }
    }
    

    有书就遍历数组打印书籍信息,没书就打印没书

    4.5借阅图书
    package Operation;
    
    import Book.Book;
    import Book.BookList;
    
    import java.util.Scanner;
    
    public class BorrwoedOperation implements IOOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("借阅图书!");
            Scanner in = new Scanner(System.in);
            System.out.println("请输入你要借阅书籍的名称:");
            String name = in.nextLine();
    
            int currentSize = bookList.getUsedSize();
            int i = 0;
            for (; i < currentSize; i++) {
                Book book = bookList.getBook(i);
                if (book.getName().equals(name)) {
                    book.setBorrowed(true);
                    System.out.println("借阅成功!");
                    System.out.println(book);
                    return;
                }
            }
            if (i == currentSize) {
                System.out.println("没有你要找的图书!");
                return;
            }
    
        }
    }
    
    4.6归还图书
    package Operation;
    
    import Book.Book;
    import Book.BookList;
    
    import java.util.Scanner;
    
    public class ReturnOperation implements IOOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("归还书籍");
            System.out.println("请输入你要归还的书籍:");
            Scanner in = new Scanner(System.in);
            String name = in.nextLine();
            int currentsize = bookList.getUsedSize();
            for (int i = 0; i < currentsize; i++) {
                Book book = bookList.getBook(i);
                if (book.getName().equals(name)) {
                    book.setBorrowed(false);
                    System.out.println("归还成功!");
                    System.out.println(book);
                    return;
                }
            }
            System.out.println("你要归还的书籍不存在!");
        }
    }
    
    4.7退出系统
    package Operation;
    
    import Book.BookList;
    
    public class ExitOperation implements IOOperation{
        @Override
        public void work(BookList bookList) {
            System.out.println("退出系统");
            System.exit(0);
        }
    }
    
  5. main方法串联起来

    import Book.BookList;
    import User.AdminUser;
    import User.NormalUser;
    import User.User;
    
    
    import java.util.Scanner;
    
    public class main {
    
        public static User login() {
            var scan = new Scanner(System.in);
            System.out.println("请输入你的姓名:");
            String name = scan.nextLine();
            System.out.println("请选择你的身份:1、管理员   2、用户");
            int choise = scan.nextInt();
    
            if (choise == 1) {
                //管理员
                return new AdminUser(name);
            }else {
                //普通用户
                return new NormalUser(name);
            }
        }
    
        public static void main(String[] args) {
            BookList bookList = new BookList();
            User user = login();
    
            while (true) {
                int choise = user.menu();
                System.out.print("您选择了" + choise + ",");
                user.doOperation(choise,bookList);
            }
        }
    }
    

    ​ 这里只是简单的设置了一个登录,可以自行设置如密码登录、注册等方式的登录方法。

    6.总结

    ​ 写代码的思路其实就是由简入深,先设计一个大致的框架,然后根据面向对象的思想逐步完善各个类。当写完User时可以在Operation各项操作类中放置简单的一条输出语句,运行无误后再对Operation包中的类进行具体的操作。

    ​ 还有在测试时BookList中放入基本书,如:

    public BookList() {
            this.books = new Book[DEFAULT_CAPACITY];
            //放好树!!
            this.books[0] = new Book("三国演义","罗贯中",10,"小说");
            this.books[1] = new Book("西游记","吴承恩",9,"小说");
            this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");
    
            this.usedSize = 3;
        }
    

    ​ 这个图书管理系统的缺点也很明显,那就是每次运行里面的内容都会清空,可以写一个文件用来保存,也可以创建一个数据库来保存,这只是一个样本。

简单的设置了一个登录,可以自行设置如密码登录、注册等方式的登录方法。

**6.总结**

​		写代码的思路其实就是由简入深,先设计一个大致的框架,然后根据面向对象的思想逐步完善各个类。当写完User时可以在Operation各项操作类中放置简单的一条输出语句,运行无误后再对Operation包中的类进行具体的操作。

​		还有在测试时BookList中放入基本书,如:

```java
public BookList() {
        this.books = new Book[DEFAULT_CAPACITY];
        //放好树!!
        this.books[0] = new Book("三国演义","罗贯中",10,"小说");
        this.books[1] = new Book("西游记","吴承恩",9,"小说");
        this.books[2] = new Book("红楼梦","曹雪芹",19,"小说");

        this.usedSize = 3;
    }
```

​		这个图书管理系统的缺点也很明显,那就是每次运行里面的内容都
会清空,可以写一个文件用来保存,也可以创建一个数据库来保存,这只是一
个样例。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值