随着科技的高速发展与人民素质的提高,网上购物正逐步走向平民化。据调查机构AC尼尔森最新研究显示,63%的中国网民曾在网上购物。有业内人士认为,中国的网上购物人数在快速增长,年轻的中国男性更热衷于网上购物。民众对电子商务的热情高涨,表明我国民众电子商务意识在提高。
我国网上购物市场巨大,有资料表明:2012年,中国有超过2.5亿人在网站系统上购买商品,占中国人口总数的19%,这个比例和发达国家个人电子商务用户所占的比例已经十分接近。2012年我国的电子商务交易额达到1.3万亿元,比2011年上升60%。
人们的消费观念正因电子商务而改变年轻人是我国网上购物的主体。CNNIC统计显示,中国网民主要是一群未婚的并受过良好教育的年轻人。其中,超过半数的中国网民不到25岁,1/3的网民是学生。AC尼尔森中国区董事长高恩认为,未来5至10年,这一人群将成为社会消费的主体力量,其消费模式将对社会消费习惯产生深刻影响。
随着电子商务的普及,网上购物以其便捷、省时、省钱和安全等特点为人们所青睐。有数据表明,53.1%的网民表示对网上购物感兴趣。淘宝网总经理孙彤宇曾表示,网上购物最吸引人的地方就是新东西多、东西特别、价格低。
电子商务正改变着人们的消费方式,表现在:第一,网站上的商品种类繁多,通过网络,人们在短时间内就能找到自己满意的东西。第二,人们的消费行为将变得更加理智,开放的价格便于消费者比较。第三,多样化、个性化的消费需求将使定制化生产将变得越来越普遍。
设计和完成一个电子商务网站的,将会牵涉到许多技术上的问题,如:动态网页制作技术的,后台数据库的设计和管理,通过实际的制作个网站,可以避免纸上谈兵,在实践中掌握上述技术的使用。
本论文内容主要包括了中文摘要,英文摘要,目录,前言,开发环境简介,总体设计,数据库设计,详细设计等,最后进行总结致谢。详细设计是本论文的重点部分,在整篇论文中着重详细介绍。
本章主要是对以MyEclipse为核心的J2EE开发环境进行的介绍,并对该课题开发过程中需要的J2EE技术进行详细的介绍。本系统的开发平台为:
操作系统:Microsoft Windows XP
程序语言:Java
开发工具:MyEclipse 8.5
数 据 库:MySQL 5.1
服 务 器:Tomcat 6.0
关于本系统的开发环境安装配置过程比较简单,在此不再赘述。
MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是Eclipse IDE的扩展,利用它我们可以在数据库和J2EE上开发、发布,以及在应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的J2EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL,Spring,Hibernate。
EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2平台的标准版,J2EE不仅巩固了标准版中的许多优点,例如"编写一次、随处运行"的特性、方便存取数据库的JDBC、API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时又提供了对 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是能够成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。
EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供统一的开发平台,J2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持,完全支持Enterprise JavaBeans,有良好的向导支持打包和部署应用,添加目录支持,增强了安全机制,提高了性能。[3]
Struts 使用 Model 2 架构。Struts 的ActionServlet 控制导航流。其他Struts 类,比如Action, 用来访问业务逻辑类。当 ActionServlet 从容器接收到一个请求,它使用URI (或者路径“path”) 来决定那个Action 将用来处理请求。一个 Action可以校验输入,并且访问业务层以从数据库或其他数据服务中检索信息。为校验输入或者使用输入来更新数据库, Action 需要知道什么值被提交上来。并不是强制每个Action 从请求中抓取这些值,而是由 ActionServlet 将输入绑定到JavaBean中。输入 bean是Struts ActionForm c类的子类。ActionServlet 通过查找请求的路径可以决定使用哪个ActionForm,Action 也是通过同样的方法选取的。ActionForm 扩展org.apache.struts.action.ActionForm类。每个都必须以HTTP 响应进行应答。 通常, StrutsAction 并不自行加工响应信息,而是将请求转发到其他资源,比如JSP 页面。Struts 提供一个ActionForward 类,用来将一个页面的路径存储为逻辑名称。当完成业务逻辑后,Action 选择并向Servlet返回一个ActionForward。Servlet 然后使用存储在ActionForward 对象中的路径来调用页面完成响应Struts 将这些细节都绑定在一个ActionMapping 对象中。每个ActionMapping 相对于一个特定的路径。当某个路径被请求时,Servlet 就查询ActionMapping 对象。ActionMapping对象告诉servlet,哪个Actions, ActionForms, 和 ActionForwards 将被使用。所有这些细节,关于Action, ActionForm, ActionForward, ActionMapping,以及其他一些东西,都在struts-config.xml 文件中定义。 ActionServlet 在启动时读取这个配置文件,并创建一个配置对象数据库。在运行时,Struts 应用根据文件创建的配置对象,而不是文件本身。[5]
Spring作为实现J2EE的一个全方位应用程序框架,为我们开发企业级应用提供了一个健壮、高效的解决方案。它有以下几个特点:
容器:Spring提供容器功能,容器可以管理对象的生命周期,对象与对象之间的依赖关系。你可以写一个配置文件(通常是xml文件),在上面定义对象的名字,是否是单例,以及设置与其他对象的依赖关系。那么在容器启动之后,这些对象就被实例化好了,你直接去用就好了,而且依赖关系也建立好了。
IOC:控制反转,谓之“依赖关系的转移”,如果以前都是依赖于实现,那么现在反转为依赖于抽象吧,其实它的核心思想就是要面向接口编程。
依赖注入:建立对象与对象之间依赖关系的实现,包括接口注入、构造注入、set注入,在Spring中只支持后两种。[7]
Hibernate是一种Java语言下的对象关系映射解决方案。 它是一种自由、开源的软件。它用来把对象模型表示的对象映射到基于SQL 的关系模型结构中去,为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。
Hibernate 不仅管理Java 类到数据库表的映射(包括从Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL 和JDBC 处理数据的时间。
它的设计目标是将软件开发人员从大量相同的数据持久层相关编程工作中解放出来。无论是从设计草案还是从一个遗留数据库开始,开发人员都可以采用Hibernate。[8][11]
JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准,其网址为http://www.javasoft.com/
products/jsp。该技术为创建显示动态生成内容的Web页面提供了一个简捷而快速的方法。JSP技术的设计目的是使得构造基于Web的应用程序更加容易和快捷,而这些应用程序能够与各种Web服务器,应用服务器,浏览器和开发工具共同工作。 JSP规范是Web服务器、应用服务器、交易系统、以及开发工具供应商间广泛合作的结果。在传统的网页HTML文件(htm,.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。程序片段可以操作数据库、重新定向网页以及发送 email 等等,这就是建立动态网站所需要的功能。所有程序操作都在服务器端执行,网络上传送给客户端的仅是得到的结果,对客户浏览器的要求最低,可以实现无Plugin,无ActiveX,无Java Applet,甚至无Frame。
由于JSP页面的内置脚本语言是基于Java编程语言的,而且所有的JSP页面都被编译成为Java Servlet,JSP页面就具有Java技术的所有好处,包括健壮的存储管理和安全性。作为Java平台的一部分,JSP拥有Java编程语言“一次编写,各处运行”的特点。随着越来越多的供应商将JSP支持添加到他们的产品中,您可以使用自己所选择的服务器和工具,更改工具或服务器并不影响当前的应用。当与Java 2平台,企业版(J2EE)和Enterprise JavaBean技术整合时,JSP页面将提供企业级的扩展性和性能,这对于在虚拟企业中部署基于Web的应用是必需的。
ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端 ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。ExtJs最开始基于YUI技术,由开发人员 JackSlocum开发,通过参考JavaSwing等机制来组织可视化组件,无论从UI界面上CSS样式的应用,到数据解析上的异常处理,都可算是一款不可多得的JavaScript客户端技术的精品。
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成 本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
本系统平台是采用现在比较广泛的SSH+JSP+MySQL数据库的架构实现的,采用MVC模式,此系统分为前台管理和后台管理。
前台管理是顾客的操作界面,供用户浏览、查询使用。包括:用户登录、注册、浏览商品、订购商品、购物车、订单生成、订单修改、用户资料修改、密码修改、在线支付等功能。
后台管理是提供给管理员的,其中包括:商品类别管理、商品管理、用户管理、新闻管理、操作权限管理以及订单、订单项的相应管理等。使管理员从繁琐的手工操作中解脱出来,并提高了办公效率。
该部分根据需求分为操作权限认证,用户管理,商品类别管理,商品管理,订单项管理,订单管理,新闻管理,操作权限管理,个人信息管理九个模块。
1.操作权限认证
管理员在后台登陆时先进行权限认证,动态生成操作列表,进行相应操作。顾客的用户等级为0,管理员的用户等级为1。
2.用户管理
用户包括顾客和管理员两类。顾客可通过前台注册,但是管理员只可由执行用户管理的管理员进行添加。管理员可修改用户权限等级和删除用户,不可修改用户其他信息。在查询过程中,可以通过用户的任何信息进行查询。
3.商品类别管理
该模块是对商品类别的管理,可以对商品类别进行添加,删除,修改,查询。在添加子类别过程中,需要选择父类别进行添加。在查询过程中,可以通过商品类别的任何信息进行查询。
4.商品管理
该模块是对商品的管理,可以对商品进行添加,删除,修改,查询。在添加过程中,需要选择商品的分类进行添加。在查询过程中,可以通过商品的任何信息进行查询。
5.订单项管理
该模块是对订单项的管理,管理员只可以对订单项进行查询操作。在查询过程中,可以通过订单项的任何信息进行查询。
6.订单管理
该模块是对订单的管理,对于货到付款的订单,在用户进行确认后可进行发货处理,对于在线支付的订单,在用户进行付款后可进行发货处理。在查询过程中,可以通过订单的任何信息进行查询。
7.新闻管理
该模块是对新闻的管理,可以对商品进行添加,删除,修改,查询。在查询过程中,可以通过新闻的任何信息进行查询。
8.操作权限管理
该模块是对操作权限的管理,可以对操作权限进行添加,删除,修改,查询。在查询过程中,可以通过操作权限的任何信息进行查询。
9.个人信息管理
该模块是对个人信息的管理,可以对个人信息进行修改。
该部分根据需求分为用户注册,用户登录,浏览商品,修改密码,购物车管理,订单管理,网上支付七个模块。
1.用户注册
用户名不可重名,注册时可动态校对,密码需有6-16位的字母或数字组成,验证密码应该与先前输入密码一致,真实姓名应由2-7位中文字符组成,手机号码应由11位数字组成,地址不可为空。
2.用户登录
核对用户名和密码,进行登录。
3.浏览商品
进入该商城主页面,可以随意的浏览商品,以及查看商品的相关信息。如果是登陆用户,在浏览的时候可以购买商品,如果未登录则不能,必须先进行注册登陆。
4.修改密码
修改密码时会动态验证原密码。
5.购物车管理
用户可以将选购的商品添加到购物车中,以便结算之前进行选择。用户可以删除购物车中的商品,更改商品的数量,清空购物车。
6.订单管理
该功能是用户选购完商品并确定数量后,然后进入生成订单页面,须要填写收货人的姓名,手机,送货的地址信息,选择送货方式等信息。选择货到付款的话,则在生成订单后需进行确认,若是选择网上银行,则在核对过订单后,进行在线支付,钱会先转入中间商账号,在顾客收到货物后再确认,钱才会转入商城账号。
7.网上支付
在订单管理页面,对于选择网上银行为付款方式且尚未付款的订单进行在线支付。
图2-1简洁表明了的展示了食品销售网站的设计思路。前台和后台等模块。
图2-1 系统功能模块图
数据库设计主要是进行数据库的逻辑设计,即将数据按一定的分类、分组系统和逻辑层次组织起来,是面向用户的。数据库设计时需要综合各个模块的所需数据需求,分析各个数据之间的关系,按照DBMS提供的功能和描述工具,设计出规模适当、正确反映数据关系、数据冗余少、存取效率高、能满足多种查询要求的数据模型。
在数据库需求分析过程中,管理员、用户、商品、订单等数据库实体。
在本系统中用户包括顾客和管理员两类,只有等级为1的管理员才可进行用户管理。顾客可通过前台注册,但是管理员只可由执行用户管理的管理员进行添加。管理员可修改用户权限等级和删除用户,不可修改用户其他信息。在查询过程中,可以通过用户的任何信息进行查询。
在商品管理的表中,对商品类别的管理,可以对商品类别进行添加、删除、修改和查询。在添加子类别过程中,需要选择父类别进行添加。在查询过程中,可以通过商品类别的任何信息进行查询。在对商品的管理,可以对商品进行添加、删除、修改和查询。在添加过程中,需要选择商品的分类进行添加。在查询过程中,可以通过商品的任何信息进行查询。
在对订单项管理的管理,管理员只可以对订单项进行查询操作。在查询过程中,可以通过订单项的任何信息进行查询。对于货到付款的订单,在用户进行确认后可进行发货处理,对于在线支付的订单,在用户进行付款后可进行发货处理。在查询过程中,可以通过订单的任何信息进行查询。
建立各表间的关系,除有利于进行连接查询外,还可以大大简化数据库的操作,从而提高工作效率。同时,由于各表间的相互关系的存在,使各表间实施了完整性的原则,可以避免一些误操作。通过建立各表间的关系,就可以有效地管理各表的记录。
图3-1 用户与管理员之间E-R图
图3-2 管理员信息实体E-R图
商品小类实体如图3-3所示:
图3-3 商品小类E-R图
图3-4 商品大类E-R图
根据系统的结构给出部分关系模式:
用户信息表(用户编号,用户名,密码,真实姓名,电话,地址,用户等级);
商品类别表(商品类别编号,父类别编号,类别名称,描述,类别节点号,类别等级);
商品信息表(商品编号,商品名称,商品图片,制造商,产地,价格,状态,上架日期,简介,类别编号);
订单项信息表(订单项编号,商品编号,商品名称,数量,总价,订单编号);
订单信息表(订单编号,用户编号,总价,收货人姓名,收货人地址,收货人手机,付款方式,订单状态,处理日期,下单日期,确认信息);
新闻信息表(新闻编号,标题,内容,发布日期);
操作权限表(操作权限编号,操作名称,操作路径,对应等级);
银行帐号表(编号,帐号,密码,存款);
具体数据库表如下:
用户信息表,其表结构如表3-1所示:
表3-1 user(用户信息表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
用户编号 | id | Integer | TRUE |
用户名 | username | varchar(100) | FALSE |
密码 | password | varchar(100) | FALSE |
真实姓名 | realname | varchar(100) | FALSE |
电话 | phone | varchar(100) | FALSE |
地址 | addr | varchar(100) | FALSE |
用户等级 | userlevel | Integer | FALSE |
商品类别信息表,其表结构如表3-2所示:
表3-2 category(商品类别信息表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
商品类别编号 | id | Integer | TRUE |
父类别编号 | parentid | Integer | FALSE |
类别名称 | name | varchar(100) | FALSE |
描述 | descr | varchar(100) | FALSE |
类别节点号 | cno | Integer | FALSE |
类别等级 | grade | Integer | FALSE |
商品信息表,其表结构如表3-3所示:
表3-3 product(商品信息表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
商品编号 | id | Integer | TRUE |
商品名称 | name | varchar(100) | FALSE |
商品图片 | picture | varchar(200) | FALSE |
制造商 | producer | varchar(100) | FALSE |
产地 | districts | varchar(100) | FALSE |
价格 | price | double | FALSE |
状态 | state | varchar(100) | FALSE |
上架日期 | pubtime | varchar(100) | FALSE |
简介 | descp | varchar(100) | FALSE |
类别编号 | categoryid | Integer | FALSE |
订单项信息表,其表结构如表3-4所示:
表3-4 salesitem(订单项信息表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
订单项编号 | id | Integer | TRUE |
商品编号 | productid | Integer | FALSE |
商品名称 | productname | varchar(100) | FALSE |
数量 | pcount | Integer | FALSE |
总价 | unitprice | double | FALSE |
订单编号 | orderid | Integer | FALSE |
订单信息表,其表结构如表3-5所示:
表3-5 salesorder(订单信息表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
订单编号 | id | Integer | TRUE |
用户编号 | userid | Integer | FALSE |
总价 | money | double | FALSE |
收货人姓名 | sendname | varchar(100) | FALSE |
收货人地址 | sendaddr | varchar(100) | FALSE |
收货人手机 | sendphone | varchar(100) | FALSE |
付款方式 | paymethod | varchar(100) | FALSE |
订单状态 | state | varchar(100) | FALSE |
处理日期 | odate | varchar(100) | FALSE |
下单日期 | pdate | date | FALSE |
确认信息 | sure | varchar(100) | FALSE |
新闻信息表,其表结构如表3-6所示:
表3-6 message(新闻信息表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
新闻编号 | id | Integer | TRUE |
标题 | title | varchar(100) | FALSE |
内容 | content | varchar(100) | FALSE |
发布日期 | pubtime | varchar(100) | FALSE |
操作权限表,其表结构如表3-7所示:
表3-7 operation(操作权限表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
操作权限编号 | id | Integer | TRUE |
操作名称 | name | varchar(100) | FALSE |
操作路径 | url | varchar(100) | FALSE |
对应等级 | level | Integer | FALSE |
银行帐号表,其表结构如表3-8所示:
表3-8 bank(银行帐号表)
字段名 | 字段代码 | 数据类型 | 是否主键 |
---|---|---|---|
编号 | id | Integer | TRUE |
帐号 | cardid | varchar(100) | FALSE |
密码 | password | varchar(100) | FALSE |
存款 | money | double | FALSE |
在数据库关系中的数据表之间创建关系以显示某个表中的列如何链接到另一表中的列,关系图能够一目了然的向读者展示数据库的关系,并且优化了查询功能。系统的数据表之间的关系图如图3-5所示。
图3-5 数据表之间的关系图
本次设计的食品销售网站由前台操作软件和后台数据库两部分构成。前台软件作为系统与用户直接交互的界面,在实现完善的功能的同时,也考虑到了用户操作的简单性和方便性。
本次设计的食品销售网站分为两部分,前台软件和后台数据库。因此首先需要在MySQL中创建系统所用的数据库。前台软件要操作后台数据库,需要先连接数据库。MyEclipse提供了JDBC接口连接数据库。
JDBC(Java Data Base Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC为数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。
巧妙在于JDBC设有两种接口,一个是面向应用程序层,其作用是使得开发人员通过SQL调用数据库和处理结果,而不需要考虑数据库的提供商;另一个是驱动程序层,处理与具体驱动程序的交互,JDBC驱动程序可以利用JDBC API创建Java程序和数据源之间的桥梁。应用程序只需要编写一次,便可以移到各种驱动程序上运行。Sun提供了一个驱动管理器,数据库供应商——如MySQL、Oracle,提供的驱动程序满足驱动管理器的要求就可以被识别,就可以正常工作。所以JDBC不受数据库供应商的限制。代码如下:
org.hibernate.dialect.MySQLDialect
jdbc:mysql://localhost:3306/webshop
root
root
com.mysql.jdbc.Driver
mysql
Struts2配置文件为struts.xml,存放于src文件夹下;Spring框架配置文件为applicationContext.xml,存放于src文件夹下;数据库访问框架Hibernate配置文件为hibernate.cfg.xml,同样存放在src文件夹下。
在MyEclipse中,创建一个Dynamic Web Project,取名为WebShop,在该工程的Build Path中,即可为其添加Struts2、Spring、Hibernate的支持包,也可以右击WebShop,在MyEclipse弹出菜单中,直接单击“Add Struts Capabilities”,为工程增加Struts2配置。
配置完毕后,src文件夹下目录结构如下图所示:
由于食品销售网站的后台是涉及到安全性需求较高的功能的问题,所有只有管理员才能登陆到系统中。
设计思路
在输入帐号和密码后,系统将自动识别用户的身份和权限,根据权限不同,生成相应的操作列表。
技术分析
在登陆页面输入用户名和密码后,点击登录按钮,会将登陆的form表单数据提交到login.action,login.action在struts.xml中配置为:
/main.htm
/login.jsp
若登录成功则跳转到后台模块主界面,并根据该用户的权限等级生成相应的操作菜单,登录失败则仍回到登录界面,并提示用户名或密码错误。
登录失败则仍回到登录界面,并提示用户名或密码错误。
实现的结果
登录的运行界面如图4-1所示:
图4-1 后台登录界面图
登陆成功后,相应操作菜单如图4-2:
图4-2对应操作菜单
登录失败提示框界面如图4-3:
图4-3登录页面错误提示
此页面是后台系统的主界面,整个后台功能都在此界面上。
设计思路
当登陆系统后,会有相应的操作列表。来实现不同功能的操作。比如用户信息,商品信息的管理等。
技术分析
此页面主要显示整个网站的布局,是用框架实现的。main.htm分为三个部分,框架上部topFrame指向的是Top.htm页面,导航菜单实现的是公共模块的功能;框架左侧leftFrame指向页面Left.jsp,功能菜单实现相应的操作功能;框架右部mainFrame。
实现的结果
主面截图如图4-4所示:
图4-4主页面图
个人信息的修改有利于增加系统的安全性,更换密码有利于保护系统的安全。当个人信息变化时,也要进行更改。
设计思路
修改个人信息只可修改电话、地址,用户名以及真实姓名不可修改。另外密码也属于个人信息的修改。
技术分析
当用户填写完旧密码后,鼠标焦点离开旧密码文本框时,系统会调用register.js中的checkOldPwd()方法,动态判断用户密码是否正确,若正确则提示密码正确,继续输入新密码,若不正确则提示密码错误,要重新输入密码。
输入的新密码的格式必须是6-12位数字或字母,系统会使用范式 /^([a-zA-Z0-9_-]){6,16}$/进行模式匹配,并显示给出相应的提示信息。
验证密码和确认密码必须一致。
实现的结果
个人信息修改页面如图4-5所示:
图4-5 个人信息修改界面
修改密码页面如图4-6所示:
图4-6 修改密码界面
此模块是对用户管理的模块,有查询用户,添加用户的信息,删除用户的信息,修改用户的信息等功能。
设计思路
此模块有查询用户的功能,可以很快的找到你想要找的用户;添加用户的一些基本信息,姓名,电话,地址等;除用户的信息,可以节省空间;当用户的信息改变时,还可以休息用户的信息,不用再从新建立。
技术分析
1.查询用户功能
查询用户,打开页面时会先执行queryAllUser.action将所有用户数据从数据库中取出并通过列表展示出来,方法如下:
userds = new Ext.data.Store({
proxy : new Ext.data.HttpProxy({
url : 'queryAllUser.action'
}),
reader:new Ext.data.JsonReader({totalProperty:'totalProperty',root:'root'},
[
{name:'id',type : 'int'},
{name:'username',type : 'string'},
{name:'password',type : 'string'},
{name:'realname',type : 'string'},
{name:'phone',type : 'string'},
{name:'addr',type : 'string'},
{name:'userlevel',type : 'int'}
])//具体数据库表中参数的具体显示
});
}
列表具有分页功能,每页显示数据的默认条数为10条,方法如下:
var searchUserinfo = function() { //列表数据分页方法
userds.baseParams.conditions = text_search_userinfo.getValue();
userds.load({params : {start : 0,limit : 10}});
}
userds.load({params:{start:0,limit:10}});
以上是页面加载时显示所有用户信息,管理员也可通过查询文本框进行条件查询,所查询的信息可以是用户的任何信息,如图4-9所示:
2.添加用户功能管理员的编号是自动生成的,所以不用填写。在提交时如果所输入的信息格式不对或者有未填的信息,输入框会显示红色,无法提交,要求管理员正确填写。输入的信息格式不对或者有未填信息的效果图。
在正确输入各项信息后,点击添加按钮,将form_add表单数据提交到addUser.action,执行UserAction中的addUser()方法,其实归根结底是调用了UserDaoImpl的addUser()方法:
public boolean addUser(User user) {
try {
this.getHibernateTemplate().save(user);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
3.删除用户功能在用户列表中必须先选中一个用户再进行删除,若未选定某个用户就删除,系统会给出提示信息。若选定的用户多于一个,也会给出提示信息。选中用户后,点击删除用户信息,系统会要求用户进行确认,确认后系统会根据列表中选定用户的行号获取该行的用户信息,并将用户编号放入request作用域中,执行delUser.action,进行删除。
实现方法如下:
public String delUser(){
//从request作用域中取用户编号,并将之转换为int型
int id = Integer.parseInt(this.getRequest().getParameter("id"));
user =new User();
user.setId(id);
success = userModel.delUser(user);
return SUCCESS;
}
public boolean delUser(User user) {
try {
//查找到对应用户
List list = this.getHibernateTemplate().find(
" from com.dto.User u where u.id=?",
user.getId());
//删除该用户
this.getHibernateTemplate().delete(list.get(0));
return true;
} catch (Exception e) {
return false;
}
}
...
4.修改用户功能该功能与删除功能一样,必须先选中一个用户且只能选中一个用户,否则会给出提示信息。然后根据列表中所选用户所在的行号,获取该行的用户信息,并将该行的数据对应的放入输入修改的输入框中。
修改方法如下:
...
public boolean uptUser(User user) {
try {
this.getHibernateTemplate().saveOrUpdate(user);
return true;
} catch (Exception e) {
return false;
}
}
实现的结果
用户管理界面,如图4-7所示:
图4-7 用户管理页面图
条件查询,如果4-8所示:
图4-8查询图
添加用户界面,如果4-9所示:
图4-9添加用户界面图
出错提示,如图4-10所示:
图4-10 出错信息提示效果图
未选用户提示信息,如图4-11所示:
图4-11户提示信息
删除多个用户提示,如果4-12所示:
图4-12除多个用户提示信息
删除用户确认提示如图4-13所示:
图4-13 删除用户确认提示
修改用户界面,如图4-14所示:
图4-14 修改用户界面
当用户进入商城主页面后,可以浏览商品,如果想要购买商品,查看用户资料,修改密码,下订单等具体功能时,必须先进行用户的注册或登录等。
设计思路
如果用户还不是会员则提示用户进行注册,用户填写信息之时,系统会动态判断用户的注册信息是否有效。用户只有登陆,才能进行一些功能的操作,比如购买商品,加入购物车等。
技术分析
1.用户注册,当鼠标焦点离开用户名文本框时,系统会调用register.js中的checkUsername()方法,动态判断用户名是否已存在,若存在则提示已存在,须重新输入用户名,若不存在则提示用户名可注册,继续填写其他信息。
输入的新密码的格式必须是6-12位数字或字母,系统会使用范式 /^([a-zA-Z0-9_-]){6,16}$/进行模式匹配,并显示给出相应的提示信息。
用户输入的设置密码和确认密码必须一致。
真实姓名的格式必须是2-7位中文字符,系统会使用范式 /^([\u4e00-\u9fa5]){2,7}$/进行模式匹配,并显示给出相应的提示信息。
手机的格式必须是11位数字,系统会使用范式进行模式匹配,并显示给出相应的提示信息。地址信息不可为空。
2.用户登录,用户进入商城主页面后,可以点击登录进行登录,若不登陆,只能进行一般的商品浏览和搜索,也可将商品添加到购物车,不过在进行结算时,系统会判断该用户是否是登陆用户,如果不是则弹出提示页面,提示用户必须先登陆,并跳转到登录页面。
3.修改密码,当用户填写完旧密码后,鼠标焦点离开旧密码文本框时,会判断用户密码是否正确,若正确则提示密码正确,继续输入新密码,若不正确则提示密码错误,要重新输入密码,且两次输入的密码必须一致。
4.用户注销,当用户登录网站后就在session中设定了一个变量"one",把登录的用户存放在session中,当用户注销时,系统会将session中代表用户的变量"one",以及购物车的变量"buylist"以及物品数量的变量"total"设为空,并跳转到用户登录界面。
实现的结果
商城主界面,如图4-15所示:
图4-15商城主页面
前台登录页面,如图4-16所示:
图4-16前台登录页面
注册页面的效果,如图4-17所示:
图4-17注册页面
修改密码页面,如图4-18所示:
图4-18修改密码页面
此模块是对前台商品模块的介绍,包括商品的浏览,商品的分类,商品的介绍等。
设计思路
在此模块,我们可以看到很多的商品。主框架介绍的商品包括三个区域“疯狂抢购”,“新品上架”,“特价专区”。还有一些商品的分类,根据等级一级一级的分类。
技术分析
1.商品类别区域,在加载主页面时,系统会执行
2.商品的分类,在加载主页面时,系统会执行
实现的结果
商品介绍页面,如图4-19所示:
图4-19商品介绍图
商品类别图,如图4-20所示:
图4-20商品类别图
商品列表,如图4-21所示:
图4-21商品列表
此模块是用户浏览完商品之后,用户把商品加入购物车,付款等一系列的事情。
设计思路
用户浏览完商品之后,把商品加入购物车;用户在选购好商品后,可进行结算,进入填写订单页面,填写订单页面的验证信息方式与注册页面类似;模拟网银进行付款,如果帐号密码不对,系统会进行提示;在帐号密码核对成功后,系统会将帐户余额和该订单的总价进行比较,若帐户余额不足,系统会进行提示。
技术分析
1.顾客如果找到了希望定购的物品,在点击添加到购物车以后,会跳转到购物车页面,显示该物品已经添加进购物车,系统会先获取session作用域中的"buylist"变量,得到购物车中已存在的商品,并检测购物车中是否已存在刚添加的商品,若已经存在,则将该商品的数量加1,若不存在则新建一个订单项,并将之放入"buylist"变量中,方法如下:
if(request.getParameter("act").equals("add")){
//从session中取出购物车列表
List buylist = (List)session.getAttribute("buylist")
//如果第一次加入购物车,则新建购物车列表
if(buylist == null){
buylist = new ArrayList();
}
//新建此次要重新放入session中的列表
List newbuylist = new ArrayList();
//设置buylist中是否已经存在此商品的标志,true表示当前购物车中没有此
boolean flag = true;
int productid = Integer.parseInt(request.getParameter("productid"));
Product product = FrontModel.getOneProduct(productid);
//检查购物车中是否已经有此id的商品
for (int i=0;i
然后用户需要选择定购的数量,点击加号按钮,商品数量加1,同时改变该订单项的总价,方法如下:
count = count + 1;
item.setPcount(count);
item.setUnitprice(count*product.getPrice());
点击减号按钮,商品数量减1,同时改变该订单项的总价,当该商品的数量减为0时,则会在购物车中删除该商品。
若点击清空购物车,则会将"buylist"变量从session作用域中删除,清除购物车中的所有商品:
session.removeAttribute("buylist");
若还想继续购买可以选择"继续购物",跳转到商城首页,若已够玩可以选择"去结算",如果顾客未登陆,点击"去结算",则系统会跳转到登录页面,若登陆后,购物车中没有商品时点击"去结算",则系统会跳转回购物车页面。
2.在订单成功提交后,跳转到个人订单管理中心,个人订单管理中心的订单分为“未付款,未确认”,“已付款,未确认”,“已确认”三类。对于选择货到付款的订单,需在订单中心进行确认,如果订单有错误或已不想购买,也可以删除未付款,未确认的订单。对于选择在线付款的订单,可选择付款或者删除,在付款后,订单会的状态会变为“已付款,未确认”,用户须在收到货物后再进行确认。
3.用户对一个订单进行付款操作,则跳转到网上银行页面,付款时会对余额进行判断,若余额不足,会自动提醒。在成功支付后,钱会先转入中间交易商的账号:
money =money -salesorder.getMoney();
bank.setMoney(money);
bankModel.uptAccount(bank);
//中间商帐号
Bank mbank =bankModel.findMiddleBank();
mbank.setMoney(mbank.getMoney()+salesorder.getMoney());
bankModel.uptAccount(mbank);
//将订单状态设为“已付款,未确认”
salesorder.setSure("已付款,未确认");
salesorderModel.uptSalesorder(salesorder);
等到用户收到货物,进行确认后,钱会从中间商帐号转入商城账号:
//中间商帐号
Bank mbank =bankModel.findMiddleBank();
mbank.setMoney(mbank.getMoney()-salesorder.getMoney());
bankModel.uptAccount(mbank);
//商城帐号
Bank fbank =bankModel.findFinalBank();
fbank.setMoney(fbank.getMoney()+salesorder.getMoney());
bankModel.uptAccount(fbank);
//订单状态设为“已确认”
salesorder.setSure("已确认");
salesorderModel.uptSalesorder(salesorder);
实现的结果
购物车页面,如图4-22所示:
图4-22购物车页面
订单管理页面,如图4-23、4-24和4-25所示:
图4-23未付款,未确认订单
图4-24已付款,未确认订单
图4-25已确认订单
在线支付页面如图4-26所示:
图4-26在线付款页面
账号密码错误提示页面,如图4-27所示:
图4-27号密码错误提示
余额不足提示页面,如图4-28所示:
图4-28余额不足提示
填写订单页面,如图4-29所示:
图4-29填写订单页面
经过几个月的努力,食品销售网站的功能基本实现了。这几个多月的设计学到了不少的东西,同时也深感自己知识的缺乏。在代码编写过程中出现了不少问题。
在搭建项目的主体框架即SSH框架时,导入了MyEclipse自带的Hibernert3.0和Spring2.5的架包,在运行项目时产生错误,一开始我以为是程序设计的错误,可是经过一步步的调试,发现程序并没有出错,而是Hibernert3.0和Spring2.5中的asm.jar架包相互冲突。解决方法是删除其中的一个架包。
在添加商品时,添加商品类别的下拉列表框,本来准备做成3级联动的类型,也成功在jsp页面上实现,不过后来我把后台框架的操作页面换成用ExtJs编写,3级联动功能未能成功实现,经过调试发现后台数据已经改变,但是页面的数据并没有改变,估计应该是缓存问题。此问题没有获得最终解决。
在代码编写的过程中,我发现细心是非常重要的,尤其是本次设计的系统是对数据库进行操作的系统,代码中涉及到很多方面的问题,比如:数据库中字段的类型与代码中的变量类型是否一致或兼容;操作数据库时,是否注意了数据库字段和程序变量之间的顺序的一致性;在使用嵌入式SQL语句时,是否注意到语句结尾的“;”和对变量操作时的“:”;在使用到系统对象时,是否注意到了对象间的上下从属关系等等。如果不够细心,经常会在编程时发生很多小错误导致程序运行失败。
随着Internet的发展,为改变传统的商业运作模式提供了一种技术上的可行性的方案:利用Internet的技术和协议,建立各种企业内部网Intranet,企业外部网Extranet,通过廉价的通讯手段,将买家与卖家、厂商和合作伙伴紧密结合在了一起,消除时间与空间带来的障碍,从而大大的节约了交易成本,扩大了交易范围。而在实际的生活中,这种方案已经被广泛的运用到了实际的商业活动中了,人们将这种交易模式称为:电子商务。
当今比较流行的网上购物系统有“淘宝(www.taobao.com)”,“当当(www.dangdang.com)”等。它们都是相当优秀的电子商务网站,对其他的网站提供了良好的典范。设计中可以学习参考他们的思想,了解和熟悉整个网站的开发流程及完整的电子商务网站应有的功能和注意事项。
设计和完成一个电子商务网站的,将会牵涉到许多技术上的问题,如:动态网页制作技术的,后台数据库的设计和管理,通过实际的制作个网站,可以避免纸上谈兵,在实践中掌握上述技术的使用。
通过本次食品销售网站的设计开发,我对软件开发过程有了更清晰的了解,首先需要进行需求分析、功能分析,然后是总体设计、数据库设计、详细设计等,并且对软件测试的方法、手段有了一定的理解。在开发过程中还认真学习了与Struts2和MySQL相关的知识,并且重新复习了数据库的相关知识,极大地拓宽了我的知识面。
在系统的开发初期,必须要先了解相关知识,这样才能进入在设计的过程中知道要干什么。从了解这些知识到对整体设计有了解,再从总体设计、数据库设计到程序编写,以及最后的软件测试,整个过程感觉很充实,虽然遇到了很多困难,但每次我通过自己查资料、或是向指导老师请教以及与同学一起研究之后,找到解决方案并成功实现时,获得的成就感和满足感是以前没有感受到过的。
在整个设计阶段感受最为深刻的是掌握学习的技巧和解决问题的方法。首先是解决问题的方式,在出现一个问题之后,如何找出造成问题的主要原因,才是解决问题的关键,另外一个就是解决问题的方法,在程序设计中会遇到很多问题,虽然有参考书,但是参考资料上的内容毕竟和实际遇到的问题不可能完全一样,每个人编程时的思路、习惯和对数据处理的方法都是不同的,怎么样通过参考资料找到自己所遇到的问题的解决方法,这是我们以后在学习生活中需要不断加强的能力。在毕业设计的过程中,我深刻的体会到了解决问题的能力的重要性,在今后的学习和工作中我也会继续不断加强自己这方面的能力,这样才能使自己不断地进步,获得更大的成就。
大小: 22.1MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87274217