基于JSP和MySQL的超市管理系统的设计与实现

攀登者ing

发布日期: 2020-09-29 11:22:32 浏览量: 1790
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1 开发背景

1.1 项目背景

随着科学技术的高速发展,信息技术已经深深的影响着我国各行各业的发展。步入数字化时代,有巨大的数据信息等待着加工处理和传输,始创于1995年的步步高集团,其控股子公司——步步高商业连锁股份有限公司于2008年6月19日在深圳证券交易所上市,股票代码为002251。属于中国建设银行授予的“AAA信用客户单位”。步步高集团公司是多业态集团,线上线下齐头并进。步步高集团公司立足于大西南,以密集式开店、多业态、跨区域的发展模式向消费者提供零售服务。连锁门店已遍及湖南、江西、广西各地州市。步步高超市系统本就需要有一个强大的数据库支持,这就需要对数据库进一步的开发和利用,而对步步高超市的销售管理,信息的存储和处理也显的尤其重要。要适应如今激烈的市场竞争,就需要有高效的处理方式和管理方法,因此加快步步高超市的信息化进程是必不可少的。超级市场是以顾客自选方式经营的大型综合性零售商场,又称自选商场。是许多国家特别是经济发达国家的主要商品零售组织形式。超级市场于20世纪30年代初最先出现在美国东部地区。我国步步高超市市场形成于20世纪90年代初期,现在已经成为我国零售业的一种重要形态,为国民经济的发展发挥了重要的作用。

随着步步高超市行业的高速发展,最初的售货员站柜台的销售方式已不能满足现有的销售业的发展,因此迫切的需要引入新的管理技术。步步高超市虽然具有各种优点,但当下,它仍存在零售企业所共有的落后的一面,例如:不能有效的管理每种商品、收款结算速度慢,容易出现营业差错,不易进行商品调价,盘库效率低,而且商品的进、销、存不能保证同步更新,缺乏实时分析功能,管理人员对及时传递资的要求始终得不到满足。

1.2 研究内容

本课题主要研究的内容有:

  • 建立步步高超市管理系统

  • 完成登录与注册、账单管理、供应商管理、用户管理

  • 管理账单、供应商、用户的增删改查功能

  • 实现账户管理,密码修改功能,并能增加用户、管理员

  • 能查看所有账户信息、供应商信息、用户信息

1.3 文档的组织结构

这个毕业设计的文档组织结构是环绕基于B/S模式的步步高超市管理系统的设计与实现,该项目主要有以下内容:

  • 第一章开发背景:主要写了B/S模式的步步高超市管理系统的设计与实现的开发背景与意义、还有研究内容以及文档的基本组织结构

  • 第二章需求分析:这里主要讲述系统开发时的可行性分析,以及系统的相关功能分析介绍,还有系统使用的关键技术的简述,这里可以说明系统的一些实现的功能,以及文档的组织结构方面的东西

  • 第三章系统设计:就是用来说明系统的设计原则,还有系统的整体设计图包括功能图、流程图、时序图、E-R图等图形的设计。数据库的数据关系模型,以及数据字典等,还有系统用到的数据库语句和数据表

  • 第四章系统实现:这里就是说明系统的实现后展示的样子,截下系统应用的图片,附加相关代码进行说明,以及一些相关的操作步骤的说明,这边的模块主要有四个大的模块,登录注册、账单管理、供应商管理、用户管理

  • 第五章系统测试:主要就包括测试目的、测试过程、测试分析对系统最后的完结工作进行测试,完善系统功能,找出BUG

  • 第六章系统总结与致谢

2 需求分析

2.1 需求调研

随着步步高超市形态的高速发展,其经营管理也变的越为复杂,数据库的庞大支撑导致中间流通的数据量大增,中间的商业运转环节也越来越多,传统的管理模式已不能满足,而依靠现信息技术的步步高超市管理系统管理步步高超市,可以节省大量的人力物力,更重要的是能更快更稳的推动步步高超市销售发展,协助管理者做出与时俱进适应市场变化的正确决策,加快步步高超市经营管理效率。步步高超市管理系统是步步高超市对商品的信息化管理系统,本系统可以提高管理水平和工作效率,可以最大限度的减少人工操作带来的错误,使用此系统主要为了实现商品管理的稳定性、可维护性等,从而达到提高商品管理效率并指导经营方向的目的。

2.2 可行性分析

2.2.1 经济的可行性

本系统是用java语言所编写的,java语言作为前导课程已经学过。重点学习了jsp,最后又系统的学习了Servlet,Servlet又是本系统应用的重点。从设计,开发,测试到最后的维护,都综合了所学的java知识。本系统所实现的是步步高超市账单管理,因此在给定的时间内完成是绝对可行。

综上所述,此系统开发有可靠的技术支持,技术上是完全可行的。技术上的可行性分析要考虑将来要采用的硬件和软件技术能否满足用户(这里是服务器,网速)提出的要求(如计算机的容量、速度等)。此外,还要考虑开发人员的水平,学习了两年的jsp开发,对于这个系统的编写,我想完整的之需要两个月就可以写出程序,再花上几天的调试,计划两个月左右就可以完成投入使用了。

2.2.2 经济的可行性

