基于Java GUI的通讯录系统
注意:本文章仅供参考,有想获取项目源代码和实验报告的小伙伴:赶快前往 通讯录管理程序
复制本链接或者点击以上超链接一键下载 https://download.csdn.net/download/qq_45692367/19746137
项目源代码及配套的实验报告等你来拿
1、需求分析
在设计一个完整的系统中,我从系统的管理员登录界面开始做,另外依据相关要求,对系统增加了数据库支持(MySQL做的数据库),还有对数据库里的数据进行增加、删除、显示所有记录、查询记录、修改记录、导出备份数据库文件、导入数据库文件。为了保证数据库的安全,在系统中设立了管理员权限,即只有被允许的用户才可以进入该系统。此外,还增设了用户注册系统,因为考虑到个人用户的影响,所以新增了通讯录绑定功能,即每个人拥有不同的通讯录。
🔐📊⚙️📁🔍
作为一名通讯录使用用户,毋庸置疑的是我们不愿意与其他人共享一个通讯录,所以我增设了注册页面及通讯录绑定的功能,实现一账户一通讯录。此外,在登录的过程中,我们作为用户肯定希望的到良好的体验,图形用户界面是一个非常友好的东西,所以我们通篇采用了图形界面,依次提高用户的体验。此外,因为本系统可能要录入大量的联系人信息,所以采用了数据库(MySQL)的形式保存联系人信息。
📱📇🔍📝🔢
作为用户最基础的增删查改自然要实现了添加联系人的功能。其中联系人的信息包括姓名,性别,手机号,邮箱,地址,QQ号等;信息添加完成之后,我们希望去浏览此时通讯录中的全部信息,故增加了浏览功能,以表格的形式呈现,我们可以很容易的查看到数据库中的所有信息;查询功能也是比较需要的功能,通过查询功能,我们可以分别按照姓名,手机号查询信息,多种多样;填了信息之后,其中有一项可能输入错误,此时需要更该的话,我们提供了两种修改方式,第一种是根据手机号修改,第二种是根据姓名修改,又因可能避免不了同名的情况,故我们很人性化的提供表格,显示同名联系人的所有的信息,此时,可选择正确的联系人进行修改;删除功能,与修改功能一样,可根据姓名手机号删除,但在删除过程中,亦可能存在同名的情况,故本系统采用表格显示所有同名联系人的信息,选择对应的删除;
👥📈🔍✏️❌
为了防止数据库内容的丢失,我们设置了导出模块,可以一键导出联系人信息,保存联系人信息。为了方便用户使用,同样设置了一键导入功能。
📤📥
2、概要设计
2.1功能模块结构图
根据需求分析,本系统的功能模块图如下所示:
📊 功能模块图
- 登录功能:用户可输入账号密码登录;
- 注册功能:用户可输入账号密码及验证码进行注册;
- 添加联系人:用户可根据需要输入姓名,性别,手机号,邮箱,地址,QQ号添加;
- 修改联系人:用户可根据实际情况修改所有项;
- 删除联系人:用户可根据手机号,姓名自由删除联系人;
- 搜索联系人:用户可根据姓名,手机号搜索联系人;
- 浏览联系人:用户可查看所有联系人;
- 导入联系人:用户可将csv文件中的所有内容写入数据库;
- 导出联系人:用户可将系统中联系人一键导出;
2.2业务流程图
- 登录系统流程图
用户首先输入账号密码,账号是11位手机号,对数据库中数据进行检索,若未找到对应的用户,则提示尚未注册,选择是否注册,否则进行账号密码匹配判断,不匹配,则提示密码错误。
![](https://img-blog.csdnimg.cn/20210619164929388.png)
- 注册流程图
用户输入账号,账号为11位数字,若输入不成功,则提示手机号必须是11位数字并清空文本框。密码需要输入两次,若输入不一致,则提示输入不一致,并清空。验证码随机生成且刷新,用户需输入对应的验证码,忽略大小写,若输入不成功,则提示输入错误,并刷新验证码。
![](https://img-blog.csdnimg.cn/20210619170104499.png)
- 添加联系人信息流程图
用户输入姓名,选择性别,输入手机号,选择地址,输入详细地址,输入邮箱,输入QQ号,进行合法性判断,添加联系人。
![](https://img-blog.csdnimg.cn/20210619170444336.png)
- 修改学生信息流程图
首先输入联系人姓名,查找对应的联系人,输出同名的所有联系人,选择该联系人的电话,跳转到该联系人页面,显示该联系人的全部信息,在该联系人信息基础上进行修改,修改完毕则保存到数据库中。
![](https://img-blog.csdnimg.cn/20210619170618188.png)
- 删除学生信息流程图
首先选择按姓名删除或者按手机号删除,如果选择按姓名删除,则存在同名的情况。
- 搜索学生信息流程图
3 运行环境
- 硬件环境:PC机 内存 8G
- 软件环境:操作系统:windows10
4 开发工具和编程语言
- 开发环境:IDEA, MySQL;
- 编程语言:Java语言
5 详细设计
5.1 数据库设计
- User表,用来存储用户的账号密码。账号即为手机号,保存为字符串类型,且数据长度必须为11位数字。
![](https://img-blog.csdnimg.cn/20210619171559391.png)
- Province表,用来存储全国各大省份。其中id标注了该所对应的编号,用来联系城市。
![](https://img-blog.csdnimg.cn/20210619171747549.png)
-
Country表,用来存储各个省的城市。该表的id用来联系省份id,标注率属于的省份,areaid用来联系下辖县。
- County表,用来存储各个县或区。Id用来联系各个市。
![](https://img-blog.csdnimg.cn/20210619171950745.png)
- 用户名+_user表,由系统动态的创建,保存通讯录中的信息。
如下图所示为13253589805的用户的通讯录,其中手机号必须是11位数字,邮箱必须满足一定的格式,地址可在添加时自行选择省份,城市,县,以及详细地址,对于QQ也必须满足一点的格式,例如QQ是6-11位的数字。
![](https://img-blog.csdnimg.cn/20210619172128467.png)
![](https://img-blog.csdnimg.cn/20210619172135417.png)
5.2 类的设计
-
Test类,其中包含main方法,构造方法Test(),main方法中声明Login对象,调用launch()方法,显示出登录窗口。
import java.sql.SQLException;
/**
* 通讯录系统
*
* @author 陌年
* @author email:201628142
* @version 1.0
*/
public class Test {
public static void main(String[] args) throws SQLException {
Login login = new Login();
login.launch();
}
}
- Register类,其中有构造方法Register(),方法actionPerformed(ActionEvent)、aunch()、maches(String)、userExit(String)、verificationCode()、write(String,String)。
下面是类的成员变量:
功能描述:
register():用来初始化各个成员变量。
方法launch():定义了窗口的布局样式。
方法actionPerformed(ActionEvent):实现了各个按钮的监听。
方法verificationCode():用来生成验证码。
方法write(String,String):用来将注册成功的账号密码写入数据库。
方法userExit(String):判断用户是否已经存在。
![](https://img-blog.csdnimg.cn/20210619172848592.png)
- MySql类,其中有构造方法MySql(),成员方法close()、onnect()、getCon、setCon(Connection);
类属性有以下几个方面:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 数据库连接
*/
public class MySql {
//类名
static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
//连接到本机
static final String DB_URL = "jdbc:mysql://localhost:3306/addressbook?useUnicode=true&characterEncoding=utf-8";
// 数据库的用户名与密码
static final String USER = "root";
static final String PASS = "wang186017";
private Connection con;
public Connection getCon() {
return con;
}
public void setCon(Connection con) {
this.con = con;
}
/**
* 连接数据库
*/
public void connect() {
if (con != null) {
return;
} else {
try {
Class.forName(JDBC_DRIVER);
setCon(DriverManager.getConnection(DB_URL, USER, PASS));
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭数据库连接
*/
public void close() {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
} else {
return;
}
}
}
- 功能描述:
connect():用来连接数据库;
close():用来关闭数据库;
getCon():用来返回Connect属性;
setCon():用来设置Connection属性;
![](https://img-blog.csdnimg.cn/20210619173334880.png)
- AddressBook类,其中有构造方法AddressBook(String),普通方法createTable()、getTableName()、setTableName(String)。
类的属性如下所示:
import javax.swing.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLOutput;
import java.sql.Statement;
/**
* 通讯录,每个用户代表唯一的通讯录,如不存在则新建,本次为新建通讯簿
*/
public class AddressBook {
private MySql m = new MySql();
private String tableName = null;
public String getTableName() {
return tableName;
}
public void setTableName(String tableName) {
this.tableName = tableName + "_user";
}
AddressBook(String username) {
setTableName(username);
}
public void createTable() {
m.connect();
String sql = "create table " + getTableName() + " (name varchar(250),sex varchar(250),phone varchar(250),email varchar(250),address varchar(250)," +
"QQ varchar(250))";
Statement statement = null;
try {
statement = m.getCon().createStatement();
statement.executeUpdate(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
m.close();
}
}
}
- 功能描述:
构造方法AddressBook(String):用来初始化变量;
方法createTable():在数据库中建立对应的表,存储绑定个人数据库;
方法getTableName():返回表名;
方法setTableName():设置表名;
![](https://img-blog.csdnimg.cn/20210619173625681.png)
- Login类,该类有构造方法Login(),普通方法actionPerformed(ActionEvent)、checkLogin(String,String)、checkTableIsExist(String)、launch()、maches(String);
该类有如下属性:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.regex.Pattern;
public class Login extends JFrame implements ActionListener {
private JLabel jl1, jl2;
private JTextField jtf;
private JPasswordField jpf;
private JButton jb1, jb2;
private JPanel jp1, jp2, jp3;
private MySql m;
Login() {
jl1 = new JLabel("手机号:");
jl2 = new JLabel("密 码:");
jtf = new JTextField(20);
jpf = new JPasswordField(20);
jb1 = new JButton("登录");
jb2 = new JButton("注册");
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
m = new MySql();
}
public void launch() {
jb1.addActionListener(this);
jb2.addActionListener(this);
jp1.add(jl1);
jp1.add(jtf);
jp2.add(jl2);
jp2.add(jpf);
jp3.add(jb1);
jp3.add(jb2);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.CENTER);
add(jp3, BorderLayout.SOUTH);
setTitle("通讯录");
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int result = JOptionPane.showConfirmDialog(null, "确认退出?", "确认", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
});
setSize(400, 150);
setLocationRelativeTo(null);
setResizable(false);
}
public boolean checkTableIsExist(String username) {
m.connect();
String sql = "SHOW TABLES";
ResultSet rs = null;
Statement statement = null;
try {
statement = m.getCon().createStatement();
rs = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
while (rs.next()) {
if (rs.getString(1).equals(username)) {
return true;
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
statement.close();
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return false;
}
/**
* 检查登录状态
*
* @param username
*/
public boolean checkLogin(String username, String password) {
m.connect();
int flag = 0;
Statement statement = null;
ResultSet resultSet = null;
String sql = "select * from user";
try {
statement = m.getCon().createStatement();
resultSet = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
while (true) {
try {
if (!resultSet.next()) break;
if (resultSet.getString(1).equals(username)) {
flag = 1;
if (resultSet.getString(2).equals(password)) {
flag = 2;
return true;
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (flag == 0) {
int result = JOptionPane.showConfirmDialog(null, "该用户不存在!是否注册", "确认消息", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
dispose();
new Register().launch();
} else if (result == JOptionPane.CANCEL_OPTION) {
dispose();
new Login().launch();
}
}
if (flag == 1) {
JOptionPane.showMessageDialog(null, "密码错误\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
jpf.setText("");
}
return false;
}
public boolean maches(String str) {
if (Pattern.matches("\\d+", str) && str.length() == 11)
return true;
return false;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("登录")) {
if (jtf.getText().isEmpty() && jpf.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "用户名或密码不能为空!", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
jpf.setText("");
} else if (!maches(jtf.getText())) {
JOptionPane.showMessageDialog(null, "手机号必须是11位数字!", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
jpf.setText("");
} else if (checkLogin(jtf.getText(), jpf.getText())) {
JOptionPane.showMessageDialog(null, "登录成功!", "提示消息", JOptionPane.WARNING_MESSAGE);
if (!checkTableIsExist(jtf.getText() + "_user")) {
int result = JOptionPane.showConfirmDialog(null, "该用户尚未绑定通讯录\n是否绑定", "确认消息", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
new AddressBook(jtf.getText()).createTable();
JOptionPane.showMessageDialog(null, "创建成功!\n欢迎使用本通讯录", "提示消息", JOptionPane.WARNING_MESSAGE);
dispose();
new Menu(jtf.getText()).launch();
} else if (result == JOptionPane.CANCEL_OPTION) {
JOptionPane.showMessageDialog(null, "友情提示!不绑定通讯录\n无法进行任何操作哦!!!", "提示消息", JOptionPane.WARNING_MESSAGE);
dispose();
new Login().launch();
}
} else {
dispose();
new Menu(jtf.getText()).launch();
}
}
}
if (e.getActionCommand().equals("注册")) {
dispose();
new Register().launch();
}
}
}
- 功能描述:
Login():构造方法,用来初始化变量;
Launch():进行登录窗口的布局规划。
actionPerformed(ActionEvent):实现各个按钮的监听;
checkLogin(String,String):用来返回登录状态;
checkTabhleIsExist(String):用来检查通讯录是否存在;
maches(String):检测手机号的合法性;
![](https://img-blog.csdnimg.cn/20210619173834140.png)
- Menu类,该类有构造方法Menu(String),普通方法actionPerformed(AcfionEvent)、getTableName()、setTableName(String)、launch();
该类的属性如下所示:
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 主菜单功能类
*/
public class Menu extends JFrame implements ActionListener {
private JButton jb1, jb2, jb3, jb4, jb5, jb6, jb7, jb8;
public String getTabName() {
return tabName;
}
public void setTabName(String tabName) {
this.tabName = tabName;
}
private String tabName = null;
Menu(String name) {
jb1 = new JButton("添加联系人");
jb2 = new JButton("删除联系人");
jb3 = new JButton("修改联系人");
jb4 = new JButton("查看联系人");
jb5 = new JButton("搜索联系人");
jb6 = new JButton("导入联系人");
jb7 = new JButton("导出联系人");
jb8 = new JButton("返回上一层");
setTabName(name);
}
public void launch() {
setLayout(null);
add(jb1);
jb1.setContentAreaFilled(false);
add(jb2);
jb1.setContentAreaFilled(false);
jb2.setContentAreaFilled(false);
jb3.setContentAreaFilled(false);
jb4.setContentAreaFilled(false);
jb5.setContentAreaFilled(false);
jb6.setContentAreaFilled(false);
jb7.setContentAreaFilled(false);
jb8.setContentAreaFilled(false);
add(jb3);
add(jb4);
add(jb5);
add(jb6);
add(jb7);
add(jb8);
jb1.addActionListener(this);
jb2.addActionListener(this);
jb3.addActionListener(this);
jb4.addActionListener(this);
jb5.addActionListener(this);
jb6.addActionListener(this);
jb7.addActionListener(this);
jb8.addActionListener(this);
jb1.setBounds(20, 20, 150, 60);
jb2.setBounds(220, 20, 150, 60);
jb3.setBounds(20, 100, 150, 60);
jb4.setBounds(220, 100, 150, 60);
jb5.setBounds(20, 180, 150, 60);
jb6.setBounds(220, 180, 150, 60);
jb7.setBounds(20, 260, 150, 60);
jb8.setBounds(220, 260, 150, 60);
setTitle("通讯录管理程序");
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int result = JOptionPane.showConfirmDialog(null, "确认退出?", "确认", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
});
setSize(400, 375);
setResizable(false);
setLocationRelativeTo(null);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("添加联系人")) {
dispose();
try {
new AddContact(getTabName()).launch();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} else if (e.getActionCommand().equals("删除联系人")) {
dispose();
new Delete(getTabName()).launch();
} else if (e.getActionCommand().equals("修改联系人")) {
dispose();
new Update(getTabName()).launch();
} else if (e.getActionCommand().equals("查看联系人")) {
dispose();
new ShowMessage(getTabName()).launch();
} else if (e.getActionCommand().equals("搜索联系人")) {
dispose();
new Find(getTabName()).launch();
} else if (e.getActionCommand().equals("导入联系人")) {
dispose();
new Input(getTabName()).launch();
} else if (e.getActionCommand().equals("导出联系人")) {
dispose();
new Export(getTabName()).launch();
} else if (e.getActionCommand().equals("返回上一层")) {
dispose();
new Login().launch();
}
}
}
- 功能描述:
Menu(String):构造方法,用来初始化变量;
Launch();主窗口页面;
actionPerformed(ActionEvent):实现各个按钮的监听;
getTableName():返回表名;
setTableName(String):设置表名;
![](https://img-blog.csdnimg.cn/20210619174142713.png)
- AddContact类,该类有AddContact(String)构造方法,普通方法actionPerformed(ActionEvent)、getTableName()、setTableName(String)、launch()、machesEmail(String)、machesPhone(String)、machesQQ(String)、readCounTry(String)、readProvince(String)、userExit(String);
该类有如下属性:
/**
* 添加联系人
*/
class AddContact extends JFrame implements ActionListener {
private JPanel jp1, jp2, jp3, jp4, jp5, jp6, jp7, jp8;
private JLabel jl1, jl2, jl3, jl4, jl5, jl6;
private JTextField jtf1, jtf2, jtf3, jtf4, jtf5;
private JRadioButton jrb1, jrb2;
private JButton jb1, jb2;
private ButtonGroup buttonGroup;
private String table_name;
private JComboBox c1, c2, c3;
public String getTable_name() {
return table_name;
}
public void setTable_name(String table_name) {
this.table_name = table_name;
}
AddContact(String table_name) throws SQLException {
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
jp5 = new JPanel();
jp6 = new JPanel();
jp7 = new JPanel();
jp8 = new JPanel();
c1 = new JComboBox();
c2 = new JComboBox();
c3 = new JComboBox();
jl1 = new JLabel("姓名:");
jl2 = new JLabel("性别:");
jl3 = new JLabel("手机号:");
jl4 = new JLabel("邮箱:");
jl5 = new JLabel("详细地址:");
jl6 = new JLabel("QQ:");
jtf1 = new JTextField(15);
jtf2 = new JTextField(15);
jtf3 = new JTextField(15);
jtf4 = new JTextField(15);
jtf5 = new JTextField(15);
jrb1 = new JRadioButton("男", true);
jrb2 = new JRadioButton("女");
buttonGroup = new ButtonGroup();
jb1 = new JButton("添加");
jb1.addActionListener(this);
jb2 = new JButton("返回");
jb2.addActionListener(this);
setTable_name(table_name);
}
public static ArrayList<String> readCountry(String id) throws SQLException {
ArrayList<String> arrayList = new ArrayList<>();
MySql m = new MySql();
m.connect();
String sql = "select country from country where id = " + id;
Statement statement = m.getCon().createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
arrayList.add(resultSet.getString(1));
}
return arrayList;
}
public static ArrayList<String> readCounty(String id) throws SQLException {
ArrayList<String> arrayList = new ArrayList<>();
MySql m = new MySql();
m.connect();
String sql = "select county from county where id = " + id;
Statement statement = m.getCon().createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
arrayList.add(resultSet.getString(1));
}
return arrayList;
}
public static ArrayList<String> readProvince() throws SQLException {
ArrayList<String> arrayList = new ArrayList<>();
MySql m = new MySql();
m.connect();
String sql = "select province from province";
Statement statement = m.getCon().createStatement();
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
arrayList.add(resultSet.getString(1));
}
return arrayList;
}
public void launch() throws SQLException {
c1.addItem("--请选择省--");
for (String a : readProvince()) {
c1.addItem(a);
}
c2.addItem("--请选择市--");
c3.addItem("--请选择区--");
c1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == c1) {
if (c1.getSelectedItem().equals("--请选择省--")) {
JOptionPane.showMessageDialog(null, "请选择省", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (c1.getSelectedItem().equals("河南省")) {
try {
for (String a : readCountry("1")) {
c2.addItem(a);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} else if (c1.getSelectedItem().equals("云南省")) {
try {
for (String a : readCountry("2")) {
c2.addItem(a);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
});
c2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == c2) {
if (c2.getSelectedItem().equals("--请选择区--")) {
JOptionPane.showMessageDialog(null, "请选择区", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (c2.getSelectedItem().equals("郑州市")) {
try {
for (String a : readCounty("1")) {
c3.addItem(a);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
} else if (c2.getSelectedItem().equals("开封市")) {
try {
for (String a : readCounty("2")) {
c3.addItem(a);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
});
buttonGroup.add(jrb1);
buttonGroup.add(jrb2);
jp1.add(jl1);
jp1.add(jtf1);
jp2.add(jl2);
jp2.add(jrb1);
jp2.add(jrb2);
jp3.add(jl3);
jp3.add(jtf2);
jp4.add(jl4);
jp4.add(jtf3);
jp5.add(jl5);
jp5.add(jtf4);
jp6.add(jl6);
jp6.add(jtf5);
jp7.add(jb1);
jp7.add(jb2);
jp8.add(c1);
jp8.add(c2);
jp8.add(c3);
add(jp1);
add(jp2);
add(jp3);
add(jp4);
add(jp8);
add(jp5);
add(jp6);
add(jp7);
setLayout(new GridLayout(8, 1));
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int result = JOptionPane.showConfirmDialog(null, "确认退出?", "确认", JOptionPane.OK_CANCEL_OPTION);
if (result == JOptionPane.OK_OPTION) {
System.exit(0);
} else if (result == JOptionPane.CANCEL_OPTION) {
dispose();
try {
new AddContact(getTable_name()).launch();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
});
setTitle("添加联系人");
setResizable(false);
setSize(500, 500);
setLocationRelativeTo(null);
}
public static boolean machesPhone(String str) {
if (Pattern.matches("\\d+", str) && str.length() == 11)
return true;
return false;
}
public boolean userExit() {
MySql mySql = new MySql();
mySql.connect();
String sql = "select phone from " + getTable_name() + "_user";
Statement statement = null;
ResultSet resultSet = null;
try {
statement = mySql.getCon().createStatement();
resultSet = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
while (true) {
try {
if (!resultSet.next()) break;
if (resultSet.getString(1).equals(jtf2.getText())) {
return false;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return true;
}
public static boolean machesEmail(String email) {
Pattern p = Pattern.compile("[1-9]{1}[0-9]+@[a-z]{2,3}\\." + "com");
Matcher m = p.matcher(email);
if (m.matches()) {
return true;
}
return false;
}
public static boolean machesQQ(String qq) {
Pattern p = Pattern.compile("[1-9]\\d{5}|[1-9]\\d{6}|[1-9]\\d{7}|[1-9]\\d{8}|[1-9]\\d{9}|[1-9]\\d{10}");
Matcher m = p.matcher(qq);
if (m.matches()) {
return true;
}
return false;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("添加")) {
if (jtf1.getText().isEmpty() || jtf2.getText().isEmpty() || jtf3.getText().isEmpty() || jtf4.getText().isEmpty() || jtf5.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "信息不能为空!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (!machesPhone(jtf2.getText())) {
JOptionPane.showMessageDialog(null, "手机号必须是11位数字!", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf2.setText("");
} else if (!userExit()) {
JOptionPane.showMessageDialog(null, "手机号已存在!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (!machesEmail(jtf3.getText())) {
JOptionPane.showMessageDialog(null, "邮箱格式错误!", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf3.setText("");
} else if (!machesQQ(jtf5.getText())) {
JOptionPane.showMessageDialog(null, "QQ是6到11位的数字哦!", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf5.setText("");
} else {
int result = JOptionPane.showConfirmDialog(null, "确认添加?", "确认", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
String sex = "男";
if (jrb1.isSelected()) {
sex = "男";
} else if (jrb2.isSelected()) {
sex = "女";
}
MySql mySql = new MySql();
mySql.connect();
String sql = "insert into " + getTable_name() + "_user values (?,?,?,?,?,?)";
try {
PreparedStatement preparedStatement = mySql.getCon().prepareStatement(sql);
preparedStatement.setString(1, jtf1.getText());
preparedStatement.setString(2, sex);
preparedStatement.setString(3, jtf2.getText());
preparedStatement.setString(4, jtf3.getText());
preparedStatement.setString(5, "" + c1.getSelectedItem() + c2.getSelectedItem() + c3.getSelectedItem() + jtf4.getText());
preparedStatement.setString(6, jtf5.getText());
preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
JOptionPane.showMessageDialog(null, "添加成功", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf1.setText("");
jtf2.setText("");
jtf3.setText("");
jtf4.setText("");
jtf5.setText("");
dispose();
try {
new AddContact(getTable_name()).launch();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
} else if (e.getActionCommand().equals("返回")) {
dispose();
new Menu(getTable_name()).launch();
}
}
}
- 功能描述:
AddContact(String):用来初始化变量;
actionPerformed(ActionEvent):实现监听;
getTableName():返回表名;
setTableName(String):设置表名;
launch():添加联系人窗口;
machesEmail (String):检查邮箱格式;
machesPhone(String):检查手机号格式;
machesQQ(String):检查QQ格式;
readCountry(String):读取城市名;
readCounty(String):读取县名;
readProvince(String):读取省名;
![](https://img-blog.csdnimg.cn/20210619174410552.png)
- DeleteByName类,其中有构造函数DeleteByName(String),普通方法actionPerformed(ActionEvent)、deleteByName()、deleteInformation()、getUsername、launch()、setUsername(String)、userExit();
该类具有以下属性:
/**
* 按姓名删除
*/
class DeleteByName extends JFrame implements ActionListener {
private JLabel jl, jl1;
private JTextField jtf;
private JPanel jp1, jp2, jp3, jp4;
private JButton jb1, jb2, jb3;
private String username;
private JTable jt;
private JComboBox jComboBox;
private JScrollPane scrollPane;
ArrayList<String[]> arrayList = new ArrayList<>();
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
DeleteByName(String name) {
jl = new JLabel("请输入要删除的姓名:");
jl1 = new JLabel("请选择要删除的联系人的电话以确认:");
jComboBox = new JComboBox();
jtf = new JTextField(15);
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
jt = new JTable();
jt.setEnabled(false);
jb1 = new JButton("确认");
jb2 = new JButton("返回");
jb3 = new JButton("确认");
DefaultTableModel tableModel = (DefaultTableModel) jt.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
scrollPane = new JScrollPane();
jt.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(jt);
jb3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
deleteInformation();
for (String[] a : arrayList) {
jComboBox.addItem(a[2]);
}
for (String[] a : arrayList) {
tableModel.addRow(a);
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
});
jb1.addActionListener(this);
jb2.addActionListener(this);
setUsername(name);
}
public void launch() throws SQLException {
jComboBox.addItem("--请选择--");
jp1.add(jl);
jp1.add(jtf);
jp1.add(jb3);
jp2.add(scrollPane);
jp3.add(jl1);
jp3.add(jComboBox);
jp4.add(jb1);
jp4.add(jb2);
setLayout(new GridLayout(4, 1));
add(jp1);
add(jp2);
add(jp3);
add(jp4);
setTitle("按姓名删除");
setSize(500, 600);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
}
public void deleteInformation() throws SQLException {
MySql m = new MySql();
m.connect();
String sql = "select * from " + getUsername() + "_user where name = ?";
PreparedStatement preparedStatement = m.getCon().prepareStatement(sql);
preparedStatement.setString(1, jtf.getText());
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String[] b = new String[6];
b[0] = resultSet.getString(1);
b[1] = resultSet.getString(2);
b[2] = resultSet.getString(3);
b[3] = resultSet.getString(4);
b[4] = resultSet.getString(5);
b[5] = resultSet.getString(6);
arrayList.add(b);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("返回")) {
dispose();
new Delete(getUsername()).launch();
} else if (e.getActionCommand().equals("确认")) {
if (userExit()) {
JOptionPane.showMessageDialog(null, "删除失败!\n未找到此用户", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (jComboBox.getSelectedItem().equals("--请选择--")) {
JOptionPane.showMessageDialog(null, "请选择要删除的联系人的手机号", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
int result = JOptionPane.showConfirmDialog(null, "确认删除?", "确认", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
deleteByName();
JOptionPane.showMessageDialog(null, "删除成功", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
}
}
}
}
public void deleteByName() {
MySql m = new MySql();
m.connect();
PreparedStatement statement;
String sql = "delete from " + getUsername() + "_user where name=? and phone=?";
try {
statement = m.getCon().prepareStatement(sql);
statement.setString(1, jtf.getText());
statement.setString(2, String.valueOf(jComboBox.getSelectedItem()));
statement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public boolean userExit() {
MySql mySql = new MySql();
mySql.connect();
String sql = "select name from " + getUsername() + "_user";
Statement statement = null;
ResultSet resultSet = null;
try {
statement = mySql.getCon().createStatement();
resultSet = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
while (true) {
try {
if (!resultSet.next()) break;
if (resultSet.getString(1).equals(jtf.getText())) {
return false;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return true;
}
}
- 功能描述:
DeleteByName(String):构造方法,初始化变量;
actionPerformed(ActionEvent):实现监听方法;
deleteByName():按姓名删除函数;
getUsername():返回表名;
setUsername(String):设置表名;
userExit():检查用户是否存在;
![](https://img-blog.csdnimg.cn/20210619174646890.png)
- FindByName类,其中构造方法为FindByName(String)、actionPerformed(ActionEvent)、findByName()、getUsername()、setUsername(String)、userExit();
该类的属性如下:
/**
* 按姓名查找
*/
class FindByName extends JFrame implements ActionListener {
private JLabel jl;
private JTextField jtf;
private JPanel jp1, jp2;
private JButton jb1, jb2;
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
FindByName(String name) {
jl = new JLabel("请输入要查找的姓名:");
jtf = new JTextField(15);
jp1 = new JPanel();
jp2 = new JPanel();
jb1 = new JButton("确认查找");
jb2 = new JButton("返回");
jb1.addActionListener(this);
jb2.addActionListener(this);
setUsername(name);
}
public void launch() {
jp1.add(jl);
jp1.add(jtf);
jp2.add(jb1);
jp2.add(jb2);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.SOUTH);
setTitle("按姓名查找");
setSize(400, 120);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("返回")) {
dispose();
new Menu(getUsername()).launch();
} else if (e.getActionCommand().equals("确认查找")) {
if (userExit()) {
JOptionPane.showMessageDialog(null, "查找失败!\n未找到此用户", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "查找成功", "提示消息", JOptionPane.WARNING_MESSAGE);
try {
findByName();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
public void findByName() throws SQLException {
JFrame jf = new JFrame();
MySql m = new MySql();
ArrayList<String[]> arrayList = new ArrayList<>();
m.connect();
String sql = "SELECT * FROM " + getUsername() + "_user where name=?";
PreparedStatement statement = m.getCon().prepareStatement(sql);
statement.setString(1, jtf.getText());
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
String[] b = new String[6];
b[0] = resultSet.getString(1);
b[1] = resultSet.getString(2);
b[2] = resultSet.getString(3);
b[3] = resultSet.getString(4);
b[4] = resultSet.getString(5);
b[5] = resultSet.getString(6);
arrayList.add(b);
}
JTable jTable = new JTable();
DefaultTableModel tableModel = (DefaultTableModel) jTable.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
jTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
JScrollPane jScrollPane = new JScrollPane();
for (String[] s : arrayList) {
tableModel.addRow(s);
}
jScrollPane.setViewportView(jTable);
jf.add(jScrollPane);
jf.setTitle("联系人信息表");
jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
jf.setSize(550, 400);
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
public boolean userExit() {
MySql mySql = new MySql();
mySql.connect();
String sql = "select name from " + getUsername() + "_user";
Statement statement = null;
ResultSet resultSet = null;
try {
statement = mySql.getCon().createStatement();
resultSet = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
while (true) {
try {
if (!resultSet.next()) break;
if (resultSet.getString(1).equals(jtf.getText())) {
return false;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return true;
}
}
/**
* 按手机号查找
*/
class FindByPhone extends JFrame implements ActionListener {
private JLabel jl;
private JTextField jtf;
private JPanel jp1, jp2;
private JButton jb1, jb2;
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
FindByPhone(String name) {
jl = new JLabel("请输入要查找的手机号:");
jtf = new JTextField(15);
jp1 = new JPanel();
jp2 = new JPanel();
jb1 = new JButton("确认查找");
jb2 = new JButton("返回");
jb1.addActionListener(this);
jb2.addActionListener(this);
setUsername(name);
}
public void launch() {
jp1.add(jl);
jp1.add(jtf);
jp2.add(jb1);
jp2.add(jb2);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.SOUTH);
setTitle("按手机号查找");
setSize(400, 120);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("返回")) {
dispose();
new Menu(getUsername()).launch();
} else if (e.getActionCommand().equals("确认查找")) {
if (!phone(jtf.getText())) {
JOptionPane.showMessageDialog(null, "手机号必须是11位数字!", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
} else if (phoneExit()) {
JOptionPane.showMessageDialog(null, "查找失败!\n未找到此用户", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "查找成功", "提示消息", JOptionPane.WARNING_MESSAGE);
try {
findByPhone();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
public boolean phone(String phone) {
Pattern p = Pattern.compile("[1-9][0-9]{10}");
Matcher matcher = p.matcher(phone);
if (matcher.matches()) {
return true;
}
return false;
}
public void findByPhone() throws SQLException {
JFrame jf = new JFrame();
MySql m = new MySql();
Object[][] strings = new String[100][6];
Object[] columen = {"name", "sex", "phone", "email", "address", "QQ"};
m.connect();
String sql = "SELECT * FROM " + getUsername() + "_user where phone=?";
PreparedStatement statement = m.getCon().prepareStatement(sql);
statement.setString(1, jtf.getText());
ResultSet resultSet = statement.executeQuery();
int i = 0;
while (resultSet.next()) {
strings[i][0] = resultSet.getString(1);
strings[i][1] = resultSet.getString(2);
strings[i][2] = resultSet.getString(3);
strings[i][3] = resultSet.getString(4);
strings[i][4] = resultSet.getString(5);
strings[i][5] = resultSet.getString(6);
i++;
}
JTable jTable = new JTable(strings, columen);
JScrollPane jScrollPane = new JScrollPane(jTable);
jf.add(jScrollPane);
jf.setTitle("联系人信息表");
jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
jf.setSize(550, 400);
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
public boolean phoneExit() {
MySql mySql = new MySql();
mySql.connect();
String sql = "select phone from " + getUsername() + "_user";
Statement statement = null;
ResultSet resultSet = null;
try {
statement = mySql.getCon().createStatement();
resultSet = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
while (true) {
try {
if (!resultSet.next()) break;
if (resultSet.getString(1).equals(jtf.getText())) {
return false;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return true;
}
}
- 功能描述:
FindByName(String):构造方法,初始化变量;
actionPerformed(ActionEvent):实现监听接口;
findByName():查找姓名功能接口;
getUsername():返回表名;
setUsername(String):设置表名;
userExit():检测用户是否存在;
![](https://img-blog.csdnimg.cn/20210619174901859.png)
- Update类,其中有构造方法Update(String),成员方法actionPerformed(ActionEvent)、getUsername、setUsername (String)、updateInformation()、userExit();
该类有如下属性:
/**
* 修改联系人
*/
class Update extends JFrame implements ActionListener {
private JPanel jp1, jp2;
private JLabel jl;
private JTextField jtf;
private JButton jb1, jb2;
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
Update(String username) {
jl = new JLabel("请输入要修改的联系人的姓名:");
jtf = new JTextField(15);
jb1 = new JButton("确定");
jb2 = new JButton("返回");
jb1.addActionListener(this);
jb2.addActionListener(this);
jp1 = new JPanel();
jp2 = new JPanel();
setUsername(username);
}
public void launch() {
jp1.add(jl);
jp1.add(jtf);
jp2.add(jb1);
jp2.add(jb2);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.CENTER);
setTitle("修改联系人");
setSize(400, 120);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
}
public void updateInformation() throws SQLException {
ArrayList<String[]> arrayList = new ArrayList<>();
JFrame jf = new JFrame("要修改的数据");
MySql m = new MySql();
m.connect();
String sql = "select * from " + getUsername() + "_user where name = ?";
PreparedStatement preparedStatement = m.getCon().prepareStatement(sql);
preparedStatement.setString(1, jtf.getText());
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String[] b = new String[6];
b[0] = resultSet.getString(1);
b[1] = resultSet.getString(2);
b[2] = resultSet.getString(3);
b[3] = resultSet.getString(4);
b[4] = resultSet.getString(5);
b[5] = resultSet.getString(6);
arrayList.add(b);
}
JTable jt = new JTable();
jt.setEnabled(false);
DefaultTableModel tableModel = (DefaultTableModel) jt.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
JScrollPane scrollPane = new JScrollPane();
JPanel jp = new JPanel();
JPanel jp1 = new JPanel();
JPanel jp2 = new JPanel();
JLabel jl = new JLabel("请选择要修改的联系人的电话以确认:");
JComboBox jComboBox = new JComboBox();
jComboBox.addItem("--请选择--");
for (String[] a : arrayList) {
jComboBox.addItem(a[2]);
}
JButton jb1 = new JButton("确认");
JButton jb2 = new JButton("返回");
jb1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("确认")) {
if (jComboBox.getSelectedItem().equals("--请选择--")) {
JOptionPane.showMessageDialog(null, "请选择要修改的联系人", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
jf.setVisible(false);
try {
new UpdateInformation(getUsername(), jtf.getText(), (String) jComboBox.getSelectedItem()).launch();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
});
jb2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("返回")) {
jf.setVisible(false);
new Update(getUsername()).launch();
}
}
});
jp.add(scrollPane, BorderLayout.CENTER);
jp1.add(jl);
jp1.add(jComboBox);
jp2.add(jb1);
jp2.add(jb2);
jt.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(jt);
jf.add(jp, BorderLayout.NORTH);
jf.add(jp1, BorderLayout.CENTER);
jf.add(jp2, BorderLayout.SOUTH);
jf.setSize(500, 550);
jf.setVisible(true);
for (String[] a : arrayList) {
tableModel.addRow(a);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("返回")) {
dispose();
new Menu(getUsername()).launch();
} else if (e.getActionCommand().equals("确定")) {
if (jtf.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "姓名不能为空", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
try {
if (!userExit()) {
JOptionPane.showMessageDialog(null, "该用户不存在", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
dispose();
try {
updateInformation();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
public boolean userExit() throws SQLException {
MySql mySql = new MySql();
mySql.connect();
String sql = "select name from " + getUsername() + "_user";
Statement statement = null;
ResultSet resultSet = null;
try {
statement = mySql.getCon().createStatement();
resultSet = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
while (resultSet.next()) {
if (resultSet.getString(1).equals(jtf.getText())) {
return true;
}
}
return false;
}
}
- 功能描述:
Update(String):构造方法,初始化变量;
actionPerformed(ActionEvent):实现监听接口;
getUsername:返回表名;
setUsername (String):设置表名;
updateInformation():更新信息;
userExit():检测用户是否存在;
![](https://img-blog.csdnimg.cn/20210619180450295.png)
- Export类,构造方法Export(String),成员方法actionPerformed(ActionEvent)、Export(File)、exportNoLaunch(ArrayList<String[]>,ArrayList<String[]>,ArrayList<String[]>)、exportYesLaunch(ArrayList<String[]>)、getName、setName(String)、launch();
该类有如下属性:
/**
* 导出联系人
*/
class Export extends JFrame implements ActionListener {
private JButton jb1, jb2;
private JLabel jl1;
private JTextField jtf;
private String name;
private JPanel jp1, jp2;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Export(String name) {
setName(name);
jl1 = new JLabel("请输入导出文件路径:");
jtf = new JTextField(20);
jb1 = new JButton("导出");
jb2 = new JButton("返回");
jb1.addActionListener(this);
jb2.addActionListener(this);
jp1 = new JPanel();
jp2 = new JPanel();
}
public void launch() {
jp1.add(jl1);
jp1.add(jtf);
jp2.add(jb1);
jp2.add(jb2);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.CENTER);
setTitle("导出联系人信息");
setSize(400, 130);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
}
public void export(File file) throws IOException {
MySql m = new MySql();
m.connect();
try {
FileWriter fw = new FileWriter(file);
fw.write("姓名,性别,手机号,邮箱,地址,QQ\n");
ArrayList<String[]> list1 = new ArrayList<>();//正确数据
ArrayList<String[]> list2 = new ArrayList<>();//手机格式有误
ArrayList<String[]> list3 = new ArrayList<>();//邮箱格式有误
ArrayList<String[]> list4 = new ArrayList<>();//QQ格式有误
String sql = "select * from " + getName() + "_user";
int i = 0;
try (Statement stmt = m.getCon().createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
i = 1;
String[] b = new String[6];
b[0] = rs.getString("name");
b[1] = rs.getString("sex");
b[2] = rs.getString("phone");
b[3] = rs.getString("email");
b[4] = rs.getString("address");
b[5] = rs.getString("QQ");
if (!AddContact.machesPhone(b[2])) {
list2.add(b);
} else if (!AddContact.machesEmail(b[3])) {
list3.add(b);
} else if (!AddContact.machesQQ(b[5])) {
list4.add(b);
} else {
list1.add(b);
}
}
}
for (String[] str : list1) {
fw.write(str[0] + "," + str[1] + "," + str[2] + "," + str[3] + "," + str[4] + "," + str[5] + "\n");
}
if (i == 1) {
if (list1.size() != 0) {
JOptionPane.showMessageDialog(null, "导出成功");
exportYesLaunch(list1);
}
if (list2.size() != 0 || list3.size() != 0 || list4.size() != 0) {
exportNoLaunch(list2, list3, list4);
}
} else
JOptionPane.showMessageDialog(null, "表中没有数据");
fw.close();
} catch (IOException | SQLException e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("返回")) {
dispose();
new Menu(getName()).launch();
} else if (e.getActionCommand().equals("导出")) {
File file = new File(jtf.getText());
if (file.isDirectory()) {
if (file.exists()) {
int result = JOptionPane.showConfirmDialog(null, "您输入的是目录,是否在该目录下建立文件", "确认", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
String filename = JOptionPane.showInputDialog(null, "请输入文件名");
if (filename != null) {
File file1 = new File(file.getPath() + "//" + filename);
if (!file1.exists()) {
try {
file1.createNewFile();
export(file1);
} catch (IOException ioException) {
ioException.printStackTrace();
}
} else {
JOptionPane.showMessageDialog(null, "文件已存在", "提示消息", JOptionPane.WARNING_MESSAGE);
}
}
}
} else {
int result = JOptionPane.showConfirmDialog(null, "目录不存在,是否新建?", "确认", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.YES_OPTION) {
file.mkdirs();
String filename = JOptionPane.showInputDialog(null, "创建成功!\n请输入文件名创建文件导入数据", "提示消息");
if (filename != null) {
File file1 = new File(file.getPath() + "//" + filename);
try {
file1.createNewFile();
export(file1);
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
}
} else if (file.isFile()) {
if (!file.exists()) {
int result = JOptionPane.showConfirmDialog(null, "错误!目标文件不存在\n是否新建文件", "确认", JOptionPane.YES_NO_OPTION);
if (result == JOptionPane.OK_OPTION) {
String filename = JOptionPane.showInputDialog(null, "请输入文件名:");
File file1 = new File(file.getPath() + "//" + filename);
try {
file1.createNewFile();
export(file1);
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
} else {
try {
export(file);
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
} else {
JOptionPane.showMessageDialog(null, "输入无效!!!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
}
}
}
public void exportYesLaunch(ArrayList<String[]> arrayList) {
JFrame jf = new JFrame("导出的数据");
JTable jt = new JTable();
jt.setEnabled(false);
DefaultTableModel tableModel = (DefaultTableModel) jt.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
JScrollPane scrollPane = new JScrollPane();
JPanel jp = new JPanel();
jp.add(scrollPane, BorderLayout.CENTER);
jt.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(jt);
jf.add(jp);
jf.setSize(500, 500);
jf.setVisible(true);
for (String[] a : arrayList) {
tableModel.addRow(a);
}
}
public void exportNoLaunch(ArrayList<String[]> arrayList1, ArrayList<String[]> arrayList2, ArrayList<String[]> arrayList3) {
JFrame jf = new JFrame("导出的错误数据");
JTable jt = new JTable();
jt.setEnabled(false);
DefaultTableModel tableModel = (DefaultTableModel) jt.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
tableModel.addColumn("错误原因");
JScrollPane scrollPane = new JScrollPane();
JPanel jp = new JPanel();
jp.add(scrollPane, BorderLayout.CENTER);
jt.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(jt);
jf.add(jp);
jf.setSize(500, 500);
jf.setVisible(true);
for (int i = 0; i < arrayList1.size(); i++) {
String[] b = new String[7];
b[0] = arrayList1.get(i)[0];
b[1] = arrayList1.get(i)[1];
b[2] = arrayList1.get(i)[2];
b[3] = arrayList1.get(i)[3];
b[4] = arrayList1.get(i)[4];
b[5] = arrayList1.get(i)[5];
b[6] = "手机号格式错误";
tableModel.addRow(b);
}
for (int i = 0; i < arrayList2.size(); i++) {
String[] b = new String[7];
b[0] = arrayList2.get(i)[0];
b[1] = arrayList2.get(i)[1];
b[2] = arrayList2.get(i)[2];
b[3] = arrayList2.get(i)[3];
b[4] = arrayList2.get(i)[4];
b[5] = arrayList2.get(i)[5];
b[6] = "邮箱格式错误";
tableModel.addRow(b);
}
for (int i = 0; i < arrayList3.size(); i++) {
String[] b = new String[7];
b[0] = arrayList3.get(i)[0];
b[1] = arrayList3.get(i)[1];
b[2] = arrayList3.get(i)[2];
b[3] = arrayList3.get(i)[3];
b[4] = arrayList3.get(i)[4];
b[5] = arrayList3.get(i)[5];
b[6] = "QQ格式错误";
tableModel.addRow(b);
}
}
}
- 功能描述:
Export(String):构造方法,初始化变量;
Export(File):导出文件;
exportNoLaunch(ArrayList<String[]>,ArrayList<String[]>,ArrayList<String[]>):导出的时候出现错误的数据;
exportYesLaunch(ArrayList<String[]>):导出的正确数据;
getName():返回用户名;
setName(String):设置用户名;
launch():导出窗口;
![](https://img-blog.csdnimg.cn/20210619181407710.png)
- Input类,Input类包括构造方法Input(String)、成员方法duplicateDataLaunch(ArrayList)、errorData(ArrayList )、 ArrayList<String[]>, ArrayList<String[]>)、getName()、inputInformation()、inputLaunch()、judge()、launch()、setName()。
该类的属性如下:
/**
* 导入联系人
*/
class Input extends JFrame implements ActionListener {
private JButton jb1, jb2;
private JLabel jl1;
private JTextField jtf;
private String name;
private JPanel jp1, jp2;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Input(String name) {
setName(name);
jl1 = new JLabel("请输入导入文件路径:");
jtf = new JTextField(20);
jb1 = new JButton("导入");
jb2 = new JButton("返回");
jb1.addActionListener(this);
jb2.addActionListener(this);
jp1 = new JPanel();
jp2 = new JPanel();
}
public void launch() {
jp1.add(jl1);
jp1.add(jtf);
jp2.add(jb1);
jp2.add(jb2);
add(jp1, BorderLayout.NORTH);
add(jp2, BorderLayout.CENTER);
setTitle("导入联系人信息");
setSize(400, 130);
setVisible(true);
setResizable(false);
setLocationRelativeTo(null);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("返回")) {
dispose();
new Menu(getName()).launch();
} else if (e.getActionCommand().equals("导入")) {
File file = new File(jtf.getText());
if (!file.exists()) {
JOptionPane.showMessageDialog(null, "您输入的路径无效!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
} else if (file.isDirectory()) {
JOptionPane.showMessageDialog(null, "您输入的是目录!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
} else if (file.isFile()) {
try {
inputInformation();
} catch (IOException ioException) {
ioException.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
public void inputInformation() throws IOException, SQLException {
ArrayList<String[]> arrayList = new ArrayList<>(); //从文件中读出的数据
ArrayList<String[]> arrayList1 = new ArrayList<>(); //从文件中读出错误的数据,手机号格式错误
ArrayList<String[]> arrayList2 = new ArrayList<>(); //从文件中读出错误的数据,邮箱格式错误
ArrayList<String[]> arrayList3 = new ArrayList<>(); //从文件中读出错误的数据,QQ格式错误
ArrayList<String[]> arrayLists = new ArrayList<>(); //正确数据
ArrayList<String[]> arrayList4 = new ArrayList<>(); //重复数据
String line;
BufferedReader bufferedReader = new BufferedReader(new FileReader(jtf.getText()));
String[] b;
while ((line = bufferedReader.readLine()) != null) {
b = line.split(",");
arrayList.add(b);
}
for (int i = 1; i < arrayList.size(); i++) {
if (!AddContact.machesPhone(arrayList.get(i)[2])) {
arrayList1.add(arrayList.get(i));
} else if (!AddContact.machesEmail(arrayList.get(i)[3])) {
arrayList2.add(arrayList.get(i));
} else if (!AddContact.machesQQ(arrayList.get(i)[5])) {
arrayList3.add(arrayList.get(i));
} else if (judge(arrayList.get(i)[2])) {
arrayList4.add(arrayList.get(i));
} else {
arrayLists.add(arrayList.get(i));
}
}
if (arrayList4.size() != 0) {
duplicateDataLaunch(arrayList4);
}
if (arrayLists.size() == 0) {
JOptionPane.showMessageDialog(null, "未找到合法数据", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "导入成功", "提示消息", JOptionPane.WARNING_MESSAGE);
inputLaunch(arrayLists);
MySql m = new MySql();
m.connect();
PreparedStatement statement = null;
String sql = "insert into " + getName() + "_user values(?,?,?,?,?,?)";
try {
statement = m.getCon().prepareStatement(sql);
for (int i = 0; i < arrayLists.size(); i++) {
statement.setString(1, arrayLists.get(i)[0]);
statement.setString(2, arrayLists.get(i)[1]);
statement.setString(3, arrayLists.get(i)[2]);
statement.setString(4, arrayLists.get(i)[3]);
statement.setString(5, arrayLists.get(i)[4]);
statement.setString(6, arrayLists.get(i)[5]);
statement.executeUpdate();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (arrayList1.size() != 0 || arrayList2.size() != 0 || arrayList3.size() != 0) {
errorData(arrayList1, arrayList2, arrayList3);
}
}
public boolean judge(String phone) throws SQLException {
ArrayList<String> arrayList1 = new ArrayList<>(); //从数据库中读出的电话
MySql m = new MySql();
m.connect();
Statement statement1 = m.getCon().createStatement();
String sql1 = "select phone from " + getName() + "_user";
ResultSet resultSet = statement1.executeQuery(sql1);
while (resultSet.next()) {
arrayList1.add(resultSet.getString(1));
}
for (int i = 0; i < arrayList1.size(); i++) {
if (arrayList1.get(i).equals(phone)) {
return true;
}
}
return false;
}
/**
* 重复数据
*
* @param list
*/
public void duplicateDataLaunch(ArrayList<String[]> list) {
JFrame jf = new JFrame("重复的数据");
JTable jt = new JTable();
jt.setEnabled(false);
DefaultTableModel tableModel = (DefaultTableModel) jt.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
JScrollPane scrollPane = new JScrollPane();
JPanel jp = new JPanel();
jp.add(scrollPane, BorderLayout.CENTER);
jt.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(jt);
jf.add(jp);
jf.setSize(500, 500);
jf.setVisible(true);
for (String[] a : list) {
tableModel.addRow(a);
}
}
/**
* 导入的数据
*/
public void inputLaunch(ArrayList<String[]> arrayList) {
JFrame jf = new JFrame("合法的数据");
JTable jt = new JTable();
jt.setEnabled(false);
DefaultTableModel tableModel = (DefaultTableModel) jt.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
JScrollPane scrollPane = new JScrollPane();
JPanel jp = new JPanel();
jp.add(scrollPane, BorderLayout.CENTER);
jt.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(jt);
jf.add(jp);
jf.setSize(500, 500);
jf.setVisible(true);
for (String[] a : arrayList) {
tableModel.addRow(a);
}
}
public void errorData(ArrayList<String[]> list1, ArrayList<String[]> list2, ArrayList<String[]> list3) {
JFrame jf = new JFrame("导入的错误数据");
JTable jt = new JTable();
jt.setEnabled(false);
DefaultTableModel tableModel = (DefaultTableModel) jt.getModel(); //获得表格模型
tableModel.addColumn("姓名");
tableModel.addColumn("性别");
tableModel.addColumn("手机号");
tableModel.addColumn("邮箱");
tableModel.addColumn("地址");
tableModel.addColumn("QQ");
tableModel.addColumn("错误原因");
JScrollPane scrollPane = new JScrollPane();
JPanel jp = new JPanel();
jp.add(scrollPane, BorderLayout.CENTER);
jt.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
scrollPane.setViewportView(jt);
jf.add(jp);
jf.setSize(500, 500);
jf.setVisible(true);
for (int i = 0; i < list1.size(); i++) {
String[] b = new String[7];
b[0] = list1.get(i)[0];
b[1] = list1.get(i)[1];
b[2] = list1.get(i)[2];
b[3] = list1.get(i)[3];
b[4] = list1.get(i)[4];
b[5] = list1.get(i)[5];
b[6] = "手机号格式错误";
tableModel.addRow(b);
}
for (int i = 0; i < list2.size(); i++) {
String[] b = new String[7];
b[0] = list2.get(i)[0];
b[1] = list2.get(i)[1];
b[2] = list2.get(i)[2];
b[3] = list2.get(i)[3];
b[4] = list2.get(i)[4];
b[5] = list2.get(i)[5];
b[6] = "邮箱格式错误";
tableModel.addRow(b);
}
for (int i = 0; i < list3.size(); i++) {
String[] b = new String[7];
b[0] = list3.get(i)[0];
b[1] = list3.get(i)[1];
b[2] = list3.get(i)[2];
b[3] = list3.get(i)[3];
b[4] = list3.get(i)[4];
b[5] = list3.get(i)[5];
b[6] = "QQ格式错误";
tableModel.addRow(b);
}
}
}
- 功能描述:
Input(String):构造方法,初始化变量;
duplicateDataLaunch(ArrayList):导入的时候检测重复的数据;
errorData(ArrayList<String[]> )、 ArrayList<String[]>, ArrayList<String[]>):导入过程中的非法数据;
getName():返回用户名;
inputInformation():导入数据;
inputLaunch(ArrayList<String[]>):导入的窗口组件;
judge(String):判断重复的用户;
launch():主窗口;
setName(String):设置姓名;
![](https://img-blog.csdnimg.cn/20210619181635286.png)
5.3登录
- 用户在登录页面可进行登录或者注册。
首次登录,需要先进行注册。
如果选择注册功能,则弹出来注册页面,在注册页面需要输入11位手机号作为用户名,密码需要重复输入两次,以及验证码进行验证。
在点击注册后,将先判断手机号或者密码及验证码是否为空,为空则提示错误。输入正确后,调用userExit(String)方法,判断当前手机号是否已经注册。判断方法用sql语句从数据库中依次读出用户名,与当前要注册的手机号比较,如果相同返回true,否则返回false。
注册成功后则将手机号和密码都写入数据库中,作为登录的账号和密码。
注册页面如下图所示:
![](https://img-blog.csdnimg.cn/20210619223603320.png)
代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
import java.util.regex.Pattern;
/**
* 注册模块
*/
public class Register extends JFrame implements ActionListener {
private JLabel jl1, jl2, jl3, jl4, jl5;
private JTextField jtf, jtf1;
private JPasswordField jpf1, jpf2;
private JButton jb1, jb2;
private JPanel jp1, jp2, jp3, jp4, jp5;
private MySql mySql;
Register() {
jl1 = new JLabel("手机号:");
jl2 = new JLabel("密 码:");
jl3 = new JLabel("请再次输入:");
jl4 = new JLabel("验证码:");
jl5 = new JLabel();
jl5.setText(verificationCode());
jtf = new JTextField(20);
jtf1 = new JTextField(5);
jpf1 = new JPasswordField(20);
jpf2 = new JPasswordField(20);
jb1 = new JButton("注册");
jb2 = new JButton("返回");
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp4 = new JPanel();
jp5 = new JPanel();
mySql = new MySql();
}
public void launch() {
jb1.addActionListener(this);
jb2.addActionListener(this);
jp1.add(jl1);
jp1.add(jtf);
jp2.add(jl2);
jp2.add(jpf1);
jp3.add(jl3);
jp3.add(jpf2);
jp4.add(jl4);
jp4.add(jl5);
jp4.add(jtf1);
jp5.add(jb1);
jp5.add(jb2);
add(jp1);
add(jp2);
add(jp3);
add(jp4);
add(jp5);
setTitle("通讯录");
setVisible(true);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
int result = JOptionPane.showConfirmDialog(null, "确认退出?", "确认", JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
System.exit(0);
}
}
});
setLayout(new GridLayout(5, 1));
setSize(400, 180);
setLocationRelativeTo(null);
setResizable(false);
}
public boolean maches(String str) {
if (Pattern.matches("\\d+", str) && str.length() == 11)
return true;
return false;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("注册")) {
if (jtf.getText().isEmpty() || jpf1.getText().isEmpty() || jpf2.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "手机号或密码不能为空!", "提示消息", JOptionPane.WARNING_MESSAGE);
jtf.setText("");
jpf1.setText("");
jpf2.setText("");
} else if (!jpf1.getText().equals(jpf2.getText())) {
JOptionPane.showMessageDialog(null, "两次密码输入不一致!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
jpf1.setText("");
jpf2.setText("");
} else if (jtf1.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "验证码不能为空", "提示消息", JOptionPane.WARNING_MESSAGE);
jl5.setText(verificationCode());
} else if (!jl5.getText().equalsIgnoreCase(jtf1.getText())) {
JOptionPane.showMessageDialog(null, "验证码不一致!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
jl5.setText(verificationCode());
jtf1.setText("");
} else if (!maches(jtf.getText())) {
JOptionPane.showMessageDialog(null, "手机号必须是11位数字!\n请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE);
jl5.setText(verificationCode());
jtf.setText("");
jtf1.setText("");
jpf1.setText("");
jpf2.setText("");
} else if (userExit(jtf.getText())) {
JOptionPane.showMessageDialog(null, "用户名已存在", "提示消息", JOptionPane.WARNING_MESSAGE);
jl5.setText(verificationCode());
jtf.setText("");
jtf1.setText("");
jpf1.setText("");
jpf2.setText("");
} else {
JOptionPane.showMessageDialog(null, "注册成功\n欢迎使用本通讯库", "提示消息", JOptionPane.WARNING_MESSAGE);
write(jtf.getText(), jpf1.getText());
dispose();
new Login().launch();
}
}
if (e.getActionCommand().equals("返回")) {
dispose();
new Login().launch();
}
}
public String verificationCode() {
String code = "";
String str = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
Random random = new Random();
for (int i = 0; i < 4; i++) {
code += str.charAt(random.nextInt(62));
}
return code;
}
public void write(String username, String password) {
mySql.connect();
PreparedStatement preparedStatement = null;
String sql = "insert into user values(?,?)";
try {
preparedStatement = mySql.getCon().prepareStatement(sql);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
preparedStatement.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
preparedStatement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
mySql.close();
}
}
public boolean userExit(String username) {
mySql.connect();
ResultSet resultSet = null;
Statement statement = null;
String sql = "select username from user";
try {
statement = mySql.getCon().createStatement();
resultSet = statement.executeQuery(sql);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
while (true) {
try {
if (!resultSet.next()) break;
else if (resultSet.getString("username").equals(username)) {
return true;
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return false;
}
}
用我们刚刚注册的手机号和密码点击登录按钮,进行登录。点击登录后,首先调用checkTableIsExist(String username)方法检查用户是否绑定了通讯录。当首次使用通讯库时登录之后需要进行绑定。验证的方式时调用sql语句读取所有表,判断是否存在用户名+“_user”的表。如果存在则直接进入主页面,否则提示绑定通讯录,选择是否绑定,选择是的话则创建新的通讯录表。
![](https://img-blog.csdnimg.cn/20210619223933297.png)
5.4主界面
- 登录成功之后若首次登录,则需要绑定通讯录哦!点击确定则绑定成功!
![](https://img-blog.csdnimg.cn/20210619224134497.png)
![](https://img-blog.csdnimg.cn/20210619224127776.png)
登陆成功主页面:
![](https://img-blog.csdnimg.cn/20210619224254268.png)
登录成功之后,可选择功能。一共八个功能,可自由选择对应的功能,点击相应的功能,进入相应的功能模块。
5.5添加联系人信息
- 点击添加联系人信息进入添加联系人页面,用户可输入姓名,手机号,性别,地址,邮箱,QQ等信息。输入完毕后。点击添加按钮,调用sql语句,将信息插入数据库中,同时对输入到界面上的各种信息进行合法性校验。
添加联系人页面:
![](https://img-blog.csdnimg.cn/2021061922445511.png)
5.6查询联系人信息
- 查询联系人信息,分为按姓名查找和按手机号查找。首先我们输入待查询的联系人的姓名,然后调用sql语句对数据库中信息进行检索,查找到姓名一致的联系人则将信息全部输出到一个定长数组(分别保存数据库中的各项信息,例如姓名,性别,手机号等)中,接着将该数组加入到一个可变数组中。注意该可变数组在声明的时候其类型为字符串数组类型。
- 接下来创建表格,采用for-each循环,依次取出一个数组,作为每一行的值加入到该表格中。显示所有同名联系人信息。
如下是按姓名查找:
![](https://img-blog.csdnimg.cn/20210619224717945.png)
![](https://img-blog.csdnimg.cn/20210619224724562.png)
![](https://img-blog.csdnimg.cn/20210619224740566.png)
图5.6.1-按姓名查找
- 按手机号查找类似,输入手机号,调用sql语句进行检索,输出符合条件的所有联系人信息。
5.7修改联系人信息
- 修改联系人信息,首先要输入联系人姓名,如果联系人存在同名的情况,则当采用按姓名查找的情况下,则输出第一个检测到的联系人信息。故对其采取了一些措施来避免查看错误联系人的情况。首先我们输入待查询的联系人的姓名,然后调用sql语句对数据库中信息进行检索,查找到姓名一致的联系人则将信息全部输出到一个定长数组(分别保存数据库中的各项信息,例如姓名,性别,手机号等)中,接着将该数组加入到一个可变数组中。注意该可变数组在声明的时候其类型为字符串数组类型。
- 接下来创建表格,采用for-each循环,依次取出一个数组,作为每一行的值加入到该表格中。显示所有同名联系人信息。当表格中有多条信息时,因为手机号唯一,故采用下拉菜单,输出每名联系人的手机号,用户可选择想要查找的联系人的电话,然后点击查看按钮,输出该联系人的信息。在对应的联系人信息中进行修改,点击确定修改,则合法性检查通过后,将此时界面中的各项信息,按照修改前的姓名和手机号查找到对应信息项,输出到数据库中对相应的信息修改。
![](https://img-blog.csdnimg.cn/20210619225031202.png)
![](https://img-blog.csdnimg.cn/20210619225037420.png)
![](https://img-blog.csdnimg.cn/20210619225043987.png)
5.8删除学生成绩信息
- 删除联系人信息分为按姓名删除和按手机号删除两种形式,其中按照手机号删除是比较简单的一种删除手段,因为手机号具有唯一性,在数据库中是惟一的,故只要输入联系人手机号,调用相应的sql语句即可删除。
![](https://img-blog.csdnimg.cn/2021061922531879.png)
![](https://img-blog.csdnimg.cn/20210619225322927.png)
![](https://img-blog.csdnimg.cn/2021061922532830.png)
- 按姓名删除比较复杂一点,因为可能存在同名的情况。如果继续按照手机号的删除方式,则会出现将所有同名联系人一起删除的情况,为避免这种情况出现。首先我们输入待查询的联系人的姓名,然后调用sql语句对数据库中信息进行检索,查找到姓名一致的联系人则将信息全部输出到一个定长数组(分别保存数据库中的各项信息,例如姓名,性别,手机号等)中,接着将该数组加入到一个可变数组中。注意该可变数组在声明的时候其类型为字符串数组类型。
- 接下来创建表格,采用for-each循环,依次取出一个数组,作为每一行的值加入到该表格中。显示所有同名联系人信息。当表格中有多条信息时,因为手机号唯一,故采用下拉菜单,输出每名联系人的手机号,用户可选择想要删除的联系人的电话,然后点击确认按钮,即可删除成功!
5.9 导出联系人
- 由于系统中的数据可能由于服务器原因中断,数据清洗等原因导致数据库丢失,故必须定期对数据库中的内容进行备份。导出系统中的所有联系人信息是备份的一种手段,除此之外,也是检测错误数据的一种手段。首先我们输入要保存的文件路径,检查该路径是否合法,如果不存在则新建。之后点击导出按钮。
- 建立四个二维数组,及一个定长一维数组。创建一个结果集,输出通讯录中的全部联系人信息保存到一维数组中,接着检测数据的合法性,分为邮箱格式错误,手机号格式错误,QQ格式错误以及正确数据四种类型。分别保存到四个不同的数组中。接着分别调用exportYesLaunch(ArrayList<String[]>)函数,传入正确数据,建立相应的面板,显示正确数据信息。调用exportNoLaunch(ArrayList<String[]>,ArrayList<String[]>,ArrayList<String[]>)函数将三个错误数据数组传入,按照一定的顺序加入到表格中,输出错误原因,显示给用户。
- 同时将正确数据导出到相应的路径下,写入文件中,完成备份。
![](https://img-blog.csdnimg.cn/20210619225833696.png)
![](https://img-blog.csdnimg.cn/20210619225839838.png)
![](https://img-blog.csdnimg.cn/20210619225843693.png)
<div align=center><img src="https://img-blog.csdnimg.cn/20210619225848823.png"/></div>
<center>图5.9.1-导出联系人信息</center>
5.10 导入联系人
- 一个个的添加联系人是非常不友好的,所以我们加入了导入联系人的手段,一键导入文件中保存的所有联系人。首先我们输入要导入的文件路径,检查该路径是否合法,之后点击导入按钮。
- 建立六个二维数组。从文件中读出全部联系人的信息,保存到一个动态二维数组中,接着检测数据的合法性,分为邮箱格式错误,手机号格式错误,QQ格式错误,及与数据库中手机号重复的错误以及正确数据五种类型。分别保存到五个不同的数组中。接着分别调用不同的函数显示正确数据及错误数据,错误数据表格中显示数据错误原因。
- 接着采用for循环,将正确数组二维数组中的每组数据读出来,依次调用sql语句插入到数据库中,完成数据的导入工作。
![](https://img-blog.csdnimg.cn/20210619230123222.png)
![](https://img-blog.csdnimg.cn/2021061923012836.png)
![](https://img-blog.csdnimg.cn/20210619230133465.png)
6 系统测试
6.1登录模块
用户名 | 密码 | 测试数据状态 | 测试结果 |
---|---|---|---|
13253546 | 1 | 用户名长度不够11位 | ![]() |
1325358980a | 1 | 用户名出现非数字 | ![]() |
13253589803 | 1 | 用户名不存在 | ![]() |
13253589805 | 2 | 密码错误 | ![]() |
13253589805 | 1 | 正确结果 | ![]() |
6.2注册模块
手机号 | 密码 | 重复输入密码 | 验证码 | 测试数据状态 | 测试结果 |
---|---|---|---|---|---|
13253589805 | 1 | 1 | Jeg2 | 手机号重复注册 | ![]() |
13253589801 | 1 | 2 | Fn3e | 两次密码输入不一致 | ![]() |
13253589801 | 1 | 1 | 2021 | 验证码输入错误 | ![]() |
13253589801 | 1 | 1 | 9mhd | 输入正确 | ![]() |
6.3 添加联系人模块
手机号 | 性别 | 姓名 | 地址 | 邮箱 | 测试状态 | 测试结果 | |
---|---|---|---|---|---|---|---|
13253589805 | 男 | 王智威 | 河南工业大学 | 201628142@qq.com | 201628142 | 手机号重复 | ![]() |
13253589802 | 男 | 王智威 | 百货大楼 | 2016a28142.com | 201628142 | 邮箱格式错误 | ![]() |
132a3589802 | 男 | 王智威 | 百货大楼 | 201628142@qq.com | 201628142 | 手机号格式错误 | ![]() |
13253589802 | 男 | 王智威 | 百货大楼 | 201628142@qq.com | 201a | QQ格式错误 | ![]() |
6.4 修改联系人模块
姓名 | 测试状态 | 测试结果 |
---|---|---|
小芳 | 不存在此用户 | ![]() |
手机号 | 性别 | 姓名 | 地址 | 邮箱 | 测试状态 | 测试结果 | |
---|---|---|---|---|---|---|---|
13253589805 | 男 | 王智威 | 河南工业大学 | 201628142@qq.com | 201628142 | 手机号重复 | ![]() |
13253589802 | 男 | 王智威 | 百货大楼 | 2016a28142.com | 201628142 | 邮箱格式错误 | ![]() |
132a3589802 | 男 | 王智威 | 百货大楼 | 201628142@qq.com | 201628142 | 手机号格式错误 | ![]() |
13253589802 | 男 | 王智威 | 百货大楼 | 201628142@qq.com | 201a | QQ格式错误 | ![]() |
6.5 导入联系人模块
路径 | 测试状态 | 测试结果 |
---|---|---|
D:\AddressBook | 输入目录 | ![]() |
D:\AddressBook\hh | 输入文件不存在 | ![]() |
D:\AddressBook\xiaomenglong.csv | 文件中数据错误,没有正确的数据 | ![]() |
D:\AddressBook\abc.csv | 正常 | 导入成功 |
6.6 导出联系人
路径 | 测试状态 | 测试结果 |
---|---|---|
D:\AddressBook | 输入目录 | ![]() |
D:\AddressBook\fdaf | 无效文件 | ![]() |
D:\AddressBook\address.csv | 输入正确 | ![]() |
7 心得体会
- 本次在做系统过程中对于数据库的使用又上升了一个新高度,简简单单的几条语句给组成了一朵花,在数据库中遇到了蛮多问题,其中那个关于字段的错误出现的次数最多,后来了解到了在字段前后加上单引号,依次来解决问题。
另外,通过本次课程设计,我看到了需求分析的重要性,系统的主体结构需要我们在初始阶段就定义好,不然后期整理的时候会越来越乱。尤其是图形界面,如果前期不做好规划,则很难将界面组合起来,并且界面也不会很好看。 - 通过本次课程设计,进一步培养了我们利用Java语言编程和调试程序的能力,为后面的继续学习打下良好的基础。同时,也培养了我们独立思考、动手操作的能力,在其他能力上也会有所提升,而这正是以后会用到的。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我的将来也有很大的帮助。以后,不管有多苦,我想我都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我都可以在课设结束之后变的更加成熟,会面对需要面对的事情,以及学会遇到问题,不急不慌,慢慢解决它。
8 参考文献
[1] 刘继承等.Java 8程序设计及实验[M].清华大学出版社,2018.09
[2] 耿祥义,张跃平.Java程序设计精编教程[M].清华大学出版社,2021.05
[3] 张白一等.面向对象程序设计-java.西安电子科技大学出版社,2018.10
[4] 明日科技.Java从入门到精通(第5版)[M].清华大学出版社,2019.03