基于redis购物车java代码_基于redis实现购物车

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

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

购物车实现原理

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

细说

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

package com.chenfeng.ego.portal.interceptro;

import java.util.HashMap;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import com.smallming.commons.util.CookieUtils;

import com.smallming.commons.util.HttpClientUtil;

import com.smallming.commons.util.JsonUtils;

import com.smallming.ego.pojo.TbUser;

public class CartInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

throws Exception {

System.out.println("执行了拦截器");

try {

//如果用户没有登录跳转到登录页面

String cookieValue = CookieUtils.getCookieValue(request, "TT_TOKEN");

if(cookieValue!=null&&!cookieValue.equals("")){

//还可以向redis取内容

Map param = new HashMap<>();

param.put("callback","abc");

String result = HttpClientUtil.doPost("http://localhost:8084/user/token/"+cookieValue,param);

String userinfo = result.substring(result.indexOf("{")+1,result.lastIndexOf("}"));

if(userinfo.trim().length()>0){

TbUser user = JsonUtils.jsonToPojo(userinfo, TbUser.class);

return true;

}

}

response.sendRedirect("http://localhost:8084/user/showLogin");

//如果用户已经登录放行.

return false;

} catch (Exception e) {

e.printStackTrace();

response.sendRedirect("http://localhost:8084/user/showLogin");

return false;

}

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

throws Exception {

}

}当用户点击购物车跳转的时候判断用户是否没有登录的话就跳转到登录页面

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

package com.chenfeng.ego.portal.service.impl;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.http.client.utils.HttpClientUtils;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Service;

import com.chenfeng.ego.commons.util.CookieUtils;

import com.chenfeng.ego.commons.util.HttpClientUtil;

import com.chenfeng.ego.commons.util.JsonUtils;

import com.chenfeng.ego.pojo.TbItem;

import com.chenfeng.ego.pojo.TbUser;

import com.chenfeng.ego.portal.dao.JedisDao;

import com.chenfeng.ego.portal.pojo.TbItemImages;

import com.chenfeng.ego.portal.service.CarService;

@Service

public class TbCarServiceImpl implements CarService

{

@Resource

private JedisDao dao;

@Value("${itemDetailUrl}")

private String url;

@Value("${getUserInfoUrl}")

private String getUserInfoUrl;

@Override

//购物车第一步先判断cookie传递过来的值car+取出的redis里面的存储的字符串转化的对象的username(username唯一)

//然后判断redis是否存在

//如果不存在的话就创建一个购物车存放在redis中 key为car+username

//每次进入这个service存储在redis中的字符串的num要进行+1操作

public List addCare(long id,HttpServletRequest request,HttpServletResponse respone)

{

//不能用car+uuid因为每次登陆uuid是会变化的所以用不变的就是username

String userinfo = dao.get("user-"+CookieUtils.getCookieValue(request, "TT_TOKEN")) ;

//获取用户的名字

String key = "cart-" + JsonUtils.jsonToPojo(userinfo, TbUser.class).getUsername();

//判断是否有购物车

if(dao.exists(key))

{

//若果存在的话 判断集合中是否存在该商品

String redisResult = dao.get(key);

List list = JsonUtils.jsonToList(redisResult, TbItemImages.class);

boolean isExist = false;

//循环判断改id是否存在如果存在的话num+1

for(TbItemImages tbItemImages : list)

{

if(tbItemImages.getId()==id)

{

isExist = true;

tbItemImages.setNum(tbItemImages.getNum()+1);

break;

}

}

//如果购物车存在但是id不存在就重新添加一个并重新set进去

if(!isExist)

{

Map map = new HashMap<>();

map.put("id", id+"");

String result = HttpClientUtil.doPost(url, map);

TbItemImages tbItem = JsonUtils.jsonToPojo(result, TbItemImages.class);

//第一次创建购物车时将物品设置为1

tbItem.setNum(1);

tbItem.setImages(tbItem.getImages()==null||"".equals("")?new String[0]:tbItem.getImage().split(","));

list.add(tbItem);

}

dao.set(key, JsonUtils.objectToJson(list));

return list;

}else

//没有key表示没有购物车 将购物车装到redis中

{

Map map = new HashMap<>();

map.put("id", id+"");

String result = HttpClientUtil.doPost(url, map);

TbItemImages tbItem = JsonUtils.jsonToPojo(result, TbItemImages.class);

//第一次创建购物车时将物品设置为1

tbItem.setNum(1);

tbItem.setImages(tbItem.getImages()==null||"".equals("")?new String[0]:tbItem.getImage().split(","));

List list = new ArrayList<>();

list.add(tbItem);

dao.set(key, JsonUtils.objectToJson(list));

return list;

}

}

@Override

//查询购物车中的商品 利用tttoken获得redis里面的对象在获得其username

public List selCart(HttpServletRequest req)

{

String userInfo = dao.get("user-"+CookieUtils.getCookieValue(req, "TT_TOKEN"));

String key = "cart-"+ JsonUtils.jsonToPojo(userInfo, TbUser.class).getUsername();

Boolean exits = dao.exists(key);

if(exits)

{

return JsonUtils.jsonToList(dao.get(key),TbItemImages.class);

}

return new ArrayList();

}

//更新购物车里面的商品数目

@Override

public int UpdatNum(long id, String num, HttpServletRequest req)

{

int number = 0;

if(num.endsWith(".action"))

{

number = Integer.parseInt(num.substring(0, num.indexOf(".")));

}else

{

number = Integer.parseInt(num);

}

String userInfo = dao.get("user-"+CookieUtils.getCookieValue(req, "TT_TOKEN"));

String key = "cart-"+ JsonUtils.jsonToPojo(userInfo, TbUser.class).getUsername();

String result = dao.get(key);

List list = JsonUtils.jsonToList(result,TbItemImages.class);

for (TbItemImages tbItemImages : list)

{

if(id==tbItemImages.getId())

{

tbItemImages.setNum(number);

break;

}

}

String set = dao.set(key, JsonUtils.objectToJson(list));

if(set.equals("OK"))

{

return 1;

}

return 0;

}

}

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

本版积分规则

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

下载期权论坛手机APP