软件工程课程设计题目:网上购物系统专业:计算机科学与技术班级:04计算机(4)班组员:孔兵兵:0412002426冷晓林:0412002419郭伟:0412002425谌小仲:0412002422李佩:0412002429目录需求分析……………………………………………………….孔兵兵1.1编写目的1.2开发背景1.3项目提出原因1.4系统设计目标1.5项目构想1.6 系统功能1.7项目名称1.8需求分析1.9所运用的知识点概要设计…………………………………………………………冷晓林2.1:购物系统的功能2.2:功能图2.2.1:购物车流程图2.2.2:定单处理流程图2.2.3/:商品分类管理流程图2.3:管理员实现的功能2.4:顾客实现的功能2.5:实现中的问题与难点详细设计…………………………………………………………郭伟3.1:商品的信息3.2:商品的类别3.3:订单3.5:订单明细3.6:对概要设计中问题的解决方法编码………………………………………………………..谌小仲测试………………………………………………………..李佩网上购物系统1网上购物系统需求分析说明1.1编写目的本文档是针对网上购物系统从总体设计、设备配置、设备配置等方面所做的说明。
本文档的编写目的是:对网上购物系统的总体架构设计进行描述。
对该系统的整个流程作详细、准确的描述,为系统的概要设计及编码提供指导。
1.2开发背景随着计算机和网络的日趋普及,越来越多的商家在网上升起商店,向消费者展示出一片新鲜的购物大地。
在美、日等信息化程度较高的国家和地区,网络商店发展速度迅猛,美国的世界级超一流的零售商,如沃尔玛凯玛特,家庭仓储等纷纷脐身于网络经商的行列。
调查表明:美国的家庭已越来越习惯于在家中从网上购物。
在我国,网上购物从无到有也不过短短几年时间。
网上购物还不完善,结算方式的原始落后是网上购物致命的弱点。
大部分商家结算只能采取“送货上门、到货付款”或“邮寄上门、贷款邮资先付”的方式。
这样不但浪费了时间和人力,而且限制了网络的覆盖范围和商品的结构种类。
因此,安全、快捷、方便的电子支付手段将是今后网上商店健康发展的主要要素。
1.3 项目提出原因为了对所学知识(软件工程)做一个全面的考查,加深对软件工程思想的理解和提高个人的实践能力,赵岚老师要求我们用所学的知识完成一个实际的项目(系统)。
1.4系统设计目标网上购物系统以解决客户在网上进行电子交易的需求为出发点构思。
因此在建立与消费者之间交流信息和进行电子交易方面在行业中具有示范作用,在系统总体规划中,应把握先进性、安全性、可扩展性和集成性四项基本原则。
(1)先进性原则设计方案立足先进技术。
在服务器和网络方面以优化通信流量,提高系统的管理性和安全性为重点,尽量采用领先成熟的技术。
(2)安全性原则网上购物系统要解决的安全问题包括非授权使用、非法入侵、服务失效、不可否认和交易信息泄漏。
系统采用防火墙技术,隔离Internet,一方面可以防范公用网上非法用户的访问,另一方面可以防止中心的一些重要数据被不合法用户所获取。
(3)可扩展性原则系统中所有功能均考虑到随着应用的逐步完善和入网产品和消费者的逐渐增加,系统还能够进行不断扩展的要求。
1.5项目构想为了方便地、完整地实现购物流程,本网站所需要的功能模块主要包括前台服务模块和后台管理模块,两大功能模块又细分为若干子模块,具体分析如下:1.6系统功能这是一个JSP开发的网上购物体系统,后台数据库是SQL Server2000,该系统将主要完成以下两个任务:(1) 构建一个前台服务模块,通过会员注册登录、在线购物、站内新闻公告发布等功能模块实现完整的网上购物流程并提供即时的购物信息服务。
(2) 构建一个后台管理模块,通过用户信息管理、商品信息管理、交易信息管理、站内信息管理等子功能模块实现对购物系统所有数据和信息的动态更新、管理和维护。
1.7项目名称网上购物系统1.8 需求分析分析1购物系统(顾客需求与后台管理人员的需求)顾客需求是查询商品,个人购买情况及个人信息的修改顾客可根据自己的需求添加和删除所购买的商品顾客可以通过本系统实现异地购物方便快捷。
分析2管理员可以对用户信息进行安全管理管理人员可对顾客,商品,订单进行管理和维护,及系统状况的查看商品数据具有较高的安全性和保性,可通过管理员进行添加与删除修改与维护。
分析3用户角色分析一个真实的商店的商业行为参与者主要有3类,商店的拥有者、顾客和配送商。
商家把自己的产品拿到商店里销售。
顾客是逛商场的人,即买家。
配送商专门负责物流配送,帮助把顾客无法自己携带回家的商品送回家。
网上购物系统的使用者类型与现实中的商店极为相似,网上与网下的对的对照见下表。
1.9所运用的知识点a.数据库(SQL Server 2000)的运用b.JSP脚本和指令的使用。
c.JSP隐式对象d.JavaBean和JSP 中的标准标准动作及标准标签库。
e.使用会话技术存储用户所购买的商品。
f.使用过虑器强制登陆。
2.概要设计2.1“网上购物”系统的管理员需要使用系统提供的如下功能:管理员登陆;管理商品;管理订单;管理用户;顾客需要使用系统提供的如下功能:用户注册;用户的登陆;在线购物;下订单;查看订单信息2.2功能图2.2.1 购物车流程图2.2.2 定单处理流程图2.2.3商品分类管理流程图2.2.4所实现的功能功能1—管理员所实现的功能a.管理员登陆b.管理商品c 管理定单d.管理用户e.对商品进行增、删、查、改f..对定单进行简单的查阅g.对用户资料的管理。
功能2—顾客所实现的功能a.用户注册b.用户登陆c.在线购物d.下定单e.查看定单信息2.2.5实现中的问题及难点问题1: 当点击购买商品时,怎么使购买商品数量增加。
问题2: 为了连接数据库,在很jsp页面中都会涉及到数据库加裁,连接,这样代码重复,对整个系统的开销很大,如何解决?问题3:用户删除定单时候,数据库中的产品数量要同时增加相应的数量。
问题4::在下定单时,数据库中的产品数量要同时减少相应的数量。
3.详细设计3.1商品信息商品信息具有这些属性:商品id号,商品名,商品类别id号,商品新旧程度,产地,内容介绍,价格,总数量,剩余数量,商品发布时间等。
这些实体的详细信息如下:管理员:管理员id号,管理员名,密码。
用户:用户id号,用户名,密码,姓名,id编号,邮编,地址,email,电话。
3.2商品类别:商品类别名,商品描述。
3.3商品信息:商品id号,商品编号,商品名,商品类别id号,描述,价格,总数量,状态,图片。
3.4订单:订单id号,订单编号,用户id号,订单提交时间,id编号,邮编,地址,Email,电话。
3.5订单明细:id号,订单id,商品id,商品数量,单价,总价。
3.6 对概要设计中的四个问题的具体解决办法解决1:为了实现数量累积,使用了一个Set接口,用HashSet来实现Set接口,因为Set接口可以把相同的对象只存储一个。
用HashMap存储购买数量。
HashSet的实例存储购买的商品。
解决2:为了降低开销,提高效力,我们采用了把数据库连接都放到一个JavaBean中,由它单独完成,当涉及到数据库的操作时,我们直接用jsp中的include调用就可以了。
解决3:用户删除订单时,相应的的商品数量增加,也可以在OrderMess中创建一个Delete触发器.当删除定单时。
同是创建一个删除信息表.代码如下:CREATE TRIGGER Tri_Del ON [dbo].[OrderMess]FOR DELETEASif not exists(select * from sysobjects where name = 'Temptable')select orderid,productid,quantity into Temptable from deletedelseinsert into Temptable select orderid,productid,quantity from deleted解决4:在Shopping数据库中的OrderMess表上建一个Insert触发器,就可以解决数量同时减少问题。
4.编码:do_register 代码:此部分代码用于把已经确认的正确的注册信息写入数据库后保存。
<%@page contentType="text/html; charset=gb2312" language="java"import="java.sql.*,java.util.Date" errorPage="" %><html><head><title>注册成功</title><link rel=stylesheet href="style.css" type="text/css"></head><body><%String name=request.getParameter("name");String pwd=request.getParameter("password");String e_mail=request.getParameter("e_mail");String telephone=request.getParameter("telephone");String address=request.getParameter("address");java.util.Date regTime=new java.util.Date();String register_Time=regTime.toString();String query="insert into customer_info(Name,Telephone,Email,Address,Login_Time,Passwd)values('"+name+"','"+telephone+"','"+e_mail+"','"+address+"','"+register_Time+"','"+pwd+"')";//try//{String sDBDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";Class.forName(sDBDriver);String sConnStr="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Web";String username="sa";String pwd1="";Connection connWeb=DriverManager.getConnection(sConnStr,username,pwd1);Statement stmt=connWeb.createStatement();stmt.executeUpdate(query);stmt.close();connWeb.close();out.println("恭喜!注册成功!您注册的信息已经写进数据库!");//}//catch (SQLException e)//{// out.println(e.getMessage());//}%></body>Index 代码:此部分代码主要是本网上购物系统的登录页面显示,用于顾客登陆本系统<%@page contentType="text/html; charset=gb2312"%><html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>欢迎来到jsp网上书店!</title></head><body><tr><td colspan=2 align='center'><h1><table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="755" height="168"><param name="movie" value="images/lucky.swf"><param name="quality" value="high"><embed src="images/lucky.swf" quality="high" pluginspage="/go/getflashplayer"type="application/x-shockwave-flash" width="755" height="168"></embed></object></td> </tr></table></tr><form name="form1" method="post" action="login.jsp"><p>帐号<input type="text" name="name"></p>密码<input type="password" name="password"><tr> <p><p><td width="179" valign="top"><p align="left"> <input type="image" name="B1" src="pic/denglu.gif" onClick="check()"> <a href="register.jsp"><img src="pic/zhuce.gif" border="0"></a></td></tr></p></form></body></html>List代码:此部分代码主要用于购物篮增加、删除、显示购物清单等功能(涉及数据库操作) <%@ page session="true" %><%@ page import="java.sql.*,java.util.*" %><html><head><title>JSP在线书店</title><script language="JavaScript" type="text/JavaScript"><!--function MM_swapImgRestore() { //v3.0var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;}function MM_preloadImages() { //v3.0var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}}function MM_findObj(n, d) { //v4.01var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];for(i=0;!x&&yers&&i<yers.length;i++) x=MM_findObj(n,yers[i].document);if(!x && d.getElementById) x=d.getElementById(n); return x;}function MM_swapImage() { //v3.0var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}}//--></script><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><%String loginSign=(String)session.getValue("loginSign");if(loginSign.equals("OK")){%><body bgcolor="#F4F5FF" onLoad="MM_preloadImages('images/bb1_1.jpg','images/bb2_1.jpg','images/bb3_1.jpg','images/ bb4_1.jpg','images/bb5_1.jpg')"><font face="Times New Roman,Times" size="+3"> </font><table width="78%" border="0" align="center" cellpadding="0" cellspacing="0"><tr><td width="20%"><img src="images/logo.jpg" width="230" height="120"></td><td width="80%"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="/pub/shockwave/cabs/flash/swflash.cab#version=6,0, 29,0" width="540" height="120"><param name="movie" value="images/8.swf"><param name="quality" value="high"><embed src="images/8.swf" quality="high" pluginspage="/go/getflashplayer"type="application/x-shockwave-flash" width="540" height="120"></embed></object></td></tr></table><hr><p><center><b><font color="#3300CC" size="+3" face="华文行楷">JSP在线书店</font></b><table border="1"><tr><td width="72"><a href="#" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('Image1','','images/bb1_1.jpg',1)"><img src="images/bb1.jpg" alt="欢迎光临湖北工业大学JSP书店" name="Image1" width="160" height="46" border="0"></a></td><td width="80"><a href="#" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('Image2','','images/bb2_1.jpg',1)"><img src="images/bb2.jpg" alt="欢迎光临湖北工业大学JSP书店" name="Image2" width="160" height="45" border="0"></a></td><td width="40"><a href="#" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('Image3','','images/bb3_1.jpg',1)"><img src="images/bb3.jpg" alt="欢迎光临湖北工业大学JSP书店" name="Image3" width="160" height="45" border="0"></a></td><td width="88"><a href="#" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('Image4','','images/bb4_1.jpg',1)"><img src="images/bb4.jpg" alt="欢迎光临湖北工业大学JSP书店" name="Image4" width="160" height="45" border="0"></a></td><td width="68"><a href="#" onMouseOut="MM_swapImgRestore()" onMouseOver="MM_swapImage('Image5','','images/bb5_1.jpg',1)"><img src="images/bb5.jpg" alt="欢迎光临湖北工业大学JSP书店" name="Image5" width="160" height="45" border="0"></a></td></tr><%! String item;%><%! String[] title,author,pubhouse;%><%! float[] price;%><%! int[] id;%><%! float totalAmount; %><%! int count,removeNo,i; %><%! boolean isExist;%><%try{String sDBDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";Class.forName(sDBDriver);String sConnStr="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Web";String username="sa";String password="";Connection connWeb=DriverManager.getConnection(sConnStr,username,password); Statement stmt=connWeb.createStatement();String query="select bookname,author,price,publichouse,bookid from book_info";ResultSet rs=stmt.executeQuery(query);i=0;while(rs.next()){i++;}title=new String[i];author=new String[i];pubhouse=new String[i];price=new float[i];id=new int[i];i=0;rs=stmt.executeQuery(query);while(rs.next()){title[i]=rs.getString(1);author[i]=rs.getString(2);price[i]=rs.getFloat(3);pubhouse[i]=rs.getString(4);id[i]=rs.getInt(5);%><tr><td><%= title[i] %></td><td><%= author[i] %></td><td><%= price[i] %></td><td><%= pubhouse[i] %></td><td><A href="list.jsp?action=add&item=<%= i%>"><img src="images/wing_20.jpg" width="160" height="46"></a></td></tr><%i++;}rs.close();stmt.close();connWeb.close();}catch(Exception e){out.println(e.getMessage());}%></table><%String action=request.getParameter("action");if(action!=null){%><form action="purchase.jsp" mothod="post">您的购物车中有以下物品:<table border="1"><tr><td>booktitle</td><td>bookauthor</td><td>price</td><td>publichouse</td><td>Quantity</td><td>--------</td></tr><%isExist=false;Vector buyList=(Vector)session.getValue("shoppingcart"); item=request.getParameter("item");int bookID;shop.Bookinfo cart=new shop.Bookinfo();try{bookID=Integer.parseInt(item);if(action.equals("add")){cart.setId(id[bookID]);cart.setBookname(title[bookID]);cart.setAuthor(author[bookID]);cart.setPrice(price[bookID]);cart.setQuantity(1);cart.setPublichouse(pubhouse[bookID]);if (buyList==null){buyList = new Vector();buyList.addElement(cart);}else{for (int i=0;i<buyList.size();i++){int tempid=((shop.Bookinfo)buyList.elementAt(i)).getId();int tmp=((shop.Bookinfo)buyList.elementAt(i)).getQuantity();if(tempid==cart.getId()){isExist=true;((shop.Bookinfo)buyList.elementAt(i)).setQuantity(tmp+1);}}if(!isExist)buyList.addElement(cart);}}if(action.equals("del")){for (int i=0;i<buyList.size();i++){int tempid=((shop.Bookinfo)buyList.elementAt(i)).getId();if (tempid==bookID)removeNo=i;}buyList.removeElementAt(removeNo);}session.putValue("shoppingcart",buyList);totalAmount=0;for(int i=0;i<buyList.size();i++){out.println("<tr>");out.println("<td>");out.println(((shop.Bookinfo)buyList.elementAt(i)).getBookname());out.println("</td>");out.println("<td>");out.println(((shop.Bookinfo)buyList.elementAt(i)).getAuthor());out.println("</td>");out.println("<td>");out.println(((shop.Bookinfo)buyList.elementAt(i)).getPrice());out.println("</td>");out.println("<td>");out.println(((shop.Bookinfo)buyList.elementAt(i)).getPublichouse());out.println("</td>");out.println("<td>");out.println(((shop.Bookinfo)buyList.elementAt(i)).getQuantity());out.println("</td>");out.println("<td>");int tmp=((shop.Bookinfo)buyList.elementAt(i)).getId();int tmpQuantity=((shop.Bookinfo)buyList.elementAt(i)).getQuantity();float price=((shop.Bookinfo)buyList.elementAt(i)).getPrice();float booktotal=price*tmpQuantity;totalAmount=totalAmount+booktotal;%><A href="list.jsp?action=del&item=<%= tmp%>">暂时不购买:)</a><%out.println("</td>");out.println("</tr>");}out.println("</table>");out.println("total:"+totalAmount);out.println("<input type=\"submit\" value=\"submit\">");}catch(Exception e){out.println(e.getMessage());}}}%></form></center></body></html>Login 代码:此部分代码主要检验用户名与密码是否正确存在,若是则登录进入系统,否则提示错误信息<%@ page session="true" %><%@ page import="java.sql.* " %><html><head><title>Book store</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body bgcolor="#F4F5FF"><font face="Times New Roman,Time" size="+3"> 网上书店</font><hr><p><center><%String name=request.getParameter("name");String pwd=request.getParameter("password");//try{String sDBDriver="com.microsoft.jdbc.sqlserver.SQLServerDriver";Class.forName(sDBDriver);String sConnStr="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Web";String username="sa";String password="";Connection connWeb=DriverManager.getConnection(sConnStr,username,password); Statement stmt=connWeb.createStatement();String query="select Customer_ID from customer_info where Name='"+name+"' and Passwd='"+pwd+"'";ResultSet res=stmt.executeQuery(query);if(res.next()){Integer temp=new Integer(res.getInt(1));res.close();String customerid=temp.toString();session.putValue("loginSign","OK");session.putValue("cID",customerid);%><%response.sendRedirect("list.jsp");%><%}else{res.close();session.putValue("login_message","用户名或密码错误");%><jsp:forward page="register.jsp"/><%}}//catch(Exception e){//e.getMessage();}%></center></body></html>Purchase 代码:此部分代码主要用于把购物篮信息写入数据库保存,并可从后台查询相关购物信息。