用戶瀏覽歷史記錄


用戶在訪問每個商品詳情頁面時,都要記錄瀏覽歷史記錄

歷史記錄只需保存多個商品的sku_id即可,而且需要保持添加sku_id的順序,所以采用redis中的列表來保存,redis的數據存儲設計

'history_用戶id': [sku_id列表] 

在配置文件中增加瀏覽歷史記錄的redis配置

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中實現序列化器

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中編寫視圖

class UserBrowsingHistoryView(mixins.CreateModelMixin, GenericAPIView): """ 用戶瀏覽歷史記錄 """ serializer_class = AddUserBrowsingHistorySerializer permission_classes = [IsAuthenticated] def post(self, request): """ 保存 """ return self.create(request) 

前端實現

在detail.js中添加

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

[
    {
        "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方法

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM