目录
第一章 前言 1
1.1 系统开发引言 1
第二章 相关开发工具介绍 1
2.1 Eclipse介绍 1
2.2 Oracle数据库 1
2.3 Tomcat服务器 2
2.4 Spring 介绍 3
2.5 SpringMVC 介绍 4
2.6 Mybatis 介绍 4
第三章 系统可行性分析 4
3.1 技术可行性分析 4
3.2 操作可行性分析 5
3.3 经济可行性分析 5
第四章 系统需求分析 5
4.1 功能需求分析 5
4.2 性能需求分析 5
4.3 可靠性分析 6
第五章 概要设计 6
5.1整体结构图 6
5.2功能模块分解 7
5.2.1 用户管理模块 7
5.2.2 分类管理模块 7
5.2.3 图书显示模块 7
5.2.4 购物车管理模块 8
5.2.5 订单管理模块 8
5.2.6 后台管理模块 8
第六章 数据库设计 8
6.1 数据库设计综述 8
6.2 bs_category表设计 9
6.3 bs_item表设计 9
6.4 bs_user表设计 10
6.5 bs_order表设计 10
6.6 bs_book表设计 11
6.7 bs_address表设计 11
6.8 数据库表创建 12
第七章 详细设计 16
7.1系统结构 16
7.2系统所使用的框架和技术列表 16
7.3 配置开发工具 17
7.3.1 对Oracle的配置 17
7.3.2 对Eclipse的配置 17
7.4 添加框架环境 17
7.5 配置Mybatis 17
7.6 项目中的目录结构与包结构 18
7.6.1 目录结构 18
7.6.2 包结构 18
7.7 前台用户部分 19
7.7.1 首页设计 19
7.7.2 用户模块 21
7.7.3图书模块 26
7.7.4 购物车模块 28
7.7.5 地址模块 32
7.7.6 订单模块 32
7.8 后台管理员部分 37
7.8.1后台登录 37
7.8.2 后台订单查询和筛选 38
7.8.3 后台图书修改和删除 40
7.8.4 后台展示管理员和普通用户并对用户授权和删除 42
致 谢 44
参考文献 44
基于SSM框架的快乐商城设计与实现
摘 要:随着互联网的发展,网上购物的用户越来越多,更多的人喜欢网上购物,网上购物方便,快捷。其中的图书商城也是网上购物的一部分,现在的人们的节奏越来越快,时间对于个人来说非常的重要,基于各种原因促使了网上购物的快速发展!
网上购物可以让人只需要一个电脑,就可以轻轻松松的买到自己想要购买的书,用户也可以通过图书介绍来了解图书的大概内容。网上购物商城的经营成本低,用户检索很方便,购物的时间大大缩短。
本系统主要以Jsp为工具,包括用户登录 ,注册,图书查找等功能。
关键词: java; spring; springMVC; Mybatis;
第一章前言
1.1 系统开发引言
近年来,随着计算机相关技术和网络技术的发展,计算机正在不断的改变人的生活方式,它的影响是潜移默化的。尤其是这几年,互联网发展的速度令人难以想象。人们更加希望通过网上购物所节约下来的时间去做更多的事情。于是网上商城就这样发展起来了,网上购物非常方便,支付非常快捷,足不出户就可以买到自己想要购买的东西。并且网上商城的物品更新速度很快,用户可以第一时间得到新品的详细信息。网上商城的成本比较的,这样商品也会随之而然的比较低,就会吸引到更多的人去购买。网上在线商城,就是为了将用户和商品之间架起一个快速的平台。
第二章相关开发工具介绍
2.1 Eclipse介绍
eclipse是一个开发了源代码,基于java的开发平台,是一个免费的编写java的开发工具。它本身只是一个框架和一些服务,它通过很多的插件来组成开发环境。它的页面简单,使用起来非常便捷,非常适合java开发的新手使用。它最初是属于IBM公司的一个软件,后来IBM公司宣布将其开放源码。它的设计理念就是,一切都可以是插件。它是一个较为强大的集成环境,集成了cvs,junit,ant,maven等。现在很多学生和公司依然会选择它,最重要的原因:它是免费的!
2.2 Oracle数据库
Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款数据库系统。它的使用范围非常广泛,可以用于大,中,小环境。它的使用率比较高,可靠性也很好,对于吞吐量大的也完全适应,保存数据的时间很长,具有完备的关系产品。安全性很高,但是价格比较贵,具有分布式的处理功能。
2.3 Tomcat服务器
Tomcat服务器是Apache提供的,它是一个开源并且免费的一个产品。它有Apache和Sun等公司共同开发完成的。因为有Sun公司的加入,所以最新的Servlet和JSP规范得以在Tomcat中表现出来。Tomcat技术比较先进,性能也比较稳,而且还是免费的。所以很多Java开发者都很喜欢用这个产品,部分软件开发公司也会使用该产品,可以说它是目前很流行的Web应用服务器了。
Tomcat是免费开放源代码的一个服务器,属于轻量级的,在一些小型或者中型系统中应用比较广泛,是开放Java网站的首选。对于一个初学者来说,Tomcat可以说是非常适合开发Javaweb了。
2.4 Spring介绍
Spring是一个开源的控制反转和面向切面的容器框架,它的应用范围非常的广,它的主要目的就是为了简化企业的开发。以前我们实例化对象是通过new来创建的,而使用了Spring之后就可以使用IOC控制反转由外部容器来负责创建对象,控制权就转移到外部容器。Spring的出现,降低了组件之间的耦合度。Spring还提供了很多其他的服务,例如事务的操作,持久化服务。
2.5 SpringMVC介绍
SpringMVC是Spring中的一个很小部分,可以说是Spring WEB模块的一个子模块,它包括了处理器映射器,处理器适配器,视图解析器等。SpringMVC实现了即用的MVC的核心概念。它分工明确,很容易扩展,并且拥有强大的数据验证,格式化和数据绑定。并且还支持目前非常流行的RESTful风格,和简单的文件上传,和基于注解的使用。
2.6 Mybatis介绍
Mybatis一开始是Apache公司的一个开源项目iBatis,后来迁移到了google code就改了名称为Mybatis,它是一个基于java的持久层的框架。Mybatis实现了接口的绑定,使用很方便。对象映射的效率非常的高。并且采用了OGNL的表达式来消除其他的元素。Mybatis简单易学,并且灵活,相较于Hibernate更简单一些,但是它需要编写SQL语句,并且它的二级缓存机制不是很好。
第三章系统可行性分析
3.1 技术可行性分析
系统采用当前流行的B/S结构,这种结构的最大优点就是软件的分发非常方便,不需要用户安装什么软件,只需要你的电脑里面有浏览器,就可以使用。
本系统主要依托于Spring框架,采用JAVA、JSP、Jquery、MySQL和MyBatis等技术开发,前台主要使用的是BootStrap技术,界面简单,美观。使用Mybatis来与数据库进行连接,可以对数据库进行增删改查等操作。Spring具有全面性和灵活性,还有他的功能性很强,再搭配数据库,非常的方便快捷。在WEB的开发项目中的技术可行性方面是完全可行的。
3.2 操作可行性分析
该系统可以运行在大多数的计算机中,由于是采用B/S架构开发,所以无需安装任何客户端,只需登录主页,就可以登录到网站首页。用户就可以进行登录,注册信息,浏览商品,对商品进行购买,或者加入到购物车。由于使用了BootStrap技术,网页设计非常清新,简洁,视觉效果比较好,操作也很简单,操作可行性很强。
3.3 经济可行性分析
本系统是可以运行于现在市场上出现的各种个人电脑,系统成本主要集中在系统的开发上,而且维护成本比较低,并且现在更多的人更愿意选择在网上购买来节省时间,所以网上购物的前途很客观。
第四章系统需求分析
正所谓万事开头难,如果不能开个好头,那么到项目的后期就会渐渐的暴露出一些致命的错误亦或者是意想不到的困难,所以要对项目进行细致的分析与筹划,才能降低失误。
4.1 功能需求分析
本系统开发是为了通过这个简单的商城,来了解JavaWeb工程师如何将知识运用起来,也可以为之后工作打下一个基础.
4.2 性能需求分析
性能需求是指系统一定要满足的定时约束或容量约束,通常包括速度、信息量的速率、主存的容量、和安全性等方面的需求。
对于系统来说,必须保证这个系统的稳定性。另外,系统的响应时间不能过长,应尽量减少用户访问时的等待时间。主存容量、磁盘容量应满足整个软件开发的需求等。
4.3 可靠性分析
开发出来的软件系统的稳定与否决定着软件开发的成败。因此提高系统的稳定性是每一个开发人员的必修课。系统可能运行一个月没问题,半年没问题,但不代表一年也没有问题,很有可能会出内存溢出,服务器的崩溃等异常错误。因此在编写代码时要十分注意内存的管理,避免内存的非法访问,该释放的资源要及时的释放。本系统在设计之初就将内存管理,事务管理,对象管理进行了合理的设计,尽量避免此类问题的产生。
第五章概要设计
5.1整体结构图
系统共有六大模块,分别为:用户管理,分类显示,图书显示,购物车管理,订单管理,后台管理。系统整体结构图与用例图,请参考下面两幅图。
图1 系统结构图
图2 系统用例图
5.2功能模块的分解
系统的主要模块有:用户管理模块,图书分类显示模块,图书显示模块,购物车管理模块,订单管理模块,后台管理模块。
5.2.1 用户管理模块
当用户登录到首页时,就可以对商品进行在线预览,对于未注册用户,系统应该提供注册功能。对于已经进行注册过的用户,用户可以进行登录、退出、修改密码等操作;
5.2.2 分类显示模块
对于所有的普通用户来说,都可以进行对商城内的书籍浏览,而图书需要进行分类显示,以方便用户的浏览与查询。
5.2.3 图书显示模块
对于具体图书的显示,对于用户,可以通过书名的来进行模糊搜索图书、查看该图书的详细内容和简介等;
5.2.4 购物车管理模块
用户可以在查看图书的过程中向购物车中添加图书,并且也可以修改购物车中图书的数量、也可以删除购物车中的图书,还可以查看我的购物车等;
5.2.5 订单管理模块
将商品添加到购物车之后,可以通过点击购买来生成订单,也可以查看我的订单,删除订单,也可以查看订单的具体信息。
5.2.6 后台管理模块
后台管理功能,可以查看订单,查看图书信息,修改图书信息,添加用户和分配权限。
第六章数据库设计
6.1 数据库设计综述
信息系统的主要的目的是通过大量的数据获得所需要的信息,这就要求系统本身能够存储和管理大量的数据,而这一功能的实现必须借助大型数据库系统。
整个系统共有6张数据表。所有的表中的字符集都是utf-8,这样就不会在页面中出现乱码问题。
由于系统采用Mybatis来完成对数据库的操作,而Mybatis是使用对象来进行数据的管理和操作。下图为主要实体类之间的E-R关系图。
图3 主要实体类之间的E-R关系图
6.2 bs_category表设计
Bs_category(id,name)表是用来存储分类信息。字段Id为主键,name为分类的名称。具体字段设置参考表1。
表1 bs_category
列名 数据类型 允许空
id NUMBER(7) No
name VARCHAR2(20) no
6.3 bs_item表设计
Bs_item(id,count,price,order_id,logo,book_id)用来存储订单明细表。具体字段设置参考表2。
表2 bs_item
列名 数据类型 允许空
id NUMBER(7) no
count NUMBER(7)
price NUMBER(7,2)
order_id NUMBER(7)
logo NUMBER(7)
book_id NUMBER(7)
6.4 bs_user表设计
Bs_user(id,username,realname,password,gender,phone,email,company,state,logo,img_path)。具体字段设置参考表3。
表3 bs_user
列名 数据类型 允许空
id NUMBER(7) no
username VARCHAR2(20 BYTE)
realname VARCHAR2(20 BYTE)
password VARCHAR2(20 BYTE)
gender VARCHAR2(20 BYTE)
phone VARCHAR2(20 BYTE)
email VARCHAR2(20 BYTE)
company VARCHAR2(20 BYTE)
state NUMBER(3)
logo NUMBER(3)
img_path VARCHAR2(20 BYTE)
6.5 bs_order表设计
Bs_order(id,orderNo,createdate,orderstatus,total,user_id,logo,address_id),具体字段设置参考表4。
表4 bs_order
列名 数据类型 允许空
id NUMBER(7) no
orderNo VARCHAR2(20 BYTE)
createdate DATE
orderstatus VARCHAR2(20 BYTE)
total NUMBER(7,2)
user_id NUMBER(7)
logo NUMBER(7)
address_id NUMBER(7)
6.6 bs_book表设计
Bs_book(id,bookname,author,publish,publishdate,price,instrduce,imgurl,category_id,logo,moremes)。具体字段设置参考下表。
表5 bs_book
列名 数据类型 允许空
id NUMBER(7) no
bookname VARCHAR2(255 BYTE)
author VARCHAR2(255 BYTE)
publish VARCHAR2(255 BYTE)
publishdate DATE
price NUMBER(7,2)
instrduce VARCHAR2(255 BYTE)
imgurl VARCHAR2(255 BYTE)
category_id VARCHAR2(255 BYTE)
logo NUMBER(7)
moremes VARCHAR2(255 BYTE)
6.7 bs_address表设计
Bs_address(id,province,city,area,detail,peceiver,tel,code,isdefault,user_id,logo)具体字段设置参考下表。
表6 bs_address
列名 数据类型 允许空
id NUMBER(7) no
province VARCHAR2(255 BYTE)
city VARCHAR2(255 BYTE)
area VARCHAR2(255 BYTE)
detail VARCHAR2(255 BYTE)
peceiver VARCHAR2(255 BYTE)
tel VARCHAR2(255 BYTE)
code VARCHAR2(255 BYTE)
isdefault NUMBER(10)
user_id NUMBER(10)
logo NUMBER(10)
6.8 数据库表创建
用户表创建
DROP TABLE “BS_USER”;
CREATE TABLE “BS_USER” (
“ID” NUMBER(7) NOT NULL ,
“USERNAME” VARCHAR2(20 BYTE) NOT NULL ,
“REALNAME” VARCHAR2(20 BYTE) NOT NULL ,
“PASSWORD” VARCHAR2(20 BYTE) NOT NULL ,
“GENDER” VARCHAR2(2 BYTE) NULL ,
“PHONE” VARCHAR2(255 BYTE) NULL ,
“EMAIL” VARCHAR2(255 BYTE) NULL ,
“COMPANY” VARCHAR2(255 BYTE) NULL ,
“STATE” NUMBER(2) NULL ,
“LOGO” NUMBER(3) NULL ,
“IMG_PATH” VARCHAR2(255 BYTE) NULL
)
LOGGING
NOCOMPRESS
NOCACHE
;
drop sequence bs_user_id;
create sequence bs_user_id increment by 1 start with 1 ;
图书分类表创建
DROP TABLE “BS_CATEGORY”;
CREATE TABLE “BS_CATEGORY” (
“ID” NUMBER(7) NOT NULL ,
“NAME” VARCHAR2(20 BYTE) NOT NULL
)
LOGGING
NOCOMPRESS
NOCACHE
;
drop sequence bs_category_id;
create sequence bs_category_id increment by 1 start with 1 ;
图书表创建
DROP TABLE “BS_BOOK”;
CREATE TABLE “BS_BOOK” (
“ID” NUMBER(7) NOT NULL ,
“BOOKNAME” VARCHAR2(255 BYTE) NOT NULL ,
“AUTHOR” VARCHAR2(255 BYTE) NOT NULL ,
“PUBLISH” VARCHAR2(255 BYTE) NULL ,
“PUBLISHDATE” DATE NULL ,
“PRICE” NUMBER(7,2) NULL ,
“INSTRDUCE” VARCHAR2(255 BYTE) NULL ,
“IMGURL” VARCHAR2(255 BYTE) NULL ,
“CATEGORY_ID” VARCHAR2(255 BYTE) NULL ,
“LOGO” NUMBER(3) NULL ,
“MOREMES” VARCHAR2(255 BYTE) NULL
)
LOGGING
NOCOMPRESS
NOCACHE
;
create sequence bs_book_id increment by 1 start with 1 ;
地址表创建
DROP TABLE “BS_ADDRESS”;
CREATE TABLE “BS_ADDRESS” (
“ID” NUMBER(7) NOT NULL ,
“PROVICE” VARCHAR2(255 BYTE) NULL ,
“CITY” VARCHAR2(255 BYTE) NULL ,
“AREA” VARCHAR2(255 BYTE) NULL ,
“DETAIL” VARCHAR2(255 BYTE) NULL ,
“PECEIVER” VARCHAR2(255 BYTE) NULL ,
“TEL” VARCHAR2(255 BYTE) NULL ,
“CODE” VARCHAR2(255 BYTE) NULL ,
“ISDEFAULT” NUMBER(10) NULL ,
“USER_ID” NUMBER(7) NULL ,
“LOGO” NUMBER(3) NULL
)
LOGGING
NOCOMPRESS
NOCACHE
;
create sequence bs_address_id increment by 1 start with 1 ;
订单表创建
DROP TABLE “BS_ORDER”;
CREATE TABLE “BS_ORDER” (
“ID” NUMBER(7) NOT NULL ,
“ORDERNO” VARCHAR2(255 BYTE) NULL ,
“CREATEDATE” DATE NULL ,
“ORDERSTATUS” VARCHAR2(255 BYTE) NULL ,
“TOTAL” NUMBER(7,2) NULL ,
“USER_ID” NUMBER(7) NULL ,
“LOGO” NUMBER(3) NULL ,
“ADDRESS_ID” NUMBER(7) NULL
)
LOGGING
NOCOMPRESS
NOCACHE
;
create sequence bs_order_id increment by 1 start with 1 ;
订单明细表创建
DROP TABLE “BS_ITEM”;
CREATE TABLE “BS_ITEM” (
“ID” NUMBER(7) NOT NULL ,
“COUNT” NUMBER(7) NULL ,
“PRICE” NUMBER(7,2) NULL ,
“ORDER_ID” NUMBER(7) NULL ,
“LOGO” NUMBER(3) NULL ,
“BOOK_ID” NUMBER(7) NULL
)
LOGGING
NOCOMPRESS
NOCACHE
;
create sequence bs_item_id increment by 1 start with 1 ;
第七章详细设计
7.1系统结构
J2EE项目一般使用3层结构,即显示层,业务逻辑层和持久层。利用Spring,SpringMVC和Mybatis,我们可以快速的实现业务逻辑层和持久层。此分层可以保证分工明确,代码结构清晰可见。视图层调用Service层,而Service层调用Dao层,Dao层再对数据库进行一系列操作,这也是常见的分层结构。如下图所示。
图4 常见的分层结构及使用的技术
7.2系统所使用的框架和技术列表
表7 使用的框架与技术
编号 工具 版本 说明
- Spring 4.1.4
- SpringMVC 4.1.4
- Mybatis 3.4.5 实现持久化操作
- BootStrap 前端
- Maven
7.3 配置开发工具
7.3.1 对Oracle的配置
对于Oracle而言并没有太多东西去配置,只要注意在创建数据库时注意编码问题即可。创建数据库的sql语句如下:create database cols default character set utf8。
7.3.2 对Eclipse的配置
1.设置工程的默认编码为UTF-8。
2.配置JSP的默认编码为utf-8。
3.配置JavaScript的默认编码为utf-8。
7.4 添加框架环境
使用maven来对jar包的版本进行管理,添加junit, Spring, SpringMVC,
Mybatis, log4j, ojdbc6等依赖。
7.5 配置Mybatis
修改mybatis-config.xml中的数据库连接信息。并在mybatis-config.xml中做如下配置:
图5.mybatis配置文件
7.6 项目中的目录结构与包结构
7.6.1 目录结构如下图
图6.目录结构
7.6.2 包结构
表8 系统包结构
包名 说明
com.book.converter 转换器
com.book.entity 实体层
com.book.exception 异常类
com.book.mapper Dao层
com.book.service Service接口
com.book.service.impl Service的实现类
com.book.controller 控制层
7.7 前台普通用户部分
该系统的前台部分是提供给用户浏览、选购商品,一个好的网站的前台部分必须简洁,易操作。因此,前台的设计主要把握3点:简明扼要、条理清晰、层次分明。
7.7.1 首页设计
前台部分采用bootstrap框架,外观简单,大方。首页包括登录,注册,商品展示部分。
图7.前端首页展示
上半部分主要有登录,注册和搜索图书等按钮,中间部分是轮播图,下半部分是图书分类的展示。
核心代码如下:
<jsp:include page=“/WEB-INF/jsp/top/top.jsp”></jsp:include>
精选图书
推荐图书
特价图书
<jsp:include page=“/WEB-INF/jsp/top/bottom.jsp”></jsp:include>
</div>
7.7.2 用户模块
用户模块主要实现用户注册、用户登录、修改当前用户密码、以及退出等功能。
用户部分都是用了Ajax异步请求,进行用户的查询。
(1)用户注册
图8.用户注册
public String regUser(User user){
user.setImg_path(“company.jpg”);
userService.register(user);
return “redirect:listAll”;
}
前台将注册信息提交给后台,后台调用service的register方法来进行注册。
(2)用户登录
图9:用户登录
通过前台将用户名和密码传给后台,后台进行验证来查看数据库中是否存在该用户。
public String userLogin(User user, HttpSession session, String cookie, HttpServletResponse response){
Cookie userCookie = null;Cookie pwdCookie = null;if(null != cookie && cookie.equals("f")){userCookie = new Cookie("userCookie", user.getUserName());pwdCookie = new Cookie("pwdCookie", user.getPassword());}else{userCookie = new Cookie("userCookie", "");pwdCookie = new Cookie("pwdCookie", "");}userCookie.setMaxAge(60*60*24*30);userCookie.setPath("/");pwdCookie.setMaxAge(60*60*24*30);pwdCookie.setPath("/");response.addCookie(userCookie);response.addCookie(pwdCookie);User user1 = userService.login(user.getUserName());if(null!=user1){if(user1.getPassword().equals(user.getPassword())){session.setAttribute("loginUser",user1);return "redirect:userLoginView";}else{return "redirect:listAll";}}else{return "redirect:listAll";}
}
(3)修改当前用户密码
图10:用户信息修改
用户将修改的信息提交之后,后台进行处理。
public String updateUserSubmit(User user,MultipartFile multipartFile,HttpSession session){
String newFileName = null;
if(multipartFile.getOriginalFilename() != null &&
multipartFile.getOriginalFilename().length() > 0 ){
String fileName = multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf("."));System.out.println(fileName);newFileName = UUID.randomUUID() + fileName;File file = new File("src/main/webapp/images/head/"+ newFileName);try {multipartFile.transferTo(file);} catch (IOException e) {e.printStackTrace();}user.setImg_path(newFileName);}else{user.setImg_path(null);}session.setAttribute("user_head_img",newFileName);userService.updateUser(user);return "redirect:listAll";
}
(4)退出登录
图11.退出登录
用户直接点击退出登录,后台直接将用户的session移除,并直接跳转到首页。
7.7.3 图书模块
(1)图书列表
图12.图书列表
当进入商城首页时,会查询图书列表。
public String getAllBookList() {
return “book/index”;
}
(2)搜索图书
图13.图书搜索
模糊查询,只要输入书的某一个字,数据就会传到后台,后台就会链接数据库进行查询。
public String findByLikeName(@RequestParam(defaultValue = “12”) Integer pageSize,
@RequestParam(defaultValue = “1”) Integer pageNow,
String likeName,Model model){
PageBean bookPageBean = bookService.selectBySearchName(pageNow,pageSize,likeName);
model.addAttribute(“pageBean”,bookPageBean);
return “book/page/pageData3”;
}
(3)图书详情
图14.图书详情
当点击某一个书的详情链接之后,就会将该书的id传到后台,后台对该书进行查找,并将信息返回给前台。
public String getBookDetails(Integer id,Model model){
Book book = bookService.selectById(id);
model.addAttribute(“book”, book);
return “book/details”;
}
7.7.4购物车
图15购物车页面
(1)添加购物车
点击商品详情之后,可以选择数量,然后将商品加入购物车。
public String addBookToCart(HttpServletRequest request, @RequestParam(value = “bookId”) Integer id, Integer count){
HttpSession session = request.getSession();
if (session.getAttribute(“map”) == null) {
map = new HashMap<>();} else {map = (Map<Integer, OrderItem>) session.getAttribute("map");}Book cartBook = bookService.selectById(id);if(null!=map && map.size()>0){Set<Map.Entry<Integer, OrderItem>> items = map.entrySet();Integer counts = 0;for (Map.Entry<Integer, OrderItem> e : items) {counts++;if (e.getKey() == (cartBook.getId()) ) {OrderItem orderItem1 = e.getValue();orderItem1.setCount(orderItem1.getCount()+count);e.setValue(orderItem1);break;} else if (e.getKey() != cartBook.getId() && counts == items.size()) {OrderItem orderItem = new OrderItem();orderItem.setBook(cartBook);orderItem.setCount(count);map.put(cartBook.getId(), orderItem);}}}else{OrderItem orderItem = new OrderItem();orderItem.setBook(cartBook);orderItem.setCount(count);map.put(cartBook.getId(), orderItem);}session.setAttribute("map", map);return "redirect:listAllCart";
}
(2)修改购物车数量
在购物车页面,点击添加或减少按钮之后,就会对购物车数量进行修改,该处使用了Ajax的异步处理。
public void updateCart(HttpServletRequest request, HttpServletResponse response, Integer bookId, Integer count){
System.out.println(bookId+“----->”+count);
HttpSession session = request.getSession();
Double zong = 0.0;
map = (Map<Integer, OrderItem>) session.getAttribute(“map”);
Set<Map.Entry<Integer,OrderItem>> entrie = map.entrySet();
for (Map.Entry<Integer, OrderItem> e : entrie) {
if(e.getKey()==Integer.valueOf(bookId)){
e.getValue().setCount(Integer.valueOf(count));
}
zong +=e.getValue().getPrice();
}
session.setAttribute(“map”, map);
try {
response.getWriter().print(zong);
} catch (IOException e) {
e.printStackTrace();
}
}
(3)删除购物车商品
选中某个商品之后,点击删除按钮,就可以删除某个商品。
public void deleteCart(String id,HttpServletRequest request,HttpServletResponse response){
HttpSession session = request.getSession();
if(session.getAttribute("map") == null){try {response.getWriter().print("error");} catch (IOException e) {e.printStackTrace();}}else{map = (Map<Integer, OrderItem>) session.getAttribute("map");for (String s : id.split(":")) {map.remove(Integer.valueOf(s));}session.setAttribute("map", map);try {response.getWriter().print("success");} catch (IOException e) {e.printStackTrace();}}
}
7.7.5地址模块
(1)添加地址
点击添加地址按钮之后,就可以填写地址,然后选中提交之后,就会将数据传给后台。
图16.地址显示
图17.添加地址
7.7.6订单模块
图18.订单模块
(1)添加订单
点击购物车的提交按钮之后,前台就会将数据发送到后台,后台就会将信息写入到数据库中,就会跳转到订单页面。
public String saveOrder(HttpSession session,String address){
System.out.println(address);
User loginUser = (User) session.getAttribute(“loginUser”);
Map<Integer,OrderItem> orderItemMap = (Map<Integer, OrderItem>) session.getAttribute(“map”);
Set<Map.Entry<Integer,OrderItem>> set = orderItemMap.entrySet();
orderService.save(orderItemMap,loginUser,Integer.valueOf(address));
String ids = "";for (Map.Entry<Integer, OrderItem> en : set) {ids+=en.getKey()+";";}if(null!=ids&&ids.length()>0){for(String s:ids.split(";")){orderItemMap.remove(Integer.valueOf(s));}}return "redirect:myOrder";
}
(2)获取订单明细
点击订单明细按钮,就会查询到该订单的具体信息,联系人信息,订单信息等。
public String getAllOrderByUser(HttpSession session,Model model,
@RequestParam(defaultValue = “1”) Integer pageNow,
@RequestParam(defaultValue = “4”) Integer pageSize,
String likeOrder,
String startDate,
String endDate){
PageBean orderPageBean = new PageBean<>();
User user = (User) session.getAttribute("loginUser");if(null != likeOrder && likeOrder.length() > 0 ){List<Order> orderList = orderService.searchOrderByOrderNo(likeOrder);orderPageBean.setPageDates(orderList);}else if(null != startDate && startDate.length() > 0 && null != endDate && endDate.length() > 0 ){orderPageBean = orderService.searchOrderByDate(user,startDate,endDate,pageNow,pageSize);}else{orderPageBean = orderService.queryByPage(user,pageNow,pageSize);}model.addAttribute("orderList",orderPageBean);return "order/page/orderPageData";
}
(3)删除订单
选择某一个订单之后,点击删除按钮,就可以删除该订单。
public String deleteOrderById(String ids){
if(null != ids && ids.length() > 0){
for(String s:ids.split(“;”)){
Order deleOrder = orderService.findById(Integer.valueOf(s));
orderService.delete(deleOrder);
}
}
return “redirect:myOrder”;
}
(4)根据条件查询订单
在查询条件框中选择需要查询的条件之后,点击查询,就会将数据传到后台,后台就会根据条件,进行查询,并将结果返回到前台。
public String getAllOrderByUser(HttpSession session,Model model,
@RequestParam(defaultValue = “1”) Integer pageNow,
@RequestParam(defaultValue = “4”) Integer pageSize,
String likeOrder,
String startDate,
String endDate){
PageBean orderPageBean = new PageBean<>();
User user = (User) session.getAttribute("loginUser");if(null != likeOrder && likeOrder.length() > 0 ){List<Order> orderList = orderService.searchOrderByOrderNo(likeOrder);orderPageBean.setPageDates(orderList);}else if(null != startDate && startDate.length() > 0 && null != endDate && endDate.length() > 0 ){orderPageBean = orderService.searchOrderByDate(user,startDate,endDate,pageNow,pageSize);}else{orderPageBean = orderService.queryByPage(user,pageNow,pageSize);}model.addAttribute("orderList",orderPageBean);return "order/page/orderPageData";
}
7.8后台管理员部分
7.8.1后台登录
图19.后台登录
管理员可以输入后台地址,然后输入用户名和密码进行登录,前台会将数据传送到后台,后台得到数据之后会进行验证。
public String checkAdmin(User user){
User user1 = userService.login(user.getUserName());
if(null!=user1 && user1.getState()==1){
if(null!=user.getPassword()){
if(user.getPassword().equals(user1.getPassword()) && user1.getState()==1){
return “true”;
}
}
return “success”;
}else{
return “error”;
}
}
public String adminLogin(String userName,String password, HttpServletRequest request){HttpSession session = request.getSession();User user1 = userService.login(userName);if(null!=user1 && user1.getPassword().equals(password) && user1.getState()==1){session.setAttribute("loginUser",user1);return "book/admin/book/adminListBook";}return "";
}
7.8.2后台订单查询和筛选
图20后台订单
点击登录以后就会查询出所有订单,并且可以根据地理位置进行搜索。
public String listAllOrder(@RequestParam(defaultValue = “1”) Integer pageNow,@RequestParam(defaultValue = “8”) Integer pageSize, Model model){
PageBean pageBean = orderService.queryByPage(null,pageNow,pageSize);
model.addAttribute(“orderPageBean”,pageBean);
return “book/admin/page/OrderPageData”;
}
public String listAllOrderByProvince(String province,String area,String city,String select,@RequestParam(defaultValue = "8") Integer pageSize,@RequestParam(defaultValue = "1") Integer pageNow,Model model){switch (select){case "zero":province = null;area = null;city = null;break;case "one":area = null;city = null;break;case "two":city = null;break;}PageBean<Order> orderPageBean = orderService.searchOrderByAddress(province,city,area,pageNow,pageSize);model.addAttribute("orderPageBean",orderPageBean);return "book/admin/page/OrderPageData";
}
7.8.3后台图书修改和删除
图21.后台图书展示
图22.后台图书修改
通过点击图书修改按钮之后,就可以对图书进行修改,修改完成之后,提交数据,就会将信息修改,并跳转到后台展示页面。也可以直接选择图书进行删除。
public String getUpdateAdminBookSubmit(Book book,MultipartFile multipartFile)throws Exception{
System.out.println(multipartFile.getOriginalFilename());
if(multipartFile.getOriginalFilename() !=null &&
multipartFile.getOriginalFilename().length() > 0 ){
book.setImgurl(multipartFile.getOriginalFilename());
}else{
book.setImgurl(null);
}
bookService.updateBook(book);
return “book/admin/book/adminListBook”;
}
public String deleteAdminBook(@PathVariable(value = "id") Integer id){Book book = bookService.selectById(id);if(null != book){bookService.deleteBook(book);}return "book/admin/book/adminListBook";
}
7.8.4后台展示管理员和普通用户并对用户授权与删除
图23.用户和管理员展示
图24.修改用户并授权
管理员可以对用户账号进行信息的修改和对普通用户授予管理员权限,管理员也可以删除用户的账号。
public String updateUserSubmit(User user){
userService.updateUser(user);
return “book/admin/book/adminListBook”;
}
public String deleteUser(Integer user_id){
userService.deleteUser(user_id);
return “book/admin/book/adminListBook”;
致 谢
通过这次独立开发这个网上商城系统,使我更加全面的掌握java的开发,在开发过程中我的能力得到了很大的提升。使我对Spring,SpringMVC和Mybatis有了更多的了解和掌握,让我进一步的了解了MVC设计模式的思想,对分层也有更深刻的了解。
在开发的过程中,我明白了,要开发一个好的产品一定要做好前期的设计,要考虑的尽量详细周到,这样后期的制作就会少走很多的弯路,一个好的分析和设计是成功的很重要因素。在开发之前,做好系统分析,然后设计好数据库,写一些详细的开发文档和画一些流程图。然后才是进行代码的编写,这要心中就会有底气了,做到有条不紊。
我觉得在开发过程中遇到困难并不可怕,因为我们不是万能的,只有不断地遇到难题,想办法解决它,就会使自己的能力得到很大的提升,我们在以后的工作中也是一样的,就是在遇到困难和解决困难中不断地成长。
系统不免有错误和待改进之处,真诚欢迎各位师长、同行提出宝贵意见
参考文献
[1] 黄华. 框架技术在Web系统开发中的应用 [J]. 微机发展,2005(05)
[2] 湛宁,吕争. Spring框架在J2EE中的应用[J]. 科技信息(科学教研,2008(04)
[3] 沈哲,揭金良. 基于Ajax技术的J2EE项目的设计与实现[J]. 铁路计算机应用, 2008(12)
[4] 刘传文. Ajax技术在J2EE框架中的应用[J]. 重庆工商大学学报(自然科学版), 2008(04)
[5] 张惠芬. JavaScript的理论分析及其应用[J]. 衡水学院学报,2006(01)
[6] 孙卫琴,李洪成.Tomcat与JSP Web开发技术详解[M].电子工业出版社,2003:1-205.
[7] 陈志泊.数据库原理及应用教程[M].北京:人民邮电出版社,2002.
[8] Brooks Terrence A. Web search: how the Web has changed information retrieval[J]. Information Research: an international electronic journal, 2003, 8(3).
[9] João M. B. Cavalcanti, David Robertson. Web Site Synthesis Based on Computational Logic[J]. Knowledge and Information Systems, 2003, 5(3).
[10] Mario Latendresse, Peter D Karp. Web-Based Metabolic Network Visualization with a Zooming User Interface[J]. BMC Bioinformatics, 2011, 12(1).
[11] Yuan-Fang Li, Paramjit K. Das, David L. Dowe. Two decades of Web application testing—A survey of recent advances[J]. Information Systems, 2014, 43.