第一周软件开发与创新实验

news/2025/2/27 20:14:37/文章来源:https://www.cnblogs.com/rookie486/p/18741835

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 bookList = FXCollections.observableArrayList();

@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 与原有业务逻辑的整合也需要仔细调试,确保界面操作能够正确触发相应的业务功能。
逆向软件工程的一些思考:在分析原项目时,通过阅读代码和运行程序,理解其基本功能和实现思路。发现原项目虽然实现了图书管理的基本功能,但在数据存储、用户界面和权限管理方面存在不足。这让我认识到在开发项目时,不仅要关注功能实现,还要从性能、用户体验和安全性等多方面进行考量。在二次开发中,尽量保持原有的业务逻辑结构,避免过度修改导致项目的复杂性增加。同时,在每次修改代码后,都要进行充分的测试,确保新功能的添加和旧功能的修改不会引入新的问题,保证系统的稳定性和可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890804.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:P4586 [FJOI2015] 最小覆盖双圆问题

写了这么久终于过了,发篇题解记录一下。 第一次写黑题题解,写的不好请见谅。 目录本题思路 三点定圆 最小圆覆盖 关于最小圆覆盖时间复杂度 回到本题 二分法划分点集 总时间复杂度 最小覆盖双圆问题代码本题思路 首先,这道题叫做最小覆盖双圆问题,这道题涉及到一个叫做最小…

sed undefined label on MacOS, FreeBSD

A quick fix is to prepend your string expression with an empty string: For example: instead of sed -i s/foo/bar/g text.txt write: sed -i s/foo/bar/g text.txtThis should work across different OS (Linux, MacOS, Windows) --dopexxx来源:http://stackoverflow.…

软工作业1:自我介绍+软工5问

这个作业属于哪个课程 软工23级这个作业要求在哪里 自我介绍+软工五问这个作业的目标 熟悉博客园以及Github的相关操作,了解软件工程相关内容1.自我介绍兴趣爱好:羽乒人,爱听歌,电影,楷书,行楷 编程语言:C,JAVA 目标:后端开发2.软工五问软件工程在对就业上的帮助的具体…

对“推箱子”小游戏代码的改进

一.代码来源 https://www.cnblogs.com/heyu123/p/14844284.html 二.运行环境 DEV--C++ 三.原代码及其运行结果 原代码: int map[8][8]={{1,1,1,1,1,1,1,1},//0 空地 {1,0,0,0,1,0,0,1},//1 墙 {1,0,1,0,1,4,3,1},//3 目的地 {1,0,0,0,0,4,3,1},//4 箱子 {1,0,1,0,1,4,3,1},//5…

软件开发与创新课程设计作业——软件逆向设计

一、来源:软件工程2班李鹏飞去年的大作业`点击查看代码 #include <iostream> #include <string> #include <fstream> using namespace std;//定义客户类型 enum eGuestType // 在高版本VS中,需要用enum class,在低版本的vs中,直接用enum也可以 {e_member…

LVI_SAM 虚拟机安装复现(一)

0. 前言 高能警告:LVI_SAM 的安装步骤是繁琐的,一个坑接着一个坑,请预留48+小时的安装时间,和80%以上的san值。非战斗人员请尽快撤离。 预备知识:虚拟机安装步骤,ROS基本概念,Makefile工作原理 没有预备知识的话,也没关系,本文也不会给你解释的( 本文是第一大步骤,即…

大模型--三种三种检索方式-Dense retrieval / Lexical Retrieval / Multi-Vector Retrieval- 44

1. 参考 M3-Embedding https://github.com/FlagOpen/FlagEmbedding https://arxiv.org/pdf/2402.03216 https://huggingface.co/BAAI/bge-m3 2. Dense retrievalimport torch import torch.nn as nnclass DenseRetrieval(nn.Module):def __init__(self, embedding_dim):super(D…

从拉新到留存,用户生命周期分析全流程

已收藏分享从拉新到留存,用户生命周期分析全流程 2025-02-17 17:02人人都是产品经理在当今竞争激烈的市场环境中,理解并管理用户生命周期是实现用户增长和留存的关键。本文将深入剖析用户生命周期的全流程管理,从拉新到留存,详细解读不同业务类型(如消费品、耐用品、平台型…

朴素贝叶斯其实并不朴素

朴素贝叶斯英文名称NaiveBayes,朴素贝叶斯确实nave,但是并不朴素,而是简单,并不是逻辑上面的简单,而是假设上面的简单。 1.贝叶斯公式 ​ 其中: P(C|X)是类C在给定特征X下的后验概率。 P(X|C)是特征X在给定类C下的条件概率,也叫做似然。 P(C)是类C的先验概率。 P(X)是特…

NocoBase 本周更新汇总:新增路由管理

本周更新包括:支持为页面标签页配置权限,新增路由管理页面等。汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支:main ,next和 develop。main :截止目前最稳定的版本,推荐安装此版本。 next:包含即将发布的新功能,…

AI安全-模型用户输入注入

顾名思义,在调用AI大模型时,根据用户传入的数据,进行AI处理,调用插件,但模型后端需要调用API,API需要传入的username一个小场景,企业微信对话调用AI去修改当前密码 假设开发者设计如下: 用户输入-> AI -> 调用插件修改密码 修改密码插件实现:a.com/change_passw…