实体类有四个: Product、User、Cart、CartItem

//Product实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Product implements Serializable {

private Integer id;
private String productName;
private Double price;
private String picPath;
private String discription;


}

//User实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class User implements Serializable {

private String id;
private String username;
private String password;
private String name;
private Integer zip;
private String address;

}

//Cart实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class Cart implements Serializable {

private Map<Integer,CartItem> cartMap;
private Double totalPrice;

}

//CartItem实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class CartItem implements Serializable {

//书+数量+小计
private Product product;
private Integer count;
private Double subtotal;

}

思路:一个用户对应一个购物车,一个购物车里面有多个购物项

 

引入jedis依赖

<!--引入jedis-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>

<!-- 引入一个工具包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>

 

对应controller中的代码

//购物车展示
@RequestMapping("cart")
public String cartShow(Integer id,HttpServletRequest request){
//接受要购买的书的ID 根据书的Id查到这本书
Product product1 = productService.selectOne(id);
//将这本书存入购物车
//从session中获取登录者信息 存入redis中的key是userId 值是cart对象
User user = (User) request.getSession().getAttribute("user");
String userId = user.getId();
//从redis中获取购物车信息
Jedis jedis = new Jedis("192.168.174.128",6379);
byte[] userIdBs = SerializationUtils.serialize(userId);
byte[] sCart = jedis.get(userIdBs);
Cart cart = null;
//判断购物车是否存在
if(sCart == null){
//购物车不存在,先创建购物车
cart = new Cart();
//全新的购物项内容
CartItem cartItem = new CartItem(product1, 1, product1.getPrice());
//购物车中存的是购物项的集合 String: 书的ID CartItem:购物项 所展示的内容
Map<Integer, CartItem> cartMap = new HashMap<Integer, CartItem>();
cartMap.put(product1.getId(), cartItem);
cart.setCartMap(cartMap);
cart.setTotalPrice(product1.getPrice());
}else{
//购物车已经存在,反序列化获取这个购物车
cart = SerializationUtils.deserialize(sCart);
//判断 当前的商品之前是否买过 购物车的数据在Map集合中 判断 map的key是否存在
if(cart.getCartMap().containsKey(product1.getId())){
//使用key获取已经存在的购物项 直接修改购物项的数量和小计即可
CartItem cartItem = cart.getCartMap().get(product1.getId());
//数量+1
cartItem.setCount(cartItem.getCount()+1);
//小计+商品的单价
cartItem.setSubtotal(cartItem.getSubtotal()+product1.getPrice());
// 将修改后的购物项存入购物车的Map中 key 依然是ID value 新的购物项
cart.getCartMap().put(product1.getId(), cartItem);

}else{
//没买过 先创建全新的购物项
CartItem cartItem = new CartItem(product1,1,product1.getPrice());
//存入购物车的Map集合
cart.getCartMap().put(product1.getId(), cartItem);
}
//计算总价格 并set进购物车
double sum = 0.0;
Set<Integer> ks = cart.getCartMap().keySet();
Set<Integer> ks1 = cart.getCartMap().keySet();
for (Integer key : ks1) {
CartItem item = cart.getCartMap().get(key);
sum += (item.getProduct().getPrice())*(item.getCount());
}
cart.setTotalPrice(sum);
}

//将购物车序列化之后存入redis 存入redis中的key是序列化后的userId 值是序列化后的cart对象
byte[] car = SerializationUtils.serialize(cart);
byte[] userIDBs = SerializationUtils.serialize(userId);
//这个地方要注意不要用 set(String,String) 类型的,要用set(byte[],byte[])类型,否则存进去的类型不对
jedis.set(userIDBs,car);
return "redirect:/product/redis";
}

//取出redis中的购物车传入前台
@RequestMapping("redis")
public String forwardRedis(Model model,HttpServletRequest request){
//获取登录的用户Id
User user = (User) request.getSession().getAttribute("user");
String userId = user.getId();
//从redis中获取购物车信息
Jedis jedis = new Jedis("192.168.174.128",6379);
byte[] car = jedis.get(SerializationUtils.serialize(userId));
//反序列化重新获取cart对象
if(car != null){
Cart cart = SerializationUtils.deserialize(car);
//用model传入前台
model.addAttribute("cart",cart);
}
return "view/ShopCarView";
}


//删除购物车中的书
@RequestMapping("deleteCartBook")
public String deleteCartBook(Integer id,HttpServletRequest request) {
//获取登录的用户Id
User user = (User) request.getSession().getAttribute("user");
String userId = user.getId();
//从redis中获取购物车信息
Jedis jedis = new Jedis("192.168.174.128",6379);
byte[] car = jedis.get(SerializationUtils.serialize(userId));
//反序列化重新获取cart对象
Cart cart = SerializationUtils.deserialize(car);
Map<Integer, CartItem> cartMap = cart.getCartMap();
//获取要删除的购物项
CartItem cartItem2 = cartMap.get(id);
//删除map集合中的键
cartMap.remove(id);
//更新总价
cart.setCartMap(cartMap);
cart.setTotalPrice(cart.getTotalPrice()-(cartItem2.getProduct().getPrice())*(cartItem2.getCount()));
//重新存入redis
byte[] deletecar = SerializationUtils.serialize(cart);
byte[] userIDBs = SerializationUtils.serialize(userId);
//这个地方要注意不要用 set(String,String) 类型的,要用set(byte[],byte[])类型,否则存进去的类型不对
jedis.set(userIDBs,deletecar);

return "redirect:/product/redis";
}

//清空购物车
@RequestMapping("emptyCar")
public String emptyCar(HttpServletRequest request){
//获取登录的用户Id
User user = (User) request.getSession().getAttribute("user");
String userId = user.getId();
//从redis中获取购物车信息
Jedis jedis = new Jedis("192.168.174.128",6379);

//清空购物车 直接删除redis中对应的key
jedis.del(SerializationUtils.serialize(userId));

return "redirect:/product/redis";
}

//修改购物项中图书的数量
@RequestMapping("updateCarBookCount")
public String updateCartBookCount(Integer id, Integer count,HttpServletRequest request) {
if (count > 0) {
//获取登录的用户Id
User user = (User) request.getSession().getAttribute("user");
String userId = user.getId();
//从redis中获取购物车信息
Jedis jedis = new Jedis("192.168.174.128",6379);
byte[] car = jedis.get(SerializationUtils.serialize(userId));
//反序列化重新获取cart对象
Cart cart = SerializationUtils.deserialize(car);
Map<Integer, CartItem> cartMap = cart.getCartMap();
//获取要修改图书的购物项
CartItem cartItem = cartMap.get(id);
cartItem.setCount(count);
cartMap.put(id, cartItem);
//更新总价
cart.setCartMap(cartMap);
//原总价格
double sum1 = 0.0;
//计算总价格
Set<Integer> ks1 = cart.getCartMap().keySet();
for (Integer key : ks1) {
CartItem item = cart.getCartMap().get(key);
sum1 += (item.getProduct().getPrice()) * (item.getCount());
}
cart.setTotalPrice(sum1);
//重新存入redis
byte[] clearcar = SerializationUtils.serialize(cart);
byte[] userIDBs = SerializationUtils.serialize(userId);
//这个地方要注意不要用 set(String,String) 类型的,要用set(byte[],byte[])类型,否则存进去的类型不对
jedis.set(userIDBs,clearcar);
}
return "redirect:/product/redis";
}