三、展示商品页面简单购物车
需求:用户鼠标悬停在商品页面右上角购物车标签上,以下拉框形式展示当前购物车数据。
3.1. 简单购物车数据接口设计和定义1.请求方式
选项方案请求方法GET请求地址/carts/simple/ # 展示商品右上角购物车
url(r'^carts/simple/$', views.CartsSimpleView.as_view()),
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
3.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.查询Cookie购物车
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.3. 展示商品页面简单购物车
1.商品页面发送Ajax请求
index.js
、list.js
、detail.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;i25){
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.html
、list.html
、detail.html
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录