主要从对项目的经济上进行分析评价,一方面是变出的费用,包括设备的盟费、管理和维护费用、人员工资和培训费等,另一个是取得的收益。这是个小量的系统,从投人的人力,财力与物力来讲是打术小的,发布出去之需要注册城名就可以了,从节省人力方面,可以让管理人员以整与真杂的工作中解限出来,做更多的工作。对于用户即企业管理人员来说,信息化系统使用起来的难易程度是非常重要的,因为,不用的企业的管理人员的技术水平是存在差异,所以系统的设计要考虑系统的操作的便捷性。本系统的设计宗旨就是简化操作的复杂性,因为复杂的操作性会使用户对系统的认知产生差异,只有降低了系统的复杂性,企业在选择人员进行企业管理的时候才具备更好地选择性,本系统要求使用者具备基本的计算机操作技能就可以方便的上手,企业管理人员可以在短时间内掌握并熟练使用,在一定程度上减少了企业的人员培训费用。

对本组的经济现状和投资能力进行分析,对系统建设运行和维护费用进行估算,对系统建成后可能取得的社会和经济效益进行估计。由于本系统是作为毕业设计由我们学生自己开发的,在经济上的投入甚微,系统建成之后将为步步高超市行业提供很大的方便,因此在经济上是可行的。

2.3 关键技术

2.3.1 JSP技术

Jsp是Java Service Page的简称,Jsp是运行在服务器端的Java页面,当web服务器接收到Jsp请求是,首先会对Jsp文件进行翻译,将编好的Jsp文件通过Jsp引擎转换成可识别的Java文件。经过翻译后的Jsp文件相当于我们编写好的Java源文件,此时仅有Java源文件是不够的,必须要将Java源文件编译成可执行的字节码文件。Web 容器接受了客户端的请求,经过翻译和编译两个阶段,生成了可被执行的二进制字节码文件,此时就进入执行阶段。当执行结束后,会得到处理请求的结果,web容器再把生成的结果页面返同给客户端显示。

JSP运用到了Java语言,JSP封装了动态网页。JSP对基于Web的应用程序进行设计。当服务器接端接收到请求,访问JSP时,程序片段是最先运行的,然后用户可以在界面上看到当前HTML所展示出来的页面内容。因为HTML文本可以自动返回给用户端,所以我们只要安装好浏览器,就能浏览HTML页面。HTML程序和穿插在内部的Java程序可以构建JSP网页。服务器端被访问时,它可以处理部分Java代码,编译出来的HTML页面输送给用户端。JSP和是Servlet是紧密联系在一起的,二者通过参数的传递来实现前后端的联系。

2.3.2 JDBC技术

JDBC是一种Java数据库连接技术,能实现Java程序对各种数据库的访问有一组使用Java语言编写的类和接口组成,这些类和接口称为JDBC API,它们位于包Java.sql以及Javax.sql中。在项目开发中,使用JDBC可以实现应用程序与数据库之间进行数据的通信,JDBC主要作用是建立与数据库之间的访问连接,将编写好的sq1语句发送到数据库进行执行,对数据库返回的执行结果进行处理。

在JDBC中有四个重要的环节:

  • DriverManager类:管理JDBC驱动

  • Connection接口:负责连接数据库并担任传递数据的任务

  • Statement接口:由Connection产生,负责执行sql语句

  • Resultset接口:负责保存Statement执行后所产生的查询结果

2.3.3 JAVA技术

Java是Sun公司推出的新的一代面向对象程序设计语言,特别适合于Internet应用程序开发。Java的产生与流行是当今Internet发展的客观要求,Java是一门各方面性能都很好的编程语言,它的基本特点COO是简单、面向对象、分布式、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的,特别适合在Internet环境上开发的应用系统。JAVA语言是一门完完全全的面向对象的语言,尤其适合用来开发Internet程序是因为它在保留了C语言的语句结构的同时去掉了指针、运算符重载、多继承等降低安全性、可靠性的元素。

2.3.4 Servlet技术

Servlet的详细应用在Servlet工作流程中,根据web.xml中的配置将拦截所有通过servrlet的请求,并根据URI决定分发给doGet还是doPost处理请求, 然后调用相应的业务逻辑方法,调用相应的页面去执行响应。利用JDBC技术处理与数据库连接,利用其Servlet API所定义的接口和类来封装与数据库交互的相关操作,使对数据库的操作变得相当容易,减少开发时间,而且能对系统进行灵活的设计和实现,使系统各模块容易维护和重用。

2.3.5 MySQL技术

MySQL是一个真正实现多线程和多用户的数据库。 本系统是基于SQL的关系型数据库管理系统,它的优点有功能强大、操作简单、管理便捷、安全性高、速度快、稳定性高等。此外,多种编写语言都可以来访问MySQL数据库。因为其源代码开放,青睐MySQL数据库的人们越来越多,与此同时,MySQL的运用范围也在不断扩大。速度和易用性使Web站点成为MySQL最大的客户群。

2.3.6 MyEclipse工具

MyEclipse 是一个十分优秀的用于开发Java, J2EE的 Eclipse 插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。MyEclipse可以支持Java Servlet,AJAX,JSP,JSF,Struts,Spring,Hibernate,EJB3,JDBC数据库链接工具等多项功能。可以说MyEclipse是几乎囊括了目前所有主流开源产品的专属eclipse开发工具。

2.3.7 Tomcat工具

