电商-购物车模块

ShopItem:

package com.kejin.shopcar.bean;

import lombok.Data;

import java.io.Serializable;

@Data
public class ShopItem implements Serializable {

    //skuid
    private Long skuId;

    //商品数量
    private Integer num;

    //是否有货 0有货 1无货
    private Integer isHave;

    //是否选中 0未选中 1选中
    private Integer isCheck;

    //记录时价格
    private Double recordPrice;

    //记录品类id
    private Long categoryId;


}
RedisCacheConfig:
package com.kejin.shopcar.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;


@Component
public class RedisCacheConfig {

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(redisTemplate.getKeySerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}


 ShopCarConstant:

package com.kejin.shopcar.constant;

public class ShopCarConstant {

    //用户购物车信息
    public static String shopCarFormal ="goods:shopCar:formal";

    //用户临时购物车信息
    public static String shopCarTemp ="goods:shopCar:temp";

}

ShopCarController:

package com.kejin.shopcar.controller;

import com.kejin.shopcar.bean.ShopItem;
import com.kejin.shopcar.constant.ShopCarConstant;
import com.kejin.shopcar.utils.RequestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Controller
@ResponseBody
public class ShopCarController {

/*  http://127.0.0.1:8080/addShopToCar?userId=123456789
    http://127.0.0.1:8080/login?userId=123456789
    http://127.0.0.1:8080/updateShopCarNum?userId=123456789&skuId=10080&num=9
    http://127.0.0.1:8080/removeShopToCar?userId=123456789&skuId=10080*/

    @Autowired
    private RedisTemplate redisTemplate;

     @GetMapping("/addShopToCar")
        public String addShopToCar(HttpServletRequest request, HttpServletResponse response,String userId){

            String shopCarId=null==userId?RequestUtil.getCSessionId(request, response):userId;
            String shopCarPreFix=null==userId?ShopCarConstant.shopCarTemp:ShopCarConstant.shopCarFormal;

            Random random = new Random();

            ShopItem shopItem=new ShopItem();
            shopItem.setSkuId((long) random.nextInt(100));
            shopItem.setNum(2);
            shopItem.setIsHave(0);
            shopItem.setIsCheck(0);
            shopItem.setRecordPrice(11.8);
            shopItem.setCategoryId(1L);

            Map<Long, ShopItem> shopCarMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(shopCarPreFix).get(shopCarId);

            if(null==shopCarMap){
                shopCarMap=new HashMap<>();
            }

            shopCarMap.put(shopItem.getSkuId(),shopItem);

            redisTemplate.boundHashOps(shopCarPreFix).put(shopCarId,shopCarMap);

            return "true";
         }


    @GetMapping("/login")
    public String mergeShopCar(HttpServletRequest request, HttpServletResponse response,String userId){

        String shopCarTempId=RequestUtil.getCSessionId(request, response);

        String shopCarFormalId=userId;

        Map<Long, ShopItem> shopCarTempMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(ShopCarConstant.shopCarTemp).get(shopCarTempId);

        Map<Long, ShopItem> shopCarFormalMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(ShopCarConstant.shopCarFormal).get(shopCarFormalId);

        Map<Long, ShopItem> resMap=new HashMap<>();
        if(null!=shopCarTempMap){
         resMap.putAll(shopCarTempMap);
        }
        resMap.putAll(shopCarFormalMap);

        redisTemplate.boundHashOps(ShopCarConstant.shopCarTemp).delete(shopCarTempId);

        redisTemplate.boundHashOps(ShopCarConstant.shopCarFormal).put(shopCarFormalId,resMap);

        return "true";
    }

    @GetMapping("/updateShopCarNum")
    public String updateShopCarNum(HttpServletRequest request, HttpServletResponse response,String userId,Long skuId,Integer num){

        String shopCarId=null==userId?RequestUtil.getCSessionId(request, response):userId;
        String shopCarPreFix=null==userId?ShopCarConstant.shopCarTemp:ShopCarConstant.shopCarFormal;

        Map<Long, ShopItem> shopCarMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(shopCarPreFix).get(shopCarId);

        if(null==shopCarMap){
            return "false";
        }

        ShopItem shopItem=shopCarMap.get(skuId+"");
        shopItem.setNum(num);

        shopCarMap.put(skuId,shopItem);

        redisTemplate.boundHashOps(shopCarPreFix).put(shopCarId,shopCarMap);

        return "true";
    }

    @GetMapping("/removeShopToCar")
    public String removeShopToCar(HttpServletRequest request, HttpServletResponse response,String userId,Long skuId){

        String shopCarId=null==userId?RequestUtil.getCSessionId(request, response):userId;
        String shopCarPreFix=null==userId?ShopCarConstant.shopCarTemp:ShopCarConstant.shopCarFormal;

        Map<Long, ShopItem> shopCarMap= (Map<Long, ShopItem>) redisTemplate.boundHashOps(shopCarPreFix).get(shopCarId);
        shopCarMap.remove(skuId+"");

        redisTemplate.boundHashOps(shopCarPreFix).put(shopCarId,shopCarMap);

        return "true";
    }

}

RequestUtil:

package com.kejin.shopcar.utils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

public class RequestUtil {
   //获取CSessionID
   public static String getCSessionId(HttpServletRequest request, HttpServletResponse response){
      //1, 从Request中取Cookie
      Cookie[] cookies = request.getCookies();
      //2, 从Cookie数据中遍历查找, 并取CSessionID
      if (null != cookies && cookies.length > 0) {
              for (Cookie cookie : cookies) {
              if ("CSESSIONID".equals(cookie.getName())) {
                      //有, 直接返回
                      return cookie.getValue();
                }
                 }
       }
       //没有, 创建一个CSessionId, 并且放到Cookie再返回浏览器.返回新的CSessionID
       String csessionid = UUID.randomUUID().toString().replaceAll("-", "");
       //并且放到Cookie中
       Cookie cookie = new Cookie("CSESSIONID", csessionid);
       //cookie  每次都带来, 设置路径
       cookie.setPath("/");
       //0:关闭浏览器  销毁cookie. 0:立即消失.  >0 存活时间,秒
       cookie.setMaxAge(-1);
       //添加cookie
       response.addCookie(cookie);
       return csessionid;
   }
 }

项目结构:

 

猜你喜欢

转载自blog.csdn.net/u013008898/article/details/113435997