前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django实战-生鲜电商-加入购物车

Django实战-生鲜电商-加入购物车

作者头像
小团子
发布2019-07-18 16:10:03
7260
发布2019-07-18 16:10:03
举报
文章被收录于专栏:数据云团

用户在进入个人中心前,都需要判断用户是否登录。在加入购物车之前,判断商品是否存在。如果用户已登录,则保存购物车数据到redis中;操作redis,保存购物车数据,"cart_用户id": {"sku_1": 10, "sku_2": 11},先尝试从用户的购物车中获取这个商品的数量;如果购物车中不存在这个商品,则直接添加购物车记录,否则,需要进行数量的累计,再添加到购物车记录中。

① 判断用户是否登录

代码语言:javascript
复制
if not request.user.is_authenticated():
    # 用户未登录
    return JsonResponse({"code": 1, "message": "用户未登录"})

② 获取商品 id 和商品数量

代码语言:javascript
复制
# sku_id 商品id
sku_id = request.POST.get("sku_id")

# count 商品数量
count = request.POST.get("count")

③ 判断商品是否存在

代码语言:javascript
复制
try:
    sku = GoodsSKU.objects.get(id=sku_id)
except GoodsSKU.DoesNotExist:
    # 表示商品不存在
    return JsonResponse({"code": 3, "message": "商品不存在"})

④ 加入购物车

代码语言:javascript
复制
class AddCartView(View):
    """加入购物车"""
    def post(self, request):
        # # 判断用户是否登录
        # if not request.user.is_authenticated():
        #     # 用户未登录
        #     return JsonResponse({"code": 1, "message": "用户未登录"})

        # sku_id 商品id
        sku_id = request.POST.get("sku_id")

        # count 商品数量
        count = request.POST.get("count")

        # 检验参数l
        if not all([sku_id, count]):
            return JsonResponse({"code": 2, "message": "参数不完整"})

        # 判断商品是否存在
        try:
            sku = GoodsSKU.objects.get(id=sku_id)
        except GoodsSKU.DoesNotExist:
            # 表示商品不存在
            return JsonResponse({"code": 3, "message": "商品不存在"})

        # 判断count是整数
        try:
            count = int(count)
        except Exception:
            return JsonResponse({"code": 4, "message": "参数错误"})

        # 判断库存
        if count > sku.stock:
            return JsonResponse({"code": 5, "message": "库存不足"})

        if request.user.is_authenticated():
            # 如果用户已登录,则保存购物车数据到redis中

            # 用户id
            user_id = request.user.id

            # 操作redis,保存购物车数据
            # "cart_用户id": {"sku_1": 10, "sku_2": 11}
            # 先尝试从用户的购物车中获取这个商品的数量
            # 如果购物车中不存在这个商品,则直接添加购物车记录
            # 否则,需要进行数量的累计,在添加到购物车记录中
            redis_conn = get_redis_connection("default")
            origin_count = redis_conn.hget("cart_%s" % user_id, sku_id)  # 原有数量

            if origin_count is not None:
                count += int(origin_count)

            redis_conn.hset("cart_%s" % user_id, sku_id, count)

            # 为了方便前端展示购物车数量,所以查询一下购物车总数
            cart_num = 0
            cart = redis_conn.hgetall("cart_%s" % user_id)
            for val in cart.values():
                cart_num += int(val)

            # 采用json返回给前端
            return JsonResponse({"code": 0, "message": "添加购物车成功", "cart_num": cart_num})
        else:
            # 如果用户未登录,则将购物车数据保存到cookie中
            # 尝试先从cookie的购物车信息中获取当前商品的记录
            cart_json = request.COOKIES.get("cart")  # 取出json字符串格式的购物车数据
            # 判断cart_json是否存在,用户可能从来没有操作过购物车
            if cart_json is not None:
                cart = json.loads(cart_json)  # cart是字典类型
                # { “sku_1”:10, “sku_2”: 20  }
            else:
                cart = {}

            # 如果cart中有这个商品的记录信息,
            if sku_id in cart:
                # 把数量进行求和,
                origin_count = cart[sku_id]  # 原有数量
                count += origin_count
            # 存放到cart字典中
            cart[sku_id] = count

            # 将cart购物车字典数据转换为json字符串
            new_cart_json = json.dumps(cart)

            # 计算购物车的商品总数
            cart_num = 0
            for val in cart.values():
                cart_num += val

            # 将购物车数据存放到cookie中
            response = JsonResponse({"code": 0, "message": "添加购物车成功", "cart_num": cart_num})

            response.set_cookie("cart", new_cart_json)

            # 返回处理结果
            return response
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档