购物车中心

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

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

所以接口应该有四种请求方式, 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. idea中如何打开RunDashboard窗口,微服务最实用设置
  2. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件
  3. 使用 XML 实现 REST 式的 SOA
  4. Hybris的extension和ABAP的package
  5. 引入静态变量_Common Lisp变量的一些事情
  6. php 单击图片放大,单击样列图片放大,再次点击缩回原图
  7. C语言:简单计算器多次使用代码实现
  8. 干货分享!软考中高项案例分析10大管理领域理论背诵要点
  9. 2019unity游戏开发需要学什么?
  10. 运维监控系统实战笔记(day1)
  11. 查询攻略,将多个退回延误的快递单号物流设置分类
  12. (十一)IPSec协议
  13. linux 修改键盘键值
  14. SpringCloud学习笔记day01
  15. serverlet快速入门
  16. Java核心技术卷一(百度云资源)
  17. 学如逆水行舟,不进则退。
  18. 关于互相帮忙投票的微信群、微信刷投票群、微信投票刷票群的详情介绍
  19. 程序员如何选择有价值的开源方向?
  20. 界面原型创建工具Axure使用教程之一:基本操作

热门文章

  1. sqlserver 班级排名_Sqlserver:班级排名问题(转发)
  2. linuxg下c++ 类导出_为什么PDF导出功能在SOLIDWORKS Electrical中不起作用?
  3. sql的error如何查看是什么故障_什么是420mA控制回路?常见故障如何排查?
  4. android dialog 隐藏状态栏_Android应用视图的管理者Window
  5. struts2文件上传(2)
  6. 批量生成6位数字_分享一款可做各种流水号的条码生成软件
  7. matlab 高斯模糊_摸鱼 | 茴香豆的“茴”有四种写法,模糊有几种糊法?
  8. 怎么在linux下查看gpu版本号,linux.查看gpu版本
  9. 螺旋矩阵O(1)根据坐标求值
  10. select及触发方式,select监听多链接,select与epoll的实现区别