目录
- 1 -摘 要
- 2 -Abstract
- 3 -1.
引 言
- 4 -2.
设计目的与任务
- 4 -3.
需求分析
- 5 -4.
系统设计
- 5 -4.1分层模式
- 5 -4.2开发技术与工具
- 10 -4.3总体设计
- 10 -4.3.1系统总体结构
- 12 -4.3.2流程图
- 13 -4.4 详细设计
- 13 -4.4.1数据库设计
- 17 -4.4.2 系统开发
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
及说明
- 19 -4.4.3具体模块设计
- 26 -5.
程序清单
- 26 -5.1 数据库脚本
- 29 -5.2项目实现部分代码
- 45 -6.
程序调试与体会
- 46 -7.
运行结果
- 54 -8.
结 论
- 54 -9.
致 谢
- 54 -10.
参考文献
摘 要
随着信息化网络的发展,网络对人们的生活影响越来越大,网上购物也逐渐成为一种趋势,这对电子商场的发展起到了很好的推进作用。本文主要通过对电子商城的应用环境和主要实现功能进行分析,叙述了本电子商城的设计与实现过程。该系统是基于多层企业级应用
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
JAVA EE技术开发的WEB应用,以典型的MVC模式架构为基础。采用JaveEE5轻量级框架SSH与前台Ajax技术相结合来实现,在设计过程中全方位的应用软件工程的开发思想,对项目进行UML建模包括各模块的类图、时序图等。系统基于B/S分布式结构,适应范围广阔。
关键词:电子商城;SSH;Ajax;框架
Abstract
With the development of information networks, the network plays an increasing role in people's lives, and online shopping is becoming a trend, which wonderfully facilitates the development of electronic store. This article is focused on the analysis of the applied environment of electronic mall and the main achievement function, for the purpose of describing the design and implement process of E-mall.The system is based on the web application developed with multi-standard enterprise application standard JAVA EE,framed with classical MVC model architecture,and realized through the combination of lightweight framework SSH and front desk Ajax technology. In the design process a full range of application development software engineering development ideas was used in theUML modeling of the project,which included class diagrams, sequence diagrams. The system is based on B / S distributed architecture to meet a broad range of requirements.
Key words: Electronic Mall, SSH, Ajax, Framework
1. 引 言
随着网上购物的迅猛发展,电子商城大量涌现,而电子商城的出现不仅改变了人们传统的购物方式,也逐渐的影响着人们的消费观,一个好的电子商城不仅能给客户带来方便,更能给企业带来巨大的财富。本商城主要利用JavaEE与Ajax技术进行开发,具有很强的安全性、可靠性和可扩展性。其前台实现了从商品选购到订单提交整个业务流程,后台实现了对整个系统的管理,就整体功能而言,能满足基本的网上购物需求,能让用户感到便捷、快速,让企业管理、维护更简单。
2. 设计目的与任务
随着信息化技术在生活中的应用越来越广泛,网上购物也逐渐成为人们的一种生活方式。本系统正是基于这样一种环境下应运而生。本电子商城分为前、后台两部分,前台主要实现会员的网上购物业务流程,后台则由各种管理员对商城会员、商品、定单等内容进行管理。
3. 需求分析
本电子商城分为前后台两部分,前台主要包括非会员和会员用户,后台分为商品管理员、订单管理员、会员管理员和系统管理员。在系统中依据用户的权限执行相应的功能。系统用例图如下所示:
图3-1 系统用例图
4. 系统设计
4.1分层模式
本系统是基于B/S模式开发的JAVA EE多层体系结构WEB应用。系统开发主要分为以下几层:表示层、业务层、DAO层、持久层。业务层和DAO层都通过接口与其它层进行连接从而减小了各层之间的耦合度,实现高内聚、低耦的思想。分层结构图如下所示:
图4-1系统分层结构
4.2开发技术与工具
主要开发工具为:MyEclipse8.6、Mysql6.0、Tomcat6.0、PowerDesigner12。
主要技术包括:JavaEE轻量级框架S2SH、MD5算法、Log4j、Ajax、JSON。
S2SH集成框架是Struts、Spring 和Hibernate 三种技术的有机融合, 是目前应用最广泛的Java EE 架构。在S2SH集成框架中,Struts 的作用是提供MVC 模型, 将界面、业务逻辑和数据分离, 并提供一个高可扩展的架构。Spring作为核心,向上整合MVC框架,向下整合ORM框架,使用Spring的IoC容器来管理各组件之间之间的依赖关系,Spring的声明事务将负责逻辑层组件的事务管理。而Hibernate 提供了一个抽象的数据服务视图,将用户对数据库的访问进行高度抽象。
Struts 是目前创建Web 应用最常用的表现层MVC 框架实现,是Jakarta Apache 的一个开源项目。基于Model2 的Struts 框架利用控制器和定制标签库将应用中的模型和视图分离,达到了层间松散耦合的效果,同时提高系统的灵活性、重用性和维护性。作为开源项目,Struts 经受了大量实践的检验,功能越来越强大,体系也日臻完善,并且对其他技术和框架显示出良好的融合性。
图4-2 Struts2.0 MVC结构图
Spring 由Rod Johnson 创建,它是为了解决企业应用开发的复杂性而创建的。Spring 使用基本的JavaBean 来完成以前只可能由EJB 完成的事情。然而,Spring 的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java 应用都可以从Spring 中受益。简单来说,Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
图4-3 Spring功能图
Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC 进行了非常轻量级的对象封装,使得Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate 可以应用在任何使用JDBC 的场合, 既可以在Java 的客户端程序使用, 也可以在Servlet/JSP 的Web 应用中使用。
图4-4 Hibernate运行图
AJAX是Asynchronout JavaScript and XML的缩写,它并不是一门新的语言或技术,实际上是几项技术按一定的方式组合在一起,在共同的协作中发挥各自的作用,它包括:使用XHTML和CSS标准化呈现;使用DOM实现动态显示和交互;使用XML和XSLT进行数据交换和处理;使用XMLHttpRequest进行异步数据读取;最后用JavaScript绑定和处理所有数据。AJAX的一个最大的特点是无需刷新页面便可向服务器传输或读写数据(又称无刷新页面),这一特点要得益于XMLHTTP组件XMLHttpRequest对象。这样就可以像再发桌面应用程序只同服务器进行数据层面的交换,而不用每次都刷新界面,也不用每次将数据处理的工作提交给服务器来做,这样即减轻了服务器的负担又加快了响应速度、缩短了用户等候时间。
图4-5 Ajax模型
JSON(JavaScript Object Notation,JavaScript对象标记)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript(Standard ECMA-262 3rd Edition-December 1999)的一个子集。JSON采用与编程语言无关的文本格式,但是也使用了类C语言的习惯,这些特性使JSON成为理想的数据交换格式。而AJAX可以利用JSON更加有效地接收数据,因为JSON特殊的属性。在Struts 2的showcase中的AJAX部分,JSON的结果输出是通过Freemaker模板实现。这种
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
在简易性和灵活性上都比不上JSON插件。
Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
4.3总体设计
4.3.1系统总体结构
本系统分为前台和后台两部分,前台提供一条网上购物业务流程的功能实现,主要实现模块见图4-6;后实现对前台功能信息的管理,主要实现模块见图4-7。
前台功能模块:
图4-6 前台功能模块
后台功能模块:
图4-7 后台功能模块
4.3.2流程图
前台主要分为非会员用户和会员用户,其中只有会员用户才能实现在线购物,而非会员用户必需进行注册。后台用户主要分为商品管理员、会员管理员、定单管理员、系统维护员,不同的管理员实现不同的功能。
前台流程图:
图4-8 前台流程图
后台流程图:
图4-9后台流程图
4.4 详细设计
4.4.1数据库设计
本系统数据库开发主要基于Mysql6.0数据库管理工具,包括8个数据库表如下所示:
· 数据字典
表4-1 e_shop数据表清单
表名
解释
ADMIN
管理员表
CART
购物车表
EVALUATE
商品
评价
LEC评价法下载LEC评价法下载评价量规免费下载学院评价表文档下载学院评价表文档下载
表
MEMBER
会员表
MERCHANTABLE
商品表
ORDERS
定单表
RECORD
记录表
TYPES
类别表
表4-2 后台管理员表(ADMIN)
ADMIN(admin)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
ADMIN_ID
管理员编号
INT(2)
2
ADMIN_NAME
管理员名
VARCHAR(50)
50
ADMIN_PWD
管理员密码
VARCHAR(30)
20
ADMIN_TYPE
管理员种类
INT(1)
1
表4-3购物车表(CART)
CART(cart)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
CART_ID
购物车编号
INT(5)
5
CART_MEM_ID
会员编号
INT(5)
5
是
CART_MER_ID
商品编号
INT(6)
6
是
CART_NUM
商品数量
INT(3)
3
是
表4-4商品评价表(EVALUATE)
EVALUATE(evaluate)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
EVAL_ID
评价编号
INT(3)
3
EVAL_MEM_ID
会员编号
INT(5)
5
是
EVAL_MER_ID
商品编号
INT(6)
6
是
EVAL_DATE
评价日期
VARCHAR(20)
20
是
EVAL_CONTENT
评价内容
VARCHAR(200)
200
是
表4-5会员表(MEMBER)
MEMBER(member)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
MEM_ID
会员编号
INT(5)
5
MEM_NAME
会员名称
VARCHAR(50)
50
MEM_PWD
会员密码
VARCHAR(30)
20
MEM_TEL
联系电话
VARCHAR(15)
15
是
MEM_ADDRESS
联系地址
VARCHAR(50)
50
是
MEM_REGIST_DATE
注册日期
VARCHAR(10)
10
是
MEM_POST
邮编
VARCHAR(10)
10
是
MEM_EMAIL
EMAIL
VARCHAR(20)
20
是
MEM_CART_ID
购物车编号
INT(5)
5
是
表4-6商品表(MERCHANTABLE)
MERCHANTABLE(merchantable)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
MER_ID
商品编号
INT(6)
6
MER_NAME
商品名称
VARCHAR(50)
50
MER_TYPE_ID
商品种类
INT(3)
3
是
MER_PLACE
出产地
VARCHAR(50)
50
是
MER_PRICE
价格
DECIMAL(8,2)
8
MER_DISCOUNT
折扣
DECIMAL(2,1)
2
是
MER_PICTURE
图片
VARCHAR(50)
50
是
MER_DESC
描述
VARCHAR(50)
50
是
MER_PRODUCTER
厂家
VARCHAR(60)
60
是
MER_LEAVE_DATE
出厂时间
VARCHAR(10)
10
是
MER_ADD_DATE
添加时间
VARCHAR(10)
10
是
MER_NUM
销售数量
INT
0
表4-7定单表(ORDERS)
ORDERS(orders)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
ORDER_ID
定单编号
INT(6)
6
ORDER_DATE
定单日期
VARCHAR(20)
20
是
ORDER_MEM_ID
会员编号
INT(5)
5
是
ORDER_STATUS
定单状态
INT(1)
1
是
ORDER_SEND_TIME
发送时间
VARCHAR(60)
60
是
ORDER_REMARK
定单备注
VARCHAR(100)
100
是
ORDER_SUM
价钱总和
DECIMAL(8,2)
8
是
表4-8记录表(RECORD)
RECORD(record)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
RECORD_ID
记录编号
INT(6)
6
RECORD_MER_ID
商品编号
INT(6)
6
是
RECORD_MER_NUM
商品数量
INT(3)
3
是
RECORD_ORDER_ID
定单编号
INT(6)
6
是
表4-9类别表(TYPES)
TYPES(types)
是否主键
字段名
字段描述
数据类型
长度
可空
约束
缺省值
备注
是
TYPE_ID
类别编号
INT(3)
3
TYPE_NAME
类别名称
VARCHAR(30)
30
是
TYPE_DESC
类别描述
VARCHAR(100)
100
是
· 数据库概念设计
将抽象的需求转为数据库概念结构,即概念模式。
图4-10概念图
· 数据库物理设计
依据所用的数据库由概念模型生成相应的物理模型,如下图所示。
图4-11 物理图
4.4.2 系统开发规范及说明
1. 系统目录及说明如下图
依据架构思想,将开发类主要分为action、bean、dao、service逻辑包。action包含所有的控制层类,bean包含所有领域对象及相应的ORM映射文件,dao包含所有的持久层抽象类,service包含所有业务层类。另一方面根据系统开发所需建立filter(过滤器)包、listener(监听器)包、tool(工具)包。具体如下图所示:
图4-12 系统目录图
2. Struts配置文件
图4-13 Struts配置文件图
4.4.3具体模块设计
1. 模块分析与设计:
整个系统主要包括商品信息模块、会员模块、购物车模块、订单模块、商品类别、后台管理员模块。
商品信息模块:
本模块主要用来显示、查询和商品评论的功能。主要涉及的类和方法如下类图。其中PageServiceImpl为分页实现类,在整个系统中属于一个公共组件,故在各模块中不再重复介绍。另一方面各模块各层之间类的关系也大致相同,都可以参考以下类图。
图4-14商品模块类图
表4-10 商品模块主要应用类
类名
含义
MerchantableAction
作为其控制层内容,调用相应的业务方法
HeadService
业务层抽象类,其实现类中包含相应的业务方法
MerchantableDAO
包含相应的持久层方法
表4-11 MerchantableAction类
方法
含义
showByType()
调用业务层方法按类别显示商品
showById()
调用业务层方法显示某种商品
research()
调用业务层方法查询商品
showAllMer()
调用业务层方法显示所有商品
deleteMer()
调用业务层方法删除商品
updateMer()
调用业务层方法修改商品信息
saveMer()
调用业务层方法保存商品信息
表4-12 HeadService
方法
含义
findById()
调用持久层方法按商品编号查询商品
findByType()
调用持久层方法按种类查询商品
researchMer()
按条件查询商品
deleteMer()
删除商品
updateMer()
修改商品
saveMer()
保存商品
表4-13 MerchantableDAO类
方法
含义
findAllByKeyword()
按关键字查询所有商品
findByTypes()
按各类查询商品
findById()
按商品编号查询商品
delete()
删除商品
findAll()
查询所有商品
saveOrUpdate()
保存或修改商品
findByNum()
依据数量查询
findPartByTyps()
依据种类查询部分商品
会员模块:
在本模快中用到了两控制层类LoginAction和LoginJsonAction,前者用于普通的控制调用业务层方法,同时返回相应的业务逻辑视图。后者则是用Struts和Json相结合应用的,首先是能过Ajax提交数据当相应的action,然后调用业务层方法处理完成返回并不是返回某个逻辑视图,而是将返回的信息通过Json进行数据转换,前台通过Ajax接收数据。
表4-14 会员模块主要应用类
类名
含义
LoginAction
普通形式的控制器,调用相应的业务层方法
LoginJsonAction
Ajax提交时使用的控制器
UserService
业务层类,包含各种相应的业务处理方法
MemberDAO
包含相应的持久层方法
表4-15 LoginAction类
方法
含义
modifyPwd()
调用业务层方法修改会员密码
modifyAddress()
调用业务层方法修改会员地址等信息
regist()
调用业务层方法注册
showMem()
调用业务层方法后台显示所有会员
delMem()
调用业务层方法删除会员
表4-16 LoginJsonAction类
方法
含义
execute()
调用业务层方法会员登录校验
表4-17 UserService类
方法
含义
modifyPwd()
修改会员密码
modifyAddress()
修改会员地址等信息
save()
保存会员
delMem()
删除会员
表4-18 MemberDAO类
方法
含义
findByNameAndPwd()
按用户名和密码查询用户
saveOrUpdate()
保存或修改会员信息
findAll()
查询所有会员
delete()
删除会员
购物车模块:
同上面的会员模板,在此模块中也有两个控制类CartAction和CartJsonAction。
表4-19 购物车模块主要应用类
类名
含义
CartAction
普通形式的控制器,调用相应的业务层方法
CartJsonAction
Ajax提交时使用的控制器
HeadService
业务层类,包含各种相应的业务处理方法
CartDAO
包含相应的持久层方法
表4-20 CartAction类
方法
含义
execute()
调用业务层方法查询会员相应的购物车
update()
调用业务层方法修改购物车
delete()
调用业务层方法删除购物车
表4-21 CartJsonAction类
方法
含义
add()
添加商品到购物车
表4-22 HeadService类
方法
含义
findCartByMember()
依据会员查询相应的购物车
updateCart()
修改购物车
deleteCart()
删除购物车中的商品
addMerToCart()
将商品加入购物车
表4-23 CartDAO类
方法
含义
findByMember()
依据会员查询相应的购物车
updateCart()
修改购物车
delete()
删除购物车中的商品
saveCart()
将商品加入购物车
订单模块
表4-24 订单模块主要应用类
类名
含义
OrderAction
控制器调用相应的业务层方法
HeadService
业务层类,包含各种相应的业务处理方法
OrderDAO
包含相应的持久层方法
表4-25 OrderAction类
方法
含义
execute()
调用业务层方法显示订单
addOrder()
调用业务层方法添加
historyOrder()
调用业务层方查看历史订单
modifyOrder()
调用业务层方法进入修改订单
deleteOrder()
调用业务层方法删除订单
showOrders()
调用业务层方法显示所有订单
submit()
调用业务层方法确认定单、发货
表4-26 HeadService类
方法
含义
addOrder()
添加订单
findHistoryOrder()
查寻历史订单
deleteOrde
删除订单
updateOrders()
修改订单
表4-27 OrderDAO类
方法
含义
findById()
据编号查询订单
findHistoryOrder()
查寻历史订单
delete()
saveOrUpdate()
保存或修改订单
商品类别模块:
表4-28 商品类别模板应用类
类名
含义
TypesAction
控制器调用相应的业务层方法
HeadService
业务层类,包含各种相应的业务处理方法
TypesDAO
包含相应的持久层方法
表4-29 TypesAction类
方法
含义
getAllType()
调用业务层方法获取类别
deleteType()
调用业务层方法删除
addType()
调用业务层方法添加种类
updateType()
调用业务层方法修改种类
recommend()
调用业务层方法推荐某类商品到首页
cancelRecommend()
调用业务层方法取消推荐
表4-30 HeadService类
方法
含义
findByReCommend
查询推荐的商品
findAllTypes()
查询所有类别
deleteType()
删除类别
saveType()
保存类别
updateType()
修改类别
表4-31 TypesDAO类
方法
含义
findByRecommend()
查询被推荐的类别
findById()
据编号查询所有类别
findAll()
查询所有类别
saveOrUpdate()
保存或修改类别
delete()
删除类别
后台管理员模块:
表4-32 后台管理员主要应用类
类名
含义
AdminAction
控制器调用相应的业务层方法
UserService
业务层类,包含各种相应的业务处理方法
AdminDAO
包含相应的持久层方法
表4-33 AdminAction类
方法
含义
valAdmin()
调用业务层方法校验用户
save()
调用业务层保存管理员
update()
调用业务层方法修改管理员权限
delete()
调用业务层方法删除管理员
modifyPwd()
调用业务层修改管理员密码
exit()
注销
表4-34 UserService类
方法
含义
validateAdmin()
校验用户
saveAdmin()
保存管理员
updateAdmin()
修改管理员
delAdmin()
删除管理员
表4-35 AdminDAO类
方法
含义
findAdminByNameAndPwd
据用户名与密码查询用户
saveOrUpdate()
保存或保存管理员
Delete()
删除管理员
findById()
依据编号查询管理员
2. 时序图举例
时序图通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序,当执行一个用例行为时,时序图中的每条消息对应了一个类操作或状态机中引起转换的触发事件。以下列出了本商城中的登录时序图与购物时序图,其它功能时序图与其两者基本相似,只是处理的对象不同,故此不在赘述。
图4-15 登录时序图
图4-16 购物时序图
5. 程序清单
5.1 数据库脚本
具体实现脚本:
#管理员表
CREATE TABLE admin(
admin_id INT(2) AUTO_INCREMENT,
admin_name VARCHAR(50) NOT NULL,
admin_pwd VARCHAR(30) NOT NULL,
admin_type INT(1) NOT NULL,
CONSTRAINT PK_ADMIN_ID PRIMARY KEY (admin_id)
);
#会员表
CREATE TABLE member(
mem_id INT(5) AUTO_INCREMENT,
mem_name VARCHAR(50) NOT NULL,
mem_pwd VARCHAR(30) NOT NULL,
mem_tel VARCHAR(15),
mem_address VARCHAR(50),
mem_regist_date VARCHAR(10),
mem_post VARCHAR(10),
mem_email VARCHAR(20),
mem_cart_id INT(5),
CONSTRAINT PK_MEMBER_ID PRIMARY KEY (mem_id)
);
#商品种类
CREATE TABLE types(
type_id INT(3) AUTO_INCREMENT,
type_name VARCHAR(30),
type_desc VARCHAR(100),
type_recommend int default 0,
CONSTRAINT PK_TYPES_ID PRIMARY KEY (type_id)
);
#商品信息表
CREATE TABLE merchantable(
mer_id INT(6) AUTO_INCREMENT,
mer_name VARCHAR(50) NOT NULL,
mer_type_id INT(3),
mer_place VARCHAR(50),
mer_price DECIMAL(8,2) NOT NULL,
mer_discount DECIMAL(2,1),
mer_picture VARCHAR(50),
mer_desc VARCHAR(50),
mer_producter VARCHAR(60),
mer_leave_date VARCHAR(10),
mer_add_date VARCHAR(10),
mer_num int default 0,
CONSTRAINT PK_MERCHANTABLE_ID PRIMARY KEY(mer_id),
CONSTRAINT FK_MERCHANTABLE_TYPE_ID FOREIGN KEY (mer_type_id) REFERENCES types(type_id)
);
#商品评价表
CREATE TABLE evaluate(
eval_id INT(3) AUTO_INCREMENT,
eval_mem_id INT(5),
eval_mer_id INT(6),
eval_date VARCHAR(20),
eval_content VARCHAR(200),
CONSTRAINT PK_EVALUATE_ID PRIMARY KEY (eval_id),
CONSTRAINT FK_EVALUATE_MEN_ID FOREIGN KEY (eval_mem_id) REFERENCES member (mem_id),
CONSTRAINT FK_EVALUATE_MER_ID FOREIGN KEY (eval_mer_id) REFERENCES merchantable(mer_id)
);
#购物车 购物车号即为会员编号
CREATE TABLE cart(
cart_id INT(5) AUTO_INCREMENT,
cart_mem_id INT(5),
cart_mer_id INT(6) unique,
cart_num INT(3),
CONSTRAINT PK_CART_ID PRIMARY KEY (cart_id),
CONSTRAINT FK_CART_ID FOREIGN KEY (cart_mem_id) REFERENCES member(mem_id),
CONSTRAINT FK_CART_MER_ID FOREIGN KEY (cart_mer_id) REFERENCES merchantable (mer_id)
);
#订单表
CREATE TABLE orders (
order_id INT(6) AUTO_INCREMENT,
order_date VARCHAR(20),
order_mem_id INT(5),
order_status INT(1),
order_send_time varchar(60),
order_remark varchar(100),
order_sum DECIMAL(8,2),
CONSTRAINT PK_ORDER_ID PRIMARY KEY (order_id),
CONSTRAINT FK_ORDER_MEM_ID FOREIGN KEY (order_mem_id) REFERENCES member(mem_id)
);
#购物记录
CREATE TABLE record(
record_id int(6) AUTO_INCREMENT,
record_mer_id int(6),
record_mer_num int(3),
record_order_id int(6),
CONSTRAINT PK_RECORD_ID PRIMARY KEY (record_id),
CONSTRAINT FK_RECORD_MER_ID FOREIGN KEY (record_mer_id) REFERENCES merchantable (mer_id),
CONSTRAINT FK_RECORD_ORDER_ID FOREIGN KEY (record_order_id) REFERENCES orders (order_id)
);
5.2项目实现部分代码
1. applicationContext.xml配置文件
org.hibernate.dialect.MySQLDialect
update
true
true
com/eshop/bean/Admin.hbm.xml
com/eshop/bean/Cart.hbm.xml
com/eshop/bean/Evaluate.hbm.xml
com/eshop/bean/Member.hbm.xml
com/eshop/bean/Merchantable.hbm.xml
com/eshop/bean/Orders.hbm.xml
com/eshop/bean/Record.hbm.xml
com/eshop/bean/Types.hbm.xml
2. daoContext.xml配置文件
3. struts.xml配置文件
index.jsp
index.action
index.jsp
member/modifyPwd.jsp
member/modifyAddress.jsp
registSucc.jsp
member/modifyPwd.jsp
showByType.jsp
showById.jsp
result.jsp
showById.jsp
{1}.jsp
/head/login.jsp
mycart.jsp
account.jsp
finish.jsp
historyOrder.jsp
modifyOrder.jsp
modifyOrder.jsp
{1}.jsp
jsp/index.jsp
login.jsp
login.jsp
{1}.jsp
image/bmp,image/png,image/gif,image/jpeg
30000
/image
merInfo.jsp
saveMerInfo.jsp
mer!showAllMer?page=1
modifyMer.jsp
modifyResult.jsp
uploadError.jsp
{1}.jsp
typeInfo.jsp
typeInfo.jsp
typeInfo.jsp
orderInfo.jsp
orderInfo.jsp
memInfo.jsp
memInfo.jsp
adminInfo.jsp
adminInfo.jsp
modifyAdminResult.jsp
modifyPwd.jsp
/back/login.jsp
/back/login.jsp
{1}.jsp
4. 业务层HeadServiceImpl类
package com.eshop.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.eshop.bean.Cart;
import com.eshop.bean.Evaluate;
import com.eshop.bean.Member;
import com.eshop.bean.Merchantable;
import com.eshop.bean.Orders;
import com.eshop.bean.Record;
import com.eshop.bean.Types;
import com.eshop.dao.CartDAO;
import com.eshop.dao.EvaluateDAO;
import com.eshop.dao.MerchantableDAO;
import com.eshop.dao.OrdersDAO;
import com.eshop.dao.RecordDAO;
import com.eshop.dao.TypesDAO;
import com.eshop.service.HeadService;
import com.eshop.tool.DateTime;
public class HeadServiceImpl implements HeadService{
private TypesDAO typesDAO;
private MerchantableDAO merchantableDAO;
private CartDAO cartDAO;
private EvaluateDAO evaluateDAO;
private OrdersDAO ordersDAO;
private RecordDAO recordDAO;
public RecordDAO getRecordDAO() {
return recordDAO;
}
public void setRecordDAO(RecordDAO recordDAO) {
this.recordDAO = recordDAO;
}
public OrdersDAO getOrdersDAO() {
return ordersDAO;
}
public void setOrdersDAO(OrdersDAO ordersDAO) {
this.ordersDAO = ordersDAO;
}
public EvaluateDAO getEvaluateDAO() {
return evaluateDAO;
}
public void setEvaluateDAO(EvaluateDAO evaluateDAO) {
this.evaluateDAO = evaluateDAO;
}
public TypesDAO getTypesDAO() {
return typesDAO;
}
public void setTypesDAO(TypesDAO typesDAO) {
this.typesDAO = typesDAO;
}
public MerchantableDAO getMerchantableDAO() {
return merchantableDAO;
}
public void setMerchantableDAO(MerchantableDAO merchantableDAO) {
this.merchantableDAO = merchantableDAO;
}
public CartDAO getCartDAO() {
return cartDAO;
}
public void setCartDAO(CartDAO cartDAO) {
this.cartDAO = cartDAO;
}
public List
findAllTypes() {
return typesDAO.findAll();
}
public List findAllMerchantable() {
return this.merchantableDAO.findAll();
}
public Merchantable findById(String id) {
return merchantableDAO.findById(Integer.parseInt(id));
}
public List findByType(String type) {
Types t = new Types();
t.setTypeId(Integer.parseInt(type));
return merchantableDAO.findByTypes(t);
}
public int addMerToCart(String id, Member member, String price, String num) {
Cart cart = new Cart();
Merchantable merchantable = merchantableDAO.findById(Integer.parseInt(id));
if(cartDAO.findByMer(merchantable).size() == 0){
cart.setCartNum(Integer.parseInt(num));
cart.setMerchantable(merchantable);
cart.setMember(member);
cartDAO.save(cart);
return 1;
}
return 0;
}
public List findCartByMember(Member member) {
return cartDAO.findByMember(member);
}
public List findPartByType(String type) {
Types t = new Types();
t.setTypeId(Integer.parseInt(type));
List list = merchantableDAO.findByTypes(t);
List list2 = new ArrayList();
Random d = new Random();
int num;
int i=0;
while(i < (list.size()>5? 5: list.size())){
num = d.nextInt(list.size());
if(!list2.contains(list.get(num)))
{
i++;
list2.add(list.get(num));
}
}
return list2;
}
public List findByMerId(String merId) {
Merchantable m = new Merchantable();
m.setMerId(Integer.parseInt(merId));
return this.evaluateDAO.findByMerId(m);
}
public void saveEval(String merId, String content2,Member member, String date) {
Evaluate evaluate = new Evaluate();
Merchantable m = new Merchantable();
m.setMerId(Integer.parseInt(merId));
evaluate.setMerchantable(m);
evaluate.setMember(member);
evaluate.setEvalContent(content2);
evaluate.setEvalDate(date);
this.evaluateDAO.save(evaluate);
}
public void updateCart(String cartId, String num) {
Cart cart = cartDAO.findById(Integer.parseInt(cartId));
cart.setCartNum(Integer.parseInt(num));
cartDAO.update(cart);
}
public void deleteCart(String cartId) {
Cart cart = cartDAO.findById(Integer.parseInt(cartId));
cartDAO.delete(cart);
}
public void addOrder(Member member, String time, String remark,double sum) {
String date = DateTime.getDate();
Orders orders = new Orders();
orders.setMember(member);
orders.setOrderDate(date);
orders.setOrderStatus(0);
orders.setTime(time);
orders.setRemark(remark);
orders.setSum(sum);
ordersDAO.saveOrUpdate(orders);
//将购买的商品添加到记录表,应该在后台管理员确认后再加入记录表
List carts = cartDAO.findByMember(member);
for(Cart cart : carts){
Record record = new Record();
record.setMerchantable(cart.getMerchantable());
record.setOrders(orders);
record.setRecordMerNum(cart.getCartNum());
recordDAO.save(record);
}
//定单提交之后就需要删除购物车中的商品
cartDAO.deleteAll();
}
public List findHistoryOrder(Member member,int status) {
return ordersDAO.findByHistoryOrder(member, status);
}
public void deleteOrder(String orderId) {
Orders orders = ordersDAO.findById(Integer.parseInt(orderId));
orders.setOrderId(Integer.parseInt(orderId));
ordersDAO.delete(orders);
}
public List researchMer(String type, String keyword) {
//查询所有类别
if(Integer.parseInt(type) == 0){
return merchantableDAO.findAllByKeyword(keyword);
}
//按各类查询
Types types = new Types();
types.setTypeId(Integer.parseInt(type));
return merchantableDAO.findByKeyword(types, keyword);
}
public void saveMer(Merchantable mer) {
merchantableDAO.saveOrUpdate(mer);
}
public void deleteMer(String id) {
Merchantable mer = merchantableDAO.findById(Integer.parseInt(id));
merchantableDAO.delete(mer);
}
public void deleteType(String id) {
Types type = new Types();
type.setTypeId(Integer.parseInt(id));
typesDAO.delete(type);
}
public void saveType(Types type) {
typesDAO.saveOrUpdate(type);
}
public void updateType(String id, String typeName, String typeDesc) {
Types type = typesDAO.findById(Integer.parseInt(id));
type.setTypeName(typeName);
type.setTypeDesc(typeDesc);
typesDAO.saveOrUpdate(type);
}
public void updateOrder(String orderId) {
Orders order = ordersDAO.findById(Integer.parseInt(orderId));
order.setOrderStatus(1);
ordersDAO.saveOrUpdate(order);
//确认发货后,将商品购买数量加1
List records = recordDAO.findByOrderId(orderId);
for(Record r : records){
List mers = merchantableDAO.findByExample(r.getMerchantable());
Merchantable m = null;
if(mers.size() != 0){
m = mers.get(0);
}
int num = m.getMerNum() + r.getRecordMerNum();
m.setMerNum(num);
merchantableDAO.saveOrUpdate(m);
}
}
public List findMerByNum() {
return merchantableDAO.findByNum();
}
public List findByReCommend() {
List types = typesDAO.findByRecommend();
List list = new ArrayList();
if(types.size() != 0){
for(Types t : types){
list.add(merchantableDAO.findPartByTypes(t.getTypeId()));
}
return list;
}
return null;
}
public void updateType(String id, int type) {
Types t = typesDAO.findById(Integer.parseInt(id));
if(type == 1){
t.setTypeRecommend(1);
}else{
t.setTypeRecommend(0);
}
typesDAO.saveOrUpdate(t);
}
}
6. 程序调试与体会
在本项目的开发中遇到了很多的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,有从前台页面在不同浏览器中不兼容问题到后台数据库设计问题。在遇到这些问题时我们一直坚持不懈,通过在网上查询资料、同学间交流、求助老师等途径,我们还是解决了许多的问题。在解问题的过程中也让我们发现,一个项目有一个好的架构是非常重要的,当遇到问题时我们能从这个好的架构中更迅速的发现并解决问题,这对项目而言就有了较高的可维护性。同时我们通过本次课程设计从中也收获到了许多快乐,体会到了编程的乐趣。
7. 运行结果
下面以图片的形式显示部分页面的显示效果。
前台页面效果图:
图7-1 前台首页
图7-2分类显示
图7-3商品加入购物车
图7-4修改购物车
图7-5订单页面
图7-6 查询显示
图7-7账户首页
图7-8历史订单
图7-9密码修改
图7-10个人信息修改
后台显示效果图:
图7-11 登录页面
图7-12会员管理页面
图7-13商品管理页面
图7-14商品添加页面
图7-15商品分类页面
图7-16管理员密码修改页面
图7-17订单管理页面
图7-18后台管理员页面
8. 结 论
通过本次课程设计我们加深了对JavaEE5开发的思想的理解,对SSH三大框架的整合开发有了进一步的熟悉,对团队之间合作的重要性都有了共识。从开发中遇到的问题也让我们发现要将学到的知识很好的应用到实际开发中,还需要不断的努力。让我们明白到只有实践应用才能很好的检验我们对知识的掌握程度。
9. 致 谢
在课程设计完成之际,我们首先要向指导谢小婷老师表示最真挚的谢意。谢老师认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我们收益匪浅。无论在理论上还是在实践中,都给与我们很大的帮助,使我得到不少的提高,这对于我们以后的工作和学习都是一种巨大的帮助,感谢她耐心的辅导。同时还要感谢各位同学给予我们的帮助,感谢这个团队的协同合作,正是有了这些帮助才使得我们能够顺利的完成这次的课程设计。
由于我们的学识有限,加之时间比较仓促,可能存在某些不足之处,真诚的欢迎老师、同学提出宝贵的意见,我们将认真听取、改正努力提高自己。
10. 参考文献
[1]李刚.轻量级JavaEE企业应用实战.北京: 电子工业出版社,2009.9
[2]徐会生.康爱媛, 何启伟,深入浅出ExtJ.北京:人民邮电出版社,2010.5
[3]孙卫琴.精通Struts:基于MVC的Java Web设计开发.北京: 电子工业出版社,2004
[4] 邓子云,张赐.Jsp网络编程从基础到实战.北京:电子工业出版社,2005
[5]郭志学.易学设计模式.北京:人民邮电出版社,2009.4
[6] 周鑫炎.基于Ajax的网络作业管理系统的设计[J]. 重庆工学院学报(自然科学),2008,22(9):132-135
[7] 张海藩.软件工程导论(第5版)[M].北京:清华大学出版社,2008
[8] 杨 磊,陈凌云.精通Eclipse Web开发—Java体系结构、工具、框架及整合应用[M].北京:人民邮电出版社,2006.10
[9] 郝玉龙,尹建平.JAVAEE Web开发实例精解[M].北京:清华大学出版社,北京交通大学出版社.2008.3
[10] 李绪成.Java EE5实用教程—基于Weblogic和Eclipse[M].北京:电子工业出版社,2007.2.
[11] 郭广军.刘安丰,阳西述.Java程序设计教程[M]. 武汉:武汉大学出版社,2008.7
[12] (美)梅茨克尔(Metsker,S.J. ). (美)韦克(Wake,W.C. ). Design Patterns in Java (2nd Edition) [M].北京:人民邮电出版社,2007.6.
[13] Abraham Silberschatz, Henry F.Korth, S.Sudarshan. Database System Concepts (Fifth Edition) [M]. 北京:高等教育出版社,2006.6
[14] Dava Crane, Eric Pascarelo,Darren James 著.AJAX实战.人民邮电出版社,2006.4
PAGE
_1349382839.vsd
�
电子商城后台�
商品信息管理�
商
品
信
息�
后台用户管理�
会员管理�
订单管理�
商品分类管理�
商
品
添
加�
分
类
信
息
用
户
信
息
会
员
信
息
订
单
信
息
密
码
信
息
_1349384773.vsd
�
�
前台
会员?�
信息浏览�
注册�
添加商品至购物车
提交定单�
登录�
是
否
商品评论�
修改购物车�
个人账户信息�
_1349385566.vsd
�
�
后台�
登录�
商品信息管理
权限�
系统维护
会员信息管理
定单信息管理
商品管理员
定单管理员
会员管理员
系统管理员
_1348997067.vsd
�
电子商城前台�
商品信息�
商
品
信
息
查
询�
商
品
信
息
显
示�
订单�
购物车�
会员信息�
会
员
信
息
修
改
会
员
登
录
会
员
注
册
购
物
车
商
修
改
购
物
车
商
品
删
除
购
物
车
商
品
添
加
订
单
删
除
订
单
修
改
订
单
提
交
商
品
评
价