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

 

转载于:https://www.cnblogs.com/zhen1996/p/9960683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值