在步步高超市账单管理系统中我们使用了Tomcat,Tomcat是Apache基金会旗下的一款免费、开源的web服务器。Web服务器是可以向发出请求的浏览器提供文档的程序,它的主要功能就是提供网上信息浏览服务。Tomcat是一个小型的轻量级应用服务器,技术先进、性能稳定,占用资源小、速度快,安装tomcat的过程很简单,可以使用解压版,无需安装即可使用。

目前支持JSP的应用服务器是较多的,Tomcat是其中较为流行的一个Web服务器,被JavaWorld杂志的编辑选为2001年度最具创新的Java产品,可见其在业界的地位。Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很慢,因为Tomcat要将Jsp转化为Servlet文件,然后编译。编译以后,访问将会很快。Tomcat也具有传统的Web服务器的功能:处理Html页面。但是与Apache相比,它的处理静态Htm1的能力就不如Apache。我们可以将Tomcat和Apache集成到一块,让Apache处理静态Html,而Tomcat处理Jsp和Servlet。 Tomcat是-个很好的工具,不仅仅因为其免费,功能强大,更因为其开放性,越来越受到人们的重视。

3 系统设计

3.1 设计原则

系统的设计目标是,设计出一个界面美观、操作友好、功能齐全的系统。要求在代码的编写阶段,模块划分明确,实现高内聚,低耦合。提高代码的安全性和可扩展性。

该系统的设计中,必须要满足以下几个要求:

  • 安全性:数据安全性系统若存储有关隐私方面的数据,为了保证系统的安全性,在设计系统的时候,必须要采取一定的手段,来提高系统的安全性

  • 易用性:用户通过账号、密码登录该系统后,可以直观的看到可以操作的功能

  • 扩展性:随着企业的发展,它的需求也在不断的变化,为了适应企业的要求,在设计该系统时就应该考虑到系统的可扩展性方案

3.2 功能架构

根据步步高超市账单管理系统的需求分析和用例建模分析,本文确定了步步高超市账单管理系统的主要功能模块,包括登录与注册功能、新增账单功能、删除账单功能、修改账单功能、查询账单功能、新增供应商功能、删除供应商功能、修改供应商功能、查询供应商功能、修改用户功能、删除用户功能和查询用户功能等。步步高超市账单管理系统的功能结构图如图3.1所示:

步步高超市管理系统流程设计图如图3.2下所示:

步步高超市账单系统管理员模块时序图如图3.3所示:

账单管理模块时序图如图3.4所示:

供应商管理模块时序图如图3.5所示:

用户管理模块时序图如图3.6所示:

3.3 数据库设计

数据库是此类系统的核心,系统中所有的信息都存储在数据库中,在所有Jsp页面中通过JDBC与数据库连接,操作数据库中的数据,从而实现所有需要的功能。数据库软件有很多。本系统中数据库采用MySQL作为数据库工具。数据库是网站的核心,数据库设计的合理与否对网站的建设有着至关重要的影响。一个良好的数据库开发过程一般是先系统分析,再逻辑设计,然后物理实现。

系统分析中分析数据库用户需求,并画出E-R图直观地表示出数据库系统的需求。逻辑设计中根据系统分析设计的一个关系模型。物理设计为逻辑设计中的数据模型选取一个最合理的应用环境的物理结构,通常选取一个常用数据库软件,用数据库软件创建与逻辑设计中数据模型对应的数据库。

设计概念是建立在数据分析的基础之上,对整个系统的数据库概念结构设计采用自上而下的方式。对视图的实现,从用户的角度来进行开发,然后归纳,最后通过分析,取得最后结果。

设计概念,我们采用实体—联系(E.R)的模型。E.R模型法的构成元素有:实体,属性,联系,E.R模型是用E.R图来表示的,它可以对在用户工作环境中所遇到的相关事物给出提示,属性就是对实体特性的描述。

数据库的概念结构设计采用实体—联系(E-R)模型设计方法。E-R模型法的组成元素有:实体、属性、联系,E-R模型用E-R图表示,是提示用户工作环境中所涉及的事物,属性则是对实体特性的描述。

经考察和分析,本步步高超市账单管理系统包括以下实体:用户实体、账单实体和供应商实体。它们的实体E-R图如以下所示:

用户实体E-R图

账单实体E-R图

供应商实体E-R图

账单表的表结构如表3-1所示,该表主要用于记录步步高超市管理员的账单信息,主要字段为账单编码、商品名称、供应商、账单金额、是否付款和创建时间。

账单表(elevator_zd)

字段名 数据类型 是否为空 字段含义
zd_id int not null 账单编码
zd_name varchar(50) not null 商品名称
zd_shop varchar(50) not null 供应商
zd_price varchar(50) not null 账单金额
zd_if varchar(1) not null 是否付款
zd_date varchar(50) not null 创建时间

供应商表的表结构如表3-2所示,该表主要用于记录步步高超市管理员所管理的供应商信息,主要字段为供应商编码、供应商名称、联系人、联系电话、传真和创建时间。

供应商表(elevator_gy)

字段名 数据类型 是否为空 字段含义
gy_id int not null 供应商编码
gy_name varchar(50) not null 供应商名称
gy_names varchar(50) null 联系人
gy_phone int null 联系电话
gy_chuan int null 传真
gy_date varchar(50) null 创建时间

