最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java商城項(xiàng)目實(shí)戰(zhàn)之購(gòu)物車(chē)功能實(shí)現(xiàn)

 更新時(shí)間:2020年04月20日 10:53:10   作者:xxssyyyyssxx  
這篇文章主要為大家詳細(xì)介紹了java商城項(xiàng)目實(shí)戰(zhàn)之購(gòu)物車(chē)功能實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)購(gòu)物車(chē)功能的具體代碼,供大家參考,具體內(nèi)容如下

1 需要實(shí)現(xiàn)

1、實(shí)現(xiàn)淘淘商城的購(gòu)物車(chē)功能

2 購(gòu)物車(chē)功能

2.1 功能說(shuō)明

1、商品加入購(gòu)物車(chē)時(shí),不是必須要求登錄。京東不需要登錄,淘寶需要登錄。各有好處。

2、計(jì)算購(gòu)物車(chē)中商品的總價(jià)。當(dāng)商品數(shù)量發(fā)生變化時(shí)需要重新計(jì)算。

3、用戶(hù)可以刪除購(gòu)物車(chē)中的商品。

4、用戶(hù)下單后,刪除購(gòu)物車(chē)的功能。

購(gòu)物車(chē)在用戶(hù)不登陸的情況下也可以使用購(gòu)物車(chē)。需要把購(gòu)物車(chē)的商品信息寫(xiě)入cookie中。所有對(duì)購(gòu)物車(chē)的操作都是操作cookie。有效 的降低數(shù)據(jù)庫(kù)的壓力。

缺點(diǎn):換一臺(tái)電腦后購(gòu)物車(chē)的商品不能同步。

實(shí)現(xiàn)的工程:taotao-protal中實(shí)現(xiàn)購(gòu)物車(chē)功能。只需要調(diào)用商品信息的服務(wù),除此之外不需要和其他系統(tǒng)交互。

2.2 功能分析

1、在用戶(hù)不登陸的清空下也可以使用購(gòu)物車(chē),那么就需要把購(gòu)物車(chē)信息放入cookie中。

2、可以把商品信息,存放到pojo中,然后序列化成json存入cookie中。

3、取商品信息可以從cookie中把json數(shù)據(jù)取出來(lái),然后轉(zhuǎn)換成java對(duì)象即可。

4、此功能只需要操作cookie不需要數(shù)據(jù)庫(kù)的支持,所以只需要在taotao-portal中實(shí)現(xiàn)即可。

5、購(gòu)物車(chē)分有四種動(dòng)作

a) 添加商品

b) 修改商品數(shù)量

c) 刪除購(gòu)物車(chē)中的商品

d) 展示購(gòu)物車(chē)商品列表

2.3 添加購(gòu)物車(chē)商品

在商品詳情頁(yè)面點(diǎn)擊“加入購(gòu)物車(chē)”按鈕提交一個(gè)請(qǐng)求吧商品id傳遞給Controller,Controller接收id,Controller調(diào)用Service根據(jù)商品id查詢(xún)商品基本信息。把商品寫(xiě)入cookie中,加入cookie之前先從cookie中把購(gòu)物車(chē)的商品取出來(lái)判斷當(dāng)前購(gòu)物車(chē)商品列表中是否有此商品,如果有數(shù)量加一,如果沒(méi)有添加一個(gè)商品,數(shù)量為1。展示給用戶(hù)購(gòu)物車(chē)列表。 

2.3.1 service

功能:接收一個(gè)商品id,數(shù)量(默認(rèn)為1),根據(jù)商品id查詢(xún)商品信息。調(diào)用taotao-rest的服務(wù)。把商品添加到購(gòu)物車(chē),先把購(gòu)物車(chē)商品列表取出來(lái),判斷列表中是否有此商品,如果有就增加數(shù)量就可以了。如果沒(méi)有把此商品添加到商品列表。返回添加成功Taotaoresult。

功能:

1、接收controller傳遞過(guò)來(lái)的商品id,根據(jù)商品id查詢(xún)商品信息。

2、從cookie中取出購(gòu)物車(chē)信息,轉(zhuǎn)換成商品pojo列表。

3、把商品信息添加到商品列表中。

參數(shù):

