购物车功能模块开发(下)
程序员文章站
2024-03-25 22:02:34
...
目录
把登录用户的购物车信息存入到redis中
解析登录用户信息是第一步,第二步我们把登录用户的购物车信息存入到redis中
新建购物车实体类
记得生成getset方法
package com.leyou.cart.pojo;
public class Cart {
private Long userId;// 用户id
private Long skuId;// 商品id
private String title;// 标题
private String image;// 图片
private Long price;// 加入购物车时的价格
private Integer num;// 购买数量
private String ownSpec;// 商品规格参数
}
新建接口
我们新建一个GoodsClient,用来远程调用item微服务中的“根据skuId查询sku”方法
新建controller
controller里面包括如下方法。
添加商品到购物车、查询购物车的商品,更新购物车中单个商品的数量
@Controller
public class CartController {
@Autowired
private CartService cartService;
/**
* 添加商品到购物车
* @param cart
* @return
*/
@PostMapping
public ResponseEntity<Void> addCart(@RequestBody Cart cart){
this.cartService.addCart(cart);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
/**
* 查询购物车中的商品
* @return
*/
@GetMapping
public ResponseEntity<List<Cart>> queryCarts() {
List<Cart> carts = this.cartService.queryCarts();
if(CollectionUtils.isEmpty(carts)){
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(carts);
}
/**
* 更新购物车中单个商品的选择数量
* @param cart
* @return
*/
@PutMapping
public ResponseEntity<Void> updateNum(@RequestBody Cart cart){
this.cartService.updateNum(cart);
return ResponseEntity.noContent().build();
}
}
新建Service
新建Servcie,这里面最需要注意的就是采用map嵌套的形式存储key,value。最终要把结果反序列化成string类型
@Service
public class CartService {
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private GoodsClient goodsClient;
private static final String KEY_PREFIX = "user:cart:";
public void addCart(Cart cart) {
//获取用户信息
UserInfo userInfo = LoginInterceptor.getUserInfo();
//查询购物车记录
BoundHashOperations<String, Object, Object> hashOperations = this.redisTemplate.boundHashOps(KEY_PREFIX + userInfo.getId());
String key = cart.getSkuId().toString();
Integer num = cart.getNum();
//判断当前商品是否在购物车中
if (hashOperations.hasKey(key)) {
//在,更新数量
String cartJson = hashOperations.get(key).toString();
cart = JsonUtils.parse(cartJson, Cart.class);
cart.setNum(cart.getNum() + num);
} else {
//不在,新增购物车
Sku sku = this.goodsClient.querySkuBySkuId(cart.getSkuId());
cart.setUserId(userInfo.getId());
cart.setTitle(sku.getTitle());
cart.setOwnSpec(sku.getOwnSpec());
cart.setImage(StringUtils.isBlank(sku.getImages()) ? "" : StringUtils.split(sku.getImages(), ",")[0]);
cart.setPrice(sku.getPrice());
}
hashOperations.put(key, JsonUtils.serialize(cart));
}
public List<Cart> queryCarts() {
UserInfo userInfo = LoginInterceptor.getUserInfo();
//判断用户是否有购物车记录
if (!this.redisTemplate.hasKey(KEY_PREFIX + userInfo.getId())) {
return null;
}
//获取用户的购物车记录
BoundHashOperations<String, Object, Object> hashOperations = this.redisTemplate.boundHashOps(KEY_PREFIX + userInfo.getId());
//获取购物车map中所有cart值集合
List<Object> cartsJson = hashOperations.values();
//如果购物车集合为空,直接返回null
if (CollectionUtils.isEmpty(cartsJson)) {
return null;
}
//把List<Obejct>集合转化为List<Cart>集合
return cartsJson.stream().map(cartJson -> JsonUtils.parse(cartJson.toString(), Cart.class)).collect(Collectors.toList());
}
/**
* 更新购物车中单个商品的选择数量
* @param cart
* @return
*/
public void updateNum(Cart cart) {
UserInfo userInfo = LoginInterceptor.getUserInfo();
//判断用户是否有购物车记录
if (!this.redisTemplate.hasKey(KEY_PREFIX + userInfo.getId())) {
return ;
}
Integer num = cart.getNum();
//获取用户的购物车记录
BoundHashOperations<String, Object, Object> hashOperations = this.redisTemplate.boundHashOps(KEY_PREFIX + userInfo.getId());
String cartJson = hashOperations.get(cart.getSkuId().toString()).toString();
cart = JsonUtils.parse(cartJson, Cart.class);
cart.setNum(num);
hashOperations.put(cart.getSkuId().toString(), JsonUtils.serialize(cart));
}
}
效果展示
记得查看redis客户端的时候要刷新
上一篇: 分享一个 Python + Django 实现的电商小项目
下一篇: JavaSE回顾笔记Ⅱ
推荐阅读
-
Django+Vue开发生鲜电商平台之10.购物车、订单管理和支付功能
-
购物车功能模块开发(下)
-
使用Taro 实现的小程序商城的购物车功能模块
-
使用WSL2、VSCode和Docker Desktop搭建在Windows下的Linux开发环境
-
ubuntu 环境下 vscode 前端开发环境插件配置 Color Picker 配置
-
ubuntu16.04下配置clion,pycharm的ROS开发环境
-
【Android开发学习00】Windows下Android开发环境搭建
-
iOS开发笔记之Xcode9.2下SDK开发-生成Framework的图解流程
-
Mac 下搭建 OpenCV 3.4.3 开发环境 配Xcode
-
Mac下搭建Vue开发环境以及新建Vue项目及启动Vue项目