讯时个人通讯录实训项目报告书 精品.docx
《讯时个人通讯录实训项目报告书 精品.docx》由会员分享,可在线阅读,更多相关《讯时个人通讯录实训项目报告书 精品.docx(31页珍藏版)》请在冰点文库上搜索。
讯时个人通讯录实训项目报告书精品
实训项目报告书
项目名称讯时个人通讯录
年级班级2010级计101—4
项目完成人杨俊南
实训时间:
2011年12月12日至2011年12月31日
填表说明
一、本表由项目完成人填写,一式一份;
二、实训结束前将填好的文稿打印后交实训指导教师进行鉴定和评定成绩,确认后的文档交院校存档保存;
三、此表电子文档及学生项目实训的作品须打包存档,压缩文件包以学生学号命名,以班为单位收集,刻录光盘交院校存档;
实训项目名称
讯时个人通讯录
项目组成员及其分工
姓名
分工情况
承担的主要工作
杨俊南
Java2D、Swing、Access
用户的注册、登录、删除等功能、联系人信息的增、删、改、查等功能、联系人分组的添加、删除功能、联系人相册管理功能、联系人头像的上传功能、界面的开发及数据库管理的设计开发
一、项目背景、目的及可行性分析
1.项目背景
现代人的生活节奏日益加快,各种联系人也不断增多,如上司、同事、家人、朋友和同学等,但很大一部分人还是在使用普通的纸质通讯录来记录这些联系人的信息,存在如下缺陷:
(1)存储信息量少,查找不方便。
(2)信息容易丢失,且不能存放照片。
(3)安全性不高,没有隐私性可言。
为了解决上述缺陷,满足部分人的使用需求,开发出此单机版个人通讯录软件。
2.项目目的
为解决普通纸质通讯录的上述缺陷,现在开发一个能够大量存储信息,且易查找不易丢失信息的安全、方便、快捷的讯时个人通讯录。
3.项目可行性分析:
(1)技术可行性
讯时个人通讯录是一款应用性很强的通讯记录软件。
完成该项目覆盖
的技能点有:
GUI中基本组件的运用及其对应的事件监听器的处理、树状列表控件与数据库的结合使用、系统托盘的使用及其异常处理。
我在接到项目后,对项目进行了仔细的分析并作出了慎重的决定,由于已学习过了java,并掌握了其基础知识,且对数据库有一定的了解,且曾经有过项目的开发经验,因此具有开发此软件的基本能力。
该软件无特别复杂的功能,因此在技术上是可行的。
(2)人员可行性
本人具有一定的java基础技术,具有从网络、老师及同学等渠道的学习能力,具有坚韧执着、不怕苦难的学习态度,具有能够完成的能力。
(3)软件工作量
此软件的软件工作量适中,涉及的功能模块复杂度、难度适中。
(4)代码工作量
代码量总体来讲比较适中,涉及的java类不是很多,其中登陆界面和主界面的构造器代码工作量比较大。
(5)整体进度
整体进度比较顺利,其中前期登陆界面和主界面的设计比较复杂及在数据库的设计理解上存在难度,使用了很多时间,后期各功能模块的实现用时适中。
整个软件项目整体用时近两个星期,得以完成。
二、项目概述
讯时通讯录软件是一款应用性很强的通讯通讯记录软件。
软件中用户使用软件拥有自己的密码,确保通讯录资料的安全性;联系人资料丰富包括性别、电话、手机、电子邮箱、联系地址等;且用户可以添加联系人分组;可以编辑联系人信息;可以设置联系人头像、添加联系人相册等等。
功能介绍如下:
(1)注册/登陆/修改密码/删除用户
用户需注册一个账号才能拥有该软件的使用权,用户注册后,输入用户名和密码进行校验。
校验通过进入功能菜单,并且记录相应登录信息;未通过则提示非法用户或密码,需重新输入。
用户还可以修改原来的密码,修改后重新登陆需用新密码,确保了用户使用的安全性。
用户还可以删除原有的所有的联系人即该用户可以将自己从通讯录用户系统中清除。
(2)添加/查找联系人
用户可以添加联系人的编号、姓名、性别、电话、手机、邮箱、相册和设置联系人头像及所在分组等,且添加后联系人信息还可以再编辑保存,当联系人比较多时,用户可以选择是使用编号查找还是姓名查找,当联系人中有要查找的对象时显示该联系人,当没有该联系人时显示不存在该联系人,使查找联系人更方便快捷。
(3)上传/删除照片
用户可以选择从本地上传联系人的头像,更改联系人的头像,可以选择从本地上传联系人相册,更改删除联系人相册,更改保存后显示该联系人的头像,且排列显示联系人的相册。
(4)相册预览/相片明细
用户上传的联系人相片行列排列显示在相册列表里,当鼠标滑到相片上时显示相片的名称,点击相片可放大预览相片的明细。
(5)树状列表导航
主功能界面右侧采用树状列表导航的布局,双击结点可打开关闭结点的分支内容,使界面内容预览更加直观方便。
(6)系统托盘及退出
软件运行时会在屏幕右下角产生一个系统托盘,当点击主功能的界面的关闭时,软件并不是完全退出,双击系统托盘可以快捷显示主功能界面,右击系统托盘会出现用户名、关于开发者信息和能够实现完全退出的功能。
人员分配
此项目由一人在两个星期内完成,所有技能点均由自己自足学习完成,所有任务功能点均由一人完成。
3、相关技术路线
(1)数据库连接
publicclassDButil{
privatestaticStringdriver="sun.jdbc.odbc.JdbcOdbcDriver";//声明数据库连接字符串
privatestaticStringurl="jdbc:
odbc:
driver={MicrosoftAccessDriver(*.mdb)};DBQ=db/linkman.mdb";
privatestaticConnectioncon=null;//声明数据库连接对象引用
privatestaticjava.sql.Statementstat=null;//声明语句对象引用
privatestaticPreparedStatementpsInsert=null;//声明预编译语句对象引用
privatestaticResultSetrs=null;//声明结果集对象引用
publicstaticConnectiongetConnection(){}
publicstaticvoidcloseCon(){}
}
(2)登陆
publicclassLoginextendsJFrameimplementsActionListener{
publicLogin(){}
publicvoidclear(){}
publicvoidactionPerformed(ActionEvente){}
publicstaticvoidmain(String[]args){}
}
(3)系统托盘
publicclassTrayimplementsActionListener{
publicTray(Stringname){
if(SystemTray.isSupported()){
trayIcon.addActionListener(this);
}
}
publicstaticvoidmain(String[]args){
newTray("junowin");
}
publicvoidactionPerformed(ActionEvente){}
}
(4)树结点
publicclassTreeextendsJFrame{
publicTree(){}
publicstaticvoidmain(String[]args){}
}
四、详细设计
1.系统结构:
2.数据库设计:
3.类图设计:
部分代码:
publicclassLoginextendsJFrameimplementsActionListener{
privateJFramejf=newJFrame();
privateContainerct=jf.getContentPane();
privateImageIconloginbg=newImageIcon("image/loginbg.jpg");
privateImagelogobg=Toolkit.getDefaultToolkit().getImage("image/logobg.png");
privateImagelogo=Toolkit.getDefaultToolkit().getImage("image/logo.png");
privateIconiconlgbg=newImageIcon(logobg);
privateIconiconlg=newImageIcon(logobg);
privateJLabeljlbg=newJLabel(loginbg);
privateJLabeljllg=newJLabel();
privateJLabel[]jlArray={//创建标签数组
newJLabel("用户名"),
newJLabel("密码"),
newJLabel("")};
privateJButton[]jbArray={//创建按钮数组
newJButton("登录"),
newJButton("注册"),
newJButton("修改密码"),
newJButton("删除用户")};
privateJTextFieldjtf=newJTextField();//填写用户名的文本框
privateJPasswordFieldjpf=newJPasswordField();//填写密码的文本框
publicLogin(){
jf.setTitle("登录");
jf.setIconImage(logo);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setResizable(false);
jf.setBounds(500,300,300,250);
jf.setVisible(true);
jf.getLayeredPane().add(jlbg,newInteger(Integer.MIN_VALUE));
jlbg.setBounds(0,0,300,250);
((JPanel)ct).setOpaque(false);
ct.setLayout(null);
jllg.setIcon(iconlgbg);
jllg.setBounds(30,20,60,80);
ct.add(jllg);
//用户名、密码、登录、注册
for(inti=0;i<2;i++)
{
jlArray[i].setBounds(100,20+i*50,80,26);
jbArray[i].setBounds(50+i*110,120,90,26);
ct.add(jlArray[i]);
ct.add(jbArray[i]);
jbArray[i].addActionListener(this);
}
//修改、删除
for(inti=0;i<2;i++)
{
jbArray[i+2].setBounds(50+i*110,160,90,26);
ct.add(jbArray[i+2]);
jbArray[i+2].addActionListener(this);
}
jtf.setBounds(150,20,120,30);
ct.add(jtf);
jtf.addActionListener(this);
jpf.setBounds(150,70,120,30);
ct.add(jpf);
jpf.setEchoChar('●');//设置密码的回显字符
jpf.addActionListener(this);
jlArray[2].setBounds(10,190,300,30);
ct.add(jlArray[2]);
}
publicvoidclear(){//清空输入框信息,输入焦点改为用户名框
jtf.setText("");
jpf.setText("");
jtf.requestFocus();
}
publicvoidactionPerformed(ActionEvente){
//得到用户名和密码
Stringuser=jtf.getText().trim();
Stringpwd=String.valueOf(jpf.getPassword());
Stringsql="";
if(e.getSource()==jtf){//用户名到密码的焦点切换
jpf.requestFocus();
}
elseif(e.getSource()==jbArray[0]||e.getSource()==jpf){//登陆判断
if(DButil.check(user,pwd)){
MainFrameminf=newMainFrame(jtf.getText());//进主窗体
this.dispose();//释放登陆窗体
}
else{
jlArray[2].setText(""+
"对不起,非法的用户名和密码!
");
this.clear();
}
}
elseif(e.getSource()==jbArray[1]){//注册判断
if(user.equals("")||pwd.equals("")){
jlArray[2].setText(""+
"对不起,用户名或密码不能为空!
");
this.clear();
}
else{
sql="selectuidfromuserwhereuid='"+user+"'";
if(DButil.isExist(sql)){//用户名已经存在
jlArray[2].setText(""+
"对不起,该用户名已经存在!
");
this.clear();
}
else{
sql="insertintouservalues('"+user+"','"+pwd+"')";
if(DButil.update(sql)>0){
jlArray[2].setText(""+
"恭喜您,注册成功!
");
}
}
}
}
elseif(e.getSource()==jbArray[2]){//修改密码
if(user.equals("")||pwd.equals("")){
jlArray[2].setText(""+
"修改密码前请先确认输入正确的用户名和密码!
");
this.clear();
}
elseif(DButil.check(user,pwd)){
Stringpassword=JOptionPane.showInputDialog(this,"修改密码",
"请输入新密码,并确认!
",JOptionPane.PLAIN_MESSAGE);
if(password==null||password.equals("")){
JOptionPane.showMessageDialog(this,"密码不能为空哦",
"出错啦!
",JOptionPane.WARNING_MESSAGE);
}
else{//更新密码的SQL
sql="updateusersetpwd='"+password+"'whereuid='"+user+"'";//更新密码的SQL
if(DButil.update(sql)>0){
this.clear();
jlArray[2].setText(""+
"恭喜您,密码修改成功!
请用新密码登录!
");
}
}
}
else{
JOptionPane.showMessageDialog(this,"用户名和密码不匹配啊!
",
"出错啦!
",JOptionPane.WARNING_MESSAGE);
this.clear();
}
}
elseif(e.getSource()==jbArray[3]){//删除用户
if(DButil.check(user,pwd)){
intyn=JOptionPane.showConfirmDialog(this,"真的要删除该用户吗?
",
"删除!
",JOptionPane.YES_NO_OPTION);
if(yn==JOptionPane.YES_OPTION){
intcount=DButil.delUser(user);
jlArray[2].setText("用户"+user+"删除成功"+"共删除了"+count+"个联系人");
this.clear();
}
}
else{
jlArray[2].setText(""+
"对不起,密码和用户名不匹配!
");
this.clear();
}
}
}
publicstaticvoidmain(String[]args)
{
newLogin();
}
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==jba){//“添加”联系人
this.isInsert=true;
this.clearInfo();//清空信息面板
cl.show(jpy,"Info");//显示信息面板
this.setEditable(true);
}
elseif(e.getSource()==jbs||e.getSource()==jtfs){//“查找”联系人
this.monitorSearchButton();
}
elseif(e.getSource()==jbInfo[4]){//“添加分组”
this.monitorAddGroupButton();
}
elseif(e.getSource()==jbInfo[5]){//“删除分组”
this.monitorDelGroupButton();
}
elseif(e.getSource()==jbInfo[3]){//更改照片“浏览”路径
jfcPic.showOpenDialog(this);
if(jfcPic.getSelectedFile()!
=null){
jtfInfo[7].setText(""+jfcPic.getSelectedFile());
}
}
elseif(e.getSource()==jbInfo[6]){//添加照片“浏览”路径
jfcPho.showOpenDialog(this);
if(jfcPho.getSelectedFile()!
=null){
jtfPhoto.setText(""+jfcPho.getSelectedFile());
}
}
elseif(e.getSource()==jbInfo[2]){//“删除”
this.monitorDelButton();
}
elseif(e.getSource()==jbInfo[1]){//“保存”
this.monitorSaveButton();
}
elseif(e.getSource()==jbInfo[0]){//“编辑”
this.isInsert=false;
this.setEditable(true);
this.perNameBefor=jtfInfo[1].getText().trim();
this.perGroupBefor=(String)jcb.getSelectedItem();
}
elseif(e.getSource()==jbInfo[7]){//“上传”
this.monitorUploadButton();
}
elseif(e.getSource()==jbInfo[8]){//“删除”
this.delPhoNode(jtfPhoto.getText().trim());
}
elseif(e.getSource()==trayIcon){//双击托盘,显示窗口
this.show(true);
}
elseif(e.getSource()==currently){//显示当前登陆的用户信息
trayIcon.displayMessage("信息","当前登录用户为"+uname,
TrayIcon.MessageType.INFO);
}
elseif(e.getSource()==about){//关于
JOptionPane.showMessageDialog(this,"此软件来自于junowin,欢迎您的使用",
"关于",JOptionPane.I