一、项目概述
本文将介绍如何使用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)
实现逻辑:
接收用户输入的书名
遍历书架匹配图书
输出查找结果
核心代码:
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)
界面截图:
代码片段:
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)
功能菜单:
新增图书
删除图书
查找图书
显示所有图书
退出系统
界面截图:
代码片段:
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对应管理员
}
}
}
登录界面截图:
七、项目总结
技术亮点:
采用面向接口编程,操作解耦
使用继承实现多态用户系统
异常处理完善,避免程序崩溃
扩展方向:
添加数据库持久化存储
实现图书预约功能
增加借阅期限管理