1、商品id

2、Request

3、response

返回值:

TaoTaoResult

@Service 
public class CartServiceImpl implements CartService { 
//服務(wù)url 
@Value("${REST_BASE_URL}") 
private String REST_BASE_URL; 
//商品服務(wù)url 
@Value("${ITEMS_ITEM_URL}") 
private String ITEMS_ITEM_URL; 
//COOKIE中購(gòu)物車(chē)商品對(duì)應(yīng)的key 
@Value("${CART_ITEMS_LIST_KEY}") 
private String CART_ITEMS_LIST_KEY; 
//購(gòu)物車(chē)cookie生存期 
@Value("${CART_ITEMS_EXPIRE_TIME}") 
private Integer CART_ITEMS_EXPIRE_TIME; 
/** 
 * 添加購(gòu)物車(chē)商品 
 * <p>Title: addItem</p> 
 * <p>Description: </p> 
 * @param itemId 
 * @param request 
 * @param response 
 * @return 
 * @see com.taotao.portal.service.CartService#addItem(java.lang.Long, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
 */ 
@Override 
public TaotaoResult addItem(Long itemId, HttpServletRequest request, HttpServletResponse response) { 
//根據(jù)商品id查詢(xún)商品信息 
Item item = getItemById(itemId); 
if (item == null) return TaotaoResult.build(400, "未查詢(xún)到該商品信息"); 
//取cookie中購(gòu)物車(chē)商品列表 
List<Item> cartItems = getItemListFromCookie(request); 
//判斷該商品是否存在于購(gòu)物車(chē)中 
boolean itemExists = false; 
for (Item i : cartItems) { 
if (i.getId().longValue() == itemId.longValue()) { 
//購(gòu)物車(chē)中有此商品 
i.setNum(i.getNum() + 1); 
itemExists = true; 
break; 
} 
} 
//如果商品不存在于購(gòu)物車(chē)則向購(gòu)物車(chē)商品列表中添加一個(gè)商品 
if (! itemExists) { 
//設(shè)置數(shù)量為1 
item.setNum(1); 
//把商品添加到購(gòu)物車(chē) 
cartItems.add(item); 
} 
//把購(gòu)物車(chē)信息寫(xiě)入cookie中 
CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(cartItems), CART_ITEMS_EXPIRE_TIME, true); 
return TaotaoResult.ok(cartItems); 
} 
private Item getItemById(Long itemId) { 
//根據(jù)商品id查詢(xún)商品信息 
String resultStr = HttpClientUtil.doGet(REST_BASE_URL + ITEMS_ITEM_URL + itemId); 
//轉(zhuǎn)換成taotaoResult 
TaotaoResult result = TaotaoResult.formatToPojo(resultStr, Item.class); 
//取商品信息 
Item item = null; 
if (result.getStatus() == 200) { 
item = (Item) result.getData(); 
} 
return item; 
} 
private List<Item> getItemListFromCookie(HttpServletRequest request) { 
//取cookie中購(gòu)物車(chē)商品列表 
String cartItemsStr = CookieUtils.getCookieValue(request, CART_ITEMS_LIST_KEY, true); 
//如果不為空那么就轉(zhuǎn)換成java對(duì)象 
List<Item> cartItems = null; 
if (!StringUtils.isBlank(cartItemsStr)) { 
cartItems = JsonUtils.jsonToList(cartItemsStr, Item.class); 
} else { 
cartItems = new ArrayList<>(); 
} 
return cartItems; 
} 
} 

2.3.2 商品pojo

商品pojo需要使用taotao-portal中的Item。此pojo在反序列化時(shí)會(huì)拋異常。需要做如下修改:

2.3.3 Controller

@Controller 
@RequestMapping("/cart") 
public class CartController { 
 
@Autowired 
private CartService cartService; 
@RequestMapping("/add/{itemId}") 
public String addItem(@PathVariable Long itemId, 
HttpServletRequest request, HttpServletResponse response, Model model) { 
//添加商品信息 
TaotaoResult result = cartService.addItem(itemId, request, response); 
//錯(cuò)誤信息 
if (result.getStatus() != 200) { 
model.addAttribute("message", result.getMsg()); 
return "error/exception"; 
} 
//把購(gòu)物車(chē)中的商品傳遞給頁(yè)面 
model.addAttribute("cartList", result.getData()); 
return "cart"; 
} 
} 

