Java 图书管理系统二次开发博客
一、来源
本次二次开发的项目是一个基础的 Java 图书管理系统,项目从 GitHub 获取,地址为https://github.com/[原作者用户名]/LibraryManagementSystem。原系统主要实现了图书的基本管理,如添加图书、查询图书、借阅图书等功能,采用 Java Swing 构建图形用户界面,以文本文件存储数据。
二、运行环境 + 运行结果的截图
运行环境
JDK 11
IDE(如 Eclipse 或 IntelliJ IDEA)
运行步骤
下载项目源代码到本地。
使用 IDE 打开项目。
配置好 JDK 路径,运行主程序Main.java。
运行结果截图
(此处请自行补充图书管理系统的主界面、添加图书界面、查询图书结果界面等截图)
部分关键代码(以查询图书功能为例)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BookQuery {
public static void queryBook(String title) {
try (BufferedReader br = new BufferedReader(new FileReader("books.txt"))) {
String line;
while ((line = br.readLine())!= null) {
String[] parts = line.split(",");
if (parts[0].equals(title)) {
System.out.println("Book found: " + line);
return;
}
}
System.out.println("Book not found.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
在上述代码中,queryBook方法从books.txt文件中读取图书信息,通过书名进行匹配查询。
三、主要问题列表,针对问题进行改善或者重构
问题:数据存储方式简单,使用文本文件存储图书和借阅信息,读写效率低,且数据安全性差。
改善:将数据存储方式改为 MySQL 数据库。使用 JDBC 连接数据库,创建books表和borrow_records表,分别存储图书信息和借阅记录。优化数据的增删改查操作,提高数据读写效率和安全性。
问题:用户界面交互性差,Java Swing 界面布局简陋,操作不够便捷。
改善:引入 JavaFX 替代 Java Swing,利用 JavaFX 丰富的 UI 组件和布局方式,优化界面设计。例如,使用VBox和HBox布局容器,合理排列组件,使界面更加美观、操作更加便捷。同时,添加更多的提示信息和错误处理提示,提升用户体验。
问题:缺乏权限管理,所有用户都具有相同的操作权限,无法满足不同角色(如管理员、普通用户)的权限需求。
重构:增加权限管理模块。创建users表存储用户信息,包括用户名、密码和用户角色(管理员或普通用户)。在系统操作接口中,根据用户角色进行权限校验。例如,只有管理员可以进行图书添加、删除操作,普通用户只能进行图书查询和借阅操作。
四、新代码附上(只要自己改进的地方)
数据库连接与操作(以添加图书为例)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseUtil {
private static final String URL = "jdbc:mysql://localhost:3306/library";
private static final String USER = "root";
private static final String PASSWORD = "password";
public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, USER, PASSWORD);
}public static void addBook(String title, String author, int year) {String sql = "INSERT INTO books (title, author, year) VALUES (?,?,?)";try (Connection conn = getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, title);pstmt.setString(2, author);pstmt.setInt(3, year);pstmt.executeUpdate();} catch (SQLException e) {e.printStackTrace();}
}
}
JavaFX 界面代码片段(图书查询界面)
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class BookQueryUI extends Application {
private final ObservableList
@Override
public void start(Stage primaryStage) {primaryStage.setTitle("Book Query");Label titleLabel = new Label("Enter Book Title:");TextField titleField = new TextField();Button queryButton = new Button("Query");ListView<String> resultList = new ListView<>(bookList);queryButton.setOnAction(event -> {String title = titleField.getText();// 调用数据库查询方法,更新bookList// 此处省略具体查询逻辑bookList.clear();bookList.addAll("Book 1", "Book 2"); // 模拟查询结果});VBox vbox = new VBox(10);vbox.setPadding(new Insets(10));vbox.getChildren().addAll(titleLabel, titleField, queryButton, resultList);primaryStage.setScene(new Scene(vbox, 300, 300));primaryStage.show();
}
}
权限管理代码片段(权限校验)
public class PermissionChecker {
public static boolean hasPermission(String username, String operation) {
// 从数据库中查询用户角色
String userRole = getUserRoleFromDatabase(username);
if ("admin".equals(userRole)) {
return true; // 管理员拥有所有权限
} else if ("user".equals(userRole)) {
if ("query".equals(operation) || "borrow".equals(operation)) {
return true; // 普通用户可以查询和借阅
}
}
return false;
}
private static String getUserRoleFromDatabase(String username) {// 此处省略数据库查询逻辑,返回用户角色return "user";
}
}
五、重构的软件的测试截图
(此处请自行补充使用 MySQL 数据库后,添加图书、查询图书的数据库操作测试截图;JavaFX 界面优化后的各功能界面截图;以及权限管理测试截图,如普通用户尝试进行添加图书操作时的权限不足提示截图)
六、总结
难点:数据库迁移过程中,数据库表结构设计和 SQL 语句编写需要考虑周全,尤其是处理关联表(如books表和borrow_records表)之间的关系时,容易出现数据不一致的问题。同时,JDBC 连接和事务处理也需要谨慎操作,确保数据的完整性和一致性。
花时间比较久的:JavaFX 界面的设计和优化花费了较多时间。在布局调整和组件样式设置上,需要不断尝试不同的布局方式和 CSS 样式,以达到美观和易用的平衡。此外,JavaFX 与原有业务逻辑的整合也需要仔细调试,确保界面操作能够正确触发相应的业务功能。
逆向软件工程的一些思考:在分析原项目时,通过阅读代码和运行程序,理解其基本功能和实现思路。发现原项目虽然实现了图书管理的基本功能,但在数据存储、用户界面和权限管理方面存在不足。这让我认识到在开发项目时,不仅要关注功能实现,还要从性能、用户体验和安全性等多方面进行考量。在二次开发中,尽量保持原有的业务逻辑结构,避免过度修改导致项目的复杂性增加。同时,在每次修改代码后,都要进行充分的测试,确保新功能的添加和旧功能的修改不会引入新的问题,保证系统的稳定性和可靠性。