2018-11-14 21:26:45

实现了购物车功能!

涉及到了redis的使用  需要在pycharm中下载   django_redis

其他的看一下笔记,有购物车里面数据存储的结构
才发现数据结构很重要!有空的时候恶补一下!
过几天回学校!!!把博客完整整理再整理一下面试题!!
越努力,越幸运!永远不要高估自己!

shopcar.py

from rest_framework.views import APIView
from rest_framework.viewsets import GenericViewSet, ViewSetMixin
from rest_framework.response import Response
from django_redis import get_redis_connection
from utils.response import BaseResponse
from utils.auth import LuffyAuth
from api import models
from django.core.exceptions import ObjectDoesNotExist
from utils.exception import PricePolicyInvalid
from django.conf import settings
import json class ShoppingCarViewSet(APIView):
authentication_classes = [LuffyAuth,]
conn = get_redis_connection("default") # 类下的全局 下面用加self def post(self, request, *args, **kwargs):
"""
将课程添加到购物车
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
# 1. 获取用户提交的课程ID和价格策略ID
course_id = int(request.data.get('courseid'))
policy_id = int(request.data.get('policyid')) # 2. 获取专题课信息
course = models.Course.objects.get(id=course_id) # 3. 获取该课程相关的所有价格策略
price_policy_list = course.price_policy.all()
price_policy_dict = {}
for item in price_policy_list:
price_policy_dict[item.id] = {
"period":item.valid_period,
"period_display":item.get_valid_period_display(),
"price":item.price,
} # 4. 判断用户提交的价格策略是否合法
if policy_id not in price_policy_dict:
# 价格策略不合法
raise PricePolicyInvalid('价格策略不合法') # 5. 将购物信息添加到redis中
# self.conn
# car_key = "luffy_shopping_car_%s_%s"
car_key = settings.SHOPPING_CAR_KEY %(request.auth.user_id,course_id,)
car_dict = {
'title':course.name,
'img':course.course_img,
'default_policy':policy_id,
'policy':json.dumps(price_policy_dict)
}
# conn = get_redis_connection("default")
self.conn.hmset(car_key,car_dict)
ret.data = '添加成功' except PricePolicyInvalid as e:
ret.code = 2001
ret.error = e.msg
except ObjectDoesNotExist as e:
ret.code = 2001
ret.error = '课程不存在'
except Exception as e:
ret.code = 1001
ret.error = '获取购物车失败'
return Response(ret.dict) def delete(self, request, *args, **kwargs):
"""
购物车中删除课程
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
course_id_list = request.data.get('courseids')
key_list = [ settings.SHOPPING_CAR_KEY %(request.auth.user_id,course_id,) for course_id in course_id_list]
self.conn.delete(*key_list)
except Exception as e:
ret.code = 1002
ret.error = "删除失败" return Response(ret.dict) def patch(self, request, *args, **kwargs):
"""
修改课程的价格策略
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
# 1. 获取价格策略ID和课程ID
course_id = int(request.data.get('courseid'))
policy_id = str(request.data.get('policyid')) # 2. 拼接课程的key
key = settings.SHOPPING_CAR_KEY %(request.auth.user_id,course_id,)
if not self.conn.exists(key):
ret.code = 1002
ret.error = "购物车中不存在此课程"
return Response(ret.dict)
# 3. redis中获取所有的价格策略
policy_dict = json.loads(str(self.conn.hget(key,'policy'),encoding='utf-8'))
if policy_id not in policy_dict:
ret.code = 1003
ret.error = "价格策略不合法"
return Response(ret.dict) # 4. 在购物车中修改该课程的默认价格策略
self.conn.hset(key,'default_policy',policy_id) ret.data = "修改成功" except Exception as e:
ret.code = 1004
ret.error = "修改失败" return Response(ret.dict) def get(self,request, *args, **kwargs):
"""
查看购物车中所有的商品
:param request:
:param args:
:param kwargs:
:return:
"""
ret = BaseResponse()
try:
key_match = settings.SHOPPING_CAR_KEY %(request.auth.user_id,"*") course_list = [] for key in self.conn.scan_iter(key_match,count=10):
info = {
"title":self.conn.hget(key,'title').decode('utf-8'),
"img":self.conn.hget(key,'img').decode('utf-8'),
"policy":json.loads(self.conn.hget(key,'policy').decode('utf-8')),
"default_policy":self.conn.hget(key,'default_policy').decode('utf-8')
}
course_list.append(info)
ret.data = course_list
except Exception as e:
ret.code = 1002
ret.error = "获取失败"
return Response(ret.dict) class ShoppingCarDetailViewSet(ViewSetMixin, APIView): def retrieve(self, request, *args, **kwargs):
"""
查一条
"""
ret = {'code': 1000, 'data': None} try:
pass
except Exception as e:
ret['code'] = 1001
ret['error'] = '获取课程详细失败'
return Response(ret) '''
缺 删 delete
改 put 一条 '''

笔记:

s9day112 

内容回顾:
1. redis列表
- 左右
- hang住
- 通过yield构造生成器 写一个栈:写一个类实现后进先出的结构。
class FooStack(object): def push(self):
pass def pop(self):
pass 2. redis字典
- hscan_iter 3. 事务 4. 连接池 5. 单进程单线程 6. 持久化:
- AOF
- RDB 7. 微信消息推送
- 自动获取 wx_id
- 根据用户 wx_id向用户推送消息
- 已认证的服务号
8. 支付宝支付
- 加密:RSA
- 秘钥:商户私钥+支付宝公钥
- 宕机:重发
- 精度:1.11 9. ORM
- only
- defer
- select_related
- prefetch_related
- 偏原生
- raw
- extra
- connection
- .using('default')
- .exclude(id=5) 今日内容:
- 加入购物车 作业:
- 结算中心 内容详细:
- 加入购物车 1. 配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://140.143.227.206:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"PASSWORD": "",
}
}
} 2. 路由 3. 认证组件 4. 业务(合法性)
- 增
- 删
- 改
- 查 作业:
a. 实现购物车逻辑 b. 结算中心 1.购物车(可以选择价格策略)
{
luffy_shopping_car_6_11:{
'title':'21天入门到放弃',
'src':'xxx.png',
'policy':{
1:{id:'xx'.....},
2:{id:'xx'.....},
3:{id:'xx'.....},
4:{id:'xx'.....},
},
'default_policy':3
},
luffy_shopping_car_6_13:{
...
}
} 2.结算(可以选择优惠券)
a. POST请求,去结算
请求体:
{
courseids:[1,2]
}
业务处理:
1. 检测课程ID是否已经加入到购物车
2. 获取指定价格策略信息
3. 获取优惠券信息
4. 构造结构放入redis b. GET请求,获取结算中心数据
业务处理:
1. 获取结算中心里的课程信息(绑定课程优惠券)
2. 获取全局优惠券 c. PATCH请求,选择优惠券
请求体:
{
courseid:0
couponid:12
}
业务处理:
1. 校验结算中心是否存在该课程
2. 校验优惠券是否可用 注意:
1. 优惠券状态
2. 优惠券使用时间

11.14 luffycity项目(6)的更多相关文章

  1. JavaSE_ API常用对象 总目录(11~14)

    JavaSE学习总结第11天_开发工具 & API常用对象111.01 常见开发工具介绍11.02 Eclipse和MyEclipse的概述11.03 Eclipse的下载安装及卸载11.04 ...

  2. 11.17 luffycity(7)完结

    2018-11-17 15:59:01 路飞项目已经完结!后面已是flask的学习!然后还有十几天的课程等回学校再看 明天归校!!  开始全面整理自己学习的知识,整理博客!还有好多面试题!233333 ...

  3. Notes of Daily Scrum Meeting(11.14)

    Notes of Daily Scrum Meeting(11.14) 今天是项目第三周的周五,按原计划这时我们的项目应该已经要进入尾声进行组装调试了,但由于之前放假还有队员们的 效率比较低的原因,我 ...

  4. Intel Artificial Intelligence Conference(2018.11.14)

    时间:2018.11.14地点:北京国贸大酒店

  5. 第26次Scrum会议(11/14)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/14 11:35~11:57,总计22min.地点:东北 ...

  6. C++11/14笔记

    目录 语言层面 模板表达式中的空格 nullptr和std::nullptr_t 自动推导类型----auto 一致性初始化----Uniform Initialization 初始化列表(initi ...

  7. 基数排序的可复用实现(C++11/14/17/20)

    基数排序,是对整数类型的一种排序方法,有MSD (most significant digit)和LSD (least significant digit)两种.MSD将每个数按照高位分为若干个桶(按 ...

  8. JZOJ 11.14 提高B组反思

    JZOJ 11.14 提高B组反思 T1 题目虽然有点高大上,但是很容易懂 有一个\(d\)维空间,同时有一个长度为\(2n\)的操作序列,每个操作往某一维的正方向或反方向走一格,问多少种方案使得最后 ...

  9. 2021.11.14 CF1583E Moment of Bloom(LCA+图上构造)

    2021.11.14 CF1583E Moment of Bloom(LCA+图上构造) https://www.luogu.com.cn/problem/CF1583E 题意: She does h ...

随机推荐

  1. 编写CentOS的System V init启动脚本

    系统本身自带了说明,在/usr/share/doc/initscripts-(*)/sysvinitfiles,内容如下: 所有System V init脚本都命名为/etc/rc.d/init.d/ ...

  2. [赶集网] 【MySql】赶集网mysql开发36条军规

    [赶集网] [MySql]赶集网mysql开发36条军规 (一)核心军规(1)不在数据库做运算   cpu计算务必移至业务层:(2)控制单表数据量   int型不超过1000w,含char则不超过50 ...

  3. 基于物理的渲染—HDR Tone Mapping

    在游戏引擎渲染管线中,我们对于R.G.B通道颜色信息的数值范围通常设置在[0,1]之间(或者是[0,255]).其中,0代表没有光亮度,1代表显示器能够显示的最大光亮度.这个表示方式虽然直接易懂,但它 ...

  4. table表格内容溢出处理

    直接在table标签加上  style="table-layout:fixed;word-wrap:break-word;"

  5. [数位dp] spoj 10738 Ra-One Numbers

    题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...

  6. Add Columns to the Web Sessions List

    To add custom columns to the Web Sessions List, add rules using FiddlerScript. The BindUIColumn Attr ...

  7. 【go】golang中置new()函数和make()函数的区别

    Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives),其功能相似,却有本质区别. 1.new 官方文档 // The new built-in f ...

  8. http://www.360doc.com/userhome.aspx?userid=5054188&cid=235

    http://www.360doc.com/userhome.aspx?userid=5054188&cid=235

  9. vue实现部分页面导入底部 vue配置公用头部、底部,可控制显示隐藏

    vue实现部分页面导入底部 vue配置公用头部.底部,可控制显示隐藏 在app.vue文件里引入公共的header 和 footer header 和 footer 默认显示,例如某个页面不需要显示h ...

  10. 关于python中pika模块的问题

    工作中经常用到rabbitmq,而用的语言主要是python,所以也就经常会用到python中的pika模块,但是这个模块的使用,也给我带了很多问题,这里整理一下关于这个模块我在使用过程的改变历程已经 ...