软件工程导论课程设计报告1122.docx
《软件工程导论课程设计报告1122.docx》由会员分享,可在线阅读,更多相关《软件工程导论课程设计报告1122.docx(36页珍藏版)》请在冰豆网上搜索。
软件工程导论课程设计报告1122
中南民族大学
计算机科学学院
课程设计报告
课程软件工程导论
题目美食信息管理系统
年级2014级
专业软件工程
学生
学号
指导老师
2016年11月21日
1、前言
1.1、项目概述
由于计算机技术的飞速发展,利用软件工程的基本原理进行软件项目的分析、设计、测试和实现,在各行各业中得到越来越广泛的应用。
围绕“美食信息管理系统”程序的设计和应用系统的开发课题,使用eclipse和SQLserver2008工具,以JAVA为语言编写美食信息管理系统。
该程序通过JDBC来实现eclipse前台与后台SQL server2008数据库的连接,并具有典型的数据库应用系统的特征,完成了系统结构与现实生活的紧密结合。
美食信息管理系统的开发不仅是一个应用程序编写的过程,更重要的是在系统分析和设计阶段所做的工作,通过系统分析和设计的过程,能够更加实际地去印证软件工程基本原理在软件项目设计与实现的过程中的应用。
该信息管理系统在设计过程中严格遵循软件工程学的方法,用分阶段的生命周期计划严格管理,并主要讲述了程序的总体设计、详细设计阶段,对程序进行需求迭代,不断修正和改进,利用SQL server2008的强大数据库功能,直到形成一个完善的可行性系统。
优美、秀丽的界面,方便实用的查询与维护功能共同构成了“美食信息管理系统”。
1.2、项目实施环境(注:
包括开发、运行环境)
该系统为B/S三层结构,它的运行环境分客户端、应用服务器端和数据库服务器端三部分。
以下是系统的软件环境。
(1)客户端
前端开发工具:
eclipse
操作系统:
Windows2007或更新版本。
(2)应用服务器端
操作系统:
Windows2007或更新版本。
应用服务器:
Windows2007或更新版本。
数据库访问:
JDBC。
(3)数据库服务器端
操作系统:
Windows2007或更新版本。
数据库系统:
SQLServer2008r2或更新版本。
1.3、项目分工
柳真:
项目总经理,负责系统架构设计及整体安排
张浩东:
项目文档经理,负责系统文档编写
吴超:
项目数据库架构师,负责系统数据库设计
刘阳正:
项目前端设计师,负责系统界面设计
陈初相:
项目文档经理,负责系统文档编写
1.4、项目实施计划
(1)日期2016-2017学年大三上学期
(2)2016/10/1-2016/10/09:
分析综合实验题目,拟定实验题目-美食信息管理系统,
(3)2016/10/10-2016/10/16:
调查研究功能,并收集相关素材,完成需求分析
(4)2016/10/17-2016/10/23:
做出系统实施计划,完成系统设计
(5)2016/10/24-2016/10/30:
具体编码,各个模块的整合与系统整体详细设计
(6)2016/10/31-2016/11/06:
系统测试
(6)2016/11/07-2016/11/26:
系统演示,老师检查并验收
2、需求分析阶段
2.1、可行性研究
传统的美食信息管理方法,都是通过人工统计或者手工记载的方式进行的。
这样的管理方法不但费时费力,也容易产生统计和记载上的错误和疏漏。
计算机技术的全面普及,打破了美食信息管理的传统管理方法,在提高了管理效率的同时,也克服了传统管理方法中易产生的问题,使管理员能够有序、全面地对每一项美食信息进行管理,严格按照规定管理系统。
利用美食信息管理系统可以完成日常搜寻美食信息的管理,如查询、修改、增加、删除、打印输出以及存储等操作,迅速、准确地完成各种美食信息的统计和汇总工作,快速打印美食信息等,大大提高了餐饮相关部门的管理效率。
2.2、功能需求
2.2.1功能划分
通过对美食信息管理系统在现实生活中所要实现的功能的综合分析,我把该系统登陆后分为三大功能模块:
管理员、客户、注册。
(1)管理员具有新增美食信息、修改美食信息、删除美食信息、个人信息(可以查询自己注册的个人信息并且可以修改登陆密码、完善自己的个人信息);
(2)客户具有查询美食信息、打印输出美食信息、个人信息;
(3)注册具有注册系统的登陆账号,可选择注册管理员或者客户账号。
图一:
美食信息管理系统功能划分图
2.2.2功能描述
具体系统功能需求描述:
1.管理员端
(1)新添美食信息模块
管理员输入新添美食的名称,选择相应的美食类型、美食所在省、所在市、所在县,输入美食的详细文字介绍,上传美食的描述图片,最后点击添加按钮即可添加成功
(2)修改美食信息模块
管理员输入需要修改美食的名称,点击查询即可查询出美食的名称、类型、所在地、详细文字介绍和图片介绍,查询成功后就可以修改上述各项信息,最后点击修改按钮即可修改成功。
(3)删除美食信息模块
管理员输入需要删除美食的名称,点击查询即可查询出美食的名称、类型、所在地等信息,具体信息会在一张表格上显示,然后选择需要删除美食信息的表格所在行,点击删除按钮即可删除成功。
(4)个人信息
管理员输入自己登陆所使用的账号,点击查询即可查询出账号、密码、姓名、电话号码、家庭住址等信息,当修改上述信息后,点击修改按钮即可修改信息,其中账号不能修改,其他四项包括用户密码均可以修改。
2.客户端
(1)查询美食信息模块
客户输入需要查询美食信息的名称,点击查询即可获得美食的具体名称、类型、所在省、所在市、所在县、详细文字介绍、图片等信息。
(2)打印输出美食信息模块
客户在查询所得美食信息后,如果要进行打印输出相关信息,点击查询美食信息模块界面上打印输出美食信息按钮即可成功打印美食信息。
(3)个人信息
客户输入自己登陆所使用的账号,点击查询即可查询出账号、密码、姓名、电话号码、家庭住址等信息,当修改上述信息后,点击修改按钮即可修改信息,其中账号不能修改,其他四项包括用户密码均可以修改。
3.注册
(1)管理员
输入注册账号、密码,选择注册类型为管理员,点击注册即可成功注册管理员账户。
(2)客户
输入注册账号、密码,选择注册类型为管理员,点击注册即可成功注册客户账户。
2.2.3数据流图
图二:
美食信息管理系统数据流图
2.2.4E-R图
图三:
美食信息管理系统E-R图
2.2.5数据字典
(1)美食名称表
名字:
美食名称表
别名:
美食信息
描述:
记录美食名称、美食的详细文字介绍、美食图片等信息
定义:
美食名称表=美食名称编号+美食类型编号+美食名称+详细介绍+图片
位置:
美食信息管理数据库中表的中一项
(2)美食类型表
名字:
美食类型表
别名:
美食类型
描述:
统计美食的类型
定义:
美食类型表=美食类型编号+美食类型名称
位置:
美食信息管理数据库中表的一项
(3)美食地点表
名字:
美食地点表
别名:
美食地点
描述:
记录美食所在具体地点信息
定义:
美食地点表=美食地点编号+所在省+所在市+所在县
位置:
美食信息管理数据库中表的一项
(4)所在地表
名字:
所在地表
别名:
个具体对应地点
描述:
让各种美食对应相应的具体地点,建立美食名称表余美食地点表之间的关系
定义:
地点表=美食地点编号+美食名称编号
位置:
美食信息管理数据库中表的一项
(5)管理员表
名字:
管理员表
别名:
管理员用户
描述:
用于存入管理员注册账号和注册密码以及姓名、电话、家庭住址等个人信息
定义:
管理员表=管理员编号+管理员姓名+管理员电话号码+管理员家庭住址+系统登陆密码
位置:
美食信息管理数据库中表的一项
(6)客户表
名字:
客户表
别名:
客户用户
描述:
用于存入客户注册账号和注册密码以及姓名、电话、家庭住址等个人信息
定义:
客户表=客户编号+客户姓名+客户电话号码+客户家庭住址+系统登陆密码
位置:
美食信息管理数据库中表的一项
2.3、性能需求
2.3.1精度
(1)用户在进行美食查询时要保证查全率,所有符合搜索条件的美食都要能找到。
(2)在保证查全率的同时还要能够保证查准率,尤其是对于高级搜索这一功能。
(3)保证美食的更新频率。
(4)本软件主要用于管理,不是科学计算,要求计算的精度不是很苛刻。
所以输入、输出数据精度的要求不是很高,用于计算的数用浮点数就可以了。
2.3.2时间特性要求
本软件运行的响应时间要求不超过1~2秒,基本能实现。
(1)响应时间:
2-3秒之内打开一个新的链接。
(2)数据转换与传输时间:
数据转换主要是涉及到数据库的问题。
为了降低一次显示过多的记录会消耗太多的时间这个问题,在设计时让数据库尽量分页显示。
传输时间和服务器的处理能力、无线网络的信号强度有关。
(3)运行时间:
如非特殊原因应保持24小时开通。
2.3.3灵活性
本软件具有升级功能,以满足用户的需求。
2.4、可靠性和可用性需求
系统要保证24*7*365可用。
但是可以允许每月系统停机一小时,进行系统维护。
系统维护的时间要安排在非工作时间进行。
人们对信息共享的需求越来越庞大及广泛,美食也是人们生活中不可缺少的部分。
用户数量与日俱增,美食信息管理系统要能支持这样的增长速度。
2.5、出错处理需求
2.5.1操作跟踪
针对系统运行出现的异常,跟踪调查出现异常的情况,了解操作意图,有针对性的解决问题。
2.5.2访问控制
非注册用户(游客)不可以搜索美食信息,只有登陆用户才可以对美食进行查询、修改、打印输出等操作。
2.6、接口需求
2.6.1硬件接口
由于我们使用的通信协议是TCP/IP,因此这里的硬件接口问题主要就是TCP/IP层中的网络接口层,它负责数据帧的发送和接收,帧是独立的网络信息传输单元。
2.6.2软件接口
这里的接口问题主要是JAVAAPI和后台数据库接口。
JAVAAPI主要包括:
Object.clone()推荐覆盖、intcompareTo(Objecto)java.lang对象排序、Runnablevoidrun()java.lang线程运行、AudioClip:
voidloop()、voidplay()、ActionListenervoidactionPerformed(ActionEvent)java.awt.event事件处理、WindowConstantsintDISPOSE_ON_CLOSE、intDO_NOTHING_ON_CLOSE、intEXIT_ON_CLOSE、intHIDE_ON_CLOSEjavax.swing窗口控制等。
后台数据库接口使用JDBC驱动。
2.7、约束
设计约束或实现约束描述在设计或实现应用系统时应遵守的限制条件。
常见的约束有:
精度;工具和语言约束;设计约束;应该使用的标准;应该使用的硬件平台。
我们所设计的美食信息管理系统在数据精度上要求不是很高,只要求能够正确描述出相应美食具体信息即可;开发使用的硬件平台是eclipse、windows7,用Java语言进行开发具有很强的可移植性。
2.8、逆向需求
美食信息管理系统在日常生活用应用还是非常广泛,但是作为设计人员,在进行需求分析时应该说清楚美食信息管理系统不应该做什么,应该选取能澄清真实需求且可消除可能发生的误解的那些逆向需求。
在选取该课题后,经过查询资料和分析得知:
美食信息管理系统不能关注于收集大量用户的具体信息,从而导致后台数据库在设计时的重担。
2.9、将来可能提出的要求
美食信息管理系统旨在为用户提供当下我国各地具体的美食信息,包括详细介绍和图片说明,让用户能够快速得到相应的信息。
如果我们所设计的美食信息管理系统能够在现实生活中得到广泛的应用,我们应该考虑实现相应的数据挖掘方面的功能,例如通过记录用户一段时期的搜索美食信息的词条,每当用户登陆时可以向用户推送相关信息,提高用户的体验。
3、设计阶段
3.1、概要设计
3.1.1设计目标
本系统是根据日常生活对美食信息查询与管理的实际需求来开发的,完全能够实现用户对美食信息的管理,通过本系统可以达到以下目标:
(1)系统运行稳定,安全可靠;
(2)界面设计美观,人机交互界面友好;
(3)信息查询灵活、方便、快捷、准确、数据存储安全可靠;
(4)任何人可以随时注册自己的账号;
(5)对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误;
(6)满足键盘和鼠标的双重操作,完全支持Enter键。
3.1.2系统功能结构设置
图四:
美食信息管理系统软件结构图
3.1.3数据库物理模型
图五:
美食信息管理系统数据库物理模型
3.2、详细设计
3.2.1系统界面设计
(1)为了防止非法用户进入系统,本软件设计了系统登录窗口。
在程序启动时,首先弹出登录窗口,要求用户输入登录信息,如果用户输入不合法,将禁止进入系统。
系统登录窗口运行结果如下图所示:
图六:
美食信息管理系统登陆界面
(2)与登陆界面相对应的是,要提供注册功能,通过注册后才能够让设计的系统软件得到更多的用户。
系统注册界面如下图所示:
图七:
美食信息管理系统注册界面
(3)用户通过登陆界面成功登陆后将进入相应的功能界面,首先说明管理员功能界面的设计。
管理员功能运行结果如下图所示:
图八:
管理员新增美食信息功能界面
图九:
管理员新增美食信息中选择图片功能界面
图十:
管理员修改美食信息功能界面
图十一:
管理员删除美食信息功能界面
图十二:
管理员个人信息功能界面
(4)用户通过登陆界面成功登陆后将进入相应的功能界面,最后说明客户功能界面的设计。
客户功能运行结果如下图所示:
图十三:
客户查询美食信息功能界面
图十四:
客户打印输出美食信息功能界面
图十五:
客户个人信息功能界面
3.2.2系统功能模块算法设计
我们设计的美食信息管理系统主要包括管理员和客户登陆两大功能模块,其中管理员功能模块中能够进行美食信息的添加、修改、删除功能,客户功能模块中能够进行美食信息的查询、打印输出功能。
在设计出各个功能模块界面后,最为核心的是要实现相应功能界面中的按钮触发事件。
例如,管理员端中新添美食信息功能界面中的添加按钮触发事件、修改美食信息功能界面中的修改按钮触发事件、删除美食信息功能界面中的删除按钮触发事件,客户端中查询美食信息功能界面中查询按钮的触发事件和打印美食信息按钮的触发事件。
为这些触发事件设计一个良好的算法,能够大大提高程序的运行效率。
4、调试与分析
4.1、功能模块源代码
4.1.1新添美食信息功能模块添加按钮核心代码
源代码如下:
if(arg0.getSource()==btnNewButton_6){
StringB2="";
StringB3="";
StringA1=textField.getText();
StringB1=comboBox.getSelectedItem().toString();
StringC1=comboBox_1.getSelectedItem().toString();
StringD1=comboBox_2.getSelectedItem().toString();
StringE1=comboBox_3.getSelectedItem().toString();
StringF1=textArea.getText();
if(B1.equals("面类")){
B1="041001";
}
elseif(B1.equals("粉类")){
B1="041002";
}
elseif(B1.equals("水果类")){
B1="041003";
}
elseif(B1.equals("油炸类")){
B1="041004";
}
elseif(B1.equals("火锅类")){
B1="041005";
}
elseif(B1.equals("冷品类")){
B1="041006";
}
elseif(B1.equals("熟食类")){
B1="041007";
}
elseif(B1.equals("糕点类")){
B1="041008";
}
sql="selectfinefoodSiteNofrom[Finefoodsite]whereprovice='"+C1+"'andcity='"+D1+"'andcounty='"+E1+"'";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("加载驱动程序成功");
}
catch(Exceptione)
{
System.out.println("无法加载驱动程序");
}
try{
Connectionconn=DriverManager.getConnection("jdbc:
sqlserver:
//localhost:
1433;DatabaseName=Finefood"
+"managementsystem","sa","9588314");
Statementstmt=conn.createStatement();
ResultSetrs=stmt.executeQuery(sql);
if(rs.next()){
B2=rs.getString
(1);
System.out.println(B2);
}
else{
foodTypeNo=foodTypeNo+1;
B2=foodTypeNo+"";
sql="insertinto[Finefoodsite]values('"+B2+"','"+C1+"','"+D1+"','"+E1+"')";
inti=stmt.executeUpdate(sql);
if(i>0)
JOptionPane.showMessageDialog(null,"添加成功");
else
JOptionPane.showMessageDialog(null,"添加失败");
//JOptionPane.showMessageDialog(this,"不存在这样的美食","错误!
",JOptionPane.ERROR_MESSAGE);
}
rs.close();
stmt.close();
}
catch(SQLExceptione)
{
System.out.println("SQL异常");
}
sql="select*from[Finefoodsite]whereprovice='"+C1+"'andcity='"+D1+"'andcounty='"+E1+"'";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("加载驱动程序成功");
}
catch(Exceptione)
{
System.out.println("无法加载驱动程序");
}
try{
Connectionconn=DriverManager.getConnection("jdbc:
sqlserver:
//localhost:
1433;DatabaseName=Finefood"
+"managementsystem","sa","9588314");
Statementstmt1=conn.createStatement();
ResultSetrs1=stmt1.executeQuery(sql);
if(rs1.next()){
foodNameNo+=1;
B3=foodNameNo+"";
System.out.println(B3);
System.out.println(path_file);
//rs1=stmt1.executeQuery("selectMAX(finefoodNo)+1asfinefoodNofrom[FinefoodName]");
//StringB6=rs1.getString
(1);
//System.out.println("执行成功"+B6);
sql="insertinto[FinefoodName]values('"+B3+"','"+B1+"','"+A1+"','"+F1+"','"+path_file+"')";
//System.out.println("");
inti=stmt1.executeUpdate(sql);
if(i>0)
JOptionPane.showMessageDialog(null,"插入成功");
else
JOptionPane.showMessageDialog(null,"插入失败");
}
else{
JOptionPane.showMessageDialog(this,"添加异常","错误!
",JOptionPane.ERROR_MESSAGE);
}
rs1.close();
stmt1.close();
}
catch(SQLExceptione)
{
System.out.println("SQL异常");
}
sql="select*from[Finefoodsite]whereprovice='"+C1+"'andcity='"+D1+"'andcounty='"+E1+"'";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
System.out.println("加载驱动程序成功");
}
catch(Exceptione)
{
System.out.println("无法加载驱动程序");
}
try{
Connectionconn=DriverManager.getConnection("jdbc:
sqlserver:
//localhost:
1433;DatabaseName=Finefood"
+"managementsystem","sa","9588314");
Statementstmt2=conn.createStatement();
ResultSetrs2