Java~通讯录系统


注意:本文章仅供参考,有想获取项目源代码和实验报告的小伙伴:赶快前往 通讯录管理程序
复制本链接或者点击以上超链接一键下载 https://download.csdn.net/download/qq_45692367/19746137
项目源代码及配套的实验报告等你来拿

1、需求分析

在设计一个完整的系统中,我从系统的管理员登录界面开始做,另外依据相关要求,对系统增加了数据库支持(MySQL做的数据库),还有对数据库里的数据进行增加、删除、显示所有记录、查询记录、修改记录、导出备份数据库文件、导入数据库文件。为了保证数据库的安全,在系统中设立了管理员权限,即只有被允许的用户才可以进入该系统。此外,还增设了用户注册系统,因为考虑到个人用户的影响,所以新增了通讯录绑定功能,即每个人拥有不同的通讯录。 

🔐📊⚙️📁🔍

作为一名通讯录使用用户,毋庸置疑的是我们不愿意与其他人共享一个通讯录,所以我增设了注册页面及通讯录绑定的功能,实现一账户一通讯录。此外,在登录的过程中,我们作为用户肯定希望的到良好的体验,图形用户界面是一个非常友好的东西,所以我们通篇采用了图形界面,依次提高用户的体验。此外,因为本系统可能要录入大量的联系人信息,所以采用了数据库(MySQL)的形式保存联系人信息。 

📱📇🔍📝🔢

作为用户最基础的增删查改自然要实现了添加联系人的功能。其中联系人的信息包括姓名,性别,手机号,邮箱,地址,QQ号等;信息添加完成之后,我们希望去浏览此时通讯录中的全部信息,故增加了浏览功能,以表格的形式呈现,我们可以很容易的查看到数据库中的所有信息;查询功能也是比较需要的功能,通过查询功能,我们可以分别按照姓名,手机号查询信息,多种多样;填了信息之后,其中有一项可能输入错误,此时需要更该的话,我们提供了两种修改方式,第一种是根据手机号修改,第二种是根据姓名修改,又因可能避免不了同名的情况,故我们很人性化的提供表格,显示同名联系人的所有的信息,此时,可选择正确的联系人进行修改;删除功能,与修改功能一样,可根据姓名手机号删除,但在删除过程中,亦可能存在同名的情况,故本系统采用表格显示所有同名联系人的信息,选择对应的删除; 

👥📈🔍✏️❌

为了防止数据库内容的丢失,我们设置了导出模块,可以一键导出联系人信息,保存联系人信息。为了方便用户使用,同样设置了一键导入功能。 

📤📥

2、概要设计

2.1功能模块结构图

根据需求分析,本系统的功能模块图如下所示:

📊 功能模块图

  1. 登录功能:用户可输入账号密码登录;
  2. 注册功能:用户可输入账号密码及验证码进行注册;
  3. 添加联系人:用户可根据需要输入姓名,性别,手机号,邮箱,地址,QQ号添加;
  4. 修改联系人:用户可根据实际情况修改所有项;
  5. 删除联系人:用户可根据手机号,姓名自由删除联系人;
  6. 搜索联系人:用户可根据姓名,手机号搜索联系人;
  7. 浏览联系人:用户可查看所有联系人;
  8. 导入联系人:用户可将csv文件中的所有内容写入数据库;
  9. 导出联系人:用户可将系统中联系人一键导出;
    图2-1通讯录管理系统
图2-1通讯录管理系统

2.2业务流程图

  • 登录系统流程图
    用户首先输入账号密码,账号是11位手机号,对数据库中数据进行检索,若未找到对应的用户,则提示尚未注册,选择是否注册,否则进行账号密码匹配判断,不匹配,则提示密码错误。
图2-2 登录流程图
  • 注册流程图
    用户输入账号,账号为11位数字,若输入不成功,则提示手机号必须是11位数字并清空文本框。密码需要输入两次,若输入不一致,则提示输入不一致,并清空。验证码随机生成且刷新,用户需输入对应的验证码,忽略大小写,若输入不成功,则提示输入错误,并刷新验证码。
图2-3 注册流程图
  • 添加联系人信息流程图
    用户输入姓名,选择性别,输入手机号,选择地址,输入详细地址,输入邮箱,输入QQ号,进行合法性判断,添加联系人。
图2-4 添加联系人流程图
  • 修改学生信息流程图
    首先输入联系人姓名,查找对应的联系人,输出同名的所有联系人,选择该联系人的电话,跳转到该联系人页面,显示该联系人的全部信息,在该联系人信息基础上进行修改,修改完毕则保存到数据库中。
图2-5修改联系人流程图
  • 删除学生信息流程图
    首先选择按姓名删除或者按手机号删除,如果选择按姓名删除,则存在同名的情况。
    在这里插入图片描述
删除联系人流程图
  • 搜索学生信息流程图
    在这里插入图片描述
图2-7搜索联系人流程图

3 运行环境

  • 硬件环境:PC机 内存 8G
  • 软件环境:操作系统:windows10

4 开发工具和编程语言

  • 开发环境:IDEA, MySQL;
  • 编程语言:Java语言

5 详细设计

5.1 数据库设计

  • User表,用来存储用户的账号密码。账号即为手机号,保存为字符串类型,且数据长度必须为11位数字。
图5.1-User表的内容
  • Province表,用来存储全国各大省份。其中id标注了该所对应的编号,用来联系城市。
图5.2-Province表的内容
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210619171747549.png)
  • Country表,用来存储各个省的城市。该表的id用来联系省份id,标注率属于的省份,areaid用来联系下辖县。

图5.3-Country表,用来存储每个省的各大城市
  • County表,用来存储各个县或区。Id用来联系各个市。
图5.4-County表,用来存储各个县
  • 用户名+_user表,由系统动态的创建,保存通讯录中的信息。
    如下图所示为13253589805的用户的通讯录,其中手机号必须是11位数字,邮箱必须满足一定的格式,地址可在添加时自行选择省份,城市,县,以及详细地址,对于QQ也必须满足一点的格式,例如QQ是6-11位的数字。
图5.5-用户名+_user表中的通讯录保存的信息

5.2 类的设计

  • Test类,其中包含main方法,构造方法Test(),main方法中声明Login对象,调用launch()方法,显示出登录窗口。

图5.6-Test类UML图
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):判断用户是否已经存在。
图5.7-Register类UML图
  • 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属性;
图5.8-MySql类UML图
  • 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():设置表名;
图5.9-AddressBook类UML图
  • 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):检测手机号的合法性;
图5.10-Login类UML图
  • 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):设置表名;
图5.11-Menu类UML图
  • 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):读取省名;
图5.12-AddContact类UML图
  • 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():检查用户是否存在;
图5.13-DeleteByName类UML图
  • 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():检测用户是否存在;
图5.14-FindByName类UML图
  • 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():检测用户是否存在;
图5-15Update类UML图
  • 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():导出窗口;
图5.16-Export类UML图
  • 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):设置姓名;
图5.17-Input类UML图

5.3登录

  • 用户在登录页面可进行登录或者注册。
    首次登录,需要先进行注册。
    如果选择注册功能,则弹出来注册页面,在注册页面需要输入11位手机号作为用户名,密码需要重复输入两次,以及验证码进行验证。
    在点击注册后,将先判断手机号或者密码及验证码是否为空,为空则提示错误。输入正确后,调用userExit(String)方法,判断当前手机号是否已经注册。判断方法用sql语句从数据库中依次读出用户名,与当前要注册的手机号比较,如果相同返回true,否则返回false。
    注册成功后则将手机号和密码都写入数据库中,作为登录的账号和密码。
    注册页面如下图所示:
图5.18-注册页面

代码如下:

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”的表。如果存在则直接进入主页面,否则提示绑定通讯录,选择是否绑定,选择是的话则创建新的通讯录表。

图5.19-登录页面

5.4主界面

  • 登录成功之后若首次登录,则需要绑定通讯录哦!点击确定则绑定成功!

登陆成功主页面:

图5.20-主页面

登录成功之后,可选择功能。一共八个功能,可自由选择对应的功能,点击相应的功能,进入相应的功能模块。

