基于JSP和MySQL实现的模拟当当网购书网站

攻城狮0829

发布日期: 2020-12-02 11:47:10 浏览量: 625
评分:
star star_border star_border star_border star_border star_border star_border star_border star_border star_border
*转载请注明来自write-bug.com

摘 要

随着科学技术的进步,计算机行业的迅速发展,大大提高人们的工作效率。计算机信息处理系统的引进已彻底改变了许多系统的经营管理 。

网上书店可以方便用户,足不出户就能购买到自己想要的书,也可以方便书店节约经营成本,通过对当当网调查研究,开发了此购书系统。本系统解决了网上购书的常用基本问题以及相关统计工作。本系统中包含5个功能模块:用户模块,购物车模块,主页面模块,订单模块,以及后台管理模块。

本系统采用MVC模式进行项目的总体设计,使用jsp进行网页界面的设计,以及采用了开源框架Struts2,它采用了当今软件设计的最新技术,具有开发效率高、设计灵活、生成的软件界面友好美观等特点。本系统中通过JDBC驱动和数据库进行无缝连接,后端的数据库是mysql,也是一个开源的数据库系统,该数据库具有较高的完整性,一致性和安全性。Web服务器采用:Tomcat,是一个世界上广泛使用的支持JSP和Servlets的Web服务器。它在Java运行时上能够很好地运行并支持Web应用部署。所以用Tomcat做网上购书的后台服务器能够很好的完成任务。

关键词:当当网;购书;jsp网页开发语言;struts2框架;tomcat服务器

Abstract

With the progress of science and technology, the rapid development of the computer industry, improve people’s working efficiency greatly.The introduction of computerized information systems have been changed many systems management.

Online bookstores can be user-friendly, remain within doors can buy the books they want, can also facilitate the bookstore to save operating costs, based on the investigation on dangdang.com, developed this book system.This system solves the online book commonly used basic problems and the related statistical work.This system contains 5 modules: user module, shopping cart module, main page module, module orders, as well as the background management module.

This system uses MVC mode to undertake the project design, the use of JSP webpage interface design, as well as the open source Struts2 framework, it adopted a software design of the latest technology, with the development of high efficiency, flexible design, generation of friendly software interface handsome features.In this system, through the JDBC drive and database for seamless connectivity, a back-end database is mysql, is an open source database system, the database has a high integrity, consistency and safety.The Web server: Tomcat, is one of the world’s widely used to support JSP and Servlets Web server.It is in the Java runtime to run well and support Web application deployment.So done with Tomcat online book background server can be very good to complete the task.

Key words:dangdang.com,book, tomcat,jsp,struts2

第一章 绪论

1.1 论文研究背景

网上书店通过人与电子通信方式的结合,依靠计算机网络,以通讯技术为基础,实现图书销售的网上交易。网上书店同传统的店面书店相比,传统的书店前期投入大,管理难,顾客来源受地域影响,而网上书店却不受这些影响。它快捷,便利,顾客选择自由,顾客来源广。网上书店的经营方式和销售渠道是全新的,它24小时的全天候和全方位服务是店面书店所不能及的,成本低廉更是开设网上书店的主要原因,而与其他商品相比,书籍运送几乎不怕碰撞碎裂,不具时效性,同时书本具有功能单一,形式简单,易于判断和选择而独具优势,最适合于网上交易,再次是单价低,降低了消费者第一次在网络购物的门槛,所以网上书店成为了电子商务的先锋。

1.2 模拟当当网购书网站的意义

开发此软件目的是使其具有强大的实用价值,即它可以满足中小型书店进行网上售书需求,使其拥有自己的网上书店。在生活中有许多中小书店,由于经济问题或没有技术支持而没有属于自己的网上书店。寻求一个适用于中小型书店的网上购书系统是必要的。顺应了采用现代信息技术手段的电子商务的发展趋势,克服了传统购物模式中耗费人力、物力的弊端。

开发此软件的另一个目的是针对目前当当网的模拟,以便于对网上书店有所了解,熟悉开发一般网上购物系统的步骤,发现在线购物开发过程中所面临的问题。

1.3 网上购书网站的发展现状

国际上网上书店前景看好,而国内的网上书店,数量上也有了新的增长。旌旗,卓越亚马逊,China-Pub,当当网等网上书店的出现,证明了网上书店的前景的良好。现在国家正在积极建设三网融合,网络对人们生活的影响将越来越大,人们对网上购物的认同度也越来越高。这些情况表明,目前开展网上书店业务具有非常大的市场空间。

西方国家网络书城概况:世界上第一家网络书城是1991年在美国联机公司AOL采购网络上建立的”阅读美国书店”,目前最有名的是美国西雅图亚马逊图书公司的亚马逊网上书店。它创建于1995年,供书达310余万种,每年顾客达500万人次,其价格优惠20-50%。金融结算制度完善,配送服务高效。实现了零库存运转。英国网上书店中有较著名的有Internet书店,德国的网上书店主要有图书在线网上书店。著名调查公司AC尼尔森的一项研究显示:63%的中国网民曾在网上购物。而在中国大地上,最受欢迎的网上商品是书籍,56%的网上购物者选择网上买书。

中国网上购书的比例是全球最高的。网上书店是网络环境下图书发行的典型代表,也是未来的发展趋势。

1.4 本文所做的工作

本文简要介绍了网上书店系统的开发与设计。网上购书系统由前台和后台两个层面组成。前台主要面向消费者,包括a.主页面(图书类别模块(公共页面,被各子页面引用),编辑推荐模块,热销图书模块,最新上架以及新书热卖榜模块),其中从主页面跳转到的具体模块有:1.根据用户选择的图书类型列出图书列表的图书列表模块(其里面还具体包括:分页浏览,模糊查询,对图书按需求排序),点击相应图书可以跳转到相应图书详细页面2.点击相应图书跳转到相应图书详细页面。b.购物车模块c.用户功能模块d.订单模块。后台主要面向销售者,包括用户管理、商品管理等。

