目录
这个项目是一个简单的图书管理系统,主要功能包括图书的查找、新增、删除、显示、借阅和归还,同时支持管理员和普通用户两种角色。以下是项目的主要组成部分和功能
-
数据模型
Book
:书籍实体BookList
:书籍集合管理
-
操作模块
IOPeration
接口及实现类:定义具体操作行为
-
用户模块
User
抽象类及子类:管理不同用户角色的权限
-
入口模块
Main
:程序启动和流程控制
一.Book包
①Book 类的成员变量
public class Book {
private String name;
private String author;
private int price;
private String type;
private boolean isBorrowed;
//这里的 构造方法 不加 isBorrowed
//原因是 每本书默认都是未借出 是 false
public Book(String name, String author, int price, String type) {
this.name = name;
this.author = author;
this.price = price;
this.type = type;
}
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 int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean isBorrowed() {
return isBorrowed;
}
public void setBorrowed(boolean borrowed) {
isBorrowed = borrowed;
}
@Override
public String toString() {
return "Book{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +
((isBorrowed == true)? "已借出":"未借出" )+
'}';
}
}
- 功能描述: 表示系统中的书籍实体,存储书籍基本信息和借阅状态
- 为Book类 创建字段 并生成 构造方法 以及 getter和setter方法 还有 toString方法(包含借阅状态)
这里的 构造方法 没有为 isBorrowed 生成构造方法 原因是 isBorrowed 在此次项目中默认值是 false
②BookList 类
public class BookList {
private Book[] books = new Book[10];
private int usedSize;
public Book[] getBooks() {
return books;
}
public Book getBook(int pos){
return books[pos];
}
public void setBook(int pos,Book book) {
this.books[pos] = book;
}
public int getUsedSize() {
return usedSize;
}
public void setUsedSize(int usedSize) {
this.usedSize = usedSize;
}
public BookList(){
books[0] = new Book("三国演义","罗贯中",29,"小说");
books[1] = new Book("西游记","吴承恩",23,"小说");
books[2] = new Book("红楼梦","曹雪芹",25,"小说");
usedSize = 3;
}
}
- 功能描述:表示书架,管理书籍集合,维护当前书籍数量
- 创建了 Book类型 的 books数组 大小为10
- 创建了 usedSize 作用是 使用空间大小
- getBooks() 用来获取 整个数组
- getBook(int pos) 用来获取 指定下标的数组
- setBook(int pos,Book book) 用来改变 指定下标数组的值
- usedSize 的 getter和setter方法
- BookList() 重写的构造方法
二.User 包
①User 抽象类(用来继承的)
import Book.BookList;
import ioperation.IOPeration;
public abstract class User {
private String name;
IOPeration[] ioPerations;
public User(String name) {
this.name = name;
}
public abstract int menu();
public void DoIoperation(int choice,BookList bookList){
ioPerations[choice].work(bookList);
}
}
- 功能描述:用户的基类,定义用户通用的属性和行为
- name用户名
- ioPerations 操作数组
- 构造方法 User(String name)
- 抽象方法 menu(),显示菜单 并且 返回用户的选择(由子类实现)
- 其他方法 DoIoperation(int choice,BookList bookList) 根据用户选择执行对应操作
②AdminUser 类
import ioperation.*;
import java.util.Scanner;
public class AdminUser extends User{
public AdminUser(String name) {
super(name);
ioPerations = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new AddOperation(),
new DelOperation(),
new ShowOperation()
};
}
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("****************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
- 功能描述:管理员用户,继承于User类,拥有高级操作权限
- 构造方法 AdminUser(String name),初始化管理员用户名,并设置操作数组(包含查找,新增,删除,显示,退出)
- 重写方法 menu(),显示管理员菜单,返回用户选择的操作编号
③NomalUser类
import ioperation.*;
import java.util.Scanner;
public class NomalUser extends User {
public NomalUser(String name) {
super(name);
ioPerations = new IOPeration[]{
new ExitOperation(),
new FindOperation(),
new BorrowOperation(),
new ReturnOperation()
};
}
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("****************");
System.out.println("请输入你的操作:");
Scanner scanner = new Scanner(System.in);
int choice = scanner.nextInt();
return choice;
}
}
- 功能描述:普通用户,继承于User,拥有基础操作权限
- 构造方法 NomalUser(String name),初始化普通用户名,并设置操作数组(包含查找,借阅,归还,退出)
- 重写方法 menu(),显示普通用户菜单,并返回用户选择的操作编号
三.Main类
import Book.BookList;
import User.User;
import java.util.Scanner;
import User.AdminUser;
import User.NomalUser;
public class Main {
public static User login() {
System.out.println("请输入姓名");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
System.out.println("请输入你的身份:1.管理员 2.普通用户");
int choice = scanner.nextInt();
if (choice == 1) {
return new AdminUser(name);//需要导入包
} else {
return new NomalUser(name);//需要导入包
}
}
public static void main(String[] args) {
BookList bookList = new BookList();
User user = login();
while(true) {
int choice = user.menu();
user.DoIoperation(choice, bookList);
}
}
}
- 功能描述:程序入口,发原则用户登录和主循环
- login()方法,获取用户名和用户类型(管理员 / 普通用户)
- main()方法,初始化书架,调用login()进行登录,进入无限循环,根据用户选择执行操作
四.ioperation包
①Ioperation 接口(用来继承)
import Book.BookList;
public interface IOPeration {
public void work(BookList bookList);
}
- 功能描述:定义对书架操作的统一接口,所有操作类 需要实现此接口
- work(BookList bookList)方法,执行具体操作
②AddOperation类
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class AddOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("新增图书");
//判满
int currentSize = bookList.getUsedSize();
if(currentSize == bookList.getBooks().length){
System.out.println("书架满了,不能放了");
return;
}
//构建对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要新增的书名");
String name = scanner.nextLine();
System.out.println("请输入要新增的图书的作者");
String author = scanner.nextLine();
System.out.println("请输入要新增图书的价格");
int price = scanner.nextInt();
scanner.nextLine();//读取换行符号
System.out.println("请输入要新增的图书的类型");
String type = scanner.nextLine();
Book newbook = new Book(name,author,price,type);
//判断是否有这本书
for (int i = 0;i < currentSize; i++){
if(bookList.getBook(i).getName().equals(name)){
System.out.println(name+"已经被添加了");//✳✳✳✳
return;
}
}
bookList.setBook(currentSize,newbook);
System.out.println("添加成功");
bookList.setUsedSize(currentSize+1);
}
}
功能描述:实现书籍添加操作
work(BookList bookList):
- 检查书架是否已满
- 获取用户输入的书籍信息(书名、作者、价格、类型)
- 检查书籍是否已存在
- 添加新书到书架并更新 usedSize
③BorrowOperation类
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class BorrowOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("借阅图书");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要借阅的书名");
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if(name.equals(book.getName())){
if(book.isBorrowed()){
System.out.println(name+"已经被借走");
return;
}
System.out.println("借阅成功 "+name);
book.setBorrowed(true);//****
return;
}
}
System.out.println("没有"+name+"这本书");
}
}
功能描述:实现书籍借阅操作
work(BookList bookList):
- 提示用户输入要借阅的书名
- 遍历书架 查找书籍
- 检查书籍是否课借阅(未被借出)
- 更新借阅状态 并 输出结果
④DelOperation类
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class DelOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("删除图书");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要删除的书名");
String name = scanner.nextLine();
//找到这本书
int pos = -1;
int currentSize = bookList.getUsedSize();
for(int i = 0;i<currentSize;i++){
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
pos = i;
break;
}
if(currentSize == i){
System.out.println("书架上没有这本书");
return;
}
}
//覆盖式删除
for(int i = pos;i<currentSize;i++){
Book book = bookList.getBook(i+1);
bookList.setBook(i,book);
}
bookList.setBook(currentSize-1,null);//去掉重复的成员
bookList.setUsedSize(currentSize-1);
System.out.println("删除成功");
}
}
功能描述:实现书籍的删除操作
work(BookList bookList):
- 提示用户输入要删除的书名
- 查找书籍的位置
- 覆盖式删除(将后续书籍前移)
- 更新 usedSize 并将末尾置为 null
⑤ExitOperation类
import Book.BookList;
public class ExitOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("退出系统");
System.exit(0);
}
}
功能描述:实现系统退出操作
work(BookList bookList):
- 调用 System.exit(0); 终止程序
⑥ FindOperation类
import Book.BookList;
import java.util.Scanner;
public class FindOperation implements IOPeration {
@Override
public void work(BookList bookList) {
System.out.println("查找图书");
int i = 0;
System.out.println("请输入书名:");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
for (i = 0;i < bookList.getUsedSize(); i++){
if(bookList.getBook(i).getName().equals(name)){
System.out.println("找到了"+name);//✳✳✳✳
return;
}
}
System.out.println("没找到");
}
}
功能描述:实现书籍查找操作
work(BookList bookList):
- 提示用户输入书名
- 遍历书架查找图书
- 输出查找结果
⑦ReturnOperation类
import Book.Book;
import Book.BookList;
import java.util.Scanner;
public class ReturnOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("归还图书");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要归还的图书");
String name = scanner.nextLine();
for (int i = 0; i < bookList.getUsedSize(); i++) {
Book book = bookList.getBook(i);
if(book.getName().equals(name)){
if(book.isBorrowed() == false){
System.out.println(name+"已经归还成功");
return;
}
book.setBorrowed(false);
System.out.println(name+"归还成功");
return;
}
}
System.out.println("未找到"+name+"这本书");
}
}
功能描述:实现书籍归还功能
work(BookList bookList):
- 提示用户输入要归还的书名
- 查找书籍 并且 检查借阅状态
- 更新借阅状态为 “未借出” 并 输出结果
⑧ShowOperation类
import Book.BookList;
public class ShowOperation implements IOPeration{
@Override
public void work(BookList bookList) {
System.out.println("显示图书");
for (int i = 0; i < bookList.getUsedSize(); i++) {
System.out.println(bookList.getBook(i));
}
}
}
功能描述:实现书架上所有书籍信息
work(BookList bookList):
- 遍历书架 并 打印每本书的信息(调用 Book.toString())
五.
项目的优点
- 模块化设计:将不同的功能封装在不同的类中,提高了代码的可维护性和可扩展性。
- 面向对象编程:使用了面向对象的思想,通过继承和接口实现了代码的复用和多态。
- 用户交互友好:通过菜单的方式让用户选择操作,提高了用户体验。
项目的不足
- 数据持久化问题:程序运行结束后,所有数据都会丢失,没有实现数据的持久化存储。
- 异常处理不完善:在用户输入和文件操作等方面,没有进行充分的异常处理。
- 功能单一:目前的功能比较简单,可以进一步扩展,如添加用户管理、借阅期限管理等功能。