欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 电商中的购物车(redis的hash类型操作)

电商中的购物车(redis的hash类型操作)

2025/4/13 9:44:09 来源:https://blog.csdn.net/usa_washington/article/details/147119983  浏览:    关键词:电商中的购物车(redis的hash类型操作)

购物车样式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

①、创建service-cart模块

spring:profiles:active: dev
server:port: 8513
spring:application:name: service-cartcloud:nacos:discovery:server-addr: localhost:8848data:redis:host: localhostport: 6379

启动类

@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)//排除mysql数据库的自动化配置
public class CartApplication{}

②、业务

添加购物车

@Tag(name="购物车接口")
@RestController
@RequestMapping("/api/order/cart")
public class CartController{@Autowiredprivate CartService cartService;@Operation(summary="添加购物车")@GetMapping("auth/addToCart/{skuId}/{skuNum}")public Result addToCart(@Parameter(name="skuId",description="商品skuId",required=true) @PathVariable("skuId") Long skuId,@Parameter(name="skuNum",description="数量",required=true) @PathVariable("skuNum") Integer skuNum){cartService.addToCart(skuId,skuNum);return Result.build(null,ResultCodeEnum.SUCCESS);}
}
@Autowird
private ProduceFeignClient productFeignClient;private String getCartKey(Long userId){return "suer:cart:" + userId;
}@Override
public void addToCart(Long skuId,Integer skuNum){//必需是登录状态,获取登录用户id作为redis的keyLong userId = AuthContextUtil.getUserInfo().getId();String cartKey = getCartKey(userId);//从redis获取购物车数据,根据用户id+skuId(hash类型)Object cartInfoObj = redisTemplate.opsForHash().get(cartKey,String.valueOf(skuId))CargInfo cartInfo = null;if(cartInfoObj != null){//如果购物车存在添加商品,则增加数量;否则添加商品到购物车cartInfo = JSON.parseObject(cartInfoObj.toString(),CartInfo.class);cartInfo.setSkuNum(cartInfo.getSkuNum() + skuNum);cartInfo.setIsChecked(1);//选中状态cartInfo.setUpdateTime(new Date());}else{//如果购物车不存在,则直接将商品添加到购物车cartInfo = new CartInfo();//远程调用ProductSku productSku = productFeignClient.getBySkuId(skuId).getData();cartInfo.setCartProce(productSku.getSaleProce());cartInfo.setSkuNum(skuNum);cartInfo.setSkuId(skuId);cartInfo.setUserId(userId);cartInfo.setImgUrl(productSku.getThumbImg());cartInfo.setSkuName(productSku.getSkuName());cartInfo.setIsChecked(1);cartInfo.setCreateTime(new Date());cartInfo.setUpdateTime(new Date());}redisTemplate.opsForHash().put(cartKey,String.valueOf(skuId),JSON.toJSONString(cartInfo));
}

④、远程调用模块service-client,添加依赖spring-cloud-starter-openfeign spring-cloud-loadbalancer
在这里插入图片描述

定义远程调用接口

@FeignClient(value="service-product")
public interface ProductFeignClient{//调用service-product模块中的方法@GetMapping("/api/product/getBySkuId/{skuId}")public ProductSku getBySkuId(@PathVariable("skuId") Long skuId);
}

将service-client引入到service-cart模块中依赖,在service-cart模块中的启动类添加注解
@EnableFeignClients(basePackages={“com.xxx.spzx”})
@EnableUserLoginAuthInterceptor 自定义注解中中拦截功能

⑤、网关模块中添加路由
在这里插入图片描述

查询购物车

在这里插入图片描述

在这里插入图片描述

@Operation(summary="查询购物车")
@GetMapping("auth/cartList")
public Result<List<CartInfo>> cartList(){List<CartInfo> cartInfoList = cartService.getCartList();return Result.build(cartInfoList,ResultCodeEnum.SUCCESS);
}
@Override
public List<CartInfo> getCartList(){//获取当前登录用户,构建redis的keyLong userId = AuthContextUtil.getUserInfo().getId();String cartKey = this.getCartKey(userId);List<Object> valueList = redisTemplate.opsForHash().values(cartKey);//类型转换:list<Object> -> list<CartInfo>if(!CollectionUtils.isEmpty(valueList)){List<CartInfo> cartInfoList = valueList.stream().map(cartInfoObj -> JSON.parseObject(cartInfoObj.toString(),cartInfo.class)).collect(Collectors.toList());return cartInfoList;}return new ArrayList<>();
}

删除购物车商品

@Operation(summary="删除购物车商品")
@DeleteMapping("auth/deleteCart/{skuId}")
public Result deleteCart(@Parameter(name="skuId",description="商品skuId",required=true) @@PathVariable("skuId") Long skuId){cartService.delete(skuId);return Reuslt.build(null,ResultCodeEnum.SUCCESS);
}
@Override
public void deleteCart(Long skuId){Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = this.getCartKey(userId);redisTemplate.opsForHash().delete(cartKey,String.valueOf(skuId));
}

更新选中状态
在这里插入图片描述

@Operation(summary="更新购物车商品选中状态")
@GetMapping("/authcheckCart/{skuId}/{isChecked}")
public Result checkCart(@Parameter(name="skuId",description="商品skuId",required=true) @PathVariable(value="skuId") Long skuId,@Parameter(name="isChecked",description="是否选中 1:选中 0:取消选中",required=true)Integer isChecked){cartServcie.checkCart(skuId,isChecked);return Result.build(null,ResultCodeEnum.SUCCESS);
}
@Override
public void checkCart(Long skuId,Integer isChecked){Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = this.getCartKey(userId);Boolean hasKey = redisTemplate.opsForHash().hasKey(cartKey,String.value(skuId));if(hasKey){//根据key+field获取valueString cartInfoString = redisTemplate.opsForHash().get(cartKey,String.valueOf(skuId)).toString();CartInfo cartInfo = JSON.parseObject(cartInfo String,CartInfo.class);cartInfo.setIsChecked(isChecked);redisTemplate.opsForHash().put(cartKey,String.valueOf(skuId),JSON.toJSONString(cartInfo));}}

全选、全不选

@Operation(summary="更新购物车商品全部选中状态")
@GetMapping("/auth/allCheckCart/{isChecked}")
public Result allCheckCart(@Parameter(name="isChecked",description="是否选中 1:选中 0:取消选中",required=true) @PathVariable(value="isChecked") Integer isChecked){cartService.allCheckCart(isChecked);return Result.build(null,ResultCodeEnum.SUCCESS);
}
public void allCheckCart(Integer isChecked){Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = getCartKey(userId);List<Object> objectList = redisTemplate.opsForHash().values(cartKey);if(!CollectionUtils.isEmpty(objectList)){List<CartInfo> cartInfoList = objectList.stream().map(object->JSON.parseObject(object.toString(),CartInfo.class)).collect(Collectors.toList());//把每个商品的isChecked进行更新cartInfoList.forEach(cartInfo->{cartInfo.setIsCheckd(isChecked);redisTemplate.opsForHash().put(cartKey,String.valueOf(cartInfo.getSkuId()),JSON.toJSONString(cartInfo));});}
}

清空购物车

@Operation(summary="清空购物车")
@GetMapping("/auth/clearCart")
public Result clearCart(){cartService.clearCart();return Result.build(null,ResultCodeEnum.SUCCESS);
}
@Override
public void clearCart(){Long userId = AuthContextUtil.getUserInfo().getId();String cartKey = this.getCartKey(userId);//根据key删除Redis数据redisTemplate.delete(cartKey);}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词