qhfl-7 结算中心
结算中心,即从购物车前往支付前的确认页面,这里要开始选择优惠券了
"""
前端传过来数据 course_list 课程列表
redis 中将要存放的结算数据 {
settlement_userid_courseid: {
id, 课程id,
title,
course_img,
valid_period_display,
price,
course_coupon_dict: { # 课程优惠券
coupon_id: {优惠券信息}
coupon_id2: {优惠券信息}
coupon_id3: {优惠券信息}
}
# 默认不给你选 这个字段只有更新的时候才添加
default_coupon_id: 1
} global_coupon_userid: { # 全局优惠券
coupon_id: {优惠券信息}
coupon_id2: {优惠券信息}
coupon_id3: {优惠券信息},
# 这个字段只有更新的时候才添加
default_global_coupon_id: 1
}
}
"""
加入结算中心接口
加入结算中心后,放到redis中,同时将redis中的购物车中课程清除。等待结算
class SettlementView(APIView):
authentication_classes = [LoginAuth, ] def post(self, request):
res = BaseResponse()
# 1 获取前端的数据以及user_id
course_list = request.data.get("course_list", "")
user_id = request.user.pk
# 2 校验数据的合法性
for course_id in course_list:
# 2.1 判断course_id 是否在购物车中
shopping_car_key = SHOPPINGCAR_KEY % (user_id, course_id)
if not CONN.exists(shopping_car_key):
res.code = 1050
res.error = "课程ID不合法"
return Response(res.dict)
# 3 构建数据结构
# 3.1 获取用户的所有合法优惠券
user_all_coupons = CouponRecord.objects.filter(
account_id=user_id,
status=0,
coupon__valid_begin_date__lte=now(),
coupon__valid_end_date__gte=now(),
).all()
print(user_all_coupons)
# 3.2 构建优惠券dict
course_coupon_dict = {}
global_coupon_dict = {}
for coupon_record in user_all_coupons:
coupon = coupon_record.coupon
if coupon.object_id == course_id: # 一门课程只能存在一张优惠券
course_coupon_dict[coupon.id] = {
"id": coupon.id,
"name": coupon.name,
"coupon_type": coupon.get_coupon_type_display(),
"object_id": coupon.object_id,
"money_equivalent_value": coupon.money_equivalent_value,
"off_percent": coupon.off_percent,
"minimum_consume": coupon.minimum_consume
}
elif coupon.object_id == "":
global_coupon_dict[coupon.id] = {
"id": coupon.id,
"name": coupon.name,
"coupon_type": coupon.get_coupon_type_display(),
"money_equivalent_value": coupon.money_equivalent_value,
"off_percent": coupon.off_percent,
"minimum_consume": coupon.minimum_consume
}
# 3.3 构建写入redis的数据结构
course_info = CONN.hgetall(shopping_car_key)
price_policy_dict = json.loads(course_info["price_policy_dict"])
default_policy_id = course_info["default_price_policy_id"]
valid_period = price_policy_dict[default_policy_id]["valid_period_display"]
price = price_policy_dict[default_policy_id]["price"] settlement_info = {
"id": course_info["id"],
"title": course_info["title"],
"course_img": course_info["course_img"],
"valid_period": valid_period,
"price": price,
"course_coupon_dict": json.dumps(course_coupon_dict, ensure_ascii=False)
}
# 4 写入redis
settlement_key = SETTLEMENT_KEY % (user_id, course_id)
global_coupon_key = GLOBAL_COUPON_KEY % user_id
CONN.hmset(settlement_key, settlement_info)
if global_coupon_dict:
CONN.hmset(global_coupon_key, global_coupon_dict) # 将全局优惠券也放到redis中
# 5 删除购物车中的数据
CONN.delete(shopping_car_key)
res.data = "加入结算中心成功"
return Response(res.dict)
post加入结算中心
模拟测试接口
查看结算中心
def get(self, request):
res = BaseResponse()
# 1, 获取user_id
user_id = request.user.pk
# 2, 拼接所有key
# 3, 去redis取数据
settlement_key = SETTLEMENT_KEY % (user_id, "*")
global_coupon_key = GLOBAL_COUPON_KEY % user_id
all_keys = CONN.scan_iter(settlement_key)
ret = []
for key in all_keys:
ret.append(CONN.hgetall(key))
global_coupon_info = CONN.hgetall(global_coupon_key)
res.data = {
"settlement_info": ret,
"global_coupon_dict": global_coupon_info
}
return Response(res.dict)
获取结算信息
更新结算中心接口
在结算时,如果有更改课程的优惠券,或全局优惠券时,需put请求更新结算中心的数据
def put(self, request):
# course_id course_coupon_id global_coupon_id
res = BaseResponse()
# 1, 获取前端传过来数据
course_id = request.data.get("course_id", "")
course_coupon_id = request.data.get("course_coupon_id", "")
global_coupon_id = request.data.get("global_coupon_id", "")
user_id = request.user.pk
# 2, 校验数据合法性
# 2.1 校验course_id
key = SETTLEMENT_KEY % (user_id, course_id)
if course_id:
if not CONN.exists(key):
res.code = 1060
res.error = "课程ID不合法"
return Response(res.dict)
# 2.2 校验 course_coupon_id
if course_coupon_id:
course_coupon_dict = json.loads(CONN.hget(key, "course_coupon_dict"))
if str(course_coupon_id) not in course_coupon_dict:
res.code = 1061
res.error = "课程优惠券ID不合法"
return Response(res.dict)
# 2.3 校验global_coupon_id
if global_coupon_id:
global_coupon_key = GLOBAL_COUPON_KEY % user_id
if not CONN.exists(global_coupon_key):
res.code = 1062
res.error = "全局优惠券ID不合法"
return Response(res.dict)
CONN.hset(global_coupon_key, "default_global_coupon_id", global_coupon_id)
# 3,修改redis中数据
CONN.hset(key, "default_coupon_id", course_coupon_id)
res.data = "更新成功"
return Response(res.dict)
更新结算信息
更新后查看结算的结果
import json
import redis
from rest_framework.views import APIView
from rest_framework.response import Response
from utils.base_response import BaseResponse
from utils.redis_pool import POOL
from django.utils.timezone import now
from utils.my_auth import LoginAuth from .views import SHOPPINGCAR_KEY
from .models import CouponRecord CONN = redis.Redis(connection_pool=POOL)
SETTLEMENT_KEY = "SETTLEMENT_%s_%s"
GLOBAL_COUPON_KEY = "GLOBAL_COUPON_%s"
"""
前端传过来数据 course_list redis 中存的数据 {
settlement_userid_courseid: {
id, 课程id,
title,
course_img,
valid_period_display,
price,
course_coupon_dict: {
coupon_id: {优惠券信息}
coupon_id2: {优惠券信息}
coupon_id3: {优惠券信息}
}
# 默认不给你选 这个字段只有更新的时候才添加
default_coupon_id: 1
} global_coupon_userid: {
coupon_id: {优惠券信息}
coupon_id2: {优惠券信息}
coupon_id3: {优惠券信息},
# 这个字段只有更新的时候才添加
default_global_coupon_id: 1 } }
""" class SettlementView(APIView):
authentication_classes = [LoginAuth, ] def post(self, request):
res = BaseResponse()
# 1 获取前端的数据以及user_id
course_list = request.data.get("course_list", "")
user_id = request.user.pk
# 2 校验数据的合法性
for course_id in course_list:
# 2.1 判断course_id 是否在购物车中
shopping_car_key = SHOPPINGCAR_KEY % (user_id, course_id)
if not CONN.exists(shopping_car_key):
res.code = 1050
res.error = "课程ID不合法"
return Response(res.dict)
# 3 构建数据结构
# 3.1 获取用户的所有合法优惠券
user_all_coupons = CouponRecord.objects.filter(
account_id=user_id,
status=0,
coupon__valid_begin_date__lte=now(),
coupon__valid_end_date__gte=now(),
).all()
print(user_all_coupons)
# 3.2 构建优惠券dict
course_coupon_dict = {}
global_coupon_dict = {}
for coupon_record in user_all_coupons:
coupon = coupon_record.coupon
if coupon.object_id == course_id: # 一门课程只能存在一张优惠券
course_coupon_dict[coupon.id] = {
"id": coupon.id,
"name": coupon.name,
"coupon_type": coupon.get_coupon_type_display(),
"object_id": coupon.object_id,
"money_equivalent_value": coupon.money_equivalent_value,
"off_percent": coupon.off_percent,
"minimum_consume": coupon.minimum_consume
}
elif coupon.object_id == "":
global_coupon_dict[coupon.id] = {
"id": coupon.id,
"name": coupon.name,
"coupon_type": coupon.get_coupon_type_display(),
"money_equivalent_value": coupon.money_equivalent_value,
"off_percent": coupon.off_percent,
"minimum_consume": coupon.minimum_consume
}
# 3.3 构建写入redis的数据结构
course_info = CONN.hgetall(shopping_car_key)
price_policy_dict = json.loads(course_info["price_policy_dict"])
default_policy_id = course_info["default_price_policy_id"]
valid_period = price_policy_dict[default_policy_id]["valid_period_display"]
price = price_policy_dict[default_policy_id]["price"] settlement_info = {
"id": course_info["id"],
"title": course_info["title"],
"course_img": course_info["course_img"],
"valid_period": valid_period,
"price": price,
"course_coupon_dict": json.dumps(course_coupon_dict, ensure_ascii=False)
}
# 4 写入redis
settlement_key = SETTLEMENT_KEY % (user_id, course_id)
global_coupon_key = GLOBAL_COUPON_KEY % user_id
CONN.hmset(settlement_key, settlement_info)
if global_coupon_dict:
CONN.hmset(global_coupon_key, global_coupon_dict) # 将全局优惠券也放到redis中
# 5 删除购物车中的数据
CONN.delete(shopping_car_key)
res.data = "加入结算中心成功"
return Response(res.dict) def get(self, request):
res = BaseResponse()
# 1, 获取user_id
user_id = request.user.pk
# 2, 拼接所有key
# 3, 去redis取数据
settlement_key = SETTLEMENT_KEY % (user_id, "*")
global_coupon_key = GLOBAL_COUPON_KEY % user_id
all_keys = CONN.scan_iter(settlement_key)
ret = []
for key in all_keys:
ret.append(CONN.hgetall(key))
global_coupon_info = CONN.hgetall(global_coupon_key)
res.data = {
"settlement_info": ret,
"global_coupon_dict": global_coupon_info
}
return Response(res.dict) def put(self, request):
# course_id course_coupon_id global_coupon_id
res = BaseResponse()
# 1, 获取前端传过来数据
course_id = request.data.get("course_id", "")
course_coupon_id = request.data.get("course_coupon_id", "")
global_coupon_id = request.data.get("global_coupon_id", "")
user_id = request.user.pk
# 2, 校验数据合法性
# 2.1 校验course_id
key = SETTLEMENT_KEY % (user_id, course_id)
if course_id:
if not CONN.exists(key):
res.code = 1060
res.error = "课程ID不合法"
return Response(res.dict)
# 2.2 校验 course_coupon_id
if course_coupon_id:
course_coupon_dict = json.loads(CONN.hget(key, "course_coupon_dict"))
if str(course_coupon_id) not in course_coupon_dict:
res.code = 1061
res.error = "课程优惠券ID不合法"
return Response(res.dict)
# 2.3 校验global_coupon_id
if global_coupon_id:
global_coupon_key = GLOBAL_COUPON_KEY % user_id
if not CONN.exists(global_coupon_key):
res.code = 1062
res.error = "全局优惠券ID不合法"
return Response(res.dict)
CONN.hset(global_coupon_key, "default_global_coupon_id", global_coupon_id)
# 3,修改redis中数据
CONN.hset(key, "default_coupon_id", course_coupon_id)
res.data = "更新成功"
return Response(res.dict)
shopping/settlement_view.py
qhfl-7 结算中心的更多相关文章
- AI学习吧-结算中心
结算中心流程 在结算中心中,主要是对用户添加到购物车商品的结算,由于用户可能添加了多个课程,但是,结算时会选择性的进行支付.在结算时会选中课程id,和对应的价格策略.在后台,首先会对用户进行校验,验证 ...
- python 全栈开发,Day106(结算中心(详细),立即支付)
昨日内容回顾 1. 为什么要开发路飞学城? 提供在线教育的学成率: 特色: 学,看视频,单独录制增加趣味性. 练,练习题 改,改学生代码 管,管理 测,阶段考核 线下:8次留级考试 2. 组织架构 - ...
- python 全栈开发,Day104(DRF用户认证,结算中心,django-redis)
考试第二部分:MySQL数据库 6. MySQL中char和varchar的区别(1分) char是定长,varchar是变长. char的查询速度比varchar要快. 7. MySQL中va ...
- python 全栈开发,Day103(微信消息推送,结算中心业务流程)
昨日内容回顾 第一部分:考试题(Python基础) 第二部分:路飞相关 1. 是否遇到bug?难解决的技术点?印象深刻的事? - orm操作费劲 - 最开始学习路由系统时候,匹配规则: 答案一: 有, ...
- Django day 38 结算中心,支付中心,计算价格方法
一:结算中心 二:支付中心 三:计算价格方法
- day 109结算中心.
from django.db import models from django.contrib.contenttypes.fields import GenericForeignKey,Generi ...
- PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
什么是PP.io? PP.io是我和Bill发起的存储项目,目的在于为开发者提供一个去中心化的存储和分发平台,能做到更便宜,更高速,更隐私. 当然做去中心化存储的项目也有好几个,FileCoin,Si ...
- python 全栈开发,Day105(路飞其他数据库表结构,立即结算需求)
考试第三部分:Django 16. 列列举你熟悉的Http协议头以及作用.(1分) Accept-Charset: 用于告诉浏览器,客户机采用的编码 Host: 客户机通过这个头告诉服务器,想访问的 ...
- s11 day103 luffy项目结算部分+认证+django-redis
1.增加认证用的表 class Account(models.Model): username =models.CharField(,unique=True) email= models.EmailF ...
随机推荐
- CRM 2016 及 CRM 365 更新地址
CRM2016安装程序下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=50372 CRM 365 更新地址: https: ...
- 刘志梅 201771010115 《面向对象程序设计(java)》 第八周学习总结
实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 接口定义:接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义:由常量和一组抽象方法组成:接 ...
- cv2的安装
第一种 ,直接尝试 pip install cv2 ,大可能报错. 第二种,pip install opencv-python ,大概率 直接成功. 第三种 ,去网上下包 放到 sit_package ...
- leetcode437
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...
- TensorFlow学习之二
二.常用操作符和基本数学函数 大多数运算符都进行了重载操作,使我们可以快速使用 (+ - * /) 等,但是有一点不好的是使用重载操作符后就不能为每个操作命名了. 1 算术操作符:+ - * / % ...
- springmvc拦截器的简单了解
1.定义一个拦截器 2.在springmvc.xml中配置拦截器. (1)拦截器拦截的请求是建立在前端控制器配置之下的,若DispatcherServlet拦截的是*.action,则拦截器即使配置 ...
- Codeforces Round #437 E. Buy Low Sell High
题意:买卖股票,给你n个数,你可以选择买进或者卖出或者什么都不做,问你最后获得的最大收益是多少. Examples Input 910 5 4 7 9 12 6 2 10 Output 20 Inpu ...
- cdnbest设置301跳转
cdnbest设置301跳转 格式:^http://kangleweb.com/(.*)$ https://www.kangleweb.com/$1 下面是站点里所有域名都跳转到https ...
- 替换php remi源
检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 这里一定要把上一步列出来的所有php包删除干净 yum remove php.x8 ...
- CSS如何作小于1PX的边
小于1PX的边能使页面变得更加精致,那么具体怎么做呢? 主要思路就是设置伪元素先放大再通过变换缩小. 代码如下 .border { position: relative;//如果有圆角 } .bord ...