5.5添加联系人信息

  • 点击添加联系人信息进入添加联系人页面,用户可输入姓名,手机号,性别,地址,邮箱,QQ等信息。输入完毕后。点击添加按钮,调用sql语句,将信息插入数据库中,同时对输入到界面上的各种信息进行合法性校验。
    添加联系人页面:
图5.5.1-添加联系人页面

5.6查询联系人信息

  • 查询联系人信息,分为按姓名查找和按手机号查找。首先我们输入待查询的联系人的姓名,然后调用sql语句对数据库中信息进行检索,查找到姓名一致的联系人则将信息全部输出到一个定长数组(分别保存数据库中的各项信息,例如姓名,性别,手机号等)中,接着将该数组加入到一个可变数组中。注意该可变数组在声明的时候其类型为字符串数组类型。
  • 接下来创建表格,采用for-each循环,依次取出一个数组,作为每一行的值加入到该表格中。显示所有同名联系人信息。
    如下是按姓名查找:

图5.6.1-按姓名查找

  • 按手机号查找类似,输入手机号,调用sql语句进行检索,输出符合条件的所有联系人信息。

5.7修改联系人信息

  • 修改联系人信息,首先要输入联系人姓名,如果联系人存在同名的情况,则当采用按姓名查找的情况下,则输出第一个检测到的联系人信息。故对其采取了一些措施来避免查看错误联系人的情况。首先我们输入待查询的联系人的姓名,然后调用sql语句对数据库中信息进行检索,查找到姓名一致的联系人则将信息全部输出到一个定长数组(分别保存数据库中的各项信息,例如姓名,性别,手机号等)中,接着将该数组加入到一个可变数组中。注意该可变数组在声明的时候其类型为字符串数组类型。
  • 接下来创建表格,采用for-each循环,依次取出一个数组,作为每一行的值加入到该表格中。显示所有同名联系人信息。当表格中有多条信息时,因为手机号唯一,故采用下拉菜单,输出每名联系人的手机号,用户可选择想要查找的联系人的电话,然后点击查看按钮,输出该联系人的信息。在对应的联系人信息中进行修改,点击确定修改,则合法性检查通过后,将此时界面中的各项信息,按照修改前的姓名和手机号查找到对应信息项,输出到数据库中对相应的信息修改。

5.8删除学生成绩信息

  • 删除联系人信息分为按姓名删除和按手机号删除两种形式,其中按照手机号删除是比较简单的一种删除手段,因为手机号具有唯一性,在数据库中是惟一的,故只要输入联系人手机号,调用相应的sql语句即可删除。
图5.8.1-按手机号删除
  • 按姓名删除比较复杂一点,因为可能存在同名的情况。如果继续按照手机号的删除方式,则会出现将所有同名联系人一起删除的情况,为避免这种情况出现。首先我们输入待查询的联系人的姓名,然后调用sql语句对数据库中信息进行检索,查找到姓名一致的联系人则将信息全部输出到一个定长数组(分别保存数据库中的各项信息,例如姓名,性别,手机号等)中,接着将该数组加入到一个可变数组中。注意该可变数组在声明的时候其类型为字符串数组类型。
  • 接下来创建表格,采用for-each循环,依次取出一个数组,作为每一行的值加入到该表格中。显示所有同名联系人信息。当表格中有多条信息时,因为手机号唯一,故采用下拉菜单,输出每名联系人的手机号,用户可选择想要删除的联系人的电话,然后点击确认按钮,即可删除成功!

5.9 导出联系人

  • 由于系统中的数据可能由于服务器原因中断,数据清洗等原因导致数据库丢失,故必须定期对数据库中的内容进行备份。导出系统中的所有联系人信息是备份的一种手段,除此之外,也是检测错误数据的一种手段。首先我们输入要保存的文件路径,检查该路径是否合法,如果不存在则新建。之后点击导出按钮。
  • 建立四个二维数组,及一个定长一维数组。创建一个结果集,输出通讯录中的全部联系人信息保存到一维数组中,接着检测数据的合法性,分为邮箱格式错误,手机号格式错误,QQ格式错误以及正确数据四种类型。分别保存到四个不同的数组中。接着分别调用exportYesLaunch(ArrayList<String[]>)函数,传入正确数据,建立相应的面板,显示正确数据信息。调用exportNoLaunch(ArrayList<String[]>,ArrayList<String[]>,ArrayList<String[]>)函数将三个错误数据数组传入,按照一定的顺序加入到表格中,输出错误原因,显示给用户。
  • 同时将正确数据导出到相应的路径下,写入文件中,完成备份。
