基于redis实现购物车

转载 2018年04月17日 10:31:16

https://blog.csdn.net/u012878380/article/details/54170238


如果大家不知道我下面说的redis-cookie单点登录,那么请看我的上篇文章基于cookie-redis实现的单点登录点击打开链接

购物车实现原理

利用上篇所讲的cookie-redis中的用户信息中的username来作为reids中的key,value来存储用户的信息。

细说

要想将物品加入购物车那么必定要先登录之后才能加入购物车,因为我们 需要cookie中存放的用户的name(为什么不能用uuid作为key那,因为用户每次登录的时候uuid都是不一样的那么必定会使用户加入购物车的商品不复存在 )。所以我们需要首先进行拦截

[java] view plain copy
  1. package com.chenfeng.ego.portal.interceptro;  
  2.   
  3. import java.util.HashMap;  
  4. import java.util.Map;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8.   
  9. import org.springframework.web.servlet.HandlerInterceptor;  
  10. import org.springframework.web.servlet.ModelAndView;  
  11.   
  12. import com.smallming.commons.util.CookieUtils;  
  13. import com.smallming.commons.util.HttpClientUtil;  
  14. import com.smallming.commons.util.JsonUtils;  
  15. import com.smallming.ego.pojo.TbUser;  
  16.   
  17. public class CartInterceptor implements HandlerInterceptor {  
  18.   
  19.     @Override  
  20.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  
  21.             throws Exception {  
  22.         System.out.println("执行了拦截器");  
  23.         try {  
  24.             //如果用户没有登录跳转到登录页面  
  25.             String cookieValue = CookieUtils.getCookieValue(request, "TT_TOKEN");  
  26.             if(cookieValue!=null&&!cookieValue.equals("")){  
  27.                 //还可以向redis取内容  
  28.                 Map<String,String> param = new HashMap<>();  
  29.                 param.put("callback","abc");  
  30.                 String result = HttpClientUtil.doPost("http://localhost:8084/user/token/"+cookieValue,param);  
  31.                 String userinfo = result.substring(result.indexOf("{")+1,result.lastIndexOf("}"));  
  32.                 if(userinfo.trim().length()>0){  
  33.                     TbUser user = JsonUtils.jsonToPojo(userinfo, TbUser.class);  
  34.                     return true;  
  35.                 }  
  36.             }  
  37.             response.sendRedirect("http://localhost:8084/user/showLogin");  
  38.             //如果用户已经登录放行.  
  39.             return false;  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.             response.sendRedirect("http://localhost:8084/user/showLogin");  
  43.             return false;  
  44.         }  
  45.     }  
  46.   
  47.     @Override  
  48.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,  
  49.             ModelAndView modelAndView) throws Exception {  
  50.           
  51.     }  
  52.   
  53.     @Override  
  54.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)  
  55.             throws Exception {  
  56.           
  57.     }  
  58.   
  59. }  
当用户点击购物车跳转的时候判断用户是否没有登录的话就跳转到登录页面

当用户登录之后他得用户信息就会被保存下来,我们就可以将用户的username(单点登录的时候将用户对象封装到字符串中放到redis中)取出来(将封装的用户的字符串转换 成对象)作为redis的key,商品的信息作为value存放在redis中下面是代码示例