用戶(hù)點(diǎn)擊“我的購(gòu)物車(chē)”展示購(gòu)物車(chē)信息

2.4 展示購(gòu)物車(chē)商品

2.4.1 Service

/** 
 * 取購(gòu)物車(chē)列表 
 * <p> 
 * Title: getCartItemsList 
 * </p> 
 * <p> 
 * Description: 
 * </p> 
 * 
 * @return 
 * @see com.taotao.portal.service.CartService#getCartItemsList() 
 */ 
@Override 
public List<Item> getCartItemsList(HttpServletRequest request) { 
// 從cookie中取商品列表 
List<Item> itemsList = getItemListFromCookie(request); 
return itemsList; 
} 

2.4.2 Controller

@RequestMapping("/cart") 
public String showCart(HttpServletRequest request, Model mode) { 
//取購(gòu)物車(chē)信息 
List<Item> list = cartService.getCartItemsList(request); 
mode.addAttribute("cartList", list); 
return "cart"; 
} 

2.5 修改商品數(shù)量

當(dāng)點(diǎn)擊購(gòu)物車(chē)商品的“+”、“-”號(hào)時(shí)增加或減少商品數(shù)量。減少商品數(shù)量時(shí),如果數(shù)量為“1”則不繼續(xù)減少。

2.5.1 Service

/** 
 * 修改指定商品的數(shù)量 
 * <p>Title: changeItemNum</p> 
 * <p>Description: </p> 
 * @param itemId 
 * @param num 
 * @param request 
 * @param response 
 * @return 
 * @see com.taotao.portal.service.CartService#changeItemNum(long, int, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
 */ 
@Override 
public TaotaoResult changeItemNum(long itemId, int num, HttpServletRequest request, HttpServletResponse response) { 
//從cookie中取商品列表 
List<Item> list = getItemListFromCookie(request); 
//從商品列表中找到要修改數(shù)量的商品 
for (Item item : list) { 
if (item.getId() == itemId) { 
//找到商品,修改數(shù)量 
item.setNum(num); 
break; 
} 
} 
//把商品信息寫(xiě)入cookie 
CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(list), CART_ITEMS_EXPIRE_TIME, true); 
return TaotaoResult.ok(); 
} 

2.5.2 Controller

@RequestMapping("/update/num/{itemId}/{num}") 
@ResponseBody 
public TaotaoResult updateNumById(@PathVariable Long itemId, @PathVariable Integer num, 
HttpServletRequest request, HttpServletResponse response) { 
TaotaoResult result = cartService.changeItemNum(itemId, num, request, response); 
return result; 
} 

2.6 刪除購(gòu)物車(chē)商品

2.6.1 Service

/** 
 * 刪除購(gòu)物車(chē)中的商品 
 * <p> 
 * Title: deleteItem 
 * </p> 
 * <p> 
 * Description: 
 * </p> 
 * 
 * @param itemId 
 * @param request 
 * @param response 
 * @return 
 * @see com.taotao.portal.service.CartService#deleteItem(java.lang.Long, 
 * javax.servlet.http.HttpServletRequest, 
 * javax.servlet.http.HttpServletResponse) 
 */ 
@Override 
public List<Item> deleteItem(Long itemId, HttpServletRequest request, HttpServletResponse response) { 
List<Item> itemsList = getCartItemsList(request); 
// 找到購(gòu)物車(chē)中的商品,并刪除之 
for (Item item : itemsList) { 
if (item.getId().longValue() == itemId.longValue()) { 
itemsList.remove(item); 
break; 
} 
} 
// 更新cookie中的購(gòu)物車(chē)數(shù)據(jù) 
CookieUtils.setCookie(request, response, CART_ITEMS_LIST_KEY, JsonUtils.objectToJson(itemsList), CART_ITEMS_EXPIRE_TIME, true); 
return itemsList; 
} 

2.6.2 Controller