用户表的表结构如表3-3所示,该表主要用于记录步步高超市管理员的用户信息,主要字段为用户名称和用户密码。

用户表(elevator_yh)

字段名 数据类型 是否为空 字段含义
yh_id int not null 用户名称
yh_name varchar(50) not null 用户密码

4 系统实现

4.1 登录与注册

  • 描述:为了保证系统的安全性,要先使用本系统必须先登录到系统中,用户需要正确的账号和密码登录本系统

  • 登录:用户输入账号和密码后,客户端根据验证的用户帐号和密码的格式是否合法,判断是否显示用户登录,如若输入正确则记录为登录状态,如若输入错误则提示重新输入

  • 注册:新用户需要输入正确的注册信息,才能注册成功

4.1.1 登录

程序运行效果图如图4.1 所示:

登录功能主要代码如下所示:

  1. 1. public void doPost(HttpServletRequest request, HttpServletResponse response)
  2. 2. throws ServletException, IOException {
  3. 3. response.setContentType("text/html;charset=utf-8");
  4. 4. request.setCharacterEncoding("utf-8");
  5. 5. PrintWriter out = response.getWriter();
  6. 6. String opr = request.getParameter("opr");
  7. 7.
  8. 8. List<User> lists = new ArrayList<User>();
  9. 9. User user = new User();
  10. 10. try {
  11. 11. if (opr.equals("login")) {
  12. 12. // 获取login.jsp页面提交的账号和密码
  13. 13. String name = request.getParameter("name");
  14. 14. String password = request.getParameter("password");
  15. 15. // 测试数据
  16. 16. System.out.println("你的账户和密码是:" + name + " " + password);
  17. 17.
  18. 18. // 获取login.jsp页面提交的账号和密码设置到实体类User中
  19. 19. user.setName(name);
  20. 20. user.setPassword(password);
  21. 21. // 引入数据交互层
  22. 22. UserDaoImpl daoImpl = new UserDaoImpl();
  23. 23. User users = daoImpl.login(user.getName(), user.getPassword());
  24. 24. if (users == null) {
  25. 25. out.print("<script type='text/javascript'>" +
  26. 26. "alert('登录失败');" +
  27. 27. "open('login.jsp', '_self');</script>");
  28. 28. }

4.1.2 注册

程序运行效果图如图4.2 所示:

注册功能主要代码如下所示:

  1. 1. <html>
  2. 2. <head lang="en">
  3. 3. <meta charset="UTF-8">
  4. 4. <title>系统注册 - 步步高超市账单管理系统</title>
  5. 5. <link rel="stylesheet" href="css/style.css"/>
  6. 6. </head>
  7. 7. <body class="login_bg">
  8. 8. <section class="loginBox">
  9. 9. <header class="loginHeader">
  10. 10. <h1>步步高超市账单管理系统</h1>
  11. 11. </header>
  12. 12. <section class="loginCont">
  13. 13. <form class="loginForm" action="UserDaoServlet?opr=regise" method="post">
  14. 14. <div class="inputbox">
  15. 15. <label for="user">用户名:</label>
  16. 16. <input id="user" type="text" name="name" placeholder="请输入用户名" required/>
  17. 17. </div>
  18. 18. <div class="inputbox">
  19. 19. <label for="mima">密码:</label>
  20. 20. <input id="mima" type="password" name="password" placeholder="请输入密码" required/>
  21. 21. </div>
  22. 22.
  23. 23. <div class="subBtn">
  24. 24. <input type="submit" value="注册" />
  25. 25. <input type="reset" value="重置"/>
  26. 26. </div>
  27. 27.
  28. 28. </form>
  29. 29. </section>
  30. 30. </section>
  31. 31.
  32. 32. </body>
  33. 33. </html>

4.2 账单管理

当用户登录成功后,点击账单管理模块时,通过GetBillsServlet的request.getParameter()获得请求数据并调用Bil1ServiceTmpl层里的getBillsByPage的方法获得全部的账单商品的所有相关信息并把全部数据发送到admin_bill_list页面中,在该页面中显示全部的账单编号、商品名、商品数量、交易金额、是否付款、供应商名称、商品描述、账单时间。在账单管理现实中还可以通过组合查询查出你想要的商品名称,也可通过模糊查询查出含有什么文字的商品名,组合查询中还可以通过付款的状态来查询出你想要的结果。在账单管理中可以同过每页显示的页数来设置当前页显示的商品条数,也可点击下一页来查看下一的记录,同样可点击上一页、首页、未页来查看相应页面的记录,也可在“转到”的后面填写你想要跳转到的页数。

4.2.1 新增账单

程序运行效果图如图4.3 所示:

新增账单功能主要代码如下所示:

  1. 1. else if("insert".equals(opr)) {
  2. 2. //新增
  3. 3.
  4. 4. String zd_name = request.getParameter("zd_name");
  5. 5. String zd_shop= request.getParameter("zd_shop");
  6. 6. String zd_price = request.getParameter("zd_price");
  7. 7. String zd_if = request.getParameter("zd_if");
  8. 8. String zd_date = request.getParameter("zd_date");
  9. 9.
  10. 10.
  11. 11. ElevatorZ ez = new ElevatorZ();
  12. 12.
  13. 13. ez.setZd_name(zd_name);
  14. 14. ez.setZd_shop(zd_shop);
  15. 15. ez.setZd_price(zd_price);
  16. 16. ez.setZd_if(zd_if);
  17. 17. ez.setZd_date(zd_date);
  18. 18.
  19. 19. // out.print(book.getBook_name());
  20. 20. int result = daoImpl.insert(ez);
  21. 21. if(result > 0) {
  22. 22. out.print("<script type='text/javascript'>" +
  23. 23. "alert('新增成功');" +
  24. 24. "open('ElevatorZDaoServlet?opr=list', '_self');</script>");
  25. 25. }
  26. 26. }

4.2.2 删除账单

程序运行效果图如图4.4 所示:

删除账单功能主要代码如下所示:

  1. 1. else if("delete".equals(opr)) {
  2. 2. //删除
  3. 3. int id = Integer.parseInt((request.getParameter("id")));
  4. 4. try {
  5. 5. ElevatorZ deleteDef = new ElevatorZ();
  6. 6. deleteDef.setId(id);
  7. 7. int result = daoImpl.delete(deleteDef);
  8. 8. if(result > 0) {
  9. 9. out.print("<script type='text/javascript'>" +
  10. 10. "alert('删除成功');" +
  11. 11. "open('ElevatorZDaoServlet?opr=list', '_self');</script>");
  12. 12. }
  13. 13. } catch (Exception e) {
  14. 14. e.printStackTrace();
  15. 15. }

4.2.3 修改账单

程序运行效果图如图4.5 所示:

修改账单功能主要代码如下所示:

  1. 1. else if("update".equals(opr)) {
  2. 2. //修改
  3. 3. int id=Integer.parseInt(request.getParameter("id"));
  4. 4. String zd_name = request.getParameter("zd_name");
  5. 5. String zd_shop= request.getParameter("zd_shop");
  6. 6. String zd_price = request.getParameter("zd_price");
  7. 7. String zd_if = request.getParameter("zd_if");
  8. 8. String zd_date = request.getParameter("zd_date");
  9. 9.
  10. 10.
  11. 11. ElevatorZ ez = new ElevatorZ();
  12. 12.
  13. 13. ez.setZd_name(zd_name);
  14. 14. ez.setZd_shop(zd_shop);
  15. 15. ez.setZd_price(zd_price);
  16. 16. ez.setZd_if(zd_if);
  17. 17. ez.setZd_date(zd_date);
  18. 18. int result = daoImpl.update(ez,id);
  19. 19. if(result > 0) {
  20. 20. out.print("<script type='text/javascript'>" +
  21. 21. "alert('修改成功');" +
  22. 22. "open('ElevatorZDaoServlet?opr=list', '_self');</script>");
  23. 23. }
  24. 24. }

4.2.4 查询账单

程序运行效果图如图4.6 所示:

查询账单功能主要代码如下所示:

  1. 1. public List<ElevatorZ> QueryById(int id) {
  2. 2. ResultSet rs=null;
  3. 3. List<ElevatorZ> list=new ArrayList<ElevatorZ>();
  4. 4. try {
  5. 5. String sql="select * from elevator_zd where id="+id+"";
  6. 6. rs=this.executeQuery(sql);
  7. 7. while(rs.next())
  8. 8. {
  9. 9. ElevatorZ ez=new ElevatorZ();
  10. 10.
  11. 11. ez.setId(rs.getInt("id"));
  12. 12. ez.setZd_name(rs.getString("zd_name"));
  13. 13. ez.setZd_shop(rs.getString("zd_shop"));
  14. 14. ez.setZd_price(rs.getString("zd_price"));
  15. 15. ez.setZd_if(rs.getString("zd_if"));
  16. 16. ez.setZd_date(rs.getString("zd_date"));
  17. 17. list.add(ez);
  18. 18. }
  19. 19. } catch (Exception e) {
  20. 20. // TODO: handle exception
  21. 21. e.printStackTrace();
  22. 22. }
  23. 23. return list;
  24. 24. }

4.3 供应商管理

用户登录成功后,当点击供应商管理模块时,通过GetprovidersServlet的request的getParameter()获得请求数据并带调用ProviderService Implements层的getProvidersByPage()的方法获得全部的供应有的所有数据并把全部数据发送到providerAdmin页面中,在该页面中显示供应商编码、供应商名称、联系人、联系电话、传真和创建时间。在供应商管理现实中还可以通过组合查询查出你想要的商品供应商名称,也可道过模糊查询查出含有什么文字的供应商名称,组合查询中还可以通过供应商的描述查询出你想要的结果,在供应商管理中可以同过每页显示的页数来设置当前页显示的供应商条数,也可点击下一页来查看下一页的记录,同样可点击上一页、首页、末页米查看相应页面的记录,也可在“转到”的后面填写你想要跳转到的页数。

4.3.1 新增供应商

程序运行效果图如图4.7 所示:

新增供应商功能主要代码如下所示:

  1. 1. //新增
  2. 2. public int insert(ElevatorG insertDef) {
  3. 3. // TODO Auto-generated method stub
  4. 4. int result=0;
  5. 5. try {
  6. 6. String sql="insert elevator_gy values(?,?,?,?,?)"; //输入数据库语句
  7. 7. result=this.executeUpdate(sql, insertDef.getGy_name(),insertDef.getGy_names()
  8. 8. ,insertDef.getGy_phone(),insertDef.getGy_chuan(),insertDef.getGy_date()
  9. 9. );
  10. 10. } catch (Exception e) {
  11. 11. e.printStackTrace();
  12. 12. }finally{
  13. 13. DataBaseUtil.CloseAll(null, null, conn); //关闭连接
  14. 14. }
  15. 15. return result;
  16. 16. }

4.3.2 删除供应商

程序运行效果图如图4.8 所示:

删除供应商功能主要代码如下所示:

  1. 1. else if("delete".equals(opr)) {
  2. 2. //删除
  3. 3. int id = Integer.parseInt((request.getParameter("id")));
  4. 4. try {
  5. 5. ElevatorG deleteDef = new ElevatorG();
  6. 6. deleteDef.setId(id);
  7. 7. int result = daoImpl.delete(deleteDef);
  8. 8. if(result > 0) {
  9. 9. out.print("<script type='text/javascript'>" +
  10. 10. "alert('删除成功');" +
  11. 11. "open('ElevatorGDaoServlet?opr=list', '_self');</script>");
  12. 12. }
  13. 13. } catch (Exception e) {
  14. 14. e.printStackTrace();
  15. 15. }

4.3.3 修改供应商

程序运行效果图如图4.9 所示:

修改供应商功能主要代码如下所示:

  1. 1. else if("update".equals(opr)) {
  2. 2. //修改
  3. 3. int id=Integer.parseInt(request.getParameter("id"));
  4. 4. String gy_name = request.getParameter("gy_name");
  5. 5. String gy_names= request.getParameter("gy_names");
  6. 6. int gy_phone = Integer.parseInt(request.getParameter("gy_phone"));
  7. 7. int gy_chuan = Integer.parseInt(request.getParameter("gy_chuan"));
  8. 8. String gy_date = request.getParameter("gy_date");
  9. 9.
  10. 10.
  11. 11. ElevatorG eg = new ElevatorG();
  12. 12.
  13. 13. eg.setGy_name(gy_name);
  14. 14. eg.setGy_names(gy_names);
  15. 15. eg.setGy_phone(gy_phone);
  16. 16. eg.setGy_chuan(gy_chuan);
  17. 17. eg.setGy_date(gy_date);
  18. 18. int result = daoImpl.update(eg,id);
  19. 19. if(result > 0) {
  20. 20. out.print("<script type='text/javascript'>" +
  21. 21. "alert('修改成功');" +
  22. 22. "open('ElevatorGDaoServlet?opr=list', '_self');</script>");
  23. 23. }
  24. 24. }

4.3.4 查询供应商

程序运行效果图如图4.10 所示:

查询供应商功能主要代码如下所示:

  1. 1. public List<ElevatorG> QueryById(int id) {
  2. 2. // TODO Auto-generated method stub
  3. 3.
  4. 4. ResultSet rs=null;
  5. 5.
  6. 6. List<ElevatorG> list=new ArrayList<ElevatorG>();
  7. 7. try {
  8. 8. String sql="select * from elevator_gy where id="+id+"";
  9. 9. rs=this.executeQuery(sql);
  10. 10. while(rs.next())
  11. 11. {
  12. 12. ElevatorG eg=new ElevatorG();
  13. 13. eg.setId(rs.getInt("id"));
  14. 14. eg.setGy_name(rs.getString("gy_name"));
  15. 15. eg.setGy_names(rs.getString("gy_names"));
  16. 16. eg.setGy_phone(rs.getInt("gy_phone"));
  17. 17. eg.setGy_chuan(rs.getInt("gy_chuan"));
  18. 18. eg.setGy_date(rs.getString("gy_date"));
  19. 19. list.add(eg);
  20. 20. }
  21. 21. } catch (Exception e) {
  22. 22. // TODO: handle exception
  23. 23. e.printStackTrace();
  24. 24. }
  25. 25. return list;
  26. 26. }

4.4 用户管理

用户登录成功后,点击用户管理模块时,通国GetUsersServlet的request.getParameter()方法获得全部数据并调用UserServiceImpl层的userService.getUsersByPage获得全部数据并通过useradmin显示所有用户和该用户的相关信息。如图5-13所示。在此显示页面显示了用户编号、用户名称和用户密码。在用户管理现实中还可以通过组合查询查出你想要的用户名称,也可通过模糊查询查出含有什么文字的用户名,在用户管理中可以司过每页显示的页数来设置当前页显示的用户条数,也可点击下一页来查看下一的记录,同样可点击上一页、首页、末页来查看相应页面的记录,也可在“转到”的后面填写你想要跳转到的页数,填写后点击go图标就会跳转到你所入的页面。

4.4.1 修改用户

程序运行效果图如图4.11 所示:

修改用户功能主要代码如下所示:

  1. 1. else if("update".equals(opr)) {
  2. 2. //修改
  3. 3.
  4. 4. String name = request.getParameter("name");
  5. 5. String password= request.getParameter("password");
  6. 6.
  7. 7.
  8. 8. User use = new User();
  9. 9.
  10. 10. use.setName(name);
  11. 11. use.setPassword(password);
  12. 12. UserDaoImpl daoImpl=new UserDaoImpl();
  13. 13. int result = daoImpl.update(use, name);
  14. 14. if (result > 0) {
  15. 15. out.print("<script type='text/javascript'>" +
  16. 16. "alert('修改成功');" +
  17. 17. "open('UserDaoServlet?opr=list', '_self');</script>");
  18. 18. //response.sendRedirect("login.jsp");
  19. 19. } else {
  20. 20. out.print("<script type='text/javascript'>" +
  21. 21. "alert('修改成功');" +
  22. 22. "open('UserDaoServlet?opr=list', '_self');</script>");
  23. 23. }
  24. 24.
  25. 25. }

5 系统测试

5.1 测试目的与意义

软件测试是整个软件开发过程中一段非常重要的阶段,在测试过程中如能按照测试的基本过程来进行测试,这样在测试完-一个软件后,软件的质量能有所保障。系统测试的目的是在真实系统工作环境下通过与系统的盖求定义作比较,检验完整的软件配置项能否和系统正确连接,发现软件与系统子系统设计文档和软件开发合同规定不符合或与之矛盾的地方。系统测试是将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其他系统元素结合起来,在实际运行(使用)环境下,对计算机系统进行的测试。是为了发现缺陷并度量产品质量,按照系统的功能和性能需求进行的测试。而且,系统测试还要检验系统的文档等是否完整、有效。另外,系统测试的测试用例应根据需求分析说明书来设计,并在实际使用环境下来运行。

最后,系统测试一般使用黑盒测试技术,并由独立的测试人员完成。按需求中的标准准确无误的执行。

软件测试的不只是为了发现软件中的不足,还需要通过分析错误的产生原因来及时发现发生错误的趋势,通过逻辑结构和开发手段等多方面来衡量软件的稳定性、使佣性等,发现软件开发过程中存在的缺陷,让测试人员设计出更有针对性的测试方法,及时改正开发过程中的不足。

5.2 测试过程

软件测试是一个非常重要的一个过程。可以说一个系统的好坏全是测试的工程决定的,测试能保证系统的稳定性。软件测试一定的测试方法,测试过程不是固定的,而是根据不同系统有着不同的测试方法,具体情况具体对待。以确保系统可以正常使用。软件测试可以让程序员发现问题,并进行修改。一个好的系统就是通过这一步 修改得到的,所以说一个好的系统是通过不断发现问题,不断修改而来的。软件测试不能盲目测试,要有一个顺序和目标。不然会乱套,这样不仅不能找出问题,而且使得系统更加乱。在步步高超市账单管理系统中输入经理用户的账户和密码,看看能否进入经理用户的模块,经过测试确实进入了管理员的模块。再测试各个模块的功能是否能正常实现。完成一个软件项目的测试,要在测试流程的各个环节进行严格的把控。

软件测试不仅有测试目的、测试过程,在测试过程中还应按照一定的测试方法,针对不同的过程应用不同的方法。软件测试的内容是深不可测的,在测试的过程中应结合具体的实际情况采用不同的方法进行测试以保证软件质量过关。

软件测试的一般测试流程为:

  • 熟悉需求:项目开始阶段,阅读需求,理解需求,与客户、开发、架构多方交流,深入了解需求及所要开发软件的设计文档,包括软件的规格说明和逻辑设计等,由测试团队共同完成

  • 需求评审:测试人员、开发人员、需求人员参与,剔除需求中不合理的部分,无法实现的部分,不清楚的部分和有异议的地方

  • 编写测试计划:根据需求估算测试所需资源(人力、设备等)、所需时间、功能点划分、如何合理分配安排资源等,有测试团队领导完成

  • 测试计划评审:由需求人员、开发人员和测试人员共同参与,对所提出的测试计划进行审核,对时间、人力上不合理的安排进行整改

  • 编写测试用例:由测试人员根据测试计划、任务分配、功能点划分,设计合理的测试用例

  • 测试用例评审:由需求人员、开发人员和测试人员共同参与,对所编写的测试用例进行评审,发现测试遗漏或不合理的部分

  • 运行测试用例:由测试人员根据测试用例执行测试

  • 提交bug:对每个有bug的测试点在测试管理工具中进行bug管理,并跟踪直到bug的解决

  • 回归测试:在产品投入上线前针对测试过程中出现的bug进行再次的审查,确保bug彻底解央

  • 编写测试报告:通过测试和bug的追踪,最终确定各个功能点和测试项都能达到需求的要求,没有重大bug

以下是登录功能测试:

  • 输入正确的用户名和密码,用户才能登录进入系统

  • 用户名为“ceshi”,正确密码为“ceshi”

用户登录模块测试用例如表5-1所示:

测试编号 测试步骤 期望结果 测试结果
1 输入用户名“admin”,密码“admin”,点击“登录”按钮 登录成功 登录成功
2 输入用户名为空,密码“admin”,点击“登录”按钮 登录失败 提示用户名不能为空
3 输入错误的用户名,密码“admin”,点击“登录”按钮 登录失败 提示用户名或密码错误
4 输入用户名“admin”,密码为空,点击“登录”按钮 登录失败 提示密码不能为空
5 输入用户名“admin”,错误的密码,点击“登录”按钮 登录失败 提示用户名或密码错误

5.3 测试分析

5.3.1 测试方法

本次测试中所使用的测试方法有:黑盒测试、白盒测试、手工测试和软件审查。

  • 黑盒测试概念:黑盒测试也称功能测试,它是对经开发成形的产品进行运行,来检测每个功能点是否实现,在测试时,不用考虑程序内部结构和逻辑设计,测试者以使用者的身份进行测试,只检查程序功能是否符合需求规格说明书,程序是否能正确的输入输出,执行操作。黑盒测试方法主要有等价类划分、边界值分析、因果图、错误推测等,主要用于软件确认测试

  • 白盒测试概念:结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序。通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路都能按预定的要求正确的工作。这一方法是把测试对象看作一个打开的盒子测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有的逻辑路径进行测试,通过在不同检查程序的状态,确定实际的状态是否与预期的状态一致

  • 手工测试概念:手工测试是在未使用任何自动化测试工具的情况下进行测试,测试工作量较大,测试过程较慢,对测试人员的需求较高,需要测试人员绝对的仔细,属于比较原始但是比较原始的一个步骤

  • 软件审查概念:软件审查主要审查软件开发阶段的各个功能点进行测试,软件审查主要审查软件技术、概要设计等阶段的代码,查看测试用例文档和需求文档是否具有一致性、完整性

5.3.2 测试用例设计方法

黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法、场景图法等。

等价类划分法

等价类划分法是把所有可能输入的数据,即程序的输入域划分策划国内若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。方法是一种重要的、常用的黑盒测试用例设计方法。等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其他值的测试,因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件就可以用少量代表性的测试数据取得较好的测试结果。等价类划分有两种不同的情况:有效等价类和无效等价类。有效等价类,是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集台。利用有效等价类可检验程序是否实现了规格说明所规定的功能和性能。无效等价类指对程序的规格说明是不合理的或无意义的输入数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能多个。

边界值分析法

边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。

与等价类区别:

  • 边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件

  • 边界值分析不仅考虑输入条件,还要考虑输出空间产生的测试情况。分析方法:大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部。因此针对各种边界情况设计测试用例,可以查出更多的错误。使用边界值分析方法设计测试用例,首先应确定边界情况。通常输入和输出等价类的边界,就是应着重测试的边界情况。应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据

错误推测法

基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法。基本思想:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例。

因果图法

因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了。如果在测试时必须考虑输入条件的各种组合,则可能的组合数目将是天文数字,因此必须考虑采用一种适台于描述多种条件的组合、相应产生多个动作的形式来进行测试用例的设计,这就需要利用因果图(逻辑模型)。

判定表驱动法

判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。优点:能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因此,利用判定表能够设计出完整的测试用例集合。在一些数据处理问题当中,某些操作的实施依赖于多个逻辑条件的组合,即:针对不同逻辑条件的组合值,分别执行不同的操作。判定表适合于处理这类问题。

功能图法

功能图由状态迁移图和布尔函数组成。状态迁移图用状态和迁移来描述.一个状态指出数据输入的位置(或时间),而迁移则指明状态的改变同时要依靠判定表或因果图表示的逻辑功能例,一个简化的自动出纳机ATM的功能图。功能图介绍个程序的功能说明通常由动态说明和静态说明组成.动态说明描述了输入数据的次序或转移的次序静态说明描述了输入条件与输出条件之间的对应关系.对于较复杂的程序,由于存在大量的组合情况,因此,仅用静态说明组成的规格说明对于测试来说往往是不够的.必须用动态说明来补充功能说明。功能图方法是用功能图FD形式化地表示程序的功能说明,并机械地生成功能图的测试用例。

场景图法

现在的软件几乎都是用事件触发来控制流程的,事件触发时的情景便形成了场景,而同-事件不同的触发顺序和处理结果就形成事件流。这种在软件设计方面的思想也可以引入到软件测试中,可以比较生动地描绘出事件触发时的情景,有利于测试设计者设计测试用例,同时使测试用例更容易理解和执行。应用:基本流和备选流:如下图所示,图中经过用例的每条路径都用基本流和备选流来表示,直黑线表示基本流,是经过用例的最简单的路径。备选流用不同的色彩表示,一个备选流可能从基本流开始,在某个特定条件下执行,然后重新加入基本流中;也可能起源于另一个备选流,或者终止用例而不再重新加入到某个流。

5.3.3 测试总结

本次测试中对步步高超市账单管理系统进行测试,测试过程中,在这次测试中,我们检验到了一些错误。

  • 页面设计没有根据需求进行,输入,输出字段文字错误,字段含义

  • 页面设计没有完成需求规定的输入限制验证,导致用户可以输入错误的或者无效的数据,这些数据可能会引起功能性错误

  • 功能没有实现,导致无法进行需求规定的功能的测试,主要是功能实现错误,实现了需求未定义的功能,导致需求定义功能时系统出现错误。主要是系统管理员删除页面跳转错误等。其中包括登录系统是密码输入不规范,在设备增加中通过时间来查询设备出现错误,在设备增加中进行设备登帐时出现错误,在设备封存记录查询时查询不到

这些问题都在软件测试中找到并进行处理了。通过对得到的测试结果的分析,步步高超市账单管理系统满足用户的需求。系统的所有基本点都可以实现,执行起来简单,流程满足业务需求,良好的产品性能,是一款可以向大众推广的步步高超市账单管理系统。

上传的附件 cloud_download 基于BS模式的步步高超市管理系统的设计与实现.zip ( 16.63mb, 69次下载 )

发送私信

55
文章数
9
评论数
最近文章
eject