1.5 本文的结构安排

为了使您在短时间内了解该论文,将本论文内容介绍如下:

  • 第一章 绪论,介绍论文的课题研究背景、目的和意义,发展现状,并简要说明论文的主要工作和结构安排

  • 第二章 介绍设计中所用到的基本技术,包括数据库、JSP、B/S模式、tomcat

  • 第三章 对系统的整体进行设计,首先进行需求分析,包括对数据库需求、页面需求、功能需求等进行分析。然后完成了对系统的功能模块和数据库的设计

  • 第四章 前台的设计与实现

  • 第五章 后台的设计与实现

  • 第六章 对系统进行了测试分析,对全文研究工作进行总结,以及体会

第二章 可行性分析

可行性分析就是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证新系统的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。该系统的可行性分析包括以下几个方面的内容。

2.1 社会可行性

图书销售管理是书店经营管理中的核心环节,也是一个书店能否取得效益的关键。在传统工作模式下,图书销售管理工作大部分是由手工操作完成的,工作效率很低,并且不能及时查询书店图书入库、销售、退货等信息,影响了书店的正常运作。随着计算机信息化管理的普及,书店迫切要求拥有一个能够快速、准确处理商品数据的图书销售管理系统,从而做到合理生产、及时销售、库存量最小和减少商品积压,保证企业能够取得最佳的经济效益。

2.2 技术可行性

Java是一种可以撰写跨平台应用软件的面向对象的设计语言,具有简单、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的特点。

电子商务要求程序代码具有基本的要求:安全、可靠、同时要求能与运行于不同平台的机器的全世界客户开展业务。Java以其强安全性、平台无关性、硬件结构无关性、语言简洁同时面向对象,在网络编程语言中占据无可比拟的优势,成为实现电子商务系统的首选语言。

数据库方面Mysql已经可以满足一般的数据要求,其体积小、速度快、总体拥有成本低,对于一般的个人使用者和中小型企业来说,mysql提供的功能已经绰绰有余,但本文还提供了Oracle数据库配置接口,可以更换数据库。

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目。由于有Sun公司的支持,最新的Servlet和JSP技术都能在Tomact中得到体现。

Tomcat是一个世界上广泛使用的支持JSP和Servlets的Web服务器。它在Java运行时上能够很好地运行并支持Web应用部署。所以用Tomcat做网上书城的后台服务器能够很好的完成任务。

硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。

所以以JAVA+Mysql+Tomcat来设计开发网上书城系统具有良好的技术可行性。

2.3 操作可行性

目前,大多数计算机都能运行该系统,该系统的安装、调试、运行不会改变原计算机系统的设置和布局,并且系统界面简单,提示信息完整,由相关人员指导便能够方便的操作此软件。

2.4 系统的技术介绍

2.4.1 JSP介绍

JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,即能在Linux下运行,也能在其他操作系统上运行。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP的1.0规范的最后版本是1999年9月推出的,12月又推出了1.1规范。目前较新的是JSP1.2规范,JSP2.0规范的征求意见稿也已出台。JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet 是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。

2.4.2 Mysql介绍

MySQL是一个数据库管理系统

一个数据库是一个结构化的数据集合。它可以是从一个简单的销售表到一个美术馆、或者一个社团网络的庞大的信息集合。如果要添加、访问和处理存储在一个计算机数据库中的数据,你就需要一个像MySQL这样的数据库管理系统。从计算机可以很好的处理大量的数据以来,数据库管理系统就在计算机处理中和独立应用程序或其他部分应用程序一样扮演着一个重要的角色。

MySQL是一个关系数据库管理系统

关系数据库把数据存放在分立的表格中,这比把所有数据存放在一个大仓库中要好得多,这样做将增加你的速度和灵活性。“MySQL”中的SQL代表“Structured Query Language”(结构化查询语言)。SQL是用于访问数据库的最通用的标准语言,它是由ANSI/ISO定义的SQL标准。SQL标准发展自1986年以来,已经存在多个版本:SQL-86,SQL-92,SQL:1999,SQL:2003,其中SQL:2003是该标准的当前版本。

MySQL是开源的

开源意味着任何人都可以使用和修改该软件,任何人都可以从Internet上下载和使用MySQL而不需要支付任何费用。如果你愿意,你可以研究其源代码,并根据你的需要修改它。MySQL使用GPL(GNU General Public License,通用公共许可),在 httpt://www.fsf.org/licenses 中定义了你在不同的场合对软件可以或不可以做什么。如果你觉得GPL不爽或者想把MySQL的源代码集成到一个商业应用中去,你可以向MySQL AB购买一个商业许可版本。

MySQL服务器是一个快的、可靠的和易于使用的数据库服务器

如果这是你正在寻找的,你可以试一试。MySQL服务器还包含了一个由用户紧密合作开发的实用特性集。你可以在MySQL AB的 http://www.mysql.com/it-resources/benchmarks/ 上找到MySQL服务器和其他数据库管理系统的性能比较。

MySQL服务器原本就是开发比已存在的数据库更快的用于处理大的数据库的解决方案,并且已经成功用于高苛刻生产环境多年。尽管MySQL仍在开发中,但它已经提供一个丰富和极其有用的功能集。它的连接性、速度和安全性使MySQL非常适合访问在Internet上的数据库。

MySQL服务器工作在客户/服务器或嵌入系统中

