欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

电商项目(二十一)购物车(登陆情况下)

程序员文章站 2022-04-14 23:18:11
...

一、用户登录状态下的购物车操作

1. 将商品添加到购物车

1.1 在common_redis服务中实现缓存购物车信息

在common_redis模块,新增CartController,新增方法:将购物车的信息缓存到redis,方法的参数:@RequestBody Map<String,Object> map,方法的返回值:void

在业务层中实现将商品添加到缓存中
电商项目(二十一)购物车(登陆情况下)

1.2 在common_redis服务中实现查询购物车信息

在common_redis模块,新增CartController,新增方法:根据用户ID查询购物车,方法的参数:@RequestParam String userId,方法的返回值:Map<String ,CartItem >

在业务层中实现查询购物车
电商项目(二十一)购物车(登陆情况下)

1.3 在frontend_cart服务中实现用户在登陆状态下向购物车添加商品

在CartController中,在用户已经登录的情况下,
在业务层层中,方法的参数:Long itemId,Integer num,String userId,返回值: Result
电商项目(二十一)购物车(登陆情况下)
流程:
第一,查询商品
定义方法,查询商品
电商项目(二十一)购物车(登陆情况下)
第二,获取购物车(根据用户的id)
定义方法,获取购物车
电商项目(二十一)购物车(登陆情况下)

第三,将商品加入购物车
电商项目(二十一)购物车(登陆情况下)

第四,将购物车信息保存到Redis中
电商项目(二十一)购物车(登陆情况下)

1.4 在frontend_cart服务中实现用户在登陆状态下向查看购物车商品

在CartController中实现用户登录的情况下的购物车
在业务层中RedisCartServiceImpl中,新增方法,查看购物车,电商项目(二十一)购物车(登陆情况下)

1.5 在frontend_cart服务中实现用户在登陆状态下购物车商品的数量修改

电商项目(二十一)购物车(登陆情况下)

1.6 在frontend_cart服务中实现用户在登陆状态下购物车商品的删除

电商项目(二十一)购物车(登陆情况下)

1.7 在frontend_sso模块实现用户登录业务实现购物车同步业务和删除

将临时购物车的商品同步到永久购物车



/**
 * 用户注册与登录业务层
 */
@Service
public class SSOServiceImpl implements SSOService {

    @Autowired
    private TbUserMapper tbUserMapper;

    @Autowired
    private CommonRedisFeignClient commonRedisFeignClient;


    @Value("${cart_cookie_name}")
    private String cart_cookie_name;

    /**
     * 对用户的注册信息(用户名与电话号码)做数据校验
     */
    @Override
    public Result checkUserInfo(String checkValue, Integer checkFlag) {
        TbUserExample example =new TbUserExample();
        TbUserExample.Criteria criteria = example.createCriteria();
        if(checkFlag == 1){
            criteria.andUsernameEqualTo(checkValue);
        }else if(checkFlag == 2){
            criteria.andPhoneEqualTo(checkValue);
        }
        Integer rows = this.tbUserMapper.countByExample(example);
        if(rows > 0){
            return Result.error("数据不可用");
        }
        return Result.ok(checkValue);
    }

    /**
     * 用户注册
     */
    @Override
    @LcnTransaction
    public Result userRegister(TbUser user) {
        //将密码做加密处理。
        String pwd = MD5Utils.digest(user.getPassword());
        user.setPassword(pwd);
        //补齐数据
        user.setCreated(new Date());
        user.setUpdated(new Date());
        this.tbUserMapper.insert(user);
        return Result.ok();
    }

    /**
     * 用户登录
     * @param username
     * @param password
     * @return
     */
    @Override
    public Result userLogin(String username, String password,HttpServletRequest request,HttpServletResponse response) {
        //根据用户名密码查询数据库
        TbUser tbUser = this.login(username,password);
        if(tbUser == null){
            return Result.error("用户名或密码有误,请重新输入");
        }
        //将用户添加到Redis中
        String userToken = UUID.randomUUID().toString();
        Integer flag = this.insertUserToRedis(tbUser,userToken);
        if(flag == 500){
            return Result.error("登录失败");
        }
        Map<String,String> map = new HashMap<>();
        map.put("token",userToken);
        map.put("userid",tbUser.getId().toString());
        map.put("username",tbUser.getUsername());

        //将临时购物车中的商品同步到永久购物车中
        this.syncCart(tbUser.getId().toString(),request);
        //同步购物车成功后,需要将临时购物车中的商品删除掉
        this.deleteCookieCart(request,response);
        return Result.ok(map);
    }

    /**
     * 同步购物车
     */
    private void syncCart(String userId,HttpServletRequest request){
        //获取临时购物车
        Map<String,CartItem> cookieCart = this.getCart(request);
        //获取永久购物车
        Map<String,CartItem> redisCart = this.getCart(userId);
        //删除永久购物车中所包含临时购物车中的商品
        Set<String> keys = cookieCart.keySet();
        for(String key:keys){
            redisCart.remove(key);
        }
        //将同步后的购物车缓存到redis中
        redisCart.putAll(cookieCart);
        //将永久购物车重新缓存到redis中
        this.addCartToRedis(userId,redisCart);
    }
    /**
     * 获取临时购物车
     */
    private Map<String,CartItem> getCart(HttpServletRequest request){
        //临时购物车已存在
        String cartJson= CookieUtils.getCookieValue(request,this.cart_cookie_name,true);
        if(StringUtils.isBlank(cartJson)){
            //临时购物车不存在
            return new HashMap<String,CartItem>();
        }
        try{
            //如果含有临时购物车,那么需要做json转换
            Map<String,CartItem> map = JsonUtils.jsonToMap(cartJson,CartItem.class);
            return map;
        }catch(Exception e){
            e.printStackTrace();
        }
        return new HashMap<String,CartItem>();
    }
    /**
     * 获取永久购物车
     */
    private Map<String,CartItem> getCart(String userId){
        try{
            Map<String,CartItem> cart = this.commonRedisFeignClient.selectCartByUserId(userId);
            if(cart == null){
                cart = new HashMap<String,CartItem>();
            }
            return cart;
        }catch(Exception e){
            e.printStackTrace();
        }
        return new HashMap<String,CartItem>();
    }

    /**
     * 将永久购物车重新缓存到redis中
     */
    private void addCartToRedis(String userId,Map<String,CartItem> cart){
        Map<String,Object> map = new HashMap<>();
        map.put("userId",userId);
        map.put("cart",cart);
        this.commonRedisFeignClient.insertCart(map);
    }

    /**
     * 用户登录业务处理
     */
    private TbUser login(String username,String password){
        String pwd = MD5Utils.digest(password);
        TbUserExample example = new TbUserExample();
        TbUserExample.Criteria criteria = example.createCriteria();
        criteria.andUsernameEqualTo(username);
        criteria.andPasswordEqualTo(pwd);
        List<TbUser> list = this.tbUserMapper.selectByExample(example);
        if(list == null || list.size() <= 0){
            return null;
        }
        return list.get(0);
    }
    /**
     * 将用户添加到Redis中
     */
    private Integer insertUserToRedis(TbUser tbUser,String userToken){
        try{
            this.commonRedisFeignClient.insertUser(tbUser,userToken);
            return 200;
        }catch(Exception e){
            e.printStackTrace();
        }
        return 500;
    }

   
}

相关标签: 电商