java商城項(xiàng)目實(shí)戰(zhàn)之購(gòu)物車(chē)功能實(shí)現(xiàn)
本文實(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í)有所幫助,也希望大家多多支持腳本之家。
- JavaWeb購(gòu)物車(chē)項(xiàng)目開(kāi)發(fā)實(shí)戰(zhàn)指南
- JavaWeb后臺(tái)購(gòu)物車(chē)類(lèi)實(shí)現(xiàn)代碼詳解
- eclipse的web項(xiàng)目實(shí)現(xiàn)Javaweb購(gòu)物車(chē)的方法
- javaweb購(gòu)物車(chē)案列學(xué)習(xí)開(kāi)發(fā)
- java web開(kāi)發(fā)之購(gòu)物車(chē)功能實(shí)現(xiàn)示例代碼
- javaweb圖書(shū)商城設(shè)計(jì)之購(gòu)物車(chē)模塊(3)
- java web開(kāi)發(fā)之實(shí)現(xiàn)購(gòu)物車(chē)功能
- JAVAEE中用Session簡(jiǎn)單實(shí)現(xiàn)購(gòu)物車(chē)功能示例代碼
- java實(shí)現(xiàn)網(wǎng)上購(gòu)物車(chē)程序
- Java?web實(shí)現(xiàn)購(gòu)物車(chē)案例
相關(guān)文章
關(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
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

