购物车中心

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

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

所以接口应该有四种请求方式, 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 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)

加入购物车接口处理

接口测试

查看购物车接口

    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接口

    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

qhfl-6 购物车的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车

     阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...

  2. session实现购物车

    为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...

  3. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  4. PHP之购物车的代码

    该文章记录了购物车的实现代码,仅供参考 book_sc_fns.php <?php include_once('output_fns.php'); include_once('book_fns. ...

  5. 使用session页面控制登录入口及购物车效果的实现

          由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只 ...

  6. python学习笔记(列表、元组、购物车实例)

    一.列表 列表和字典是最常用的两种数据类型 1. 需求:怎么存放班级80多人的姓名,如何实现? names = ["Zhangyang","Guyun",&qu ...

  7. 简单实用angular.js购物车功能

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Java Web之网上购物系统(注册、登录、浏览商品、添加购物车)

    眼看就要期末了,我的专业课也迎来了第二次的期末作业---------<网上购物系统>.虽然老师的意图是在锻炼我们后台的能力,但是想着还是不利用网上的模板,准备自己写,以来别人写的静态页看不 ...

  9. 使用MongoDB和JSP实现一个简单的购物车系统

    目录 1 问题描述  2 解决方案  2.1  实现功能  2.2  最终运行效果图  2.3  系统功能框架示意图  2.4  有关MongoDB简介及系统环境配置  2.5  核心功能代码讲解  ...

  10. js抛物线动画——加入购物车动效

    参考文章:http://www.zhangxinxu.com/wordpress/2013/12/javascript-js-元素-抛物线-运动-动画/ parapola.js /*! * by zh ...

随机推荐

  1. Vue中table表头合并的用法

    <div class="panel-container"> <div> <table class="table-head" wid ...

  2. java实现pdf按页切分成图片

    package com.ces.component.pictrueCut.entity; import java.awt.Image; import java.awt.Rectangle; impor ...

  3. dubbo实现原理介绍

      一.什么是dubbo Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,     ...

  4. Java并发编程75个问答

    1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程(Daemon)和用户线程(User). 任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon( ...

  5. git上传文件到coding

    一.上传文件到coding:1.远程连接coding,下载远程仓库到本地git clone https://git.coding.net/wanghao_1/besttest_syz.git 2.cd ...

  6. 游戏搭服自动化脚本shell

    #!/bin/bash #;g=6006c= 178pop_s10 rm-bp1gy2r82o607w4v8.mysql.rds.aliyuncs.com # basedir=/data/jzadmi ...

  7. Django02-路由系统urls

    一.路由配置系统(URLconf) 分为:静态路由动态路由 1.URL配置 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与该URL调用的视图函数之间的映射表 语法: ...

  8. css:元素水平垂直居中的多种方式

    CSS元素(文本.图片)水平垂直居中方法   1.text-align:center; 2.margin:0 auto; 3.display:inline-block; + text-align:ce ...

  9. 2D射影空间,为何引入射影空间

    2D欧氏空间R2中,点的表示是A(x1,y1), B(x2,y2),二维参数,线的表示是L: y=kx+b,是二维参数: 如何表示点在线上面?可以扩展为(k,-1,b)* (x1,y1,1)t = 0 ...

  10. P1147连续自然数和-(尺取法)

    https://www.luogu.org/problemnew/show/P1147 题意:输入一个n,求连续几个数加起来等于n,输出这几个连续的数的第一个和最后一个.10<=n<=20 ...