图书管理系统(Java实现)
在写之前需要了解图书管理系统是怎样的,需要自己设定规则(我这个是借鉴他人的规则)。
- 首先需要创建书籍(书名、作者、价格、类型、是否被借阅等属性),需要可以得到和改变各种属性;
- 创建后需要书架将书进行存放,或者可以假设书架中存放了一些书(也可以不存放,由管理员存放书籍),书架这里就需要用数组存放,且还需要一个计数器来记录书架中书籍的数量,在书架中还需要知道书的下标(getbooks),需要根据计数器来存放新的书籍(setbooks),也需要得到书架中的书籍数量(getcount),还需要可以改变书籍数量的(setcount);
- 然后就是创建使用者,这个图书管理系统可以分两种使用者(一类是管理员,另一类就是普通的借阅者),然后可以通过继承将两者联系在一块,使用者是父类,管理员和普通借阅者是子类,子类们都有自己的菜单;
- 管理员:增加、删除、改变、查找、显示(书架)、退出;
- 普通借阅者:借阅、归还、查找、显示、退出;
- 最后就是写主方法;
目录
创建一个文件
创建一个book封装包
创建一个Book类
创建一个BookList类
创建一个user封装包
创建一个User类
创建一个AdminiUser(继承User)类
创建一个OrdinaryUser(继承User)类
创建一个action封装包
创建一个IAction接口
创建一个AddAction类
创建一个BorrowAction类
创建一个ChangeAction类
创建一个DelAction类
创建一个EixtAction类
创建一个ReturnAction类
创建一个SearchAction类
创建一个ShowAction类
创建一个Main类
创建一个文件
创建一个book封装包
创建一个Book类
在Book类中首先需要创建属性以及方法。 get和set方法不需要自己写,可以直接生成,这些方法的作用就是可以通过(get和set)方法来得到和改变属性。 在构造方法中不加isBorrowed就是因为它只有两种结果(true和false),所以不需要输入它的初始值。 还有就是toString直接输出所有的属性。
package book;
public class Book {
private String bookName;//书名
private String autor;//书的作者
private double price;//书的价钱
private String type;//书的类型
private boolean isBorrowed;//默认false未被借出
public String getAutor() {
return autor;
}
public String getBookName() {
return bookName;
}
public boolean isBorrowed() {
return isBorrowed;
}
public double getPrice() {
return price;
}
public String getType() {
return type;
}
public void setAutor(String autor) {
this.autor = autor;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
public void setPrice(double price) {
this.price = price;
}
public void setType(String type) {
this.type = type;
}
public Book(String bookName, String autor, double price, String type) {
this.autor = autor;
this.bookName = bookName;
this.price = price;
this.type = type;
}
@Override
public String toString() {
return "Book{" +
", bookName='" + bookName + '\'' +
"autor='" + autor + '\'' +
", price=" + price +
", type='" + type + '\'' +
((isBorrowed == true)?" 已被借出":" 未被借出") +
'}';
}
}
创建一个BookList类
这个类可以说是一个书架,通过数组将书籍进行排放、还有通过计数器计算书籍的数量 还有一些方法。 详细方法看下面代码:
package book;
public class BookList {
private Book[] books = new Book[30];
private int count;
//实例代码块
// {
// books[0] = new Book("《活着》", "余华", 20.1,"文学");
// books[1] = new Book("《我与地坛》", "史铁生", 25, "小说");
// }
//构造方法
public BookList(){
//也可以在构造方法中创建
this.books[0] = new Book("《活着》", "余华", 20.1,"文学");
this.books[1] = new Book("《我与地坛》", "史铁生", 25, "小说");
this.count = 2;
}
//得到书架中某本书的位置
public Book getBooks(int pos) {
return books[pos];
}
//将书架中某位置放入书籍
public void setBooks(int pos,Book book) {
books[pos] = book;
}
//得到书架中书籍的数量
public int getCount(){
return count;
}
//改变书架中的书籍的数量
public void setCount(int count) {
this.count = count;
}
}
创建一个user封装包
创建一个User类
这个类是一个父类,我们不需要调用这里面的方法,所以将这个父类置为抽象类 。
package user;
import action.IAction;
import book.BookList;
public abstract class User {
public String name;//使用者
public IAction[] iActions;//将菜单中的目录由数组完成
public User(String name){
this.name = name;
}
public abstract int menu();
public void doAction(int choice, BookList booklist){
iActions[choice].work(booklist);
//这个是使用者选择的菜单目录,通过输入的选择访问初始化的菜单数组对应的下标
}
}
创建一个AdminiUser类
AdminiUser类是管理员的菜单,继承父类(User)。 首先是先写菜单函数(menu),然后就是使用者输入菜单前的序号进行返回。 然后写构造方法,这个构造方法必须包含父类的成员、还要初始化菜单数组,也就是管理员执行的一些活动称为菜单,初始化就是想要通过数组下标进行访问菜单。
package user;
import action.*;
import java.util.Scanner;
public class AdminiUser extends User{
public AdminiUser(String name) {
super(name);
this.iActions = new IAction[] {//初始化菜单数组
new EixtAction(),
new AddAction(),
new DelAction(),
new ChangeAction(),
new SearchAction(),
new ShowAction()
};
}
public int menu(){
System.out.println("*********************************");
System.out.println(name+"欢迎来到管理员菜单");
System.out.println("***** 1.新增图书");
System.out.println("***** 2.删除图书");
System.out.println("***** 3.改变图书");
System.out.println("***** 4.查找图书");
System.out.println("***** 5.显示图书");
System.out.println("***** 0.退出图书");
System.out.println("*********************************");
Scanner sc = new Scanner(System.in);
int choice =sc.nextInt();
return choice;
}
}
创建一个OrdinaryUser类
OrdinaryUser类是借阅者的菜单,也是继承父类(User)。 首先是先写菜单函数(menu),然后就是使用者输入菜单前的序号进行返回。 然后写构造方法,这个构造方法必须包含父类的成员、还要初始化菜单数组,也就是借阅者执行的一些活动称为菜单,初始化就是想要通过数组下标进行访问菜单。
package user;
import action.*;
import java.util.Scanner;
public class OrdinaryUser extends User{
public OrdinaryUser(String name) {
super(name);
this.iActions = new IAction[]{
new EixtAction(),
new BorrowAction(),
new ReturnAction(),
new ShowAction(),
new ShowAction()
};
}
@Override
public int menu(){
System.out.println("*********************************");
System.out.println(name+"欢迎来到借书者菜单");
System.out.println("***** 1.借阅图书");
System.out.println("***** 2.归还图书");
System.out.println("***** 3.查找图书");
System.out.println("***** 4.显示图书");
System.out.println("***** 0.退出图书");
System.out.println("*********************************");
Scanner sc = new Scanner(System.in);
int choice =sc.nextInt();
return choice;
}
}
创建一个action封装包
创建一个IAction接口
接口的创建就是为了后面的类可以使用接口中的抽象方法。
package action;
import book.BookList;
public interface IAction {
public void work(BookList booklist);
}
创建一个AddAction类
新增图书需要输入书籍的所有属性,然后就是如果输入的书籍在书架中以及存在的话就不能新增图书,所以需要遍历书架中的书(通过上面的getBooks方法、下标是i遍历 ),将书架下标为i的书籍存入局部变量(book1)中,就开始比较两本书(新增图书和下标为i的书籍)的书名是否相同(用equals方法),如果相同就提示一下再结束;不同的话就将新增书放入书架中(setBooks将新增书放入书架中,通过count计数器加一改变书架的数量setCount)。
package action;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class AddAction implements IAction{
@Override
public void work(BookList booklist) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要添加的书的名字:");
String bookName = sc.nextLine();
System.out.println("请输入你要添加的书的作者:");
String autor = sc.nextLine();
System.out.println("请输入你要添加的书的价格:");
double price = sc.nextDouble();
sc.nextLine();
System.out.println("请输入你要添加的书的类型:");
String type = sc.nextLine();
Book book = new Book(bookName, autor, price, type);
int count = booklist.getCount();
for (int i = 0; i < count; i++) {
//这一步是将创建的booklist中所有书籍中下标为i的书拿出来放入一个Book类型book1中存储
Book book1 = booklist.getBooks(i);
//如果相等就不添加,直接return
if (book1.equals(book)){
System.out.println("这本书已经存在,无法添加!");
return;
}
}
//将新加的书放入书柜中
booklist.setBooks(count, book);
//将count加1放入存入书柜中
booklist.setCount(count+1);
}
}
创建一个BorrowAction类
借阅图书需要输入书名,然后还是遍历书架的书,下标为i的书籍与借阅的书籍的书名进行比较,如果书架中存在同名的书然后还需要知道这本书是否被借阅(将在书架中同名的书访问isBorrowed是否为false进行借阅),如果是false那就可以借阅,且需要系统知道该书已被借阅(setBorrowed修改为已被借阅true);遍历一遍后还是没有这本书那就是书架中不存在这本书。
package action;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class BorrowAction implements IAction{
@Override
public void work(BookList booklist) {
System.out.println("请输入你要借阅的书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int count = booklist.getCount();
for (int i = 0; i < count; i++) {
Book book1 = booklist.getBooks(i);
if (book1.getBookName().equals(bookName)){
if (book1.isBorrowed() == false) {
book1.setBorrowed(true);
System.out.println("借阅成功!");
return;
}else{
System.out.println("该书已被借出,无法借阅!");
}
}
}
System.out.println("书柜中不存在你想借阅的这本书!");
}
}
创建一个ChangeAction类
package action;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ChangeAction implements IAction{
@Override
public void work(BookList booklist) {
System.out.println("请输入你要改变的书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int count = booklist.getCount();
for (int i = 0; i < count; i++) {
Book book1 = booklist.getBooks(i);
if (book1.getBookName().equals(bookName)){
System.out.println("请输入你要改变的书的作者:");
String autor = sc.nextLine();
book1.setAutor(autor);
System.out.println("请输入你要添加的书的价格:");
double price = sc.nextDouble();
book1.setPrice(price);
System.out.println("请输入你要添加的书的类型:");
String type = sc.nextLine();
book1.setType(type);
return;
}
}
System.out.println("书柜中不存在你想要改变的这本书!");
}
}
创建一个DelAction类
删除图书的重点就是将后面的图书往前挪。
package action;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class DelAction implements IAction{
@Override
public void work(BookList booklist) {
int count = booklist.getCount();
if(count == 0){
System.out.println("书架为空,无法删除!");
return;
}
System.out.println("请输入你要删除的书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
for (int i = 0; i <= count - 1; i++) {
Book book1 = booklist.getBooks(i);
if (book1.getBookName().equals(bookName)){
for (int j = i; j <= count - 1; j++) {
Book book2 = booklist.getBooks(j+1);
Book book3 = booklist.getBooks(j);
book3 = book2;
}
booklist.setCount(count - 1);
return;
}
}
System.out.println("书柜中不存在你想借阅的这本书!");
}
}
创建一个EixtAction类
退出图书需要将书架中所有书置为空、计数器也为空。
package action;
import book.BookList;
public class EixtAction implements IAction{
@Override
public void work(BookList booklist) {
System.out.println("退出图书");
int count = booklist.getCount();
for (int i = 0; i < count; i++) {
booklist.setBooks(i,null);
}
booklist.setCount(0);
}
}
创建一个ReturnAction类
归还图书也是遍历找要归还的书的书名(和借阅很相似)。
package action;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ReturnAction implements IAction{
@Override
public void work(BookList booklist) {
System.out.println("请输入你要归还的书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int count = booklist.getCount();
for (int i = 0; i < count; i++) {
Book book1 = booklist.getBooks(i);
if (book1.getBookName().equals(bookName)){
book1.setBorrowed(false);
return;
}
}
System.out.println("书柜中不存在你要归还的这本书!");
}
}
创建一个SearchAction类
查找图书也是一个道理,先遍历,存在就打印这个书,不存在就提示一下。
package action;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class SearchAction implements IAction{
@Override
public void work(BookList booklist) {
System.out.println("请输入你要查找的书:");
Scanner sc = new Scanner(System.in);
String bookName = sc.nextLine();
int count = booklist.getCount();
for (int i = 0; i < count; i++) {
Book book1 = booklist.getBooks(i);
if (book1.getBookName().equals(bookName)){
System.out.println(book1);
return;
}
}
System.out.println("书柜中不存在你想查找的这本书!");
}
}
创建一个ShowAction类
显示图示就是在遍历的同时打印图书,将书架中所有书都打印。
package action;
import book.Book;
import book.BookList;
import java.util.Scanner;
public class ShowAction implements IAction{
@Override
public void work(BookList booklist) {
int count = booklist.getCount();
for (int i = 0; i < count; i++) {
Book book1 = booklist.getBooks(i);
System.out.println(book1);
}
}
}
创建一个Main类
主方法是所有项目的开始,一个项目都是从main开始的,现在开始将这个图书管理系统的main方法。首先要创建一个书架,然后创建一个使用者,使用者的姓名及身份(是通过一个方法返回使用者类型,这里使用了向上转型,因为不返回的类型不一致但是都是继承同一个父类所有返回一个使用者类型)。
import book.BookList;
import user.AdminiUser;
import user.OrdinaryUser;
import user.User;
import java.util.Scanner;
public class Main {
public static User login(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的身份(1是管理员,2是普通人员):");
int choice = sc.nextInt();
if (choice == 1){
return new AdminiUser(name);
}else {
return new OrdinaryUser(name);
}
}
public static void main(String[] args) {
BookList booklist = new BookList();
User user = login();
while (true){
int choice = user.menu();
user.doAction(choice, booklist);
}
}
}
以上就是图书管理系统的整个流程。