【DIY系列:Java虚拟机】第05篇:项目结构与第一行代码——jvmgo 项目骨架搭建
2026/9/7 13:31:35
图书管理系统项目PPT文稿
封面页
目录页
第一部分:项目概述
项目背景
项目目标
核心功能
角色 | 核心功能 |
管理员 | 图书上架/更新/下架、借阅统计、热门图书查询、库存管理 |
普通用户 | 图书借阅/归还、个人借阅记录查询、图书搜索 |
共用功能 | 图书查找、显示所有图书、退出系统 |
第二部分:核心技术与设计模式
1. 单例模式
public class ScannerSingleton { private static Scanner scanner; private ScannerSingleton() {} // 私有构造防止实例化 public static Scanner getInstance() { if (scanner == null) { scanner = new Scanner(System.in); } return scanner; } }2. 工厂模式
// 抽象工厂接口 public interface IUserFactory { User createUser(String name, int userID); } // 管理员工厂 public class AdminUserFactory implements IUserFactory { @Override public User createUser(String name, int userID) { return new AdminUser(name, userID); } } // 普通用户工厂 public class NormalUserFactory implements IUserFactory { @Override public User createUser(String name, int userID) { return new NormalUser(name, userID); } }3. 代理模式
// 管理员权限校验 private void checkRealUserWhetherAdminUser(String exceptionMessage) { if(!(realUser instanceof AdminUser)){ throw new PermissionException(exceptionMessage); } } // 普通用户权限校验 private void checkRealUserWhetherNormalUser(String exceptionMessage) { if(!(realUser instanceof NormalUser)){ throw new PermissionException(exceptionMessage); } }4. 其他技术
第三部分:系统架构与模块划分
整体架构
模块划分(src目录结构)
src/ ├─ book/ // 图书相关(Book、PairOfUidAndBookId) ├─ constant/ // 常量定义(Constant) ├─ user/ // 用户相关 │ ├─ factory/ // 工厂类 │ ├─ AdminUser.java │ ├─ NormalUser.java │ └─ User.java ├─ utils/ // 工具类 │ ├─ ScannerSingleton.java │ ├─ LibrarySingleton.java │ └─ AnalyzingBook.java └─ LibrarySystem.java // 程序入口第四部分:核心类设计
1. User类体系
public abstract class User { protected String name; protected int userID; protected String role; public User(String name, int userID, String role) { this.name = name; this.userID = userID; this.role = role; } public abstract int display(); // 显示操作菜单 }public class AdminUser extends User { private Scanner scanner; private Library library; public AdminUser(String name, int userID) { super(name, userID, "管理员"); scanner = ScannerSingleton.getInstance(); library = LibrarySingleton.getInstance(); } @Override public int display() { // 管理员菜单实现(10个操作选项) } // 核心业务方法:addBook、updateBook、removeBook等 }public class NormalUser extends User { private PairOfUidAndBookId[] pairOfUidAndBookIds; // 借阅记录 private int borrowedCount; // 借阅数量 private Scanner scanner; private Library library; public NormalUser(String name, int userID) { super(name, userID, "普通用户"); scanner = ScannerSingleton.getInstance(); library = LibrarySingleton.getInstance(); } @Override public int display() { // 普通用户菜单实现(6个操作选项) } // 核心业务方法:borrowBook、returnBook、viewBorrowBooks等 }2. Book类(图书实体)
public class Book implements Comparable<Book> { private int bookId; // 图书ID(自增) private String title; // 书名 private String author; // 作者 private String category; // 类别 private int publishYear; // 出版年份 private boolean isBorrowed; // 借阅状态(默认false) private int borrowCount; // 借阅次数(默认0) private LocalDate shelfDate;// 上架时间 // 构造方法(不含bookId、isBorrowed、borrowCount) public Book(String title, String author, String category, int publishYear, LocalDate shelfDate) { this.title = title; this.author = author; this.category = category; this.publishYear = publishYear; this.isBorrowed = false; this.borrowCount = 0; this.shelfDate = shelfDate; } // 借阅次数增减方法 public void incrementBorrowCount() { this.borrowCount++; } public void decreaseBorrowCount() { this.borrowCount--; } // 排序方法(按借阅次数降序) @Override public int compareTo(Book o) { return o.getBorrowCount() - this.getBorrowCount(); } // getter/setter与toJSON方法 }3. Library类(图书数据管理)
public class Library { private Book[] books; // 图书数组 private int bookCount; // 实际图书数量 private final AnalyzingBook analyzingBook = new AnalyzingBook(); public Library() { loadAllBook(); // 初始化时加载文件数据 } // 核心方法 private void loadAllBook() {} // 从文件加载图书 private void storeBook() {} // 图书数据写入文件 public void addBook(Book book) {} // 添加图书 public void updateBook(Book book) {} // 更新图书 public void removeBook(int bookId) {} // 删除图书 public Book searchById(int bookId) {} // 按ID查询图书 }4. 常量类Constant
public class Constant { // 图书数组默认容量 public static final int CAPACITY = 5; // 数据文件路径 public static final String ALL_BOOK_FILE_NAME = "allbook.txt"; public static final String BORROWED_BOOK_FILE_NAME = "borrowedbook.txt"; // 管理员操作常量 public static final int SEARCH_BOOK = 1; public static final int DISPLAY_BOOK = 2; public static final int EXIT = 3; public static final int ADD_BOOK = 4; // 其他操作常量... // 普通用户操作常量 public static final int BORROWED_BOOK = 4; public static final int RETURN_BOOK = 5; public static final int VIEW_BORROW_HISTORY_BOOK = 6; }第五部分:业务功能实现
一、管理员核心业务
1. 图书上架(addBook)
public void addBook() { scanner.nextLine(); System.out.println("请输入书名:"); String title = scanner.nextLine(); System.out.println("请输入作者:"); String author = scanner.nextLine(); System.out.println("请输入类别:"); String category = scanner.nextLine(); System.out.println("请输入出版年份:"); int year = scanner.nextInt(); scanner.nextLine(); LocalDate shelfDate = LocalDate.now(); Book newBook = new Book(title, author, category, year, shelfDate); library.addBook(newBook); }2. 图书更新(updateBook)
public void updateBook(Book book) { int index = searchByIdReturnIndex(book.getBookId()); books[index] = book; storeBook(); // 持久化更新 }3. 热门图书查询(generateBook)
public void generateBook(int k) { loadAllBook(); Book[] tmp = new Book[getBookCount()]; System.arraycopy(books, 0, tmp, 0, getBookCount()); Arrays.sort(tmp); // 调用Book的compareTo方法 // 输出前K本图书信息 }二、普通用户核心业务
1. 图书借阅(borrowBook)
public void borrowBook() { scanner.nextLine(); System.out.println("请输入你要借阅图书的id:"); int bookId = scanner.nextInt(); scanner.nextLine(); if (library.getBookCount() == 0) { System.out.println("书架没有书籍暂且不能借阅"); return; } loadBorrowedBook(); Book book = library.searchById(bookId); if(book == null) { System.out.println("没有该id的相关书籍:"+bookId); return; } // 校验是否已被借阅 for (int i = 0; i < borrowedCount; i++) { PairOfUidAndBookId pair = pairOfUidAndBookIds[i]; if (pair.getBookId() == book.getBookId()) { // 提示已借阅信息 return; } } // 借阅成功:更新状态+存储记录 library.borrowBook(bookId); PairOfUidAndBookId newPair = new PairOfUidAndBookId(userID, book.getBookId()); pairOfUidAndBookIds[borrowedCount++] = newPair; storeBorrowedBook(); System.out.println("借阅成功!"); }2. 图书归还(returnBook)
public void returnBook(int bookId) { loadAllBook(); for (int i = 0; i < getBookCount(); i++) { Book book = books[i]; if(book.getBookId() == bookId) { book.setBorrowed(false); book.decreaseBorrowCount(); } } storeBook(); }三、共用业务
public void searchBook() { scanner.nextLine(); System.out.println("请输入你要查找的图书的名称:"); String title = scanner.nextLine(); Book book = search(title); if(book == null) { System.out.println("没有你要找的这本书,你查找的书名为:"+title); } else { System.out.println("找到了你要查找的书,书的详细信息如下:"); System.out.println(book); } }第六部分:项目测试与扩展
测试流程
项目扩展方向
第七部分:总结
项目亮点
关键收获