前言
本篇文章主要讲述孤立系统设计思路并提供部分重要代码。关键代码可参考本篇文章。
(本系统应用到的图形化界面涉及到SceneBuilder相关知识,后续会陆续发布)
一、功能介绍
1.ER图
2.读者登录页面
3.读者注册页面
4.读者操作页面
5.管理员登录页面
6.管理员操作页面
7.增、删、改(借书、还书)功能页面
增加、删除、借书、还书类似。
8、登录成功(失败)弹出小窗口页面
二、功能分解
1.界面展示
public class Main extends Application { public static Stage primaryStage; @Override public void start(Stage PrimaryStage) throws Exception{ primaryStage=PrimaryStage; Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("../page/Text.fxml"))); primaryStage.setTitle("图书管理系统"); primaryStage.setScene(new Scene(root, 659, 462)); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
2.点击按钮切换页面
这个功能运用了控制类,JavaFX项目在刚开始创建时有两个类,一个是FXML文件,一个是相对应的Controller控制类,Controller控制类处理用于控制FXML文件中的UI元素和处理逻辑。
在Controller类中创建按钮点击时调用的FXML页面来实现不同场景转换,代码如下:
public void addBookBackClicked(ActionEvent event) { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("../page/manageBook.fxml")); Parent managePage = loader.load(); if (managePage != null) { System.out.println(addBookBack); Stage stage = (Stage) addBookBack.getScene().getWindow(); Scene scene = new Scene(managePage); stage.setScene(scene); stage.show(); } else { System.out.println("Failed"); } } catch (IOException e) { e.printStackTrace(); } }
代码第四行引号里面是页面地址。
3.登陆注册
登陆注册页面:
登录注册实现需要连接数据库,一下是连接数据库的代码(涉及到JDBC相关知识):
package mysqldata;
import java.sql.*;
public class DbUtil {
private static Connection conn;
private static ResultSet rs;
private static PreparedStatement ps;
public final static String driver="com.mysql.cj.jdbc.Driver";
public final static String url = "jdbc:mysql://localhost:3306/123?autoReconnection=true&characterEncoding=utf-8";
public final static String passWord = "123456";
public final static String userName = "root";
//static 静态代码块加载jdbc的驱动
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//连接mysql的连接对象
public static Connection getConn(){
try {
return DriverManager.getConnection(url, userName, passWord);
}catch(SQLException e){
e.printStackTrace();
}
return null;
}
//关闭连接,保证MySQl资源的释放,能够充分使用资源
public static void close(){
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
public static void setConn(Connection conn) {
DbUtil.conn = conn;
}
public ResultSet getDataFromDatabase(){
try{
Connection co = DriverManager.getConnection(url,userName,passWord);
setConn(co);
Statement stmt=conn.createStatement();
//查询语句
String sql="select name,author,type,number from book";
rs=stmt.executeQuery(sql);
}catch(SQLException e){
e.printStackTrace();
}
return rs;
}
}
以上包含整个连接数据库类的代码,可供参考。
4.表格控件按钮的绑定
第一步、在SceneBuilder中给按钮设置ID和触发事件(以add按钮举例)
第二步、在相应的控制类中添加事件点击事件
快捷方式添加按钮以及点击方式:光标点击放在上述图片红色方框内,键盘 Ctrl+Enter,二次按下Enter控制Ctrl不松,便可在相应的控制类中生成。
在上述方法中添加相应代码即可。
5.增删改
以添加按钮为例,添加页面
带有mysql语句的两个方法
String sql = "insert into book(name,author,type,number) values(?,?,?,1)"; try { Connection conn = DriverManager.getConnection(url, userName, passWord); PreparedStatement statement = conn.prepareStatement(sql); statement.setString(1, bookName); statement.setString(2, bookAuthor); statement.setString(3, bookType); int rowsInserted=statement.executeUpdate();
String sql="update book set number=number+1 where name=?"; Connection connection=DriverManager.getConnection(url,userName,passWord); PreparedStatement preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1,bookName);
判断存在与否的方法
public boolean judgeHaveByName(String bookName) throws Exception { String sql = "select * from book where name=?"; Connection connection=DriverManager.getConnection(url,userName,passWord); PreparedStatement preparedStatement=connection.prepareStatement(sql); preparedStatement.setString(1,bookName); if (preparedStatement.executeQuery().next()){ return true; }else { return false; } }
添加点击事件的方法
public void addBookSuccessClicked(ActionEvent event) throws Exception { String bookName=addBookName.getText(); String bookAuthor=addBookAuthor.getText(); String bookType=addBookType.getText(); if(bookName.isEmpty() || bookAuthor.isEmpty() || bookType.isEmpty()) { tipFrame("请将相关信息填写完整"); }else if (!judgeHaveByName(addBookName.getText())){ if (addBook(bookName,bookAuthor,bookType)){ tipFrame("已添加新的图书"); System.out.println("该书已经存在"); } }else if (judgeHaveByName(addBookName.getText())){ if (addNum(addBookName.getText())){ tipFrame("已添加"+addBookName.getText()+"的库存"); } } }
表格控件的绑定(以书名为例)
第一步、在SceneBuilder中添加文本ID
第二步,在相应的FXML文件所对应的控制类中引用对应组件,具体代码如下:
public TextField addBookName;//书名 public TextField addBookAuthor;//作者 public TextField addBookType;//类型
第三步,在点击事件中获取文本相应内容,具体代码如下:
public void addBookSuccessClicked(ActionEvent event) throws Exception { String bookName=addBookName.getText(); String bookAuthor=addBookAuthor.getText(); String bookType=addBookType.getText();}
6.模糊查询
带有mysql语句的代码如下:
String sql="SELECT * FROM book WHERE name LIKE ? OR author LIKE ?"; pds=con.prepareStatement(sql); pds.setString(1, "%"+searchText + "%"); pds.setString(2, "%"+searchTextOne + "%"); rs=pds.executeQuery(); while(rs.next()){ Book book=new Book(); book.setType(rs.getString("type")); book.setNumber(rs.getInt("number")); book.setName(rs.getString("name")); book.setAuthor(rs.getString("author")); books.add(book); }
获取文本
String searchText=searchBookName.getText().trim(); String searchTextOne=searchBookAuthor.getText().trim();
将数据与表格控件进行绑定
ObservableList<Book> observableList= FXCollections.observableList(books); tableView.setItems(observableList);
三、总代码
采用了MVC对包进行分类,一个FXML页面对应一个Controller类,带有sql的方法写在控制器里。
1.系统分类展示:
2.页面类:
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Accordion?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.PasswordField?> <?import javafx.scene.control.TextField?> <?import javafx.scene.image.Image?> <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.Pane?> <?import javafx.scene.text.Font?>
3.控制类:
增加图书控制类:
package resourse; import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException;
图书展示控制类:
package resourse; import com.test.model.Book; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; import mysqldata.DbUtil; import java.io.IOException; import java.sql.*; import java.util.ArrayList;
删除图书控制类:
package resourse; import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import java.io.IOException; import java.sql.*;
注册页面控制类:
package resourse; import java.io.IOException; import java.net.URL; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage;
后台管理图书控制类:
package resourse; import com.test.model.Book; import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; import mysqldata.DbUtil; import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException;
搜索图书控制类:
package resourse; import com.test.model.Book; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; import javafx.stage.Stage; import mysqldata.DbUtil; import java.io.IOException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList;
修改图书控制类:
package resourse; import javafx.event.ActionEvent; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException;
10.FXML文件
登录(注册类似):
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Accordion?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.PasswordField?> <?import javafx.scene.control.TextField?> <?import javafx.scene.image.Image?> <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.Pane?> <?import javafx.scene.text.Font?> <Pane accessibleRole="TEXT" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="462.0" prefWidth="659.0" style="-fx-border-style: 1px; -fx-border-color: black;" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.TestController"> <children> <ImageView fitHeight="462.0" fitWidth="659.0" layoutY="2.0" pickOnBounds="true" preserveRatio="true"> <image> <Image url="@../imgs/bcImgs.png" /> </image></ImageView> <Button fx:id="registerButton" layoutX="46.0" layoutY="325.0" mnemonicParsing="false" onAction="#registerButtonClicked" prefHeight="53.0" prefWidth="123.0" style="-fx-background-color: #74a5c6;" text="登录"> <font> <Font size="24.0" /> </font> </Button> <Button fx:id="loginButton" layoutX="482.0" layoutY="325.0" mnemonicParsing="false" onAction="#loginButtonClicked" prefHeight="53.0" prefWidth="123.0" style="-fx-background-color: #74a5c6; -fx-font-weight: 650;" text="注册"> <font> <Font size="24.0" /> </font> </Button> <TextField fx:id="userText" layoutX="148.0" layoutY="158.0" prefHeight="45.0" prefWidth="233.0" style="-fx-border-style: no-border;" styleClass="no-border"> <font> <Font size="21.0" /> </font></TextField> <PasswordField fx:id="password" layoutX="148.0" layoutY="238.0" prefHeight="45.0" prefWidth="233.0" style="-fx-border-radius: 50px;"> <font> <Font size="21.0" /> </font></PasswordField> <Label layoutX="207.0" layoutY="58.0" prefHeight="53.0" prefWidth="275.0" style="-fx-font-weight: 700;" text="欢迎来到本系统" textFill="#f86b19"> <font> <Font size="37.0" /> </font> </Label> <Accordion layoutX="68.0" layoutY="166.0" /> <Label layoutX="412.0" layoutY="158.0" prefHeight="45.0" prefWidth="140.0" style="-fx-font-weight: 700;" text="学生账号" textFill="#1d0e03"> <font> <Font size="32.0" /> </font> </Label> <Label layoutX="449.0" layoutY="240.0" prefHeight="32.0" prefWidth="167.0" style="-fx-font-weight: 700;" text="密码" textFill="#2b1306"> <font> <Font size="32.0" /> </font> </Label> <Button fx:id="manageRegister" layoutX="264.0" layoutY="325.0" mnemonicParsing="false" onAction="#manageClicked" prefHeight="53.0" prefWidth="123.0" style="-fx-background-color: #74a5c6; -fx-font-weight: 650;" text="管理员"> <font> <Font size="24.0" /> </font> </Button> </children> </Pane>
添加图书(修改、删除类似):
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <?import javafx.scene.text.*?> <AnchorPane prefHeight="515.0" prefWidth="739.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.addBookController"> <children> <Pane prefHeight="515.0" prefWidth="739.0" style="-fx-background-color: #d2c1b8;"> <children> <Label layoutX="303.0" layoutY="55.0" prefHeight="46.0" prefWidth="155.0" style="-fx-font-weight: 700;" text="添加书籍" textFill="#e87720"> <font> <Font size="33.0" /> </font> </Label> <Label layoutX="176.0" layoutY="150.0" prefHeight="46.0" prefWidth="106.0" style="-fx-font-weight: 700;" text="书名"> <font> <Font size="30.0" /> </font> </Label> <Label layoutX="176.0" layoutY="235.0" prefHeight="46.0" prefWidth="106.0" style="-fx-font-weight: 700;" text="作者"> <font> <Font size="30.0" /> </font> </Label> <Label layoutX="176.0" layoutY="318.0" prefHeight="46.0" prefWidth="106.0" style="-fx-font-weight: 700;" text="类型"> <font> <Font size="30.0" /> </font> </Label> <TextField fx:id="addBookName" layoutX="340.0" layoutY="150.0" prefHeight="46.0" prefWidth="199.0"> <font> <Font size="21.0" /> </font></TextField> <TextField fx:id="addBookAuthor" layoutX="340.0" layoutY="235.0" prefHeight="46.0" prefWidth="199.0"> <font> <Font size="21.0" /> </font></TextField> <TextField fx:id="addBookType" layoutX="340.0" layoutY="318.0" prefHeight="46.0" prefWidth="199.0"> <font> <Font size="21.0" /> </font></TextField> <Button fx:id="addBookSuccess" layoutX="502.0" layoutY="413.0" mnemonicParsing="false" onAction="#addBookSuccessClicked" prefHeight="12.0" prefWidth="99.0" style="-fx-background-color: #74a5c6;" text="添加"> <font> <Font size="22.0" /> </font> </Button> <Button fx:id="addBookBack" layoutX="572.0" layoutY="39.0" mnemonicParsing="false" onAction="#addBookBackClicked" prefHeight="39.0" prefWidth="99.0" style="-fx-background-color: #74a5c6;" text="返回"> <font> <Font size="19.0" /> </font> </Button> </children> </Pane> </children> </AnchorPane>
搜索图书页面:
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.TableColumn?> <?import javafx.scene.control.TableView?> <?import javafx.scene.control.TextField?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.text.Font?> <AnchorPane prefHeight="520.0" prefWidth="741.0" style="-fx-background-color: #dccbc1;" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.searchBookController"> <children> <Label layoutX="24.0" layoutY="80.0" prefHeight="42.0" prefWidth="95.0" text="书名"> <font> <Font size="32.0" /> </font> </Label> <Label layoutX="334.0" layoutY="83.0" prefHeight="42.0" prefWidth="95.0" text="作者"> <font> <Font size="32.0" /> </font> </Label> <TextField fx:id="searchBookName" layoutX="119.0" layoutY="83.0" prefHeight="42.0" prefWidth="190.0"> <font> <Font size="20.0" /> </font></TextField> <TextField fx:id="searchBookAuthor" layoutX="429.0" layoutY="83.0" prefHeight="42.0" prefWidth="190.0"> <font> <Font size="20.0" /> </font> </TextField> <TableView fx:id="tableView" layoutX="78.0" layoutY="160.0" prefHeight="315.0" prefWidth="585.0"> <columns> <TableColumn fx:id="bookName" prefWidth="227.99994659423828" text="书名" /> <TableColumn fx:id="bookAuthor" minWidth="0.0" prefWidth="167.3333740234375" text="作者" /> <TableColumn fx:id="bookType" prefWidth="125.99996948242188" text="类型" /> <TableColumn fx:id="bookNumber" prefWidth="64.66668701171875" text="库存" /> </columns> </TableView> <Button fx:id="searchBookButton" layoutX="653.0" layoutY="90.0" mnemonicParsing="false" onAction="#searchBookButtonClicked" prefHeight="44.0" prefWidth="48.0" style="-fx-background-color: #fcb215;" text="搜"> <font> <Font size="20.0" /> </font> </Button> <Button fx:id="searchBack" layoutX="603.0" layoutY="24.0" mnemonicParsing="false" onAction="#searchBackClicked" prefHeight="44.0" prefWidth="85.0" style="-fx-background-color: #74a5c6;" text="返回"> <font> <Font size="21.0" /> </font> </Button> </children> </AnchorPane>
管理图书页面:
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> <?import javafx.scene.control.TableColumn?> <?import javafx.scene.control.TableView?> <?import javafx.scene.layout.AnchorPane?> <?import javafx.scene.layout.Pane?> <?import javafx.scene.text.Font?> <AnchorPane prefHeight="520.0" prefWidth="741.0" xmlns="http://javafx.com/javafx/22" xmlns:fx="http://javafx.com/fxml/1" fx:controller="resourse.ManageBookController"> <children> <Pane prefHeight="520.0" prefWidth="741.0" style="-fx-background-color: #d2c1b8;"> <children> <Label layoutX="269.0" layoutY="31.0" prefHeight="53.0" prefWidth="171.0" style="-fx-font-weight: 700;" text="欢迎管理员" textFill="#dd7010"> <font> <Font size="32.0" /> </font> </Label> <Button fx:id="manageBookBack" layoutX="622.0" layoutY="31.0" mnemonicParsing="false" onAction="#manageBookBackButton" prefHeight="37.0" prefWidth="85.0" style="-fx-background-color: #74a5c6;" text="返回"> <font> <Font size="19.0" /> </font> </Button> <TableView fx:id="TableView" layoutX="85.0" layoutY="84.0" prefHeight="320.0" prefWidth="572.0"> <columns> <TableColumn fx:id="manageBookName" prefWidth="206.00000762939453" text="书名" /> <TableColumn fx:id="manageBookAuthor" prefWidth="168.0" text="作者" /> <TableColumn fx:id="manageBookType" prefWidth="122.66659545898438" text="类型" /> <TableColumn fx:id="manageBookNum" prefWidth="74.0" text="库存" /> </columns> </TableView> <Button fx:id="addButton" layoutX="59.0" layoutY="439.0" mnemonicParsing="false" onAction="#addButtonClicked" prefHeight="45.0" prefWidth="96.0" style="-fx-background-color: #fcb215;" text="增加"> <font> <Font size="22.0" /> </font> </Button> <Button fx:id="updateButton" layoutX="334.0" layoutY="439.0" mnemonicParsing="false" onAction="#updateButtonClicked" prefHeight="45.0" prefWidth="96.0" style="-fx-background-color: #fcb215;" text="修改"> <font> <Font size="22.0" /> </font> </Button> <Button fx:id="deleteButton" layoutX="598.0" layoutY="439.0" mnemonicParsing="false" onAction="#deleteButtonClicked" prefHeight="45.0" prefWidth="96.0" style="-fx-background-color: #fcb215;" text="删除"> <font> <Font size="22.0" /> </font> </Button> </children> </Pane> </children> </AnchorPane>
以上就是图书管理系统的部分重要代码,还是有点小瑕疵的,欢迎大家来评论区留言探讨。