一、用户浏览历史记录:
用户在访问每个商品详情页面时,都要记录浏览记录。
历史记录只需要保存多个商品的sku_id即可, 而且需要保持添加sku_id的顺序, 所以采用redis中列表来保存,redis的数据存储设计。
'history_用户id': [sku_id,]
在配置文件中增加浏览历史记录的redis配置
# meiduo_mall/settings/dev.py
# 配置redis
CACHES = {
...
"history":{
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/3",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
1.保存:
请求方式: POST /browse_histories/
请求参数: JSON或表单
参数 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku_id | str | 是 | 商品sku的编号 |
返回数据: JSON
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
sku_id | str | 是 | 商品sku的编号 |
后端实现:
在goods/views.py中实现视图类:
# meiduo_mall/apps/goods/views.py
...
class SKUHistoryView(CreateAPIView):
""" 保存用户历史浏览记录 """
serializer_class = SKUHisrotySerializer
在goods/serializers.py中实现序列化器
# meiduo_mall/apps/goods/serializers.py
...
class SKUHisrotySerializer(serializers.Serializer):
"""用户历史浏览记录序列化器"""
sku_id = serializers.IntegerField(label="sku编号", min_value=1)
def validated(self, attrs):
"""
判断sku_id是否存在
:param attrs:
:return:
"""
try:
SKU.objects.get(id = attrs["sku_id"])
except:
raise serializers.ValidationError("商品不存在")
return attrs
def create(self, validated_data):
"""
保存浏览历史数据到redis中
1.建立redis链接
2.判断sku_id是否保存过
3.保存错,删除;没保存过,写入sku_id
4.控制保存数量
5.返回结果
:param validated_data:
:return:
"""
# 1.建立连接
conn = get_redis_connection('history')
user = self.context['request'].user
# 2.判断是否保存过
conn.lrem("history_{}".format(user.id), 0,validated_data['sku_id'])
# 3.写入
conn.lpush("history_{}".format(user.id), validated_data['sku_id'])
# 4.控制保存数量
conn.ltrim("history_{}".format(user.id), 0, 6)
# 5.返回
return validated_data
绑定路由: 在goods/urls.py中添加路由
2.查看:
请求方式: GET /browse_histories/
请求参数: 无
**返回数据:**JSON
返回值 | 类型 | 是否必须 | 说明 |
---|---|---|---|
id | int | 是 | 商品sku 编号 |
name | str | 是 | 商品名称 |
price | decimal | 是 | 单价 |
default_image_url | str | 是 | 默认图片 |
comments | int | 是 | 评论量 |
[
{
"id": 14,
"name": "华为 HUAWEI P10 Plus 6GB+128GB 玫瑰金 移动联通电信4G手机 双卡双待",
"price": "3788.00",
"default_image_url": "http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRdMSAaDUtAAVslh9vkK04466364",
"comments": 1
},
{
"id": 16,
"name": "华为 HUAWEI P10 Plus 6GB+128GB 曜石黑 移动联通电信4G手机 双卡双待",
"price": "3788.00",
"default_image_url": "http://image.meiduo.site:8888/group1/M00/00/02/CtM3BVrRdPeAXNDMAAYJrpessGQ9777651",
"comments": 0
}
]
后端实现:
在goods/views.py中SKUHistoryView中补充get方式
# meiduo_mall/apps/goods/views.py
...
class SKUHistoryView(CreateAPIView):
...
class SKUHistoryView(CreateAPIView):
""" 保存用户历史浏览记录 """
...
def get(self, request):
"""
获取用户浏览记录
:param request:
:return:
"""
user_id = request.user.id
redis_conn = get_redis_connection('history')
history = redis_conn.lrange("history_{}".format(user_id),0, 10)
skus = []
# 为了保持查询出的用户浏览的顺序一致
for sku_id in history:
sku = SKU.objects.get(id = sku_id)
skus.append(sku)
s = SKUSerializer(skus, many=True)
return Response(s.data)