Compare commits

...

13 Commits

Author SHA1 Message Date
msksbr 4616bbda41 done tests and fix some fucking bug! 2025-12-23 21:49:07 +08:00
msksbr ce67127d0d add dao test 2025-12-23 13:38:51 +08:00
msksbr b072f82a8f change author's own url 2025-12-23 11:34:02 +08:00
msksbr 9f2583baab 再修readme 2025-02-06 22:06:35 +08:00
msksbr 368fff66d5 再修readme 2025-02-06 22:05:39 +08:00
msksbr c6cad66afa 修readme 2025-02-06 22:04:59 +08:00
msksbr 8db074f7b7 readme 2025-02-06 22:02:26 +08:00
msksbr 81d7581531 将图片路径都改成包名路径 2025-02-06 20:54:58 +08:00
msksbr f3da2681f3 添加注释 2025-02-06 20:44:45 +08:00
msksbr 10ae171a06 删除out文件 2025-02-06 20:15:44 +08:00
msksbr 82cde2df25 添加部分注释 2025-02-06 20:14:11 +08:00
msksbr 0465908846 删除jetbrains ides配置 2025-02-06 19:50:02 +08:00
msksbr 29658ccfe9 完善gitignore 2025-02-06 19:48:52 +08:00
52 changed files with 1126 additions and 291 deletions
+6 -1
View File
@@ -11,7 +11,6 @@
.mtj.tmp/ .mtj.tmp/
# Package Files # # Package Files #
*.jar
*.war *.war
*.nar *.nar
*.ear *.ear
@@ -24,3 +23,9 @@ hs_err_pid*
# My own password # My own password
src/com/msksbr/SQL/PassWord.java src/com/msksbr/SQL/PassWord.java
# JetBrains IDEs
.idea/
*/.idea/
*.iml
out/
-8
View File
@@ -1,8 +0,0 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
-13
View File
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="system-homework-in-the-library" />
</profile>
</annotationProcessing>
</component>
</project>
-20
View File
@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>
-9
View File
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="flatlaf-3.2">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/flatlaf-3.2.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-9
View File
@@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="mysql-connector-j-8.4.0">
<CLASSES>
<root url="jar://$PROJECT_DIR$/lib/mysql-connector-j-8.4.0.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>
-14
View File
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
-8
View File
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/system-homework-in-the-library.iml" filepath="$PROJECT_DIR$/system-homework-in-the-library.iml" />
</modules>
</component>
</project>
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/sql/book.sql" dialect="MariaDB" />
</component>
</project>
-127
View File
@@ -1,127 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
<component name="uidesigner-configuration">
<option name="DEFAULT_LAYOUT_MANAGER" value="BorderLayout" />
</component>
</project>
Generated
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
+130
View File
@@ -0,0 +1,130 @@
# 图书管理系统作业
## 简介
这是一个图书管理系统的作业,使用了swing组件库和MySQL数据库,实现了图书的增删改查功能,并实现了登录功能,使用DarkLaf主题
## 运行
### 1. 下载项目
```bash
git clone https://gitee.com/msksbr/system-homework-in-the-library.git
```
### 2. 打开项目
打开clone下来的`system-homework-in-the-library`文件夹,右键使用idea打开(`Open Folder as IntelliJ IDEA Project `
<img src="README.assets/image-20250206210127025.png" alt="image-20250206210127025" style="zoom:50%;" />
### 3. 注册库文件
打开项目中的`lib`文件夹,右键jar包,选择`添加为库…`
<img src="README.assets/image-20250206210455149.png" alt="image-20250206210455149" style="zoom:50%;" />
### 4. 安装插件
由于本项目开发时IDEA版本较旧,`Swing UI Designer`插件为内置,而在新版本的IDEA中,`Swing UI Designer`已经被移除,需要手动安装
插件商店页面如下:
<img src="README.assets/image-20250206210827934.png" alt="image-20250206210827934" style="zoom:50%;" />
### 5. 创建数据库
在您的mysql中创建一个名为`book`的数据库,并导入`book.sql`文件,字符集选择`utf8mb4`
`book.sql`位于项目的`sql`文件夹下
### 6. 编辑数据库配置
数据库配置位于`com.msksbr.SQL`包下的两个类中,分别是`Connector``PassWord`(出于隐私考虑,本人并未上传PassWord.java
#### 6.1 创建PassWord类
则首先需要创建PassWord.java文件,内容如下:
```java
package com.msksbr.SQL;
/**
* 密码类,用于存储数据库连接的密码。
*/
public class PassWord {
// 数据库连接密码
public String passWord = "Your_Pass_Word";
}
```
`Your_Pass_Word`替换为您的数据库密码
#### 6.2 编辑Connector类
类中的url和user字符串需要根据您的数据库配置进行修改,其位于类中的第14行和第16行
```java
// 数据库连接URL
private String url = "jdbc:mysql://your_url:your_port/book";
// 数据库用户名
private String user = "your_username";
```
`your_url``your_port`替换为您的数据库地址和端口,将`your_username`替换为您的数据库用户名
### 7. 运行程序
运行`com.msksbr.Main`类中的`main`方法,即可运行程序
即打开com.msksbe.Main类,在Main类上点击三角运行标志即可运行程序
<img src="README.assets/image-20250206212306354.png" alt="image-20250206212306354" style="zoom:50%;" />
## 默认用户名和密码
| 用户名 | 密码 |
| ------ | ------------------ |
| `root` | `PassWord_of_root` |
## 声明
1. 本项目完全开源免费,如您从任何渠道购买到本软件及其源码,请您立即退款,并联系作者
2. 本项目遵守MIT协议,您可以在遵守MIT协议的前提下使用本项目
- 本软件按”原样“提供,作者不负任何担保责任,也不对使用本软件的任何风险负责
- 本软件完全可以商用,可随意进行修改、复制、再发布,但请保留原作者信息
- 保留作者信息:在软件的每个副本或衍生作品中,都必须包含完整的作者信息,保留MIT许可证副本
- 不得用于违法用途:不得用于任何违法、滥用或恶意的目的
- 不得侵犯第三方权利:不得侵犯任何第三方的知识产权、商标权或其他权利
- 不得损害作者权益:不得损害作者的名誉、形象或利益
严正声明:对本软件及源码及其副本进行的任何下载、克隆、再分发,都代表您已阅读并同意本声明
3. 任何得到本软件及其源码及其副本的人,如果是在付费渠道购买到的,都有权利使用本声明以及软件内`关于->关于软件`屏幕中的声明联系渠道进行退款
4. 再次强调,如果您在任何渠道购买到本软件及其源码,您可以并且有权力使用本声明以及软件内`关于->关于软件`屏幕中的声明联系渠道进行退款
5. 提到的`本软件及其源码及其副本`中的版本指的是本项目在gitee上的原样版本,经过修改后可以进行商用,但请保留原作者信息,**但请保留原作者信息**,**但请保留原作者信息**
6. 再次严正声明:对本软件及源码及其副本进行的任何下载、克隆、再分发,都代表您**已阅读并同意**本声明
### 作者联系方式
- [3141661556@qq.com](mailto://3141661556@qq.com/) 常用
- [gugugulaocuchen@gmail.com](mailto://gugugulaocuchen@gmail.com/) 想起来就瞄一眼的那种
- [jasoncaesar515@outlook.com](mailto://jasoncaesar515@outlook.com/) 基本不会用
## 本项目的未来打算
这个项目说白了就是拿来水作业的,所以未来打算不会再进行维护,也不会再进行更新,其中的很多功能也非常潦草,注释都是后来用ai加的
为了给学弟学妹们一个免费的参考,我将本项目开源
之后为了更好的学习,我会将本项目使用C++,qy6和json重构,使其更加规范,更加易于维护
虽然上面声明显得很凶,但是如果商家售卖的是帮助你运行代码,包括帮助配置环境之类的,那么他收费是理所应得的,因为你作为一个计算机学科的学生,你连这都不会,你不花这冤枉钱谁花呢
最后,希望大家都能有个好成绩
喜欢的话记得给个star☕
Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-4
View File
@@ -1,4 +0,0 @@
# SQL配置说明
1. 创建名为book的数据库
2. 导入book.sql
+85 -3
View File
@@ -13,100 +13,183 @@ import com.msksbr.MainFrm.MainFrm;
import com.msksbr.SQL.Connector; import com.msksbr.SQL.Connector;
import com.msksbr.images.EasterEgg; import com.msksbr.images.EasterEgg;
/**
* LoginFrm 类表示登录窗口,用于用户登录到图书管理系统。
*/
public class LoginFrm extends javax.swing.JFrame { public class LoginFrm extends javax.swing.JFrame {
// 数据库连接器
private final Connector connector; private final Connector connector;
// 登录消息异常处理对象
private final LoginMessangeExpection loginMessangeExpection; private final LoginMessangeExpection loginMessangeExpection;
// 主面板
private JPanel panel1; private JPanel panel1;
// 标题面板
private JPanel titlePanel; private JPanel titlePanel;
// 标题标签
private JLabel titleLabel; private JLabel titleLabel;
// 主体面板
private JPanel bodyPanel; private JPanel bodyPanel;
// 底部面板
private JPanel bottomPanel; private JPanel bottomPanel;
// 提交按钮
private JButton commitButton; private JButton commitButton;
// 标签面板
private JPanel labelPanel; private JPanel labelPanel;
// 字段面板
private JPanel fieldPanel; private JPanel fieldPanel;
// 用户名标签面板
private JPanel uLabelPanel; private JPanel uLabelPanel;
// 密码标签面板
private JPanel pLabelPanel; private JPanel pLabelPanel;
// 用户名标签
private JLabel uLabel; private JLabel uLabel;
// 密码标签
private JLabel pLabel; private JLabel pLabel;
// 用户名文本框
private JTextField uField; private JTextField uField;
// 密码文本框
private JPasswordField pField; private JPasswordField pField;
// 用户名
private String username; private String username;
// 密码
private String password; private String password;
/**
* 构造函数,初始化登录窗口。
*/
public LoginFrm() { public LoginFrm() {
// 初始化登录消息异常处理对象
loginMessangeExpection = new LoginMessangeExpection(); loginMessangeExpection = new LoginMessangeExpection();
setIconImage(new ImageIcon("src/com/msksbr/images/mainicon.png").getImage()); // 设置窗口图标
setIconImage(new ImageIcon(LoginFrm.class.getResource("/com/msksbr/images/mainicon.png")).getImage());
try { try {
// 创建数据库连接器
connector = new Connector(); connector = new Connector();
} catch (ClassNotFoundException | SQLException e) { } catch (ClassNotFoundException | SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 设置窗口标题
setTitle("登录到图书管理系统"); setTitle("登录到图书管理系统");
// 设置内容面板
setContentPane(panel1); setContentPane(panel1);
// 设置默认关闭操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 调整窗口大小以适应其内容
pack(); pack();
// 设置窗口可见
setVisible(true); setVisible(true);
// 设置窗口大小
setSize(400, 250); setSize(400, 250);
// 设置窗口不可调整大小
setResizable(false); setResizable(false);
// 设置文本框的首选大小
Dimension fieldDimension = new Dimension(250, 30); Dimension fieldDimension = new Dimension(250, 30);
this.uField.setPreferredSize(fieldDimension); this.uField.setPreferredSize(fieldDimension);
this.pField.setPreferredSize(fieldDimension); this.pField.setPreferredSize(fieldDimension);
// 为密码文本框添加按键监听器
this.pField.addKeyListener(new KeyAdapter() { this.pField.addKeyListener(new KeyAdapter() {
/**
* 当按键被按下时调用的方法。
*
* @param e 按键事件
*/
@Override @Override
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
// 如果按下的是回车键
if (e.getKeyCode() == KeyEvent.VK_ENTER) { if (e.getKeyCode() == KeyEvent.VK_ENTER) {
// 调用登录消息输入方法
loginMessangeEntered(); loginMessangeEntered();
} }
} }
}); });
// 设置提交按钮的光标为手型光标
this.commitButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); this.commitButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
// 为提交按钮添加动作监听器
this.commitButton.addActionListener(new ActionListener() { this.commitButton.addActionListener(new ActionListener() {
/**
* 当按钮被点击时调用的方法。
*
* @param e 动作事件
*/
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 调用登录消息输入方法
loginMessangeEntered(); loginMessangeEntered();
} }
}); });
// 设置窗口位置
setLocation(); setLocation();
// 设置对话框位置
setDialogLocation(); setDialogLocation();
} }
/**
* 设置窗口位置为屏幕中心。
*/
private void setLocation() { private void setLocation() {
// 创建屏幕尺寸对象
ScreenSize screenSize = new ScreenSize(); ScreenSize screenSize = new ScreenSize();
// 设置窗口位置为屏幕中心
setLocation(screenSize.width / 2 - getWidth() / 2, screenSize.height / 2 - getHeight() / 2); setLocation(screenSize.width / 2 - getWidth() / 2, screenSize.height / 2 - getHeight() / 2);
} }
/**
* 设置对话框位置。
*/
private void setDialogLocation() { private void setDialogLocation() {
// 设置对话框位置
loginMessangeExpection.setLocation(getX() + getWidth() / 4, getY() + getHeight() / 4); loginMessangeExpection.setLocation(getX() + getWidth() / 4, getY() + getHeight() / 4);
} }
/**
* 处理登录消息输入。
*/
private void loginMessangeEntered() { private void loginMessangeEntered() {
// 获取用户名
username = uField.getText(); username = uField.getText();
// 获取密码
password = new String(pField.getPassword()); password = new String(pField.getPassword());
// 检查登录消息是否正确
Boolean ISMessageTrue = isLoginMessageTrue(); Boolean ISMessageTrue = isLoginMessageTrue();
if (ISMessageTrue) { if (ISMessageTrue) {
// 关闭当前窗口
dispose(); dispose();
try { try {
// 创建主窗口
new MainFrm(); new MainFrm();
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} else { } else {
// 显示登录消息异常对话框
loginMessangeExpection.setVisible(true); loginMessangeExpection.setVisible(true);
} }
} }
/**
* 检查登录消息是否正确。
*
* @return 如果登录消息正确返回 true,否则返回 false
*/
private Boolean isLoginMessageTrue() { private Boolean isLoginMessageTrue() {
// 如果用户名和密码是特定的彩蛋值
if (username.equals("java") && password.equals("beans")) { if (username.equals("java") && password.equals("beans")) {
// 显示彩蛋对话框
new EasterEgg(); new EasterEgg();
return false; return false;
} else { } else {
try { try {
// 执行查询以检查用户名和密码是否匹配
ResultSet resultSet = connector.executeQuery("SELECT * FROM users WHERE username = '" + username + "'"); ResultSet resultSet = connector.executeQuery("SELECT * FROM users WHERE username = '" + username + "'");
if (resultSet != null && resultSet.next()) { // 检查结果集是否不为空 if (resultSet != null && resultSet.next()) { // 检查结果集是否不为空
if (resultSet.getString("password").equals(password)) { if (resultSet.getString("password").equals(password)) {
@@ -115,10 +198,9 @@ public class LoginFrm extends javax.swing.JFrame {
} }
return false; return false;
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
} }
} }
@@ -3,22 +3,44 @@ package com.msksbr.LoginFrm;
import javax.swing.*; import javax.swing.*;
import java.awt.event.*; import java.awt.event.*;
/**
* LoginMessangeExpection 类表示一个登录失败的对话框,用于显示错误信息。
*/
public class LoginMessangeExpection extends JDialog { public class LoginMessangeExpection extends JDialog {
// 对话框的内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
/**
* 构造函数,初始化 LoginMessangeExpection 对话框。
*/
public LoginMessangeExpection() { public LoginMessangeExpection() {
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为 buttonOK
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框的大小
setSize(200, 150); setSize(200, 150);
// 设置对话框的标题
setTitle("登录失败"); setTitle("登录失败");
// 为 buttonOK 添加动作监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
/**
* 当按钮被点击时调用的方法。
*
* @param e 动作事件
*/
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 调用 onOK 方法
onOK(); onOK();
// 调用 onCancel 方法
onCancel(); onCancel();
} }
}); });
@@ -26,26 +48,46 @@ public class LoginMessangeExpection extends JDialog {
// 点击 X 时调用 onCancel() // 点击 X 时调用 onCancel()
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() { addWindowListener(new WindowAdapter() {
/**
* 当窗口关闭事件发生时调用的方法。
*
* @param e 窗口事件
*/
public void windowClosing(WindowEvent e) { public void windowClosing(WindowEvent e) {
// 调用 onCancel 方法
onCancel(); onCancel();
} }
}); });
// 遇到 ESCAPE 时调用 onCancel() // 遇到 ESCAPE 时调用 onCancel()
contentPane.registerKeyboardAction(new ActionListener() { contentPane.registerKeyboardAction(new ActionListener() {
/**
* 当按键事件发生时调用的方法。
*
* @param e 动作事件
*/
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 调用 onCancel 方法
onCancel(); onCancel();
} }
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
} }
/**
* 当用户点击确认按钮时调用的方法。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码 // 在此处添加您的代码
// 关闭对话框
dispose(); dispose();
} }
/**
* 当用户取消操作时调用的方法。
*/
private void onCancel() { private void onCancel() {
// 必要时在此处添加您的代码 // 必要时在此处添加您的代码
// 关闭对话框
dispose(); dispose();
} }
} }
+12
View File
@@ -2,14 +2,26 @@ package com.msksbr.LoginFrm;
import java.awt.*; import java.awt.*;
/**
* ScreenSize 类用于获取屏幕的尺寸信息。
*/
public class ScreenSize { public class ScreenSize {
// 屏幕的宽度
public int width; public int width;
// 屏幕的高度
public int height; public int height;
// 屏幕的尺寸对象
public Dimension screenSize; public Dimension screenSize;
/**
* 构造函数,初始化 ScreenSize 对象并获取屏幕尺寸。
*/
public ScreenSize() { public ScreenSize() {
// 获取默认工具包的屏幕尺寸
screenSize = Toolkit.getDefaultToolkit().getScreenSize(); screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// 设置屏幕宽度
width = screenSize.width; width = screenSize.width;
// 设置屏幕高度
height = screenSize.height; height = screenSize.height;
} }
} }
+10 -1
View File
@@ -4,10 +4,19 @@ import com.formdev.flatlaf.FlatDarculaLaf;
import com.msksbr.LoginFrm.LoginFrm; import com.msksbr.LoginFrm.LoginFrm;
/**
* 主类,程序入口
*/
public class Main { public class Main {
/**
* 主方法,程序入口点
*
* @param args 命令行参数
*/
public static void main(String[] args) { public static void main(String[] args) {
// 安装FlatDarcula外观
FlatDarculaLaf.install(); FlatDarculaLaf.install();
// 创建并显示登录窗口
new LoginFrm(); new LoginFrm();
} }
} }
+54 -7
View File
@@ -10,52 +10,90 @@ import java.awt.event.*;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/**
* 主窗口类,继承自JFrame,用于显示图书管理系统的主界面
*/
public class MainFrm extends JFrame { public class MainFrm extends JFrame {
// 数据库连接器对象,用于与数据库进行交互
private Connector connector; private Connector connector;
// 主面板,用于容纳其他组件
private JPanel panel1; private JPanel panel1;
// 表格面板,用于显示数据表格(当前未使用)
private JPanel tablePanel; private JPanel tablePanel;
// 底部面板,用于显示统计信息
private JPanel bottomPanel; private JPanel bottomPanel;
// 背景标签,用于显示背景图片
private JLabel backLabel; private JLabel backLabel;
// 统计信息标签,用于显示图书、学生和借阅记录的数量
private JLabel countMessage = new JLabel(); private JLabel countMessage = new JLabel();
// 菜单栏对象,用于显示菜单选项
private MenuBar menuBar; private MenuBar menuBar;
/**
* 构造方法,初始化主窗口并设置相关属性
* @throws SQLException 如果数据库操作失败抛出此异常
* @throws ClassNotFoundException 如果找不到数据库驱动类抛出此异常
*/
public MainFrm() throws SQLException, ClassNotFoundException { public MainFrm() throws SQLException, ClassNotFoundException {
setIconImage(new ImageIcon("src/com/msksbr/images/mainicon.png").getImage()); // 设置窗口图标
setIconImage(new ImageIcon(MainFrm.class.getResource("/com/msksbr/images/mainicon.png")).getImage());
// 初始化数据库连接器
connector = new Connector(); connector = new Connector();
// 设置窗口标题
setTitle("图书管理系统"); setTitle("图书管理系统");
// 设置窗口内容面板
setContentPane(panel1); setContentPane(panel1);
// 调整窗口大小以适应内容
pack(); pack();
// 初始化菜单栏
menuBar = new MenuBar(); menuBar = new MenuBar();
// 设置窗口的菜单栏
setJMenuBar(menuBar); setJMenuBar(menuBar);
// 设置窗口关闭操作
setDefaultCloseOperation(EXIT_ON_CLOSE); setDefaultCloseOperation(EXIT_ON_CLOSE);
// 设置窗口大小
setSize(960, 720); setSize(960, 720);
// 获取并设置统计信息
String countData = "本馆共藏书" + getCount("books") + "本,共记录学生信息" + getCount("students") + "条,已借阅" + getCount("rents") + "本书,人均借阅" + (double) getCount("rents") / getCount("students") + ""; String countData = "本馆共藏书" + getCount("books") + "本,共记录学生信息" + getCount("students") + "条,已借阅" + getCount("rents") + "本书,人均借阅" + (double) getCount("rents") / getCount("students") + "";
countMessage.setText(countData); countMessage.setText(countData);
// 将统计信息标签添加到底部面板
bottomPanel.add(countMessage); bottomPanel.add(countMessage);
ImageIcon imageIcon = new ImageIcon("src/com/msksbr/images/backGround.png"); // 创建并设置背景图片
imageIcon.setImage(imageIcon.getImage().getScaledInstance(250, 250, 0)); // 创建一个 ImageIcon 对象,用于加载背景图片
ImageIcon imageIcon = new ImageIcon(MainFrm.class.getResource("/com/msksbr/images/backGround.png"));
imageIcon.setImage(imageIcon.getImage().getScaledInstance(250, 250, 0));
// 设置背景标签的图标
backLabel.setIcon(imageIcon); backLabel.setIcon(imageIcon);
// 设置窗口的最小尺寸
setMinimumSize(new Dimension(960, 720)); setMinimumSize(new Dimension(960, 720));
// 设置窗口位置
setLocation(); setLocation();
// 初始化对话框
initDialogs(); initDialogs();
// 设置窗口可见
setVisible(true); setVisible(true);
} }
/**
* 设置窗口位置,使其居中显示在屏幕上
*/
private void setLocation() { private void setLocation() {
// 创建一个 ScreenSize 对象,用于获取屏幕尺寸
ScreenSize screenSize = new ScreenSize(); ScreenSize screenSize = new ScreenSize();
// 设置窗口位置,使其居中显示在屏幕上
setLocation(screenSize.width / 2 - getWidth() / 2, screenSize.height / 2 - getHeight() / 2); setLocation(screenSize.width / 2 - getWidth() / 2, screenSize.height / 2 - getHeight() / 2);
} }
/**
* 初始化对话框,为退出菜单项添加事件监听器
*/
private void initDialogs() { private void initDialogs() {
// 为退出菜单项添加事件监听器,当点击退出菜单项时,调用 System.exit(0) 方法退出程序
menuBar.exitItem.addActionListener( menuBar.exitItem.addActionListener(
new ActionListener() { new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@@ -65,9 +103,18 @@ public class MainFrm extends JFrame {
); );
} }
/**
* 获取指定表中的记录数
* @param table 表名
* @return 表中的记录数
* @throws SQLException 如果执行 SQL 查询时发生错误
*/
private int getCount(String table) throws SQLException { private int getCount(String table) throws SQLException {
// 执行 SQL 查询,获取指定表中的记录数
ResultSet rs = connector.executeQuery("SELECT COUNT(*) FROM " + table + ";"); ResultSet rs = connector.executeQuery("SELECT COUNT(*) FROM " + table + ";");
// 将结果集指针移动到第一行
rs.next(); rs.next();
// 返回查询结果中的记录数
return rs.getInt("COUNT(*)"); return rs.getInt("COUNT(*)");
} }
} }
+65 -9
View File
@@ -9,114 +9,161 @@ import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
/**
* 主窗口菜单栏类,继承自JMenuBar,用于创建和管理菜单栏及其菜单项
*/
public class MenuBar extends JMenuBar { public class MenuBar extends JMenuBar {
// 退出菜单项,用于退出应用程序
public JMenuItem exitItem; public JMenuItem exitItem;
// 关于对话框,用于显示关于软件的信息
protected com.msksbr.MainFrm.MenuItemDiaog.aboutDIalog aboutDIalog; protected com.msksbr.MainFrm.MenuItemDiaog.aboutDIalog aboutDIalog;
// 作者对话框,用于显示软件作者的信息
protected AuthorDIalog authorDIalog; protected AuthorDIalog authorDIalog;
/**
* 构造方法,初始化菜单栏并添加菜单项
*/
public MenuBar() { public MenuBar() {
// “文件“菜单 // “文件“菜单
JMenu fileMenu = new JMenu("文件"); JMenu fileMenu = new JMenu("文件");
// 创建退出菜单项
exitItem = new JMenuItem("退出"); exitItem = new JMenuItem("退出");
// 将退出菜单项添加到文件菜单
fileMenu.add(exitItem); fileMenu.add(exitItem);
// ”查询“菜单 // ”查询“菜单
JMenu searchMenu = new JMenu("查询"); JMenu searchMenu = new JMenu("查询");
// 创建查询图书信息菜单项
JMenuItem bookSearch = new JMenuItem("查询图书信息"); JMenuItem bookSearch = new JMenuItem("查询图书信息");
// 为查询图书信息菜单项添加事件监听器,当点击时弹出图书信息查询对话框
bookSearch.addActionListener(new ActionListener() { bookSearch.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new SearchDIalog("books"); new SearchDIalog("books").setVisible(true);
} }
} });
); // 创建查询学生信息菜单项
JMenuItem studentSearch = new JMenuItem("查询学生信息"); JMenuItem studentSearch = new JMenuItem("查询学生信息");
// 为查询学生信息菜单项添加事件监听器,当点击时弹出学生信息查询对话框
studentSearch.addActionListener(new ActionListener() { studentSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new SearchDIalog("students"); new SearchDIalog("students").setVisible(true);
} }
}); });
// 创建查询借阅信息菜单项
JMenuItem rentSearch = new JMenuItem("查询借阅信息"); JMenuItem rentSearch = new JMenuItem("查询借阅信息");
// 为查询借阅信息菜单项添加事件监听器,当点击时弹出借阅信息查询对话框
rentSearch.addActionListener(new ActionListener() { rentSearch.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new SearchDIalog("rents"); new SearchDIalog("rents").setVisible(true);
} }
}); });
// 将查询图书信息菜单项添加到查询菜单
searchMenu.add(bookSearch); searchMenu.add(bookSearch);
// 将查询学生信息菜单项添加到查询菜单
searchMenu.add(studentSearch); searchMenu.add(studentSearch);
// 将查询借阅信息菜单项添加到查询菜单
searchMenu.add(rentSearch); searchMenu.add(rentSearch);
// ”添加“菜单 // ”添加“菜单
JMenu addMenu = new JMenu("添加"); JMenu addMenu = new JMenu("添加");
// 创建添加图书信息菜单项
JMenuItem bookAdd = new JMenuItem("添加图书信息"); JMenuItem bookAdd = new JMenuItem("添加图书信息");
// 为添加图书信息菜单项添加事件监听器,当点击时弹出图书信息添加对话框
bookAdd.addActionListener(new ActionListener() { bookAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new BookAdder(); new BookAdder().setVisible(true);
} }
}); });
// 创建添加学生信息菜单项
JMenuItem studentAdd = new JMenuItem("添加学生信息"); JMenuItem studentAdd = new JMenuItem("添加学生信息");
// 为添加学生信息菜单项添加事件监听器,当点击时弹出学生信息添加对话框
studentAdd.addActionListener(new ActionListener() { studentAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new StudentAdder(); new StudentAdder();
} }
}); });
// 创建添加借阅信息菜单项
JMenuItem rentAdd = new JMenuItem("添加借阅信息"); JMenuItem rentAdd = new JMenuItem("添加借阅信息");
// 为添加借阅信息菜单项添加事件监听器,当点击时弹出借阅信息添加对话框
rentAdd.addActionListener(new ActionListener() { rentAdd.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new RentAdder(); new RentAdder();
} }
}); });
// 将添加图书信息菜单项添加到添加菜单
addMenu.add(bookAdd); addMenu.add(bookAdd);
// 将添加学生信息菜单项添加到添加菜单
addMenu.add(studentAdd); addMenu.add(studentAdd);
// 将添加借阅信息菜单项添加到添加菜单
addMenu.add(rentAdd); addMenu.add(rentAdd);
// ”删除“菜单 // ”删除“菜单
JMenu removeMenu = new JMenu("删除"); JMenu removeMenu = new JMenu("删除");
// 创建删除图书信息菜单项
JMenuItem bookRemove = new JMenuItem("删除图书信息"); JMenuItem bookRemove = new JMenuItem("删除图书信息");
// 为删除图书信息菜单项添加事件监听器,当点击时弹出图书信息删除对话框
bookRemove.addActionListener(new ActionListener() { bookRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new Remover("books"); new Remover("books");
} }
}); });
// 创建删除学生信息菜单项
JMenuItem studentRemove = new JMenuItem("删除学生信息"); JMenuItem studentRemove = new JMenuItem("删除学生信息");
// 为删除学生信息菜单项添加事件监听器,当点击时弹出学生信息删除对话框
studentRemove.addActionListener(new ActionListener() { studentRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new Remover("students"); new Remover("students");
} }
}); });
// 创建删除借阅信息菜单项
JMenuItem rentRemove = new JMenuItem("删除借阅信息"); JMenuItem rentRemove = new JMenuItem("删除借阅信息");
// 为删除借阅信息菜单项添加事件监听器,当点击时弹出借阅信息删除对话框
rentRemove.addActionListener(new ActionListener() { rentRemove.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new Remover("rents"); new Remover("rents");
} }
}); });
// 将删除图书信息菜单项添加到删除菜单
removeMenu.add(bookRemove); removeMenu.add(bookRemove);
// 将删除学生信息菜单项添加到删除菜单
removeMenu.add(studentRemove); removeMenu.add(studentRemove);
// 将删除借阅信息菜单项添加到删除菜单
removeMenu.add(rentRemove); removeMenu.add(rentRemove);
// ”关于“菜单 // ”关于“菜单
JMenu aboutMenu = new JMenu("关于"); JMenu aboutMenu = new JMenu("关于");
// 创建关于软件菜单项
JMenuItem about = new JMenuItem("关于软件"); JMenuItem about = new JMenuItem("关于软件");
// 创建关于软件的对话框
aboutDIalog = new aboutDIalog(); aboutDIalog = new aboutDIalog();
// 为关于软件菜单项添加事件监听器,当点击时显示关于软件的对话框
about.addActionListener(new ActionListener() { about.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
aboutDIalog.setVisible(true); aboutDIalog.setVisible(true);
} }
}); });
// 创建作者菜单项
JMenuItem author = new JMenuItem("作者"); JMenuItem author = new JMenuItem("作者");
// 创建软件作者的对话框
authorDIalog = new AuthorDIalog(); authorDIalog = new AuthorDIalog();
// 为作者菜单项添加事件监听器,当点击时显示软件作者的对话框
author.addActionListener(new ActionListener() { author.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
authorDIalog.setVisible(true); authorDIalog.setVisible(true);
} }
}); });
// 创建MIT许可证菜单项
JMenuItem MITLicense = new JMenuItem("MIT许可证"); JMenuItem MITLicense = new JMenuItem("MIT许可证");
// 为MIT许可证菜单项添加事件监听器,当点击时显示MIT许可证的对话框
MITLicense.addActionListener(new ActionListener() { MITLicense.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
new MITDialog(); new MITDialog();
} }
}); });
// 创建鸣谢菜单项
JMenuItem thanksItem = new JMenuItem("鸣谢"); JMenuItem thanksItem = new JMenuItem("鸣谢");
// 为鸣谢菜单项添加事件监听器,当点击时显示鸣谢信息的对话框
thanksItem.addActionListener( thanksItem.addActionListener(
new ActionListener() { new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@@ -124,16 +171,25 @@ public class MenuBar extends JMenuBar {
} }
} }
); );
// 将关于软件菜单项添加到关于菜单
aboutMenu.add(about); aboutMenu.add(about);
// 将作者菜单项添加到关于菜单
aboutMenu.add(author); aboutMenu.add(author);
// 将MIT许可证菜单项添加到关于菜单
aboutMenu.add(MITLicense); aboutMenu.add(MITLicense);
// 将鸣谢菜单项添加到关于菜单
aboutMenu.add(thanksItem); aboutMenu.add(thanksItem);
//将菜单加入菜单栏 //将菜单加入菜单栏
// 将文件菜单添加到菜单栏
add(fileMenu); add(fileMenu);
// 将查询菜单添加到菜单栏
add(searchMenu); add(searchMenu);
// 将添加菜单添加到菜单栏
add(addMenu); add(addMenu);
// 将删除菜单添加到菜单栏
add(removeMenu); add(removeMenu);
// 将关于菜单添加到菜单栏
add(aboutMenu); add(aboutMenu);
} }
} }
@@ -6,36 +6,67 @@ import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
/**
* AcademyThanksDialog 类用于显示鸣谢信息的对话框。
*/
public class AcademyThanksDialog extends JDialog { public class AcademyThanksDialog extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 图片标签
private JLabel imageLabel; private JLabel imageLabel;
/**
* AcademyThanksDialog 构造函数,初始化对话框并设置相关属性。
*/
public AcademyThanksDialog() { public AcademyThanksDialog() {
// 设置对话框标题
setTitle("鸣谢"); setTitle("鸣谢");
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为非模态对话框
setModal(false); setModal(false);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
imageLabel.setIcon(new ImageIcon("src/com/msksbr/images/academy_logo.png"));
// 设置图片标签的图标
// 设置图片标签的图标为指定路径的图片
imageLabel.setIcon(new ImageIcon(AcademyThanksDialog.class.getResource("/com/msksbr/images/academy_logo.png")));
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框位置
setLocation(); setLocation();
// 设置对话框始终在最顶层显示
setAlwaysOnTop(true); setAlwaysOnTop(true);
// 设置对话框可见
setVisible(true); setVisible(true);
} }
/**
* 点击确认按钮时执行的操作,关闭对话框。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码 // 关闭对话框
dispose(); dispose();
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
} }
@@ -10,76 +10,130 @@ import java.awt.print.Book;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/**
* BookAdder 类用于添加图书信息的对话框。
*/
public class BookAdder extends JDialog { public class BookAdder extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 书名文本框
private JTextField textField1; private JTextField textField1;
// 图书类型文本框
private JTextField textField2; private JTextField textField2;
// 图书ID文本框
private JTextField IDField; private JTextField IDField;
// ISBN文本框
private JTextField textField4; private JTextField textField4;
// 数据库连接器
private Connector connector; private Connector connector;
// 图书ID
private int bID; private int bID;
// 书名
private String bName; private String bName;
// 图书类型
private String bType; private String bType;
// ISBN
private String ISBN; private String ISBN;
// SQL语句
private String sql; private String sql;
/**
* BookAdder 构造函数,初始化对话框并设置相关属性。
*/
public BookAdder() { public BookAdder() {
try { try {
// 初始化数据库连接器
connector = new Connector(); connector = new Connector();
// 获取最大图书ID并加1作为新图书的ID
bID = getBookMaxID() + 1; bID = getBookMaxID() + 1;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
// 设置图书ID文本框的文本为新图书的ID,并设置为不可编辑
IDField.setText(String.valueOf(bID)); IDField.setText(String.valueOf(bID));
IDField.setEditable(false); IDField.setEditable(false);
// 设置对话框标题
setTitle("添加图书信息"); setTitle("添加图书信息");
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框位置
setLocation(); setLocation();
setVisible(true);
} }
/**
* 点击确认按钮时执行的操作,获取用户输入的图书信息并插入到数据库中。
*/
private void onOK() { private void onOK() {
// 获取书名
bName = textField1.getText(); bName = textField1.getText();
// 获取图书类型
bType = textField2.getText(); bType = textField2.getText();
// 获取ISBN
ISBN = textField4.getText(); ISBN = textField4.getText();
// 构建插入图书信息的SQL语句
sql = "INSERT INTO books (book_name,book_id,book_type,ISBN) VALUES ('" + bName + "'," + bID + ",'" + bType + "','" + ISBN + "');"; sql = "INSERT INTO books (book_name,book_id,book_type,ISBN) VALUES ('" + bName + "'," + bID + ",'" + bType + "','" + ISBN + "');";
// 执行SQL语句
commit2SQL(); commit2SQL();
// 在此处添加您的代码 // 关闭对话框
dispose(); dispose();
} }
/**
* 获取最大图书ID。
* @return 最大图书ID
* @throws SQLException 如果执行SQL查询时发生错误
*/
public int getBookMaxID() throws SQLException { public int getBookMaxID() throws SQLException {
// 执行SQL查询,获取最大图书ID
ResultSet rs = connector.executeQuery("SELECT MAX(book_id) FROM books;"); ResultSet rs = connector.executeQuery("SELECT MAX(book_id) FROM books;");
// 将结果集指针移动到第一行
rs.next(); rs.next();
// 返回最大图书ID
return rs.getInt("MAX(book_id)"); return rs.getInt("MAX(book_id)");
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
/**
* 执行SQL插入操作,将图书信息插入到数据库中。
*/
private void commit2SQL() { private void commit2SQL() {
try { try {
// 执行SQL插入操作
connector.executeUpdate(sql); connector.executeUpdate(sql);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@@ -9,85 +9,151 @@ import java.awt.event.ActionListener;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/**
* RentAdder 类用于添加借阅信息的对话框。
*/
public class RentAdder extends JDialog { public class RentAdder extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 图书ID文本框
private JTextField bIDField; private JTextField bIDField;
// 学生ID文本框
private JTextField sIDField; private JTextField sIDField;
// 图书ID
private int bID; private int bID;
// 学生ID
private int sID; private int sID;
// 图书数据库连接器
private Connector bConnector; private Connector bConnector;
// 学生数据库连接器
private Connector sConnector; private Connector sConnector;
// 查询图书信息的SQL语句
private String bookSearchSQL; private String bookSearchSQL;
// 查询学生信息的SQL语句
private String studentSearchSQL; private String studentSearchSQL;
// 更新借阅信息的SQL语句
private String updateSQL; private String updateSQL;
// 查询图书信息的结果集
private ResultSet bIDResult; private ResultSet bIDResult;
// 查询学生信息的结果集
private ResultSet sIDResult; private ResultSet sIDResult;
/**
* RentAdder 构造函数,初始化对话框并设置相关属性。
*/
public RentAdder() { public RentAdder() {
try { try {
// 初始化图书数据库连接器
bConnector = new Connector(); bConnector = new Connector();
// 初始化学生数据库连接器
sConnector = new Connector(); sConnector = new Connector();
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 设置对话框标题
setTitle("添加借阅信息"); setTitle("添加借阅信息");
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框位置
setLocation(); setLocation();
// 设置对话框可见
setVisible(true); setVisible(true);
} }
/**
* 点击确认按钮时执行的操作,获取用户输入的借阅信息并更新到数据库中。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码
try { try {
this.bID = Integer.valueOf(bIDField.getText()); // 获取图书ID
this.sID = Integer.valueOf(sIDField.getText()); this.bID = Integer.parseInt(bIDField.getText());
// 获取学生ID
this.sID = Integer.parseInt(sIDField.getText());
// 生成查询SQL语句
searchSQLMaker(); searchSQLMaker();
// 生成更新SQL语句
updateSQLMaker(); updateSQLMaker();
// 执行查询图书信息的SQL语句
bIDResult = bConnector.executeQuery(bookSearchSQL); bIDResult = bConnector.executeQuery(bookSearchSQL);
// 执行查询学生信息的SQL语句
sIDResult = sConnector.executeQuery(studentSearchSQL); sIDResult = sConnector.executeQuery(studentSearchSQL);
// 如果未找到图书信息,弹出错误提示框
if (!bIDResult.next()) { if (!bIDResult.next()) {
JOptionPane.showMessageDialog(this, "未找到该书信息", "错误", JOptionPane.WARNING_MESSAGE); JOptionPane.showMessageDialog(this, "未找到该书信息", "错误", JOptionPane.WARNING_MESSAGE);
} else if (!sIDResult.next()) { }
// 如果未找到学生信息,弹出错误提示框
else if (!sIDResult.next()) {
JOptionPane.showMessageDialog(this, "未找到学生信息", "错误", JOptionPane.WARNING_MESSAGE); JOptionPane.showMessageDialog(this, "未找到学生信息", "错误", JOptionPane.WARNING_MESSAGE);
} else { }
if (bIDResult.getInt("borrowed_by") == 0) { // 如果图书已借出,弹出错误提示框
bConnector.executeUpdate(updateSQL); else {
} else { if (bIDResult.getInt("borrowed_by") != 0) {
JOptionPane.showMessageDialog(this, "该书已借出", "错误", JOptionPane.WARNING_MESSAGE); JOptionPane.showMessageDialog(this, "该书已借出", "错误", JOptionPane.WARNING_MESSAGE);
} }
// 如果图书未借出,更新借阅信息
else {
bConnector.executeUpdate(updateSQL);
}
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
// 如果输入的不是整数,弹出错误提示框
JOptionPane.showMessageDialog(this, "请输入一个整数", "错误", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this, "请输入一个整数", "错误", JOptionPane.ERROR_MESSAGE);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 关闭对话框
dispose(); dispose();
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
/**
* 生成查询SQL语句。
*/
private void searchSQLMaker() { private void searchSQLMaker() {
// 生成查询图书信息的SQL语句
this.bookSearchSQL = "SELECT * FROM books WHERE book_id =" + this.bID + ";"; this.bookSearchSQL = "SELECT * FROM books WHERE book_id =" + this.bID + ";";
// 生成查询学生信息的SQL语句
this.studentSearchSQL = "SELECT * FROM students WHERE student_id =" + this.sID + ";"; this.studentSearchSQL = "SELECT * FROM students WHERE student_id =" + this.sID + ";";
} }
/**
* 生成更新SQL语句。
*/
private void updateSQLMaker() { private void updateSQLMaker() {
// 生成更新借阅信息的SQL语句
this.updateSQL = "UPDATE books SET borrowed_by = " + this.sID + " WHERE book_id =" + this.bID + ";"; this.updateSQL = "UPDATE books SET borrowed_by = " + this.sID + " WHERE book_id =" + this.bID + ";";
} }
} }
@@ -10,88 +10,149 @@ import java.awt.event.ActionListener;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/**
* StudentAdder 类用于添加学生信息的对话框。
*/
public class StudentAdder extends JDialog { public class StudentAdder extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 学生姓名文本框
private JTextField textField1; private JTextField textField1;
// 学生ID文本框
private JTextField IDField; private JTextField IDField;
// 学生班级文本框
private JTextField textField3; private JTextField textField3;
// 男性单选按钮
private JRadioButton maleRadioButton; private JRadioButton maleRadioButton;
// 女性单选按钮
private JRadioButton femaleRadioButton; private JRadioButton femaleRadioButton;
// 数据库连接器
private Connector connector; private Connector connector;
// 学生姓名
private String sName; private String sName;
// 学生ID
private int sID; private int sID;
// 学生班级
private String sClass; private String sClass;
// 学生性别
private String sGender; private String sGender;
// 性别按钮组
private ButtonGroup genderGroup; private ButtonGroup genderGroup;
// SQL语句
private String sql; private String sql;
/**
* StudentAdder 构造函数,初始化对话框并设置相关属性。
*/
public StudentAdder() { public StudentAdder() {
try { try {
// 初始化数据库连接器
connector = new Connector(); connector = new Connector();
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 创建性别按钮组并添加单选按钮
genderGroup = new ButtonGroup(); genderGroup = new ButtonGroup();
genderGroup.add(maleRadioButton); genderGroup.add(maleRadioButton);
genderGroup.add(femaleRadioButton); genderGroup.add(femaleRadioButton);
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
try { try {
// 获取最大学生ID并加1作为新学生的ID
sID = getStudentMaxID() + 1; sID = getStudentMaxID() + 1;
// 设置学生ID文本框的文本为新学生的ID,并设置为不可编辑
IDField.setText(String.valueOf(sID)); IDField.setText(String.valueOf(sID));
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
IDField.setEditable(false); IDField.setEditable(false);
// 设置对话框标题
setTitle("添加学生信息"); setTitle("添加学生信息");
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 设置对话框大小
setSize(new Dimension(260, 265)); setSize(new Dimension(260, 265));
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框位置
setLocation(); setLocation();
// 设置对话框可见
setVisible(true); setVisible(true);
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
/**
* 点击确认按钮时执行的操作,获取用户输入的学生信息并插入到数据库中。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码 // 获取学生姓名
sName = textField1.getText(); sName = textField1.getText();
// 获取学生班级
sClass = textField3.getText(); sClass = textField3.getText();
// 获取学生性别
sGender = maleRadioButton.isSelected() ? "" : ""; sGender = maleRadioButton.isSelected() ? "" : "";
// 构建插入学生信息的SQL语句
sql = "INSERT INTO students (student_name,student_id,student_class,student_gender) VALUES ('" + sName + "'," + sID + ",'" + sClass + "','" + sGender + "');"; sql = "INSERT INTO students (student_name,student_id,student_class,student_gender) VALUES ('" + sName + "'," + sID + ",'" + sClass + "','" + sGender + "');";
// 执行SQL语句
commit2SQL(); commit2SQL();
// 关闭对话框
dispose(); dispose();
} }
/**
* 执行SQL插入操作,将学生信息插入到数据库中。
*/
private void commit2SQL() { private void commit2SQL() {
try { try {
// 执行SQL插入操作
connector.executeUpdate(sql); connector.executeUpdate(sql);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
/**
* 获取最大学生ID。
* @return 最大学生ID
* @throws SQLException 如果执行SQL查询时发生错误
*/
public int getStudentMaxID() throws SQLException { public int getStudentMaxID() throws SQLException {
// 执行SQL查询,获取最大学生ID
ResultSet rs = connector.executeQuery("SELECT MAX(student_id) FROM students;"); ResultSet rs = connector.executeQuery("SELECT MAX(student_id) FROM students;");
// 将结果集指针移动到第一行
rs.next(); rs.next();
// 返回最大学生ID
return rs.getInt("MAX(student_id)"); return rs.getInt("MAX(student_id)");
} }
} }
@@ -57,7 +57,7 @@
<constraints/> <constraints/>
<properties> <properties>
<font name="PingFang SC" size="14"/> <font name="PingFang SC" size="14"/>
<text value="https://gitee.com/msksbr"/> <text value="https://msksbr.com/msksbr"/>
</properties> </properties>
</component> </component>
</children> </children>
@@ -6,33 +6,65 @@ import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
/**
* AuthorDIalog 类用于显示作者信息的对话框。
*/
public class AuthorDIalog extends JDialog { public class AuthorDIalog extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 图标面板
private JPanel iconPanel; private JPanel iconPanel;
/**
* AuthorDIalog 构造函数,初始化对话框并设置相关属性。
*/
public AuthorDIalog() { public AuthorDIalog() {
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为非模态对话框
setModal(false); setModal(false);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 设置对话框初始不可见
setVisible(false); setVisible(false);
// 创建作者标签并设置图标
JLabel authorLabel = new JLabel(); JLabel authorLabel = new JLabel();
authorLabel.setIcon(new ImageIcon("src/com/msksbr/images/AuthorProfile.jpg")); authorLabel.setIcon(new ImageIcon(AuthorDIalog.class.getResource("/com/msksbr/images/AuthorProfile.jpg")));
// 将作者标签添加到图标面板
iconPanel.add(authorLabel); iconPanel.add(authorLabel);
// 设置对话框关闭时的操作
setDefaultCloseOperation(DISPOSE_ON_CLOSE); setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// 设置对话框标题
setTitle("作者"); setTitle("作者");
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
dispose(); dispose();
} }
}); });
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框始终在最顶层显示
setAlwaysOnTop(true); setAlwaysOnTop(true);
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框位置
setLocation(); setLocation();
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
} }
@@ -15,7 +15,7 @@
<component id="a6e23" class="javax.swing.JLabel"> <component id="a6e23" class="javax.swing.JLabel">
<constraints/> <constraints/>
<properties> <properties>
<text value="本项目已在gitee.com开源"/> <text value="本项目已在git.msksbr.com开源"/>
</properties> </properties>
</component> </component>
</children> </children>
@@ -6,14 +6,26 @@ import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
/**
* MITDialog 类用于显示 MIT 许可证信息的对话框。
*/
public class MITDialog extends JDialog { public class MITDialog extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 显示 MIT 许可证文本的文本面板
private JTextPane MITPane; private JTextPane MITPane;
/**
* MITDialog 构造函数,初始化对话框并设置相关属性。
*/
public MITDialog() { public MITDialog() {
// 设置对话框标题
setTitle("开源信息"); setTitle("开源信息");
// 设置 MITPane 为不可编辑
MITPane.setEditable(false); MITPane.setEditable(false);
// 设置 MITPane 的文本内容为 MIT 许可证信息
MITPane.setText("MIT License\n" + MITPane.setText("MIT License\n" +
"\n" + "\n" +
"Copyright (c) 2024 御坂昴\n" + "Copyright (c) 2024 御坂昴\n" +
@@ -35,30 +47,48 @@ public class MITDialog extends JDialog {
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" + "LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n" +
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n" + "OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n" +
"SOFTWARE.\n"); "SOFTWARE.\n");
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 设置对话框为非模态对话框
setModal(false); setModal(false);
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框位置
setLocation(); setLocation();
// 设置对话框始终在最顶层显示
setAlwaysOnTop(true); setAlwaysOnTop(true);
// 设置对话框可见
setVisible(true); setVisible(true);
} }
/**
* 点击确认按钮时执行的操作,关闭对话框。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码 // 关闭对话框
dispose(); dispose();
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
} }
@@ -9,35 +9,61 @@ import java.awt.event.ActionListener;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/**
* Remover 类用于删除数据库中的记录。
*/
public class Remover extends JDialog { public class Remover extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 标签,用于显示提示信息
private JLabel idLable; private JLabel idLable;
// 文本框,用于输入要删除的记录的ID
private JTextField idField; private JTextField idField;
// 要操作的表名
private String table; private String table;
// 搜索SQL语句
private String Searchsql; private String Searchsql;
// 搜索SQL语句
private String searchSQL; private String searchSQL;
// 删除SQL语句
private String deleteSQL; private String deleteSQL;
// 搜索错误信息
private String searchErrMsg; private String searchErrMsg;
// 要删除的记录的ID
private int id; private int id;
// 用于执行搜索操作的数据库连接器
private Connector searchConnector; private Connector searchConnector;
// 用于执行删除操作的数据库连接器
private Connector deleteConnector; private Connector deleteConnector;
/**
* Remover 构造函数,初始化对话框并设置相关属性。
* @param table 要操作的表名
*/
public Remover(String table) { public Remover(String table) {
try { try {
// 初始化搜索和删除连接器
searchConnector = new Connector(); searchConnector = new Connector();
deleteConnector = new Connector(); deleteConnector = new Connector();
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
// 设置要操作的表名
this.table = table; this.table = table;
// 根据表名设置对话框标题和提示信息
if (table.equals("books")) { if (table.equals("books")) {
setTitle("删除图书信息"); setTitle("删除图书信息");
idLable.setText("请输入书号:"); idLable.setText("请输入书号:");
@@ -51,36 +77,58 @@ public class Remover extends JDialog {
idLable.setText("请输入书号:"); idLable.setText("请输入书号:");
searchErrMsg = "未找到该借阅信息"; searchErrMsg = "未找到该借阅信息";
} }
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框位置
setLocation(); setLocation();
// 设置对话框可见
setVisible(true); setVisible(true);
} }
/**
* 点击确认按钮时执行的操作,删除指定的记录。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码
try { try {
// 获取要删除的记录的ID
this.id = Integer.valueOf(idField.getText()); this.id = Integer.valueOf(idField.getText());
// 生成搜索SQL语句
searchSQLMaker(); searchSQLMaker();
// 生成删除SQL语句
deleteSQLMaker(); deleteSQLMaker();
// 执行搜索操作
ResultSet rs = searchConnector.executeQuery(searchSQL); ResultSet rs = searchConnector.executeQuery(searchSQL);
// 如果找到记录,则执行删除操作
if (rs.next()) { if (rs.next()) {
deleteConnector.executeUpdate(deleteSQL); deleteConnector.executeUpdate(deleteSQL);
} else { } else {
// 如果未找到记录,则显示错误信息
JOptionPane.showMessageDialog(this, searchErrMsg, "错误", JOptionPane.WARNING_MESSAGE); JOptionPane.showMessageDialog(this, searchErrMsg, "错误", JOptionPane.WARNING_MESSAGE);
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
// 如果输入的ID不是整数,则显示错误信息
JOptionPane.showMessageDialog(this, "请输入一个整数", "错误", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this, "请输入一个整数", "错误", JOptionPane.ERROR_MESSAGE);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 关闭对话框
dispose(); dispose();
} }
/**
* 生成搜索SQL语句。
*/
private void searchSQLMaker() { private void searchSQLMaker() {
// 根据表名生成搜索SQL语句
if (table.equals("books")) { if (table.equals("books")) {
searchSQL = "select * from " + table + " where book_id=" + id + ";"; searchSQL = "select * from " + table + " where book_id=" + id + ";";
} else if (table.equals("students")) { } else if (table.equals("students")) {
@@ -90,7 +138,11 @@ public class Remover extends JDialog {
} }
} }
/**
* 生成删除SQL语句。
*/
private void deleteSQLMaker() { private void deleteSQLMaker() {
// 根据表名生成删除SQL语句
if (table.equals("books")) { if (table.equals("books")) {
deleteSQL = "delete from " + table + " where book_id=" + id + ";"; deleteSQL = "delete from " + table + " where book_id=" + id + ";";
} else if (table.equals("students")) { } else if (table.equals("students")) {
@@ -100,7 +152,11 @@ public class Remover extends JDialog {
} }
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
} }
@@ -11,18 +11,35 @@ import java.awt.event.KeyEvent;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
/**
* SearchDIalog 类用于显示查询对话框,并根据用户输入的信息查询数据库中的记录。
*/
public class SearchDIalog extends JDialog { public class SearchDIalog extends JDialog {
// 用于显示查询结果的标签
public JLabel messageLabel; public JLabel messageLabel;
// 用于存储用户输入的ID
protected int idInt; protected int idInt;
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 用于输入ID的文本框
private JTextField idFIeld; private JTextField idFIeld;
// 要查询的表名
private String table; private String table;
/**
* SearchDIalog 构造函数,初始化对话框并设置相关属性。
* @param table 要查询的表名
*/
public SearchDIalog(String table) { public SearchDIalog(String table) {
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 根据表名设置对话框标题和提示信息
if (table.equals("books")) { if (table.equals("books")) {
this.table = "books"; this.table = "books";
this.setTitle("查询图书信息"); this.setTitle("查询图书信息");
@@ -36,20 +53,29 @@ public class SearchDIalog extends JDialog {
this.setTitle("查询借阅信息"); this.setTitle("查询借阅信息");
messageLabel.setText("请输入书号:"); messageLabel.setText("请输入书号:");
} }
// 设置事件监听器
setListener(); setListener();
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框位置
setLocation(); setLocation();
setVisible(true);
} }
/**
* 设置事件监听器,包括确认按钮的点击事件和文本框的回车键事件。
*/
private void setListener() { private void setListener() {
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
// 为文本框添加键盘事件监听器
idFIeld.addKeyListener(new KeyAdapter() { idFIeld.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) { public void keyPressed(KeyEvent e) {
// 当用户按下回车键时执行的操作
if (e.getKeyCode() == KeyEvent.VK_ENTER) { if (e.getKeyCode() == KeyEvent.VK_ENTER) {
onOK(); onOK();
} }
@@ -57,16 +83,28 @@ public class SearchDIalog extends JDialog {
}); });
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
private void setLocation() { private void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
/**
* 点击确认按钮或按下回车键时执行的操作,查询数据库并显示结果。
*/
private void onOK() { private void onOK() {
// 执行SQL查询并获取结果集
ResultSet rs = SQLExe(); ResultSet rs = SQLExe();
// 用于存储查询结果的字符串
String message = ""; String message = "";
try { try {
// 如果结果集不为空且有下一条记录
if (rs != null && rs.next()) { if (rs != null && rs.next()) {
// 用于存储查询结果的标题
String title = ""; String title = "";
// 根据表名生成查询结果的字符串
if (table.equals("books")) { if (table.equals("books")) {
message = "书名:\t" + rs.getString("book_name") + "\n类别:\t" + rs.getString("book_type") + "\n书号:\t" + rs.getInt("book_id") + "\nISBN\t" + rs.getString("ISBN"); message = "书名:\t" + rs.getString("book_name") + "\n类别:\t" + rs.getString("book_type") + "\n书号:\t" + rs.getInt("book_id") + "\nISBN\t" + rs.getString("ISBN");
title = "图书信息"; title = "图书信息";
@@ -77,32 +115,53 @@ public class SearchDIalog extends JDialog {
message = "学生姓名:\t" + rs.getString("student_name") + "\n学号:\t" + rs.getInt("student_id") + "\n班级:\t" + rs.getString("student_class") + "\n性别:\t" + rs.getString("student_gender") + "\n书名:\t" + rs.getString("book_name") + "\n书号:\t" + rs.getInt("book_id") + "\n类别:\t" + rs.getString("book_type") + "\nISBN\t" + rs.getString("ISBN"); message = "学生姓名:\t" + rs.getString("student_name") + "\n学号:\t" + rs.getInt("student_id") + "\n班级:\t" + rs.getString("student_class") + "\n性别:\t" + rs.getString("student_gender") + "\n书名:\t" + rs.getString("book_name") + "\n书号:\t" + rs.getInt("book_id") + "\n类别:\t" + rs.getString("book_type") + "\nISBN\t" + rs.getString("ISBN");
title = "借阅信息"; title = "借阅信息";
} }
// 显示查询结果
new showMessae(message, title); new showMessae(message, title);
} else { } else {
// 如果未找到记录,则显示错误信息
JOptionPane.showMessageDialog(this, "未找到", "未找到", JOptionPane.WARNING_MESSAGE); JOptionPane.showMessageDialog(this, "未找到", "未找到", JOptionPane.WARNING_MESSAGE);
} }
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
/**
* 执行SQL查询并返回结果集。
* @return 查询结果集
*/
private ResultSet SQLExe() { private ResultSet SQLExe() {
// 用于存储查询结果集
ResultSet rs = null; ResultSet rs = null;
try { try {
// 将用户输入的ID转换为整数
idInt = Integer.valueOf(idFIeld.getText()); idInt = Integer.valueOf(idFIeld.getText());
// 创建数据库连接器
Connector connector = new Connector(); Connector connector = new Connector();
// 执行SQL查询并获取结果集
rs = connector.executeQuery(SQLExeMaker(table)); rs = connector.executeQuery(SQLExeMaker(table));
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
// 如果用户输入的ID不是整数,则显示错误信息
JOptionPane.showMessageDialog(this, "请输入一个整数", "错误", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this, "请输入一个整数", "错误", JOptionPane.ERROR_MESSAGE);
} catch (SQLException e) { } catch (SQLException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
// 抛出运行时异常
throw new RuntimeException(e); throw new RuntimeException(e);
} }
// 返回查询结果集
return rs; return rs;
} }
/**
* 根据表名生成SQL查询语句。
* @param table 要查询的表名
* @return SQL查询语句
*/
private String SQLExeMaker(String table) { private String SQLExeMaker(String table) {
// 根据表名生成SQL查询语句
if (table.equals("books")) { if (table.equals("books")) {
return "SELECT * FROM `books` WHERE `book_id` = " + idInt + ";"; return "SELECT * FROM `books` WHERE `book_id` = " + idInt + ";";
} else if (table.equals("students")) { } else if (table.equals("students")) {
@@ -3,7 +3,7 @@
<grid id="cbd77" binding="contentPane" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> <grid id="cbd77" binding="contentPane" layout-manager="GridLayoutManager" row-count="2" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="10" left="10" bottom="10" right="10"/> <margin top="10" left="10" bottom="10" right="10"/>
<constraints> <constraints>
<xy x="48" y="54" width="436" height="297"/> <xy x="48" y="54" width="601" height="297"/>
</constraints> </constraints>
<properties/> <properties/>
<border type="none"/> <border type="none"/>
@@ -40,18 +40,41 @@
<properties/> <properties/>
<border type="none"/> <border type="none"/>
<children> <children>
<grid id="f8413" layout-manager="FlowLayout" hgap="5" vgap="5" flow-align="1"> <grid id="f8413" layout-manager="BorderLayout" hgap="0" vgap="0">
<constraints border-constraint="South"/> <constraints border-constraint="South"/>
<properties/> <properties/>
<border type="none"/> <border type="none"/>
<children> <children>
<component id="48047" class="javax.swing.JLabel"> <grid id="d3052" layout-manager="FlowLayout" hgap="5" vgap="5" flow-align="1">
<constraints/> <constraints border-constraint="South"/>
<properties> <properties/>
<font name="PingFang SC" size="14"/> <border type="none"/>
<text value="https://gitee.com/msksbr/system-homework-in-the-library"/> <children>
</properties> <component id="48047" class="javax.swing.JLabel">
</component> <constraints/>
<properties>
<font name="PingFang SC" size="14"/>
<text value="https://git.msksbr.com/msksbr/system-homework-in-the-library"/>
</properties>
</component>
</children>
</grid>
<grid id="20d87" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
<margin top="0" left="0" bottom="0" right="0"/>
<constraints border-constraint="North"/>
<properties/>
<border type="none"/>
<children>
<component id="5423a" class="javax.swing.JLabel">
<constraints>
<grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
</constraints>
<properties>
<text value="本软件完全免费,如果您从任何渠道购买到此软件及其源码,请联系作者:gugugulaocuchen@gmail.com"/>
</properties>
</component>
</children>
</grid>
</children> </children>
</grid> </grid>
<grid id="bae5e" layout-manager="BorderLayout" hgap="0" vgap="0"> <grid id="bae5e" layout-manager="BorderLayout" hgap="0" vgap="0">
@@ -5,40 +5,85 @@ import com.msksbr.LoginFrm.ScreenSize;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.net.URL;
/**
* aboutDIalog 类用于显示关于图书管理系统的对话框。
*/
public class aboutDIalog extends JDialog { public class aboutDIalog extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 图标面板
private JPanel iconPanel; private JPanel iconPanel;
/**
* aboutDIalog 构造函数,初始化对话框并设置相关属性。
*/
public aboutDIalog() { public aboutDIalog() {
// 设置对话框标题
setTitle("关于图书管理系统"); setTitle("关于图书管理系统");
// 设置对话框初始不可见
setVisible(false); setVisible(false);
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 创建图标标签并设置图标
JLabel iconLabel = new JLabel(); JLabel iconLabel = new JLabel();
iconLabel.setIcon(new ImageIcon("src/com/msksbr/images/logo_128.png")); // 使用类加载器获取资源的URL
URL iconUrl = getClass().getResource("/com/msksbr/images/logo_128.png");
if (iconUrl != null) {
// 创建ImageIcon对象
iconLabel.setIcon(new ImageIcon(iconUrl));
} else {
// 如果资源未找到,记录错误或显示默认图标
System.err.println("图标资源未找到: /com/msksbr/images/logo_128.png");
// 可以在这里设置一个默认图标
// iconLabel.setIcon(new ImageIcon("path/to/default/icon.png"));
}
// 将图标标签添加到图标面板
iconPanel.add(iconLabel); iconPanel.add(iconLabel);
// 设置对话框为非模态对话框
setModal(false); setModal(false);
// 设置对话框始终在最顶层显示
setAlwaysOnTop(true); setAlwaysOnTop(true);
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框位置
setLocation(); setLocation();
} }
/**
* 点击确认按钮时执行的操作,关闭对话框。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码 // 关闭对话框
dispose(); dispose();
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setLocation() { public void setLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
} }
@@ -6,36 +6,67 @@ import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
/**
* showMessae 类用于显示一个包含指定消息的模态对话框。
*/
public class showMessae extends JDialog { public class showMessae extends JDialog {
// 内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 用于显示消息的文本面板
private JTextPane textPane1; private JTextPane textPane1;
/**
* showMessae 构造函数,初始化对话框并设置相关属性。
* @param message 要显示的消息内容
* @param title 对话框的标题
*/
public showMessae(String message, String title) { public showMessae(String message, String title) {
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为确认按钮
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
// 为确认按钮添加事件监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 点击确认按钮时执行的操作
onOK(); onOK();
} }
}); });
// 设置文本面板的内容为传入的消息
this.textPane1.setText(message); this.textPane1.setText(message);
// 设置对话框的标题
this.setTitle(title); this.setTitle(title);
// 设置文本面板为不可编辑
textPane1.setEditable(false); textPane1.setEditable(false);
// 调整对话框大小以适应内容
pack(); pack();
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框位置
setCenterLocation(); setCenterLocation();
// 设置对话框可见
setVisible(true); setVisible(true);
} }
/**
* 设置对话框位置,使其居中显示在屏幕上。
*/
public void setCenterLocation() { public void setCenterLocation() {
// 设置对话框位置,使其居中显示在屏幕上
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
/**
* 点击确认按钮时执行的操作,关闭对话框。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码 // 关闭对话框
dispose(); dispose();
} }
} }
+33
View File
@@ -2,23 +2,56 @@ package com.msksbr.SQL;
import java.sql.*; import java.sql.*;
/**
* 数据库连接类,用于连接到MySQL数据库并执行SQL查询和更新操作。
*/
public class Connector { public class Connector {
// 数据库连接对象
private Connection conn; private Connection conn;
// SQL语句执行对象
private Statement stmt; private Statement stmt;
// 数据库连接URL
private String url = "jdbc:mysql://localhost:3306/book"; private String url = "jdbc:mysql://localhost:3306/book";
// 数据库用户名
private String user = "root"; private String user = "root";
/**
* 构造方法,初始化数据库连接。
*
* @throws ClassNotFoundException 如果找不到MySQL驱动类。
* @throws SQLException 如果数据库连接失败。
*/
public Connector() throws ClassNotFoundException, SQLException { public Connector() throws ClassNotFoundException, SQLException {
// 加载MySQL驱动类
Class.forName("com.mysql.cj.jdbc.Driver"); Class.forName("com.mysql.cj.jdbc.Driver");
// 获取数据库连接
conn = DriverManager.getConnection(url, user, new PassWord().passWord); conn = DriverManager.getConnection(url, user, new PassWord().passWord);
// 创建SQL语句执行对象
stmt = conn.createStatement(); stmt = conn.createStatement();
} }
/**
* 执行SQL查询操作。
*
* @param query 要执行的SQL查询语句。
* @return 查询结果集。
* @throws SQLException 如果查询执行失败。
*/
public ResultSet executeQuery(String query) throws SQLException { public ResultSet executeQuery(String query) throws SQLException {
// 执行SQL查询并返回结果集
return stmt.executeQuery(query); return stmt.executeQuery(query);
} }
/**
* 执行SQL更新操作。
*
* @param query 要执行的SQL更新语句。
* @return 受影响的行数。
* @throws SQLException 如果更新执行失败。
*/
public int executeUpdate(String query) throws SQLException { public int executeUpdate(String query) throws SQLException {
// 执行SQL更新并返回受影响的行数
return stmt.executeUpdate(query); return stmt.executeUpdate(query);
} }
} }
+34 -2
View File
@@ -6,36 +6,68 @@ import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
/**
* EasterEgg 类表示一个彩蛋对话框,用于显示特定的图像。
*/
public class EasterEgg extends JDialog { public class EasterEgg extends JDialog {
// 对话框的内容面板
private JPanel contentPane; private JPanel contentPane;
// 确认按钮
private JButton buttonOK; private JButton buttonOK;
// 用于显示图像的标签
private JLabel imageLable; private JLabel imageLable;
/**
* 构造函数,初始化 EasterEgg 对话框。
*/
public EasterEgg() { public EasterEgg() {
// 设置对话框的标题
setTitle("Easter Egg!"); setTitle("Easter Egg!");
// 设置对话框的内容面板
setContentPane(contentPane); setContentPane(contentPane);
// 设置对话框为模态对话框
setModal(true); setModal(true);
// 设置默认按钮为 buttonOK
getRootPane().setDefaultButton(buttonOK); getRootPane().setDefaultButton(buttonOK);
imageLable.setIcon(new ImageIcon("src/com/msksbr/images/BuzzBeans.png")); // 设置 imageLable 的图标为指定路径的图像
imageLable.setIcon(new ImageIcon(EasterEgg.class.getResource("/com/msksbr/images/BuzzBeans.png")));
// 为 buttonOK 添加动作监听器
buttonOK.addActionListener(new ActionListener() { buttonOK.addActionListener(new ActionListener() {
/**
* 当按钮被点击时调用的方法。
*
* @param e 动作事件
*/
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
// 调用 onOK 方法
onOK(); onOK();
} }
}); });
// 调整对话框的大小以适应其内容
pack(); pack();
// 设置对话框不可调整大小
setResizable(false); setResizable(false);
// 设置对话框的位置
setLocation(); setLocation();
// 设置对话框可见
setVisible(true); setVisible(true);
} }
/**
* 当用户点击确认按钮时调用的方法。
*/
private void onOK() { private void onOK() {
// 在此处添加您的代码 // 在此处添加您的代码
// 关闭对话框
dispose(); dispose();
} }
/**
* 设置对话框的位置为屏幕中心。
*/
public void setLocation() { public void setLocation() {
// 设置对话框的位置为屏幕中心
setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2); setLocation(new ScreenSize().width / 2 - getWidth() / 2, new ScreenSize().height / 2 - getHeight() / 2);
} }
} }
+58
View File
@@ -0,0 +1,58 @@
package test
import com.msksbr.SQL.Connector
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
class TestDao {
private var connector: Connector? = null
@BeforeEach
fun setUp() {
connector = Connector()
connector?.executeUpdate(
"CREATE TABLE test_table(\n" +
"\ttest_string CHAR(35),\n" +
"\ttest_int INT\n" +
");"
)
connector?.executeUpdate(
"INSERT INTO test_table\n" +
"VALUES (\n" +
" '1',1\n" +
" );"
)
}
@AfterEach
fun tearDown() {
connector?.executeUpdate("DROP TABLE test_table")
}
@Test
fun testQuery() {
val rs = connector!!.executeQuery("SELECT * FROM test_table")
assertNotNull(rs,"result was null")
assertTrue(rs.next(),"No results found")
assertEquals(rs.getString("test_string"), "1","test_string is not \"1\"")
assertEquals(rs.getInt("test_int"), 1,"test_int is not 1")
}
@Test
fun testUpdate(){
val rs = connector!!.executeUpdate("INSERT INTO test_table\n" +
"VALUES (\n" +
" '2',2\n" +
" );")
val rs_q=connector!!.executeQuery("SELECT * FROM test_table WHERE test_string = '2';")
assertNotNull(rs,"result was null")
assertNotNull(rs_q,"result_q was null")
assertTrue(rs_q.next(),"no results found")
assertEquals(rs_q.getString("test_string"), "2","test_string is not \"2\"")
assertEquals(rs_q.getInt("test_int"), 2,"test_int is not 1")
}
}
+36
View File
@@ -0,0 +1,36 @@
package test
import com.msksbr.MainFrm.MenuItemDiaog.Adder.BookAdder
import com.msksbr.MainFrm.MenuItemDiaog.SearchDIalog
import com.msksbr.SQL.Connector
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertNotNull
class TestService {
var connector: Connector? = null
@BeforeEach
fun init() {
connector = Connector()
}
@AfterEach
fun tearDown() {
}
@Test
fun testGetBookMaxID() {
val bookAdder = BookAdder()
val max_id_from_ui = bookAdder.getBookMaxID()
bookAdder.dispose()
val rs = connector?.executeQuery("SELECT MAX(book_id) FROM books;")
rs?.next()
val max_id_from_sql = rs?.getInt(1)
assertNotNull(max_id_from_ui, "Get null value from function")
assertEquals(max_id_from_ui, max_id_from_sql, "Not equals to the query from sql")
}
}
+37
View File
@@ -0,0 +1,37 @@
package test
import com.msksbr.MainFrm.MenuItemDiaog.Adder.BookAdder
import com.msksbr.SQL.Connector
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertNotNull
class testUI {
var connector: Connector? = null;
@BeforeEach
fun init() {
connector = Connector();
}
@AfterEach
fun tearDown() {
}
@Test
fun testUIBeCenter() {
val bookAdder = BookAdder();
val location = bookAdder.location
val size = bookAdder.size
val screenSize = java.awt.Toolkit.getDefaultToolkit().screenSize
val expectedX = (screenSize.width - size.width) / 2
val expectedY = (screenSize.height - size.height) / 2
assertNotNull(location,"location is null")
assertEquals(expectedX, location.x, "x-coordinate is not be center")
assertEquals(expectedY, location.y, "y-coordinate is not be center")
}
}
-8
View File
@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="AdditionalModuleElements">
<content url="file://$MODULE_DIR$" dumb="true">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
</component>
</module>