MySQL数据库服务器是一个客户/服务器系统,它由多线程SQL服务器组成,支持不同的后端、多个不同的客户程序和库、管理工具和广泛的应用程序接口(APIs)。

MySQL也可以是一个嵌入的多线程库,你可以把它连接到你的应用中而得到一个小、快且易于管理的产品。

有大量的MySQL软件可以使用

幸运的是,你可以找到你所喜爱的已经支持MySQL数据库服务器的软件和语言。

2.4.3 Tomcat介绍

Tomcat 是apache的开源项目之一,Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。Tomcat 是一个轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。这里的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为7.0.26 Release。

2.4.4 B/S模式体系结构

B/S结构,即Browser/Server(浏览器/服务器)结构,随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。B/S结构,主要是利用了不断成熟的浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统结构技术。随着Windows 2000/Windows 2003将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构[6]。

B/S结构是真正的三层结构,它以访问WEB数据库中心,HTTP为传输协议,客户通过浏览器(Browser)访问WEB服务器和与其相连的后台数据库,称之为B/S(Browser/Server)模式。其三级结构组成如下图所示[7]:

图中从左到右,分为三层:

  • 第一层是客服端即浏览器:主要完成客户与后台的交互及最终查询结果的输出功能。在客户端向指定的Web服务器提出服务请求,Web服务器用HTTP协议把所需文件资料传给用户,客户机接受传来的主页文件,并把它显示在Web浏览器上

  • 第二层Web服务器是功能层:完成客户的应用功能,即Web服务器接受客户请求,首先需要执行相应的扩展应用程序与数据库进行连接,通过Access等方式向数据库服务器提出数据处理申请,而后等数据库服务器将数据处理的结果提交给Web服务器,再由Web服务器传送回客户端

  • 第三层数据库服务器是数据层:数据库服务器应客户请求独立地进行各种处理

与传统的C/S模式相比,B/S结构把处理功能全部移植到了服务器端,用户的请求通过浏览器发出,无论是使用和数据库维护上都比传统模式更加经济方便。而且使维护任务层次化:管理员负责服务器硬件日常管理和维护,系统维护人员负责后台数据库数据更新维护。因此,本系统采用B/S模式体系结构作为系统的体系结构。

2.4.5 系统开发平台及运行环境

系统的开发是在 MyEclipse8.5 + mysql 环境下进行的。

  • 操作系统:Windows 7及以上

  • 服务器软件:tomcat

  • 浏览器:Internet Explorer6.0及以上版本

第三章 需求分析

3.1 用户功能模块分析

顾客功能模块用例图

顾客功能模块流程图

3.2 后台功能模块分析

管理员功能模块用例图

管理员功能模块流程图

3.3 数据库需求分析

开发本系统采用的是mysql数据库,通过对系统进行的需求分析,系统流程设计以及系统功能结构的确定,规划出系统中使用的主要有以下各表。

图书信息表、产品信息表、图书栏目(分类)表、订单信息表、订单明细表、用户信息表、用户地址信息表,管理员表。关联关系如下图3.3:

d_book表

字段名称 数据类型 长度 说明 约束
Id int 12 ID号 primary
Author varchar 200 作者 NOT NULL
publishing varchar 200 出版社 NOT NULL
publish_time bigint 20 出版时间 NOT NULL
word_number varchar 15 字数 Default NULL
which_edtion varchar 15 版本 Default NULL
print_time int 20 印刷时间 Default NULL
print_number varchar 15 印刷号 Default NULL
isbn varchar 25 图书编号 Default NULL
author_summary text 作者简介 NOT NULL
catalogue text 书本概况 NOT NULL

d_product表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
product_name varchar 100 产品名称 Not null
description text 100 商品描述 Default null
add_time bigint 20 添加时间 Default null
fixed_price double 书本原价 Not null
dang_price double 当当价格 Not null
Key_words Varchar 200 是否推荐 Default null
has_deleted int 1 是否下架 Not null default ‘0’
product_pic varchar 200 产品图片 default null

d_category表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
turn int 10 排序顺序 not null
en_name varchar 200 英文名 not null
name varchar 200 中文名 not null
description varchar 200 描述信息 not null
parent_id int 10 上层目录id

d_category_product表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
product_id int 10 产品id not null
cat_id int 10 分类名称 not null

d_item表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
product_id int 10 产品id not null
order_id int 10 订单id not null
product_name Varchar 100 产品名称 Not null
dang_price Double 书城价格 Not null
product_num Int 10 产品数量 Not null
amount Double 总价 Not null

d_order表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
user_id int 10 用户号 not null
status int 10 状态 not null
order_time bigint 20 订单时间 not null
order_desc varchar 100 订单描述 default null
total_price double 订单总价 not null

d_receive_address表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
user_id int 10 用户id not null
receive_name varchar 20 接收者名称 not null
full_address varchar 200 详细地址 not null
postal_code varchar 8 邮编 not null
mobile varchar 15 移动电话 default null
phone varchar 20 电话 default null

d_user表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
email varchar 50 电子邮箱 not null unique
password varchar 50 密码 not null
user_integral int 12 是否被锁定 not null default ‘0’
is_email_verify char 3 是否通过邮箱验证
email_verify_code varchar 50 邮箱验证码 default null
last_login_time bigint 最后登录时间 null
last_login_ip bigint 最后登录ip default null

d_admin表

字段名称 数据类型 长度 说明 约束
id int 12 id号 primary key
email varchar 50 邮箱 not null
password varchar 50 密码 not null

第四章 前台的设计与实现

前台主要分为四个模块:用户功能模块,主页面模块,购物车模块,订单模块。

