11.14 luffycity项目(6)
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)的更多相关文章
- JavaSE_ API常用对象 总目录(11~14)
JavaSE学习总结第11天_开发工具 & API常用对象111.01 常见开发工具介绍11.02 Eclipse和MyEclipse的概述11.03 Eclipse的下载安装及卸载11.04 ...
- 11.17 luffycity(7)完结
2018-11-17 15:59:01 路飞项目已经完结!后面已是flask的学习!然后还有十几天的课程等回学校再看 明天归校!! 开始全面整理自己学习的知识,整理博客!还有好多面试题!233333 ...
- Notes of Daily Scrum Meeting(11.14)
Notes of Daily Scrum Meeting(11.14) 今天是项目第三周的周五,按原计划这时我们的项目应该已经要进入尾声进行组装调试了,但由于之前放假还有队员们的 效率比较低的原因,我 ...
- Intel Artificial Intelligence Conference(2018.11.14)
时间:2018.11.14地点:北京国贸大酒店
- 第26次Scrum会议(11/14)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/14 11:35~11:57,总计22min.地点:东北 ...
- C++11/14笔记
目录 语言层面 模板表达式中的空格 nullptr和std::nullptr_t 自动推导类型----auto 一致性初始化----Uniform Initialization 初始化列表(initi ...
- 基数排序的可复用实现(C++11/14/17/20)
基数排序,是对整数类型的一种排序方法,有MSD (most significant digit)和LSD (least significant digit)两种.MSD将每个数按照高位分为若干个桶(按 ...
- JZOJ 11.14 提高B组反思
JZOJ 11.14 提高B组反思 T1 题目虽然有点高大上,但是很容易懂 有一个\(d\)维空间,同时有一个长度为\(2n\)的操作序列,每个操作往某一维的正方向或反方向走一格,问多少种方案使得最后 ...
- 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 ...
随机推荐
- 编写CentOS的System V init启动脚本
系统本身自带了说明,在/usr/share/doc/initscripts-(*)/sysvinitfiles,内容如下: 所有System V init脚本都命名为/etc/rc.d/init.d/ ...
- [赶集网] 【MySql】赶集网mysql开发36条军规
[赶集网] [MySql]赶集网mysql开发36条军规 (一)核心军规(1)不在数据库做运算 cpu计算务必移至业务层:(2)控制单表数据量 int型不超过1000w,含char则不超过50 ...
- 基于物理的渲染—HDR Tone Mapping
在游戏引擎渲染管线中,我们对于R.G.B通道颜色信息的数值范围通常设置在[0,1]之间(或者是[0,255]).其中,0代表没有光亮度,1代表显示器能够显示的最大光亮度.这个表示方式虽然直接易懂,但它 ...
- table表格内容溢出处理
直接在table标签加上 style="table-layout:fixed;word-wrap:break-word;"
- [数位dp] spoj 10738 Ra-One Numbers
题意:给定x.y.为[x,y]之间有多少个数的偶数位和减去奇数位和等于一. 个位是第一位. 样例: 10=1-0=1 所以10是这种数 思路:数位dp[i][sum][ok] i位和为sum 是否含有 ...
- Add Columns to the Web Sessions List
To add custom columns to the Web Sessions List, add rules using FiddlerScript. The BindUIColumn Attr ...
- 【go】golang中置new()函数和make()函数的区别
Go语言中的内建函数new和make是两个用于内存分配的原语(allocation primitives),其功能相似,却有本质区别. 1.new 官方文档 // The new built-in f ...
- http://www.360doc.com/userhome.aspx?userid=5054188&cid=235
http://www.360doc.com/userhome.aspx?userid=5054188&cid=235
- vue实现部分页面导入底部 vue配置公用头部、底部,可控制显示隐藏
vue实现部分页面导入底部 vue配置公用头部.底部,可控制显示隐藏 在app.vue文件里引入公共的header 和 footer header 和 footer 默认显示,例如某个页面不需要显示h ...
- 关于python中pika模块的问题
工作中经常用到rabbitmq,而用的语言主要是python,所以也就经常会用到python中的pika模块,但是这个模块的使用,也给我带了很多问题,这里整理一下关于这个模块我在使用过程的改变历程已经 ...