(项目)生鲜超市(九)

十、购物车,订单管理和支付功能

1、购物车功能

  在trade/serializers.py中编写购物车序列化的代码:

 1 class ShopCartSerialzier(serializers.Serializer):
 2     user = serializers.HiddenField(
 3         default=serializers.CurrentUserDefault()
 4     )
 5     nums = serializers.IntegerField(required=True, label='数量', min_value=1,
 6                                     error_messages={
 7                                         "min_value": "商品数量不能小于一",
 8                                         "required": "请选择购买数量"
 9                                     })
10     # goods是一个外键,可以通过这方法获取goods object中所有的值 Serializer必须指定queryset对象,ModelSerializer不需要指定
11     goods = serializers.PrimaryKeyRelatedField(required=True, queryset=Goods.objects.all())
12 
13     # Serializer没有save方法,必须重写create方法
14     def create(self, validated_data):  # validated_data是已经处理过的数据
15         # 获取当前用户,view中获取用户self.request.user serializer中获取用户self.context["request"].user
16         user = self.context["request"].user
17         nums = validated_data["nums"]
18         goods = validated_data["goods"]
19 
20         existed = ShoppingCart.objects.filter(user=user, goods=goods)
21         # 购物车有记录,数量+nums
22         if existed:
23             existed = existed[0]
24             existed.nums += nums
25             existed.save()
26         else:
27             # 没有记录,添加到购物车
28             existed = ShoppingCart.objects.create(**validated_data)
29 
30         return existed
31 
32     # Serializer没有update方法,所以重写Update方法, 添加购物车数量
33     def update(self, instance, validated_data):
34         # 修改商品数量
35         instance.nums = validated_data["nums"]
36         instance.save()
37         return instance

  在trade/views.py中编写购物车接口:

 1 class ShoppingCartViewSet(viewsets.ModelViewSet):
 2     """
 3     购物车功能
 4     list:
 5         获取购物车详情
 6     create:
 7         加入购物车
 8     delete:
 9         删除购物记录
10     """
11 
12     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
13     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
14     serializer_class = ShopCartSerialzier
15 
16     # 把商品id传回去
17     lookup_field = 'goods_id'
18 
19     def get_queryset(self):
20         return ShoppingCart.objects.filter(user=self.request.user)

  注册url:

1 router.register(r'shopcarts', ShoppingCartViewSet, base_name='shopcarts')  # 购物车

  购物车中可以看商品详情,需要写一个商品详情的serializer,在view中需要动态设置serializer:

1 class ShopCartDetailSerializer(serializers.ModelSerializer):
2     # 一个购物车对应一个商品
3     goods = GoodsSerializer(many=False, read_only=True)
4     class Meta:
5         model = ShoppingCart
6         fields = ('goods', 'nums')

  完善购物车接口,动态选择serializer:

 1 class ShoppingCartViewSet(viewsets.ModelViewSet):
 2     """
 3     购物车功能
 4     list:
 5         获取购物车详情
 6     create:
 7         加入购物车
 8     delete:
 9         删除购物记录
10     """
11 
12     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
13     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
14 
15     # 把商品id传回去
16     lookup_field = 'goods_id'
17 
18     def get_serializer_class(self):
19         if self.action == 'list':
20             return ShopCartDetailSerializer
21         else:
22             return ShopCartSerializer
23 
24     def get_queryset(self):
25         return ShoppingCart.objects.filter(user=self.request.user)

2、订单功能

  用户添加商品到购物车,点击购物车结算,填上地址留言,结算生成订单,在会员中心我的订单里面,可以看到订单列表,点订单可以看到订单的详细信息,首先完成订单的序列化:

 1 class OrderGoodsSerializer(serializers.ModelSerializer):
 2     # 订单内的商品
 3     goods = GoodsSerializer(many=False)
 4 
 5     class Meta:
 6         model = OrderGoods
 7         fields = "__all__"
 8 
 9 
