阿语python美多商城-商品-购物车管理之第7.2.2节展示购物车

news/2024/5/18 14:12:15 标签: cookie, docker, redis, python, session

1. 展示购物车接口设计和定义

1.请求方式

选项方案
请求方法GET
请求地址/carts/

2.请求参数:

3.响应结果:HTML

cart.html

4.后端接口定义

class CartsView(View):
    """购物车管理"""

    def get(self, request):
        """展示购物车"""
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询redis购物车
            pass
        else:
            # 用户未登录,查询cookies购物车
            pass

2. 展示购物车后端逻辑实现

1.查询Redis购物车

class CartsView(View):
    """购物车管理"""

    def get(self, request):
        """展示购物车"""
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询redis购物车
            redis_conn = get_redis_connection('carts')
            # 获取redis中的购物车数据
            redis_cart = redis_conn.hgetall('carts_%s' % user.id)
            # 获取redis中的选中状态
            cart_selected = redis_conn.smembers('selected_%s' % user.id)

            # 将redis中的数据构造成跟cookie中的格式一致,方便统一查询
            cart_dict = {}
            for sku_id, count in redis_cart.items():
                cart_dict[int(sku_id)] = {
                    'count': int(count),
                    'selected': sku_id in cart_selected
                }
        else:
            # 用户未登录,查询cookies购物车
            pass

2.查询cookie购物车

class CartsView(View):
    """购物车管理"""

    def get(self, request):
        """展示购物车"""
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询redis购物车
            ......
        else:
            # 用户未登录,查询cookies购物车
            cart_str = request.COOKIES.get('carts')
            if cart_str:
                # 将cart_str转成bytes,再将bytes转成base64的bytes,最后将bytes转字典
                cart_dict = pickle.loads(base64.b64decode(cart_str.encode()))
            else:
                cart_dict = {}

3.查询购物车SKU信息

class CartsView(View):
    """购物车管理"""

    def get(self, request):
        """展示购物车"""
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询redis购物车
            ......
        else:
            # 用户未登录,查询cookies购物车
            ......

        # 构造购物车渲染数据
        sku_ids = cart_dict.keys()
        skus = models.SKU.objects.filter(id__in=sku_ids)
        cart_skus = []
        for sku in skus:
            cart_skus.append({
                'id':sku.id,
                'name':sku.name,
                'count': cart_dict.get(sku.id).get('count'),
                'selected': str(cart_dict.get(sku.id).get('selected')),  # 将True,转'True',方便json解析
                'default_image_url':sku.default_image.url,
                'price':str(sku.price), # 从Decimal('10.2')中取出'10.2',方便json解析
                'amount':str(sku.price * cart_dict.get(sku.id).get('count')),
            })

        context = {
            'cart_skus':cart_skus,
        }

        # 渲染购物车页面
        return render(request, 'cart.html', context)

4.渲染购物车信息

<div class="total_count">全部商品<em>[[ total_count ]]</em>件</div>
<ul class="cart_list_th clearfix">
    <li class="col01">商品名称</li>
    <li class="col03">商品价格</li>
    <li class="col04">数量</li>
    <li class="col05">小计</li>
    <li class="col06">操作</li>
</ul>
<ul class="cart_list_td clearfix" v-for="(cart_sku,index) in carts" v-cloak>
    <li class="col01"><input type="checkbox" name="" v-model="cart_sku.selected" @change="update_selected(index)"></li>
    <li class="col02"><img :src="cart_sku.default_image_url"></li>
    <li class="col03">[[ cart_sku.name ]]</li>
    <li class="col05">[[ cart_sku.price ]]元</li>
    <li class="col06">
        <div class="num_add">
            <a @click="on_minus(index)" class="minus fl">-</a>
            <input v-model="cart_sku.count" @blur="on_input(index)" type="text" class="num_show fl">
            <a @click="on_add(index)" class="add fl">+</a>
        </div>
    </li>
    <li class="col07">[[ cart_sku.amount ]]元</li>
    <li class="col08"><a @click="on_delete(index)">删除</a></li>
