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": "1234", } } } 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. 优惠券使用时间