博客
关于我
购物车的实现及使用redis存储购物车数据
阅读量:272 次
发布时间:2019-03-01

本文共 7330 字,大约阅读时间需要 24 分钟。

  • 实体类有四个: 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
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依赖

redis.clients
jedis
org.apache.commons
commons-lang3
3.4

 

  • 对应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
cartMap = 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/

你可能感兴趣的文章
CF #716 (Div. 2) B. AND 0, Sum Big(思维+数学)
查看>>
数据结构与算法实验1——线性表的应用之顺序表
查看>>
重温冒泡排序
查看>>
阿里云数据库连接MySql
查看>>
SQLyog(MySQL图形化开发工具)
查看>>
MySQL报错记录一下10061或者非自己的IP
查看>>
純前端 - 各種實現進度條
查看>>
Java 設計模式 - 建造者模式
查看>>
ES6 JavaScript 重新認識 Promise
查看>>
前端優化 - 防抖與節流
查看>>
Spring--04--AOP增强
查看>>
2020-07-16:如何获得一个链表的倒数第n个元素?
查看>>
2020-11-04:java里,总体说一下集合框架。
查看>>
2020-12-04:mysql 表中允许有多少个 TRIGGERS?
查看>>
2020-12-10:i++是原子操作吗?为什么?
查看>>
2021-01-12:多维快查多维查询系统,你了解的解决方案都有哪些?
查看>>
2021-01-17:java中,HashMap底层数据结构是什么?
查看>>
2021-01-21:java中,HashMap的读流程是什么?
查看>>
Imagination官方信息速递2021年光线追踪专刊
查看>>
计算机视觉中的双目立体视觉和体积度量
查看>>