qhfl-6 购物车
购物车中心
用户点击价格策略加入购物车,个人中心可以查看自己所有购物车中数据
在购物车中可以删除课程,还可以更新购物车中课程的价格策略
所以接口应该有四种请求方式, 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 购物车的更多相关文章
- 如何一步一步用DDD设计一个电商网站(十)—— 一个完整的购物车
阅读目录 前言 回顾 梳理 实现 结语 一.前言 之前的文章中已经涉及到了购买商品加入购物车,购物车内购物项的金额计算等功能.本篇准备把剩下的购物车的基本概念一次处理完. 二.回顾 在动手之前我对之 ...
- session实现购物车
为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- PHP之购物车的代码
该文章记录了购物车的实现代码,仅供参考 book_sc_fns.php <?php include_once('output_fns.php'); include_once('book_fns. ...
- 使用session页面控制登录入口及购物车效果的实现
由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容.实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只 ...
- python学习笔记(列表、元组、购物车实例)
一.列表 列表和字典是最常用的两种数据类型 1. 需求:怎么存放班级80多人的姓名,如何实现? names = ["Zhangyang","Guyun",&qu ...
- 简单实用angular.js购物车功能
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Java Web之网上购物系统(注册、登录、浏览商品、添加购物车)
眼看就要期末了,我的专业课也迎来了第二次的期末作业---------<网上购物系统>.虽然老师的意图是在锻炼我们后台的能力,但是想着还是不利用网上的模板,准备自己写,以来别人写的静态页看不 ...
- 使用MongoDB和JSP实现一个简单的购物车系统
目录 1 问题描述 2 解决方案 2.1 实现功能 2.2 最终运行效果图 2.3 系统功能框架示意图 2.4 有关MongoDB简介及系统环境配置 2.5 核心功能代码讲解 ...
- js抛物线动画——加入购物车动效
参考文章:http://www.zhangxinxu.com/wordpress/2013/12/javascript-js-元素-抛物线-运动-动画/ parapola.js /*! * by zh ...
随机推荐
- linux服务samba与ftp篇
samba复习: 1.下载samba:yum -y install samba 2.打开配置文件/etc/samba/smb.conf输入: [共享文件名] path = 目录名 (事先创建) pub ...
- 第一课了解SQL
1.1 数据库基础 其实一直在使用这数据库,当你在邮箱中查询名字时,当在网站上进行搜索,在自动取款机上使用ATM卡,这些操作都是在使用数据库 1.1.1 数据库 数据库:保存有组织的数据的容器(通 ...
- eclipse中svn切换用户
如果永久保存svn用户账号及密码,再更换svn用户时需要先删除C:\Users\Administrator\AppData\Roaming下的Subversion文件,然后在刷新eclipse中的sv ...
- 阿里云RDS读写分离数据查询延迟解决
mysql使用RDS做数据主从读写分离.在使用的过程中发现部分业务对其他服务以来严重.但是由于系统不是采用微服务的架构,造成部分数据插入数据库后,后续操作读取数据库没有查询到前面插入的数据.查看阿里云 ...
- Linux命令行报错 bash: cannot create temp file for here-document: No space left on device
今天Linux服务器出问题了,使用"tab"补全命令时,提示 bash: cannot create temp file for here-document: No space l ...
- 性感天才黑客乔治·霍兹George Hotz 17岁打脸乔布斯20岁搞疯索尼
1.国内外著名黑客信息 1) 国外著名黑客 George Hotz 乔治·霍兹(George Hotz,1989年10月2日-),美国学生,2007年8月解锁苹果(Apple)iPhone手机,使得i ...
- MyBatis :Insert (返回主键、批量插入)
一.前言 数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二.insert元素 属性详解 其属性如下: parameterType , ...
- Cobbler安装CentOS7系统时报错 What do you want do now?
问题的根源: 在cobbler服务主机中执行了 createrepo --update /var/www/cobbler/ks_mirror/CentOS-7-x86_64/ 导致的. cobbl ...
- WM-结汇
PI发给客户以后, 客户打过来定金之后. 把PI的 P单词去掉,改为只剩invoice, 再把PI改成一份contract为标题的文件,两份文件都是要自己和客户的签字的. 然后需要用这两份文件进行结汇 ...
- POJ-2253.Frogger.(求每条路径中最大值的最小值,最短路变形)
做到了这个题,感觉网上的博客是真的水,只有kuangbin大神一句话就点醒了我,所以我写这篇博客是为了让最短路的入门者尽快脱坑...... 本题思路:本题是最短路的变形,要求出最短路中的最大跳跃距离, ...