java商城项目实战之购物车功能实现
作者:xxssyyyyssxx 发布时间:2023-11-02 21:17:43
本文实例为大家分享了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、提交订单后购物车商品需要清空。
来源:https://blog.csdn.net/xxssyyyyssxx/article/details/72876247
猜你喜欢
- 环境:VS2019+Qt5.121. CLR库安装 &nb
- 背景在接口请求过程中,传递json对象,springboot转换为实体VO对象后,所有属性都为null。post请求:后台接收请求:当时就懵
- 大致分为以下几个方面:一些查询指令整理使用SQL语句进行特殊查询检测表字段是否存在数据库升级数据库表字段赋初始值一、查询指令整理1.链式执行
- 这篇文章主要介绍了Java二分查找算法实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 在第一次启动项目的时候,由于使用了RabbitMQ的默认guest账号,怎么也登不进去,后来还是在Admin重新创建了一个其他的账号,然后开
- 监听模式事件模型实现了监听模式,监听模式简单来说就是事件源经过事件的封装传给 * ,当事件源触发事件后, * 接收到事件对象可以回调事件的方
- 使用通配符增强泛型1.题目泛型是JAVA重要的特性,使用泛型编程,可以使代码复用率提高。实现:在泛型方法中使用通配符2.解题思路创建一个类:
- 本文主要和大家分享介绍了关于Java JDK * 使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:前言代理是一种常用的
- 近几天又温习了一下SpringMVC的运行机制以及原理我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)
- 类注解@component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注。@Service 标注类,声明该类为业务层组件,用于处
- 类与对象:类是抽象的数据类型,对象是抽象的数据类型的具体化。使用new 关键字创建对象,默认初始化为null一个项目只存在一个main方法,
- Object(四大方法):文章干货满满,耐性看完~~何为Object?首先先来看看官方对Object的介绍:在这里附上Java官方的查阅工具
- 前言之前写了一个博客是关于使用SpringBoot使用validation-api实现参数校验,当时使用的注解都是validation-ap
- 用java实现循环队列的方法:1、添加一个属性size用来记录眼下的元素个数。目的是当head=rear的时候。通过size=0还是size
- FileOutPutStream:子类,写出数据的通道步骤:1.获取目标文件2.创建通道(如果原来没有目标文件,则会自动创建一个)3.写入数
- 持久层的那些事什么是 JDBCJDBC(JavaDataBase Connectivity)就是 Java 数据库连接, 说的直白点就是 使
- 这篇文章主要介绍了java读取xml配置参数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 题目一链表题——链表合并根据给定的两个升序链表合并为一个新的升序链表具体题目如下解法/** * Definition for singly-
- reduce()简介Reduce 原意:减少,缩小根据指定的计算模型将Stream中的值计算得到一个最终结果解释:reduce 操
- 在C程序代码中我们可以利用操作系统提供的互斥锁来实现同步块的互斥访问及线程的阻塞及唤醒等工作。然而在Java中除了提供LockAPI外还在语