java商城項(xiàng)目實(shí)戰(zhàn)之購物車功能實(shí)現(xiàn)
本文實(shí)例為大家分享了java實(shí)現(xiàn)購物車功能的具體代碼,供大家參考,具體內(nèi)容如下
1 需要實(shí)現(xiàn)
1、實(shí)現(xiàn)淘淘商城的購物車功能
2 購物車功能
2.1 功能說明
1、商品加入購物車時(shí),不是必須要求登錄。京東不需要登錄,淘寶需要登錄。各有好處。
2、計(jì)算購物車中商品的總價(jià)。當(dāng)商品數(shù)量發(fā)生變化時(shí)需要重新計(jì)算。
3、用戶可以刪除購物車中的商品。
4、用戶下單后,刪除購物車的功能。
購物車在用戶不登陸的情況下也可以使用購物車。需要把購物車的商品信息寫入cookie中。所有對(duì)購物車的操作都是操作cookie。有效 的降低數(shù)據(jù)庫的壓力。
缺點(diǎn):換一臺(tái)電腦后購物車的商品不能同步。
實(shí)現(xiàn)的工程:taotao-protal中實(shí)現(xiàn)購物車功能。只需要調(diào)用商品信息的服務(wù),除此之外不需要和其他系統(tǒng)交互。
2.2 功能分析
1、在用戶不登陸的清空下也可以使用購物車,那么就需要把購物車信息放入cookie中。
2、可以把商品信息,存放到pojo中,然后序列化成json存入cookie中。
3、取商品信息可以從cookie中把json數(shù)據(jù)取出來,然后轉(zhuǎn)換成java對(duì)象即可。
4、此功能只需要操作cookie不需要數(shù)據(jù)庫的支持,所以只需要在taotao-portal中實(shí)現(xiàn)即可。
5、購物車分有四種動(dòng)作
a) 添加商品
b) 修改商品數(shù)量
c) 刪除購物車中的商品
d) 展示購物車商品列表
2.3 添加購物車商品
在商品詳情頁面點(diǎn)擊“加入購物車”按鈕提交一個(gè)請(qǐng)求吧商品id傳遞給Controller,Controller接收id,Controller調(diào)用Service根據(jù)商品id查詢商品基本信息。把商品寫入cookie中,加入cookie之前先從cookie中把購物車的商品取出來判斷當(dāng)前購物車商品列表中是否有此商品,如果有數(shù)量加一,如果沒有添加一個(gè)商品,數(shù)量為1。展示給用戶購物車列表。
2.3.1 service
功能:接收一個(gè)商品id,數(shù)量(默認(rèn)為1),根據(jù)商品id查詢商品信息。調(diào)用taotao-rest的服務(wù)。把商品添加到購物車,先把購物車商品列表取出來,判斷列表中是否有此商品,如果有就增加數(shù)量就可以了。如果沒有把此商品添加到商品列表。返回添加成功Taotaoresult。
功能:
1、接收controller傳遞過來的商品id,根據(jù)商品id查詢商品信息。
2、從cookie中取出購物車信息,轉(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中購物車商品對(duì)應(yīng)的key @Value("${CART_ITEMS_LIST_KEY}") private String CART_ITEMS_LIST_KEY; //購物車cookie生存期 @Value("${CART_ITEMS_EXPIRE_TIME}") private Integer CART_ITEMS_EXPIRE_TIME; /** * 添加購物車商品 * <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查詢商品信息 Item item = getItemById(itemId); if (item == null) return TaotaoResult.build(400, "未查詢到該商品信息"); //取cookie中購物車商品列表 List<Item> cartItems = getItemListFromCookie(request); //判斷該商品是否存在于購物車中 boolean itemExists = false; for (Item i : cartItems) { if (i.getId().longValue() == itemId.longValue()) { //購物車中有此商品 i.setNum(i.getNum() + 1); itemExists = true; break; } } //如果商品不存在于購物車則向購物車商品列表中添加一個(gè)商品 if (! itemExists) { //設(shè)置數(shù)量為1 item.setNum(1); //把商品添加到購物車 cartItems.add(item); } //把購物車信息寫入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查詢商品信息 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中購物車商品列表 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"; } //把購物車中的商品傳遞給頁面 model.addAttribute("cartList", result.getData()); return "cart"; } }
用戶點(diǎn)擊“我的購物車”展示購物車信息
2.4 展示購物車商品
2.4.1 Service
/** * 取購物車列表 * <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) { //取購物車信息 List<Item> list = cartService.getCartItemsList(request); mode.addAttribute("cartList", list); return "cart"; }
2.5 修改商品數(shù)量
當(dāng)點(diǎn)擊購物車商品的“+”、“-”號(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; } } //把商品信息寫入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 刪除購物車商品
2.6.1 Service
/** * 刪除購物車中的商品 * <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); // 找到購物車中的商品,并刪除之 for (Item item : itemsList) { if (item.getId().longValue() == itemId.longValue()) { itemsList.remove(item); break; } } // 更新cookie中的購物車數(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"; }
購物車存在的問題
1、更換設(shè)備購物車商品不能同步
a) 不能把購物車商品保存到數(shù)據(jù)庫
b) 要求用戶登錄才能同步信息
c) 可以把購物車信息保存到redis中,key就是用戶,value就是購物車列表
d) 購物車商品合并的問題。
2、提交訂單后購物車商品需要清空。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- JavaWeb購物車項(xiàng)目開發(fā)實(shí)戰(zhàn)指南
- JavaWeb后臺(tái)購物車類實(shí)現(xiàn)代碼詳解
- eclipse的web項(xiàng)目實(shí)現(xiàn)Javaweb購物車的方法
- javaweb購物車案列學(xué)習(xí)開發(fā)
- java web開發(fā)之購物車功能實(shí)現(xiàn)示例代碼
- javaweb圖書商城設(shè)計(jì)之購物車模塊(3)
- java web開發(fā)之實(shí)現(xiàn)購物車功能
- JAVAEE中用Session簡單實(shí)現(xiàn)購物車功能示例代碼
- java實(shí)現(xiàn)網(wǎng)上購物車程序
- Java?web實(shí)現(xiàn)購物車案例
相關(guān)文章
SpringBoot 如何根據(jù)不同profile選擇不同配置
這篇文章主要介紹了SpringBoot 如何根據(jù)不同profile選擇不同配置的操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Java中關(guān)于ThreadLocal的隱式引用詳解
這篇文章主要介紹了Java中關(guān)于ThreadLocal的隱式引用,從線程的角度看,每個(gè)線程都保持一個(gè)對(duì)其線程局部變量副本的隱式引用,只要線程是活動(dòng)的,ThreadLocal實(shí)例就是可訪問的,下面我們來具體看看2024-03-03Springboot實(shí)例講解實(shí)現(xiàn)專業(yè)材料認(rèn)證管理系統(tǒng)流程
這是一個(gè)基于java的畢業(yè)設(shè)計(jì)項(xiàng)目,畢設(shè)課題為springboot框架的知識(shí)產(chǎn)權(quán)服務(wù)平臺(tái)系統(tǒng),是一個(gè)采用b/s結(jié)構(gòu)的javaweb項(xiàng)目,需要的朋友可以參考下2022-06-06Ribbon單獨(dú)使用,配置自動(dòng)重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式
這篇文章主要介紹了Ribbon單獨(dú)使用,配置自動(dòng)重試,實(shí)現(xiàn)負(fù)載均衡和高可用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12java實(shí)現(xiàn)導(dǎo)出Excel的功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)導(dǎo)出Excel的功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05關(guān)于QueryWrapper高級(jí)使用示例
本文介紹了QueryWrapper的高級(jí)使用方法,包括查詢指定字段、使用MySQL函數(shù)處理字段、設(shè)置查詢限制等,通過select()可查詢指定字段并處理,last()方法實(shí)現(xiàn)limit效果,apply()可在查詢條件中使用函數(shù),這些技巧有助于提升數(shù)據(jù)庫操作的靈活性和效率2024-09-09