ShopItem:
package com.kejin.shopcar.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class ShopItem implements Serializable {
//skuid
private Long skuId;
//商品数量
private Integer num;
//是否有货 0有货 1无货
private Integer isHave;
//是否选中 0未选中 1选中
private Integer isCheck;
//记录时价格
private Double recordPrice;
//记录品类id
private Long categoryId;
}
RedisCacheConfig:
package com.kejin.shopcar.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;
@Component
public class RedisCacheConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置value的序列化规则和 key的序列化规则
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(redisTemplate.getKeySerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
ShopCarConstant:
package com.kejin.shopcar.constant;
public class ShopCarConstant {
//用户购物车信息
public static String shopCarFormal ="goods:shopCar:formal";
//用户临时购物车信息
public static String shopCarTemp ="goods:shopCar:temp";
}
ShopCarController:
package com.kejin.shopcar.controller;
import com.kejin.shopcar.bean.ShopItem;
import com.kejin.shopcar.constant.ShopCarConstant;
import com.kejin.shopcar.utils.RequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
@Controller
@ResponseBody
public class ShopCarController {
/* http://127.0.0.1:8080/addShopToCar?userId=123456789
http://127.0.0.1:8080/login?userId=123456789
http://127.0.0.1:8080/updateShopCarNum?userId=123456789&skuId=10080&num=9
http://127.0.0.1:8080/removeShopToCar?userId=123456789&skuId=10080*/
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/addShopToCar")
public String addShopToCar(HttpServletRequest request, HttpServletResponse response,String userId){
String shopCarId=null==userId?RequestUtil.getCSessionId(request, response):userId;
String shopCarPreFix=null==userId?ShopCarConstant.shopCarTemp:ShopCarConstant.shopCarFormal;
Random random = new Random();
ShopItem shopItem=new ShopItem();
shopItem.setSkuId((long) random.nextInt(100));
shopItem.setNum(2);
shopItem.setIsHave(0);
shopItem.setIsCheck(0);
shopItem.setRecordPrice(11.8);
shopItem.setCategoryId(1L);
Map<Long, ShopItem> shopCarMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(shopCarPreFix).get(shopCarId);
if(null==shopCarMap){
shopCarMap=new HashMap<>();
}
shopCarMap.put(shopItem.getSkuId(),shopItem);
redisTemplate.boundHashOps(shopCarPreFix).put(shopCarId,shopCarMap);
return "true";
}
@GetMapping("/login")
public String mergeShopCar(HttpServletRequest request, HttpServletResponse response,String userId){
String shopCarTempId=RequestUtil.getCSessionId(request, response);
String shopCarFormalId=userId;
Map<Long, ShopItem> shopCarTempMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(ShopCarConstant.shopCarTemp).get(shopCarTempId);
Map<Long, ShopItem> shopCarFormalMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(ShopCarConstant.shopCarFormal).get(shopCarFormalId);
Map<Long, ShopItem> resMap=new HashMap<>();
if(null!=shopCarTempMap){
resMap.putAll(shopCarTempMap);
}
resMap.putAll(shopCarFormalMap);
redisTemplate.boundHashOps(ShopCarConstant.shopCarTemp).delete(shopCarTempId);
redisTemplate.boundHashOps(ShopCarConstant.shopCarFormal).put(shopCarFormalId,resMap);
return "true";
}
@GetMapping("/updateShopCarNum")
public String updateShopCarNum(HttpServletRequest request, HttpServletResponse response,String userId,Long skuId,Integer num){
String shopCarId=null==userId?RequestUtil.getCSessionId(request, response):userId;
String shopCarPreFix=null==userId?ShopCarConstant.shopCarTemp:ShopCarConstant.shopCarFormal;
Map<Long, ShopItem> shopCarMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(shopCarPreFix).get(shopCarId);
if(null==shopCarMap){
return "false";
}
ShopItem shopItem=shopCarMap.get(skuId+"");
shopItem.setNum(num);
shopCarMap.put(skuId,shopItem);
redisTemplate.boundHashOps(shopCarPreFix).put(shopCarId,shopCarMap);
return "true";
}
@GetMapping("/removeShopToCar")
public String removeShopToCar(HttpServletRequest request, HttpServletResponse response,String userId,Long skuId){
String shopCarId=null==userId?RequestUtil.getCSessionId(request, response):userId;
String shopCarPreFix=null==userId?ShopCarConstant.shopCarTemp:ShopCarConstant.shopCarFormal;
Map<Long, ShopItem> shopCarMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(shopCarPreFix).get(shopCarId);
shopCarMap.remove(skuId+"");
redisTemplate.boundHashOps(shopCarPreFix).put(shopCarId,shopCarMap);
return "true";
}
}
RequestUtil:
package com.kejin.shopcar.utils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
public class RequestUtil {
//获取CSessionID
public static String getCSessionId(HttpServletRequest request, HttpServletResponse response){
//1, 从Request中取Cookie
Cookie[] cookies = request.getCookies();
//2, 从Cookie数据中遍历查找, 并取CSessionID
if (null != cookies && cookies.length > 0) {
for (Cookie cookie : cookies) {
if ("CSESSIONID".equals(cookie.getName())) {
//有, 直接返回
return cookie.getValue();
}
}
}
//没有, 创建一个CSessionId, 并且放到Cookie再返回浏览器.返回新的CSessionID
String csessionid = UUID.randomUUID().toString().replaceAll("-", "");
//并且放到Cookie中
Cookie cookie = new Cookie("CSESSIONID", csessionid);
//cookie 每次都带来, 设置路径
cookie.setPath("/");
//0:关闭浏览器 销毁cookie. 0:立即消失. >0 存活时间,秒
cookie.setMaxAge(-1);
//添加cookie
response.addCookie(cookie);
return csessionid;
}
}
项目结构: