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 ...
随机推荐
- 表型数据(Phenotype Data)基本概念
表型(英语:Phenotype),又称表现型,对于一个生物而言,表示它某一特定的物理外观或成分.一个人是否有耳珠.植物的高度.人的血型.蛾的颜色等等,都是表型的例子. 表型主要受生物的基因型和环境影响 ...
- Go语言排序算法实现
// Algorithm project Algorithm.go package Algorithm // 冒泡排序 func BubbleSort(a []int) { n := len(a) ; ...
- Python多进程池 multiprocessing Pool
1. 背景 由于需要写python程序, 定时.大量发送htttp请求,并对结果进行处理. 参考其他代码有进程池,记录一下. 2. 多进程 vs 多线程 c++程序中,单个模块通常是单进程,会启动几十 ...
- 【ASP.NET Core】EF Core 模型与数据库的创建
大家好,欢迎收看由土星卫视直播的大型综艺节目——老周吹逼逼. 今天咱们吹一下 EF Core 有关的话题.先说说模型和数据库是怎么建起来的,说装逼一点,就是我们常说的 “code first”.就是你 ...
- Keras/Tensorflow选择GPU/CPU运行
首先,导入os,再按照PCI_BUS_ID顺序,从0开始排列GPU, import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_B ...
- CAS的单点登录和oauth2的最大区别
CAS的单点登录时保障客户端的用户资源的安全 oauth2则是保障服务端的用户资源的安全 CAS客户端要获取的最终信息是,这个用户到底有没有权限访问我(CAS客户端)的资源. oauth2获取的最终信 ...
- Mssql Server2005中更改sa的用户名的多种方法
mssql安装上去时默认就是sa用户,大多数用户都会一直使用sa这个用户,这样数据库就存在很大的安全问题了,如果我们能把sa用户名修改,这样安全级别又高了一层哦,下面我们来看修改sa用户名的办法. ...
- CSS 水平居中与垂直居中
前言 在CSS布局中,水平居中与垂直居中一直是用到比较多的,在本篇中将介绍水平居中.垂直居中的几种方式. 示例 HTML: <div class="parent"> & ...
- 【转载】MapReduce编程 Intellij Idea配置MapReduce编程环境
目录(?)[-] 一软件环境 二创建maven工程 三添加maven依赖 四配置log4j 五启动Hadoop 六运行WordCount从本地读取文件 七运行WordCount从HDFS读取文件 八代 ...
- Git忽略规则.gitignore忽略node_modules文件夹
在项目文件夹里添加.gitignore的文件 打开文件,在里面添加 /node_modules