本文共 7330 字,大约阅读时间需要 24 分钟。
//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 MapcartMap; private Double totalPrice;}//CartItem实体类@Data@AllArgsConstructor@NoArgsConstructor@Accessors(chain = true)public class CartItem implements Serializable { //书+数量+小计 private Product product; private Integer count; private Double subtotal;}
思路:一个用户对应一个购物车,一个购物车里面有多个购物项
redis.clients jedis org.apache.commons commons-lang3 3.4
//购物车展示 @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:购物项 所展示的内容 MapcartMap = new HashMap (); 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 ks = cart.getCartMap().keySet(); Set 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 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 cartMap = cart.getCartMap(); //获取要修改图书的购物项 CartItem cartItem = cartMap.get(id); cartItem.setCount(count); cartMap.put(id, cartItem); //更新总价 cart.setCartMap(cartMap); //原总价格 double sum1 = 0.0; //计算总价格 Set 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"; }
转载地址:http://aggo.baihongyu.com/