qhfl-6 購物車

購物車中心前端

用戶點擊價格策略加入購物車,我的中心能夠查看本身全部購物車中數據redis

在購物車中能夠刪除課程,還能夠更新購物車中課程的價格策略django

因此接口應該有四種請求方式, get,post,patch,deletejson

購物車是屬於中間狀態數據,並且不少時候須要過時時間,因此咱們選擇redis數據結構

讀取速度快,而且redis能夠作持久化,支持的數據類型也比較多。app

要點:將購物車數據組織放到reids中,reids的增刪改查對應http的四種請求方法 。對購物車操做前需驗證。ide

加入購物車接口

# 前端傳過來的數據結構
  { course_id , price_policy_id}

# 把購物車數據放入redis中的結構
"""
{
    SHOPPINGCAR_USERID_COURSE_ID: {
        "id", 
        "title",
        "course_img",
        "price_policy_dict": {
            price_policy_id: "{valid_period,  price}"
            price_policy_id2: "{valid_period,  price}"
            price_policy_id3: "{valid_period,  price}"        
        },
        "default_price_policy_id": 1   }
}
"""
"""
    購物車接口
    1010 表明成功
    1011 課程不存在
    1012 價格策略不存在
    1013 獲取購物車失敗
    1014 刪除的購物車數據不存在
"""

 

from rest_framework.views import APIView
from rest_framework.response import Response
from utils.base_response import BaseResponse
from utils.my_auth import LoginAuth
from utils.redis_pool import POOL
from Course.models import Course
import json
import redis


SHOPPINGCAR_KEY = "SHOPPINGCAR_%s_%s"
CONN = redis.Redis(connection_pool=POOL)


class ShoppingCarView(APIView):
    authentication_classes = [LoginAuth, ]

    def post(self, request):
        res = BaseResponse()
        # 1, 獲取前端傳過來的數據以及user_id
        course_id = request.data.get("course_id", "")
        price_policy_id = request.data.get("price_policy_id", "")
        user_id = request.user.pk
        # 2, 校驗數據的合法性
        # 2.1 校驗課程id合法性
        course_obj = Course.objects.filter(id=course_id).first()
        if not course_obj:
            res.code = 1040
            res.error = "課程id不合法"
            return Response(res.dict)
        # 2.2 校驗價格策略id是否合法
        price_policy_queryset = course_obj.price_policy.all()
        price_policy_dict = {}
        for price_policy in price_policy_queryset:
            price_policy_dict[price_policy.id] = {
                "price": price_policy.price,
                "valid_period": price_policy.valid_period,
                "valid_period_display": price_policy.get_valid_period_display()
            }
        if price_policy_id not in price_policy_dict:
            res.code = 1041
            res.error = "價格策略id不合法"
            return Response(res.dict)
        # 3,構建redisKEY
        key = SHOPPINGCAR_KEY % (user_id, course_id)
        # 4,構建數據結構
        course_info = {
            "id": course_obj.id,
            "title": course_obj.title,
            "course_img": str(course_obj.course_img),
            "price_policy_dict": json.dumps(price_policy_dict, ensure_ascii=False),
            "default_price_policy_id": price_policy_id
        }
        # 5  寫入redis
        CONN.hmset(key, course_info)
        res.data = "加入購物車成功"
        return Response(res.dict)

加入購物車接口處理

 

接口測試post

 

查看購物車接口

 

    def get(self, request):
        res = BaseResponse()
        # 1, 拼接redis key
        user_id = request.user.pk
        shopping_car_key = SHOPPINGCAR_KEY % (user_id, "*")       # 購物車可能
        # 2, 去redis中讀取數據
        # 2.1 匹配全部的keys
        # 3,構建數據結構展現
        all_keys = CONN.scan_iter(shopping_car_key)       # redis 掃描類似的
        ret = []
        for key in all_keys:
            ret.append(CONN.hgetall(key))
        res.data = ret
        return Response(res.dict)

 

 

 

更新購物車

更新購物車中課程的價格策略測試

PUT以及DELETE接口spa

    def put(self, request):
        # 前端 course_id  price_policy_id
        res = BaseResponse()
        # 1, 獲取前端傳過來的數據以及user_id
        course_id = request.data.get("course_id", "")
        price_policy_id = request.data.get("price_policy_id", "")
        user_id = request.user.pk
        # 2, 校驗數據的合法性
        # 2.1 course_id是否合法
        key = SHOPPINGCAR_KEY % (user_id, course_id)
        if not CONN.exists(key):
            res.code = 1043
            res.error = "課程id不合法"
            return Response(res.dict)
        # 2,2 price_policy_id是否合法
        price_policy_dict = json.loads(CONN.hget(key, "price_policy_dict"))
        print(price_policy_dict)
        if str(price_policy_id) not in price_policy_dict:
            res.code = 1044
            res.error = "價格策略不合法"
            return Response(res.dict)
        # 3, 更新redis  default_price_policy_id
        CONN.hset(key, "default_price_policy_id", price_policy_id)
        res.data = "更新成功"
        return Response(res.dict)

 

 

刪除購物車的課程

