python项目篇-购物车业务逻辑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27695659/article/details/88559169

1.加入购物车,保存到redis:

a. 临时状态
b. 修改购物信息
结构:

redis->{
	shopping_car:{
		用户ID:{
			业务1:{
				title:'法务',
				img:'/xx/xx/xx.png',
				policy:{
					10: {'name':'有效期1个月','price':123},
					11: {'name':'有效期3个月','price':234},
					13: {'name':'有效期6个月','price':2222},
				},
				default_policy:10
				},
			业务2:{
				title:'法务中级',
				img:'/xx/xx/xx.png',
				policy:{
					10: {'name':'有效期1个月','price':345},
					11: {'name':'有效期3个月','price':1129},
					13: {'name':'有效期6个月','price':35432},
				},
				default_policy:10
			}
		},
		用户ID:{...},
		}
	}
POST请求:购物车中添加一条数据
请求体:
		{
			workid:1,
			policy_id:10
		}
后台:
检验当前课程是否有此价格策略,合法:将数据构造字典,再添加到redis						
GET请求:查看自己购物车中的所有数据
获取当前登录用户ID,根据用户ID去redis的购物车中获取数据。
DELETE请求:删除购物车中的数据
请求体:
{
	course_ids:[1,2]
}
PUT/PATCH请求:更新价格策略
请求体:
{
	courseid:1,
	policy_id:13
}
方案二:
{	#后面两个数字代表:第一个是用户id,第二个是课程id
	shopping_car_6_11:{
		'title':'法务',
		'src':'xxx.png',
		'policy':{
			1:{id:'xx'.....},
			2:{id:'xx'.....},
			3:{id:'xx'.....},
			4:{id:'xx'.....},
		},
		'default_policy':3
	},
	shopping_car_6_13:{
		...
	}
}

代码实现:
urls:

url(r'^shoppingcar/$', shoppingcar.ShoppingCarViewSet.as_view()),

shoppingcar.py中:

class ShoppingCarViewSet(APIView):
    authentication_classes = [ApiAuth] #用户登录设置,可以注释
    conn = get_redis_connection("default")  # 类下面的全局下面加self

    # post
    def post(self, request, *args, **kwargs):
        """
        将课程添加到购物车
        :param request:
        :param args:
        :param kwargs:
        :return:
        """

        ret = BaseResponse()
        try:
            # 获取用户提交的课程和价格策略
            course_id = int(request.data.get("courseid"))
            policy_id = int(request.data.get("policyid"))
            course = models.Course.objects.get(id=course_id)

            # 获取该课程相关的所有价格策略
            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('价格策略不合法')
            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)
            }
            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)
    # delete
    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]
            print(key_list)
            self.conn.delete(*key_list)
        except Exception as e:
            ret.code = 1002
            ret.error = "删除失败"

        return Response(ret.dict)

    # put
    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)
    # get
    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)

2. 商品是否有个数?

	- 价格策略(用事件来类比个数)
	- 购买之后就开始计时

3. 购物车在redis的结构?

{	#后面两个数字代表:第一个是用户id,第二个是课程id
	shopping_car_6_11:{
		'title':'法务',
		'src':'xxx.png',
		'policy':{
			1:{id:'xx'.....},
			2:{id:'xx'.....},
			3:{id:'xx'.....},
			4:{id:'xx'.....},
		},
		'default_policy':3
	},
	shopping_car_6_13:{
		...
	}
}

4. 购物车购买数量有限制吗?

	.keys('xxxxx')

5. 购物车是否设置超时时间?

.conn.expire("shopping_car_1_1" ,60*30)

方案:购买课程个数限制(200个)

猜你喜欢

转载自blog.csdn.net/qq_27695659/article/details/88559169