目录
把登录用户的购物车信息存入到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客户端的时候要刷新
来源:CSDN
作者:刘桐ssss
链接:https://blog.csdn.net/Delicious_Life/article/details/104512970