目录:
(1)选中状态的变更
(2)删除购物车
(3)流程总结
(1)选中状态的变更
用户每次勾选购物车的多选框,都要把当前状态保存起来。由于可能会涉及更频繁的操作,所以这个勾选状态不必存储到数据库中。保留在缓存状态即可。
编写业务接口:CartService:
接口
/**
* 更新选中状态
*
* @param userId
* @param isChecked
* @param skuId
*/
void checkCart(String userId, Integer isChecked, Long skuId);
实现类
@Override
public void checkCart(String userId, Integer isChecked, Long skuId) {
String cartKey = this.getCartKey(userId);
BoundHashOperations<String, String, CartInfo> boundHashOps = this.redisTemplate.boundHashOps(cartKey);
CartInfo cartInfo = boundHashOps.get(skuId.toString());
if(null != cartInfo) {
cartInfo.setIsChecked(isChecked);
boundHashOps.put(skuId.toString(), cartInfo);
}
}
继续编写控制器CartApiController:
// 选中状态
@GetMapping("checkCart/{skuId}/{isChecked}")
public Result checkCart(@PathVariable Long skuId,
@PathVariable Integer isChecked,
HttpServletRequest request){
String userId = AuthContextHolder.getUserId(request);
// 判断
if (StringUtils.isEmpty(userId)){
userId = AuthContextHolder.getUserTempId(request);
}
// 调用服务层方法
cartService.checkCart(userId,isChecked,skuId);
return Result.ok();
}
刷新页面,会存到缓存,装态实现保留
取消选中第三条:
(2)删除购物车
封装业务接口CartService
接口
void deleteCart(Long skuId, String userId);
实现类
@Override
public void deleteCart(Long skuId, String userId) {
BoundHashOperations<String, String, CartInfo> boundHashOps = this.redisTemplate.boundHashOps(this.getCartKey(userId));
// 判断购物车中是否有该商品!
if (boundHashOps.hasKey(skuId.toString())){
boundHashOps.delete(skuId.toString());
}
}
继续编写控制器CartApiController
/**
* 删除
*
* @param skuId
* @param request
* @return
*/
@DeleteMapping("deleteCart/{skuId}")
public Result deleteCart(@PathVariable("skuId") Long skuId,
HttpServletRequest request) {
// 如何获取userId
String userId = AuthContextHolder.getUserId(request);
if (StringUtils.isEmpty(userId)) {
// 获取临时用户Id
userId = AuthContextHolder.getUserTempId(request);
}
cartService.deleteCart(skuId, userId);
return Result.ok();
}
删除2个没选中的:
Redis只剩下一条选中的
显示跳转加入购物车的页面:
(3)流程总结
成功添加跳转到:
点击去购物车结算跳转购物车页面: