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

购物车样式


①、创建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);
	
}
相关推荐
Little-Hu1 小时前
QML TextEdit组件
java·服务器·数据库
保持学习ing3 小时前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
宇钶宇夕3 小时前
EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
运维·服务器·数据库·程序人生·自动化
爱可生开源社区4 小时前
SQLShift 重磅更新:支持 SQL Server 存储过程转换至 GaussDB!
数据库
贾修行4 小时前
SQL Server 空间函数从入门到精通:原理、实战与多数据库性能对比
数据库·sqlserver
傲祥Ax4 小时前
Redis总结
数据库·redis·redis重点总结
一屉大大大花卷5 小时前
初识Neo4j之入门介绍(一)
数据库·neo4j
Orlando cron5 小时前
源哈希(sh)解析
负载均衡·哈希算法
周胡杰6 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
wkj0016 小时前
navicate如何设置数据库引擎
数据库·mysql