4.1 搭建项目框架

  • 创建项目 web project

    • 项目名称:dang
  • 添加开发需要类库

    • 添加开发struts 6个基本类库
      • commons-fileupload-1.2.1.jar
      • commons-io-1.3.2.jar
      • freemarker-2.3.15.jar
      • ognl-2.7.3.jar
      • struts2-core-2.1.8.1.jar
      • xwork-core-2.1.6.jar
    • MySQL数据连接驱动
      • mysql-connector-java-5.1.16-bin.jar
  • 搭建struts基本框架

    • 完成页面跳转
  • 分包

    • com.wlj.web.action.cart:与购物车相关的Action
    • com.wlj.web.action.main:与主页面相关的Action
    • com.wlj.web.action.order:与订单管理相关的Action
    • com.wlj.web.action.user:与用户相关的Action
    • com.wlj.web.action.manage:与后台管理相关的Action
    • com.wlj.web.action BaseAction.java 所有action的父类
    • com.wlj.web.interceptor:项目需要拦截器
    • com.wlj.web.util:项目开发工具类
    • com.wlj.web.dao:数据访问层操作
    • com.wlj.web.entity:实体类操作
  • 配合文件分包

    • config/struts/struts.xml:开发struts公共信息
    • config/struts/struts-cart.xml:购物车action配置信息
    • config/struts/struts-main.xml:书籍管理action配置信息
    • config/struts/struts-order.xml:订单管理action配置信息
    • config/struts/struts-user.xml:用户管理action配置信息
    • config/struts/struts-admin.xml:后台管理action配置信息
    • config/props:属性文件(包括数据库的数据db.sql文件,以及连接数据库的属性文件)
    • 在web.xml中添加配置修改默认路径
      1. <filter>
      2. ...
      3. <init-param>
      4. <param-name>config</param-name>
      5. <!--加载多个配置文件用逗号隔开(,)-->
      6. <param-value>
      7. struts-default.xml,
      8. struts-plugin.xml,
      9. config/struts/struts.xml
      10. </param-value>
      11. </init-param>
      12. </filter>
      13. <filter-mapping>
      14. ...
      15. </filter-mapping>
  • 页面分层

    • WebRoot
      • common:公共页面
      • css:项目所有需要样式文件
      • images:项目中所有图片
      • js:项目开发使用js脚本
      • productImages:产品图片
      • productImages_c:产品大图
    • WEB-INF
      • cart:购物车相关页面
      • main:主页面中各子页面
      • order:订单相关页面
      • user:用户相关页面
      • manager:后台管理相关页面
  • 创建数据库

    • 打开dd.sql文件,运行其语句:
      • create database dd;
      • use dd;
      • 添加表和测试数据

4.2 用户模块实现

用户模块主要实现用户的注册、登录、找回密码、管理个人信息。

4.2.1 用户注册

Jascript的表单验证,而对于用户email,不仅要保证格式正确,而且要保证唯一性,所以还采用了ajax技术,到数据库查询相关数据,结果返回一个boolean值,如果为true,则说明该邮箱可以使用。反之,则该邮箱不能使用,必须重新填写。

如下图为邮箱格式不正确的提示信息:

下图为邮箱格式正确但不符合唯一性的提示信息:

而对于验证码,每打开注册页面,浏览器根据链接就会向服务器的相关action发送请求验证码的需求。服务器返回一张图片给浏览器时,同时将验证码的实际数据绑定在session中,每当用户提交时,就会进行ajax验证,看是否与session中绑定的验证码数据一致,如不一致则重新换一张验证码图片,提示验证码输入错误。如下图4.1.1.3为当用户输入验证码错误时,服务器又重新换了张验证码图片。

4.2.2 验证邮箱

具体的邮箱相关设置还没有实现,但本程序实现了其的主要思想逻辑。即当用户注册完毕时,就已经把邮箱验证码录入到数据库相关用户的信息记录中。如果要具体实现,只需打开邮箱接收相应邮箱验证码即可。在这一步,本程序就已经把邮箱验证码从数据库中取出,用户不必再去自己的邮箱中获取。

4.2.3 用户登录

用户登录也才用javascript表单验证,当用户输入的邮箱,密码格式都正确时才能提交(关于忘记密码后找回密码,以下章节将会具体给出)。提交完成后,服务器将会到数据库查询是否有满足的用户。如有还要判断用户是否被锁定,如没被锁定(有没有锁定主要根据user表中integral字段来判断),则返回登录成功的主页面且绑定用户对象到session中,否则返回登录页面,并提示相关错误信息,用户必须重新登录。

登录成功后,主页面根据相应绑定的session中的loginUser对象。

用户退出,服务器将会把session中绑定的LoginUser对象移除。

4.2.4 用户管理个人信息

用户可以查看个人信息(修改密码,修改昵称),查看历史订单以及自己填写的所有地址信息。

其中用户昵称修改采用ajax技术(在用户昵称满足javascript表单验证的前提下),即当用户填写的昵称与先前昵称不一样,就向服务器发送请求,修改相应用户记录中昵称字段。并返回修改是否成功信息。

修改密码,是根据用户注册时选择的找回密码问题来找回密码。

当用户修改密码成功时必须重新登录。

用户查看历史订单页面,采用了二次封装javascript的jquery框架,使得页面更美化。

用户查看订单的送货地址,并且可以修改相应的送货地址(用户输入的修改信息也必须满足javascript表单验证),当点击修改按钮后,浏览器把表单里的相应address对象以及用户id传送给服务器,服务器再到数据库修改相应用户地址记录。而后还是返回本页面。

4.3 主页面模块实现

浏览地址:localhost:8080/dangdang-wlj

