Django+Vue网上购物商城项目细节完善

一、首页轮播图API接口实现

1.序列化

# app/goods/serializers.py
class BannerSerializer(serializers.ModelSerializer):
    '''
    轮播图
    '''
    class Meta:
        model = Banner
        fields = "__all__"

2.视图类

# app/goods/views.py
    class BannerViewset(mixins.ListModelMixin, viewsets.GenericViewSet):
    """
    首页轮播图
    """
    queryset = Banner.objects.all().order_by("index")
    serializer_class = BannerSerializer

3.路由配置

# 配置首页轮播图的url
router.register(r'banners', BannerViewset, basename="banners

4.API接口测试

  • 访问网址http://IP/banners/

5.新品API接口实现

在设计 Goods model 时候有一个字段 is_new, 实现这个接口只要在 goods/fifilters/GoodsFilter 里面添加一个过滤就可以了。
# app/goods/filters.py
class GoodsFilter(django_filters.rest_framework.FilterSet):
    # ........
    class Meta:
        model = Goods
        fields = ['price_min', 'price_max', 'top_category', 'is_hot', 'is_new']
在后台设置几个商品 is_new, 前台访问 http://IP/goods 进行过滤新品 .

6.商品点击数

GoodsListViewSet 其中继承了 mixins.RetrieveModelMixin (获取商品详情), 当用户浏览该商品详情页信息时,商品点击数+1
我们只要重写他的 retrieve 方法就可以了。
# app/goods/views.py
class GoodsListViewSet(.....):
    # .........
    #商品点击数 + 1
    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.click_num += 1
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

7.商品收藏数

前面已经写了 UserFavViewset ,其中继承 mixins.CreateModelMixin, 添加收藏实际就是创建数据库。这里重写它的perform_create 方法就可以了。
# app/user_operation/view.py
class UserFavViewset(...):
    # .......
    # 用户收藏的商品数量+1
    def perform_create(self, serializer):
    # 对象: UserFav商品收藏的对象
    instance = serializer.save()
    # 获取用户收藏的商品对象
    goods = instance.goods
    # 更新收藏商品的收藏数
    goods.fav_num += 1
    # 商品信息修改后保存到数据库中
    goods.save()

8.商品库存量

商品库存数量修改的行为发生在下列三种情况 :
  • 添加商品到购物车
  • 修改购物车数量
  • 删除购物车记录
# app/trade/views.py
class ShoppingCartViewset(viewsets.ModelViewSet):
    # ..........
    # 库存数-1
    def perform_create(self, serializer):
        shop_cart = serializer.save()
        goods = shop_cart.goods
        goods.goods_num -= shop_cart.nums
        goods.save()
    # 库存数+1
    def perform_destroy(self, instance):
        goods = instance.goods
        goods.goods_num += instance.nums
        goods.save()
        instance.delete()
    # 更新库存,修改可能是增加也可能是减少
    def perform_update(self, serializer):
        #首先获取修改之前的库存数量
         existed_record = ShoppingCart.objects.get(id=serializer.instance.id)
        existed_nums = existed_record.nums
        # 先保存最新的购物车信息existed_nums
        saved_record = serializer.save()
        #变化的数量
        nums = saved_record.nums-existed_nums
        goods = saved_record.goods
        goods.goods_num -= nums
        goods.save()

9.商品销量

商品的销量只有在支付成功后才会 +1
class AlipayView(APIView):
    def post(self, request):
        # ...........
        for existed_order in existed_orders:
            # 订单商品项
            order_goods = existed_order.goods.all()
            # 商品销量增加订单中数值
            for order_good in order_goods:
                goods = order_good.goods
                goods.sold_num += order_good.goods_num
                goods.save()
        # ............

二、Django配置redis缓存

为了加速网站的访问速度,将一些数据放到缓存 ( 内存 ) 当中,取数据的时候首先去缓存中去,然后再去数据库中取。我们用Redis( 持久化存储 ) 来实现缓存。
  • Redis分布式存储如何搭建?
  • Redis持久化存储的两种方式是什么? (*)

1. Redis的安装

1)安装Redis

yum install redis -y

 

2)配置 Redis 配置文件 /etc/redis.conf ,绑定 IP
bind 0.0.0.0

3)启动Redis服务

systemctl start redis
systemctl enable redis
systemctl status redis

4)查看Redis开启的端口号和绑定的IP

# Redis默认端口号6379
netstat -antlpe | grep redis
5)客户端指令测试 Redis 服务器是否连通 ? 如果不能连通,看看阿里云的安全组设置是否正确 (6379 端口是否允许外界访问?)
redis-cli -h IP
> ping
PONG

2.Django-Redis缓存

  • 使用django-redis第三方库:http://django-redis-chs.readthedocs.io/zh_CN/latest/#id8 (文档说明)

Django+Vue网上购物商城项目细节完善_第1张图片

2.3缓存测试

  • (用户访问API时,添加缓存)[https://www.django-rest-framework.org/api-guide/caching/]
class GoodsListViewSet(.....):
    # .......
    # Cache requested url for each user for 2 hours
    @method_decorator(cache_page(60 * 60 * 2))
    @method_decorator(vary_on_cookie)
    def retrieve(self, request, *args, **kwargs):
  • redis客户端查询缓存数据
redis-cli -h IP
> select 1
> keys *
> get keyname

2.4Throttle网站限速

Throttle 可以对接口访问的频次进行限制,以减轻服务器的压力。一般用于付费购买次数,投票等场景使用, 防止网络爬虫多频率访问。
官网使用说明: http://www.django-rest-framework.org/api-guide/throttling/

3.配置文件

REST_FRAMEWORK = {
    #限速设置
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle', #未登陆用户
        'rest_framework.throttling.UserRateThrottle' #登陆用户
        ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/minute', #每分钟可以请求3次
        'user': '5/minute' #每分钟可以请求五次
    }
}

1)视图类

from rest_framework.throttling import UserRateThrottle,AnonRateThrottle
class GoodsListViewSet(......):
    # ....
    git p

2)API测试

Django+Vue网上购物商城项目细节完善_第2张图片

到此后端API开发结束
http://47.92.255.98:8000/docs 后端 API 文档提供给前端开发人员 .

Django+Vue网上购物商城项目细节完善_第3张图片

 

你可能感兴趣的:(Django+Vue网上购物商城项目细节完善)