2018-11-15 17:43:50

还有一点路飞项目就结束啦!

周日打算回去!

双十一的耳机到啦,音质确实不错!2333!

等着项目做完,完整总结一下!

越努力,越幸运!永远不要高估自己!!!!

贴上源码!

今天老师实现了结算中心 显示课程,修改优惠券和其他的东西

整体逻辑不难,思路清晰,易于理解

payment.py

from rest_framework.views import APIView
from rest_framework.response import Response
from app01.utils.auth import LuffyAuth
from django.conf import settings
from django_redis import get_redis_connection
import json
from app01.utils.response import BaseResponse
from app01 import models
import datetimeclass PaymentViewSet(APIView):authentication_classes = [LuffyAuth, ]conn = get_redis_connection("default")def post(self, request, *args, **kwargs):"""获取用户要结算的课程和优惠券:param request::param args::param kwargs::return:"""ret = BaseResponse()try:# 清空当前用户结算中心的数据# luffy_payment_1_*# luffy_payment_coupon_1key_list = self.conn.keys(settings.PAYMENT_KEY % (request.auth.user_id, "*",))key_list.append(settings.PAYMENT_COUPON_KEY % (request.auth.user_id,))self.conn.delete(*key_list)payment_dict = {}global_coupon_dict = {"coupon": {},"default_coupon": 0}# 1. 获取用户要结算课程IDcourse_id_list = request.data.get('courseids')for course_id in course_id_list:car_key = settings.SHOPPING_CAR_KEY % (request.auth.user_id, course_id,)# 1.1 检测用户要结算的课程是否已经加入购物车if not self.conn.exists(car_key):ret.code = 1001ret.error = "课程需要先加入购物车才能结算"# 1.2 从购物车中获取信息,放入到结算中心。# 获取标题和图片policy = json.loads(self.conn.hget(car_key, 'policy').decode('utf-8'))default_policy = self.conn.hget(car_key, 'default_policy').decode('utf-8')policy_info = policy[default_policy]payment_course_dict = {"course_id": str(course_id),"title": self.conn.hget(car_key, 'title').decode('utf-8'),"img": self.conn.hget(car_key, 'img').decode('utf-8'),"policy_id": default_policy,"coupon": {},"default_coupon": 0}payment_course_dict.update(policy_info)payment_dict[str(course_id)] = payment_course_dict# 2. 获取优惠券ctime = datetime.date.today()coupon_list = models.CouponRecord.objects.filter(account=request.auth.user,status=0,coupon__valid_begin_date__lte=ctime,coupon__valid_end_date__gte=ctime,)for item in coupon_list:# 只处理绑定课程的优惠券if not item.coupon.object_id:# 优惠券IDcoupon_id = item.id# 优惠券类型:满减、折扣、立减coupon_type = item.coupon.coupon_typeinfo = {}info['coupon_type'] = coupon_typeinfo['coupon_display'] = item.coupon.get_coupon_type_display()if coupon_type == 0:  # 立减info['money_equivalent_value'] = item.coupon.money_equivalent_valueelif coupon_type == 1:  # 满减券info['money_equivalent_value'] = item.coupon.money_equivalent_valueinfo['minimum_consume'] = item.coupon.minimum_consumeelse:  # 折扣info['off_percent'] = item.coupon.off_percentglobal_coupon_dict['coupon'][coupon_id] = infocontinue# 优惠券绑定课程的IDcoupon_course_id = str(item.coupon.object_id)# 优惠券IDcoupon_id = item.id# 优惠券类型:满减、折扣、立减coupon_type = item.coupon.coupon_typeinfo = {}info['coupon_type'] = coupon_typeinfo['coupon_display'] = item.coupon.get_coupon_type_display()if coupon_type == 0:  # 立减info['money_equivalent_value'] = item.coupon.money_equivalent_valueelif coupon_type == 1:  # 满减券info['money_equivalent_value'] = item.coupon.money_equivalent_valueinfo['minimum_consume'] = item.coupon.minimum_consumeelse:  # 折扣info['off_percent'] = item.coupon.off_percentif coupon_course_id not in payment_dict:# 获取到优惠券,但是没有购买此课程continue# 将优惠券设置到指定的课程字典中payment_dict[coupon_course_id]['coupon'][coupon_id] = info# 可以获取绑定的优惠券# 3. 将绑定优惠券课程+全站优惠券 写入到redis中(结算中心)。# 3.1 绑定优惠券课程放入redisfor cid, cinfo in payment_dict.items():pay_key = settings.PAYMENT_KEY % (request.auth.user_id, cid,)cinfo['coupon'] = json.dumps(cinfo['coupon'])self.conn.hmset(pay_key, cinfo)# 3.2 将全站优惠券写入redisgcoupon_key = settings.PAYMENT_COUPON_KEY % (request.auth.user_id,)global_coupon_dict['coupon'] = json.dumps(global_coupon_dict['coupon'])self.conn.hmset(gcoupon_key, global_coupon_dict)except Exception as e:passreturn Response(ret.dict)def patch(self, request, *args, **kwargs):"""修改优惠券:param request::param args::param kwargs::return:"""ret = BaseResponse()try:# 1. 用户提交要修改的优惠券course = request.data.get('courseid')course_id = str(course) if course else coursecoupon_id = str(request.data.get('couponid'))# payment_global_coupon_1redis_global_coupon_key = settings.PAYMENT_COUPON_KEY % (request.auth.user_id,)# 修改全站优惠券if not course_id:if coupon_id == "0":# 不使用优惠券,请求数据:{"couponid":0}self.conn.hset(redis_global_coupon_key, 'default_coupon', coupon_id)ret.data = "修改成功"return Response(ret.dict)# 使用优惠券,请求数据:{"couponid":2}coupon_dict = json.loads(self.conn.hget(redis_global_coupon_key, 'coupon').decode('utf-8'))# 判断用户选择得优惠券是否合法if coupon_id not in coupon_dict:ret.code = 1001ret.error = "全站优惠券不存在"return Response(ret.dict)# 选择的优惠券合法self.conn.hset(redis_global_coupon_key, 'default_coupon', coupon_id)ret.data = "修改成功"return Response(ret.dict)# 修改课程优惠券# luffy_payment_1_1redis_payment_key = settings.PAYMENT_KEY % (request.auth.user_id, course_id,)# 不使用优惠券if coupon_id == "0":self.conn.hset(redis_payment_key, 'default_coupon', coupon_id)ret.data = "修改成功"return Response(ret.dict)# 使用优惠券coupon_dict = json.loads(self.conn.hget(redis_payment_key, 'coupon').decode('utf-8'))if coupon_id not in coupon_dict:ret.code = 1010ret.error = "课程优惠券不存在"return Response(ret.dict)self.conn.hset(redis_payment_key, 'default_coupon', coupon_id)except Exception as e:ret.code = 1111ret.error = "修改失败"return Response(ret.dict)def get(self, request, *args, **kwargs):"""结算中心展示页面(用户访问):param request::param args::param kwargs::return:"""ret = BaseResponse()try:# luffy_payment_1_*redis_payment_key = settings.PAYMENT_KEY % (request.auth.user_id, "*",)# luffy_payment_coupon_1redis_global_coupon_key = settings.PAYMENT_COUPON_KEY % (request.auth.user_id,)# 1. 获取绑定课程信息course_list = []for key in self.conn.scan_iter(redis_payment_key):info = {}data = self.conn.hgetall(key)for k, v in data.items():kk = k.decode('utf-8')if kk == "coupon":info[kk] = json.loads(v.decode('utf-8'))else:info[kk] = v.decode('utf-8')course_list.append(info)# 2.全站优惠券global_coupon_dict = {'coupon': json.loads(self.conn.hget(redis_global_coupon_key, 'coupon').decode('utf-8')),'default_coupon': self.conn.hget(redis_global_coupon_key, 'default_coupon').decode('utf-8')}ret.data = {"course_list": course_list,"global_coupon_dict": global_coupon_dict}except Exception as e:ret.code = 1001ret.error = "获取失败"return Response(ret.dict)