@RequestMapping("/delete/{itemId}") 
public String deleteItemById(@PathVariable Long itemId, 
HttpServletRequest request, HttpServletResponse response, 
Model model) { 
List<Item> list = cartService.deleteItem(itemId, request, response); 
model.addAttribute("cartList", list); 
return "cart"; 
} 

購(gòu)物車(chē)存在的問(wèn)題

1、更換設(shè)備購(gòu)物車(chē)商品不能同步

a) 不能把購(gòu)物車(chē)商品保存到數(shù)據(jù)庫(kù)

b) 要求用戶(hù)登錄才能同步信息

c) 可以把購(gòu)物車(chē)信息保存到redis中,key就是用戶(hù),value就是購(gòu)物車(chē)列表

d) 購(gòu)物車(chē)商品合并的問(wèn)題。

2、提交訂單后購(gòu)物車(chē)商品需要清空。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 多線程實(shí)例講解(一)

    Java 多線程實(shí)例講解(一)

    本文主要介紹Java 多線程的知識(shí),這里整理了詳細(xì)的資料及簡(jiǎn)單示例代碼有需要的小伙伴可以參考下
    2016-09-09
  • 關(guān)于Dubbo初始問(wèn)題

    關(guān)于Dubbo初始問(wèn)題

    這篇文章主要介紹了關(guān)于Dubbo初始問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java 字符串壓縮與解壓的開(kāi)發(fā)記錄

    Java 字符串壓縮與解壓的開(kāi)發(fā)記錄

    這篇文章主要介紹了Java 字符串壓縮與解壓的開(kāi)發(fā)記錄,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • MybatisX自定義模板方式

    MybatisX自定義模板方式

    本文介紹了如何使用MybatisX插件自定義VO對(duì)象模板,并提供了一個(gè)簡(jiǎn)單的示例,首先,文章展示了如何使用FreeMarker語(yǔ)法編寫(xiě)模板內(nèi)容,接著,詳細(xì)說(shuō)明了如何配置模板,并通過(guò)實(shí)際測(cè)試驗(yàn)證了模板的正確性,最后,作者鼓勵(lì)大家參考并支持腳本之家
    2025-01-01
  • 一文詳解Spring如何控制Bean注入的順序

    一文詳解Spring如何控制Bean注入的順序

    這篇文章主要為大家詳細(xì)介紹Spring如何控制Bean注入的順序,其中續(xù)注意的是在Bean上加@Order(xxx)是無(wú)法控制bean注入的順序的,需要的可以參考一下
    2022-06-06
  • 關(guān)于Spring啟動(dòng)時(shí)Context加載源碼分析

    關(guān)于Spring啟動(dòng)時(shí)Context加載源碼分析

    這篇文章通過(guò)源碼分析主要給大家介紹了關(guān)于Spring啟動(dòng)時(shí)Context加載的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • 詳解多線程及Runable 和Thread的區(qū)別

    詳解多線程及Runable 和Thread的區(qū)別

    這篇文章主要介紹了多線程及Runable 和Thread的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • idea2022創(chuàng)建javaweb項(xiàng)目步驟(超詳細(xì))

    idea2022創(chuàng)建javaweb項(xiàng)目步驟(超詳細(xì))

    本文主要介紹了idea2022創(chuàng)建javaweb項(xiàng)目步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解快速搭建Spring Boot+Spring MVC

    詳解快速搭建Spring Boot+Spring MVC

    本篇文章主要介紹了詳解快速搭建Spring Boot+Spring MVC,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot詳細(xì)講解yaml配置文件的用法

    SpringBoot詳細(xì)講解yaml配置文件的用法

    這篇文章主要介紹了SpringBoot中的yaml配置文件問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

奇台县| 霍城县| 株洲市| 兴宁市| 溧阳市| 四会市| 亚东县| 汝南县| 缙云县| 潼南县| 油尖旺区| 贡嘎县| 育儿| 嘉荫县| 株洲县| 东明县| 大理市| 黎平县| 清新县| 龙里县| 汤阴县| 伊金霍洛旗| 大化| 晋州市| 屯门区| 南溪县| 南充市| 谢通门县| 广西| 贵州省| 上犹县| 和平区| 阆中市| 耿马| 新宁县| 怀仁县| 江达县| 连江县| 滁州市| 商南县| 西乌珠穆沁旗|