主页面模块的实现:主页面(图书类别模块(公共页面,被各子页面引用),编辑推荐模块,热销图书模块,最新上架以及新书热卖榜模块),其中从主页面跳转到的具体模块有:1.根据用户选择的图书类型列出图书列表的图书列表模块(其里面还具体包括:分页浏览,模糊查询,对图书按需求排序),点击相应图书可以跳转到相应图书详细页面2.点击相应图书跳转到相应图书详细页面

4.3.1 图书类别模块(公共页面,被各子页面引用)

主要涉及到数据库的查询,查询category表,调用categoryDaoImpl类的findMain(int id)函数以及findByParentId(Category vo),程序如下:

通过父类id=1,求出其子类集合,结果返回最初的子类集合,此次再在子类中又递归调用本方法,来设置子类对应的子类集合。

  1. */
  2. public List<Category> findByParentId(Category vo) throws Exception {
  3. List<Category> categorys = new ArrayList<Category>();
  4. Connection conn =null;
  5. PreparedStatement pstmt=null;
  6. ResultSet rs=null;
  7. Category category = null;
  8. String sql ="select * from d_category where parent_id= ?";
  9. try {
  10. conn = DBUtil.getConnection();
  11. pstmt = conn.prepareStatement(sql);
  12. pstmt.setInt(1, vo.getId());
  13. rs = pstmt.executeQuery();
  14. while(rs.next()){
  15. category = new Category();
  16. category.setDescription(rs.getString("description"));
  17. category.setEnName(rs.getString("en_name"));
  18. category.setId(rs.getInt("id"));
  19. category.setName(rs.getString("name"));
  20. category.setParentId(rs.getInt("parent_id"));
  21. category.setTurn(rs.getInt("turn"));
  22. category.setChildCategorys(findByParentId(category));
  23. categorys.add(category);
  24. }
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. throw e;
  28. }finally{
  29. DBUtil.close(rs, pstmt, conn);
  30. }
  31. return categorys ;
  32. }
  33. public List<Category> findMain(int id) throws Exception {
  34. List<Category> categorys = new ArrayList<Category>();
  35. Connection conn =null;
  36. PreparedStatement pstmt=null;
  37. ResultSet rs=null;
  38. Category category = null;
  39. String sql ="select * from d_category where id = ?";
  40. try {
  41. conn = DBUtil.getConnection();
  42. pstmt = conn.prepareStatement(sql);
  43. pstmt.setInt(1, id);
  44. rs = pstmt.executeQuery();
  45. if(rs.next()){
  46. category = new Category();
  47. category.setDescription(rs.getString("description"));
  48. category.setEnName(rs.getString("en_name"));
  49. category.setId(rs.getInt("id"));
  50. category.setName(rs.getString("name"));
  51. category.setParentId(rs.getInt("parent_id"));
  52. category.setTurn(rs.getInt("turn"));
  53. category.setChildCategorys(findByParentId(category));
  54. categorys.add(category);
  55. }
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. throw e;
  59. }finally{
  60. DBUtil.close(rs, pstmt, conn);
  61. }
  62. return categorys ;
  63. }

4.3.2 编辑推荐

编辑推荐主要是由管理员来管理,管理员通过商品管理来推荐,或取消推荐图书。主要是查询product表中的keywords字段,如果keywords的值等于recommend则推荐此书。查询出所有带有recommend的图书然后显示出来。

4.3.3 热销图书

模块涉及到数据库的多表查询,关联product,book,category_product,item表,然后查询出订单项中销量最多的图书,以降序显示出来。程序在BookDaoImpl类中,程序代码如下:

热销图书查询(要查询全部类型的图书,所以catId=1)

  1. public List<Book> findBookByCatId(Category category, String sortWay,
  2. int currPage, int pageSize) throws Exception {
  3. List<Book> books = new ArrayList<Book>();
  4. Book book = new Book();
  5. Connection conn = null;
  6. PreparedStatement pstmt = null;
  7. ResultSet rs = null;
  8. // oracle 中nvl mysql 中 ifnull
  9. String sql = "selectdistinctp.has_deleted,p.keywords,b.author,b.id, p.product_name,b.author,b.publishing,b.publish_time,p.description,p.fixed_price,p.dang_price,p.product_pic,p.add_time,ifnull(cou.num,0) num1 "
  10. + "from d_category_product cp join d_product p on cp.product_id = p.id join d_book b on p.id = b.id left join ( "
  11. + "select distinct product_id,sum(product_num) num from _item group by product_id ) cou "
  12. + "on cou. product_id = b.id "
  13. + "where cat_id = ? "
  14. + "order by " + sortWay + ",b.id asc limit ?,? ";
  15. try {
  16. conn = DBUtil.getConnection();
  17. pstmt = conn.prepareStatement(sql);
  18. pstmt.setInt(1, category.getId());
  19. pstmt.setInt(2, (currPage - 1) * pageSize);
  20. pstmt.setInt(3, pageSize);
  21. rs = pstmt.executeQuery();
  22. while (rs.next()) {
  23. book = new Book();
  24. book.setAuthor(rs.getString("b.author"));
  25. book.setSales(rs.getInt("num1"));
  26. book.setHasDeleted(rs.getInt("p.has_deleted"));
  27. book.setKeywords(rs.getString("p.keywords"));
  28. book.setId(rs.getInt("b.id"));
  29. book.setProductName(rs.getString("p.product_name"));
  30. book.setAuthor(rs.getString("b.author"));
  31. book.setPublishing(rs.getString("b.publishing"));
  32. book.setPublishTime(new Date(rs.getLong("b.publish_time")));
  33. book.setDescription(rs.getString("p.description"));
  34. book.setFixedPrice(rs.getDouble("p.fixed_price"));
  35. book.setDangPrice(rs.getDouble("p.dang_price"));
  36. book.setProductPic(rs.getString("p.product_pic"));
  37. book.setAddTime(new Date(rs.getLong("p.add_time")));
  38. books.add(book);
  39. }
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. throw e;
  43. } finally {
  44. DBUtil.close(rs, pstmt, conn);
  45. }
  46. return books;
  47. }