10 class OrderDetailSerializer(serializers.ModelSerializer):
11     # goods字段需要嵌套一个OrderGoodsSerializer
12     goods = OrderGoodsSerializer(many=True)
13 
14     class Meta:
15         model = OrderInfo
16         fields = "__all__"
17 
18 
19 class OrderSerializer(serializers.ModelSerializer):
20     user = serializers.HiddenField(
21         default=serializers.CurrentUserDefault()
22     )
23     # 生成订单的时候这些不用post
24     pay_status = serializers.CharField(read_only=True)
25     trade_no = serializers.CharField(read_only=True)
26     order_sn = serializers.CharField(read_only=True)
27     pay_time = serializers.DateTimeField(read_only=True)
28     nonce_str = serializers.CharField(read_only=True)
29     pay_type = serializers.CharField(read_only=True)
30 
31     # 生成订单号
32     def generate_order_sn(self):
33         # 格式:当前时间+userid+随机数
34         random_ins = Random()
35         order_sn = '{time_str}{userid}{ranstr}'.format(time_str=time.strftime("%Y%m%d%H%M%S"),
36                                                        userid=self.context["request"].user.id,
37                                                        ranstr=random_ins.randint(10, 99))
38         return order_sn
39 
40     def validate(self, attrs):
41         # validate中添加order_sn,然后在view中就可以save
42         attrs['order_sn'] = self.generate_order_sn()
43         return attrs
44 
45     class Meta:
46         model = OrderInfo
47         fields = "__all__"

  在views.py中完成订单的接口:

 1 class OrderViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.CreateModelMixin, mixins.DestroyModelMixin,
 2                    viewsets.GenericViewSet):
 3     """
 4     订单管理
 5     list:
 6         获取个人订单
 7     delete:
 8         删除订单
 9     create:
10         新增订单
11     """
12 
13     permission_classes = (IsAuthenticated, IsOwnerOrReadOnly)
14     authentication_classes = (JSONWebTokenAuthentication, SessionAuthentication)
15 
16     def get_serializer_class(self):
17         if self.action == "retrieve":
18             return OrderDetailSerializer
19         return OrderSerializer
20 
21     def get_queryset(self):
22         return OrderInfo.objects.filter(user=self.request.user)
23 
24     # 在提交订单还需要将购物车中的商品保存到OrderGoods中,然后清空购物车
25     def perform_create(self, serializer):
26         order = serializer.save()
27 
28         # 获取购物车中的所有商品,将商品添加到订单中
29         shop_carts = ShoppingCart.objects.filter(user=self.request.user)
30         for shop_cart in shop_carts:
31             order_goods = OrderGoods()
32             order_goods.goods = shop_cart.goods
33             order_goods.goods_num = shop_cart.nums
34             order_goods.order = order
35             order_goods.save()
36 
37             # 清空购物车
38             shop_cart.delete()
39 
40         return order

  注册url:

1 router.register(r'orders', OrderViewSet, base_name='orders')  # 订单

  不要忘了修改Vue中的host,然后在前端测试添加商品到购物车,然后点击结算生成订单,在个人中心新中有订单信息。

转载于:https://www.cnblogs.com/Sweltering/p/10029670.html

线上生鲜超市是一种通过互联网平台提供生鲜食品购买和配送服务的商业模式。它将传统的实体超市与互联网技术相结合,为消费者提供便捷、高效的购物体验。 线上生鲜超市项目通常包括以下几个方面: 1. 商品供应链:线上生鲜超市与各类农场、养殖场、渔场等建立合作关系,直接采购新鲜的农产品、水果、肉类、海鲜等食品,确保商品的新鲜度和质量。 2. 网站或移动应用:线上生鲜超市通过建立网站或移动应用,为消费者提供在线浏览商品、下单购买的平台。用户可以通过搜索、分类等方式找到所需商品,并进行下单和支付。 3. 仓储与配送:线上生鲜超市通常会建立自己的仓储中心,将采购的商品进行储存和管理。在用户下单后,通过配送团队将商品送达用户指定的地址,确保商品的及时送达和新鲜度。 4. 售后服务:线上生鲜超市注重售后服务,提供退换货、投诉处理等服务,保障消费者的权益和满意度。 线上生鲜超市的优势包括: 1. 方便快捷:用户可以随时随地通过互联网平台购买所需的生鲜食品,无需前往实体店铺,节省时间和精力。 2. 新鲜保证:线上生鲜超市与供应商直接合作,商品的新鲜度和质量得到保证,消费者可以放心购买。 3. 多样选择:线上生鲜超市通常提供丰富的商品种类和品牌选择,满足不同消费者的需求。 4. 优惠活动:线上生鲜超市经常会推出各种促销活动和优惠券,让消费者享受更多实惠。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值