放上笔记

s9day113 内容回顾:1. 路飞学城的购物车如何实现?2. 商品是否有个数?- 价格策略(用事件来类比个数)- 购买之后就开始计时3. 购物车在redis的结构?4. 购物车购买数量有限制吗?.keys('xxxxx')5. 购物车是否设置超时时间?.conn.expire("shopping_car_1_1" ,60*30)方案:购买课程个数限制(200个)6. 为什么把购物车信息放入redis?- 临时状态- 频繁修改的话,速度快。7. 具体购物车的逻辑?添加:1. 用户选择:课程、价格策略,提交2. 获取课程、价格策略进行合法性校验(数据库查询)3. 数据获取,构造结构:{shopping_car_用户ID_课程ID:{title:"...",img:'xxx',policy:{...}}}4. 将数据以字典的形式保存到redis中。修改:1. 用户选择:课程、价格策略,提交2. 获取课程、价格策略进行合法性校验(redis查询)3. 更新价格策略删除:1. 用户选择:课程提交2. 获取课程合法性校验(redis查询)3. 删除 查看:1. 构造Key shopping_car_用户ID_* 2. scan_iter8. 原则:- 简答逻辑先处理- try - 细粒度异常+自定义异常- 导入模块- 内置 - 框架- 自定义 - 注释 - 文件- 类 - 函数 - 文件名、类、函数、project- 对功能进行分类- 减少代码层级- BaseResponse 今日内容:- 结算中心 - 去支付 内容详细:1. 结算中心 a. 添加到结算中心: 请求:POST数据:{courseids:[1,2]}Q补充:con = {"id":1,"age__gt":9,"name__lt": 8"name__lt": 8}# 构造ANDmodels.User.objects.filter(**con)# 构造复杂(条件写死)con = Q(Q(account=request.auth.user) & Q(status=0)) | Q(coupon__valid_begin_date__lte=ctime)models.User.objects.filter(con)# 构造负责(条件动态)q1 = Q()q1.connector = 'OR'for k,v in con.items():q1.children.append((k,v,))models.User.objects.filter(q1)结算数据及目标:payment_dict = {'2': {course_id:2,'title': 'CRM客户关系管理系统实战开发-专题', 'img': 'CRM.jpg', 'policy_id': '4', 'coupon': {}, 'default_coupon': 0, 'period': 210, 'period_display': '12个月', 'price': 122.0}, '1': {course_id:2,'title': '爬虫开发-专题', 'img': '爬虫开发-专题.jpg', 'policy_id': '2', 'coupon': {4: {'coupon_type': 0, 'coupon_display': '立减券', 'money_equivalent_value': 40}, 6: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 60, 'minimum_consume': 100}}, 'default_coupon': 0, 'period': 60, 'period_display': '2个月', 'price': 599.0}}global_coupon_dict = {'coupon': {2: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 200, 'minimum_consume': 500}}, 'default_coupon': 0}========================================= redis ==============================================redis = {payment_1_2:{course_id:2,'title': 'CRM客户关系管理系统实战开发-专题', 'img': 'CRM.jpg', 'policy_id': '4', 'coupon': {}, 'default_coupon': 0, 'period': 210, 'period_display': '12个月', 'price': 122.0}, },payment_1_1:{course_id:1,'title': '爬虫开发-专题', 'img': '爬虫开发-专题.jpg', 'policy_id': '2', 'coupon': {4: {'coupon_type': 0, 'coupon_display': '立减券', 'money_equivalent_value': 40}, 6: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 60, 'minimum_consume': 100}}, 'default_coupon': 0, 'period': 60, 'period_display': '2个月', 'price': 599.0}},payment_global_coupon_1:{'coupon': {2: {'coupon_type': 1, 'coupon_display': '满减券', 'money_equivalent_value': 200, 'minimum_consume': 500}}, 'default_coupon': 0}}

