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

news/2024/5/18 14:44:25 标签: python, web, cookie, ajax, redis

展示商品页面简单购物车

需求:用户鼠标悬停在商品页面右上角购物车标签上,以下拉框形式展示当前购物车数据。

1. 简单购物车数据接口设计和定义

1.请求方式

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

2.请求参数:

3.响应结果:JSON

字段说明
code状态码
errmsg错误信息
cart_skus[ ]简单购物车SKU列表
id购物车SKU编号
name购物车SKU名称
count购物车SKU数量
default_image_url购物车SKU图片
{
    "code":"0",
    "errmsg":"OK",
    "cart_skus":[
        {
            "id":1,
            "name":"Apple MacBook Pro 13.3英寸笔记本 银色",
            "count":1,
            "default_image_url":"http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429"
        },
        ......
    ]
}

4.后端接口定义

class CartsSimpleView(View):
    """商品页面右上角购物车"""

    def get(self, request):
        # 判断用户是否登录
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询Redis购物车
            pass
        else:
            # 用户未登录,查询cookie购物车
            pass

        # 构造简单购物车JSON数据
        pass

2. 简单购物车数据后端逻辑实现

1.查询Redis购物车

class CartsSimpleView(View):
    """商品页面右上角购物车"""

    def get(self, request):
        # 判断用户是否登录
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询Redis购物车
            redis_conn = get_redis_connection('carts')
            redis_cart = redis_conn.hgetall('carts_%s' % user.id)
            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:
            # 用户未登录,查询cookie购物车
            pass

        # 构造简单购物车JSON数据
        pass

2.查询Redis购物车

class CartsSimpleView(View):
    """商品页面右上角购物车"""

    def get(self, request):
        # 判断用户是否登录
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询Redis购物车
            ......
        else:
            # 用户未登录,查询cookie购物车
            cart_str = request.COOKIES.get('carts')
            if cart_str:
                cart_dict = pickle.loads(base64.b64decode(cart_str.encode()))
            else:
                cart_dict = {}

3.构造简单购物车JSON数据

class CartsSimpleView(View):
    """商品页面右上角购物车"""

    def get(self, request):
        # 判断用户是否登录
        user = request.user
        if user.is_authenticated:
            # 用户已登录,查询Redis购物车
            ......
        else:
            # 用户未登录,查询cookie购物车
            ......

        # 构造简单购物车JSON数据
        cart_skus = []
        sku_ids = cart_dict.keys()
        skus = models.SKU.objects.filter(id__in=sku_ids)
        for sku in skus:
            cart_skus.append({
                'id':sku.id,
                'name':sku.name,
                'count':cart_dict.get(sku.id).get('count'),
                'default_image_url': sku.default_image.url
            })

        # 响应json列表数据
        return http.JsonResponse({'code':RETCODE.OK, 'errmsg':'OK', 'cart_skus':cart_skus})

3. 展示商品页面简单购物车

1.商品页面发送Ajax请求

  • index.jslist.jsdetail.js

get_carts(){
    let url = '/carts/simple/';
    axios.get(url, {
        responseType: 'json',
    })
        .then(response => {
            this.carts = response.data.cart_skus;
            this.cart_total_count = 0;
            for(let i=0;i<this.carts.length;i++){
                if (this.carts[i].name.length>25){
                    this.carts[i].name = this.carts[i].name.substring(0, 25) + '...';
                }
                this.cart_total_count += this.carts[i].count;
            }
        })
        .catch(error => {
            console.log(error.response);
        })
},

2.商品页面渲染简单购物车数据

  • index.htmllist.htmldetail.html

<div @mouseenter="get_carts" class="guest_cart fr" v-cloak>
    <a href="{{ url('carts:info') }}" class="cart_name fl">我的购物车</a>
    <div class="goods_count fl" id="show_count">[[ cart_total_count ]]</div>
    <ul class="cart_goods_show">
        <li v-for="sku in carts">
            <img :src="sku.default_image_url" alt="商品图片">
            <h4>[[ sku.name ]]</h4>
            <div>[[ sku.count ]]</div>
        </li>
    </ul>
</div>

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

相关文章

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

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

阿语python美多商城-订单-提交订单之第8.2.3节使用事务保存订单数据

使用事务保存订单数据重要提示&#xff1a;在保存订单数据时&#xff0c;涉及到多张表&#xff08;OrderInfo、OrderGoods、SKU、SPU&#xff09;的数据修改&#xff0c;对这些数据的修改应该是一个整体事务&#xff0c;即要么一起成功&#xff0c;要么一起失败。Django中对于数…

阿语python美多商城-订单-提交订单之第8.2.2节保存订单基本信息和订单商品信息...

1. 提交订单接口设计和定义1.请求方式选项方案请求方法POST请求地址/orders/commit/2.请求参数&#xff1a;JSON参数名类型是否必传说明address_idint是用户地址编号pay_methodint是用户支付方式3.响应结果&#xff1a;JSON字段说明code状态码errmsg错误信息order_id订单编号4.…

阿语python美多商城-支付-对接支付宝系统之第9.2.2节保存订单支付结果

1. 支付结果数据说明用户订单支付成功后&#xff0c;支付宝会将用户重定向到 http://www.meiduo.site:8000/payment/status/&#xff0c;并携带支付结果数据。参考统一收单下单并支付页面接口&#xff1a;https://docs.open.alipay.com/270/alipay.trade.page.pay提示&#xff…

阿语python美多商城-支付-对接支付宝系统之第9.2.1节订单支付功能

今天更新完成就已经把所有的多美商场的文档更新完成&#xff0c;要是想看视频的可以去b站关注&#xff1a;阿语学 订单支付功能提示&#xff1a;订单支付触发页面&#xff1a;《order_success.html》 和 《user_center_order.html》我们实现订单支付功能时&#xff0c;只需要向…

阿语python美多商城-性能优化-页面静态化之第10.2.2节Django实现MySQL读写分离

Django实现MySQL读写分离1. 增加slave数据库的配置DATABASES {default: { # 写&#xff08;主机&#xff09;ENGINE: django.db.backends.mysql, # 数据库引擎HOST: 192.168.103.158, # 数据库主机PORT: 3306, # 数据库端口USER: itcast, # 数据库用户名PASSWORD: 123456, # 数…

阿语python美多商城-性能优化-页面静态化之第10.1.1节首页广告页面静态化

首页广告页面静态化思考&#xff1a;美多商城的首页访问频繁&#xff0c;而且查询数据量大&#xff0c;其中还有大量的循环处理。问题&#xff1a;用户访问首页会耗费服务器大量的资源&#xff0c;并且响应数据的效率会大大降低。解决&#xff1a;页面静态化1. 页面静态化介绍1…

阿语python美多商城-支付-评价订单商品之第9.3.1节评价订单商品

评价订单商品1. 展示商品评价页面1.请求方式选项方案请求方法GET请求地址/orders/comment/2.请求参数&#xff1a;查询参数参数名类型是否必传说明order_idint是订单编号3.响应结果&#xff1a;HTMLgoods_judge.html4.后端接口定义和实现class OrderCommentView(LoginRequiredM…