上一節(jié)我們將商品的詳細頁面做完了,并使用了Hibernate的二級緩存加載詳細頁面來提高系統(tǒng)的性能,點擊文章查看:。這節(jié)我們開始做購物車部分。
1. 添加新的表
首先我們向數(shù)據(jù)庫中添加幾張表:用戶表、訂單狀態(tài)表、訂單表(購物車表)以及購物項表。用戶表中存有用戶的基本信息,訂單狀態(tài)表中主要存儲訂單的狀態(tài),比如已發(fā)貨這種,訂單表主要存儲用戶的信息和訂單的狀態(tài),所以跟用戶表和訂單狀態(tài)表關聯(lián),購物項表存儲某個商品以及所屬的訂單,所以跟商品表和訂單表相關聯(lián)。具體的表信息見下面的sql語句:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
/*============================*/ /* Table : 用戶表結(jié)構(gòu) */ /*============================*/ create table user ( /* 用戶編號,自動增長 */ id int primary key not null auto_increment, /* 用戶登錄名 */ login varchar (20), /* 用戶真實姓名 */ name varchar (20), /* 用戶登錄密碼 */ pass varchar (20), /* 用戶性別 */ sex varchar (20), /* 用戶電話 */ phone varchar (20), /* 用戶Email */ email varchar (20) ); /*=============================*/ /* Table : 訂單狀態(tài)表結(jié)構(gòu) */ /*=============================*/ create table status ( /* 狀態(tài)編號,自動增長 */ id int primary key not null auto_increment, /* 訂單狀態(tài) */ status varchar (10) ); /*=============================*/ /* Table : 購物車(訂單)表結(jié)構(gòu) */ /*=============================*/ create table forder ( /* 訂單編號,自動增長 */ id int primary key not null auto_increment, /* 收件人名字 */ name varchar (20), /* 收件人電話 */ phone varchar (20), /* 配送信息 */ remark varchar (20), /* 下單日期 */ date timestamp default CURRENT_TIMESTAMP , /* 訂單總金額 */ total decimal (8,2), /* 收件人郵編 */ post varchar (20), /* 收件人郵編 */ address varchar (200), /* 訂單狀態(tài) */ sid int default 1, /* 會員編號 */ uid int , constraint sid_FK foreign key (sid) references status(id), constraint uid_FK foreign key (uid) references user (id) ); /*=============================*/ /* Table : 購物項表結(jié)構(gòu) */ /*=============================*/ create table sorder ( /* 購物項編號,自動增長 */ id int primary key not null auto_increment, /* 被購買商品的名稱 */ name varchar (20), /* 購買時商品的價格 */ price decimal (8,2), /* 購買的數(shù)量 */ number int not null , /* 所屬商品編號 */ pid int , /* 此訂單項,所屬的訂單編號 */ fid int , constraint pid_FK foreign key (pid) references product(id), constraint fid_FK foreign key (fid) references forder(id) ); |
然后我們將這些表通過逆向工程轉(zhuǎn)換為POJO,具體不在贅述。
2. 購物車的后臺邏輯
2.1 Service層的邏輯
當用戶將某個商品加入購物車時,我們首先要通過商品的id獲取該商品信息,然后將該商品添加到購物車中,在添加之前,我們首先得判斷當前session中有沒有購物車,如果沒有的話,我們得先創(chuàng)建一個購物車,如果有,我們將當前的購物項添加到購物車里,在添加之前,需要先判斷該購物項在購物車中是否已經(jīng)存在了,如果存在了只需要增加相應的購物數(shù)量即可,如果不存在則添加,然后計算購物總價格,最后將購物車存到session中。整個流程見下面的示意圖:
接下來我們來實現(xiàn)具體的邏輯,首先新建兩個Service接口:SorderService和ForderService。SorderService中主要定義了兩個方法:將用戶添加的商品轉(zhuǎn)換為購物項,然后將購物項添加到購物車;ForderService中主要定義了計算購物車總價格的方法,如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
//SorderService接口 public interface SorderService extends BaseService<Sorder> { //添加購物項,返回新的購物車 public Forder addSorder(Forder forder, Product product); //把商品數(shù)據(jù)轉(zhuǎn)化為購物項 public Sorder productToSorder(Product product); } //ForderService接口 public interface ForderService extends BaseService<Forder> { //計算購物總價格 public double cluTotal(Forder forder); } |
然后我們具體實現(xiàn)這兩個接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
//SorderServiceImpl實現(xiàn)類 @Service ( "sorderService" ) public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements SorderService { @Override public Forder addSorder(Forder forder, Product product) { boolean isHave = false ; //用來標記有沒有重復購物項 //拿到當前的購物項 Sorder sorder = productToSorder(product); //判斷當前購物項是否重復,如果重復,則添加數(shù)量即可 for (Sorder old : forder.getSorders()) { if (old.getProduct().getId().equals(sorder.getProduct().getId())) { //購物項有重復,添加數(shù)量即可 old.setNumber(old.getNumber() + sorder.getNumber()); isHave = true ; break ; } } //當前購物項在購物車中不存在,新添加即可 if (!isHave) { forder.getSorders().add(sorder); } return forder; } @Override public Sorder productToSorder(Product product) { Sorder sorder = new Sorder(); sorder.setName(product.getName()); sorder.setNumber( 1 ); sorder.setPrice(product.getPrice()); sorder.setProduct(product); return sorder; } } //ForderServiceImpl實現(xiàn)類 @Service ( "forderService" ) public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService { @Override public double cluTotal(Forder forder) { double total = 0.0 ; for (Sorder sorder : forder.getSorders()) { total += sorder.getNumber() * sorder.getPrice(); } return total; } } |
然后我們需要將這兩個bean注入到BaseAction中,供SorderAction使用:
1
2
3
4
5
6
7
8
9
10
11
12
|
@Controller ( "baseAction" ) @Scope ( "prototype" ) public class BaseAction<T> extends ActionSupport implements RequestAware,SessionAware,ApplicationAware,ModelDriven<T> { //省略其他無關代碼…… @Resource protected ForderService forderService; @Resource protected SorderService sorderService; } |
好了,Service層的邏輯做完了,接下來準備做Action部分:
2.2 Action部分的邏輯
我們新建一個SorderAction,將上面的邏輯圖上顯示的流程走一遍即可完成添加購物車的邏輯了。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@Controller @Scope ( "prototype" ) public class SorderAction extends BaseAction<Sorder> { public String addSorder() { //1. 根據(jù)product.id獲取相應的商品數(shù)據(jù) Product product = productService.get(model.getProduct().getId()); //2. 判斷當前session是否有購物車,如果沒有則創(chuàng)建 if (session.get( "forder" ) == null ) { //創(chuàng)建新的購物車,存儲到session中 session.put( "forder" , new Forder( new HashSet<Sorder>())); } //3. 把商品信息轉(zhuǎn)化為sorder,并且添加到購物車中(判斷購物項是否重復) Forder forder = (Forder) session.get( "forder" ); forder = sorderService.addSorder(forder, product); //4. 計算購物的總價格 forder.setTotal(forderService.cluTotal(forder)); //5. 把新的購物車存儲到session中 session.put( "forder" , forder); return "showCart" ; } } |
配置一下struts.xml文件:
1
2
3
|
< action name = "sorder_*" class = "sorderAction" method = "{1}" > < result name = "showCart" >/showCart.jsp</ result > </ action > |
然后跳轉(zhuǎn)到購物車顯示頁面showCart.jsp,showCart.jsp中關于購物車部分的前臺程序如下:
3. 前臺鏈接的跳轉(zhuǎn)
后臺部分全部做完了,接下來將前臺detail.jsp頁面添加購物車的鏈接地址該成訪問SorderAction即可:
這樣就能正確跳轉(zhuǎn)了,下面我們看一下購物車顯示頁面的具體效果:
這樣我們購物車的基本功能就做完了,后面我們再對其做一些完善。
原文地址:http://blog.csdn.net/eson_15/article/details/51418350
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。