基于redis实现购物车

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-31 20:53   43   0

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

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

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP