合并购物车

合并购物车逻辑分析

  1. 合并方向:cookie 购物车数据合并到 Redis 购物车数据中。
  2. 合并数据:购物车商品数据和勾选状态。
  3. 合并方案:
    1. Redis 数据库中的购物车数据保留。

    2. 如果 cookie 中的购物车数据在 Redis 数据库中已存在
      将 cookie 购物车数据覆盖 Redis 购物车数据。

    3. 如果 cookie 中的购物车数据在 Redis 数据库中不存在,
      将 cookie 购物车数据新增到 Redis。

    4. 最终购物车的勾选状态以 cookie 购物车勾选状态为准。

合并购物车逻辑实现

import base64
import pickle
from django_redis import get_redis_connection


def merge_cart_cookie_to_redis(request, response, user):
    '''
    合并购物车中cookie的数据到redis
    :return: 
    '''
    # 1.获取cookie的数据
    cookie_cart = request.COOKIES.get('carts')

    # 2.判断数据是否存在, 如过不存在, 返回
    if not cookie_cart:
        return response

    # 3.如果存在, 解密
    cart_dict = pickle.loads(base64.b64decode(cookie_cart))

    new_dict = {} # hash: user_id:{sku_id:count}
    new_add = []
    new_remove = []
    # 4.整理格式(dict add remove)
    for sku_id, dict in cart_dict.items():
        new_dict[sku_id] = dict.get('count')

        if dict['selected']:
            # true
            new_add.append(sku_id)
        else:
            # false
            new_remove.append(sku_id)

    # 5.链接redis
    redis_conn = get_redis_connection('carts')

    # 6.往hash写入(dict)
    redis_conn.hmset('carts_%s' % user.id, new_dict)

    # 7.往set中增加或者删除
    if new_add:
        redis_conn.sadd('selected_%s' % user.id, *new_add)

    if new_remove:
        redis_conn.srem('selected_%s' % user.id, *new_remove)

    # 8.删除cookie
    response.delete_cookie('carts')

    # 9.返回
    return response
posted @ 2019-07-24 21:55  太虚真人  阅读(610)  评论(0编辑  收藏  举报