</ul>
<ul class="settlements" v-cloak>
    <li class="col01"><input type="checkbox" name="" @change="on_selected_all" v-model="selected_all"></li>
    <li class="col02">全选</li>
    <li class="col03">合计(不含运费):<span>¥</span><em>[[ total_selected_amount ]]</em><br>共计<b>[[ total_selected_count ]]</b>件商品</li>
    <li class="col04"><a href="place_order.html">去结算</a></li>
</ul>

http://www.niftyadmin.cn/n/739725.html

相关文章

阿语python美多商城-商品-购物车管理之第7.2.1节添加购物车

提示&#xff1a;在商品详情页添加购物车使用局部刷新的效果。1. 添加购物车接口设计和定义1.请求方式选项方案请求方法POST请求地址/carts/2.请求参数&#xff1a;JSON参数名类型是否必传说明sku_idint是商品SKU编号countint是商品数量selectedbool否是否勾选3.响应结果&#…

阿语python美多商城-商品-购物车之第7.1节购物车存储方案

购物车存储方案用户登录与未登录状态下&#xff0c;都可以保存购物车数据。用户对购物车数据的操作包括&#xff1a;增、删、改、查、全选等等每个用户的购物车数据都要做唯一性的标识。1. 登录用户购物车存储方案1.存储数据说明如何描述一条完整的购物车记录&#xff1f;用户i…

阿语python美多商城-订单-提交订单之第8.2.4节使用乐观锁并发下单

使用乐观锁并发下单重要提示&#xff1a;在多个用户同时发起对同一个商品的下单请求时&#xff0c;先查询商品库存&#xff0c;再修改商品库存&#xff0c;会出现资源竞争问题&#xff0c;导致库存的最终结果出现异常。1. 并发下单问题演示和解决方案解决办法&#xff1a;悲观锁…

阿语python美多商城-订单之第8.3节我的订单

我的订单1.请求方式选项方案请求方法GET请求地址/orders/info/(?P<page_num>\d)/2.请求参数&#xff1a;路径参数参数名类型是否必传说明page_numint是当前页码3.响应结果&#xff1a;HTMLuser_center_order.html4.后端接口定义和实现class UserOrderInfoView(LoginRequ…

阿语python美多商城-订单-结算订单之第8.1节结算订单

结算订单1. 结算订单逻辑分析结算订单是从Redis购物车中查询出被勾选的商品信息进行结算并展示。2. 结算订单接口设计和定义1.请求方式选项方案请求方法GET请求地址/orders/settlement/2.请求参数&#xff1a;无3.响应结果&#xff1a;HTMLplace_order.html4.后端接口定义class…

阿语python美多商城-订单-提交订单之第8.2.1节创建订单数据库表

创建订单数据库表生成的订单数据要做持久化处理&#xff0c;而且需要在《我的订单》页面展示出来。1. 订单数据库表分析注意&#xff1a;订单号不再采用数据库自增主键&#xff0c;而是由后端生成。一个订单中可以有多个商品信息&#xff0c;订单基本信息和订单商品信息是一对多…

阿语python美多商城-商品-购物车管理之第7.3节展示商品页面简单购物车

展示商品页面简单购物车需求&#xff1a;用户鼠标悬停在商品页面右上角购物车标签上&#xff0c;以下拉框形式展示当前购物车数据。1. 简单购物车数据接口设计和定义1.请求方式选项方案请求方法GET请求地址/carts/simple/2.请求参数&#xff1a;无3.响应结果&#xff1a;JSON字…

阿语python美多商城-订单-提交订单之第8.2.5节展示提交订单成功页面

展示提交订单成功页面支付方式&#xff1a;货到付款支付方式&#xff1a;支付宝1.请求方式选项方案请求方法GET请求地址/orders/success/2.请求参数&#xff1a;无3.响应结果&#xff1a;HTMLorder_success.html4.后端接口定义和实现class OrderSuccessView(LoginRequiredMixin…