[java] view plain copy
  1. package com.chenfeng.ego.portal.service.impl;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.   
  8. import javax.annotation.Resource;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import org.apache.http.client.utils.HttpClientUtils;  
  13. import org.springframework.beans.factory.annotation.Value;  
  14. import org.springframework.stereotype.Service;  
  15.   
  16. import com.chenfeng.ego.commons.util.CookieUtils;  
  17. import com.chenfeng.ego.commons.util.HttpClientUtil;  
  18. import com.chenfeng.ego.commons.util.JsonUtils;  
  19. import com.chenfeng.ego.pojo.TbItem;  
  20. import com.chenfeng.ego.pojo.TbUser;  
  21. import com.chenfeng.ego.portal.dao.JedisDao;  
  22. import com.chenfeng.ego.portal.pojo.TbItemImages;  
  23. import com.chenfeng.ego.portal.service.CarService;  
  24. @Service  
  25. public class TbCarServiceImpl implements CarService  
  26. {  
  27.     @Resource  
  28.     private JedisDao dao;  
  29.     @Value("${itemDetailUrl}")  
  30.     private String url;  
  31.     @Value("${getUserInfoUrl}")  
  32.     private String getUserInfoUrl;  
  33.     @Override  
  34.      //购物车第一步先判断cookie传递过来的值car+取出的redis里面的存储的字符串转化的对象的username(username唯一)   
  35.     //然后判断redis是否存在  
  36.    //如果不存在的话就创建一个购物车存放在redis中  key为car+username  
  37.    //每次进入这个service存储在redis中的字符串的num要进行+ 1操作  
  38.     public List<TbItemImages> addCare(long id,HttpServletRequest  request,HttpServletResponse respone)  
  39.     {  
  40.         //不能用car+uuid因为每次登陆uuid是会变化的所以用不变的就是username  
  41.         String userinfo = dao.get("user-"+CookieUtils.getCookieValue(request, "TT_TOKEN")) ;  
  42.         //获取用户的名字  
  43.         String key = "cart-" + JsonUtils.jsonToPojo(userinfo, TbUser.class).getUsername();  
  44.         //判断是否有购物车  
  45.         if(dao.exists(key))  
  46.         {  
  47.             //若果存在的话 判断集合中是否存在该商品  
  48.             String redisResult = dao.get(key);  
  49.             List<TbItemImages> list = JsonUtils.jsonToList(redisResult, TbItemImages.class);  
  50.             boolean isExist = false;  
  51.             //循环判断改id是否存在如果存在的话num+1  
  52.             for(TbItemImages tbItemImages : list)  
  53.             {  
  54.                 if(tbItemImages.getId()==id)  
  55.                 {  
  56.                     isExist = true;  
  57.                     tbItemImages.setNum(tbItemImages.getNum()+1);  
  58.                     break;  
  59.                 }  
  60.             }  
  61.             //如果购物车存在但是id不存在就重新添加一个并重新set进去  
  62.             if(!isExist)  
  63.             {  
  64.                 Map<String,String> map = new HashMap<>();  
  65.                 map.put("id", id+"");  
  66.                 String result = HttpClientUtil.doPost(url, map);  
  67.                 TbItemImages tbItem = JsonUtils.jsonToPojo(result, TbItemImages.class);  
  68.                 //第一次创建购物车时将物品设置为1  
  69.                 tbItem.setNum(1);  
  70.                 tbItem.setImages(tbItem.getImages()==null||"".equals("")?new String[0]:tbItem.getImage().split(","));  
  71.                 list.add(tbItem);  
  72.             }  
  73.             dao.set(key, JsonUtils.objectToJson(list));  
  74.             return list;  
  75.         }else  
  76.         //没有key表示没有购物车 将购物车装到redis中  
  77.         {         
  78.             Map<String,String> map = new HashMap<>();  
  79.             map.put("id", id+"");  
  80.             String result = HttpClientUtil.doPost(url, map);  
  81.             TbItemImages tbItem = JsonUtils.jsonToPojo(result, TbItemImages.class);  
  82.             //第一次创建购物车时将物品设置为1  
  83.             tbItem.setNum(1);  
  84.             tbItem.setImages(tbItem.getImages()==null||"".equals("")?new String[0]:tbItem.getImage().split(","));  
  85.             List<TbItemImages> list = new ArrayList<>();  
  86.             list.add(tbItem);  
  87.             dao.set(key, JsonUtils.objectToJson(list));  
  88.             return list;  
  89.         }  
  90.     }  
  91.     @Override  
  92.     //查询购物车中的商品  利用tttoken获得redis里面的对象在获得其username  
  93.     public List<TbItemImages> selCart(HttpServletRequest req)  
  94.     {  
  95.         String userInfo = dao.get("user-"+CookieUtils.getCookieValue(req, "TT_TOKEN"));  
  96.         String key = "cart-"+ JsonUtils.jsonToPojo(userInfo, TbUser.class).getUsername();  
  97.         Boolean exits = dao.exists(key);  
  98.         if(exits)  
  99.         {  
  100.             return JsonUtils.jsonToList(dao.get(key),TbItemImages.class);  
  101.         }  
  102.         return new ArrayList<TbItemImages>();  
  103.     }  
  104.     //更新购物车里面的商品数目  
  105.     @Override  
  106.     public int UpdatNum(long id, String num, HttpServletRequest req)  
  107.     {  
  108.         int number = 0;  
  109.         if(num.endsWith(".action"))  
  110.         {  
  111.             number = Integer.parseInt(num.substring(0, num.indexOf(".")));  
  112.         }else  
  113.         {  
  114.             number = Integer.parseInt(num);  
  115.         }  
  116.          String userInfo = dao.get("user-"+CookieUtils.getCookieValue(req, "TT_TOKEN"));  
  117.          String key = "cart-"+ JsonUtils.jsonToPojo(userInfo, TbUser.class).getUsername();  
  118.          String result =  dao.get(key);  
  119.          List<TbItemImages> list = JsonUtils.jsonToList(result,TbItemImages.class);  
  120.          for (TbItemImages tbItemImages : list)  
  121.         {  
  122.             if(id==tbItemImages.getId())  
  123.             {  
  124.                 tbItemImages.setNum(number);  
  125.                 break;  
  126.             }  
  127.         }  
  128.         String set = dao.set(key, JsonUtils.objectToJson(list));  
  129.         if(set.equals("OK"))  
  130.         {  
  131.             return 1;  
  132.         }  
  133.         return 0;  
  134.     }  
  135. }  

