1、32一、 问题及功能分析需求分析功能需求:1、 提供身份验证:能否使用该系统。2、 提供用户注册及修改密码功能。3、提供对同学通讯信息的增加、删除、修改和查询功能。4、查询功能要求:能实现根据学号、姓名的精确查询,也能对地区的模糊查询,比如:查询“广州市天河区”,能列出所有家在广州市天河区的同学信息。性能需求:1、 操作界面美观、友好。 2、 通讯录采用MySQL数据库再用JDBC连接。系统功能结构 经过需求分析,此班级通讯录主要包括用户的注册登录模块和对联系人的信息管理模块,系统结构如图班级通讯录管理系统联系人信息管理注册登录添加联系人修改联系人资料查询联系人信息联系人照片管理显示联系人信息
2、注册新用户修改登录密码用户登录系统结构图目录结构该软件主要的实体有用户、联系人和照片,下面介绍各实体的E-R图,通过E-R图来了解实体属性,这里主要介绍联系人和联系人照片的E-R图。 数据库表的设计本软件共建了三张表:用户表、联系人表和照片表。联系人表字段名称 数据类型 字段大小 是否主键 说明 Pid 文本 20 是 联系人编号 pname 文本 20 否 联系人姓名 pgender 文本 4 否 性别 pbirthday文本 20 否 生日pnumber 文本 12 否 联系电话 pQQ文本20否QQ号码pemail 文本 20 否 电子邮件 padress 文本 50 否 联系地址 pp
3、hoto OLE 对象 N/A 否 照片 Uid 文本 20 否 所属用户 照片表字段名称 数据类型 字段大小 是否主键 说明 pid 文本 2 否 所属联系人 photoname 文本 50 是 照片名称 photo OLE 对象 N/A 否 照片数据 用户表字段名称 数据类型 字段大小 是否主键 说明 uid 文本 20 是 用户登录名 pwd 文本 20 否 登录密码 二、 概要设计1、 构建开发环境开发此通讯录所用到的软件环境l JDK 1.7版本l MySQL 5.5l Navicat Premium 数据库可视化工具l Myeclipse开发工具2、 图形用户界面构成l 登录模块用
4、户名、密码两个JLabel ,登录、注册、修改密码按钮JButton ,输入用户名、密码的文本框。如图 l 联系人信息管理模块界面上部分是实现查询功能的组件,中间部分是信息显示组件,下面部分是查询返回的JTable列表。如图三、 详细设计1、 登录界面的搭建login.java运用了PS设计一些icon以及页面布局方法,实现了登录界面的美化。(详细代码请看工程文件夹下文件login.java)3、 登录窗口功能的实现login.java、DButil.java提供了登录校验方法,包括账号密码合法性、修改密码、注册等。(详细代码请看工程文件夹下文件login.java、 DButil.java)
5、4、 主窗体的搭建及功能MainFrame.java窗体界面布局,各个事件的监听以及实现。如:查询操作。(详细代码请看工程文件夹下文件MainFrame.java)5、 登录窗体及联系人信息管理窗体所用到的数据库操作方法DButil.java定义各种数据库操作方法。如:登录验证、注册、查询、插入等。(详细代码请看工程文件夹下文件DButil.java)2、 登录界面的搭建3、 package Frame;4、 import java.awt.*;5、 import java.awt.event.ActionEvent;6、 import java.awt.event.ActionListene
6、r;7、 import java.sql.*;8、 import javax.swing.*;9、 import db.DButil;10、 public class login extends JFrame implements ActionListener11、 private JPanel jp=new JPanel(); 12、 /创建标签数组13、 private JLabel jlArray=new JLabel(用户名), new JLabel(密 码),new JLabel();14、 15、 private JButton jb1;16、 private JButton jb
7、2;17、 private JButton jb3;18、 private JTextField jtf=new JTextField(); 19、 private JPasswordField jpf=new JPasswordField(); 20、 21、 /布局构造实现方法22、 23、 public login()24、 Icon icon1=new ImageIcon(login.jpg);25、 Icon icon2=new ImageIcon(reset.jpg);26、 Icon icon3=new ImageIcon(zhuce.jpg);27、 28、 JPanel jp
8、=new JPanel()29、 protected void paintComponent(Graphics g) 30、 ImageIcon icon = new ImageIcon(bg.jpg); 31、 Image img = icon.getImage(); 32、 g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver(); 33、 ;34、 jp.setLayout(null);35、 jb1=new JButton(icon1);36、 jb2=new JB
9、utton(icon3);37、 jb3=new JButton(icon2);38、 jlArray0.setBounds(70,120,90,32);39、 jb1.setBounds(365,110,130,60);40、 jb2.setBounds(365,170,130,60);41、 jlArray1.setBounds(70,170,90,32);42、 /将标签与按钮添加到JPanel容器中43、 jp.add(jlArray0);44、 jp.add(jlArray1);45、 jp.add(jb1);46、 jp.add(jb2);47、 jb1.addActionList
10、ener(this);48、 jb2.addActionListener(this);/为按钮注册动作事件监听器49、 /添加修改密码的按钮50、 jb3.setBounds(365,230,130,60);51、 jp.add(jb3);52、 jp.add(jtf);53、 jtf.setBounds(140,120,180,30);/设置文本框位置54、 jp.add(jpf);55、 jpf.setBounds(140,170,180,30);/设置密码框位置56、 jpf.setEchoChar(*); /密码显示字符形式57、 jpf.addActionListener(this)
11、;/为密码框注册动作事件监听器58、 this.setVisible(true);/设置窗体的可见性59、 jpf.addActionListener(this);/为密码框注册动作事件监听器60、 /设置用于显示登陆状态的标签大小位置,并将其添加进JPanel容器61、 jlArray2.setBounds(70,220,300,30);62、 jp.add(jlArray2);63、 this.setTitle(登陆);/设置窗体标题64、 this.setBounds(450,200,500,318);/设置窗体的大小65、 this.setResizable(false);/设置窗体不
12、让用户调整大小66、 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);67、 this.setVisible(true);/设置窗体的可见性68、 this.add(jp);/将窗体添加到面板中69、 jp.setBackground(Color.blue);70、 71、 public static void main(String args) 72、 new login();/创建登陆窗体 73、 6、 登录窗口功能的实现public void actionPerformed(ActionEvent e) / TODO Auto
13、-generated method stub/得到用户名与密码String user=jtf.getText().trim();String pwd=String.valueOf(jpf.getPassword();/返回密码的字符串表示方式 String sql=; if(e.getSource()=jtf)/事件源为文本框,切换焦点到密码框 jpf.requestFocus(); else if(e.getSource()=jb1|e.getSource()=jpf) /判断用户名和密码是否匹配 查询数据库 if(DButil.check(user, pwd) /登陆成功 MainFram
14、e mf=new MainFrame(jtf.getText();/主窗体 this.dispose(); else /登陆失败 jlArray2.setText(对不起,非法的用户名和密码); this.clear(); else if(e.getSource()=jb2)/事件源为注册按钮if(user.equals()|pwd.equals()/如果注册的用户名为空或者密码为空jlArray2.setText(用户名和密码都不得为空!);this.clear();/清空输入文本框else sql=select uid from user where uid=+user+;if(DButi
15、l.isExist(sql)/用户名已经存在jlArray2.setText(对不起,用户名已存在!);this.clear();/清空输入文本框elsesql=insert into user values(+user+,+pwd+);if(DButil.update(sql)0)/注册成功jlArray2.setText(恭喜您!注册成功,请登陆);else if(e.getSource()=jb3)/修改密码的监听/判断是否已经输入用户名和密码if(user.equals()|pwd.equals()jlArray2.setText(修改密码先输入正确的用户名和密码!);this.cle
16、ar();/清空输入文本框/判断是否输入了正确的用户名和密码else if(DButil.check(user,pwd)/正确的用户名和密码String password=JOptionPane.showInputDialog(this,修改密码:,请输入新密码,JOptionPane.PLAIN_MESSAGE);/得到新的密码为空if(password=null|password.equals()JOptionPane.showMessageDialog(this,密码不得为空!,错误,JOptionPane.WARNING_MESSAGE);else/密码不为空sql=update us
17、er set pwd=+password+ where uid=+user+;/更新密码的SQLif(DButil.update(sql)0)/密码修改成功this.clear();/清空输入文本框jlArray2.setText(恭喜您!密码修改成功,请用新密码登陆);elseJOptionPane.showMessageDialog(this,用户名或者密码错误!,错误,JOptionPane.WARNING_MESSAGE);this.clear();/清空输入文本框7、 主窗体的搭建及功能package Frame;import javax.swing.*;import javax.s
18、wing.table.DefaultTableModel;import db.DButil;import java.awt.*;import java.awt.event.*;import java.sql.*;import java.io.*;import java.util.*;public class MainFrame extends JFrame implements ActionListener,ItemListener private String uname=null;/当前用户的名字private boolean isInsert=false;/是否为添加默认为否privat
19、e JPanel topjp=new JPanel();/界面上半部分的JPanel容器private JButton jba=new JButton(模糊查询);private JButton jbs=new JButton(查找);private JTextField jtfs=new JTextField();/按给出信息查找联系人信息private JRadioButton jrbxm=new JRadioButton(按姓名查找,true);private JRadioButton jrbbh=new JRadioButton(按学号查找,false);private ButtonG
20、roup bg=new ButtonGroup();/单选按钮组private JPanel jpbr=new JPanel();/单选按钮面板private JPanel jpyInfo=new JPanel();/右侧显示个人信息的面板private JTextArea jta=new JTextArea();/ 模糊查询得到的信息文本区private JLabel jlInfo=new JLabel(学号:),new JLabel(姓名:), new JLabel(性别:),new JLabel(出生日期:), new JLabel(电话号码:),new JLabel(QQ:), new
21、 JLabel(Email:),new JLabel(地址:), new JLabel(添加相片);private JButton jbInfo=new JButton(编辑),new JButton(保存), new JButton(浏览), new JButton(上传),;private JLabel jlPhoto=new JLabel();/显示图像的JLabel控件private JTextField jtfInfo=new JTextField10;private JTextField jtfPhoto=new JTextField();/添加照片到相册的路径private JF
22、ileChooser jfcPic=new JFileChooser();/上传图像的文件选择器private DefaultTableModel tableModel;private JTable table;/性别部分private JRadioButton jrbMale=new JRadioButton(男,true);private JRadioButton jrbFemale=new JRadioButton(女);private ButtonGroup bgGender=new ButtonGroup();private JPanel jpGender=new JPanel();
23、/单选按钮面板private JLabel jlDetail=new JLabel();/右侧显示一幅图片的标签private JSplitPane jspOuter=/上下分割的JSplitPanenew JSplitPane(JSplitPane.VERTICAL_SPLIT,true);/系统托盘部分private PopupMenu popup=new PopupMenu();private SystemTray tray;/定义SystemTray成员变量private TrayIcon trayIcon;/定义TrayIcon成员变量private MenuItem exit=ne
24、w MenuItem(退出程序);/定义菜单public void initJps()/界面上半部分的初始化topjp.setLayout(null);/设置topjp布局管理器为null/设置按钮大小并添加到JPanel面板里jba.setBounds(5,10,120,26);jba.addActionListener(this);/为模糊查询按钮注册事件监听器topjp.add(jba);jbs.setBounds(130,10,80,26);jbs.addActionListener(this);/为查找按钮注册事件监听器topjp.add(jbs);/添加按钮到topjp面板里/设置
25、jtfs文本框大小并添加到jps面板里jtfs.setBounds(215,10,120,26);jtfs.addActionListener(this);/为文本框注册事件监听器topjp.add(jtfs);/设置单选按钮大小和位置并添加到jpbr面板里同时添加到bg单选按钮组里jrbxm.setBounds(5,3,50,26);jrbxm.addItemListener(this);/为单选按钮注册ItemEvent事件监听器bg.add(jrbxm);jpbr.add(jrbxm);jrbbh.setBounds(60,3,50,26);jrbbh.addItemListener(t
26、his);bg.add(jrbbh);jpbr.add(jrbbh);jpbr.setBounds(360,10,200,26);topjp.add(jpbr);public void initInfo()/初始化信息界面jpyInfo.setLayout(null);/设置布局管理器为空jpyInfo.setBounds(50,50,380,360);/设置信息面板的大小和位置jlPhoto.setBounds(220,10,150,170);/设置联系人图像JLabel的大小和位置jlPhoto.setBorder(BorderFactory.createLineBorder(Color.
27、BLACK);/将JLbel的边框线显现出来jpyInfo.add(jlPhoto);/将显示联系人照片的JLabel添加到信息面板tableModel=new DefaultTableModel();Vector vector1 = new Vector();DButil db = new DButil();vector1.add(学号);vector1.add(姓名);vector1.add(性别);vector1.add(出生日期);vector1.add(电话号码);vector1.add(QQ);vector1.add(Email);vector1.add(地址);vector1.a
28、dd(照片路径); tableModel.setDataVector(null, vector1); System.out.print(123); table=new JTable(tableModel); /table.addMouseListener(MouseListener) this); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);JScrollPane js=new JScrollPane(table);/添加相片部分的控件jtfPhoto.setBounds(80,250,200,26);/设置得到照片路径的文本框的大小和位置j
29、pyInfo.add(jtfPhoto);/将得到照片路径的文本框添加到信息面板jbInfo2.setBounds(285,250,80,26);jbInfo2.addActionListener(this);/为添加照片的浏览按钮注册事件监听器jpyInfo.add(jbInfo2);/上传按钮jbInfo3.setBounds(380,250,80,26);jbInfo3.addActionListener(this);/为添加照片的浏览按钮注册事件监听器jpyInfo.add(jbInfo3);for(int i=0;i9;i+)/添加JLabel,并设置大小和位置jlInfoi.set
30、Bounds(20,10+i*30,60,26);jpyInfo.add(jlInfoi);for(int i=0;i10;i+)/初始化一些文本框jtfInfoi=new JTextField();/学号jtfInfo0.setBounds(80,10,135,26);jpyInfo.add(jtfInfo0);/姓名jtfInfo1.setBounds(80,40,135,26);jpyInfo.add(jtfInfo1);/出生日期jtfInfo3.setBounds(80,100,135,26);jpyInfo.add(jtfInfo3);/电话号码jtfInfo4.setBounds
31、(80,130,135,26);jpyInfo.add(jtfInfo4);/QQjtfInfo5.setBounds(80,160,135,26);jpyInfo.add(jtfInfo5);/EmailjtfInfo6.setBounds(80,190,135,26);jpyInfo.add(jtfInfo6);/地址文本框的添加jtfInfo7.setBounds(80,220,285,26);jpyInfo.add(jtfInfo7);/模糊查询信息文本区的添加js.setBounds(0,350,600,100);jpyInfo.add(js);/编辑、保存按钮jbInfo0.set
32、Bounds(160,300,80,26);jbInfo0.addActionListener(this);jpyInfo.add(jbInfo0);jbInfo1.setBounds(260,300,80,26);jbInfo1.addActionListener(this);jpyInfo.add(jbInfo1);/性别部分jrbMale.setBounds(5,3,50,26);jrbMale.addItemListener(this);/为单选按钮注册ItemEvent事件监听器bgGender.add(jrbMale);jpGender.add(jrbMale);jrbFemale
33、.setBounds(60,3,50,26);jrbFemale.addItemListener(this);/为单选按钮注册ItemEvent事件监听器bgGender.add(jrbFemale);jpGender.add(jrbFemale);jpGender.setBounds(60,70,125,26);jpyInfo.add(jpGender);public void clearInfo()/清空信息面板for(int i=0;i10;i+)jtfInfoi.setText();/清空文本框jlPhoto.setIcon(null);/清空图像public void setjtaA
34、rea(String information)if(information.isEmpty()JOptionPane.showMessageDialog(this,所查用户不存在!,错误,JOptionPane.WARNING_MESSAGE);else jta.setText(information);public void setInfo(Vector pInfo)/将信息向量设置到信息面板中/将信息向量按规则填到信息面板里this.clearInfo();if(pInfo.size()=0)JOptionPane.showMessageDialog(this,所查用户不存在!,错误,JO
35、ptionPane.WARNING_MESSAGE);elsefor(int i=0;i2;i+)/显示联系人编号和姓名jtfInfoi.setText(pInfo.get(i);if(pInfo.get(2).equals(男)/显示性别jrbMale.setSelected(true);else/显示性别jrbFemale.setSelected(true);for(int i=3;i9;i+)/显示出生日期、电话号码和QQjtfInfoi.setText(pInfo.get(i);public Vector getInfo()/从信息面板得到用户输入的信息Vector pInfo=new
36、 Vector();pInfo.add(jtfInfo0.getText().trim();/添加pidpInfo.add(jtfInfo1.getText().trim();/添加pnameString gender=jrbMale.isSelected()?男:女;pInfo.add(gender);/添加性别pInfo.add(jtfInfo3.getText().trim();/出生日期pInfo.add(jtfInfo4.getText().trim();/电话号码pInfo.add(jtfInfo5.getText().trim();/QQpInfo.add(jtfInfo6.ge
37、tText().trim();/EmailpInfo.add(jtfInfo7.getText().trim();/地址String photoPath=jtfPhoto.getText().trim();/得到照片路径pInfo.add(photoPath);/照片路径return pInfo;public void monitorSaveButton() /监听保存按钮的方法 String sql=;String pid=jtfInfo0.getText().trim();/得到联系人的编号String pname=jtfInfo1.getText().trim();/得到联系人的姓名St
38、ring gender=jrbMale.isSelected()?男:女;String s1=jtfInfo3.getText().trim();String s2=jtfInfo4.getText().trim();String s3=jtfInfo5.getText().trim();String s4=jtfInfo6.getText().trim();String s5=jtfInfo7.getText().trim();String s6=jtfPhoto.getText().trim();String sqla=select * from contacts where pid=+p
39、id+;/判断此编号是否存在的SQLString sqlb=select * from contacts where pname=+pname+;/判断此姓名是否存在的SQLboolean isIdExist=DButil.isExist(sqla);/得到编号是否存在boolean isNameExist=DButil.isExist(sqlb);/得到姓名是否存在if(!(pid.equals( )|pname.equals( ) if(isIdExist|isNameExist) JOptionPane.showMessageDialog(this,联系人已存在+ , 添加联系人失败,错误,JOptionPane.WARNING_MESSAGE);