购物车中心

用户点击价格策略加入购物车,个人中心可以查看自己所有购物车中数据

在购物车中可以删除课程,还可以更新购物车中课程的价格策略

所以接口应该有四种请求方式, get,post,patch,delete

购物车是属于中间状态数据,而且很多时候需要过期时间,所以我们选择redis

读取速度快,并且redis可以做持久化,支持的数据类型也比较多。

要点:将购物车数据组织放到reids中,reids的增删改查对应http的四种请求方法 。对购物车操作前需验证。

加入购物车接口

# 前端传过来的数据结构
  { 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 redisSHOPPINGCAR_KEY = "SHOPPINGCAR_%s_%s"
CONN = redis.Redis(connection_pool=POOL)class ShoppingCarView(APIView):authentication_classes = [LoginAuth, ]def post(self, request):res = BaseResponse()# 1, 获取前端传过来的数据以及user_idcourse_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 = 1040res.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 = 1041res.error = "价格策略id不合法"return Response(res.dict)# 3,构建redisKEYkey = 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  写入redisCONN.hmset(key, course_info)res.data = "加入购物车成功"return Response(res.dict)

加入购物车接口处理

接口测试

查看购物车接口

    def get(self, request):res = BaseResponse()# 1, 拼接redis keyuser_id = request.user.pkshopping_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 = retreturn Response(res.dict)

更新购物车

更新购物车中课程的价格策略

PUT以及DELETE接口

    def put(self, request):# 前端 course_id  price_policy_idres = BaseResponse()# 1, 获取前端传过来的数据以及user_idcourse_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 = 1043res.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 = 1044res.error = "价格策略不合法"return Response(res.dict)# 3, 更新redis  default_price_policy_idCONN.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_idcourse_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 = 1045res.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_idcourse_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 = 1040res.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 = 1041res.error = "价格策略id不合法"return Response(res.dict)# 3,构建redisKEYkey = 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  写入redisCONN.hmset(key, course_info)res.data = "加入购物车成功"return Response(res.dict)def get(self, request):res = BaseResponse()# 1, 拼接redis keyuser_id = request.user.pkshopping_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 = retreturn Response(res.dict)def put(self, request):# 前端 course_id  price_policy_idres = BaseResponse()# 1, 获取前端传过来的数据以及user_idcourse_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 = 1043res.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 = 1044res.error = "价格策略不合法"return Response(res.dict)# 3, 更新redis  default_price_policy_idCONN.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_idcourse_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 = 1045res.error = "课程ID不合法"return Response(res.dict)# 3, 删除redis数据CONN.delete(key)res.data = "删除成功"return Response(res.dict)

shopping

qhfl-6 购物车相关推荐

  1. 基于Vue开发的购物车案例

    需求:具有增加数量.减少数量.移除书信息.计算总价等功能. HTML: <!DOCTYPE html> <html lang="en"> <head& ...

  2. python实战演练_python实战演练(三)购物车程序

    #-*- Coding:utf-8 -*-#Author: kking '''购物车需求 用户入口: 1.商品信息存在文件里 2.已购商品,余额记录.第一次启动程序时需要记录工资,第二次启动程序时谈出 ...

  3. java 购物车价格类型_WooCommerce - 为购物车中的每个产品添加自定义价格

    更新:对于WooCommerce 3.0,在WooCommerce 3.0版中更改购物车商品价格 您可以使用 woocommerce_before_calculate_totals hook来自定义购 ...

  4. 实例 - 购物车 (列表、循环)

    salary = int(input('Please input your money:'))product = [('iphone6s',5800),('mac bood',9000),('coff ...

  5. Python 基础 - Day 2 Assignment - ShoppingCart 购物车程序

    作业要求 1.启动程序后,输入用户名密码后,如果是第一次登录,让用户输入工资,然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 4.可随 ...

  6. python购物车程序详解用字典_Python_购物车程序[列表嵌套字典]

    1 product = [{"名称": "电脑", "价格": 999, '数量': 0}, {"名称": " ...

  7. 一个逻辑清晰的购物车模型

    效果图 2017-03-25 18.28.23.gif GitHub: https://github.com/lll1024/JVShopcart 说明 这是一个具备常规功能并方便改造的购物车模型 一 ...

  8. Day2 - Python基础2作业【文件操作--购物车程序(用户操作及商户操作)】

    1 # ----user.txt---- 2 3 {'已购商品': '', '消费记录': '', '余额': 0} 4 5 6 # ----commodity.txt---- 7 8 iPhone, ...

  9. 美多商城之购物车(展示商品页面简单购物车)

    三.展示商品页面简单购物车 需求:用户鼠标悬停在商品页面右上角购物车标签上,以下拉框形式展示当前购物车数据. 3.1. 简单购物车数据接口设计和定义 1.请求方式 选项 方案 请求方法 GET 请求地 ...

  10. 美多商城之购物车(购物车管理3)

    2.5 全选购物车 提示:在购物车页面修改购物车使用局部刷新的效果. 2.5.1. 全选购物车接口设计和定义 1.请求方式 选项 方案 请求方法 PUT 请求地址 /carts/selection/ ...

最新文章

  1. 《数据结构》知识点Day_03
  2. day15:磁盘格式化和挂载
  3. rational rose 逆向工程
  4. C++ 中的 #pragma warning(push) 和 #pragma warning(pop)有什么用
  5. bin文件如何编辑_如何为高通固件创建rawprogram0和patch0文件
  6. java中的列表栈链表_Java数据结构(栈,队列,双链表)
  7. python中while的用法_Python—while循环,内涵五种九九乘法表
  8. python+request+Excel做接口自动化测试
  9. 基于MATLAB的无线视频传输
  10. 惊!我竟然破解了Ta的交换机/路由器的登录密码
  11. 51单片机最小系统原理图、PCB及组成原理详解
  12. ACdream - 1069 - 无耻的出题人
  13. 三d眩晕可以学计算机,如何才能避免3D晕眩?3种方法教你解决!
  14. 阿里开发者招聘节 | 面试题14:如何实现两金额数据相加(最多小数点两位)
  15. 腾讯云​学生机官网(云+校园)
  16. 微信JSAPI支付 - 服务商模式下子商户 统一下单的注意事项
  17. BUAA_OO 第二单元多线程电梯问题作业总结
  18. Google Earth Engine(GEE)——逐月降水数据下载和直方图表展示
  19. 同余.H1061快速幂
  20. 数据库原理--数据库管理系统的功能与组成

热门文章

  1. linux usb 重启,在ubuntu下重启指定的USB口
  2. java hashmap value_Java HashMap values() 方法
  3. lms自适应滤波器实现噪声干扰的语音恢复_ZLG深度解析语音识别技术
  4. pythondes加密盒子_PYTHON实现DES加密及base64源码
  5. Linux的基本原则
  6. 误执行了rm -fr /*之后,除了跑路还能怎么办?!
  7. 真叫人头秃!Python也有pdb
  8. 一站配齐所有国内镜像,第三方库安装提升 10 倍
  9. 炒鸡简单,带你快速撸一遍Numpy代码!
  10. dell驱动安装工具_技术丨如何快速安装显卡驱动