基于J2EE实现Webservice项目实战ATM

本课程主要基于J2EE实现Webservice项目实战ATM,通过本课程的学习,学员能开发Webservice应用
  • 2015年04月21日 10:56

一种基于redis的购物车实现方案(php)

namespaceHome\Controller; useThink\Controller; useOrg\Net\Http; useThink\Cache\Driver\Redis; cla...
  • m0_37184444
  • m0_37184444
  • 2017-08-25 20:50:32
  • 775

使用redis实现一个购物车功能

  • qq_33382313
  • qq_33382313
  • 2017-08-18 16:35:48
  • 1509

Cookie及Redis在商城购物车系统中的使用

关于商城中购物车功能,天猫是必须登录才能将商品加入到购物车,京东则可以在不登录状态下也可以加入购物车,这里就模仿京东购物车功能。...
  • qq_37334135
  • qq_37334135
  • 2017-08-31 19:12:33
  • 2971

在Django框架下,用redis实现购物车功能

因为购物车属于频繁被操作的对象,所以我们与之存储在数据库里,不如存储在内存里。所以我们选择redis。另外,购物车要显示用户购买商品的条目数,这个属于局部刷新,不能用户每次添加购物车都刷新整个页面,所...
  • Laqide
  • Laqide
  • 2017-12-10 15:02:51
  • 317

redis 购物车单例类

  • longxingzhiwen
  • longxingzhiwen
  • 2016-11-17 11:17:43
  • 321

redis解决购物车的问题

在逛各大电商网站的时候,总会有将商品加入购物车,然后合并付款,这个大大的提高了用户的体验,某东更是任性,在未登录的情况下都可以将商品加入购物车,但是任性总是有代价的,后面我会说一下这个小bug。可能不...
  • qfikh
  • qfikh
  • 2016-10-27 10:13:49
  • 10689

Redis中SortSet----实现购物车推荐

  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2015-12-15 17:08:39
  • 1614

使用Redis实现购物车

使用Redis实现购物车功能一般情况下购物车功能都是使用SESSION/COOKIE实现的,也就是将整个购物车数据都存储到SESSION中。这样做的好处就是不用操作数据库就可以实现,同时用户可以不同登...
  • lianghanjie54
  • lianghanjie54
  • 2017-08-17 14:10:45
  • 223

带有redis缓存,添加购物车代码解析

public void addCart(long itemId, int num, HttpServletRequest request) throws Exception { //获取要购买的商...
  • qq_29241925
  • qq_29241925
  • 2017-10-26 13:37:56
  • 148
收藏助手
不良信息举报
您举报文章:基于redis实现购物车
举报原因:
原因补充:

(最多只允许输入30个字)