软件工程课程设计网上购物.docx
《软件工程课程设计网上购物.docx》由会员分享,可在线阅读,更多相关《软件工程课程设计网上购物.docx(23页珍藏版)》请在冰豆网上搜索。
![软件工程课程设计网上购物.docx](https://file1.bdocx.com/fileroot1/2023-1/5/27944310-0771-4b8f-8e45-0fe5b61bdeb0/27944310-0771-4b8f-8e45-0fe5b61bdeb01.gif)
软件工程课程设计网上购物
软件工程课程设计报告
目 录
1.设计内容
1.1问题概述
网上购物是一种具有交互功能的商业信息系统。
它向用户提供静态和动态两类信息资源。
所谓静态信息是指那些比经常变动或更新的资源,如公司简介、管理规范和公司制度等等;动态信息是指随时变化的信息,如商品报价,会议安排和培训信息等。
网上购物系统具有强大的交互功能,可使商家和用户方便的传递信息,完成电子贸易或EDI交易。
这种全新的交易方式实现了公司间文档与资金的无纸化交换。
现在流行的网上购物系统不仅要有漂亮的网页,更要有严谨的规划。
每一个细小的环节都和重要。
这样才能使得在电子交易时避免不必要错误发生。
本系统使用HTML、JSP等技术来编辑网页,并运用Hibernate技术把数据库和动态网页相关联。
传统的管理信息系统信息获取方法是由专业文字录入人员将信息输入到管理系统的数据库中,这种方法在数据量不大时有很多的应用场合。
当数据量比较大,并且有较强的专业性时,录入的费用和出错的可能性都相应上升。
本文在实际应用开发中解决方案是建立网站,以及自己的数据库,使得所需商品信息可以及时的保存、更新。
可以更好的及时了解商品买卖的情况。
为此我根据当前的网上购物情况编写了《网上购物系统的设计与开发》。
1.2系统的数据流程图及数据字典
1.2.1数据流图
矩形表示实体,椭圆表示处理,平行线表示存储,箭头表示数据流系统的数据流图如下所示:
图1-1系统顶层数据流程图
图1-2系统顶层数据流程图详细说明
图1-3一层数据流程图
具体操作
类型
对比
累计
P1商家管理
P2.1库存管理
P2.2订单管理
P5已经处理
P2.3已经处理
2.4未处理
图1-4二层商家商品管理数据流程图
1.2.2数据字典
1)数据元素
名称:
REGISTERED_TIME
别名:
上架时间
描述:
用来标示商品的录入时间
类型:
TIMESTAMP
长度:
15
名称:
NAME
别名:
用户名
描述:
用来标示用户和管理员的用户名
数据类型:
VRCHAR2
长度:
15
名称:
DESCRIPTION
别名:
留言内容
描述:
用来标示留言的具体内容
类型:
TEXT
长度:
1000
名称:
TYPE
别名:
类别
描述:
用来标示类别的具体内容
类型:
CHAR
(1)
长度:
15
名称:
NUMBER
别名:
订单数量
描述:
用来标示订单的数量
类型:
INTEGER
长度:
15
名称:
TITLE
别名:
标题
描述:
用来标示新闻的主题
类型:
INTEGER
长度:
50
2)数据存储
名字:
用户信息
描述:
纪录用户的个人信息
编号:
D1
组成:
用户ID,用户名,密码,用户级别,EMAIL,电话,地址,注册时间,备注
名字:
商品信息
描述:
纪录商品的属性信息
编号:
D2
组成:
商品ID,商品型号,商品类别,是否新品,查看级别,订货件数,订货次数,入库时间
名字:
留言信息
描述:
纪录留言的具体信息
编号:
D3
组成:
留言ID,留言主题,留言用户,留言时间,留言内容
名字:
类别信息
描述:
纪录类别的设置信息
编号:
D4
组成:
类别ID,类别名,所属大区域,该类别商品种类
名字:
订单信息
描述:
纪录订单的具体信息
编号:
D5
组成:
订单ID,订单号,下订单的客户,订货时间,订货具体内容
名字:
新闻信息
描述:
纪录新闻具体信息
编号:
D6
组成:
新闻ID,新闻主题,发布时间,具体内容
3)数据流
名字:
用户信息
描述:
纪录用户的个人信息
编号:
F1
组成:
用户ID,用户名,密码,用户级别,EMAIL,电话,地址,注册时间,备注
名字:
留言信息
描述:
纪录留言的具体信息
编号:
F2
组成:
留言ID,留言主题,留言用户,留言时间,留言内容
名字:
订单信息
描述:
纪录订单的具体信息
编号:
F3
组成:
订单ID,订单号,下订单的客户,订货时间,订货具体内容
名字:
新闻信息
描述:
纪录新闻具体信息
编号:
F4
组成:
新闻ID,新闻主题,发布时间,具体内容
名字:
商品信息
描述:
纪录商品的属性信息
编号:
F5
组成:
商品ID,商品型号,商品类别,是否新品,查看级别,订货件数,订货次数,入库时间
名字:
类别信息
描述:
纪录类别的设置信息
编号:
F6
组成:
类别ID,类别名,所属大区域,该类别商品种类
4)数据处理
名字:
用户管理
描述:
管理员对管理员和用户信息的添加,删改等
编号:
P1
输入/输出数据流:
用户或管理员基本信息
名字:
商品管理
描述:
管理员对商品信息的添加,删改等
编号:
P2
输入/输出数据流:
商品基本信息
名字:
留言管理
描述:
管理员对留言信息的添加,删改等
编号:
P3
输入/输出数据流:
留言信息
名字:
类别管理
描述:
管理员对类别信息的添加,删改等
编号:
P4
输入/输出数据流:
类别基本信息
名字:
订单管理
描述:
管理员对订单信息的删改等
编号:
P5
输入/输出数据流:
订单基本信息
名字:
新闻管理
描述:
管理员对新闻信息的添加,删改等
编号:
P6
输入/输出数据流:
新闻基本信息
1.3E-R图
图1-5前台用户局部E-R图
图1-6后台管理员局部E-R图
2.概要设计
2.1主要功能
该系统的目标可以实现用户通过网络选购自己喜欢的商品,而且还可以为其进行邮寄。
保证产品质量,信息安全,提供最好服务[1],系统的主要功能如下:
1查看产品信息
用户可以根据自己的需求分类查看所有产品信息,选择自己喜欢的产品购买。
2查看新闻
用户可以查看网站的所有新闻,新闻内容包括商品厂商的信息,以及新产品的发布信息等,以方便用户更直观的了解产品动向及信息。
3填写订单
用户填写要购买商品的信息到订单中去,并可以删除已填写但最终不想购买的产品。
2.2模块定义
用户管理自然是每个网站必不可少的,在本系统中,要求这部分管理安全可靠,权限分明,且其在前台和后台的表现不同,下面将分别进行介绍。
1)前台表现
用户注册,此时要保证系统不受注册机的攻击,要采用验证码技术。
要确保权限为普通用户,要有密码保护措施,保证用户设定之后可以找回遗忘的密码。
2)后台表现
系统管理员可以添加用户。
系统管理员可以动态的给用户赋予权限,保证系统信息不外泄。
系统管理员可以修改和删除用户信息。
系统管理员可以给用户建立备注信息,其仅对具有权限的用户可以进行信息的检查与修改。
2.3体系结构设计
3.详细设计
3.1详细设计说明书
网上购物系统
客户注册系统
客户登陆系统
选购物品
查询选购记录
会员注销
管理员登陆系统
订单处理
会员管理
物品入库
管理员注销
会员修改资料
3.2数据库设计
物品表(物品编号,物品名,价格),主键为物品编号,符合三范式。
客户表(客户编号,姓名,性别,购买记录,购买信誉),主键为客户编号,符合三范式。
表3-1物品表book
列名
含义
长度
类型
NULL
DEFAULT
Bno
物品编号
10
Char()
no
no
bname
物品名称
15
Char()
no
no
price
价格
8
Char()
no
no
表3-2客户表Member
列名
含义
长度
类型
NULL
DEFAULT
Mno
客户编号
15
Char()
no
no
Mname
客户姓名
15
Char()
no
no
sex
客户性别
5
Char()
no
no
record
购买记录
15
Char()
no
no
Credit
购买信誉
15
Char()
no
no
3.3程序流程图
用户登录流程图
物品搜索流程图
3.4输入项目
输入本系统中的数据如下所示:
1)用户信息需要有用户亲自注册,管理员帐号由系统自动生成。
2)产品信息需要有管理员手动进行添加。
3)留言标题、内容由用户输入,留言者、留言时间由系统自动检验生成。
4)新闻标题、英文标题、内容、英文内容由管理员添加,发布时间由系统自动检验生成。
5)订单信息需要由用户填写。
4.程序源码
importjava.util.*;
importjava.awt.event.*;
importjava.awt.*;
importjavax.swing.*;
importjava.io.*;
class商品extendsPanel
{String代号,名称;int库存;float单价;
商品(String代号,String名称,int库存,float单价)
{this.代号=代号;this.名称=名称;this.库存=库存;this.单价=单价;
}
}
classShowWinextendsJFrameimplementsActionListener
{Hashtablehashtable=null;
JTextField代号文本框=newJTextField(),
名称文本框=newJTextField(),
库存文本框=newJTextField(),
单价文本框=newJTextField(),
查询文本框=newJTextField(),
查询信息文本框=newJTextField(),
删除文本框=newJTextField();
JButtonb_add=newJButton("添加商品"),
b_del=newJButton("删除商品"),
b_xun=newJButton("查询商品"),
b_xiu=newJButton("修改商品"),
b_show=newJButton("显示商品清单");
JTextArea显示区=newJTextArea(25,10);
ShowWin()
{super("仓库管理窗口");
hashtable=newHashtable();
Containercon=getContentPane();
JScrollPanepane=newJScrollPane(显示区);
显示区.setEditable(false);
JPanelsave=newJPanel();
save.setLayout(newGridLayout(8,2));
save.add(newLabel("输入代号:
"));
save.add(代号文本框);
save.add(newLabel("输入名称:
"));
save.add(名称文本框);
save.add(newLabel("输入库存:
"));
save.add(库存文本框);
save.add(newLabel("输入单价:
"));
save.add(单价文本框);
save.add(newLabel("单击添加:
"));
save.add(b_add);
save.add(newLabel("单击修改:
"));
save.add(b_xiu);
save.add(newLabel("输入查询代号:
"));
save.add(查询文本框);
save.add(newLabel("单击查询:
"));
save.add(b_xun);
JPaneldel=newJPanel();
del.setLayout(newGridLayout(2,2));
del.add(newLabel("输入删除的代号:
"));
del.add(删除文本框);
del.add(newLabel("单击删除:
"));
del.add(b_del);
JPanelshow=newJPanel();
show.setLayout(newBorderLayout());
show.add(pane,BorderLayout.CENTER);
show.add(b_show,BorderLayout.SOUTH);
JSplitPanesplit_one,split_two;
split_one=newJSplitPane(JSplitPane.VERTICAL_SPLIT,save,del);
split_two=new
JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,split_one,show);
con.add(split_two,BorderLayout.CENTER);
JPanelxun=newJPanel();
xun.add(newLabel("所得信息:
"));
xun.add(查询信息文本框);
xun.setLayout(newGridLayout(2,1));
con.add(xun,BorderLayout.SOUTH);
b_add.addActionListener(this);
b_del.addActionListener(this);
b_xun.addActionListener(this);
b_xiu.addActionListener(this);
b_show.addActionListener(this);
}
publicvoidactionPerformed(ActionEvente)
{if(e.getSource()==b_add)
{Stringdaihao=null,mingcheng=null;intkucun=0;floatdanjia=0.0f;
daihao=代号文本框.getText();mingcheng=名称文本框.getText();
kucun=Integer.parseInt(库存文本框.getText());
danjia=Float.valueOf(单价文本框.getText()).floatValue();
商品goods=new商品(daihao,mingcheng,kucun,danjia);
hashtable.put(daihao,goods);
try{("goods.txt");
ObjectOutputStreamout=newObjectOutputStream(file);
out.writeObject(hashtable);out.close();
}
catch(IOExceptionevent){}
}
elseif(e.getSource()==b_del)
{Stringdaihao1=删除文本框.getText();
try{come_in=new("goods.txt");
ObjectInputStreamin=newObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject();//////
in.close();
}
catch(ClassNotFoundExceptionevent){}
catch(IOExceptionevent){}
商品temp=(商品)hashtable.get(daihao1);
{hashtable.remove(daihao1);}
try{("goods.txt");
ObjectOutputStreamout=newObjectOutputStream(file);
out.writeObject(hashtable);//
out.close();
}
catch(IOExceptionevent){}
}
//
elseif(e.getSource()==b_xun)
{Stringaa;
aa=查询文本框.getText();
查询信息文本框.setText(null);
try{come_in=new("goods.txt");
ObjectInputStreamin=newObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject();////
in.close();
}
catch(ClassNotFoundExceptionevent){}
catch(IOExceptionevent){}
商品a=(商品)hashtable.get(aa);
查询信息文本框.setText("代号:
"+a.代号+"名称:
"+a.名称+"库存:
"+a.库存+"单价:
"+a.单价);
}
//
elseif(e.getSource()==b_xiu)
{Stringbb;
bb=代号文本框.getText();
try{come_in=new("goods.txt");
ObjectInputStreamin=newObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject();//////
in.close();
}
catch(ClassNotFoundExceptionevent){}
catch(IOExceptionevent){}
商品temp=(商品)hashtable.get(bb);
{hashtable.remove(bb);}
try{("goods.txt");
ObjectOutputStreamout=newObjectOutputStream(file);
out.writeObject(hashtable);//
out.close();
}
catch(IOExceptionevent){}
Stringdaihao1=null,mingcheng1=null;intkucun1=0;floatdanjia1=0.0f;
daihao1=代号文本框.getText();mingcheng1=名称文本框.getText();
kucun1=Integer.parseInt(库存文本框.getText());
danjia1=Float.valueOf(单价文本框.getText()).floatValue();
商品goods1=new商品(daihao1,mingcheng1,kucun1,danjia1);
hashtable.put(daihao1,goods1);
try{("goods.txt");
ObjectOutputStreamout=newObjectOutputStream(file);
out.writeObject(hashtable);out.close();
}
catch(IOExceptionevent){}
}
//
elseif(e.getSource()==b_show)
{显示区.setText(null);
try{come_in=new("goods.txt");
ObjectInputStreamin=newObjectInputStream(come_in);
hashtable=(Hashtable)in.readObject();////
}
catch(ClassNotFoundExceptionevent){}
catch(IOExceptionevent){}
EnumerationEnumeration=hashtable.elements();
while(Enumeration.hasMoreElements())
{商品te=(商品)Enumeration.nextElement();
显示区.append("商品代号:
"+te.代号+"");
显示区.append("商品名称:
"+te.名称+"");
显示区.append("商品库存:
"+te.库存+"");
显示区.append("商品单价:
"+te.单价+"");
显示区.append("\n");
}
}
}
}
publicclassLinkListFour
{publicstaticvoidmain(Stringargs[])
{ShowWinwin=newShowWin();
win.setSize(400,350);
win.setVisible(true);
win.addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{System.exit(0);}});
}
}
5.程序运行与调试
5.1模块测试
在模块测试时我们主要从以下几个方面考虑:
1.模块接口;
2.局部数据结构;
3.重要执行通道;
4.出错处理通道;
5.影响上述方面的边界条件。
测试时进行代码审查,从数据类型,变量声明,数据结构进行审查,然后进行功能测试,从输入一些简单的数据开始执行一遍,观测运行期间变量的变化,运行中值的变化范围。
改变测试方案来变换另一个角度进行测试,发现错误并记录,修改代码,测试条件使程序通过多层分支,判别运行结果从而完成模块测试。
部分测试结果如图
主界面
添加商品
查询商品
5.2总体测试
总体测试是组装软件的系统技术,本系统测试采用渐增集成测试,即测试单一模块,将测试完的模块加入系统中,进行一次系统测试,依次类推将所有模块加入系统中,在具体测试时,采用自顶向下的结合方式,从主控模块开始,沿各控制层向下移动,逐渐把所有模块结合了。
在测试过程中使用到调试技术:
1.采用debug调试语句,跟踪数据;
2.嵌入打印语句,输出中间结果;
3.利用Delphi7.0中调试工具,从调试窗口观测变量的变化;
4.设置断点,观察程序在断点附近的状况。
6.总结
这次课程设计让我认识到软件工程方法对项目开发的重要性和必要性,知道可以使得软件开发少走弯路,更容易开发出高质量的项目开发。
按照软件工程的方法、软件的开发需要严格遵守其开发流程,作好软件设计的每一个流程。
由于以前没有系统的学习过软件工程的相关知识,只学过C/C++语言、数据结构等课程,因此在我的头脑里,做软件就是写代码,水平高的人写大型的、复杂的代码,水平低的人编的简单一些,所以总觉得软件工程没有什么太多实际的价值。
然而,在逐步的学习过程中,特别是在结合本门课程和同学一起开发一个较为大型的软件中,我深深感受到了软件工程在开发过程中的指导作用。
软件工程,重点在工程两字上,也就是把软件的开发当作一个工程项目运用工程的方法来实施,从可行性分析、需求分析直到最后的测试、交付以及以后的维护,每一个过程都有自