转载于:https://www.cnblogs.com/zhen1996/p/9965064.html

11.15luffycity(7)相关推荐

  1. Redis 笔记(11)— 文本协议 RESP(单行、多行字符串、整数、错误、数组、空值、空串格式、telnet 登录 redis)

    RESP 是 Redis 序列化协议Redis Serialization Protocol 的简写.它是一种直观的文本协议,优势在于实现异常简单,解析性能极好. ​ Redis 协议将传输的结构数据 ...

  2. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  3. 只要5分钟用数据可视化带你看遍11月份新闻热点事件

    2017年11月份已经离我们而去,在过去的11月份我们也许经历了双十一的剁手,也可能亲眼看见了别人剁手.11月份的北京大兴区发生了"11·18"重大火灾,国内多家幼儿园也多次上了头 ...

  4. 1-1 机器学习和深度学习综述-paddle

    课程>我的课程>百度架构师手把手教深度学习>1-1 机器学习和深度学习综述> 1-1 机器学习和深度学习综述 paddle初级课程 王然(学生) Notebook 教育 初级深 ...

  5. CUDA 11功能清单

    CUDA 11功能清单 基于NVIDIA Ampere GPU架构的新型NVIDIA A100 GPU在加速计算方面实现了最大的飞跃.A100 GPU具有革命性的硬件功能,CUDA 11与A100一起 ...

  6. 保护嵌入式802.11 Wi-Fi设备时需要考虑的10件事

    保护嵌入式802.11 Wi-Fi设备时需要考虑的10件事 10 things to consider when securing an embedded 802.11 Wi-Fi device 随着 ...

  7. CUDA 11功能展示

    CUDA 11功能展示 CUDA 11 Features Revealed 新的NVIDIA A100 GPU基于NVIDIA安培GPU架构,实现了加速计算的最大一代飞跃.A100 GPU具有革命性的 ...

  8. 深度学习11个实用技巧

    深度学习11个实用技巧 深度学习工程师George Seif发表了一篇博文,总结了7个深度学习的技巧,本文增加了几个技巧,总结了11个深度学习的技巧,主要从提高深度学习模型的准确性和速度两个角度来分析 ...

  9. 【CV】吴恩达机器学习课程笔记第11章

    本系列文章如果没有特殊说明,正文内容均解释的是文字上方的图片 机器学习 | Coursera 吴恩达机器学习系列课程_bilibili 目录 11 机器学习系统设计 11-1 确定执行的优先级:以垃圾 ...