<div align=center><img  src="https://img-blog.csdnimg.cn/20210619225848823.png"/></div>
<center>图5.9.1-导出联系人信息</center> 

5.10 导入联系人

  • 一个个的添加联系人是非常不友好的,所以我们加入了导入联系人的手段,一键导入文件中保存的所有联系人。首先我们输入要导入的文件路径,检查该路径是否合法,之后点击导入按钮。
  • 建立六个二维数组。从文件中读出全部联系人的信息,保存到一个动态二维数组中,接着检测数据的合法性,分为邮箱格式错误,手机号格式错误,QQ格式错误,及与数据库中手机号重复的错误以及正确数据五种类型。分别保存到五个不同的数组中。接着分别调用不同的函数显示正确数据及错误数据,错误数据表格中显示数据错误原因。
  • 接着采用for循环,将正确数组二维数组中的每组数据读出来,依次调用sql语句插入到数据库中,完成数据的导入工作。
图5.10.1-导入联系人信息

6 系统测试

6.1登录模块

用户名密码测试数据状态测试结果
132535461用户名长度不够11位在这里插入图片描述
1325358980a1用户名出现非数字在这里插入图片描述
132535898031用户名不存在在这里插入图片描述
132535898052密码错误在这里插入图片描述
132535898051正确结果在这里插入图片描述

6.2注册模块

手机号密码重复输入密码验证码测试数据状态测试结果
1325358980511Jeg2手机号重复注册在这里插入图片描述
1325358980112Fn3e两次密码输入不一致在这里插入图片描述
13253589801112021验证码输入错误在这里插入图片描述
13253589801119mhd输入正确在这里插入图片描述

6.3 添加联系人模块

手机号性别姓名地址邮箱QQ测试状态测试结果
13253589805王智威河南工业大学201628142@qq.com201628142手机号重复在这里插入图片描述
13253589802王智威百货大楼2016a28142.com201628142邮箱格式错误在这里插入图片描述
132a3589802王智威百货大楼201628142@qq.com201628142手机号格式错误在这里插入图片描述
13253589802王智威百货大楼201628142@qq.com201aQQ格式错误在这里插入图片描述

6.4 修改联系人模块

