diff --git a/Fresh_Ecommerce/__pycache__/settings.cpython-38.pyc b/Fresh_Ecommerce/__pycache__/settings.cpython-38.pyc index 099e15d0a074816bd8c86bd7ce3452f772ed329d..0589dfe3d79f733dedbd36e234ae1e15920a35c7 100644 Binary files a/Fresh_Ecommerce/__pycache__/settings.cpython-38.pyc and b/Fresh_Ecommerce/__pycache__/settings.cpython-38.pyc differ diff --git a/Fresh_Ecommerce/__pycache__/urls.cpython-38.pyc b/Fresh_Ecommerce/__pycache__/urls.cpython-38.pyc index 9887d24aa364f28021f505b0b4815dfb7d09cc7c..f0ba5e84df7ca95e86af1d1fc0cb9ddd39f99e32 100644 Binary files a/Fresh_Ecommerce/__pycache__/urls.cpython-38.pyc and b/Fresh_Ecommerce/__pycache__/urls.cpython-38.pyc differ diff --git a/Fresh_Ecommerce/settings.py b/Fresh_Ecommerce/settings.py index 0ff2c5712ea7b3dc0964d9476ebafee36f2baebf..7336a6cd5e63748112c31f71fbeafd504d2b1375 100644 --- a/Fresh_Ecommerce/settings.py +++ b/Fresh_Ecommerce/settings.py @@ -154,7 +154,15 @@ REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', - ] + ], + 'DEFAULT_THROTTLE_CLASSES': [ + 'rest_framework.throttling.AnonRateThrottle', + 'rest_framework.throttling.UserRateThrottle' + ], + 'DEFAULT_THROTTLE_RATES': { + 'anon': '30/hour', + 'user': '500/hour' + } } # 自定义用户认证配置 @@ -183,4 +191,20 @@ app_private_key_path = os.path.join(BASE_DIR, 'apps/trade/keys/app_private.txt') alipay_public_key_path = os.path.join(BASE_DIR, 'apps/trade/keys/ali_public.txt') ali_app_id = "2021000116666333" return_url = 'http://127.0.0.1:8000/alipay/return/' -notify_url = 'http://127.0.0.1:8000/alipay/return/' \ No newline at end of file +notify_url = 'http://127.0.0.1:8000/alipay/return/' + +# drf-extensions配置 +REST_FRAMEWORK_EXTENSIONS = { + 'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 15 +} + +# Redis缓存配置 +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": "redis://127.0.0.1:6379", + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient", + } + } +} \ No newline at end of file diff --git a/Fresh_Ecommerce/urls.py b/Fresh_Ecommerce/urls.py index 04d66468e62d23f8e948654972070cdfcdaa38da..dde91e4fae26ad088b3a08c91479d092c6a01760 100644 --- a/Fresh_Ecommerce/urls.py +++ b/Fresh_Ecommerce/urls.py @@ -16,7 +16,6 @@ Including another URLconf # from django.contrib import admin from django.conf.urls import url, include from django.views.static import serve -from django.views.generic import TemplateView from django.views.generic.base import RedirectView from rest_framework.documentation import include_docs_urls from rest_framework.routers import DefaultRouter @@ -25,7 +24,7 @@ from rest_framework_jwt.views import obtain_jwt_token import xadmin from .settings import MEDIA_ROOT -from goods.views import GoodsListViewSet, CategoryViewSet +from goods.views import GoodsListViewSet, CategoryViewSet, BannerViewSet, IndexCategoryViewSet from users.views import SmsCodeViewSet, UserViewSet from user_operation.views import UserFavViewSet, LeavingMessageViewSet, AddressViewSet from trade.views import ShoppingCartViewSet, OrderViewSet, AliPayView @@ -61,6 +60,12 @@ router.register(r'shopcarts', ShoppingCartViewSet, basename='shopcarts') # 配置下订单路由 router.register(r'orders', OrderViewSet, basename='orders') +# 配置轮播图路由 +router.register(r'banners', BannerViewSet, basename='banners') + +# 配置首页商品系列路由 +router.register(r'indexgoods', IndexCategoryViewSet, basename='indexgoods') + urlpatterns = [ url(r'^xadmin/', xadmin.site.urls), url(r'^media/(?P.*)$', serve, {'document_root':MEDIA_ROOT}), diff --git a/README.md b/README.md index 438ca561bcaa7086a53d1bf1f1785cae98ee3646..1fa8abc16387fc358f722b96f040a5b774c8484e 100644 --- a/README.md +++ b/README.md @@ -25,4 +25,7 @@ 先开发和测试DRF自带API文档,再通过动态设置权限和序列化实现用户个人信息修改,再进行用户收藏、用户留言和用户收货地址的功能开发。 #### V1.7 -进一步实现业务功能,主要实现购物车功能、订单功能和支付功能,支付主要使用支付宝支付接口,完成与Django和Vue的接口调试。 \ No newline at end of file +进一步实现业务功能,主要实现购物车功能、订单功能和支付功能,支付主要使用支付宝支付接口,完成与Django和Vue的接口调试。 + +#### V1.8 +完善相关功能,主要包括首页的轮播图、新品展示和商品系列分类展示,商品的点击数、收藏数、库存量和销量功能实现,进行DRF缓存设置,记忆对访问速率进行限制。 \ No newline at end of file diff --git a/apps/goods/__pycache__/adminx.cpython-38.pyc b/apps/goods/__pycache__/adminx.cpython-38.pyc index f51ffa7b02480d0f241d411a8add17f482c82024..d5094cd13f3a7b9da8c8ab371d7f6b9d15be8bf2 100644 Binary files a/apps/goods/__pycache__/adminx.cpython-38.pyc and b/apps/goods/__pycache__/adminx.cpython-38.pyc differ diff --git a/apps/goods/__pycache__/apps.cpython-38.pyc b/apps/goods/__pycache__/apps.cpython-38.pyc index b6281ff203ceccf079f6ef1f5743972f0b89cfa2..683a2c954cdb8de2b68d6adeb029c7cc10dc7be8 100644 Binary files a/apps/goods/__pycache__/apps.cpython-38.pyc and b/apps/goods/__pycache__/apps.cpython-38.pyc differ diff --git a/apps/goods/__pycache__/filters.cpython-38.pyc b/apps/goods/__pycache__/filters.cpython-38.pyc index 11b2205a848c7cf4e3c05ebd030af0bcfe805557..17dc248b1c9098ab90f21e572dcdd705bc2e97d3 100644 Binary files a/apps/goods/__pycache__/filters.cpython-38.pyc and b/apps/goods/__pycache__/filters.cpython-38.pyc differ diff --git a/apps/goods/__pycache__/models.cpython-38.pyc b/apps/goods/__pycache__/models.cpython-38.pyc index fbff0b883ba9984519f357271da54dac894867c1..36c1be6d1c67928ef4bf5d32ef690fa081c56810 100644 Binary files a/apps/goods/__pycache__/models.cpython-38.pyc and b/apps/goods/__pycache__/models.cpython-38.pyc differ diff --git a/apps/goods/__pycache__/serializers.cpython-38.pyc b/apps/goods/__pycache__/serializers.cpython-38.pyc index be192806eecada6e0b31000cc062bd41e6786665..4560eac407feb8406c53446384593f5b0c5972b1 100644 Binary files a/apps/goods/__pycache__/serializers.cpython-38.pyc and b/apps/goods/__pycache__/serializers.cpython-38.pyc differ diff --git a/apps/goods/__pycache__/views.cpython-38.pyc b/apps/goods/__pycache__/views.cpython-38.pyc index 2e71052ba07b6706c432fa17d24ac19d140cab0d..be7818fa1687c38158aff9ef283d6fbf79d34b56 100644 Binary files a/apps/goods/__pycache__/views.cpython-38.pyc and b/apps/goods/__pycache__/views.cpython-38.pyc differ diff --git a/apps/goods/adminx.py b/apps/goods/adminx.py index b29a4f826979e05e8cf40dd5c9652b5939a9bfbd..cec358076e0a32a64d742924ae64db9d50bd800b 100644 --- a/apps/goods/adminx.py +++ b/apps/goods/adminx.py @@ -1,5 +1,5 @@ import xadmin -from .models import Goods, GoodsCategory, GoodsImage, GoodsCategoryBrand, Banner +from .models import Goods, GoodsCategory, GoodsImage, GoodsCategoryBrand, Banner, IndexAd class GoodsAdmin(object): @@ -51,4 +51,5 @@ class IndexAdAdmin(object): xadmin.site.register(Goods, GoodsAdmin) xadmin.site.register(GoodsCategory, GoodsCategoryAdmin) xadmin.site.register(Banner, BannerGoodsAdmin) -xadmin.site.register(GoodsCategoryBrand, GoodsBrandAdmin) \ No newline at end of file +xadmin.site.register(GoodsCategoryBrand, GoodsBrandAdmin) +xadmin.site.register(IndexAd, IndexAdAdmin) \ No newline at end of file diff --git a/apps/goods/filters.py b/apps/goods/filters.py index 897473f59166dd159e3010c03d30358ba84a5d50..b75fe8627ca21996ddd68e8b6ea20d2aabd4afd7 100644 --- a/apps/goods/filters.py +++ b/apps/goods/filters.py @@ -16,4 +16,4 @@ class GoodsFilter(django_filters.rest_framework.FilterSet): class Meta: model = Goods - fields = ['name', 'pricemin', 'pricemax', 'is_hot'] \ No newline at end of file + fields = ['name', 'pricemin', 'pricemax', 'is_hot', 'is_new'] \ No newline at end of file diff --git a/apps/goods/migrations/0009_auto_20200804_1033.py b/apps/goods/migrations/0009_auto_20200804_1033.py new file mode 100644 index 0000000000000000000000000000000000000000..248e56b35a81a6b845ce9a94e38335f26c9d07f7 --- /dev/null +++ b/apps/goods/migrations/0009_auto_20200804_1033.py @@ -0,0 +1,19 @@ +# Generated by Django 3.0.8 on 2020-08-04 10:33 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('goods', '0008_auto_20200729_1112'), + ] + + operations = [ + migrations.AlterField( + model_name='goodscategorybrand', + name='category', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='brands', to='goods.GoodsCategory', verbose_name='商品类目'), + ), + ] diff --git a/apps/goods/migrations/0010_indexad.py b/apps/goods/migrations/0010_indexad.py new file mode 100644 index 0000000000000000000000000000000000000000..a06fbed942dca15aa9ee8e24d36eba80663ae51f --- /dev/null +++ b/apps/goods/migrations/0010_indexad.py @@ -0,0 +1,26 @@ +# Generated by Django 3.0.8 on 2020-08-04 12:54 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('goods', '0009_auto_20200804_1033'), + ] + + operations = [ + migrations.CreateModel( + name='IndexAd', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='category', to='goods.GoodsCategory', verbose_name='商品类目')), + ('goods', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='goods', to='goods.Goods', verbose_name='商品')), + ], + options={ + 'verbose_name': '首页商品类别广告', + 'verbose_name_plural': '首页商品类别广告', + }, + ), + ] diff --git a/apps/goods/migrations/__pycache__/0009_auto_20200804_1033.cpython-38.pyc b/apps/goods/migrations/__pycache__/0009_auto_20200804_1033.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..55c276695a1d68a4f5757670036676ad499746a2 Binary files /dev/null and b/apps/goods/migrations/__pycache__/0009_auto_20200804_1033.cpython-38.pyc differ diff --git a/apps/goods/migrations/__pycache__/0010_indexad.cpython-38.pyc b/apps/goods/migrations/__pycache__/0010_indexad.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..601293995fba36ba9d60e64f3134ab12546b90c7 Binary files /dev/null and b/apps/goods/migrations/__pycache__/0010_indexad.cpython-38.pyc differ diff --git a/apps/goods/models.py b/apps/goods/models.py index 4a531c5d721a9b0574c6a3e0bd34d4b80e1cc3d0..92a798da4f4acdf11d301a37b99d904c5ef72c81 100644 --- a/apps/goods/models.py +++ b/apps/goods/models.py @@ -31,7 +31,7 @@ class GoodsCategory(models.Model): class GoodsCategoryBrand(models.Model): '''品牌名''' - category = models.ForeignKey(GoodsCategory, verbose_name='商品类目', null=True, on_delete=models.SET_NULL) + category = models.ForeignKey(GoodsCategory, verbose_name='商品类目', related_name='brands', null=True, on_delete=models.SET_NULL) name = models.CharField(default='', max_length=30, verbose_name='品牌名', help_text='品牌名') desc = models.TextField(default='', max_length=200, verbose_name='品牌描述', help_text='品牌描述') image = models.ImageField(max_length=200, upload_to='brands/') @@ -105,5 +105,17 @@ class Banner(models.Model): verbose_name = '轮播商品' verbose_name_plural = verbose_name + def __str__(self): + return self.goods.name + + +class IndexAd(models.Model): + category = models.ForeignKey(GoodsCategory, verbose_name='商品类目', related_name='category', null=True, on_delete=models.SET_NULL) + goods = models.ForeignKey(Goods, verbose_name='商品', related_name='goods', null=True, on_delete=models.SET_NULL) + + class Meta: + verbose_name = '首页商品类别广告' + verbose_name_plural = verbose_name + def __str__(self): return self.goods.name \ No newline at end of file diff --git a/apps/goods/serializers.py b/apps/goods/serializers.py index 0f92e5ce1e2efcf75133a6bb38dcacf2c060d53d..6c58614b201b697bac652198393e99652a227613 100644 --- a/apps/goods/serializers.py +++ b/apps/goods/serializers.py @@ -1,6 +1,7 @@ +from django.db.models import Q from rest_framework import serializers -from .models import Goods, GoodsCategory, GoodsImage +from .models import Goods, GoodsCategory, GoodsImage, Banner, GoodsCategoryBrand, IndexAd class TerCategorySerializer(serializers.ModelSerializer): @@ -41,4 +42,40 @@ class GoodsSerializer(serializers.ModelSerializer): images = GoodsImageSerializer(many=True) class Meta: model = Goods + fields = '__all__' + + +class BannerSerializer(serializers.ModelSerializer): + class Meta: + model = Banner + fields = '__all__' + + +class BrandSerializer(serializers.ModelSerializer): + class Meta: + model = GoodsCategoryBrand + fields = '__all__' + + +class IndexCategorySerializer(serializers.ModelSerializer): + brands = BrandSerializer(many=True) + goods = serializers.SerializerMethodField() + sub_cat = SecCategorySerializer(many=True) + ad_goods = serializers.SerializerMethodField() + + def get_goods(self, obj): + all_goods = Goods.objects.filter(Q(category_id=obj.id)|Q(category__parent_category_id=obj.id)|Q(category__parent_category__parent_category_id=obj.id)) + goods_serializer = GoodsSerializer(all_goods, many=True, context={'request': self.context['request']}) + return goods_serializer.data + + def get_ad_goods(self, obj): + goods_json = {} + ad_goods = IndexAd.objects.filter(category_id=obj.id) + if ad_goods: + good_instance = ad_goods[0].goods + goods_json = GoodsSerializer(good_instance, many=False, context={'request': self.context['request']}).data + return goods_json + + class Meta: + model = GoodsCategory fields = '__all__' \ No newline at end of file diff --git a/apps/goods/views.py b/apps/goods/views.py index 1eca1f1eeec4c420857f95dd554ab42a738d50b8..d00a8502a6d6beedc8963d130379e1704bef6274 100644 --- a/apps/goods/views.py +++ b/apps/goods/views.py @@ -1,9 +1,12 @@ from rest_framework import mixins, viewsets, filters +from rest_framework.response import Response from rest_framework.pagination import PageNumberPagination +from rest_framework.throttling import AnonRateThrottle, UserRateThrottle from django_filters.rest_framework import DjangoFilterBackend +from rest_framework_extensions.cache.mixins import CacheResponseMixin -from .models import Goods, GoodsCategory -from .serializers import GoodsSerializer, CategorySerializer +from .models import Goods, GoodsCategory, Banner +from .serializers import GoodsSerializer, CategorySerializer, BannerSerializer, IndexCategorySerializer from .filters import GoodsFilter @@ -14,7 +17,8 @@ class GoodsPagination(PageNumberPagination): page_size_query_param = 'page_size' max_page_size = 100 -class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): + +class GoodsListViewSet(CacheResponseMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): ''' 商品列表页,并实现分页、搜索、过滤、排序 list: @@ -23,6 +27,7 @@ class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewset 商品详情 ''' + throttle_classes = [AnonRateThrottle, UserRateThrottle] queryset = Goods.objects.filter(is_delete=False).order_by('id') serializer_class = GoodsSerializer pagination_class = GoodsPagination @@ -31,6 +36,14 @@ class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewset search_fields = ['name', 'goods_brief', 'goods_desc'] ordering_fields = ['sold_num', 'shop_price'] + 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) + class CategoryViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): ''' @@ -41,4 +54,23 @@ class CategoryViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets ''' queryset = GoodsCategory.objects.filter(category_type=1).filter(is_delete=False) - serializer_class = CategorySerializer \ No newline at end of file + serializer_class = CategorySerializer + + +class BannerViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): + ''' + list: + 轮播图列表 + ''' + queryset = Banner.objects.filter(is_delete=False).order_by('index') + serializer_class = BannerSerializer + + +class IndexCategoryViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): + ''' + list: + 商品分类数据 + ''' + + queryset = GoodsCategory.objects.filter(is_delete=False, is_tab=True, name__in=['生鲜食品', '酒水饮料']) + serializer_class = IndexCategorySerializer diff --git a/apps/trade/__pycache__/serializers.cpython-38.pyc b/apps/trade/__pycache__/serializers.cpython-38.pyc index 957dc8514c4cfc551a4584fcae9a1aeb1759a24b..a2da93f21adbd0799bd7d47d1f94ce7aeeb6f2ff 100644 Binary files a/apps/trade/__pycache__/serializers.cpython-38.pyc and b/apps/trade/__pycache__/serializers.cpython-38.pyc differ diff --git a/apps/trade/__pycache__/views.cpython-38.pyc b/apps/trade/__pycache__/views.cpython-38.pyc index ddd4315cbe7f0f5e3facb99a74306f1a50345bac..44f210564c3ffd62657bf78eb71ce645637fccbb 100644 Binary files a/apps/trade/__pycache__/views.cpython-38.pyc and b/apps/trade/__pycache__/views.cpython-38.pyc differ diff --git a/apps/trade/serializers.py b/apps/trade/serializers.py index 01acd56faba7b338984f21ba78e80f1593d01d77..a16844f92b0292351f635117cef0da890cee6ea0 100644 --- a/apps/trade/serializers.py +++ b/apps/trade/serializers.py @@ -118,7 +118,7 @@ class OrderDetailSerializer(serializers.ModelSerializer): return_url=return_url, notify_url=notify_url ) - pay_url = alipay.gateway + '?' + order_string + pay_url = alipay._gateway + '?' + order_string return pay_url class Meta: diff --git a/apps/trade/views.py b/apps/trade/views.py index 50ee7a54c50208a329f61dd7a6d3239c74a99363..efc45bcb1f1233fd8512a559d885800a99ec612c 100644 --- a/apps/trade/views.py +++ b/apps/trade/views.py @@ -44,6 +44,30 @@ class ShoppingCartViewSet(viewsets.ModelViewSet): def get_queryset(self): return ShoppingCart.objects.filter(user=self.request.user, is_delete=False) + def perform_create(self, serializer): + '''创建购物车更新库存量''' + shop_cart = serializer.save() + goods = shop_cart.goods + goods.goods_num -= shop_cart.nums + goods.save() + + 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.filter(is_delete=False).get(id=serializer.instance.id) + existed_nums = existed_record.nums + saved_record = serializer.save() + nums = saved_record.nums - existed_nums + goods = saved_record.goods + goods.goods_num -= nums + goods.save() + class OrderViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): ''' @@ -113,6 +137,11 @@ class AliPayView(APIView): existed_orders = OrderInfo.objects.filter(order_sn=order_sn, is_delete=False) if existed_orders: for order in existed_orders: + order_goods = order.goods.all() + for order_good in order_goods: + goods = order_good.goods + goods.sold_num += order_good.goods_num + goods.save() order.pay_status = trade_status order.trade_no = trade_no order.pay_time = datetime.now() @@ -127,14 +156,19 @@ class AliPayView(APIView): data = dict(request.POST.items()) signature = data.pop("sign", None) success = self.alipay.verify(data, signature) - trade_status = self.alipay.api_alipay_trade_query(out_trade_no="2020073117084113366").get("trade_status", None) + order_sn = data.get('out_trade_no', None) + trade_status = self.alipay.api_alipay_trade_query(out_trade_no=order_sn).get("trade_status", None) if success and trade_status in ("TRADE_SUCCESS", "TRADE_FINISHED"): - order_sn = data.get('out_trade_no', None) trade_no = data.get('trade_no', None) existed_orders = OrderInfo.objects.filter(order_sn=order_sn, is_delete=False) print(len(existed_orders)) if existed_orders: for order in existed_orders: + order_goods = order.goods.all() + for order_good in order_goods: + goods = order_good.goods + goods.sold_num += order_good.goods_num + goods.save() order.pay_status = trade_status order.trade_no = trade_no order.pay_time = datetime.now() diff --git a/apps/user_operation/__pycache__/apps.cpython-38.pyc b/apps/user_operation/__pycache__/apps.cpython-38.pyc index 36c816660b0210656b23e89671faa032f369a38f..f2763beb96fc991d93f105979eef27b44521822c 100644 Binary files a/apps/user_operation/__pycache__/apps.cpython-38.pyc and b/apps/user_operation/__pycache__/apps.cpython-38.pyc differ diff --git a/apps/user_operation/__pycache__/signals.cpython-38.pyc b/apps/user_operation/__pycache__/signals.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f6e19b177e359629417b707fb2c51de231872be Binary files /dev/null and b/apps/user_operation/__pycache__/signals.cpython-38.pyc differ diff --git a/apps/user_operation/__pycache__/views.cpython-38.pyc b/apps/user_operation/__pycache__/views.cpython-38.pyc index 8bf945256ff572a2b48e9fd1f71d31b869082b28..9069263d64b908fe9a938270b0fa7f815ded2d73 100644 Binary files a/apps/user_operation/__pycache__/views.cpython-38.pyc and b/apps/user_operation/__pycache__/views.cpython-38.pyc differ diff --git a/apps/user_operation/apps.py b/apps/user_operation/apps.py index cf687165d407966837deaeebb90d2272a5960c1a..0f7b9ad84c90eb18335671d8edc9b0902b2c0e79 100644 --- a/apps/user_operation/apps.py +++ b/apps/user_operation/apps.py @@ -4,3 +4,6 @@ from django.apps import AppConfig class UserOperationConfig(AppConfig): name = 'user_operation' verbose_name = '用户操作管理' + + def ready(self): + import user_operation.signals diff --git a/apps/user_operation/signals.py b/apps/user_operation/signals.py new file mode 100644 index 0000000000000000000000000000000000000000..bbe5cedaa2a12f7496ce1d6cb38f157b98f80b88 --- /dev/null +++ b/apps/user_operation/signals.py @@ -0,0 +1,20 @@ +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver +from rest_framework.authtoken.models import Token + +from .models import UserFav + + +@receiver(post_save, sender=UserFav) +def create_userfav(sender, instance=None, created=False, **kwargs): + if created: + goods = instance.goods + goods.fav_num += 1 + goods.save() + + +@receiver(post_delete, sender=UserFav) +def delete_userfav(sender, instance=None, created=False, **kwargs): + goods = instance.goods + goods.fav_num -= 1 + goods.save() \ No newline at end of file diff --git a/apps/user_operation/views.py b/apps/user_operation/views.py index 3d599d12a72b3e0201332eeac9cf8a2690a7ff3c..afc194df357f510f2a1296b1c0657702d07aa719 100644 --- a/apps/user_operation/views.py +++ b/apps/user_operation/views.py @@ -36,6 +36,13 @@ class UserFavViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.Retr return UserFavSerializer return UserFavSerializer + # def perform_create(self, serializer): + # '''重写实现收藏数''' + # instance = serializer.save() + # goods = instance.goods + # goods.fav_num += 1 + # goods.save() + class LeavingMessageViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): ''' diff --git a/apps/users/__pycache__/signals.cpython-38.pyc b/apps/users/__pycache__/signals.cpython-38.pyc index b0dd906c944f120543e97fc1711fc5eb2ac63efa..c9a8253788a1c9a9de62d92add4810a33a4c5474 100644 Binary files a/apps/users/__pycache__/signals.cpython-38.pyc and b/apps/users/__pycache__/signals.cpython-38.pyc differ diff --git a/apps/users/signals.py b/apps/users/signals.py index b4c14f26411701e27c21cc971086289a08208648..87428b898d6350b7ab9bbb6d42dab4321c6fc8d8 100644 --- a/apps/users/signals.py +++ b/apps/users/signals.py @@ -6,7 +6,7 @@ from rest_framework.authtoken.models import Token User = get_user_model() @receiver(post_save, sender=User) -def create_auth_token(sender, instance=None, created=False, **kwargs): +def create_user(sender, instance=None, created=False, **kwargs): if created: password = instance.password instance.set_password(password) diff --git a/fresh_online/favicon.ico b/fresh_online/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..43c38835427a8865c7fbfb30faff6078028a69d7 Binary files /dev/null and b/fresh_online/favicon.ico differ diff --git a/fresh_online/src/api/api.js b/fresh_online/src/api/api.js index 37436c3e29fb63fe707cb5ae7828c9eb159cc4a3..b27fe269e1dbb7bb49dc91e5b70dc7666860a5b0 100644 --- a/fresh_online/src/api/api.js +++ b/fresh_online/src/api/api.js @@ -5,13 +5,13 @@ let host = 'http://shop.projectsedu.com'; let local_host = 'http://127.0.0.1:8000'; //获取商品类别信息 -export const queryCategorygoods = params => { return axios.get(`${host}/indexgoods/`) } +export const queryCategorygoods = params => { return axios.get(`${local_host}/indexgoods/`) } //获取首页中的新品 export const newGoods = params => { return axios.get(`${host}/newgoods/`) } //获取轮播图 -export const bannerGoods = params => { return axios.get(`${host}/banners/`) } +export const bannerGoods = params => { return axios.get(`${local_host}/banners/`) } //获取商品类别信息 export const getCategory = params => { diff --git a/fresh_online/webpack.config.js b/fresh_online/webpack.config.js index 6c12245429f3e3ec9fd8b0936db383398c4ab051..c7f6280e60773f450e9dc6cb41da5dd0e0922fc4 100644 --- a/fresh_online/webpack.config.js +++ b/fresh_online/webpack.config.js @@ -34,7 +34,8 @@ module.exports = { new HtmlWebpackPlugin({ filename: 'index.html', template: 'template.html', - inject: true + inject: true, + favicon: path.resolve('favicon.ico') }), //new webpack.optimize.CommonsChunkPlugin({name:'vendor',filename:'vendor.bundle.js'}) diff --git "a/media/banner/\346\241\202\350\212\261.jpg" "b/media/banner/\346\241\202\350\212\261.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..e0444cb0682c01441d9e0555e3179cbac4c5f041 Binary files /dev/null and "b/media/banner/\346\241\202\350\212\261.jpg" differ diff --git "a/media/banner/\350\212\222\346\236\234.jpg" "b/media/banner/\350\212\222\346\236\234.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..0f631199b70bb880b4327b5cb5a267f17bd02e6a Binary files /dev/null and "b/media/banner/\350\212\222\346\236\234.jpg" differ diff --git "a/media/banner/\350\213\271\346\236\234.jpg" "b/media/banner/\350\213\271\346\236\234.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..f66acf355a6693843bdd321e6d4710d181ecc283 Binary files /dev/null and "b/media/banner/\350\213\271\346\236\234.jpg" differ diff --git "a/media/brands/\345\217\221\350\202\262\345\256\235Haipet-2.jpg" "b/media/brands/\345\217\221\350\202\262\345\256\235Haipet-2.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..1c938d6fcf2ff2a72e8754d785e67f79d7dec557 Binary files /dev/null and "b/media/brands/\345\217\221\350\202\262\345\256\235Haipet-2.jpg" differ diff --git "a/media/brands/\345\217\221\350\202\262\345\256\235Haipet.jpg" "b/media/brands/\345\217\221\350\202\262\345\256\235Haipet.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..1c938d6fcf2ff2a72e8754d785e67f79d7dec557 Binary files /dev/null and "b/media/brands/\345\217\221\350\202\262\345\256\235Haipet.jpg" differ diff --git "a/media/brands/\346\243\256\347\276\216.jpg" "b/media/brands/\346\243\256\347\276\216.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..d6a372762df004d3630c2fb1aaae62ca6b677664 Binary files /dev/null and "b/media/brands/\346\243\256\347\276\216.jpg" differ diff --git "a/media/brands/\347\273\264\346\264\233\345\217\270.jpg" "b/media/brands/\347\273\264\346\264\233\345\217\270.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..5c0d5b3df04c2ae838b715b6b3fd266612ecae91 Binary files /dev/null and "b/media/brands/\347\273\264\346\264\233\345\217\270.jpg" differ diff --git "a/media/brands/\350\211\276\345\260\224Aier.jpg" "b/media/brands/\350\211\276\345\260\224Aier.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..7f5934461b2fa2a4a53b0fc3256ae73136adbe6a Binary files /dev/null and "b/media/brands/\350\211\276\345\260\224Aier.jpg" differ diff --git "a/media/brands/\351\207\221\350\265\217.jpg" "b/media/brands/\351\207\221\350\265\217.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..70f4b5c2e705ffae03e4cce27556ae00649632bb Binary files /dev/null and "b/media/brands/\351\207\221\350\265\217.jpg" differ diff --git a/requirements.txt b/requirements.txt index 84d41b02b8c4d0fcf745e37665f15e46127cee4d..789c237540d615ad3b4d3be758ca86ab0927c320 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,9 +14,11 @@ django-filter==2.3.0 django-formtools==2.2 django-guardian==2.3.0 django-import-export==2.3.0 +django-redis==4.12.1 django-reversion==3.0.7 djangorestframework==3.11.0 djangorestframework-jwt==1.11.0 +drf-extensions==0.6.0 et-xmlfile==1.0.1 future==0.18.2 httplib2==0.18.0 @@ -37,9 +39,10 @@ pycryptodome==3.9.8 pycryptodomex==3.9.4 PyJWT==1.7.1 pyOpenSSL==19.1.0 -python-alipay-sdk==2.0.1 +python-alipay-sdk==2.1.0 pytz==2020.1 PyYAML==5.3.1 +redis==3.5.3 requests==2.24.0 rsa==4.6 six==1.15.0 @@ -49,4 +52,4 @@ uritemplate==3.0.1 urllib3==1.25.9 xlrd==1.2.0 XlsxWriter==1.2.9 -xlwt==1.3.0 \ No newline at end of file +xlwt==1.3.0