java商城项目实战之购物车功能实现

 更新时间:2020年04月20日 10:53:10   作者:xxssyyyyssxx  
这篇文章主要为大家详细介绍了java商城项目实战之购物车功能实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现购物车功能的具体代码,供大家参考,具体内容如下

1 需要实现

1、实现淘淘商城的购物车功能

2 购物车功能

2.1 功能说明

1、商品加入购物车时,不是必须要求登录。京东不需要登录,淘宝需要登录。各有好处。

2、计算购物车中商品的总价。当商品数量发生变化时需要重新计算。

3、用户可以删除购物车中的商品。

4、用户下单后,删除购物车的功能。

购物车在用户不登陆的情况下也可以使用购物车。需要把购物车的商品信息写入cookie中。所有对购物车的操作都是操作cookie。有效 的降低数据库的压力。

缺点:换一台电脑后购物车的商品不能同步。

实现的工程:taotao-protal中实现购物车功能。只需要调用商品信息的服务,除此之外不需要和其他系统交互。

2.2 功能分析

1、在用户不登陆的清空下也可以使用购物车,那么就需要把购物车信息放入cookie中。

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

3、取商品信息可以从cookie中把json数据取出来,然后转换成java对象即可。

4、此功能只需要操作cookie不需要数据库的支持,所以只需要在taotao-portal中实现即可。

5、购物车分有四种动作

a) 添加商品

b) 修改商品数量

c) 删除购物车中的商品

d) 展示购物车商品列表

2.3 添加购物车商品

在商品详情页面点击“加入购物车”按钮提交一个请求吧商品id传递给Controller,Controller接收id,Controller调用Service根据商品id查询商品基本信息。把商品写入cookie中,加入cookie之前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加一,如果没有添加一个商品,数量为1。展示给用户购物车列表。 

2.3.1 service

功能:接收一个商品id,数量(默认为1),根据商品id查询商品信息。调用taotao-rest的服务。把商品添加到购物车,先把购物车商品列表取出来,判断列表中是否有此商品,如果有就增加数量就可以了。如果没有把此商品添加到商品列表。返回添加成功Taotaoresult。

功能:

1、接收controller传递过来的商品id,根据商品id查询商品信息。

2、从cookie中取出购物车信息,转换成商品pojo列表。

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

参数:

1、商品id

2、Request

3、response

返回值:

TaoTaoResult

@Service 
public class CartServiceImpl implements CartService { 
//服务url 
@Value("${REST_BASE_URL}") 
private String REST_BASE_URL; 
//商品服务url 
@Value("${ITEMS_ITEM_URL}") 
private String ITEMS_ITEM_URL; 
//COOKIE中购物车商品对应的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) { 
//根据商品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; 
} 
} 
//如果商品不存在于购物车则向购物车商品列表中添加一个商品 
if (! itemExists) { 
//设置数量为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) { 
//根据商品id查询商品信息 
String resultStr = HttpClientUtil.doGet(REST_BASE_URL + ITEMS_ITEM_URL + itemId); 
//转换成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); 
//如果不为空那么就转换成java对象 
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在反序列化时会抛异常。需要做如下修改:

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); 
//错误信息 
if (result.getStatus() != 200) { 
model.addAttribute("message", result.getMsg()); 
return "error/exception"; 
} 
//把购物车中的商品传递给页面 
model.addAttribute("cartList", result.getData()); 
return "cart"; 
} 
} 

用户点击“我的购物车”展示购物车信息

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 修改商品数量

当点击购物车商品的“+”、“-”号时增加或减少商品数量。减少商品数量时,如果数量为“1”则不继续减少。

2.5.1 Service

/** 
 * 修改指定商品的数量 
 * <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); 
//从商品列表中找到要修改数量的商品 
for (Item item : list) { 
if (item.getId() == itemId) { 
//找到商品,修改数量 
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中的购物车数据 
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、更换设备购物车商品不能同步

a) 不能把购物车商品保存到数据库

b) 要求用户登录才能同步信息

c) 可以把购物车信息保存到redis中,key就是用户,value就是购物车列表

d) 购物车商品合并的问题。

2、提交订单后购物车商品需要清空。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现的分页工具类与用法示例

    Java实现的分页工具类与用法示例

    这篇文章主要介绍了Java实现的分页工具类与用法,结合完整实例形式分析了java分页工具类的定义、使用方法及相关操作技巧,需要的朋友可以参考下
    2019-10-10
  • SpringBoot 如何根据不同profile选择不同配置

    SpringBoot 如何根据不同profile选择不同配置

    这篇文章主要介绍了SpringBoot 如何根据不同profile选择不同配置的操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java中关于ThreadLocal的隐式引用详解

    Java中关于ThreadLocal的隐式引用详解

    这篇文章主要介绍了Java中关于ThreadLocal的隐式引用,从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的,ThreadLocal实例就是可访问的,下面我们来具体看看
    2024-03-03
  • Springboot实例讲解实现专业材料认证管理系统流程

    Springboot实例讲解实现专业材料认证管理系统流程

    这是一个基于java的毕业设计项目,毕设课题为springboot框架的知识产权服务平台系统,是一个采用b/s结构的javaweb项目,需要的朋友可以参考下
    2022-06-06
  • jvm oom排查记录剖析

    jvm oom排查记录剖析

    这篇文章主要为大家介绍了jvm oom排查记录剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Ribbon单独使用,配置自动重试,实现负载均衡和高可用方式

    Ribbon单独使用,配置自动重试,实现负载均衡和高可用方式

    这篇文章主要介绍了Ribbon单独使用,配置自动重试,实现负载均衡和高可用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • java实现导出Excel的功能

    java实现导出Excel的功能

    这篇文章主要为大家详细介绍了java实现导出Excel的功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • java实现扫雷游戏入门程序

    java实现扫雷游戏入门程序

    这篇文章主要为大家详细介绍了java实现扫雷游戏入门程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 关于QueryWrapper高级使用示例

    关于QueryWrapper高级使用示例

    本文介绍了QueryWrapper的高级使用方法,包括查询指定字段、使用MySQL函数处理字段、设置查询限制等,通过select()可查询指定字段并处理,last()方法实现limit效果,apply()可在查询条件中使用函数,这些技巧有助于提升数据库操作的灵活性和效率
    2024-09-09
  • MyBatis中不建议使用where 1=1原因详解

    MyBatis中不建议使用where 1=1原因详解

    这篇文章主要为大家介绍了MyBatis中不建议使用where 1=1的原因详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论