Cookie存储购物车
1.1 需求分析
- 使用Cookie存储购物车数据,服务层负责业务逻辑,控制器层负责读写cookie。
- 说明:Cookie的value存储List<Cart> 的json格式字符串数据(中文需要Unicode编码,因为cookie的值不能存在中文字符)
- 总结:
实现cookie存储购物车控制器层代码:
cookieName: pinyougou_cart
cookieValue: List<Cart>集合转化成json格式的字符串,有中文需要转码。- 实现步骤:
- 定义CartController.java控制器,读写购物车。
把商品添加到购物车,再把购物车存储Cookie
先从浏览器中获取Cookie,从Cookie中获取原来的购物车
- 详细步骤:(未登录的用户,购物车存储到Cookie)
- 获取购物车
- 把商品添加到购物车
- 把添加后的购物车存储到Cookie
- Cookie工具类(放在common工程中)
public final class CookieUtils {/** 定义Cookie名称的静态内部类 */public static class CookieName{/** 定义存放在Cookie中购物车的名称 */public static final String PINYOUGOU_CART = "pinyougou_cart";}/*** 根据Cookie的名称获取指定的Cookie* @param request 请求对象* @param cookieName cookie的名称* @return Cookie*/public static Cookie getCookie(HttpServletRequest request, String cookieName){/** 获取所有的Cookie */Cookie[] cookies = request.getCookies();if (cookies != null && cookies.length > 0){for (Cookie cookie : cookies){if (cookie.getName().equals(cookieName)){return cookie;}}}return null;}/*** 根据CookieName获取指定的Cookie值* @param request 请求对象* @param cookieName cookie的名称* @param encoded 是否编码* @return Cookie的值*/public static String getCookieValue(HttpServletRequest request, String cookieName, boolean encoded) {/** 获取指定的Cookie */Cookie cookie = getCookie(request, cookieName);String cookieValue = null;try {if (cookie != null) {if (encoded){cookieValue = URLDecoder.decode(cookie.getValue(), "UTF-8");}else{cookieValue = cookie.getValue();}}} catch (Exception e) {e.printStackTrace();}return cookieValue;}/*** 根据Cookie的名称删除指定的Cookie* @param request 请求对象* @param response 响应对象* @param cookieName cookie名称*/public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {setCookie(request, response, cookieName, null, 0, false);}/*** 设置Cookie* @param request 请求对象* @param response 响应对象* @param cookieName cookie的名称* @param cookieValue cookie的值* @param maxAge 存放Cookie的最大存放时间(按秒计算)* @param encoded 是否编码*/public static void setCookie(HttpServletRequest request, HttpServletResponse response,String cookieName, String cookieValue, int maxAge, boolean encoded) {try {/** 对Cookie的值进行判断 */if (cookieValue == null) {cookieValue = "";}if (encoded) {cookieValue = URLEncoder.encode(cookieValue, "UTF-8");}Cookie cookie = getCookie(request, cookieName);if (cookie == null){cookie = new Cookie(cookieName, cookieValue);}/** 设置Cookie的值 */cookie.setValue(cookieValue);/** 设置最大存活时间 */cookie.setMaxAge(maxAge);/** 设置访问路径 */cookie.setPath("/");/** 添加到用户浏览器 */response.addCookie(cookie);} catch (Exception e) {e.printStackTrace();}} }
CartController.java控制器:
/** 购物车控制器 */@RestController@RequestMapping("/cart")public class CartController {@Reference(timeout = 30000)private CartService cartService;@Autowiredprivate HttpServletRequest request;@Autowiredprivate HttpServletResponse response;
/** 添加SKU商品到购物车 */@GetMapping("/addCart")public boolean addCart(Long itemId, Integer num){try{// 获取购物车集合List<Cart> carts = findCart();// 调用服务层添加SKU商品到购物车carts = cartService.addItemToCart(carts, itemId, num);// 将购物车重新存入Cookie中CookieUtils.setCookie(request, response,CookieUtils.CookieName.PINYOUGOU_CART,JSON.toJSONString(carts),3600 * 24, true);return true;}catch (Exception ex){ex.printStackTrace();}return false;}
/** 获取购物车集合 */
@GetMapping("/findCart")
public List<Cart> findCart() {
// 从Cookie中获取购物车集合json字符串
String cartStr = CookieUtils.getCookieValue(request,
CookieUtils.CookieName.PINYOUGOU_CART, true);
// 判断是否为空
if (StringUtils.isBlank(cartStr)){
cartStr = "[]";
}
List<Cart> carts = JSON.parseArray(cartStr, Cart.class);
return carts;
}
}
服务接口层:
CartService.java:
/** 购物车服务接口 */
public interface CartService {
/**
* 添加SKU商品到购物车
* @param carts 购物车(一个Cart对应一个商家)
* @param itemId SKU商品id
* @param num 购买数据
* @return 修改后的购物车
*/
List<Cart> addItemToCart(List<Cart> carts,
Long itemId, Integer num);
}
服务实现层:
- 实现思路:(对照上图结构去实现)
- 根据SKU商品ID查询SKU商品对象。
- 获取商家ID
- 根据商家ID判断购物车集合中是否存在该商家的购物车
- 如果购物车集合中不存在该商家的购物车
4.1 创建新的购物车对象
4.2 将新的购物车对象添加到购物车集合- 如果购物车集合中存在该商家的购物车
5.1 判断购物车订单明细集合中是否存在该商品
5.2 如果没有,新增购物车订单明细
5.3 如果有,在原购物车订单明细上添加数量,更改金额
创建服务接口实现类CartServiceImpl.java:
/** 购物车服务接口实现类 */
@Service(interfaceName = "com.pinyougou.cart.service.CartService")
@Transactional
public class CartServiceImpl implements CartService {
@Autowired
private ItemMapper itemMapper;
/**
* 添加SKU商品到购物车
* @param carts 购物车(一个Cart对应一个商家)
* @param itemId SKU商品id
* @param num 购买数据
* @return 修改后的购物车
*/
public List<Cart> addItemToCart(List<Cart> carts,
Long itemId, Integer num){
try{
// 根据SKU商品ID查询SKU商品对象
Item item = itemMapper.selectByPrimaryKey(itemId);
// 获取商家id
String sellerId = item.getSellerId();
// 根据商家id判断购物车集合中是否存在该商家的购物车
Cart cart = searchCartBySellerId(carts, sellerId);
if (cart == null){ // 购物车集合中不存在该商家购物车
// 创建新的购物车对象
cart = new Cart();
cart.setSellerId(sellerId);
cart.setSellerName(item.getSeller());
// 创建订单明细(购物中一个商品)
OrderItem orderItem = createOrderItem(item, num);
List<OrderItem> orderItems = new ArrayList<>(0);
orderItems.add(orderItem);
// 为购物车设置订单明细集合
cart.setOrderItems(orderItems);// 将新的购物车对象添加到购物车集合
carts.add(cart);
}else{ // 购物车集合中存在该商家购物车
// 判断购物车订单明细集合中是否存在该商品
OrderItem orderItem = searchOrderItemByItemId(
cart.getOrderItems(), itemId);
if (orderItem == null){
// 如果没有,新增购物车订单明细
orderItem = createOrderItem(item, num);
cart.getOrderItems().add(orderItem);
}else{
// 如果有,在原购物车订单明细上添加数量,更改金额
orderItem.setNum(orderItem.getNum() + num);
orderItem.setTotalFee(new BigDecimal(
orderItem.getPrice().doubleValue()
* orderItem.getNum()));
// 如果订单明细的购买数小于等于0,则删除
if (orderItem.getNum() <= 0){
// 删除购物车中的订单明细(商品)
cart.getOrderItems().remove(orderItem);
}
// 如果cart的orderItems订单明细为0,则删除cart
if (cart.getOrderItems().size() == 0){
carts.remove(cart);
}
}
}
return carts;
}catch (Exception ex){
throw new RuntimeException(ex);
}
}
/** 从购物车集合中获取该商家的购物车 */
private Cart searchCartBySellerId(
List<Cart> carts, String sellerId) {
for (Cart cart : carts){
if (cart.getSellerId().equals(sellerId)){
return cart;
}
}
return null;
}
/** 创建订单明细 */
private OrderItem createOrderItem(Item item, Integer num) {
// 创建订单明细
OrderItem orderItem = new OrderItem();
orderItem.setSellerId(item.getSellerId());
orderItem.setGoodsId(item.getGoodsId());
orderItem.setItemId(item.getId());
orderItem.setNum(num);
orderItem.setPicPath(item.getImage());
orderItem.setPrice(item.getPrice());
orderItem.setTitle(item.getTitle());
// 小计
orderItem.setTotalFee(new BigDecimal(
item.getPrice().doubleValue() * num));
return orderItem;
}
/** 从订单明细集合中获取指定订单明细 */
private OrderItem searchOrderItemByItemId(
List<OrderItem> orderItems, Long itemId) {
for (OrderItem orderItem : orderItems){
if (orderItem.getItemId().equals(itemId)){
return orderItem;
}
}
return null;
}
}
添加购物车:http://cart.pinyougou.com/cart/addCart?itemId=1369458&num=100
查看购物车:http://cart.pinyougou.com/cart/findCart
Cookie存储购物车相关推荐
- Redis存储购物车
1.1 Redis存储与获取购物车 redisTemplate.boundValueOps("cart_" + userId).get(); redisTemplate.bound ...
- 用session和mysql实现购物车_Session和Cookie实现购物车
使用Session和Cookie实现购物车的比较 购物车相当于现实中超市的购物车,不同的是一个是实体车,一个是虚拟车而已.用户可以在购物网站的不同页面之间跳转,以选购自己喜爱的商品,点击购买时,该商品 ...
- 封装的cookie存储、获取、删除方法
2019独角兽企业重金招聘Python工程师标准>>> 封装的cookie存储.获取.删除方法 1.设置cookie function setCookie(key, value, t ...
- js cookie 存储checkbox_浏览器数据存储方式总结,网友:“精辟”!
今天主要来讲下前端的数据存储,说起数据存储,大家肯定第一时间想起cookie,localstorage,sessionstorage,而其实还有userData和IndexedDB这两种数据存储,接下 ...
- cookie文件存放在服务器端,cookie存储在客户端还是服务器
cookie存储在客户端还是服务器 内容精选 换一换 在很多集群架构中,集群成员的主要目的就是让集中式接口知道它能访问哪些节点,然后此中央接口通过一个两级调度为客户端提供服务,在PB到EB级系统中这个 ...
- 商城系统PageBean分页 Cookie存储浏览记录
封装实体类:PageBean public class PageBean<T> {private int currentPage;//当前页private int currentCount ...
- php 置多条cookie,php 在cookie存储多个的简单示例
这篇文章主要为大家详细介绍了php 在cookie存储多个的简单示例,具有一定的参考价值,可以用来参考一下. 对php在一个cookie中存储多个值得代码感兴趣的小伙伴,下面一起跟随512笔记的小编两 ...
- php: 远程操作浏览器cookie存储入门
本公众号,之前写过一个 js操作 cookie 的教程 这次写一个 php部分远程操作浏览器cookie存储 一.cookie理解,其实就是 浏览器的 一个本地存储,不过这个本地存储,在http握手的 ...
- java 购物车 存放数据库_java-没有用户登录时存储购物车(playframework...
我正在浏览有关Play的帖子!框架,遇到了一些讨论电子商务的帖子.由于我是这两者的初学者,所以我想做一个练习.我写下了一些用例和一些要求,如下所示.我想听听您对此的看法,希望拓宽我的技术智慧. 网页上 ...
最新文章
- 基于Pytorch和RDKit建立QSAR模型
- 干货丨机器学习新手一定要掌握的10大算法
- 60. Permutation Sequence
- python好学吗 老程序员-今天面试了一个34岁大龄程序员,有感而发
- 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)
- 【Paper】Origin绘制误差棒图(标准差围绕均值)
- MySQL(四)复合查询与联合查询
- MDN文档基础知识搜集
- 32G内存手机到底够用吗?看完泪崩
- 4.maven中常用的构建命令
- Pyqt5_Python运用过程中一些问题和技巧
- mysql中如何计算同比环比_vnpy中如何计算MACD指标
- 编译原理 NFA确定化与DFA最小化
- C语言0和0.0f的区别
- file_get_contents failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request
- [OpenStack] Linuxbridge 的Permission Denied故障调查
- 和LinkedSee灵犀一起备战GITC全球互联网技术大会
- JAVA实现QQ:实现文字聊天、QQ用户登录、拉取在线用户列表、无异常退出、私聊、发文件、下载文件、离线留言、服务端推送新闻等功能(后端无界面,Utilty源码在后面、)
- sequoia 安装配置
- php 搜索引擎包含哪些技术,浅谈三大搜索引擎爬虫性感 B-G-B