4.3.4 最新上架图书

最新上架图书主要根据product表中的add_time字段来判断,然后降序显示出来。

具体sql语句如下:

  1. Select p.id,author,publishing,publish_time,product_name,description,fixed_price,dang_price,product_pic from d_book b join d_product p on b.id = p.id order by p.add_time desc limit 1,4 ;

4.3.5 新书热卖榜

新书热卖榜主要涉及到数据库中的表product,book,item,category_product关联查询。这里有涉及到按多个字段排序order by b.publish_time desc,cou.num desc,具体sql语句如下:

  1. select distinct b.id, p.product_name,b.author,b.publishing,b.publish_time,p.description,p.fixed_price,p.dang_price,p.product_pic,p.add_time,ifnull(cou.num,0)from d_category_product cp join d_product p on cp.product_id = p.id join d_book b on p.id = b.id left join select distinct product_id,sum(product_num) num from d_item group by product_id ) cou on cou. product_id = b.id where cat_id = 1 order by b.publish_time desc,cou.num desc limit 1,3;

4.3.6 图书列表

图书列表左栏的实现:用户通过主页面的类别栏的链接进入此模块,在进入前,会把用户点击的类别对象传递给服务器,服务器通过相应类别查询出其他的兄弟类别及相应类别的藏书量。

