购物车样式

①、创建service-cart模块
yml
spring:
profiles:
active: dev
yml
server:
port: 8513
spring:
application:
name: service-cart
cloud:
nacos:
discovery:
server-addr: localhost:8848
data:
redis:
host: localhost
port: 6379
启动类
java
@SpringBootApplication(exclude=DataSourceAutoConfiguration.class)//排除mysql数据库的自动化配置
public class CartApplication{
}
②、业务
添加购物车
java
@Tag(name="购物车接口")
@RestController
@RequestMapping("/api/order/cart")
public class CartController{
@Autowired
private 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);
}
}
java
@Autowird
private ProduceFeignClient productFeignClient;
private String getCartKey(Long userId){
return "suer:cart:" + userId;
}
@Override
public void addToCart(Long skuId,Integer skuNum){
//必需是登录状态,获取登录用户id作为redis的key
Long 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
定义远程调用接口
java
@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 自定义注解中中拦截功能
⑤、网关模块中添加路由
查询购物车


java
@Operation(summary="查询购物车")
@GetMapping("auth/cartList")
public Result<List<CartInfo>> cartList(){
List<CartInfo> cartInfoList = cartService.getCartList();
return Result.build(cartInfoList,ResultCodeEnum.SUCCESS);
}
java
@Override
public List<CartInfo> getCartList(){
//获取当前登录用户,构建redis的key
Long 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<>();
}
删除购物车商品
java
@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);
}
java
@Override
public void deleteCart(Long skuId){
Long userId = AuthContextUtil.getUserInfo().getId();
String cartKey = this.getCartKey(userId);
redisTemplate.opsForHash().delete(cartKey,String.valueOf(skuId));
}
更新选中状态
java
@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);
}
java
@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获取value
String 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));
}
}
全选、全不选
java
@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);
}
java
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));
});
}
}
清空购物车
java
@Operation(summary="清空购物车")
@GetMapping("/auth/clearCart")
public Result clearCart(){
cartService.clearCart();
return Result.build(null,ResultCodeEnum.SUCCESS);
}
java
@Override
public void clearCart(){
Long userId = AuthContextUtil.getUserInfo().getId();
String cartKey = this.getCartKey(userId);
//根据key删除Redis数据
redisTemplate.delete(cartKey);
}