【SSH网上商城项目实战17】购物车基本功能的实现
转自:https://blog.csdn.net/eson_15/article/details/51418350
上一节我们将商品的详细页面做完了,并使用了Hibernate的二级缓存加载详细页面来提高系统的性能。这节我们开始做购物车部分。
1. 添加新的表
首先我们向数据库中添加几张表:用户表、订单状态表、订单表(购物车表)以及购物项表。用户表中存有用户的基本信息,订单状态表中主要存储订单的状态,比如已发货这种,订单表主要存储用户的信息和订单的状态,所以跟用户表和订单状态表关联,购物项表存储某个商品以及所属的订单,所以跟商品表和订单表相关联。具体的表信息见下面的sql语句:
1 /*============================*/
2 /* Table: 用户表结构 */
3 /*============================*/
4 create table user
5 (
6 /* 用户编号,自动增长 */
7 id int primary key not null auto_increment,
8 /* 用户登录名 */
9 login varchar(20),
10 /* 用户真实姓名 */
11 name varchar(20),
12 /* 用户登录密码 */
13 pass varchar(20),
14 /* 用户性别 */
15 sex varchar(20),
16 /* 用户电话 */
17 phone varchar(20),
18 /* 用户Email */
19 email varchar(20)
20 );
21
22 /*=============================*/
23 /* Table: 订单状态表结构 */
24 /*=============================*/
25 create table status
26 (
27 /* 状态编号,自动增长 */
28 id int primary key not null auto_increment,
29 /* 订单状态 */
30 status varchar(10)
31 );
32
33 /*=============================*/
34 /* Table: 购物车(订单)表结构 */
35 /*=============================*/
36 create table forder
37 (
38 /* 订单编号,自动增长 */
39 id int primary key not null auto_increment,
40 /* 收件人名字 */
41 name varchar(20),
42 /* 收件人电话 */
43 phone varchar(20),
44 /* 配送信息 */
45 remark varchar(20),
46 /* 下单日期 */
47 date timestamp default CURRENT_TIMESTAMP,
48 /* 订单总金额 */
49 total decimal(8,2),
50 /* 收件人邮编 */
51 post varchar(20),
52 /* 收件人邮编 */
53 address varchar(200),
54 /* 订单状态 */
55 sid int default 1,
56 /* 会员编号 */
57 uid int,
58 constraint sid_FK foreign key(sid) references status(id),
59 constraint uid_FK foreign key(uid) references user(id)
60 );
61
62 /*=============================*/
63 /* Table: 购物项表结构 */
64 /*=============================*/
65
66 create table sorder
67 (
68 /* 购物项编号,自动增长 */
69 id int primary key not null auto_increment,
70 /* 被购买商品的名称 */
71 name varchar(20),
72 /* 购买时商品的价格 */
73 price decimal(8,2),
74 /* 购买的数量 */
75 number int not null,
76 /* 所属商品编号 */
77 pid int,
78 /* 此订单项,所属的订单编号 */
79 fid int,
80 constraint pid_FK foreign key(pid) references product(id),
81 constraint fid_FK foreign key(fid) references forder(id)
82 );
然后我们将这些表通过逆向工程转换为POJO,具体不在赘述。
2. 购物车的后台逻辑
2.1 Service层的逻辑
当用户将某个商品加入购物车时,我们首先要通过商品的id获取该商品信息,然后将该商品添加到购物车中,在添加之前,我们首先得判断当前session中有没有购物车,如果没有的话,我们得先创建一个购物车,如果有,我们将当前的购物项添加到购物车里,在添加之前,需要先判断该购物项在购物车中是否已经存在了,如果存在了只需要增加相应的购物数量即可,如果不存在则添加,然后计算购物总价格,最后将购物车存到session中。整个流程见下面的示意图:
接下来我们来实现具体的逻辑,首先新建两个Service接口:SorderService和ForderService。SorderService中主要定义了两个方法:将用户添加的商品转换为购物项,然后将购物项添加到购物车;ForderService中主要定义了计算购物车总价格的方法,如下:
1 //SorderService接口
2 public interface SorderService extends BaseService<Sorder> {
3 //添加购物项,返回新的购物车
4 public Forder addSorder(Forder forder, Product product);
5 //把商品数据转化为购物项
6 public Sorder productToSorder(Product product);
7 }
8
9 //ForderService接口
10 public interface ForderService extends BaseService<Forder> {
11 //计算购物总价格
12 public double cluTotal(Forder forder);
13 }
然后我们具体实现这两个接口:
1 //SorderServiceImpl实现类
2 @Service("sorderService")
3 public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements
4 SorderService {
5
6 @Override
7 public Forder addSorder(Forder forder, Product product) {
8 boolean isHave = false; //用来标记有没有重复购物项
9 //拿到当前的购物项
10 Sorder sorder = productToSorder(product);
11 //判断当前购物项是否重复,如果重复,则添加数量即可
12 for(Sorder old : forder.getSorders()) {
13 if(old.getProduct().getId().equals(sorder.getProduct().getId())) {
14 //购物项有重复,添加数量即可
15 old.setNumber(old.getNumber() + sorder.getNumber());
16 isHave = true;
17 break;
18 }
19 }
20 //当前购物项在购物车中不存在,新添加即可
21 if(!isHave) {
22 forder.getSorders().add(sorder);
23 }
24 return forder;
25 }
26
27 @Override
28 public Sorder productToSorder(Product product) {
29 Sorder sorder = new Sorder();
30 sorder.setName(product.getName());
31 sorder.setNumber(1);
32 sorder.setPrice(product.getPrice());
33 sorder.setProduct(product);
34 return sorder;
35 }
36 }
37
38 //ForderServiceImpl实现类
39 @Service("forderService")
40 public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService {
41
42 @Override
43 public double cluTotal(Forder forder) {
44
45 double total = 0.0;
46 for(Sorder sorder : forder.getSorders()) {
47 total += sorder.getNumber() * sorder.getPrice();
48 }
49 return total;
50 }
51
52 }
然后我们需要将这两个bean注入到BaseAction中,供SorderAction使用:
1 @Controller("baseAction")
2 @Scope("prototype")
3 public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> {
4
5 //省略其他无关代码……
6
7 @Resource
8 protected ForderService forderService;
9 @Resource
10 protected SorderService sorderService;
11
12 }
好了,Service层的逻辑做完了,接下来准备做Action部分:
2.2 Action部分的逻辑
我们新建一个SorderAction,将上面的逻辑图上显示的流程走一遍即可完成添加购物车的逻辑了。代码如下:
1 @Controller
2 @Scope("prototype")
3 public class SorderAction extends BaseAction<Sorder> {
4 public String addSorder() {
5
6 //1. 根据product.id获取相应的商品数据
7 Product product = productService.get(model.getProduct().getId());
8
9 //2. 判断当前session是否有购物车,如果没有则创建
10 if(session.get("forder") == null) {
11 //创建新的购物车,存储到session中
12 session.put("forder", new Forder(new HashSet<Sorder>()));
13 }
14
15 //3. 把商品信息转化为sorder,并且添加到购物车中(判断购物项是否重复)
16 Forder forder = (Forder) session.get("forder");
17 forder = sorderService.addSorder(forder, product);
18
19 //4. 计算购物的总价格
20 forder.setTotal(forderService.cluTotal(forder));
21 //5. 把新的购物车存储到session中
22 session.put("forder", forder);
23 return "showCart";
24 }
25 }
配置一下struts.xml文件:
1 <action name="sorder_*" class="sorderAction" method="{1}">
2 <result name="showCart">/showCart.jsp</result>
3 </action>
然后跳转到购物车显示页面showCart.jsp,showCart.jsp中关于购物车部分的前台程序如下:
3. 前台链接的跳转
后台部分全部做完了,接下来将前台detail.jsp页面添加购物车的链接地址该成访问SorderAction即可:
这样就能正确跳转了,下面我们看一下购物车显示页面的具体效果:
这样我们购物车的基本功能就做完了,后面我们再对其做一些完善。
【SSH网上商城项目实战17】购物车基本功能的实现的更多相关文章
- 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示
转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...
- 【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布
转自:https://blog.csdn.net/wwww_com/article/details/54405355 前面陆陆续续的完成了网上商城的一些基本功能,虽然还有很多地方有待完善,但是不影响 ...
- 【SSH网上商城项目实战21】从Demo中看易宝支付的流程
转自: https://blog.csdn.net/eson_15/article/details/51447492 这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后, ...
- 【SSH网上商城项目实战30】项目总结
转自:https://blog.csdn.net/eson_15/article/details/51479994 0. 写在前面 项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了 ...
- 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2
转自:https://blog.csdn.net/eson_15/article/details/51277324 今天开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总 ...
- 【SSH网上商城项目实战30】项目总结(附源码下载地址)
项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们 ...
- 【SSH网上商城项目实战15】线程、定时器同步首页数据(类似于博客定期更新排名)
转自:https://blog.csdn.net/eson_15/article/details/51387378 上一节我们做完了首页UI界面,但是有个问题:如果我在后台添加了一个商品,那么我必须重 ...
- 【SSH网上商城项目实战25】使用java email给用户发送邮件
转自: https://blog.csdn.net/eson_15/article/details/51475046 当用户购买完商品后,我们应该向用户发送一封邮件,告诉他订单已生成之类的信息, ...
- 【SSH网上商城项目实战20】在线支付平台的介绍
转自:https://blog.csdn.net/eson_15/article/details/51441431 之前已经完成了首页的显示,用户添加购物车,确认订单等功能,下面就是支付功能的开发了. ...
随机推荐
- Comet OJ - Contest #0题解
传送门 菜爆了--总共只有一道题会做的--而且也没有短裙好难过 为啥必须得有手机才能注册账号啊喂--歧视么-- \(A\) 解方程 推一下柿子大概就是 \[x-\sqrt{n}=y+z+2\sqrt{ ...
- Python面向对象(构造方法)
day24 构造方法 特殊作用:在obj=classname()中1.创建对象,2.通过对象执行类中的一个特殊方法. class Bar: def __init__(self): ") de ...
- python基础知识梳理----3基本数据类型,int,bool,str ,for 循环,迭代
一:python的基本类型 1.int -----整数,主要进行数学运算 2.str -----字符串,可以保存少量数据,并进行相关操作, 3. bool ---布尔类型,判断真假 4.list ...
- 【C#】自定义新建一个DataTable(3列),循环3维矩形数组往其填充数据
从中可以了解DataTable的新增行和列;矩形多维数组循环机制;新建了DataTable DataTable dt = new DataTable(); DataColumn dc1 = new D ...
- js继承(自备水,这非常干货)
讲js继承之前,想一想什么是继承? 生活中有很多例子,比方说继承财产,继承女朋友的前男友的前女友 ヽ(ー_ー)ノ ,这些和js继承差不多,但是有一个不一样的地方,就是继承过后,原先的人就没有了,js继 ...
- Django中的Cookie--实现登录
Django中的Cookie--实现登录 Django Cookie Cookie Cookie 是什么 保存在浏览器端的键值对,让服务器提取有用的信息. 为什么要有 Cookie 因为HTTP请求 ...
- 修改hosts文件的脚本1.0
import sys IP_input = input("Please input IP:")DNS_input = input("Please input Domain ...
- python爬虫常用之Scrapy 中间件
一.概述 1.中间件的作用 在scrapy运行的整个过程中,对scrapy框架运行的某些步骤做一些适配自己项目的动作. 例如scrapy内置的HttpErrorMiddleware,可以在http请求 ...
- 服务器端控件同html控件的区别
●ASP.NET中共有几种类型的控件? 三种:1-asp.net控件(动态) 2-标准的html控件(静态) 3-标准的html控件加runat="server"属性(动态) 动态 ...
- 【转载】TableLayout表格布局详解
原文地址:http://www.cnblogs.com/manuosex/p/3584701.html 一.Tablelayout简介 Tablelayout类以行和列的形式对控件进行管理,每一行为一 ...