相应的程序实现代码如下:

  1. /*
  2. * 通过父类id来查询子类集合,而后再关联d_category_product表以求出对应子类里的藏书数量
  3. */
  4. public List<Category> findCategoryInfoByParentId(Category vo)
  5. throws Exception {
  6. List<Category> categorys = new ArrayList<Category>();
  7. Connection conn = null;
  8. PreparedStatement pstmt = null;
  9. ResultSet rs = null;
  10. Category category = null;
  11. String sql ="select c.id,c.name,c.en_name,c.parent_id, count(cp.product_id) count_product " +
  12. "from d_category c left join d_category_product cp on c.id = cp.cat_id " +
  13. "where c.parent_id = ? " +
  14. "group by c.id";
  15. try {
  16. conn = DBUtil.getConnection();
  17. pstmt = conn.prepareStatement(sql);
  18. pstmt.setInt(1, vo.getParentId());
  19. rs = pstmt.executeQuery();
  20. while(rs.next()){
  21. category = new Category();
  22. category.setEnName(rs.getString("c.en_name"));
  23. category.setId(rs.getInt("c.id"));
  24. category.setName(rs.getString("c.name"));
  25. category.setParentId(rs.getInt("c.parent_id"));
  26. category.setCountProduct(rs.getInt("count_product"));
  27. categorys.add(category);
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. throw e;
  32. } finally{
  33. DBUtil.close(rs, pstmt,conn);
  34. }
  35. return categorys;
  36. }

图书列表右栏的实现:主要涉及复杂的数据库查询,其中查询语句根据浏览器传递过来的参数,进行多种方式排序,根据页数显示相应数据,以及模糊查询,具体sql语句如下,其中问号以及黑体字是浏览器相应传过来的参数。

  1. select distinct p.has_deleted,b.id,p.product_name,b.author,b.publishing,b.publish_time,p.description,p.fixed_price,p.dang_price,p.product_pic,p.add_time,ifnull(cou.num,0) " +
  2. "from d_category_product cp join d_product p on cp.product_id = p.id join d_book b on p.id = b.id left join ( " +
  3. "select distinct product_id,sum(product_num) num from d_item group by product_id ) cou " +
  4. "on cou. product_id = b.id " +
  5. "where cat_id = ? "+ "and (p.product_name like '%"+key+"%' or b.author like '%"+key+"%' or b.publishing like '%"+key+"%' ) "+
  6. "order by "+sortWay+
  7. " limit ?,? ";

4.3.7 图书详细信息实现

根据用户点击的图书id,关联查询数据库中的product,book表,而后显示出来。

具体sql语句如下,其中问号是浏览器传过来的图书id:

  1. select * from d_book b join d_product p on b.id=p.id" + " where b.id=?;

4.4 购物车模块实现

购物车实现主要包括:购物车的添加,购物车商品的数量更改,购物车商品的删除,以及恢复购物车中删除的商品。

4.4.1 购物车的添加

当用户点击购买按钮,ajax技术会向服务器发送请求,如果先前没有载入购物车,服务器会把cookie里对应用户绑定的数据(有购物车数据,与恢复购物车数据)载入,并绑定mycart以及recart对象到session中,其中mycart,recart都是一个集合,里面存储着用户加入购物车的cartItem对象。当购物车商品内容发生改变,就得重新绑定用户cookie值。而后再设置cookie保存时间为一年,就能保证当用户关闭浏览器,再次打开时购物车商品还在。载入购物车完毕时,再把用户点击的相应商品添加到mycart集合里,具体操作由Mycart.java类实现。

4.4.2 购物车商品的数量更改

首先用户输入的要更改的商品数量必须是数字,否则javascirpt表单验证将不会发送请求。当用户输入数字合法时,如果输入数字为0,商品将被移除到恢复购物车集合,否则会更改对应商品的数量。

4.4.3 购物车商品的删除

根据商品的id,把cart集合里的对应商品项cartItem移除,然后在cartRe集合中添加相应的被删除的商品项cartItem。

4.4.4 购物车商品的恢复

即把相应cartRe恢复购物车中的商品移除,移除的cartItem商品项添加到cart购物车中。

4.5 下订单模块实现

当用户点击结算按钮将出现如下页面:

用户确认信息后点击下一步将出现如下页面:

服务器将会返回用户以前购买商品时填写过的一些地址。当用户选择以前填写过地址,浏览器将会采用ajax技术向服务器发送请求,返回所选择地址相应信息,并采用javascirpt的dom操作,把地址信息显示在表单文本框中,以只读格式显示,如图4.5.2。用户可以选择以前填写的收货地址,也可以填写新地址,当填写新地址,会进行javascript的表单验证,当格式合法时,用户的新地址方可插入到数据库中。

而后点击下一步将出现订单成功页面,服务器将清空购物车中的信息。

第五章 后台管理的设计与实现

后台管理主要包括四个模块:管理员登录,用户管理,商品添加,商品管理,安全退出

5.1 管理员登录

登录网址:localhost:8080/dangdang-wlj/admin/loginAction

Javascript首先进行表单验证,当输入格式正确时,才会向服务器发送请求。服务器根据管理员输入的信息到数据库中admin表查询,如存在信息一致的记录,则服务器将绑定loginAdmin对象至session中,返回管理页面。否则返回登录页面,并提示用户密码或帐号输入错误信息。

5.2 用户管理

用户表是以用户消费金额来降序排序。

管理员可以对目前注册过的会员进行管理,包括用户锁定以及删除。

其中用户的锁定与解锁状态是根据表user中的userIntegral字段来判断,当userIntegral == 1表示用户已经被锁定。反之,可以对用户进行锁定。用户登录后将会提示用户被锁定的信息。

5.3 商品添加

其中商品信息添加中的选择图书类别,采用了javascript的dom操作。

当点击添加按钮将向服务器发送请求。如添加成功还是返回当前页面。并提示添加成功字眼。否则将跳转到出错页面。如下图5.3.2为添加成功页面。

其中上传图片是通过struts2提供的拦截器来实现。

  1. <interceptor-ref name="fileUpload"/>
  2. <interceptor-ref name="basicStack"/>

上传图片包括图书小图,以及图书大图,小图默认存放路径为webRoot/productImages,大图默认存放路径为webRoot/productImage_c;用户也可以直接把要添加商品的图片拷贝到对应的文件夹中去。

当用户点击上传按钮,将出现下图:

当商品信息以及图片都添加成功后,到主页面中去将看到商品已经添加到最新上架栏目里。

5.4 商品管理

管理员可以查看商品信息,商品表是按照商品的销量降序排序。

可以对商品进行推荐/取消推荐操作。被推荐的商品将出现在主页面中的编辑推荐栏目中。

也可以对商品进行下架/上架操作。其中上架下架主要是通过product的has_deleted字段来判断,当has_deleted==1表示该商品已下架,否则反之。当管理员将此商品下架,则主页面中该商品条目中将不会出现购买按钮,会提示该商品已经下架。

5.5 安全退出

当管理员点击安全退出链接,服务器会把session中的loginAdmin对象移除,而后返回到登录页面。

第六章 系统测试

6.1 测试目的与目标

在此系统进行初步实现之后,开始进行对系统进行测试,找出系统中存在的Bug,通过测试,用提交的Bug报告来为以后软件的改进提供标准和参考,能够在以后的系统改进中找到依据。

测试后的软件各模块基本功能能够顺利进行,尽可能的提高软件的健壮性。

6.2 测试方法

系统的测试有两种方法分别为黑盒测试和白盒测试。

黑盒测试又称为功能测试,在程序接口进行,只检查程序功能是否能够按照规格说明书的规定正确使用,程序是否能适当地接收输入数据并发生正确的输出信息,而且要能够保持外部信息的完整性。

白盒测试又叫结构测试,完全了解程序的结构和处理过程,这种方法按照程序内部的逻辑测试程序,检验程序中每条通路是否都能按照预定要求正确工作。

本系统开发过程进行的测试步骤如下:

模块测试:也叫单元测试,目的是保证每一个模块作为一个单元能正确运行,本测试所发现的往往是编码和详细设计的错误,主要评价模块的下述五个特点:模块接口,局部数据结构,重要的执行路径,出错处理通路,影响上述各方面特性的边界条件。

模块测试主要由代码审查和软件测试两部分组成。

集成测试:包括系统测试和子系统测试。集成测试是组装软件的系统技术,主要目标是发现与接口有关的问题。集成测试有两种方法:非渐增式和渐增式,但比较而言,渐增式方法比较好,因为:编写的测试软件较少,开销较小;较早地发现模块间的接口错误;错误位置容易判断;测试更彻底。

因此,本系统集成测试采用渐增式测试中的混合法,即对软件结构中较上层使用自顶而下的测试方法,而对软件结构中较下层,使用的是自底向上方法,两者结合,这是对模块较多时测试的一种折衷方法。

验收测试:这一步是验证软件的有效性。目的是向未来的用户表明系统能够像预定的那样工作,验收测试一般使用黑盒测试法,验收测试有两种可能的结果:功能和特性与用户的要求有差距;功能和性能与用户要求一致,软件是可以接受的。这个阶段发现的问题往往和需求分析阶段的差距有关。

平行运行。所谓平行运行就是同时运行。新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。目的有:可以在准生产环境中运行新系统而有不冒风险;用户能有一段熟悉新系统的时间;可以验证用户指南和使用手册之类的文档;能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。

6.3 测试结论

把开始的代码写得越好,它出现的错误也就越少,你也就越能相信所做过的测试是彻底的。系统化测试以一种有序方式设法探测潜在的麻烦位置。同样,毛病最可能出现在边界,这可以通过手工的或者程序的方式检查。自动进行测试是最理想的,用得越多越好,因为机器不会犯错误、不会疲劳、不会用臆想某此实际无法工作的东西能行来欺骗自己。回归测试检查一个程序是否能产生与它们过去相同的输出。在做了小改变之后就测试是一种好技术,能帮助我们将出现问题的范围局部化,因为新问题一般就出现在新代码里面。

测试和排错常常被说成是一个阶段,实际上它们根本不是同一件事。简单地说,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,为设法打败它而进行的一整套确定的系统化的试验。

Edsger Dijkstra有一个非常有名的说法:测试能够说明程序中有错误,但却不能说明其中没有错误。他的希望是,程序可以通过某种构造过程正确地做出来,这样就不再会有错误了,因此测试也就不必要了。这确实是个美好生活的目标,但是,对今天的实际程序而言,这仍然还只是一个理想。所以应该集中精力讨论如何测试,如何才能够更快地发现程序错误,如何才可以使得工作更有成效、效率更高。

系统存在不足

系统不足:由于制作时间有限,自身所学知识的贫乏,页面做的比较粗糙,整个系统的功能还不是很完善。

  • 分页浏览可以采用ajax,为了不影响用户体验,应尽量使用ajax技术

  • 购物车中的载入以及存储cookie可以用json对象

  • 购物车的数据应该存进数据库中,减免服务器压力

    • 后台管理界面不够友善,后台具体还可以添加修改商品信息功能,根据用户的需求排序(如按商品出版时间,上架时间….)商品表
  • 使用spring框架,将使得本系统更符合软件工程思想,使得软件各层完全解藕,更易于后期维护,以及方便对数据库事务操作和对象状态管理

  • 随着数据的增多,为了方便数据的录入,应考虑实现大数据量导入数据库的技术

改进方案及方向

对于此系统要从美观、功能和技术上三个方面做重点改进。在美观方面还要不断的提高自己的审美观,要熟练的掌握网页开发工具,功能方面要扩大系统的功能,使得以前没有实现的功能能够实现,对已有的功能要进行修改扩冲,技术方面虽然系统的基本功能已经实现,但制作还是比较粗糙,很多方面还是没有考虑仔细。

总结

经过几个月的不断学习和设计开发加上老师同学的帮助,终于完成了我的毕业设计题目“模拟当当网购书网站”的开发,在开题报告阶段我参阅了大量的中外文献,对所开发系统的现状,国际发展情况以及未来发展趋势有了深入的了解;在整个系统的需求分析过程中对开发前期工作地流程步骤有了深入的掌握;在开发过程我进一步学习了Java的基础语法,和一些网页设计美工方面的知识,以便使系统有更好的美观性,在编写过程中也规范了许多编码习惯,数据库设计阶段我尝试了几个不同版本的数据库,它们在配置操作上各有不同,又各有优缺点,在它们的一些基本操作上也有了进一步提高。在配置开发工具过程中对Tomcat和MyEclipse的连接部署有了清晰地认识,在使用第三方插件struts2时,对其配置文件Struts-config.xml的作用也有了相当的了解, 对开发Web程序的步骤框架页有了总体性认识。

在整个系统开发的过程中,我学到了很大新的知识,以前学过的许多知识点在运用过程中也有了更为深入的分析,这是我大学期间做过的规模最大的项目

在这个过程中也体会到了如何将书本知识转化到实际的应用中。

参考文献

[1] 王立福. 软件工程(第二版)[M]. 北京:北京大学出版社.2002.

[2] 张秋余,杨玥. 基于用例的需求建模方法[J]. 计算机工程与设计,2006,19:3539-3541.

[3] MattheMacDonal.管理信息系统[J].电子工业出版社.2003.Vol.3(8):102-108.

[4] 张秋余,杨玥. 基于用例的需求建模方法[J]. 计算机工程与设计,2006,19:3539-3541.

[5] John W. Satzinger, Robert B. Jackson, Stephen D. Burd. [Z]. 北京:人民邮电出版社, 2008.

[6] 王珊,萨师炫.数据库系统概论(第三版)[M]. 北京:高等教育出版社.2002

[7] 张海潘.软件工程[J].清华大学出版社.2003年11月

[8] 张波. 网络答疑系统的设计与实现[D]. 长春:吉林大学软件学院,2005.

[9] 陆荣幸,郁洲. J2EE平台上MVC设计模式的研究与实现[J]. 计算机应用研究,2003,03:144-146.

[10] 孙卫琴,李洪称. Tomcat与Java Web开发技术详解[M]. 北京:电子工业出版社,2003.

[11] 何成万,余秋惠. MVC模型2及软件框架Struts的研究[J]. 计算机工程,2002,06274-276.

[12] Marty Hall,Larry Brown著,赵学良译. Servlet与JSP核心编程(第2版)[M]. 北京:清华大学出版社,2004.

[13] 戴继周. 基于Web的网络教学平台的设计与实现[D]. 长春:吉林大学计算机应用技术专业,2004

[14] 尹朝庆. 计算机系统结构教程[M]. 北京:清华大学出版社.2005.

[15] 张海藩. 软件工程导论(第四版)[M]. 北京:清华大学出版社,2003.

[16] 张维明. 信息系统原理与工程. 电子工业出版社. 2002年1月

上传的附件 cloud_download 基于JSP模拟当当网购书网站的设计与实现.zip ( 11.26mb, 9次下载 )
error_outline 下载需要11点积分

发送私信

53
文章数
12
评论数
最近文章
eject