姓名测试状态测试结果
小芳不存在此用户在这里插入图片描述
手机号性别姓名地址邮箱QQ测试状态测试结果
13253589805王智威河南工业大学201628142@qq.com201628142手机号重复在这里插入图片描述
13253589802王智威百货大楼2016a28142.com201628142邮箱格式错误在这里插入图片描述
132a3589802王智威百货大楼201628142@qq.com201628142手机号格式错误在这里插入图片描述
13253589802王智威百货大楼201628142@qq.com201aQQ格式错误在这里插入图片描述

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

  • 11
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
设计课题题目 一、课程设计目的与要求 1.课程设计目的 1. 综合运用之前所学知识(选择控制,循环控制,数组,函数,指针,结构体和文件等 )来完成一个简单的信息管理程序的设计。 2. 充分体现和体会函数在程序设计中的必要性和实用性,并反映主函数main()在程序 设计中的实现思路和方法。 2. 课程设计要求 制作一个通讯录系统。 (1)该程序具有查找、添加、修改、删除功能。 (2)通讯录包括:、、街道、城市、省、邮编等。 二、总体设计 根据系统的要求,系统总体设计如图1所示。 图 三、详细设计 1、数据结构设计 #include<stdio.h> /*标准输入输出函数库*/ #include<stdlib.h> /*标准函数库*/ #include<string.h> /*字符串函数库*/ #define FILENAME "phone.dat" struct date //定义一个结构体类型数组 { char name[10]; /**/ char phone[12]; /**/ char email[20]; /**/ char QQ[20]; /*QQ*/ }per[10]; int menu() //主菜单选择函数 2.函数说明 (1) 主函数 main()允许用户通过菜单进行功能选择,使用相应的功能代码来调用对应的函数功能。 (2) 其他各功能函数包括 "函数名 "功能 " "int Input(struct date "输入记录 " "per[10],int n) " " "void "信息查询 " "Query_a_record(struct " " "date per[10],int n) " " "void Display(struct date "信息展示 " "per[10],int n) " " "void writeToFile(struct "记录保存为文件 " "date per[10],int n) " " "int "信息删除 " "Delete_a_record(struct " " "date per[10],int n) " " "int menu_select(); "主菜单函数 " " " " " " " " "修改信息 " "void Change(struct date " " "per[10],int n) " " "void WritetoText(struct "信息增加 " "date per[10],int n) " " 四、程序清单 1、头文件 #include<stdio.h> /*标准输入输出函数库*/ #include<stdlib.h> /*标准函数库*/ #include<string.h> /*字符串函数库*/ #define FILENAME "phone.dat" 2、主函数 void main() //主函数 { int n=0,i; while(1) { switch (menu()) {case 1: { printf("\n\t 通讯信息录入\n"); //信息录入 n=Input(per, n); } break; case 2: printf("\n\t\t\t 通讯录记录表\n"); //显示记录 Display(per,n); break; case 3: printf("\n\t保存功能\n"); WritetoText(per,n); //保存数据 printf("\t"); system("pause"); //操作完成后进行暂停 break; case 4: printf("\n\t从通讯录中删除记录\n"); n=Delete_a_record(per,n); //删除记录 printf("\t"); system("pause"); break; case 5: printf("\n\t修改通讯录中的记录\n"); Change(per,n); //修改数据 printf("\t"); system("pause"); break; case 6: printf("\n\t添加记录到通讯录\n"); //添加记录 n=Input(per,n); break; case 7: printf("\n\t在通讯录中查找记录\n"); Query_a_record(per,n); //查找记录 printf("\t"); system("pause"); //从程序里调用"pause"命令 break; case 0: printf("\n\t\t使用,再见!\n"); //结束程序 printf("\n\t\t"); system("pause"); exit(0); } 五、总程序和分工执行结果 #include<stdio.h
Java个人通讯录系统可以通过定义一个`Contract`类来实现。该类可以包含成员变量(属性)和成员方法来管理通讯录的联系人信息。 以下是一个简单的Java个人通讯录系统的示例: ```java public class Contract { private String name; private String phoneNumber; private String email; // 构造方法 public Contract(String name, String phoneNumber, String email) { this.name = name; this.phoneNumber = phoneNumber; this.email = email; } // 获取联系人姓名 public String getName() { return name; } // 获取联系人电话号码 public String getPhoneNumber() { return phoneNumber; } // 获取联系人邮箱 public String getEmail() { return email; } // 修改联系人电话号码 public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } // 修改联系人邮箱 public void setEmail(String email) { this.email = email; } // 打印联系人信息 public void printInfo() { System.out.println("姓名:" + name); System.out.println("电话号码:" + phoneNumber); System.out.println("邮箱:" + email); } } ``` 在上述示例中,`Contract`类包含了姓名、电话号码和邮箱三个属性,以及相应的获取和修改属性的方法。还有一个`printInfo()`方法用于打印联系人的信息。 你可以使用该类来创建和管理个人通讯录系统中的联系人信息。例如: ```java public class Main { public static void main(String[] args) { // 创建联系人对象 Contract contact = new Contract("张三", "123456789", "zhangsan@example.com"); // 打印联系人信息 contact.printInfo(); // 修改电话号码 contact.setPhoneNumber("987654321"); // 打印修改后的联系人信息 contact.printInfo(); } } ``` 运行上述代码,将输出以下结果: ``` 姓名:张三 电话号码:123456789 邮箱:zhangsan@example.com 姓名:张三 电话号码:987654321 邮箱:zhangsan@example.com ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Redamancy_WC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值