软件项目总结报告
软件项目总结报告范文
1引言
1.1编写目的
XXX公司业务管理系统的开发已经基本完成。写此项目开发总结报告,以方便我们在以后的项目开发中来更好的实施项目的订制开发;让我在今后的项目开发中有更多的有据的资料来规范我们的开发过程和提高我们的开发效率,从而创造更多公司效益。
1.2背景
项目名称:XXX业务管理系统
软件名称:XXX业务系统
客户:XXX
用户:XXX员工
1.3参考资料项目开发文档:
1.软件开发数据模型:PDM_OperationSystem201*0831.pdm
2.数据库开发文档:XXX业务管理系统数据库设计说明书2.0.doc
3.软件业务流程参考:XXX业务管理系统流程说明.doc
4.软件使用手册参考:XXX业务管理系统功能说明3.0.doc
5.软件业务流程参考:XXX业务管理系统流程说明.doc
6.软件中使用到的第三方控件:ComponentArtWeb.UI201*.1252forasp.net2.0.rar
7.软件中使用的安全Ikey驱动:IkeyDriver.rar以上参考资料是截止201*-08-31是最新的资料文档。如有修改,即使修改此处的参考文档名称。
2开发工作评价
2.1对生产效率的评价
1.系统开发已历时快1年的时间了
2.开发的反复性比较多。
3.对客户的需求理解不是很透彻。综合以上,此项目的开发效率不是很高,相反有相当一定时间的浪费。
2.2对产品功能的评价
经过我们公司各位同事的共同努力协作,XXX业务管理系统已经很好的完成了客户的业务流需求。经过对客户使用过程的观察,此项目开发的还是比较成功,但是还是存在着一些问题,造成这些问题的原因是多方面的。如:前期系统数据库的设计缺陷和部分代码的构建缺陷、客户需求的理解上也存在一定问题,这就需要我们用一定的时间来维护客户使用过程中提出的新问题和存在的debug。总的来说,此系统的功能开发还是一个比较成功的案例。
2.3对技术方法的总结
在此项目中使用到技术和工具:
1.使用代码生成器:使用代码生成器[动软.Net代码自动生成器],此工具在很大程度上提高了编码效率,从而加快了项目的开发进程。在以后的项目中,我们要尽量的来使用一些类似的工具来在最短的时间内完成工作。在今后的项目开发中,我们最好是能开发出适合自己的代码生成工具,更大限度的节省开发周期和开发费用。
2.使用数据库建模工具;PowerDesigner工具来建立系统数据库模型,以方便程序员很好的理解业务流和掌握系统架构者的架构思想,更好的满足客户的功能需求。在今后的项目开发中,我们要更好的来完成系统的前期数据库模型的建立,最大的来优化系统功能。
3.使用第三方控件:此系统中使用了ComponentArtWeb.UI第三方控件。此控件在很大程度上满足了客户对软件界面的需求,从而也给软件的操作带来了方便。本项目中只使用了ComponentArtWeb.UI一种第三方控件,在今后的项目开发过程中,要继续使用第三方的控件。这样以来,无论是针对软件界面的美观性、友好性来说、易操作性而言,还是针对系统开发效率而言,这都是很好途径。但需要意的是:在是使用第三方控件时,要谨慎的选择一些网络中的比较常见的第三方控件。
4.使用自定义控件:此系统中使用了自定义控件(GhdGridView),此自定义控件可以很好的统一系统中的所有信息显示表格样式。如客户对数据显示样式有什么新的意见,我就不需要修改每一个页面的表格样式,我们只需要修改GhdGridView控件的样式,系统中的所有继承自GhdGridView的表格样式都可以改变。
5.系统开发框架:此系统的框架使用的是简单三层结构,此框架在开发一些中小软件是比较实用的。但是我们要是可以开发出自己的框架,把一些通用的功能开发到框架中。这样以来,在以后的系统开发中,针对系统中一些通用的功能就不需要再开发,从而也可以很好的提高我们的开发效率;减少很多维护费用。使我们的技术不断的更加成熟。
6.系统安全加密:此系统中针对客户提出的系统安全问题,我们采用了Ikey加密硬件钥匙来验证客户端登陆客户的合法性,此Ikey钥匙可以绑定到一个系统使用用户,也可以让多个用户来使用一个加密钥匙来验证登陆系统的合法性。这样以来,即使用户的密码不慎丢失,或者被不法人员取得(不法人员他也是无法登陆到我们的系统中来),这样就最大的提高了我们系统的安全性。Ikey加密钥匙是很好的加密B/S架构软件的硬件工具,在以后的软件安全方面可以借鉴。
3项目经验总结
3.1签定合同
一个项目的开发成败或者说项目开发带来效益的大小,在很大程度上是受项目合同签定的影响的。往往,很多一部分公司与客户签定的项目合同都是很模糊的,也很难签定的比较清楚,这样以来就会导致在项目的开发后期,工作两会越来越大,影响项目的竣工周期;而且,项目的开发费用一般是不会变的。这样以来,我们就大大的降低了我们的开发效益。虽然需求范围很难签定的明确,但是我们在签定合同时,要尽量的去把合同功能边界和添加新功能的条件签定。
3.2开发团队
在项目确立后,要尽快的建立起项目开发团队。
项目团队成员的团结合作、相互沟通是非常重要的,团队成员之间要相互学习彼此的优点和技术,使团队的能力不断的提高。这样,在项目的开发过程中,团队才不会被难题困住不动。另外,团队中要有一个项目负责人,这个人无论是在与客户的沟通上,还是在技术上都要是很出众的人,此项目负责人要能很好的沟通客户与开发成员之间,以此来更好的理解客户的功能需求。人的记忆力总是有限的,所以就要求开发团队成员要尽量的书写一些开发文档,这些文档往往是我们在项目开发后期要用到的可寻资料。项目团队士气是项目成功的一个因素,我们需要不断的来培养我们的团队气势,使我们的团队不断的壮大。
3.3需求的调研
在项目确立后,就到了需求调研分析阶段。
1.项目组对客户的整体组织结构、公司有关人员的关系、职责等如果没有一个很好、足够的了解掌握,这样项目组就无法很好的完整的整理到客户的需求、或者说客户真实的功能需求,如此以来我们就为自己埋下了地雷,影响项目的开发周期,这就要求我们要与客户搞好无论是工作上的还是生活上的朋友关系,要深入的去了解客户需求。
2.我们要尽量的让客户也参与到项目的开发团队中来,也就是说我们要使客户把自己也纳入到项目的开发团队中来,如此一来,我们掌握客户需求的真实性、可靠性就会大大的提高,也就不会为项目的后期功能开发埋下陷阱
3.在需求调研过程中,如果缺乏足够用户参与,这样的需求调研也是失败的。很多程序员不愿参与到客户的需求调研中去,为什么呢?很简单,与客户沟通不如与代码沟通容易有意思。尽管这样,我们还是必须用足够多的时间去和客户进行沟通,了解他们真实的需求。很多用户也是如此,他们自己也不愿意参与到项目的需求调研中来,为什么呢?需求调研有出去和朋友一块烂漫对吗。。。虽然现状如此,我们还是要努力的使客户参与到需求的调研中来。
4.模糊需求,也就是模棱两可是需求规格说明中最为可怕的问题。一是指诸多客户对需求说明产生了不同的理解;一是指单个读者能用不止一个方式来解释某个需求说明。针对对这种情况,就要求我们的调研人员要能够从多个角度来分析客户的不同需求,整理出最终的需求与客户确认,定出最终真实可靠的需求,我们绝不能凭借我们自己的单面理解来定立客户的最终需求。
5.在一个项目的开发中,文档的书写是极为中要的一项工作。因为,某些文档就是我们在开发后期与客户沟通的可寻依据、也是我们程序员在编码过程中要用到的重要文档。我们绝对不能认为,凭借我们的大脑来记录所有的开发需求。。。;即使,你说你是天才,你要用你那颗爱因斯坦的大脑来记录所有的开发需求,那也是不可能的,人的精力总是有限的。这就要求我们在需求调研中做好需求文档的记录和整理。
6.需求调研工具选择,客户一般对图形还是比较感兴趣的,所以我们在调研过程中,我要尽量的采用图形化界面来和客户沟通需求。比如可以采用Rose工具,把客户的意思转换为用例图、时序图、协作图、状态图、类图等,使表达的意思更加直观。这样客户会更快的进行问题的实质。
3.5做好开发计划
在项目确立后,我们就需要做好项目开发计划,需求调研用时,开发用时,测试用时,实施用时,维护用时。在我们做好了计划后,我们要随时的跟踪计划任务的完成进度,从而使我们的项目进度掌控在我们的开发周期范围之内,今日计划、行动,明日成功。
3.5很好的沟通
在其他行业中,人与人的之间的沟通只很重要的。项目开发也不例外,很好的沟通能够加快项目的进度,这就要求我们每一个开发人员要学会和善于沟通于客户和同事之间。在一个项目的开发过程中,我们与客户的沟通是一个不断交流和沟通的过程。在开发到一定的阶段,我们就需要和客户沟通已有功能,尽量的去避免一些隐藏的问题,及时的发现问题,解决问题,从而按时或者提前完成项目的开发。
3.6做好工作总结
在项目进行的过程中,我们要不断去整理自己的工作情况和做好总结,这样以来,无论是在自己的技术还是其它方面,都会对我们有很大的提高,在长期的积累后,无论是我们个人能力,,还是我们的团队能力都会有很大的提高。
扩展阅读:软件项目开发总结报告模版
武汉理工大学《软件开发工具》论文报告
火车票系统的开发
1引言
随着人们生活水平和经济水平的提高,网络科技的全球化的发展,出游和出差的频率越来越多。这大大的激发了交通水平的发展。其中,火车这种又方便有便宜的交通工具作为人们的首选,火车站的客运列车增加,客运量也随之增加。原有的售票的方式已经不再能满足旅客的需求了。为了方便旅客售票系统不仅仅只能售票也能够了解列车的各种信息。这样才能成为现在网络社会的真的适应者。
2需求分析
该售票系统是融合了火车票销售、退票、列车管理、车票管理、售票员管理、列车管理信息,以及售票信息查询为一体的综合系统。该系统主要编写的功能是列车和售票信息的查询及售票功能。
2.1用户
该系统主要有两类用户:管理员和售票员。管理员主要工作有车次管理,车票管理和售票员管理。对于每项功能都有添加,删除和修改的功能。售票的主要工作是售票和退票。
2.2主要功能
该系统从功能方面可以分为四个方面:登录。不管你是管理员还是售票员必须登录以后才可以进行系统允许的操作。当然要登录的管理员和售票员都必须是再数据库中已经发布的。基本设置:该模块主要是修改售票员的相关信息,修改列车的相关信息和修改车票的相关信息。这一块的功能只有管理员才可以操作。其他的售票员是不可以对他进行操作的。售票和退票:这部分工作主要是售票员来操作的。售票员根据买票人员提出的要求进行查询。查询的方式有两种:一是根据车次查询;一是根据目的地来查询。退票主要是将已经出售的车票在列车开出之前再一次的返回到数据库中,并继续出售。
列车和车票查询;当需要查询列车信息或者是车票信息是所做的操作。
2.3基本流程
武汉理工大学《软件开发工具》论文报告
3开发过程
3.1内容
该程序包括三个部分数据库的设计、通用模块的实现、各个模块的实现。
3.1.1数据库的设计:
将本系统所需的所有的数据都存储到数据库中。需要在数据库中管理员表、
售票员表、列车信息表和车票信息表。如图所示:
武汉理工大学《软件开发工具》论文报告
管理员表:
售票员表:
列车信息表:
武汉理工大学《软件开发工具》论文报告
车票信息表:
3.1.2通用模块的实现:
通用模块为了减少代码的重复。在该系统中,对经常使用的操作进行封装,如将多次需要调用的数据库和操作数库的增、删、改和查等操作进行封装。使代码有很好的重用性,即使出现错误也很容易调试。如本程序中的Conn.java
importjava.sql.*;publicclassConn{
privatestaticConnectioncon;
privatestaticfinalStringDRIVER="com.mysql.jdbc.Driver";
privatestaticfinalStringURL="jdbc:mysql://localhost:3306/newdatabase";privatestaticfinalStringNAME="root";
privatestaticfinalStringPASSWORD="021702190804";static{}
publicstaticConnectiongetConnection(){}
publicstaticvoidcloseCon(Connectioncon){
try{
if(con!=null)
con.close();
try{
con=DriverManager.getConnection(URL,NAME,PASSWORD);}catch(SQLExceptione){}
returncon;
e.printStackTrace();try{}
Class.forName(DRIVER);e.printStackTrace();
}catch(ClassNotFoundExceptione){
}catch(SQLExceptione){
武汉理工大学《软件开发工具》论文报告
}}publicstaticvoidclosePt(PreparedStatementpt){}
publicstaticvoidcloseRs(ResultSetrs){}
try{}
if(rs!=null)
rs.close();
try{}
if(pt!=null)
pt.close();
}e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
用户登录界面的设计、主界面的设计、基本设置模块、销售及退票模块和列车及车票查询模块。
用户登录模块:该部分是通过设计login.java来实现的。这部分代码的作用是用户首先选择自己的登录的是管理员还是售票员,然后输入账号和密码。单击登录,用户先判断用户登录的类型,然后给sql变量赋SQL语句值,系统调用DAO.java类的login()传入sql变量。.Login代码是:
importorg.eclipse.swt.SWT;importorg.eclipse.swt.events.*;importorg.eclipse.swt.graphics.Image;importorg.eclipse.swt.layout.*;importorg.eclipse.swt.widgets.*;
importcom.huizhi.dao.DAO;publicclassLogin{
privateTextnameText;privateTextpassText;privateCombocombo;privateStringtype;
privateDisplaydisplay=newDisplay();privateShellshell=newShell(display);publicLogin(){
FormLayoutlayout=newFormLayout();
武汉理工大学《软件开发工具》论文报告
layout.marginHeight=40;
layout.marginWidth=40;shell.setLayout(layout);shell.setText("login");
Imageimage=newImage(display,"2.jpg");shell.setBackgroundImage(image);setUIControl();shell.pack();shell.open();
while(!shell.isDisposed()){if(!display.readAndDispatch())display.sleep();}
display.dispose();}
privatevoidsetUIControl(){
Labelusername=newLabel(shell,SWT.NONE);username.setText("username");
nameText=newText(shell,SWT.SINGLE|SWT.BORDER);
Labelpassword=newLabel(shell,SWT.NONE);
password.setText("password");
passText=newText(shell,SWT.SINGLE|SWT.BORDER|SWT.PASSWORD);//passText.setEchoChar("*");
Labelselect=newLabel(shell,SWT.NONE);select.setText("select");
Buttonsubmit=newButton(shell,SWT.PUSH);submit.setText("login");
submit.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){
type=combo.getText();
Stringname=nameText.getText();Stringpass=passText.getText();Stringsql=null;booleanflag=false;
MessageBoxbox=newMessageBox(shell,SWT.OK);if("".equals(type)||"".equals(name)||"".equals(pass)){}
box.setMessage("pleaseinputalltheinformation");box.open();return;
武汉理工大学《软件开发工具》论文报告
DAOdao=newDAO();
if("users".equals(type)){sql="select*fromuserswhereusername=""+name+""andpassword=""+pass+""";}elseif("admin".equals(type)){
sql="select*fromadminwhereusername=""+name+""and
password=""+pass+""";
}flag=dao.login(sql);if(flag){
shell.dispose();
newMain(type);}else{}
box.setMessage("wrongnameorpassword");box.open();
}});
Buttonreset=newButton(shell,SWT.PUSH);reset.setText("cancel");
Stringvalue[]={"users","admin"};
combo=newCombo(shell,SWT.DROP_DOWN);combo.setItems(value);
FormDatadata=newFormData();data.top=newFormAttachment(30,0);username.setLayoutData(data);
data=newFormData();
data.top=newFormAttachment(username,0,SWT.CENTER);data.left=newFormAttachment(username,10,SWT.RIGHT);nameText.setLayoutData(data);
data=newFormData();
data.top=newFormAttachment(select,0,SWT.CENTER);data.left=newFormAttachment(select,10,SWT.RIGHT);combo.setLayoutData(data);
data=newFormData();
data.top=newFormAttachment(username,10,SWT.BOTTOM);password.setLayoutData(data);
武汉理工大学《软件开发工具》论文报告
data=newFormData();
data.top=newFormAttachment(password,0,SWT.CENTER);data.left=newFormAttachment(nameText,0,SWT.LEFT);passText.setLayoutData(data);
data=newFormData();
data.top=newFormAttachment(password,10,SWT.BOTTOM);submit.setLayoutData(data);
data=newFormData();
data.top=newFormAttachment(submit,0,SWT.CENTER);data.left=newFormAttachment(submit,20,SWT.RIGHT);reset.setLayoutData(data);}
publicstaticvoidmain(String[]args){newLogin();
}}DAO.java的login()代码:
publicbooleanlogin(Stringsql){booleanflag=false;con=Conn.getConnection();try{
pt=con.prepareStatement(sql);rs=pt.executeQuery();if(rs.next()){flag=true;}
}catch(SQLExceptione){e.printStackTrace();}finally{Conn.closeRs(rs);}
Conn.closePt(pt);Conn.closeCon(con);
returnflag;}图示为;
武汉理工大学《软件开发工具》论文报告
实现主界面:
importorg.eclipse.swt.*;
importorg.eclipse.swt.widgets.*;importorg.eclipse.swt.layout.*;importorg.eclipse.swt.events.*;
publicclassMain{
privateStringtype;
Displaydisplay=Display.getCurrent();
Shellshell=newShell(display);publicMain(Stringtype){this.type=type;shell.setText("Trainticketingsystem");
shell.setLayout(newFillLayout());
Menumenu=newMenu(shell,SWT.BAR);//第一个菜单
MenuItembasic=newMenuItem(menu,SWT.CASCADE);basic.setText("BasicSettings");if("users".equals(type)){}
basic.setEnabled(false);
Menufilemenu=newMenu(shell,SWT.DROP_DOWN);MenuItemtrain=newMenuItem(filemenu,SWT.PUSH);train.setText("TrainsManagement");
train.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){
}newTrainManage();
});
MenuItemticket=newMenuItem(filemenu,SWT.PUSH);ticket.setText("TicketsManagement");
武汉理工大学《软件开发工具》论文报告
ticket.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){newTicketManage();}});
MenuItemusers=newMenuItem(filemenu,SWT.PUSH);users.setText("UsersManagement");
users.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){
newUsersManage();
}});
MenuItemexit=newMenuItem(filemenu,SWT.PUSH);exit.setText("quit");
basic.setMenu(filemenu);
exit.addSelectionListener(newSelectionAdapter(){
}publicvoidwidgetSelected(SelectionEvente){display.dispose();
});
//第二个菜单
MenuItemmarket=newMenuItem(menu,SWT.CASCADE);market.setText("SalesandRefunds");
MenueditMenu=newMenu(shell,SWT.DROP_DOWN);
MenuItemmarketItem=newMenuItem(editMenu,SWT.PUSH);marketItem.setText("SalesTickets");
marketItem.addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(SelectionEvente){newXiaosTicket();}
});
MenuItemrefundItem=newMenuItem(editMenu,SWT.PUSH);refundItem.setText("RefundsTickets");market.setMenu(editMenu);
refundItem.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){
newTuiTicket();
}});
//第三个菜单
MenuItemfind=newMenuItem(menu,SWT.CASCADE);find.setText("TrainsandTicketsquery");
MenutaiMenu=newMenu(shell,SWT.DROP_DOWN);MenuItemtrainFind=newMenuItem(taiMenu,SWT.PUSH);
武汉理工大学《软件开发工具》论文报告
trainFind.setText("Trainsquery");
trainFind.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){newFindTrain();}});
MenuItemticketFind=newMenuItem(taiMenu,SWT.PUSH);ticketFind.setText("Ticketquery");find.setMenu(taiMenu);
ticketFind.addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(SelectionEvente){newFindTicket();
}});
shell.setMenuBar(menu);shell.setSize(500,400);
shell.open();
while(!shell.isDisposed()){if(!display.readAndDispatch())
display.sleep();
}display.dispose();
}}图示为:
基本设置模块包括车次管理,车票管理和售票员管理。
车次管理主要是是对于列车的增加,删除和修改等操作。其中包括它的相关的信息等。它是由TrainManagement.java.代码如下:importjava.util.List;
武汉理工大学《软件开发工具》论文报告
importorg.eclipse.swt.SWT;
importorg.eclipse.swt.events.*;importorg.eclipse.swt.layout.*;importorg.eclipse.swt.widgets.*;
importcom.huizhi.dao.DAO;importcom.huizhi.vo.Train;
publicclassTrainManage{
Displaydisplay=Display.getCurrent();Shelltmshell=newShell(display);
finalTabletable=newTable(tmshell,SWT.SINGLE|SWT.H_SCROLL|SWT.V_SCROLL|SWT.H_SCROLL|SWT.BORDER|SWT.FULL_SELECTION);TrainManagetm=this;
publicTrainManage(){
RowLayoutrowLayout=newRowLayout();rowLayout.pack=true;
rowLayout.wrap=true;
rowLayout.justify=false;
rowLayout.marginTop=20;
tmshell.setLayout(rowLayout);
finalTableColumncolumn1=newTableColumn(table,SWT.LEFT);column1.setText("TrainID");
column1.setWidth(80);
finalTableColumncolumn2=newTableColumn(table,SWT.LEFT);column2.setText("TrainNum");column2.setWidth(80);
finalTableColumncolumn3=newTableColumn(table,SWT.LEFT);column3.setText("TrainType");column3.setWidth(80);
finalTableColumncolumn4=newTableColumn(table,SWT.LEFT);column4.setText("Starting");
column4.setWidth(80);
finalTableColumncolumn5=newTableColumn(table,SWT.LEFT);column5.setText("startingTime");
column5.setWidth(80);
finalTableColumncolumn6=newTableColumn(table,SWT.LEFT);column6.setText("terminal");column6.setWidth(80);
finalTableColumncolumn7=newTableColumn(table,SWT.LEFT);column7.setText("terminalTime");column7.setWidth(80);
武汉理工大学《软件开发工具》论文报告
finalTableColumncolumn8=newTableColumn(table,SWT.LEFT);column8.setText("iskongtiao");column8.setWidth(80);
finalTableColumncolumn9=newTableColumn(table,SWT.LEFT);column9.setText("price");
column9.setWidth(80);
finalTableColumncolumn10=newTableColumn(table,SWT.LEFT);column10.setText("middleStation");column10.setWidth(80);
finalTableColumncolumn11=newTableColumn(table,SWT.LEFT);column11.setText("yzNum");column11.setWidth(80);
finalTableColumncolumn12=newTableColumn(table,SWT.LEFT);column12.setText("rzNum");
column12.setWidth(80);
finalTableColumncolumn13=newTableColumn(table,SWT.LEFT);column13.setText("ywNum");column13.setWidth(80);
finalTableColumncolumn14=newTableColumn(table,SWT.LEFT);column14.setText("rwNum");column14.setWidth(80);
table.setHeaderVisible(true);table.setLinesVisible(true);freshData();
table.setSize(800,200);
Buttonadd=newButton(tmshell,SWT.PUSH);add.setText("addtrains");
add.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){newAddTrain(tm);}});
Buttonupdate=newButton(tmshell,SWT.PUSH);update.setText("modify");
update.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){
TableItem[]selection=table.getSelection();
TableItemselectedRow=selection[0];Traintrain=newTrain();
train.setId(Integer.parseInt(selectedRow.getText(0)));
train.setTrainNum(selectedRow.getText(1));train.setTrainType(selectedRow.getText(2));train.setStarting(selectedRow.getText(3));
武汉理工大学《软件开发工具》论文报告
train.setStartingTime(selectedRow.getText(4));train.setTerminal(selectedRow.getText(5));
train.setTerminalTime(selectedRow.getText(6));train.setIskongTiao(selectedRow.getText(7));
train.setPrice(Float.parseFloat(selectedRow.getText(8)));train.setMiddleStation(selectedRow.getText(9));
train.setYzNum(Integer.parseInt(selectedRow.getText(10)));
train.setRzNum(Integer.parseInt(selectedRow.getText(11)));train.setYwNum(Integer.parseInt(selectedRow.getText(12)));
train.setRwNum(Integer.parseInt(selectedRow.getText(13)));newUpdateTrain(train,tm);
}});
Buttondelete=newButton(tmshell,SWT.PUSH);
delete.setText("cancel");
delete.addSelectionListener(newSelectionAdapter(){
box=new
publicvoidwidgetSelected(SelectionEvente){MessageBox
MessageBox(tmshell,SWT.YES|SWT.NO);
box.setMessage("Areyousuretocancel?");
intnum=box.open();if(num==128)
return;
TableItem[]selection=table.getSelection();TableItemselectedRow=selection[0];DAOdao=newDAO();Stringsql="delete
from
train
where
id="+selectedRow.getText(0)+"";
inti=dao.update(sql);
if(i>0){
box.setMessage("succeed");box.open();
table.remove(table.getSelectionIndex());}else{}}});
box.setMessage("failure");box.open();
武汉理工大学《软件开发工具》论文报告
tmshell.setSize(1200,400);
tmshell.setText("trainManagement");tmshell.open();
while(!tmshell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();}
tmshell.dispose();}
publicvoidfreshData(){
table.removeAll();try{
DAOdao=newDAO();
Listlist=dao.getAllTrain();intnumber=list.size();
for(inti=0;i武汉理工大学《软件开发工具》论文报告
e.printStackTrace();
}finally{
Conn.closePt(pt);Conn.closeCon(con);}returni;
}publicListgetAllTrain(){
Listlist=newArrayList();con=Conn.getConnection();try{
pt=con.prepareStatement("select*fromtrain");rs=pt.executeQuery();while(rs.next()){
Traintrain=newTrain();
train.setId(rs.getInt(1));
train.setTrainNum(rs.getString(2));train.setTrainType(rs.getString(3));train.setStarting(rs.getString(4));
train.setStartingTime(rs.getString(5));train.setTerminal(rs.getString(6));
train.setTerminalTime(rs.getString(7));train.setIskongTiao(rs.getString(8));train.setPrice(rs.getFloat(9));
train.setMiddleStation(rs.getString(10));train.setYzNum(rs.getInt(11));train.setRzNum(rs.getInt(12));train.setYwNum(rs.getInt(13));
train.setRwNum(rs.getInt(14));list.add(train);}
}catch(SQLExceptione){e.printStackTrace();}finally{
Conn.closeRs(rs);
Conn.closePt(pt);Conn.closeCon(con);
}returnlist;
}其中的update的功能是,首先连接数据库,然后用传递过来的SQl语句在列表中删除某辆列车的信息。getAllTrain()方法是显示所有的列车的信息。图示如下:
武汉理工大学《软件开发工具》论文报告
在车次管理中的对于列车信息添加的功能是通过AddTrain.java来实现的。代码如下:
importorg.eclipse.swt.SWT;importorg.eclipse.swt.events.*;importorg.eclipse.swt.layout.*;importorg.eclipse.swt.widgets.*;importcom.huizhi.dao.DAO;
publicclassAddTrain{
Displaydisplay=Display.getCurrent();Shelltmshell=newShell(display);TrainManagetrainmanage=null;
publicAddTrain(TrainManagetm){trainmanage=tm;
GridLayoutgridlayout=newGridLayout();tmshell.setText("addtrainsinformation");
gridlayout.numColumns=2;
gridlayout.makeColumnsEqualWidth=true;
tmshell.setLayout(gridlayout);
GridDatagd=newGridData(GridData.FILL_BOTH);Labell=newLabel(tmshell,SWT.LEFT);l.setText("trainNum");
l.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTexttrainNum=newText(tmshell,SWT.NONE);trainNum.setSize(50,60);trainNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
Labell1=newLabel(tmshell,SWT.LEFT);l1.setText("trainType");
l1.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTexttrainType=newText(tmshell,SWT.LEFT);
武汉理工大学《软件开发工具》论文报告
trainType.setSize(30,40);
trainType.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell2=newLabel(tmshell,SWT.LEFT);l2.setText("starting");l2.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextstarting=newText(tmshell,SWT.LEFT);starting.setSize(30,40);starting.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell3=newLabel(tmshell,SWT.LEFT);l3.setText("startingtime");l3.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextstartingTime=newText(tmshell,SWT.LEFT);startingTime.setSize(30,40);startingTime.setLayoutData(gd);
Labell4=newLabel(tmshell,SWT.LEFT);l4.setText("terminal");l4.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextterminal=newText(tmshell,SWT.LEFT);terminal.setSize(30,40);
terminal.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell5=newLabel(tmshell,SWT.LEFT);l5.setText("terminaltime");
l5.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextterminalTime=newText(tmshell,SWT.LEFT);terminalTime.setSize(30,40);terminalTime.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell6=newLabel(tmshell,SWT.LEFT);l6.setText("iskongtiao");
l6.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextiskongTiao=newText(tmshell,SWT.LEFT);
武汉理工大学《软件开发工具》论文报告
iskongTiao.setSize(30,40);
iskongTiao.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell7=newLabel(tmshell,SWT.LEFT);l7.setText("price");l7.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextprice=newText(tmshell,SWT.LEFT);price.setSize(30,40);price.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell8=newLabel(tmshell,SWT.LEFT);l8.setText("middleStation");l8.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextmiddleStation=newText(tmshell,SWT.LEFT);middleStation.setSize(30,40);middleStation.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell9=newLabel(tmshell,SWT.LEFT);l9.setText("yzNum");l9.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextyzNum=newText(tmshell,SWT.LEFT);yzNum.setSize(30,40);yzNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell10=newLabel(tmshell,SWT.LEFT);l10.setText("rzNum");l10.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextrzNum=newText(tmshell,SWT.LEFT);rzNum.setSize(30,40);rzNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell11=newLabel(tmshell,SWT.LEFT);l11.setText("ywNum");l11.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
武汉理工大学《软件开发工具》论文报告
finalTextywNum=newText(tmshell,SWT.LEFT);ywNum.setSize(30,40);ywNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell12=newLabel(tmshell,SWT.LEFT);l12.setText("rwNum");
l12.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);finalTextrwNum=newText(tmshell,SWT.LEFT);rwNum.setSize(30,40);rwNum.setLayoutData(gd);
Buttonb=newButton(tmshell,SWT.LEFT);b.setText("add");
b.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){
MessageBoxbox=newMessageBox(tmshell,SWT.OK);
if("".equals(trainNum.getText())||"".equals(trainType.getText())||"".equals(starting.getText())
||"".equals(startingTime.getText())||"".equals(terminal.getText())||"".equals(terminalTime.getText())
||"".equals(iskongTiao.getText())||"".equals(price.getParent())||"".equals(middleStation.getText())||"".equals(yzNum.getText())
||"".equals(rzNum.getText())||"".equals(ywNum.getText())||"".equals(rwNum.getText())){
box.setMessage("pleaseinputtherightinformation");
box.open();
return;}
DAOdao=newDAO();String
sql="insert
into
train(trainNum,trainType,starting1,startingTime,terminal,terminalTime,iskongTiao,price,"+
"middleStation,yzNum,rzNum,ywNum,rwNum)values(""+trainNum.getText()+"",""+trainType.getText()+"",""+starting.getText()+"","+
"""+startingTime.getText()+"",""+terminal.getText()+"",""+terminalTime.getText()+"",""+iskongTiao.getText()+"","+
武汉理工大学《软件开发工具》论文报告
"""+price.getText()+"",""+middleStation.getText()+"",""+yzNum.getText()+"",""+rzNum.getText()+"",""+ywNum.getText()+"",""+rwNum.getText()+"")";
inti=dao.update(sql);
}if(i>0){
box.setMessage("add");}
box.open();fresh();
});
Buttonb1=newButton(tmshell,SWT.LEFT);b1.setText("quit");
b1.addSelectionListener(newSelectionAdapter(){publicvoidwidgetSelected(SelectionEvente){tmshell.setVisible(false);}});
tmshell.layout();
tmshell.setSize(500,450);
tmshell.open();
while(!tmshell.isDisposed()){
if(!display.readAndDispatch())display.sleep();
}tmshell.dispose();
}publicvoidfresh(){
trainmanage.freshData();}}图示为:
武汉理工大学《软件开发工具》论文报告
修改列车功能是在UpdateTrain.java.类中实现的。代码如下:importorg.eclipse.swt.SWT;
importorg.eclipse.swt.events.*;importorg.eclipse.swt.layout.*;importorg.eclipse.swt.widgets.*;
importcom.huizhi.dao.DAO;importcom.huizhi.vo.Train;
publicclassUpdateTrain{privateTraintrain;
Displaydisplay=Display.getCurrent();Shellutrainshell=newShell(display);
TrainManagetrainmanage=null;
publicUpdateTrain(Traintrain,TrainManagetm){
this.trainmanage=tm;
this.train=train;
GridLayoutgridlayout=newGridLayout();
utrainshell.setText("modifytraininformation");gridlayout.numColumns=2;
gridlayout.makeColumnsEqualWidth=true;utrainshell.setLayout(gridlayout);
武汉理工大学《软件开发工具》论文报告
GridDatagd=newGridData(GridData.FILL_BOTH);Labelll=newLabel(utrainshell,SWT.LEFT);ll.setText("trainID");ll.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextnum=newText(utrainshell,SWT.NONE);num.setText(Integer.toString(train.getId()));num.setEnabled(false);num.setSize(50,60);num.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell=newLabel(utrainshell,SWT.LEFT);l.setText("TrainNum");
l.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTexttrainNum=newText(utrainshell,SWT.NONE);trainNum.setText(train.getTrainNum());trainNum.setSize(50,60);trainNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell1=newLabel(utrainshell,SWT.LEFT);l1.setText("TrainType");l1.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTexttrainType=newText(utrainshell,SWT.LEFT);trainType.setText(train.getTrainType());trainType.setSize(30,40);trainType.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell2=newLabel(utrainshell,SWT.LEFT);l2.setText("starting");
l2.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextstarting=newText(utrainshell,SWT.LEFT);starting.setText(train.getStarting());starting.setSize(30,40);starting.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell3=newLabel(utrainshell,SWT.LEFT);l3.setText("startingTime");
武汉理工大学《软件开发工具》论文报告
l3.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextstartingTime=newText(utrainshell,SWT.LEFT);startingTime.setText(train.getStartingTime());startingTime.setSize(30,40);startingTime.setLayoutData(gd);
Labell4=newLabel(utrainshell,SWT.LEFT);l4.setText("terminal");l4.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextterminal=newText(utrainshell,SWT.LEFT);terminal.setText(train.getTerminal());terminal.setSize(30,40);terminal.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell5=newLabel(utrainshell,SWT.LEFT);l5.setText("terminalTime");
l5.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextterminalTime=newText(utrainshell,SWT.LEFT);terminalTime.setText(train.getTerminalTime());terminalTime.setSize(30,40);terminalTime.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell6=newLabel(utrainshell,SWT.LEFT);l6.setText("iskongtiao");l6.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextiskongTiao=newText(utrainshell,SWT.LEFT);iskongTiao.setText(train.getIskongTiao());iskongTiao.setSize(30,40);iskongTiao.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell7=newLabel(utrainshell,SWT.LEFT);l7.setText("price");
l7.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextprice=newText(utrainshell,SWT.LEFT);price.setText(Float.toString(train.getPrice()));price.setSize(30,40);
武汉理工大学《软件开发工具》论文报告
price.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell8=newLabel(utrainshell,SWT.LEFT);l8.setText("middleStation");
l8.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextmiddleStation=newText(utrainshell,SWT.LEFT);middleStation.setText(train.getMiddleStation());middleStation.setSize(30,40);middleStation.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);Labell9=newLabel(utrainshell,SWT.LEFT);l9.setText("yzNum");l9.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextyzNum=newText(utrainshell,SWT.LEFT);yzNum.setText(Integer.toString(train.getYzNum()));yzNum.setSize(30,40);yzNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
Labell10=newLabel(utrainshell,SWT.LEFT);l10.setText("rzNum");
l10.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextrzNum=newText(utrainshell,SWT.LEFT);rzNum.setText(Integer.toString(train.getRzNum()));rzNum.setSize(30,40);rzNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
Labell11=newLabel(utrainshell,SWT.LEFT);l11.setText("ywNum");l11.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextywNum=newText(utrainshell,SWT.LEFT);ywNum.setText(Integer.toString(train.getYwNum()));ywNum.setSize(30,40);ywNum.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
Labell12=newLabel(utrainshell,SWT.LEFT);
武汉理工大学《软件开发工具》论文报告
l12.setText("rwNum");
l12.setLayoutData(gd);
gd=newGridData(GridData.FILL_BOTH);
finalTextrwNum=newText(utrainshell,SWT.LEFT);rwNum.setText(Integer.toString(train.getRwNum()));rwNum.setSize(30,40);rwNum.setLayoutData(gd);
Buttonb=newButton(utrainshell,SWT.LEFT);b.setText("modify");
b.addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(SelectionEvente){
MessageBoxbox=newMessageBox(utrainshell,SWT.OK);
if("".equals(trainNum.getText())||"".equals(trainType.getText())||"".equals(starting.getText())
||"".equals(startingTime.getText())||"".equals(terminal.getText())||"".equals(terminalTime.getText())
||"".equals(iskongTiao.getText())||"".equals(price.getText())||"".equals(middleStation.getText())||"".equals(yzNum.getText())
||"".equals(rzNum.getText())||"".equals(ywNum.getText())||"".equals(rwNum.getText())){
box.setMessage("pleaseinputrightinformationthenmodify");
box.open();
return;}
DAOdao=newDAO();
Stringsql="updatetrainsettrainNum=""+trainNum.getText()+"",trainType=""+trainType.getText()+"",starting1=""+starting.getText()+"","+
"startingTime=""+startingTime.getText()+"",terminal=""+terminal.getText()+"",terminalTime=""+terminalTime.getText()+"",iskongTiao=""+iskongTiao.getText()+"","+
"price=""+price.getText()+"",middleStation=""+middleStation.getText()+"",yzNum=""+yzNum.getText()+"",rzNum=""+rzNum.getText()+"",ywNum=""+ywNum.getText()+"",rwNum=""+rwNum.getText()+""whereid=""+num.getText()+""";
inti=dao.update(sql);if(i>0){
武汉理工大学《软件开发工具》论文报告
box.setMessage("succeed");
box.open();fresh();}else{
box.setMessage("failure");box.open();}
}});
Buttonb1=newButton(utrainshell,SWT.LEFT);b1.setText("quit");
b1.addSelectionListener(newSelectionAdapter(){
publicvoidwidgetSelected(SelectionEvente){utrainshell.setVisible(false);
}});
utrainshell.layout();
utrainshell.setSize(500,450);utrainshell.open();
while(!utrainshell.isDisposed()){if(!display.readAndDispatch())display.sleep();}
utrainshell.dispose();}
publicvoidfresh(){
trainmanage.freshData();}}
车票管理主要包括对车票的增加,删除和修改的操作。由TicketManagement.java实现。代码类似上面的:(具体看压缩包)。其中的查询列车表和售票表调用的DAO.java类中selectTicket()方法。图示为:
武汉理工大学《软件开发工具》论文报告
售票员管理是对售票员进行增加、删除和修改进行操作。由UserMannage.java类来实现。代码类似以上。在该类中调用了DAO.java类中getAllUser()方法。图示为:
武汉理工大学《软件开发工具》论文报告
售票及退票模块包括两部分:火车售票和退票。售票系统是xiaosTickect.java实现的。图示如下:
退票是售票员根据用户提供的车票信息在系统中进行售票。主要是由TuiTicket.java来实现的。在该类中涉及到DAO.java类中的selectTrain()方法.图示如下:
列车及车票查询系统主要功能包括两部分:查询列车信息和查询车票信息.有FindTrain.Java和FindTicket.java实现.图示如下:
武汉理工大学《软件开发工具》论文报告
4学习心得
我是再没有接触eclipse之前就接触了java,我自己都先用记事本编写java程序,然后在doc下进行编译和运行。后来安装了ecplise这个集成环境,但是只把它当成一个运行java的集成环境。
后来经过开发工具的学习和相关书籍的查看,开始深入的理解了什么是ecplise。其实整个ecplise体系结构就像一个大的拼图,可以不断地向其中添加插件,同时在现有的插件上还可以再增加插件。可以说,在ecplise中一切都是插件。这里有一张图片很形象的说明了ecplise的体系结构:
在我学习ecplise的工程中,我觉得它跟一般的软件比起来有很大的优势:在编写代码的过程中,如果有编译错误的话系统马上会提醒,我们很容易就会会发现。而且它会给你提供一些解决问题的方法,虽然有些解决方法有一些笨,但是这对于一些想我们这样的初学者来说,无疑是雪中送炭。而且在编写代码的过程中,我们使用一些类的对象的方法的过程中系统给予一定的提示。这大大的减少了我们出错的机会,并且我们也可以顺便了解一下该类的其他方法。加快我们的学习进度。
武汉理工大学《软件开发工具》论文报告
对于ecplise的具体的功能的学习感悟:对于调试器板块该环境提供了很多的功能包括单步执行、设置断点和值、检查变量和值以及暂挂和恢复线程的能力。在我们课堂上只学习了本地调试中的断点。断点提供了一种强大的工具,使我们能够在需要的时间和位置挂起执行。与逐句或逐条指令的检查代码不同的是,可以让程序一直执行,直到遇到断点。然后开始调试。这大大的加快了调试过程。没有这个功能,调试大型程序几乎不能完成。至于远程的调试对于现在学习的程度来说有一点难。所以先放弃,以后再研究。
对于JUnit,包括模块接口测试、局部数据结构测试、路经测试、错误处理测试、边界测试。它的核心类主要有jnuit.framework包下的TestCase、Testsuite和TestResult,junit.runnier包下的BaseTestRunner类。而我们现在用到的只有断言Assert。在这里有一点原则是需要注意的它的测试名要很容易与应用类区分开来。
我觉得学会用ecplise来创建的基于SWT的图形应用程序十分的重要。这个要源于它的开发缘由。在这之前,使用的awt是原生窗口部件,但是它一直未能突破LCD。为了解决这个问题,又开发了swing。它使用的是仿真窗口部件,不存在LCD问题。但是消耗太多的内存等。为了彻底解决
上述问题,IBM开发了SWT。在基于Windows的ecplise中,SWT通过DLL形式的本地库与操作系统交互;在UNIX下,SWT可通过的GTK运行。
最近的学习和看书,让我觉得自己的真的就像在软件的最顶层。自己现在学习的东西在软件
中真的是基础中的基础。我们还有很长的路要走。真的要加油,好好学习啊!
5.参考文献
[1]java核心技术卷1:基础知识叶乃文邝劲筠杜永萍201*.5机械工业出版社[2]eclipse3.0程序开发技术详解吴越胜李新磊201*.10清华大学出版社
友情提示:本文中关于《软件项目总结报告》给出的范例仅供您参考拓展思维使用,软件项目总结报告:该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。