當登錄用戶在瀏覽商品的詳情頁時,我們就可以把這件商品信息存儲起來,作為登錄用戶的瀏覽記錄。
用戶未登錄,我們不記錄其商品瀏覽記錄。
1. 存儲數據說明
雖然瀏覽記錄界面上要展示商品的一些SKU信息,但是我們在存儲時沒有必要存很多SKU信息。
我們選擇存儲SKU信息的唯一編號(sku_id)來表示該件商品的瀏覽記錄。
存儲數據:sku_id
2. 存儲位置說明
- 用戶瀏覽記錄是臨時數據,且經常變化,數據量不大,所以我們選擇內存型數據庫進行存儲。
- 存儲位置:
Redis數據庫 3號庫
CACHES = {
"history": { # 用戶瀏覽記錄
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/3",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
}
3. 存儲類型說明
由於用戶瀏覽記錄跟用戶瀏覽商品詳情的順序有關,所以我們選擇使用Redis中的list類型存儲 sku_id
每個用戶維護一條瀏覽記錄,且瀏覽記錄都是獨立存儲的,不能共用。所以我們需要對用戶的瀏覽記錄進行唯一標識。
我們可以使用登錄用戶的ID來唯一標識該用戶的瀏覽記錄。
存儲類型:'history_user_id' : [sku_id_1, sku_id_2, ...]

4. 存儲邏輯說明
SKU信息不能重復。
最近一次瀏覽的商品SKU信息排在最前面,以此類推。
每個用戶的瀏覽記錄最多存儲五個商品SKU信息。
存儲邏輯:先去重,再存儲,最后截取。
保存用戶瀏覽記錄
class UserBrowseHistory(View):
"""用戶瀏覽記錄"""
def post(self, request):
"""保存用戶瀏覽記錄"""
# 接收參數
json_dict = json.loads(request.body.decode())
sku_id = json_dict.get('sku_id')
# 校驗參數:
try:
SKU.objects.get(id=sku_id)
except SKU.DoesNotExist:
return http.HttpResponseForbidden('sku不存在')
# 保存用戶瀏覽數據
redis_conn = get_redis_connection('history')
pl = redis_conn.pipeline()
user_id = request.user.id
# 先去重: 這里給 0 代表去除所有的 sku_id
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, 4)
# 執行管道
pl.execute()
# 響應結果
return http.JsonResponse({'code': 0,
'errmsg': 'OK'})
查詢用戶瀏覽記錄
class UserBrowseHistory(View):
"""用戶瀏覽記錄"""
def get(self, request):
"""獲取用戶瀏覽記錄"""
# 獲取Redis存儲的sku_id列表信息
redis_conn = get_redis_connection('history')
sku_ids = redis_conn.lrange('history_%s' % request.user.id, 0, -1)
# 根據sku_ids列表數據,查詢出商品sku信息
skus = []
for sku_id in sku_ids:
sku = SKU.objects.get(id=sku_id)
skus.append({
'id': sku.id,
'name': sku.name,
'default_image_url': sku.default_image_url,
'price': sku.price
})
return http.JsonResponse({'code': 0,
'errmsg': 'OK',
'skus': skus})