网上购物系统毕业设计.doc
网上购物系统软件设计说明书目录1. 介绍1目的1范围1定义、缩写词1内容概览12. 体系结构表示方法13. 系统要达到的目标和限制24. 用例视图2普通用户注册3普通用户登陆4普通用户修改密码5普通用户选购并结账8管理员添加图书8管理员删除图书10用户退出登录系统11管理员退出系统12管理员登陆系统13管理员修改密码14管理员注册155. 逻辑视图17总览17主要Package的介绍186. 过程视图20用户注册20用户选购并结账22管理员添加删除图书257. 部署视图268. 规模和性能299. 质量2910. 测试2910.1测试概要2910.2测试结果及发现3010.2.1注册模块测试3010.2.2登录模块测试3010.2.3购书,结账模块3110.2.4修改密码模块测试3110.2.5退出登录模块3110.2.6添加图书模块3211. 附录32软件设计说明书1. 介绍目的通过编写本文档,目的是对所开发项目网上书店售书系统,在概要设计的基础上进一步明确系统结构,详细地介绍系统的各个模块,为进行后面的实现和测试作准备。范围介绍了网上书店售书系统的注册模块、登录模块、选购图书、修改密码、管理员添加图书、退出登录、结账等几个模块。定义、缩写词SQL:结构化查询语言数据库:数据库是依照某种数据模型组织起来并存放二级存储器中的数据集合。Member:存储用户名和密码的数据库 Computer:存储计算机类图书的数据库库Machine:存储机械类的数据库Accounting:存储会计类的数据库内容概览² 注册:会员的注册² 登录:会员的登录² 选购图书结账:最基本的功能,会员可以买书² 修改密码:会员修改密码² 退出登录:会员买完书退出登录² 添加图书:管理员的功能,向数据库添加图书² 删除图书:管理员的功能,向数据库添加图书² 数据库:实现数据的查询、添加、修改、删除的功能2. 体系结构表示方法UML提供5种视图,从不同的角度描述系统的内容,不同的人员关注不同的方面,本文档采用其中4种:用例视图:着重描述系统的功能。主要使用这个有用户,系统分析人员,设计人员和测试人员。逻辑视图:展示了描述系统关键方面的重要用例实现场景(使用交互图);部署视图:描述系统的硬件拓扑关系。数据视图:描述了数据流、持久性数据模式、对象与持久性数据之间的模式映射、对象到数据库、存储过程以及触发器的映射机制(使用类图描述数据模型,活动图表示数据流)。3. 系统要达到的目标和限制Ø 目标网上书店售书系统的目标是:在Internet,数据库和先进开发平台的基础上,利用现有的软件,配置一定的硬件,开发出一个具有开放体系结构的、易维护的、易移植的、健壮性较强的具有良好人机交互界面的网上书店售书系统。从而为广大喜欢网上购书的用户提供一个方便快捷的网上购书平台。Ø 限制普通用户不允许往数据库里添加图书,系统管理员才允许。会员名必须注册过,才能够登录。用户没有登录可以选购图书,但是不允许结账。只有用户登陆后才允许修改密码。只有用户登录才允许退出登录4. 用例视图 网上书店售书系统描述的主要用例有:用户注册,用户登录,选购图书,结账,用户退出登录,管理员注册,管理员登录系统,添加图书,删除图书,管理员修改密码,管理员退出登录。系统用例图系统用例图见图4.1:图4.1 系统用例图普通用户注册用例简述用户输入用户名和密码,申请成为会员基本事件流1 用户:用户提出注册要求2 系统:显示注册页面3 用户:输入要注册的用户名和密码4 系统:验证注册信息是否符合要求,若符合要求,则将信息存入数据库5 顾客:显示注册成功7 用例结束。活动图普通用户注册的活动图见图4.2图4.2 普通用户注册的活动图普通用户登陆用例简述普通用户输入用户名和密码后可以进行图书的购买基本事件流1 用户:输入用户名和密码2 系统:验证登陆信息是否正确3 用户:显示登陆成功4 用例结束。活动图普通用户登陆的活动图见图4.3图4.3 普通用户登录的活动图普通用户修改密码用例简述普通用户对于已经遗忘或者被盗取的密码可以及时修改。基本事件流1 用户:输入原有的用户名和密码,2 系统:验证登录信息是否正确3 系统:显示注册的用户4 用户:输入旧密码和新密码5 系统:验证修改密码信息是否正确6. 系统:显示修改的密码7 用例结束活动图普通用户修改密码的活动图见图4.4图4.4 普通用户修改密码的活动图普通用户选购并结账用例简述用户选取自己想要的图书后加入购物车中并结账基本事件流1 用户:输入用户名和密码2 系统:验证登录信息是否正确3 用户:选购图书后放入购物车,结账4 用例结束。活动图普通用户选购并结账的活动图见图4.5图4.5 普通用户选购并结账的活动图管理员添加图书用例简述管理员向数据库中添加图书基本事件流1 管理员:输入用户名和密码2 系统:验证登陆信息是否正确3 系统:验证是否为管理员4 管理员:输入表名,书名,价格5 系统:验证输入信息是否正确,如果正确则添加进入数据库6 管理员:添加成功,显示添加的图书的书名7 用例结束。活动图管理员添加图书的活动图见图4.6图4.6 添加图书的活动图管理员删除图书用例简述管理员可以删除数据库中脱销,缺货或者停产的图书基本事件流1 管理员:输入用户名和密码2 系统:验证登陆信息是否正确3 系统:验证是否为管理员4 管理员:输入表名,书名,价格5 系统:验证输入信息是否正确,如果正确则从数据库中删除图书的所有内容6 管理员:删除成功,显示删除的图书的书名7 用例结束。活动图管理员删除图书的活动图见图4.7图4.7 删除图书的活动图用户退出登录系统用例简述用户退出登陆系统基本事件流1 用户:在登陆界面输入用户名和密码2 系统:验证登陆信息是否正确3 用户:确认从系统中退出4 结束用例。活动图用户退出登陆系统的活动图见图4.8 图4.8 用户退出登录系统的活动图管理员退出系统用例简述管理员退出系统。基本事件流1 管理员:在登陆界面输入用户名和密码2 系统:验证登陆信息是否正确3 管理员:确认从系统中退出4 结束用例。活动图管理员退出系统的活动图见图4.9图4.9 管理员退出系统的活动图管理员登陆系统用例简述管理员可以输入用户名和密码后进入系统进行管理操作基本事件流1 管理员:输入用户名和密码2 系统:验证登陆信息是否正确3 管理员:显示登陆成功4 用例结束。活动图管理员登陆系统的活动图见图4.10图4.10 管理员登录系统的活动图管理员修改密码用例简述管理员可以凭借原有的用户名和密码进行修改密码操作基本事件流1 管理员:输入原有的用户名和密码,2 系统:验证登录信息是否正确3 系统:显示注册的用户4 管理员:输入旧密码和新密码5 系统:验证修改密码信息是否正确6. 系统:显示修改的密码7 用例结束活动图管理员修改密码的活动图见图4.11图4.11 管理员修改密码的活动图管理员注册用例简述管理员可以申请注册成为用户基本事件流1 管理员:用户提出注册要求2 系统:显示注册页面3 管理员:输入要注册的用户名和密码4 系统:验证注册信息是否符合要求,若符合要求,则将信息存入数据库5 管理员:显示注册成功7 用例结束。活动图管理员注册系统的活动图见图4.12图4.12 管理员注册的活动图5. 逻辑视图 逻辑视图部分主要叙述了设计阶段的工作。总览图5.1的领域模型是网上书店售书系统的设计实体及其之间的关系;图5.1 领域模型主要Package的介绍网上书店售书系统Package图见图5.2图5.2 网上书店售书系统Package图Ø WebappWebapp包包含了action、form包,它们属于显示层的代码,主要使用struts框架。Ø ServiceService包包含了业务实现的主要接口,每个接口有一个对应的serviceImpl的实现,serviceImpl类放在serviceImpl包中,其中serviceImpl的实现是通过调用dao接口来实现的,它们属于业务层的代码,主要使用spring框架。Ø DaoDao包包含了业务实现的主要接口,每个接口都有一个对应的Hibernate版本的daoHibernate的实现,daoHibernate类放在daoHibernate包中,通过daoHibernate对数据库进行访问,它们属于持久层的代码,主要使用Hibernate框架。Ø ModelModel包包含了POLO类和Hibernate映射文件。Ø adminadmin包包含了属于管理员操作的webapp、service、serviceImpl、dao、daoHibernate、model等包,这些包的关系同上。Ø useruser包包含了属于管理员操作的webapp、service、serviceImpl、dao、daoHibernate、model等包,这些包的关系同上。6. 过程视图过程视图部分叙述几个主要子系统的处理流程。用户注册用户注册的系统顺序图见图6.1图6.1 用户注册的系统顺序图用户注册的VOPC类图见图6.2图6.2 用户注册的VOPC类图用户注册的协作图见图6.3图6.3 用户注册的协作图用户选购并结账用户选购并结账的系统顺序图见图6.4图6.4 用户选购并结账的系统顺序图用户选购并结账的VOPC类图见图6.5图6.5 用户选购并结账的VOPC类图用户选购并结账的协作图见图6.6图6.6 用户选购并结账的协作图管理员添加删除图书管理员添加删除图书的系统顺序图见图6.7图6.7 管理员添加删除图书的系统顺序图管理员添加删除图书的VOPC类图见图6.8图6.8 管理员添加删除图书的VOPC类图管理员添加删除图书的协作图见图6.9图6.9 管理员添加删除图书的协作图7. 部署视图部署视图描述了如何将具体软件制品分配到计算节点 (具有处理服务的某种事物) 上,表示了软件元素在物理架构上的部署,以及物理元素之间的通信。网上书店售书系统的部署视图见图7.1图7.1 网上书店售书系统的部署视图Ø Generic PC个人PC机。Ø Browser通用个人计算机上的网页浏览器,如:IE6.0,Firefox等。Ø ApacheØ Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。 Ø StrutsStruts是开源软件。使用Struts的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间。如果我们想混合使用Servlets和JSP的优点来建立可扩展的应用,struts是一个不错的选择。Ø Tomcat 6.0Tomcat 6.0提供Servlet容器。Ø HibernateØ Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。Ø MySQLMySQL是小型关系型数据库管理系统,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。数据视图网上书店售书系统数据在关系数据库中的组织。网上书店售书系统的数据视图见图8.1图8.1 网上书店售书系统的数据视图8. 规模和性能Ø 满足的规模能够满足500人同时浏览网上书店,100人同时使用数据库进行图书购买活动Ø 满足的性能各项指标性能良好,能达到客户要求的等待时间9. 质量经测试证实的软件缺陷和限制是不允许注册带有汉字的会员名,软件性能的影响不是很大。另外,本程序的不足之处在于只是一个简单的网上书店售书系统,主要是模拟购书的情形,因此实际上并不是一个真正的售书系统,其次系统管理员同样也允许购买图书,这与实际不符合。10. 测试10.1测试概要测试项目测试内容注册(1)测试用户的注册账号是否允许有数字或字母与汉字的组合出现;(2)是否允许注册相同的用户名;(3)注册信息不完整时,系统对错误信息的处理是否正确登录(1) 主要测试用户名和密码不匹配时,是否能成功登陆(2) 信息填写不完整时,系统对错误信息的处理是否正确购书,结账(1)主要测试当一个客户登陆后,选购完书后进入结账窗口时,是否显示正确的购买的图书和应付款。(2)用户没有登录时,是否能够结账修改密码(1)主要测试用户在没有登录的情况下,是否允许修改密码(2)信息不完整时,系统对错误信息的处理是否正确退出登录(1) 主要测试用户没有登录的情况下,按下退出登录,系统的处理是否正确(2) 用户登录后,是否能正常退出登录添加图书(1) 测试当普通用户登录时,是否能添加图书(2)当管理员输入添加的图书信息后是否能正确将图书添加到数据库中。(3)是否允许添加名字相同的图书到数据库中(4)填写信息不完整时,系统对错误信息的处理是否正确。10.2测试结果及发现10.2.1注册模块测试检测模块检测项预计输入实际输入测试结果注册模块会员名是否允许有汉字的出现会员名:123天密码:654321会员名:123天密码:654321会员名不允许有汉字的出现是否允许注册已经注册过的会员名会员名:abc密码:654321会员名:abc密码:654321不允许注册已经注册过的账户注册信息不完整,系统对错误信息的处理是否正确会员名:abc密码:会员名:abc密码:系统对错误信息的处理是正确的10.2.2登录模块测试检测模块检测项预计输入实际输入测试结果登录模块会员名和密码不匹配时,能否成功登陆会员名:abc密码:123456(实际密码为:654321)会员名:123天密码:123456会员名和密码不匹配时,不能登录填写信息不完整时,系统对错误信息的处理是否正确会员名:abc密码:会员名:abc密码:系统对错误信息的处理是正确的10.2.3购书,结账模块检测模块检测项预计输入实际输入测试结果结账,购书模块用户登陆后,选完书后是否能正确结账会员名:abc密码:654321会员名:abc密码:654321可以正确结账用户没有登录时是否允许结账会员名:密码:会员名:密码:用户没有登录,不允许结账10.2.4修改密码模块测试测试模块测试项预计输入实际输入测试结果修改密码模块用户在没有登录的情况下,是否允许修改密码会员名:密码:会员名:密码:不允许修改密码填写信息不完整,系统对错误信息的处理是否正确旧密码:654321新密码:旧密码:654321新密码:系统对错误信息的处理是正确的10.2.5退出登录模块测试模块测试项预计输入实际输入测试结果退出登录模块用户在没有登录的情况下,按下退出登录,系统对错误信息的处理是否正确会员名:密码:会员名:密码:系统对错误信息德尔处理是正确的用户在登陆后,是否能正常退出登录会员名:abc密码:654321会员名:abc密码:654321可以正常退出登录10.2.6添加图书模块测试模块测试项预计输入实际输入测试结果添加图书模块普通用户登录后,是否允许添加图书会员名:abc密码:654321会员名:abc密码:654321普通用户登录后,允许添加图书管理员登陆后,输入图书信息后,是否能正常添加图书到数据库中表名:computer书名:数据结构价钱:25表名:computer书名:数据结构价钱:25能够正常添加图书到数据库中是否允许添加相同名称的图书到数据库中表名:computer书名:数据结构价钱:25表名:computer书名:数据结构价钱:25不允许添加相同名称的图书到数据库中信息填写不完整时,系统对错误信息的处理是否正确表名:computer书名:数据结构价钱:表名:computer书名:数据结构价钱:系统对错误信息的处理是正确的11. 附录本系统实现了部分功能(注册,登录):(1)注册模块:register.jsp<% page contentType="text/html;charset=GB2312" %><HTML> <HEAD><% include file="head.txt" %></HEAD> <BODY bgcolor=cyan> <CENTER> <FORM action="helpRegister" Method="post"> <table border=2> <tr> <th>请您注册,会员名字必须由字母和数字组成</th></tr> <tr><td>输入名称:<Input type=text name="logname"></td></tr> <tr><td>输入密码:<Input type=password name="password"></td></tr> </table> <BR><Input type=submit name="g" value="提交"> </FORM> <img src="welcome.jpg" width=774 height=500 ></img> </CENTER> </BODY></HTML>Register.javapackage mybean.data;public class Register String logname="",password="" String backNews; public void setLogname(String name) logname=name; public String getLogname() return logname; public void setPassword(String pw) password=pw; public String getPassword() return password; public String getBackNews() return backNews; public void setBackNews(String s) backNews=s; HandleRegister.javapackage myservlet.control;import mybean.data.*;import java.sql.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HandleRegister extends HttpServlet public void init(ServletConfig config) throws ServletException super.init(config); try Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); catch(Exception e) public String handleString(String s) try byte bb=s.getBytes("iso-8859-1"); s=new String(bb); catch(Exception ee) return s; public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException Connection con; PreparedStatement sql; Register reg=new Register(); request.setAttribute("register",reg); String logname=request.getParameter("logname").trim(); String password=request.getParameter("password").trim(); String uri="jdbc:odbc:mymoon" if(logname=null) logname="" if(password=null) password="" boolean isLD=true; for(int i=0;i<logname.length();i+) char c=logname.charAt(i); if(!(c<='z'&&c>='a')|(c<='Z'&&c>='A')|(c<='9'&&c>='0') isLD=false; boolean boo=logname.length()>0&&password.length()>0&&isLD; String backNews="" try con=DriverManager.getConnection(uri,"",""); String insertCondition="INSERT INTO member VALUES (?,?)" if(boo) Statement sq=con.createStatement(); ResultSet rs=sq.executeQuery("SELECT * FROM member"); while(rs.next() if(rs.getString(1).equals(logname) RequestDispatcher dispatcher= request.getRequestDispatcher("1.jsp");/转发 dispatcher.forward(request, response); return; sql=con.prepareStatement(insertCondition); sql.setString(1,handleString(logname); sql.setString(2,handleString(password); int m=sql.executeUpdate(); if(m!=0) backNews="注册成功" reg.setBackNews(backNews); reg.setLogname(logname); reg.setPassword(handleString(password); else backNews="信息填写不完整或名字中有非法字符" reg.setBackNews(backNews); con.close(); catch(SQLException exp) backNews="该会员名已被使用,请您更换名字"+exp; reg.setBackNews(backNews); RequestDispatcher dispatcher= request.getRequestDispatcher("showRegisterMess.jsp");/转发 dispatcher.forward(request, response); public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException doPost(request,response); showRegisterMess.jsp<% page contentType="text/html;charset=GB2312" %><% page import="mybean.data.*"%> <jsp:useBean id="register" type="mybean.data.Register" scope="request"/><HTML><HEAD><% include file="head.txt" %></HEAD><HTML><BODY bgcolor=cyan ><CENTER> <Font size=4 color=blue > <BR> <jsp:getProperty name="register" property="backNews"/> </Font> <table> <tr><td>注册的会员名称:</td><td><jsp:getProperty name="register" property="logname"/></td></tr> </table></CENTER></BODY></HTML>(2)登录模块:login.jsp<% page contentType="text/html;charset=GB2312" %><HTML> <HEAD><% include file="head.txt" %></HEAD> <BODY bgcolor=cyan> <CENTER> <FORM action="helpLogin" Method="post"> <table border=2> <tr> <th>请您登录</th></tr> <tr><td>登录名称:<Input type=text name="logname"></td></tr> <tr><td>输入密码:<Input type=password name="password"></td></tr> </table> <BR><Input type=submit name="g" value="提交"> </FORM> <img src="welcome.jpg" width=774 height=500 ></img> </CENTER> </BODY></HTML>Login.Javapackage mybean.data;public class Login String logname,password,backNews="" boolean success=false; public void setLogname(String name) logname=name; public String getLogname() return logname; public void setPassword(String pw) password=pw; public String getPassword() return password; public String getBackNews() return backNews; public void setBackNews(String s) backNews=s; public void setSuccess(boolean b) success=b; public boolean getSuccess() return success; HandleLogin.javapackage myservlet.control;import mybean.data.*;import java.sql.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class HandleLogin extends HttpServlet public void init(ServletConfig config) throws ServletException super.init(config); try Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); catch(Exception e) public String handleString(String s) try byte bb=s.getBytes("iso-8859-1"); s=new String(bb); catch(Exception ee) return s; public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException Connection con; PreparedStatement sql; Login loginBean=null; String backNews=""