基于JAVA WEB的网上商城设计与开 发

获取项目源文件,技术交流与指导联系Q1225467431

  

本文的主要研究对象是网上商城系统,研究网上商城一般的业务流程,还有网上商城的结构和模块,各个模块的功能等等。整个论文从如何来分析一个网上商城系统的业务流程和它的结构以及模块,再到到对开发工具的选择,以及对前面分析出来的结果进行初步的设计(这里我设计的是使用Javaweb开发技术来实现这个网上商城系统),对网上商城系统分析和设计完成之后,就进入到实际的代码编写阶段,在这个阶段就可能对前面的设计进行一定的修改或是完善。在开发阶段,我将采用的是螺旋递增式的开发,每次只完成一部分功能,然后就立即对这些功能进行测试,接着进入下一个开发阶段,然后继续测试,直到所有的功能全部实现后,再对整个系统进行一个完整的测试,看其是否达到了先前的设计要求。

综上所述,本文讨论的就是如何使用Javaweb开发技术来完整的实现一个网上商城系统的主要功能。

关键词  商城设计与开发 ; JAVA ; JAVA WEB

                            Abstract

Therefore, this paper studies the main object is online shopping mall, online mall general business processes, and online store structure and module, the function of each module. The article, from how to analyze online mall business process and the structure of the system and modules, and then in the choice of development tools, and the results of the front, preliminary design (I design web pages, use Java development technology to realize the online mall), online mall of system analysis and design into the actual code stage complete, at this stage, may in front of the design basis of certain amendments or perfect.. During the development phase, I will use the spiral incremental development, a stage of the function as long as finished, then immediately testing these functions, and then into the next stage of development, and then continue to test, until all test function, and finally to the overall test the whole system to see if it comply with the design requirements.

All in all, this paper has discussed how to use Java Web development technology to complete a online mall system.

KeywordsBUY GOODS   JAVA WEB  SHOPPING

 

  

1章 绪论 1

  1.1 课题背景............................................................................................1

1.2 目的和意义 1

1.3 论文研究内容 2

1.4 什么是网上商城 2

1.5 网上商城的分类 3

2章 网上商城系统的需求分析 4

2.1 网上商城业务流程分析 4

2.1.1 作为一名消费者的使用流程 4

2.1.2 作为一名商城管理员的操作流程 5

2.2 网上商城模块分析 5

2.2.1 用户模块 6

2.2.2 管理员模块 6

2.3 本章小结 7

3章 网上商城系统的设计与实现 8

3.1 开发语言和工具介绍 8

3.1.1 开发语言 8

3.1.2 数据库 9

3.1.3 服务器 9

3.1.4 开发工具 10

3.2 业务逻辑设计 10

3.2.1 共用类和相应方法 10

3.2.2 用户实体类和相应方法 11

3.2.3 管理员实体类和相应方法 13

3.2.4 商品类别类和相应方法 14

3.2.5 商品类及其相应管理方法 15

3.2.6 购物车类及其方法 16

3.2.7 订单类及其方法 17

3.3 数据库设计 18

3.3.1 数据库设计简要介绍 18

3.3.2 数据库具体设计 19

3.4 本章小结 21

4章 系统的测试和分析 22

4.1 Version 1 22

4.2 Version 2 24

4.3 Version 3 26

4.4 Version 4 28

4.5 Version 5 30

4.6 Version 6 32

4.7 Version 7 34

4.8 Version 8 36

4.9 Version 9 38

4.10 Version 10  40

4.11 本章小结 40

     41

     42

参考文献 43

     44

第1章 


第一章 绪论

1.1选题背景

   随着计算机技术的发展和网络人口的增加,网络世界也越来越广博,越来越丰富,网上商城已经成为网上购物的一股潮流。互联网已日益成为收集提供信息的最佳渠道并逐步进入传统的流通流域,互联网的跨地域性和可交互性使其在与传统媒体行业和传统贸易行业的竞争中是具有不可抗拒的优势。人们对于互联网技术的要求已不单单是浏览一下网站网页,收发电子邮件,日益忙碌的人们开始追求足不出户就能买到心仪的商品,是越来越多的上网爱好者实现购物的一种方式。对于企业来讲,无论是企业之间(B to B),还是企业和客户之间(B to C)的交易,如果能够实现网上交易将大大提高交易速度节约成本。但是对网络的及时、一对一、跨时间、 跨空间等特性,并没有充分加以利用。在这种形势下,传统的依靠管理人员人工工作传递信息和数据的管理方式就无法满足企业日益增长的业务需求了。因而开发了这样一个具有前后台的网上商城系统,以满足购物者和企业的需求。

1.2选题的目的和意义

对于网上商城来说,我想每个人都不陌生,即使你没有亲自在网上买过东西也一定见过、听说过网上购物这种方式。网络购物作为一种新的购物形式已经被广大群众所接受,尤其是年轻群体,他们特别热衷于网购。

网购最大的优势就是东西要比现实中商场里的商品便宜,而且一般都是送货上门,因为网购一般都是采取快递送货方式,直接送到你家楼下或者公司里,因此网络购物的第二大优势就是其便利性,用户只要坐在电脑前,点点鼠标就可以买东西了。当然网购也有它的缺点,比如无法见到实物,只能通过商家介绍的文字和图片来了解商品,再比如买衣服无法试穿,而且这也为不良商家提供了忽悠消费者的方法,他们会尽力美化自己的商品来诱惑消费者买单,而消费者收到商品后才发现和想象中的差异很大,而商家又以各种各样的理由推脱,而且由于采用网上交易,所以会存在安全问题。但是这些都不能挡住网购的魅力,网上购物现在正变得越来越流行,市场份额也变得越来越大。因此这次毕业设计题目就以目前现有的网上商城系统为研究对象,例如淘宝和当当,这里主要研究后者的形式,也就是商城自己经营的方式,研究一般的网上商城的业务流程,猜测其各个功能模块及其组合、连接方式,并分析其具体的实现方式,最后使用Javaweb服务器和数据库完成一个网上商城系统的主要功能模块。

通过这样一个毕业设计,可以提高自己Java编程的水准,也练习了怎样构建一个完整的系统,从系统的需求分析到设计,直至编码、测试并运行,熟悉并掌握一个完整的Web开发流程,为今后工作打下基础。