這裏多是一到多個課程,所以將課程id存到一個列表裏面

  def delete(self, request):
        # course_list = [course_id, ]
        res = BaseResponse()
        # 1 獲取前端傳來的數據以及user_id
        course_list = request.data.get("course_list", "")
        user_id = request.user.pk
        # 2 校驗course_id是否合法
        for course_id in course_list:
            key = SHOPPINGCAR_KEY % (user_id, course_id)
            if not CONN.exists(key):
                res.code = 1045
                res.error = "課程ID不合法"
                return Response(res.dict)
            # 3, 刪除redis數據
            CONN.delete(key)
        res.data = "刪除成功"
        return Response(res.dict)

 

 

 

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.base_response import BaseResponse
from utils.my_auth import LoginAuth
from utils.redis_pool import POOL
from Course.models import Course
import json
import redis

# Create your views here.

# 前端傳過來 course_id  price_policy_id
# 把購物車數據放入redis
"""
{
    SHOPPINGCAR_USERID_COURSE_ID: {
        "id", 
        "title",
        "course_img",
        "price_policy_dict": {
            price_policy_id: "{valid_period,  price}"
            price_policy_id2: "{valid_period,  price}"
            price_policy_id3: "{valid_period,  price}"        
        },
        "default_price_policy_id": 1     
    }
}
"""

SHOPPINGCAR_KEY = "SHOPPINGCAR_%s_%s"
CONN = redis.Redis(connection_pool=POOL)


class ShoppingCarView(APIView):
    authentication_classes = [LoginAuth, ]

    def post(self, request):
        res = BaseResponse()
        # 1, 獲取前端傳過來的數據以及user_id
        course_id = request.data.get("course_id", "")
        price_policy_id = request.data.get("price_policy_id", "")
        user_id = request.user.pk
        # 2, 校驗數據的合法性
        # 2.1 校驗課程id合法性
        course_obj = Course.objects.filter(id=course_id).first()
        if not course_obj:
            res.code = 1040
            res.error = "課程id不合法"
            return Response(res.dict)
        # 2.2 校驗價格策略id是否合法
        price_policy_queryset = course_obj.price_policy.all()
        price_policy_dict = {}
        for price_policy in price_policy_queryset:
            price_policy_dict[price_policy.id] = {
                "price": price_policy.price,
                "valid_period": price_policy.valid_period,
                "valid_period_display": price_policy.get_valid_period_display()
            }
        if price_policy_id not in price_policy_dict:
            res.code = 1041
            res.error = "價格策略id不合法"
            return Response(res.dict)
        # 3,構建redisKEY
        key = SHOPPINGCAR_KEY % (user_id, course_id)
        # 4,構建數據結構
        course_info = {
            "id": course_obj.id,
            "title": course_obj.title,
            "course_img": str(course_obj.course_img),
            "price_policy_dict": json.dumps(price_policy_dict, ensure_ascii=False),
            "default_price_policy_id": price_policy_id
        }
        # 5  寫入redis
        CONN.hmset(key, course_info)
        res.data = "加入購物車成功"
        return Response(res.dict)

    def get(self, request):
        res = BaseResponse()
        # 1, 拼接redis key
        user_id = request.user.pk
        shopping_car_key = SHOPPINGCAR_KEY % (user_id, "*")
        # 2, 去redis中讀取數據
        # 2.1 匹配全部的keys
        # 3,構建數據結構展現
        all_keys = CONN.scan_iter(shopping_car_key)
        ret = []
        for key in all_keys:
            ret.append(CONN.hgetall(key))
        res.data = ret
        return Response(res.dict)

    def put(self, request):
        # 前端 course_id  price_policy_id
        res = BaseResponse()
        # 1, 獲取前端傳過來的數據以及user_id
        course_id = request.data.get("course_id", "")
        price_policy_id = request.data.get("price_policy_id", "")
        user_id = request.user.pk
        # 2, 校驗數據的合法性
        # 2.1 course_id是否合法
        key = SHOPPINGCAR_KEY % (user_id, course_id)
        if not CONN.exists(key):
            res.code = 1043
            res.error = "課程id不合法"
            return Response(res.dict)
        # 2,2 price_policy_id是否合法
        price_policy_dict = json.loads(CONN.hget(key, "price_policy_dict"))
        print(price_policy_dict)
        if str(price_policy_id) not in price_policy_dict:
            res.code = 1044
            res.error = "價格策略不合法"
            return Response(res.dict)
        # 3, 更新redis  default_price_policy_id
        CONN.hset(key, "default_price_policy_id", price_policy_id)
        res.data = "更新成功"
        return Response(res.dict)

    def delete(self, request):
        # course_list = [course_id, ]
        res = BaseResponse()
        # 1 獲取前端傳來的數據以及user_id
        course_list = request.data.get("course_list", "")
        user_id = request.user.pk
        # 2 校驗course_id是否合法
        for course_id in course_list:
            key = SHOPPINGCAR_KEY % (user_id, course_id)
            if not CONN.exists(key):
                res.code = 1045
                res.error = "課程ID不合法"
                return Response(res.dict)
            # 3, 刪除redis數據
            CONN.delete(key)
        res.data = "刪除成功"
        return Response(res.dict)
shopping
相關文章
相關標籤/搜索