一、题目要求:
综合题:设计并实现一个通讯录管理系统包含以下功能:
a)用户注册、登录;
b) 通讯录信息的浏览、查找与增删改维护
其他说明:
要求采用JDBC连接数据库
界面可以选用Swing GUI技术或JSP技术
其中通讯录基本信息包括:
记录号、联系人、工作单位、电话号码、邮件、创建日期等(可根据需要扩展信息)
例如:
记录号 | 联系人 | 工作单位 | 电话号码 | 邮件 | 创建日期 |
r5 | 王老师 | 清华大学计算机工程学院 | 0592-61811 | wang@qin.edu.cn | 2021/12/20 |
r21 | 李经理 | 腾讯公司 | 86013388 | li@qq.com | 2022/6/25 |
二、程序设计:
1.实验目的
本实验致力于深入学习和应用Java编程语言以及相关技术,通过设计和实现一个通讯录管理系统,旨在达到以下具体目标:
- 学习和应用Java编程语言: 通过实际项目的开发,加深对Java编程语言的理解,并熟悉其面向对象的编程思想。实践中将涉及类的设计、继承、多态等概念,从而提高对Java语言特性的掌握。
- 掌握Java Swing桌面应用程序的设计与开发: 通过使用Java Swing框架,了解并实践图形用户界面(GUI)的设计与开发。在这个过程中,将学习如何创建窗体、面板、按钮、文本框等Swing组件,以及如何处理事件和实现用户交互。
- 理解并应用数据库设计和连接: 通过与MySQL数据库的交互,学会设计数据库表结构、进行增删改查等基本操作。使用JDBC连接数据库,实现系统与数据的有效交互,从而提升对数据库设计和连接技术的理解和应用。
- 培养软件设计和开发的能力:通过整个系统的设计与实现过程,培养学生的软件设计和开发能力。强调模块化设计,将系统拆分为不同的模块,使得代码结构清晰,易于维护和扩展。
- 包括模块化设计、代码解耦、异常处理等方面的技能: 在实际编码中,注重采用模块化设计原则,将系统划分为不同的功能模块,实现各模块之间的解耦。另外,要实现合理的异常处理,确保系统在面对不可避免的错误时能够很好地处理。
2. 系统简介
通讯录管理系统是一个便捷的工具,用于管理个人和工作联系人的信息。系统通过图形用户界面提供直观的操作方式,用户可以登录、注册,并对通讯录进行增删改查的操作。数据存储在MySQL数据库中,通过JDBC连接实现对数据库的高效操作。
系统主要包含三个界面:
- 登录界面 (LoginFrame): 用户通过输入用户名和密码登录系统。验证成功后,用户可以进入通讯录界面;否则,系统会提示登录失败信息。
- 通讯录界面 (ContactsFrame): 用户可以在这个界面进行通讯录的管理。可以添加、删除、更新联系人信息,也可以通过搜索功能查找特定联系人。界面使用Java Swing框架,表格显示联系人信息,用户友好的界面设计提高了用户体验。
- 注册界面 (RegistrationFrame): 新用户可以在这里进行注册。用户输入用户名、密码和确认密码后,系统验证信息并将用户存储到数据库中。注册成功后,用户可以返回登录界面进行登录。
系统通过合理的模块化设计,实现了界面和数据操作的解耦,提高了代码的可维护性。整体设计符合面向对象的原则,使得系统扩展和改进更加容易。
3. 系统设计
3.1 UML类图:
图3-1 UML类图
3.2 流程图:
图3-1 登录注册选择流程图
图3-2 登录流程图
图3-3 注册流程图
图3-4 主功能流程图
3.3 主要操作流程
- 用户打开程序,进入登录界面 (LoginFrame)。
- 用户输入用户名和密码,点击登录按钮。
- 程序验证用户信息,如果验证通过,进入通讯录界面 (ContactsFrame);否则,提示错
误信息。
- 在通讯录界面,用户可以进行添加、删除、更新和搜索联系人的操作。
- 用户点击注册按钮,进入注册界面 (RegistrationFrame)。
- 在注册界面,用户输入用户名、密码和确认密码,点击注册按钮。
- 程序验证信息并将用户信息存储到数据库中,注册成功后返回登录界面。
- 用户可以在登录界面输入新注册的账号信息进行登录。
4. 系统实现
系统的实现主要涉及用户登录和注册、通讯录的增删改查操作以及数据库连接和操作。以下是这些功能的代码实现和相应的文字分析。
———————————————————————————————————————
4.1 用户登录和注册
用户登录 (LoginFrame):
// 登录按钮点击事件处理
private void onLoginButtonClick() {
String username = usernameField.getText();
String password = String.valueOf(passwordField.getPassword());
// 调用UserService进行用户验证
boolean loginSuccessful = UserService.login(username, password);
if (loginSuccessful) {
// 登录成功,打开通讯录界面
ContactsFrame = new ContactsFrame();
contactsFrame.setVisible(true);
dispose(); // 关闭当前登录窗口
} else {
// 登录失败,显示错误提示
JOptionPane.showMessageDialog(this, "用户名或密码错误!", "登录失败", JOptionPane.ERROR_MESSAGE);
}
}
文字分析:
当用户点击登录按钮时,获取输入的用户名和密码。
通过调用UserService的login方法进行用户验证。
如果验证成功,打开通讯录界面 (ContactsFrame),关闭当前登录窗口;否则,显示错误提示。
用户注册 (RegistrationFrame)
// 注册按钮点击事件处理
private void onRegisterButtonClick() {
String username = usernameField.getText();
String password = String.valueOf(passwordField.getPassword());
String confirmPassword = String.valueOf(confirmPasswordField.getPassword());
// 调用UserService进行用户注册
boolean registrationSuccessful = UserService.register(username, password, confirmPassword);
if (registrationSuccessful) {
// 注册成功,返回登录界面
LoginFrame i = new LoginFrame();
loginFrame.setVisible(true);
dispose(); // 关闭当前注册窗口
} else {
// 注册失败,显示错误提示
JOptionPane.showMessageDialog(this, "注册失败,请检查输入信息!", "注册失败", JOptionPane.ERROR_MESSAGE);
}
}
文字分析:
当用户点击注册按钮时,获取输入的用户名、密码和确认密码。
通过调用UserService的register方法进行用户注册。
如果注册成功,返回登录界面 (LoginFrame),关闭当前注册窗口;否则,显示错误提示。
———————————————————————————————————————
4.2 通讯录的增删改查操作
添加联系人 (ContactsFrame)
private void addContact() {
String name = JOptionPane.showInputDialog("请输入联系人姓名:");
String workplace = JOptionPane.showInputDialog("请输入联系人工作地点:");
String phone = JOptionPane.showInputDialog("请输入联系人电话:");
String email = JOptionPane.showInputDialog("请输入联系人电子邮件:");
if (name != null && !name.trim().isEmpty()) {
// 获取数据库中当前最大ID值
int maxId = DBUtil.getMaxId("contacts");
// 插入新联系人,ID为最大ID+1
boolean insertSuccessful = ContactService.addContact(maxId + 1, name, workplace, phone, email);
if (insertSuccessful) {
JOptionPane.showMessageDialog(this, "联系人添加成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
refreshTable(); // 刷新表格显示
} else {
JOptionPane.showMessageDialog(this, "联系人添加失败,请重试。", "失败", JOptionPane.ERROR_MESSAGE);
}
}
}
文字分析:
用户点击添加联系人按钮时,弹出输入对话框获取联系人信息。
通过调用DBUtil的getMaxId方法获取数据库中当前最大ID值。
调用ContactService的addContact方法插入新联系人,其中新联系人的ID为最大ID值+1。
根据插入结果显示相应的提示信息,成功则刷新表格显示。
删除联系人 (ContactsFrame)
private void deleteContact() {
int selectedRow = contactsTable.getSelectedRow();
if (selectedRow != -1) {
int contactId = (int) contactsTable.getValueAt(selectedRow, 0);
// 调用ContactService进行联系人删除
boolean deleteSuccessful = ContactService.deleteContact(contactId);
if (deleteSuccessful) {
JOptionPane.showMessageDialog(this, "联系人删除成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
refreshTable(); // 刷新表格显示
} else {
JOptionPane.showMessageDialog(this, "联系人删除失败,请重试。", "失败", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(this, "请选择要删除的联系人。", "提示", JOptionPane.WARNING_MESSAGE);
}
}
文字分析:
用户在表格中选择要删除的联系人行,点击删除联系人按钮。
获取选中联系人的ID。
调用ContactService的deleteContact方法进行联系人删除。
根据删除结果显示相应的提示信息,成功则刷新表格显示。
更新联系人 (ContactsFrame)
private void updateContact() {
int selectedRow = contactsTable.getSelectedRow();
if (selectedRow != -1) {
int contactId = (int) contactsTable.getValueAt(selectedRow, 0);
String name = JOptionPane.showInputDialog("请输入联系人姓名:");
String workplace = JOptionPane.showInputDialog("请输入联系人工作地点:");
String phone = JOptionPane.showInputDialog("请输入联系人电话:");
String email = JOptionPane.showInputDialog("请输入联系人电子邮件:");
// 调用ContactService进行联系人更新
boolean updateSuccessful = ContactService.updateContact(contactId, name, workplace, phone, email);
if (updateSuccessful) {
JOptionPane.showMessageDialog(this, "联系人更新成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
refreshTable(); // 刷新表格显示
} else {
JOptionPane.showMessageDialog(this, "联系人更新失败,请重试。", "失败", JOptionPane.ERROR_MESSAGE);
}
} else {
JOptionPane.showMessageDialog(this, "请选择要更新的联系人。", "提示", JOptionPane.WARNING_MESSAGE);
}
}
文字分析:
用户在表格中选择要更新的联系人行,点击更新联系人按钮。
获取选中联系人的ID。
弹出输入对话框获取更新后的联系人信息。
调用ContactService的updateContact方法进行联系人更新。
根据更新结果显示相应的提示信息,成功则刷新表格显示。
搜索联系人 (ContactsFrame)
private void searchContacts(String keyword) {
// 调用ContactService进行模糊搜索
ResultSet resultSet = ContactService.searchContacts(keyword);
// 更新表格显示搜索结果
updateTable(resultSet);
}
文字分析:
用户在搜索文本框输入关键字,点击搜索按钮。
调用ContactService的searchContacts方法进行模糊搜索。
更新表格显示搜索结果。
———————————————————————————————————————
4.3 数据库连接和操作
DBUtil类
public class DBUtil {
// 获取数据库连接
public static Connection getConnection() {
// 连接数据库的代码,此处省略
}
// 关闭数据库资源
public static void close(Connection connection, Statement statement, ResultSet resultSet) {
// 关闭数据库资源的代码,此处省略
}
// 获取数据表中当前最大ID值
public static int getMaxId(String tableName) {
int maxId = 0;
try (Connection connection = getConnection();
Statement statement = connection.createStatement()) {
ResultSet resultSet = statement.executeQuery("SELECT MAX(id) FROM " + tableName);
if (resultSet.next()) {
maxId = resultSet.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return maxId;
}
}
文字分析:
DBUtil类提供了获取数据库连接、关闭数据库资源以及获取数据表中当前最大ID值的方法。
getConnection方法用于获取数据库连接。
close方法用于关闭数据库连接、Statement和ResultSet。
getMaxId方法用于获取数据表中当前最大ID值。
ContactService类
public class ContactService {
// 添加联系人
public static boolean addContact(int id, String name, String workplace, String phone, String email) {
// 调用DBUtil进行数据库操作,此处省略
}
// 删除联系人
public static boolean deleteContact(int contactId) {
// 调用DBUtil进行数据库操作,此处省略
}
// 更新联系人
public static boolean updateContact(int contactId, String name, String workplace, String phone, String email) {
// 调用DBUtil进行数据库操作,此处省略
}
// 模糊搜索联系人
public static ResultSet searchContacts(String keyword) {
// 调用DBUtil进行数据库操作,此处省略
}
}
文字分析:
ContactService类提供了添加、删除、更新联系人以及模糊搜索联系人的方法。
每个方法内部通过调用DBUtil进行相应的数据库操作。
4.5 测试效果图
登录界面:
图4-1 用户登录界面
注册界面:
图4-2 用户注册界面
通讯录界面:
图4-3 通讯录界面
联系人添加对话框:
图4-4 添加联系人
联系人删除提示:
图4-5 删除联系人操作
联系人更新对话框:
图4-6 联系人更新操作
联系人搜索:
图4-7 联系人查询搜索操作
5. 总结
通过这次实验,我深入学习了Java编程语言和相关技术的应用。设计和实现通讯录管理系统的过程中,我不仅提高了对Java语言的熟练度,还学到了如何设计和实现一个桌面应用程序。通过数据库的操作,我对数据存储和检索有了更深入的理解。在软件设计和开发的过程中,我注重了模块化设计和代码解耦,使得系统的可维护性得到提高。这次实验让我收获很多。
三、参考文献
[1]耿祥义.Java面向对象程序设计[M].北京: 清华大学出版社,2010.
[2]JAVA界面编程之弹窗、弹框JOptionPane的showMessageDialog方法详解
[3]java dispose()方法: Java dispose()方法详解
[4]【Java图形化界面---JOptionPane的使用】
[8] addrow方法
[10]mysql字段创建时间和更新时间
[12]java+Swing创建表格
[13]Java——日期时间(SimpleDateFormat)