1.3论文研究内容

网上商城是一个基于Internet的应用,属于B/S架构,前端就是一个客户浏览器,客户需要通过浏览器来访问服务器,因此,本文主要研究的就是一个网上商城系统(商城自负经营的类型)的业务流程及其实现方式。

首先,需要站在使用者的角度去思考你究竟会怎么使用这个系统,而一个网上商城的使用者一般又有两类,一类是普通消费者,而另一类则是商城的管理员,因此我就需要思考这两类人都会怎么来使用这个系统,这样就能分析出网上商城系统的业务流程。

而实现这个业务流程可以采用很多种不同的方法,很明显,网上商城系统是一个基于Internet的应用,因此就需要使用到Web开发的方法,目前Web开发的方法有很多,流行的有Java.Net,这里我选择了Java,因此我就需要研究如果采用Java作为编程语言,我应当如何来实现这个系统,这个系统应该划分为多少个模块,每个模块的功能又是什么,他们之间如何组合到一起,这也就是系统的设计。

第二章 网上商城系统的需求分析

1.1 网上商城业务流程分析

开发一个项目,不管你采用什么实现方式,其实都是在完成其业务流程,因此,将一个系统的业务流程分析清楚,将为后面的开发提供极大的便利。由于本文选择了B2C(Business To Customer,商家对顾客直销模式,所以之后的分析或讨论均是针对此种模式。

如何对一个系统进行分析有很多的方法,这里我采用了站在具体的使用者的角度来考虑这个网上商城系统的功能和结构,先是粗略的分析一下使用的流程,在这个过程中就能够发现一些必须的基础的类。

1.1.1 作为一名消费者的使用流程

假如一个消费者第一次来到一个网上商城,他首先一般会先浏览浏览该商城的首页以及首页上所列的各种商品如果你这个网站的首页设计得很精细很吸引人的话消费者才会有兴趣进行下一部探索,看看你们这个商城有什么好的商品。因此,目前的网上商城设计者大多会在首页花费很大的功夫,比如在首页就展示商品什么的,一次来吸引客户的眼球。如此一来,用户也不需要登录就可以查看。

进而如果他对这个商品感兴趣,那他就会点击‘购买’这个按钮,如果客户是第一次来此商城购买商品,那么系统就会自动提醒客户是否注册一个新账号,注册之后才能进行下一步操作。当然了,消费者进行注册之后系统就该为消费者提供一个登录功能,以方便消费者登录进而进行购买商品的操作以及一些相关的操作。该系统在消费者登录成功之后会在页面上显示该消费者的用户名以及跟消费者相关的一些操作功能。这些操作功能包括修改用户的密码,查看自己的个人信息,修改自己的相关的个人信息。

 当然用户登录之后也可以查看商品,最重要的,登录用户可以选择商品放入自己的购物车并下单结账。还可以查看自己所下的订单。

  根据上面的信息分析,我们大致可以分析出来有这么几个实体类来支撑这些操作,首先,注册之后就会产生一个用户,接着要用此用户来支持登录功能,这样一来,所有的用户集合成了一个用户实体类,这个实体类包括用户名,用户密码,联系方式,用户地址等等。接着,在用户注册登录之后,商城就要向用户展示相关的商品,那么,所有的商品又集合成了一个商品实体类,这个实体类包括一些商品的相关信息,不如商品名,商品价格,商品生产日期等。再者,用户如果对某些商品感兴趣了,就要把喜欢的商品放到购物车里,那么又一个购物车实体类产生了,这个实体类包括商品名称,商品价格,把此商品放入购物车的用户名称等等;最后会员买完东西后给商城下了订单,那么这个订单也需要包装成一个实体类,上面需要记录一些信息,最主要的信息应当有:谁下了这个订单?买了什么东西?多少钱?其它的诸如什么时候下的也可以记录。

1.1.2 作为一名商城管理员的使用流程

管理员首先要登录才能操作所有功能,商城管理员应当能管理商城注册的会员:可以查看商城的注册会员,并且对已注册的会员信息进行修改,而且也可以删除相关的会员。

接着,管理员还应该有如下的一些功能。首先,添加父类商品,比如说“书籍”,再者,就是可以添加子类商品,比如说“计算机”,最后,管理员应该也可以添加子类下的相关的一些商品,比如说“30天精通JAVA” 。

当然,管理员应该也可以修改自己的密码。

从管理员的操作,我们也可以得到这么几个实体类。第一,管理员,既然有管理员那么就必须有一个类来记录这些东西,对于该系统需要说明一点的就是:在我开发的这个系统中,由于本人的水平只是有限,为了降低该项目的复杂度,所以本人把管理员和会员都放在同一个实体类中去了,在登录的时候把管理员的名称固定到代码中去了,即:admin,用户类这个实体类中,admin这个用户是不能删除的,是永久保存在此实体类中的,只要以这个名称登录,那么页面就会跳转到管理员的操作页面中去;第二,这里提到了父类别,那么这个也应当包装成一个类,而且这个类应当和子类别有一定的关联。第三,这里也提到了子类别,那么子类别也应该是个实体类,这个类和商品类也有一定得关联;第三,最底层的就是商品这个类了,所有商品集合在一个构成了一个商品实体类,商品类别是属于某个子类别中的一种。

因此,从前面两个站在不同角度来分析使用流程来看,我从中提取出了一些个名词,这些个名词也就成为了一些基础的实体类,目前分析的出来的有,用户类、商品父类别类、商品子类别类、商品类、购物车类、订单类、。

显然,这些个类在此商城项目中是比较具体的,是可以很明显看出的,但是还有一些类是比较“抽象”的,是不能这样直接的通过找名词来得出来,但是可以分析这个过程,可以得出这些类确实要存在,因而来将其推算出来。商城有很多数据是要存到数据库的,在这里,我把一些与数据库打交道的通用操作封装成为一个JDBC的类。另外,对于商城页面中涉及到需要分页的,我写了一个通用的分页实体类,里面包括六个相关的属性。

当然这肯定不是全部,随着分析设计的深入,还会有一些类添加进来,就算进入到实际开发阶段,还有可能突然觉得需要再加入某个类。

1.2 网上商城模块分析

1.2.1 用户模块分析

用户模块是为商城的前台展示所设计的,用户模块又可以大致划分为一下子模块:

1.用户注册模块

2.用户登录模块

3.用户信息修改模块

4.修改用户密码模块

5.商品展示模块

6.购物车模块

7.查看以往订单模块

用户注册模块负责新会员注册,并将其持久化,也就是将新注册的会员的信息写入数据库。登录模块负责验证会员的登录,看看有没有这个用户,密码是否正确等,这种操作通常都是从数据库查询。用户信息修改模块可以让用户修改自己的个人信息,这就涉及到了数据库的修改。修改用户密码模块让用户修改自己的密码。商品展示模块应当是从数据库中将商品拿出来,然后再以某种方式显示的网页上。购物车模块就是收集和记录用户所购买的商品,购物车最后要么被直接销毁,要么会转化为订单,然后被销毁。查看以往订单模块使用户能查看自己所下的订单。因此数据库的操作始终贯穿在整个系统里面,几乎所有的地方都涉及到了数据库的操作。

1.2.2 管理员模块分析

管理员模块是为管理员管理商城事物所设计的,管理员模块又可以初步划分为以下子模块:

1.会员管理模块

2.商品类别管理模块

3.商品管理模块

4.订单处理模块

5.管理员的自我管理

很明显,会员管理模块是用来管理商城的注册会员的,应当可以查看会员、修改会员信息、删除会员,这就是对数据库的增删改查的体现。商品类别管理模块用来管理商品类别,可以查看商品类别,添加商品类别,修改商品类别和删除商品类别。商品管理模块用来管理商城的商品,可以查看商品,添加商品,修改商品和删除商品。订单处理模块用来管理会员所下订单,可以查看会员所下的订单,并处理这些订单。

1.3 本章小结

本章主要从商城的使用者角度,也就是普通用户和商城管理员两方面分别分析了这些用户对商城一般的操作流程。然后根据这些流程分析出了一些直接的类,也就是一些基础的实体类,并跟据这些大致的流程分析出两个大模块,用户模块和管理员模块,两个大模块又可以进一步细分为一个个小模块。并大致分析了这些模块的功能。

第三章 网上商城系统的设计与实现

本章是网上商城系统的具体设计,包括开发环境的选择及介绍,各个功能模块的具体设计以及一部分实现

1.4 开发语言和工具介绍

这里介绍我选择的开发语言,开发工具等。

1.4.1 开发语言介绍

1Java简介:Java是一种简单的,面向对象的,分布式的,解释型的,健壮安全的,结构中立的,可移植的,性能优异、多线程的动态语言。

Java平台由Java虚拟机(Java Virtual Machine)和Java 应用编程接口(Application Programming Interface、简称API)构成[2]Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。 

    2HTML简介:HTMLHypertext Markup Language的缩写,即超文本标记语言。它是用于创建可从一个平台移植到另一平台的超文本文档的一种简单标记语言,经常用来创建Web页面。HTML文件是带有格式标识符和超文本链接的内嵌代码的ASCII 文本文件。HTML是制作网页的基础,

3JavaScript简介:JavaScript是由NetscaptSUN公司合作开发的产品。JavaScript是一种跨平台的开放式脚本描述语言,它是JavaLivescript的衍生物,它生成的应用程序能够将客户和服务器上的对象和资源联系在一起,通过Internet动态的表示信息并与用户进行交互。JavaScript是用来改变网页外观的编辑命令和指令,它对网页设计有着重要的帮助。

4AJAX简介:AJAX“Asynchronous JavaScript and XML”(异步JavaScriptXML)AJAX并非缩写词,而是由Jesse James Gaiiett创造的名词,是指一种创建交互式网页应用的网页开发技术。

5JSP简介:JSPJava Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准[7]该技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器,应用服务器,浏览器和开发工具共同工作。 JSP规范是Web服务器、应用服务器、交易系统、以及开发工具供应商间广泛合作的结果。

1.4.2 数据库介绍

 MySQL 是一个真正的多用户、多线程SQL数据库服务器,它是一个客户机/服务器结构的实现。MySQL是现在流行的关系数据库中其中的一种,相比其它的数据库管理系统(DBMS)来说,MySQL具有小巧、功能齐全、查询迅捷等优点。MySQL 主要目标是快速、健壮和易用。关键的是它是免费的,可以在Internet上免费下载到,并可免费使用。MySQL 对于一般中小型,甚至大型应用都能够胜任。

1.4.3 服务器介绍

TomcatApache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目[10],由ApacheSun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

1.4.4 开发工具介绍

在开发过程中,我主要用到了myeclipse

1.MyEclipse介绍:MyEclipse,是一个十分优秀的用于开发Java, J2EEEclipse插件集合,MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。

1.5 业务逻辑设计

要实现网上商城的业务逻辑,必须有相应的实体类和其相应的方法,这里就大致将其设计出来。

1.5.1 基础共用类和相应方法

整个系统有一些通用的类和方法,比如连接数据库等。

1.5.1.1 DataBase

方法:

1.public static Connection getConn() 取得用于连接数据库的Connection

2.public static void close(Connection conn) 关闭Connection

3.public static void close(Statement stmt) 关闭Statement

4.public static void close(ResultSet rs) 关闭ResultSet

3.2.1.2 PoolDataSource

private static String username;

private static String password;

private static String url ;

private static String className;

private static int maxActive;

private static int minActive;

private static int curActive;

private static Properties prop = new Properties();

private static int curActive

getters()setters()方法,用来得到和设置成员变量的值,因此不详细列出。

3.2.1.3 Page

Page包装了分页信息。

成员变量:

   1、private Integer pageNo;//当前是第几页

   2、private Integer pageSize;//当前总共多少页

   3、private Long totalPage ;//总共多少页

   4、private String url;//页面地址(jsp)

   5、private String method ;//相关方法名

   6、private String index ;//用来作标记的

方法:getters()setters()方法,用来得到和设置成员变量的值,因此不详细列出。

1.5.2 用户实体类以及相关的类和相应方法

为了实现商城会员的注册、登录、查看会员自己的信息、修改会员的个人信息、修改个人密码和查看所下的订单,应当有一个用户实体类和其相应的方法,在这里设计出两个类User类。User包装用户的信息,并提供相应的getset方法;

1.5.2.1 User

成员变量:

1.private int id 用户id

      1、 private Integer userId ;//User的id

      2、 private String username ;//用户名

      3、 private String password ;//用户密码

  4、 private String email ;//用户邮箱

      5、 private String address ;//用户地址

  6、 private String phone ;//用户联系方式

方法getters()setters()方法,用来得到和设置成员变量的值,因此不详细列出。

 

3.2.2.2  IUserDAO接口    

   1、 User findUserByExample(User user) ;//根据一个user找出user

   2、 void save(User user) ;//添加一个user

   3、 List<User> findAllUser() ;//查找出所有的会员

   4、 User findUserById(Integer userId) ;//根据某个id查找对应的user

   5、 void modify(User user) ;//修改相应的user

   6、 void delete(User user) ;//删除选中的user

   7、 User findUserByName(String username) ;//根据用户名称查找user

   8、 List findUserByPage(Page page) ;//根据页数号码列出用户

   9、 void modifyPasswordByUid(Integer uid) ;//根据id修改相应的用户密码

3.2.2.3 UserDAO类

          实现了IUserDAO接口的所有方法,在此不再详细列出。

3.2.2.4  UserService类

    成员变量 IUserDAO userDao = new UserDAO() ;

    相关方法:

    1、public void save(User user){ }

    2、public List<User> findAllUser(){}    

    3、public User findUserById(Integer userId){}

    4、public User login(User user){}

    5、public void modify(User user) {}

    6、public void delete(User user){}

    7、public User findUserByName(String username){}

    8、public List findUserByPage(Page page){}

    9、public void modifyPasswordByUid(Integer uid){}

1.5.3 商品父类别类和相应方法

这是一个基础的类,它是一种树形结构,有根类别,其下又有很多子类别,一个商品子类别类必须属于某种商品类别

1.5.3.1 ParentCategory实体类

成员变量:

   1、private Integer pid ;

   2、private String pname ;

方法:getters()setters()方法,用来得到和设置成员变量的值,因此不详细列出。

3.2.3.2 IParentCategoryDAO接口

       List listAll() ;//列出所有的父类别的实例

       void addParentCategory(ParentCategory pCategory) ;//添加父类别中的实例

3.2.3.3 ParentCategoryDAO

      实现了ParentCategoryDAO接口的所有方法,在此不再详细列出。

3.2.3.4  ParentCategoryService

成员变量:IChildCategoryDAO iccDao = new ChildCategoryDAO() ;

相关方法:

 1、 public void addChildCategory(ChildCategory cCategory) { }

 2、 public List listAll() {}

 3、 public List findChildCategoryByPid(Integer pid){}

1.5.4 商品子类别类和相应方法

1.5.4.1 ChildCategory

  这个类与ParentCategory有关联

    1、 private Integer cid ;//子类别类的id

2、private String cname ;//子类别类的名称

    3、private Integer pid ;//相关联的父类别id

3.2.4.2 IChildCategoryDAO接口

 抽象方法:

  1、List listAll() ;//列出所有的子类别实例

  2、void addChildCategory(ChildCategory cCategory) ;// 添加子类别实例

  3、List findChildCategoryByPid(Integer pid) ;

3.2.4.3 ChildCategoryDAO

    实现了ChildCategoryDAO接口的所有方法,在此不再详细列出。

 

3.2.4.4 ChildCategoryService

成员变量:    

    IChildCategoryDAO iccDao = new ChildCategoryDAO() ;

方法:

    1、public void addChildCategory(ChildCategory cCategory) {}

2、public List listAll() {}

3、public List findChildCategoryByPid(Integer Pid){}

1.5.5 商品类以及相关类和方法

  3.2.5.1 Goods

  1、private Integer gid ;//商品id

  2、private String gname ;//商品名称

  3、private Float price ;//商品价格

  4、private String description ;//商品相关描述

  5、private Integer cid ;//子类别id

  6、private String image ;//商品图片

 3.2.5.2IGoodsDAO接口

 1、void saveGoods(Goods goods) ;//添加商品

     2、List listAllGoods(Page page) ;//列出所有的商品

    3、List findGoodsByCid(Integer cid,Page page) ;//根据商品id找出相对于的商品

    4、void modifyGoodsByGid(Goods goods,Integer gid) ;//根据商品id修改某商品的信息

5、void deleteGoodsByGid(Integer gid) ;//根据商品id删除此商品

 

3.2.5.3  GoodsDAO

         实现了GoodsDAO接口的所有方法,在此不再详细列出。

3.2.5.4  GoodsService

    成员变量IGoodsDAO goodsDao = new GoodsDAO() ;

方法:

    1、public void saveGoods(Goods goods){}

    2、public List listAllGoods(Page page){}

    3、public List findGoodsByCid(Integer cid,Page page{}

    4、public void modifyGoodsByGid(Goods goods,Integer gid){}

5、public void deleteGoodsByGid(Integer gid){}

3.2.6  SvImage

    该类主要用于在添加相关商品时,同时要求附带商品图片,此时就需要运用这个类来处理图片上传方面的功能了。

3.2.6.1  SvImage

Servlet,用来实现为商品上传图片,用到了apachecommons-fileuploadcommons-io组件,这是在JavaWeb开发中最常用的文件上传组件。上传的图片会存放在服务器的目录下。

3.2.7购物车类及其方法

  该类主要用于用户如果对某件商品感兴趣时,就可以按下“放入购物车”这个按钮,同时,这件商品的相关信息就会被放到了相应的购物车中去了。即用来存放用户喜欢而即将购买的商品信息的。

3.2.7.1  Car

      1、private Integer carId ;//购物车id

      2、private String gname ;//放入购物车某商品的名称

      3、private Float price ;//放入购物车某商品的价格

  4、private Integer userId ;//此购物车属于那个user的用户的id

3.2.7.2 ICarDAO接口

     1、void saveCar(Car car) ;//用户决定购买某件商品

     2、void deleteCar();//把某件商品从购物车中移出来

     3、List<Car> listCarsByUid(Integer uid) ;//列出某用户的购物车

 4、void deleteCarByCarId(Integer carId) ;根据carid把某件商品从购物车中移出来

3.2.7.3 CarDAO类      

   实现了CarDAO接口的所有方法,在此不再详细列出。

3.2.7.4   CarService类

      成员变量: ICarDAO carDao = new CarDAO() ;

      方法:

       1、 public void saveCar(Car car){}      

       2、public List listCarByUid(Integer uid){}

       3、 public void deleteCarByCarId(Integer carId){}

 

3.2.8订单类及其方法

3.2.8.1 Orders

   成员变量:

      1、private Integer orderId ;//订单id

      2、private Integer userId ;//下此订单的用户id

      3、private String gname ;//此订单中某商品的名称

      4、private Float price ;//此订单中某商品的价格

     5、private Date orderDate ;//订单日期

     6、private String orderNum ;//订单号

     7、private String username ;//下此订单的用户名称

  8、private String state ;//订单的状态

  此类中的set和get方法在此就不再列出了。

   3.2.8.2  IOrdersDAO 接口

       1、void saveOrder(Orders order) ;//保存订单

       2、List<Orders> listOrdersByUid(Integer userId) ;//列出某用户的订单

       3、List<Orders> listAllOrders() ;//列出所有订单

       4、void handleOrderByOrderId(String state,Integer orderId) ;//处理订单

   5、void deleteOrderByOrderId(Integer orderId) ;//删除某订单

   3.2.8.3 OrdersDAO 类

   实现了IOrderDAO接口的所有方法,在此不再详细列出

   3.2.8.4 OrderSerrvice类

  成员变量 IOrdersDAO orderDao = new OrderDAO() ;

  相关方法:

   1、public void saveOrder(Orders order){}     

   2、public List<Orders> listMyOrderByUid(Integer userId){}     

   3、public List<Orders> listAllOrder(){}

   4、public void handleOrderByOrderId(String state,Integer orderId){ }

   5、public void deleteOrderByOrderId(Integer orderId) {}

     

1.6 数据库设计

3.3.1  user

user表是用来存放商城会员的信息的表,有7个字段,分别用来存放用户id、用户名、密码、联系电话、送货地址、Email和注册日期,它又和User实体类的成员变量对应,详见表4-1

4-1 user

字段名

字段类型

是否为主键

是否可为空

外键

描述

user_d

Int(11)

YES

NO

用户id

username

varchar(40)

YES

用户名

password

varchar(20)

YES

密码

phone

varchar(40)

YES

联系电话

address

varchar(255)

YES

送货地址

email

varchar(50)

YES

电子邮箱

3.3.2  parentcategory

parentcategory表用来存放父类别的信息的,有2个字段,分别用来存放父类别的pid名称的它的主键作为子类别childcategory表的外键。

4-2  parentcategory

字段名

字段类型

是否为主键

是否可为空

外键

描述

 

pid

int

YES

NO

父类别id

pname

varchar(40)

YES

父类别名称

3.3.3  childcategory

cparentcategory表用来存放子类别的信息的,有3个字段,分别用来存放子类别的cid、名称和外键pid,它的主键作为商品goods表的外键。

4-3 category

字段名

字段类型

是否为主键

是否可为空

外键

描述

cid

Int(11)

YES

NO

子类别id

pid

Int(11)

NO

pid

父类别id

cname

varchar(255)

YES

子类别名称

3.3.4  goods

goods表用来保存商品的信息,有6个字段,分别用来保存商品的id、商品的名称、价格、描述、图片名称、外键cid详见表4-4

4-4 goods

字段名

字段类型

是否为主键

是否可为空

外键

描述

gid

Int(11)

YES

NO

商品id

gname

varchar(255)

YES

商品名称

price

Decimal(6,2)

YES

商品价格

image

varchar(255)

YES

图片名称

description

Varchar(100)

YES

描述

cid

double

YES

cid

外键cid

3.3.5  car

car表用来存放用户喜欢并且有意购买的商品信息的,有4个字段,分别表示订单id,用户id,商品名称,商品价格。详情见4-5

4-5  car

字段名

字段类型

是否为主键

是否可为空

外键

描述

car_id

Int(11)

YES

NO

订单id

user_id

Int(11)

YES

user._id

用户id

gname

varchar(255)

YES

商品名称

price

datetime

YES

商品价格

3.3.6  orders

 orders用来存在用户已经购买的商品信息以及相关的一些信息,本表有8个字段,分别表示订单id,用户id,商品名称,商品价格,下单日期,订单号,用户名,订单状态,详情请见4-6

4-6orders

字段名

字段类型

是否为主键

是否可为空

外键

描述

order_id

Int(11)

YES

NO

订单项id

user_id

Int(11)

NO

user_id

用户id

gname

Varchar(20)

YES

商品名称

price

Decimal(6,2)

YES

商品价格

order_date

Datetimr

YES

下单日期

order_num

Varchar(30)

YES

订单号

uename

Varchar(20)

YES

用户名称

state

Varchar(20)

YES

订单状态

3.4 本章小结

本章非常详细的介绍了网上商城系统的具体设计,从开发工具的选择和环境的搭建,到基础的共用类,到具体的实体类再到数据库的设计。这样就完成了项目具体框架的搭建。

第四章 系统的测试和分析

从这里进入到具体的软件编码阶段,我采用了螺旋递增的方式开发,每个版本都只完成一定的功能,然后进行一定的测试,然后继续进行开发,继续完成和完善功能,直到所有的功能全部完成。

4.11 Version 1

在这个版本里,做了一些系统共用类的封装,比如对数据库操作的一些常用的方法,将其封装到了DB类中,封装了取得数据库连接Connection的方法,和关闭ConnectionStatementResultSet的方法。在获得数据库连接Connection的时候需要提供一些信息,第一个是数据连接驱动的名字,第二个是数据库连接字符串,还有用户名和密码,这些信息如果写死在程序里面并不好,如果修改数据库那必须要重新修改程序,因此我将上面那些信息封装到了配置文件中,也就是sys-config.xml文件中,如果配置发生了变化,那只需要在配置文件中改动相应的配置即可。

在网络编程中,中文乱码问题一直是个比较麻烦的事情,解决的方法就是在JSP页面或者Servlet里设置字符集,但是页面非常多的情况下,设置字符集就变得非常麻烦,而且如果发生变动,就需要将这些页面或Servlet的代码全部改一遍,所以这里引入了一个FilterFilter是一个过滤器,属于面向切面编程的东西,它就是在原来的调用流程里无缝的切入了一层,来实现一些功能,下面我画图解释一下Filter的工作原理和调用流程,如图4-1

 

4-1 普通调用流程

在没有加入Filter之前,一个请求到达时,Tomcat会帮忙调用相应的JSP或者Servlet,如果加入了Filter则变成了图4-2所示的样子。

 

4-2 加入Filter之后的调用流程

如果加入了一个Filter,则会变成这个样子,也就是在原先的Tomcat调用Servlet之间又切入了一层,正因为切入了这么一层,所以在这一层就可以做一些事情,在这里我设置了字符集(GBK,之后又通过doFilter()方法继续调用Servlet,这种切入是无缝的,不会影响之前的任何东西。

在用户注册和登录之前,我设置好了这个网上商城的首页,界面截图如下:

                            4-1-1

在这个版本里,我还建立了User实体类封装了会员的信息,IUserDAO接口,UserDAO类以及UserService类,UserService则提供了一系列的管理方法,有了这些类和接口,接着就完成了用户的注册和登录功能,在用户注册的时候采用了AJAX来验证用户名是否已经被注册过了,如果已经被注册过了页面就是提示该用户名已经被注册过,如果没有则提示该用户名可以用,在注册页面还使用了JavaScript来验证用户的输入,比如密码长度不能小于6位,两次密码输入的是否一致,如果输入了电话,另外还使用了正则表达式来验证邮箱格式是否符合规定的格式最后还设置了验证码这个功能,防止一些非法分子进行批量注册。正对这个功能,我特地写了一个ImageCode类。

下面是当用户第一次来此网站,在点击注册按钮之后,出现的页面,界面截图如下

4-1-2

当用户填写的所有信息都符合相关的规定,那么注册之后页面就会转到登录界面提醒用户是否要进行登录,在首页右边有一个供用户登录的区域,在这里可以输入用户名和密码登录,截图如下:

    

4-1-3

在登录过程中,如果用户名为空或者密码为空,页面会有相关的提示信息即使用户输入了用户名和密码,如果用户名或者密码不对,页面也会有相关的提示信息提示用户。然后,如果用户名和密码都输入正确,那么在登录之后页面会跳转到下一个页面,并且会将这个用户记录到Session,此页面的功能我把它放在了下个版本中测试。这里不再详述。

到这里,V1.0版本就完成了,经过测试也都没有问题。

4.12 Version 2

 该版本完成得是用户信息的修改,用户的密码修改以及用户注销功能。当点击当前用户名的时候,页面中间会出现如下类容,截图如下:

4-1-4

 

当用户输入新的信息并点击提交之后,就会把新的信息保存到数据库中。当用户再做显示操作的时候,显示的便是修改以后的信息。

当用户点击页面右上方的修改密码按钮时,便会出现修改密码的页面,页面中有三个输入框,第一个是要求输入原密码,第二个框要求输入新密码,第三个输入框要求输入与第二个输入框输入的内容一致,如果不一致,页面便会出现提示信息提示两次密码输入不一致。截图如下:

                         4-1-5

当用户想退出本商城时,可以点击页面右上方的注销按钮,用户按下注销按钮时,页面会弹出一个小窗口,提示用户是否真的要退出。如果点击确定,页面也转到初始状态,如果点击取消,页面不变。截图如下:

           4-1-6

Version2的功能到这里已结束,经过细心的测试,这些功能能正常发挥作用。

4.13 Version 3

  接着我们来看看管理员方面。在前面我已经说明了,由于本人水平有限,所有就没有把用户表和管理员表分开了,而是把管理员的数据也写进了user表,在数据库里面把admin这个用户名定为管理员用户名,只要以此用户名登录的便是管理员身份。在登录界面方面,管理员也是贺普通用户共用一个登录界面。界面截图在上面已列出来,在这里不再赘述。

管理员输入正确用户名和密码之后页面转到主页面,否则提示出错。主页面的模块主要分为两个模块,菜单栏,内容显示栏。菜单栏由于利用了一些小技术,当鼠标第一次放到“系统菜单”这几个字上面的时候,菜单栏便会显示五个功能模块。图略。

各模块功能介绍如下:

 商城会员管理:

      当管理员点击商城会员管理的时候,菜单栏会出现两个子模块:商城所有会员,搜索会员。当点击商城所有会员的时候,内容显示栏便会列出所有存入数据库里面的用户的相关信息,如图4-1-8。在这里,为了让对列出来的会员信息进行分页展示,我写了一个Page类,里面封装了哪些属性和方法我在上面的描述中已说明,这里不再列出。当点击搜索会员的时候,如果管理员想知道数据库中是否有某会员信息的时候,只需要在会员名称输入框中输入你想查找的会员用户名,然后点击查找,便可知道数据库中是否有这个会员。如图4-1-9

截图如下:

                          4-1-8

                        4-1-9

在此版本中,我只完成并测试了菜单栏中的一个会员管理模块,并且相关的功能能够正常地运行,到这里,这个版本就结束了。\

4.14 Version 4

        该版本包括商品类别管理这个模块,主要完成得是商品父类别的添加和商品子类的添加,并且添加的子类别必须从属于父类别中的某个类别。

          商品类别管理:

          当管理员点击商城会员管理的时候,菜单栏会出来两个子模块,分别为:添加父类别,添加子类别。截图如4-1-9,当点击添加父类别的时候,右边的内容显示栏页面中会出现添加父类别的输入框。截图4-2-1,当点击添加子类别的时候,右边的内容显示栏中会出现一个选择框和添加子类别的输入框,此子类别必须属于选择框中的某一父类别。截图如4-2-2

   4-2-1

4-2-1 2     

4-2-3

        在此版本中,我完成了商品类别管理这个模块也测试了相关的功能,并且相关的功能也能正常运行。到这里,此版本就结束了。

4.15 Version 5

  该版本包括了商品管理这个模块,主要完成商城商品的添加和某类别商品信息的显示。

   商品管理:

     该模块主要功能是添加商品和展示某一类别的商品信息。此模块包括两个子模块,分别为添加商品,商品信息。如图4-2-3.。当点击添加商品的时候,右边的内容显示栏中会出现一个添加页面。此页面中包括父类别,子类别,即将要添加的商品名称,商品价格,商品图片。

                                     

                                         4-2-4                                                                                   

当输入商品名称,加入商品图片,并且输入商品价格之后,点击添加按钮,那么一件商品便被成功的放到了数据库中去了。最后,相关功能经过测试之后,也能正常运行。此版本到这里就结束了。

4.16 Version 6

    该版本包括了订单管理模块,主要完成了处理订单和删除相关订单的功能。

  订单管理:

 

    该模块只要是管理会员下的一些订单,这些订单中包括了会员已经购买的一些商品信息及与订单相关的一些信息。这个模块下面还有一个子模块为订单显示。当点击订单显示的时候,右方的内容显示栏中便会列出所有会员下的订单信息。截图如 4-2-6

      

4-2-6

在订单的状态属性中,其状态值有两个:未处理和已处理。当某个条商品订单信息被加入数据库时,我设置了状态默认值为:未处理。当管理员点击处理订单按钮时,状态属性的值会由未处理变成已处理。当点击删除按钮时,页面会弹出一个提示框提示你是否真的要删除此订单条。

在此版本中,我完成了订单管理这个模块也测试了相关的功能,并且相关的功能也能正常运行。到这里,此版本就结束了。

4.17 Version 7

   该版本包括了一个系统管理模块,此模块下还有一个备份数据子模块,主要完成的数据库备份功能,以保证该商城的数据库中的数据安全。

    系统管理

           该模块主要是完成系统数据库的安全问题,此模块下面有一个子模块为:备份数据。当管理员点击备份数据按钮时,右方的内容显示栏里便会出现一个页面,此页面有一个备份按钮,另外还有一个备份状态值,用来标志数据库备份是否成功。当点击开始备份这个按钮时,如果备份成功的话,生成的文件会保存在指定的文件夹中。相关的截图如下(4-2-8):

       

                  4-2-9

最后,经过测试,此版本所完成得功能能正常运行,因此,此版本的功能就完成了。

4.18 Version 8 

      截止到上一版本,与管理员相关的功能基本上已完成,现在我们又要返回到与普通会员相关的操作功能中去。

       在这个版本中,首先需要补充一下Version1中少了的功能。在用户尚未登录之前,用户是不能购买商品,也不能把商品放入到心愿单中去的,如果用户尚未登录就点击 购买按钮,那么页面会弹出一个提示框,提醒用户尚未登录。截图如 4-3-1

                          4-3-1

然后接着完成用户登录之后所需要完成得相关功能。

当用户登录之后,,用户会进入到用户主界面,主界面包括两个子页面,一个是用户菜单栏,一个是内容显示栏。初登录时,菜单栏中会列出所有的商品父类别名称。也会有一个选择框列出所有的子类别名称。而内容显示框中会列出所有的商品,包括商品名称,商品价格,商品描述等。这里面也用到了我自己写的分页技术,关于分页因为前面已经详述过,这里不再赘述。相关截图如下:4-3-2

在此版本中,我完成了菜单栏中父类别和子类别显示,以及显示所有商品信息的功能,也测试了这些功能,最后相关的功能也能正常运行。到这里,此版本就结束了。

                                 4-3-2

4.19 Version 9

在完成管理员方面的相关操作功能后,我又把精力放到了普通会员这方面来了,现在让我们来看看普通会员这方面。该版本包括了一个菜单来模块,菜单栏下是个商品父类别的名称,当我们点击某商品父类别的时候,便会显示所有的子类别名称。接着继续点击子类别名称,那么所有属于此子类别的商品便会在右边的内容显示栏中显示出来,这里也用到了分页技术。截图如 4-3-2.,还有就是,当某子类别下面没有任何商品时,那么右边的内容显示页面就是出现提示用户没有此类商品的信息,截图如 4-3-3

  

               4-3-3

  另外,商品显示也用到了AJAX技术,由客服端发出请求,请求到达服务器端,然后再由javascripy脚本中的回调函数接收由服务器端返回的数据。从而实现菜单栏页面无刷新的效果,给用户的体验非常好。

  当商品列出来后,用户选择一些自己喜爱的商品进行仔细的查看。如果有意愿购买的话,那么用户就可以点击购买按钮,那么此商品的相关信息就被放进了该用户的购物车中。之后,如果用户点击购车车的话,那么所有被放入购物车的商品会被列出来。截图如 4-3-4

   

                      4-3-4

    当购物车页面出来之后,页面包括两个按钮:移出购物车、确定购买。有些用户因为某些缘故,不想购买某些已经拍下的商品,那么可以点击“移除购物车”按钮,把已拍下的商品移出购物车即可。另外,用户对拍下的商品没有悔意的话,那么就得按下“确定购买”按钮对所购买的商品结账。按下“确定购买”按钮之后,系统就会生成一条订单,该订单包括订单号,下单时间以及某件商品的相关信息,比如商品名称,商品价格等等。结账之后再由发货商根据订单发货。当用户想查看自己买了哪些商品,便可以点击个人中心进行查看。另外,订单中的订单条可以帮助用户在任何时刻知道自己所购买的商品的发货情况。订单截图如 4-3-5

   

                              4-4-5

在此版本中我完成了菜单栏中商品父类别和商品子类别名称的显示,另外还完成了从属于子类别的所有商品的显示以及用户购买商品的所需要的相关功能模块,如购车车等等,在本人经过精心的测试之后,发现相关功能可以按要求正常运行,因此,此版本到这里就结束了。

4.110 Version 10

版本是以前九个版本为基础的,是整个项目的最后一步,也是最关键的一步,这个项目能不能正常运行就要看这一版本能不能成功测试通过。

此版本的主要任务是验证项目的整个操作流程是否正常,如果有异常的话,及时发现并且改正,达到整个项目能够成功运行的效果。

首先,我从用户注册功能开始验证,接着是用户登录,然后是管理员登录,管理员查看用户信息..............,就这样,我一步一步的仔细的验证了每个功能,发现所有功能都能成功运行。在这期间,我发现了个小问题,就是有时在启动服务器的时候,服务器偶热会出点小异常,当然,这个异常我们是无法处理的,唯一的办法就是服务器重启,同时,在这个异常发生时,我也会友好地提醒用户是服务器出了问题,截图如 4-4-6

在验证整个项目的过程中,除了服务器方面的问题,我没有发现任何异常,并且成功通过了测试。

 

4-4-6

最后这个版本也完成了,这样一个比较完整的网上商城系统就都做完了,这个系统虽然不算大,也不能说小,做的时候碰到的问题还是很多的,收获也颇丰啊。

4.2 本章小结

这章主要就是对各个版本完成时进行一个一些功能性的测试,看看其是否达到了设计要求,还有什么问题没有解决,还有哪些可以改进的问题,因为采用的是螺旋递增式的开发,这样在每个小版本开发完成之后立即就进行测试,有利于提早发现问题,并将其解决,对后期开发的影响也会降到最低,而且在测试的过程之中可能就会发现更好的解决方法或者使用上的更加人性化。

整个系统完成之后,我又对整个系统进行了整体的测试,看看各个模块之间是否还有问题,在测试的过程之中还发现一些能让网站更加人性化的方法,于是又增加、修改了一部分功能,比如服务器出问题时加入的小猫图片。最后,整个系统的测试结果达到了设计要求。

                   

 

 

 

 

 

 

 

 

  

本文较完整地讨论了一个网上商城系统的分析、设计与实现,使用了Java Web开发的一些常用的方法和技巧,比如前端的HTMLCSSJavaScript服务器端的JSPServletFilter等,以及MySQL数据库,并运用了一些开源的第三方组件,通过对这些技术的综合应用,最终实现了一个网上商城系统的主要功能。本文的主要工作如下:

1.研究了如何来分析一个网上商城系统的构成和一般流程。

2.建立了一种站在使用者角度的分析方法,来对一个网上商城进行分析。

3.利用螺旋递增开发模式,实现了一种比较直观易懂的开发途径。

4.基于Filter在面向切面编程方面的广泛应用,实现了用Filter来处理一些通用流程的方式。

综上所述本文对如何对一个系统进行分析和设计的问题提出了一些针对性的方法,今后的工作还应该在如何更好的使用面向对象的分析和设计方法来更好的解决软件编程中的问题上不断的努力。

               

 

 

 

 

 

 

 

 

 

 

在论文完成之际,回顾紧张但又充实的学习和开发过程,本人在此向所有关心我的及帮助我的老师和同学们致以最真诚的感谢。

我首先要向指导教师ㄨㄨ老师表示最真挚的谢意。感谢导师在繁忙的学习与教学之余,对我的设计及论文进行的悉心指点和耐心辅导。在撰写论文阶段,ㄨㄨ老师几次审阅我们的论文,提出了许多宝贵意见,没有他的指导,我们就不能较好的完成课题设计的任务。ㄨㄨ老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我受益匪浅。无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高,这对于我以后的工作和学习都是一种巨大的帮助,感谢他耐心的辅导。

其次,我还要特别感谢各位同学给予了我无私的帮助,正是在他们的鼓励和帮助之下,我得以顺利完成论文。

在此期间,我不仅学到了许多新的知识和解决问题的方法,而且也开阔了视野,提高了解决问题的能力。此,我对导师在毕业设计期间给予的指导和帮助表示衷心的感谢。同时也感谢其他老师在此期间的关怀和帮助,以及学院为我提供良好的毕业设计环境。最后感谢在毕业设计中为我提供帮助的众多益友和同学,以及在设计中被我引用或参考的论著的作者。

由于本人学识有限,加之时间仓促,文中不免有错误和待改进之处,真诚欢迎各位师长、同学提出宝贵意见。

再次感谢在本次毕业设计中帮助过我的各界人士!

                

 

 

 

 

 

参考文献

[1] []Rogers Cadenhead. Java编程入门经典.梅兴文译.4.北京:人民邮电出版社,2007

[2] []Bruce Eckel. Thinking In Java.英文第4.北京:机械工业出版社,2007

[3] 陈轶.姚晓昆编著.Java程序设计实验指导.北京:清华大学出版社,2006

[4] 杨昭编著.二级Java语言程序设计教程.北京:中国水利水电出版社,2006

[5] 赵文靖编著.Java程序设计基础与上机指导.北京:清华大学出版社,2006

[6] 柳西玲.许斌编著.Java语言应用开发基础.北京:清华大学出版社,2006

[7] 施霞萍等编著.Java程序设计教程 第2.北京:机械工业出版社,2006

[8] []Herbert Schidt.Java参考大全.鄢爱兰.鹿江春译.北京:清华大学出版社,2006

[9] 宛延闿等编著.实用Java程序设计教程.北京:机械工业出版社,2006

[10] 陈国君等编著.Java2程序设计基础.北京:清华大学出版社,2006

[11] 郑莉.王行言.马素霞编著.Java语言程序设计.北京:清华大学出版社,2006

[12] 丁振凡主编.Java语言实用教程.北京:北京邮电大学出版社,2005

[13] 朱喜福等编.Java程序设计.北京:人民邮电出版社,2005

                                 

 

                             what is Java ?

Java是由Sun微系统公司所发展出来的程序语言,它本身是一种对象导向(Object-Oriented)的程序语言。JAVA目前在手机上应用最多的就是JAVA游戏。
    Java也号称是能跨平台使用的语言,这主要是因为Java本身被编译之后,并不是直接产生可执行的码,而是产生一种中间码叫作 ByteCode,这种码必需在透过 Java 的直译器来解读它,才能够真正的被执行,所以只要平台上装有这种Java的直译器,就能解读ByteCode也就能执行Java编译过的程序,故与Java程序是在那种平台上被编译的,就完全没有干系了。Java写出来的程序可分为两类,分别是Java Applet与一般的Application,而Application 这一类就与一般的程序如C++的作用是比较类似的,是一个独立可执行的应用程序,像HotJava是一个浏览器,且就是使用Java程序所发展出来的。最常见的Java程序包括应用程序和applets。应用程序是单独的程序,诸如HotJava浏览器软件就是用Java语言编写的。 Applets类似于应用程序,但是它们不能单独运行, Applets可以在支持Java的浏览器中运行。Applet主要是内置于HTML网页中,在浏览时发挥作用。
    Java的目标是为了满足在一个充满各式各样不同种机器,不同操作系统平台的网络环境中开发软件。利用Java程序语言,可以在网页中加入各式各样的动态效果。可以放上一段动画,加入声音,也可以建立交互式网页等。

猜你喜欢

转载自www.cnblogs.com/epoch211/p/12629501.html