最新文章

  1. phpstudy2014 php7.0,phpstudy下载_phpStudy下载2014 官方版_php环境集成包 1.0_零度软件园...
  2. Web登录很简单?开玩笑!
  3. SQL Server开发者Oracle快速入门
  4. 正在或即将被使用的Go依赖包管理方法:Go Modules,Go 1.13的标准特性
  5. Webrtc demo system
  6. hadoop 代码中获取文件名
  7. 金融销售关键在于客户感受
  8. JAVA排序:快速排序算法
  9. 树莓派摄像头模块(Pi Cam)的安装使用
  10. flowplayer播放需求
  11. 前端开发IDE---VSCode前端开发环境配置
  12. 保付代理和供应链金融业务大纲
  13. 【Google Paper】对比学习用于解决推荐系统长尾问题
  14. C. Make it Increasing
  15. css学习记录第一天(选择器)
  16. Django項目部署到Ubuntu服務器
  17. 计算机网络实验——交换机的基本配置与管理
  18. SDNU-ACM第一次月赛地大武汉选拔赛
  19. WIN7 64位 配置JDK1.7的环境变量(百度上那么多坑爹货,乱搞真浪费时间)
  20. 百度地图 Api v3.0 自定义信息窗体样式

热门文章

  1. matlab figure 怎么用,Matlab:figure的用法
  2. 让媒体播放器实现列表播放
  3. java/php/net/python基于Web的花卉销售商城设计
  4. wireshark拦截手机数据包
  5. 信雅达银行外包怎么样_信雅达:银行外包业务带来希望
  6. 河南商城县多人被虫咬致死 为维稳未公布疫情
  7. 做自媒体、短视频,如何选择一个合适的背景音乐
  8. 关于VMware NAT Services服务自动关闭的非完美结局方案
  9. 微软exchange服务器,重新启动 Microsoft Exchange 服务
  10. IOS-@class