网上购物系统需求分析(共25页).doc
精选优质文档-倾情为你奉上网上购物系统需求分析1121管理信息系统张婷婷 文静 马世伟目录1序言32系统需求分析说明32.1 系统介绍.32.2 功能需求.33 总体设计33.1 总体设计和模块结构.33.2 处理流程 .44 页面设计.64.1 前台设计.6 4.1.1 商品浏览页面6 4.1.2 用户. .64.2 后台设计7 4.2.1 后台登陆面.7 4.2.2 后台管理页面.75 系统详细设计.85.1 前台设计.8 5.1.1 前台设计总体模块.8 5.1.2 前台文件架构.9 5.1.3 用户注册模块.9 5.1.4 我的订单模块13 5.1.5 商品浏览模块15 5.1.6 个人管理模块195.2 后台设计.20 5.2.1 后台总体模块20 5.2.2 订单管理模块21 5.2.3 图书管理模块23 5.2.4 用户管理模块236 测试6.1 测试方式.246.2 测试步骤.246.3 测试结果评价.24参考文献专心-专注-专业1序言 随着Internet1的发展,计算机软件系统不断的应用于各个领域,比如银行,超市,图书馆等。这些计算机软件系统给管理人员带来了极大的方便,提高了工作效率,减少工作人员工作量。就拿图书销售来说,网上书店已走进我们的生活中。通过它,我们购买图书更加的方便,便捷,也给经销商对书籍的,采购,统计等管理范围2内带来很大的方便。2系统需求分析说明2.1系统介绍本系统是建立在Windows平台上,基于B/S结构5的一个简单网上书店。通过这个网上书店,可以更加方便地管理图书和销售图书。2.2 功能需求通过对当当网,卓越网等网上书店的认识和分析,我对网上书店有了基本的了解,我觉得该系统至少应该具有以下的一些基本功能:(1) 注册管理:能够对用户名,密码的简单验证;能够对电子邮箱,Email进行有效性验证;能够防止利用页面刷新重复注册,以及已经注册的用户不能重复注册。(2) 商品浏览:分类显示商品;显示商品详情,提供购买链接;可以对商品进行模糊查询;显示当前用户的浏览记录。浏览商品时不要求用户登录,但下订单前用户必须登录,对于浏览过的商品有历史记录。3总体设计3.1总体结构和模块设计(1)前台部分由用户使用,包括用户注册,购物车,我的订单,商品浏览,个人管理等几个部分。(2)后台部分由用户管理,订单管理,商品管理等几个部分。功能结构图如下:网上书店系统前台功能系统后台功能用户注册我的订单商品管理购物车商品浏览订单管理用户管理个人管理图3.1 功能模块设计图3.2处理流程业务流程如下:图3.2 .业务流程图4页面设计4.1前台页面 4.1.1商品浏览页面图4.1 前台登陆页面4.1.2用户 图4.2 用户注册页面4.2后台页面4.2.1后台登陆页面图4.3 后台登陆入口页面4.2.2后台管理页面 图4.4后台管理页面5系统详细设计5.1 前台设计5.1.1前台总体模块7:(1)前台部分由用户使用,包括用户注册,购物车管理,我的订单,商品浏览,个人管理等几个部分。模块功能介绍:用户注册:能够提供用户的注册,并且对用户的注册进行以下验证:用户名非空;密码不小于6位;邮箱Email的有效性;防止通过刷新重复提交.购物车管理:所选商品须通过购物车进行保存;对于相同的书籍,在再次购买的时候,在购物车中相应的书籍上增加数量;在购物车中修改订单数量的时候防止输入非数字;在购物车然后生成订单。我的订单:用户可以查看自己所有的订单,以及查看具体某一张订单,通过查看订单,用户可以查看订单现在的状态,查看订单的具体详情:收货人地址,收货方式,付款方式,具体商品,小计,总计等等。商品浏览:用户可以通过商品的id或者商品的名称进行查找商品,并且对于浏览过的商品存在浏览历史,对于登陆后的用户可以对商品进行留言。个人管理:用户可以管理自己账号的相关信息,比如:修改个人的基本信息,修改自己的密码。5.1.2前台文件架构: 图5.1 前台文件架构5.1.3用户注册模块: 用户可以通过注册评论商品代码实现:1. 有效性验证8: 通过js 对客户端的提交数据进行有效性验证.关键代码如下:检查邮箱的有效性:function chkEmail(str)return str.search(/w-1,w-1,.w-1,/)=0?true:false;function check() if(myform.userName.value="")alert("请填写用户名");return false;else if(!IsValid() alert("用户名只能使用字母和数字"); return false;else if(myform.psw.value="")alert("请填写密码");return false;else if(myform.psw.value != myform.conpsw.value)alert("两次密码不一致");return false;else if(myform.trueName.value ="")alert("请填写姓名");return false;else if(myform.email.value ="")alert("请填写邮箱");return false;else if(!chkEmail(myform.email.value)alert("请填写有效的Email地址");return false;else if(myform.address.value ="")alert("地址必须填写!");return false;else if(myform.nam.value="") alert("请输入验证码");else if(myform.nam.value!=myform.con.value)alert("两次验证码不一样!");else document.myform.submit();2. 防止通过刷新重复提交9:当提交完注册信息后,要求输入验证码,防止重复提交数据到数据库,通过image.jsp写出一个随机数,与注册jsp页面相匹配,关键代码如下: Jsp页面验证码:<script language="javascript" runat=client>var n=parseInt(Math.random()*8999+1000);myform.con.value = n;document.write("<img id=mk src=/BookShopping/image.jsp?num="+n+">");function nextImage()n=parseInt(Math.random()*8999+1000);myform.con.value = n;document.all("mk").src="/BookShopping/image.jsp?num="+n;</script><a href="javascript:nextImage();">换一张</a>Image.jsp代码如下:<%tryBufferedImage bf=new BufferedImage(70,25,BufferedImage.TYPE_INT_RGB);Graphics2D g2=bf.createGraphics();g2.setPaint(new Color(0,0,255);g2.fillRect(0,0,70,25);g2.setPaint(new Color(255,255,255);String str=request.getParameter("num");session.setAttribute("num",str);g2.setFont(new Font("Arial",Font.BOLD,24);g2.drawString(str,7,20);for(int i=0;i<10;i+)int r=(int)(Math.random()*255);int g=(int)(Math.random()*255);int b=(int)(Math.random()*255);g2.setPaint(new Color(r,g,b);int x1=(int)(Math.random()*80);int y1=(int)(Math.random()*30);int x2=(int)(Math.random()*80);int y2=(int)(Math.random()*30);g2.drawLine(x1,y1,x2,y2);g2.dispose();ImageIO.write(bf,"jpg",response.getOutputStream();out.clear();out = pageContext.pushBody();catch(Exception e)System.out.println(e);%>3.防止相同用户名用户注册:当提交数据后,为了防止出现相同的用户,在进行注册的时候,通过相应的DAO中的exsitOne方法先检查用户名是否存在,存在不允许注册,关键代码如下:public Boolean exsitOne(String userName) String sql = "select uName from RegUser"try stat = conn.createStatement();rs = stat.executeQuery(sql);while(rs.next() String exsit = rs.getString("uName");if(userName.equals(exsit) return true; catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace(); return false; 图5.2 注册验证图5.1.4我的订单模块: 对于购买了商品的用户,在产生订单后,可以通过双击查看订单,在查看订单的时候,可以查看到订单的当前状态,以及订单的总金额,和订单的一些基本信息。1.显示所有订单:读取数据库中指定用户的所有订单,将结果集存取到一个ArrayList中,再返回显示页面,关键代码如下:response.setContentType("text/html");String id = request.getParameter("uid");String sql = "select * from bookOrder where uid = "+id;DAOdao = new DAO();ResultSet rs = dao.getOrderInfo(sql);ArrayList<MyOrderBean> mylist = new ArrayList<MyOrderBean>();try while(rs.next() int oid = Integer.parseInt(rs.getString("oId");String receiver = rs.getString("oReceiveName");String oPayType = rs.getString("oPayType");float total = dao.getTotal("select sum(oAmount*oPrice) from orderInfo where oId ="+oid );String oStatus = rs.getString("oStatus");String date = rs.getString("oTime");MyOrderBean one = new MyOrderBean(oid,date,receiver,total,oPayType,oStatus);mylist.add(one); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();2.显示某个订单:当用户双击某个订单的时候,通过订单的id,以及用户id,联合查询出指定的订单,再返回到显示页面,关键代码如下:String id = request.getParameter("id");String sql = "select * from bookOrder,orderInfo,book where bookOrder.oId = orderInfo.oId and book.bId = orderInfo.bId and bookOrder.oId = "+ id + ""DAO dao = new DAO();ResultSet rs = dao.getOrderInfo(sql);ArrayList<AllbookInOneOrder> onelist = new ArrayList<AllbookInOneOrder>();String receiver = ""String address = ""String phone = ""String sendType = ""String payType = ""try while (rs.next() receiver = rs.getString("oReceiveName");address = rs.getString("oReceiveAddress");phone = rs.getString("oReceivePhone");sendType = rs.getString("oSendType");payType = rs.getString("oPayType");String bookname = rs.getString("bName");int count = rs.getInt("oAmount");float price = rs.getFloat("oPrice"); AllbookInOneOrder one = new AllbookInOneOrder(bookname, count,price);onelist.add(one);com.with.javabean.MyOneOrderBean oneorder = new com.with.javabean.MyOneOrderBean(receiver, address, phone, sendType, payType, onelist);request.setAttribute("order", oneorder);request.setAttribute("id", id);request.getRequestDispatcher("./MyOneOrder.jsp").include(request, response); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();5.1.5 商品浏览模块: 用户可以通过商品的分类查找到相应类别的商品,也可以通过输入相应商品的名称,找到相应的商品: 1.商品分类:读取数据库中的制定类别,将所有类别显示在首页的商品类别导航上面,关键代码如下:<table border=0 width=100% cellspacing=0 cellpadding=0><%ArrayList<BookType> booktype = (ArrayList<BookType>) request.getAttribute("bookTypeInfos1");if (null != booktype) for (int i = 0; i < booktype.size(); i+) BookType bookTypeInfo = booktype.get(i);%><tr><td align=center width=26 class=class_td><img border=0 src=images/class_y.gif></td><td align=left width=155 class=class_td><a title="<%=bookTypeInfo.getBTypeName()%>"href="/BookShopping/servlet.user/ListOneBookType?bid=<%=bookTypeInfo.getBTypeId()%>"><font style="font-size: 10.5pt" color=#9e0b0e><%=bookTypeInfo.getBTypeName()%></font> </a></td></tr><%></table>2.商品查找:用户可以通过输入书籍名称,查找出自己要找的书籍,关键代码如下: Servlet: DAO dao = new DAO();String sql ="select * from book where bName like '%"+what+"%'"ArrayList<Book> arraylist = new ArrayList<Book>();ResultSet rs = dao.getOrderInfo(sql);/得到所查的书 DAO:public ResultSet getOrderInfo(String sql) try stat = conn.createStatement();rs = stat.executeQuery(sql); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();return rs;3. 浏览历史:用浏览历史是为了方便用户查找自己浏览过的商品,当用户点击了一件商品的购买链接的时候,就会在浏览历史中保存该商品,并创建一个相应的链接,方便下次查看. 关键代码如下:点击链接产生Cookie: <a title="<%=bookInfo.getBName()%>"href="/BookShopping/servlet.user/ListOneBook?id=<%=bookInfo.getBId()%>"onclick="setCookies('history<%=bookInfo.getBId()%>','<%=bookInfo.getBName()%>');"><font style="font-size: 14pt" color=#9e0b0e><%=bookInfo.getBName()%></font> </a>在指定区域读取Cookie:Cookie cook = request.getCookies();if (cook != null) for (int i = 0; i < cook.length; i+) if(cooki.getName().indexOf("history") != -1) %><li><ahref="servlet.user/ListOneBook?id=<%=cooki.getName().substring(7)%>"target="_blank"><script type="text/javascript"> document.write(unescape("<%=cooki.getValue()%>");</script> </a> 图5.3 商品浏览和浏览历史图4. 商品评论13:对于登陆后的用户,可以对商品进行相应的评论,如果没有登陆跳转到登录页面:关键代码如下:1.检查是否登录:对于没有登陆的用户,不允许对商品进行评论,跳转到登陆页面,关键代码如下:function check() if("<%=session.getAttribute("UserName")%>"!="null") document.myform.submit();else window.alert("请登陆");window.location.href="./index.jsp"<td height="10"><input type="button" name="button" value="发表评论"onclick="check()"></td>2.商品留言:对于登陆后的用户,可以对商品进行评论,关键代码如下:request.setCharacterEncoding("gbk");response.setContentType("text/html;chartset=gbk"); PrintWriter out = response.getWriter();String bookId1 = request.getParameter("bookid");String username = request.getParameter("username");String date = request.getParameter("date");String describle1 = request.getParameter("body");String describle = new String(describle1.getBytes("ISO-8859-1"),"GBK");String sql = "insert into comment values('"+username+"','"+bookId1+"','"+date+"','"+describle+"')"DAOdao = new DAO();if(dao.insert(sql) response.sendRedirect("/BookShopping/servlet.user/ListOneBook?id="+bookId1+"");图5.4商品评论图5.1.6 个人管理模块: 用户可以查看自己的个人信息,可以修改自己的个人信息,但是用户名不允许修改,以及修改密码,来保证用户的安全性。1. 查看个人信息:通过链接查看自己的个人信息。关键代码如下:String sql = "select * from RegUser where uId="+id+""UserBean one = null;try stat = conn.createStatement();rs = stat.executeQuery(sql);while(rs.next() String username = rs.getString("uName");String truename = rs.getString("uRealname");String sex = rs.getString("uSex");String mail = rs.getString("uEmail");String phone = rs.getString("uPhone");String address = rs.getString("uAddress");one = new UserBean(username,truename,sex,mail,phone,address);2. 修改个人信息:通过链接可以修改个人信息,但是用户名不能修改。关键代码如下:request.setCharacterEncoding("GBK");response.setContentType("text/html;charset=GBK");String userName = request.getParameter("userName");String psw = request.getParameter("psw");String trueName = request.getParameter("trueName");String trueName1 = new String(trueName.getBytes("ISO-8859-1"),"GBK");System.out.println("ModifyMyInfoOk:"+trueName);String sex = request.getParameter("sexradiobutton");String sex1 = new String(sex.getBytes("ISO-8859-1"),"GBK");String email = request.getParameter("email");String phone = request.getParameter("phone");String address = request.getParameter("address");String address1 = new String(address.getBytes("ISO-8859-1"),"GBK");DAOdao = new DAO(); String sql = "update RegUser set uPassword = '"+psw+"',uRealname='"+trueName1+"',uEmail='"+email+"',uSex='"+sex1+"',uPhone='"+phone+"',uAddress='"+address1+"' where uName='"+userName+"'"if(dao.ModifyMyInfo(sql) request.getRequestDispatcher("./SuccessOrder.jsp").include(request, response);else request.getRequestDispatcher("./error.jsp").include(request, response);5.2 后台设计5.2.1后台总体模块:后台部分由用户管理,订单管理,商品管理等几个部分。模块功能介绍:用户管理:能够通过用户的姓名和用户的id查询到指定的用户,并且能够对指定的用户进行冻结,被冻结的用户不能登录自己的账号,无法购买书籍,可以对冻结的用户进行启用,对于忘记自己密码的用户,管理员可以进行密码的重置。订单管理:能够通过订单的id,或者根据时间段来查询指定的订单,可以对指定的订单修改订单的状态。商品管理:可以增添商品的分类,可以对现有的分类进行修改,对于分类中存在书籍的,不允许删除;以增添新的商品,对原有的商品进行修改。5.2.2订单管理模块: 管理员能够通过时间段,订单状态来查询订单,并且可以修改订单的状态,关键代码如下:String list = request.getParameter("order");selection = new String(selection.getBytes("ISO-8859-1"),"GBK");if(null = list)arrayList = DaoImp.Dao.getDao().ListOrder(page,"oStatus='"+selection+"'");elseString startTime = request.getParameter("begin");String endTime = request.getParameter("end");arrayList = DaoImp.Dao.getDao().ListOrder(page," and oStatus='"+selection+"' or(oTime >='"+startTime+"' and oTime<='"+endTime+"')"); 图5.5 订单管理图图5.6订单查询图5.2.3图书管理模块: 管理员可以对图书分类信息进行增添,修改,删除,但是存在图书的分类不能够被删除,可以通过图书编号和图书名称来查询指定的书籍,并且可以修改和删除书籍,主要代码如下:if (selection = null)/ 查找全部arrayList = DaoImp.Dao.getDao().ListBook(page,"");if ("all".equals(selection)/ 查找全部arrayList = DaoImp.Dao.getDao().ListBook(page,"");String input = request.getParameter("input");if ("id".equals(selection)/ 按照idarrayList = DaoImp.Dao.getDao().ListBook(page,"and bId ='"+input+"'");if ("name".equals(selection)/ 按照名字input = new String(input.getBytes("ISO-8859-1"),"GBK");arrayList = DaoImp.Dao.getDao().ListBook(page,"and bName like '%"+input+"%'"); 图5.7 图书管理图5.2.4用户管理模块:注册用户管理是为了方便管理系统,能够对恶意用户进行冻结,能够启用用户,对于忘记密码的用户可以进行密码的重置。关键代码如下:if("inUse".equals(flag)/冻结