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 ...
随机推荐
- ubuntu 配置 apt 使用代理
ubuntu 配置 apt 使用代理 仅配置系统代理是无法使 apt 也使用代理的,我们需要给 apt 独立配置代理. 方法 ubuntu 官方说明 :https://help.ubuntu.com/ ...
- CVPR论文《100+ Times Faster Weighted Median Filter (WMF)》的实现和解析(附源代码)。
四年前第一次看到<100+ Times FasterWeighted Median Filter (WMF)>一文时,因为他附带了源代码,而且还是CVPR论文,因此,当时也对代码进行了一定 ...
- c# System.Threading.Thread
using System; using System.Threading; // Simple threading scenario: Start a static method running // ...
- 【PMP】事业环境因素和组织过程资产
事业环境因素(EEFs) 事业环境因素(EEFs):是指组织不能控制的,将对项目产生影响.限制或指令作用的各种条件. ①组织内部的事业环境因素: 组织文化.结构和治理 设施和资源的地理分布 基础设施 ...
- 在GDAL中添加GDALRasterizeGeometriesBuf函数
缘起 GDAL的栅格化算法中有GDALRasterizeLayers.GDALRasterizeLayersBuf和GDALRasterizeGeometries函数,但是没有GDALRasteriz ...
- fgrep: ifcfg-ifcfg-eth0: No such file or directory
[root@localhost ~]# service network restartfgrep: ifcfg-ifcfg-eth0: No such file or directoryfgrep: ...
- spring boot 搭建
http://www.ityouknow.com/springboot/2018/06/12/spring-boo-java-simple.html 在http://start.spring.io/下 ...
- Linux系统下x86和ARM的区别有哪些?
问题: 最近在用三星的一款i5处理器的Windows平板,和iPad,以及其他使用ARM处理器的手机相比,发热量大很多,甚至需要借助风扇来散热,耗电量也大了不少. 那么就很奇怪,在主频相差不大,并且实 ...
- mysql update ...select的使用 & update 遇到 disable safe 的解决方法
use `testdb`; update dtable d INNER JOIN new_table n ON d.details = n.details set d.email = n.email, ...
- Linux下C语言执行shell命令
有时候在代码中需要使用到shell命令的情况,下面就介绍一下怎么在C语言中调用shell命令: 这里使用popen来实现,关于popen的介绍,查看 http://man7.org/linux/man ...