前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用户浏览历史记录_微博怎么看最近浏览过的用户

用户浏览历史记录_微博怎么看最近浏览过的用户

作者头像
全栈程序员站长
发布2022-09-20 10:50:06
6320
发布2022-09-20 10:50:06
举报
文章被收录于专栏:全栈程序员必看

用户在访问每个商品详情页面时,都要记录浏览历史记录

历史记录只需保存多个商品的sku_id即可,而且需要保持添加sku_id的顺序,所以采用redis中的列表来保存,redis的数据存储设计

代码语言:javascript
复制
'history_用户id': [sku_id列表] 

在配置文件中增加浏览历史记录的redis配置

代码语言:javascript
复制
CACHES = {
    ...
    "history": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://10.211.55.5:6379/3", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } }, } 

1. 保存

后端接口设计

请求方式:POST /browse_histories/

请求参数:JSON 或 表单

参数

类型

是否必须

说明

sku_id

int

商品sku 编号

返回数据:JSON

返回值

类型

是否必须

说明

sku_id

int

商品sku 编号

后端实现

在users/serializes.py中实现序列化器

代码语言:javascript
复制
class AddUserBrowsingHistorySerializer(serializers.Serializer): """ 添加用户浏览历史序列化器 """ sku_id = serializers.IntegerField(label="商品SKU编号", min_value=1) def validate_sku_id(self, value): """ 检验sku_id是否存在 """ try: SKU.objects.get(id=value) except SKU.DoesNotExist: raise serializers.ValidationError('该商品不存在') return value def create(self, validated_data): """ 保存 """ user_id = self.context['request'].user.id sku_id = validated_data['sku_id'] redis_conn = get_redis_connection("history") pl = redis_conn.pipeline() # 移除已经存在的本商品浏览记录 pl.lrem("history_%s" % user_id, 0, sku_id) # 添加新的浏览记录 pl.lpush("history_%s" % user_id, sku_id) # 只保存最多5条记录 pl.ltrim("history_%s" % user_id, 0, constants.USER_BROWSING_HISTORY_COUNTS_LIMIT-1) pl.execute() return validated_data 

在users/views.py中编写视图

代码语言:javascript
复制
class UserBrowsingHistoryView(mixins.CreateModelMixin, GenericAPIView): """ 用户浏览历史记录 """ serializer_class = AddUserBrowsingHistorySerializer permission_classes = [IsAuthenticated] def post(self, request): """ 保存 """ return self.create(request) 
前端实现

在detail.js中添加

代码语言:javascript
复制
mounted: function(){ // 添加用户浏览历史记录 this.get_sku_id(); if (this.user_id) { axios.post(this.host+'/browse_histories/', { sku_id: this.sku_id }, { headers: { 'Authorization': 'JWT ' + this.token } }) } this.get_cart(); this.get_hot_goods(); this.get_comments(); }, 

2. 查看

后端接口设计

请求方式:GET /browse_histories/

请求参数: 无

返回数据: JSON

代码语言:javascript
复制
[
    {
        "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 } ] 

返回值

类型

是否必须

说明

id

int

商品sku 编号

name

str

商品名称

price

decimal

单价

default_image_url

str

默认图片

comments

int

评论量

后端实现

在users/views.py中UserBrowsingHistoryView视图补充get方法

代码语言:javascript
复制
from goods.serializers import SKUSerializer class UserBrowsingHistoryView(mixins.CreateModelMixin, GenericAPIView): """ 用户浏览历史记录 """ ... def get(self, request): """ 获取 """ user_id = request.user.id redis_conn = get_redis_connection("history") history = redis_conn.lrange("history_%s" % user_id, 0, constants.USER_BROWSING_HISTORY_COUNTS_LIMIT-1) 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)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168091.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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