jiaweiqi преди 3 години
родител
ревизия
c543b785fc

+ 4 - 30
apps/base.py

@@ -2,35 +2,9 @@
 
 class Formater():
     @staticmethod
-    def formatStr(value):
-        res = u''
-        if value != None:
-            try:
-                res = str(value)
-            except:
-                pass
-        return res
+    def formatValue(value):
+        return int(round(float(value or 0) * 100, 0))
 
     @staticmethod
-    def formatCount(value):
-        return int(round(float(value or 0) * 100,0))
-
-    @staticmethod
-    def formatPrice(value):
-        return int(round(float(value or 0) * 100,0))
-
-    @staticmethod
-    def formatCountShow(value):
-        return '%.2f' % (float(value or 0)/100.0)
-
-    @staticmethod
-    def formatPriceShow(value):
-        return '%.2f' % (float(value or 0)/100.0)
-
-    @staticmethod
-    def formatAmount(value):
-        return int(round(float(value or 0) * 10000,0))
-
-    @staticmethod
-    def formatAmountShow(value):
-        return '%.2f' % (float(value or 0) / 10000.0 + 0.0000001)
+    def formatValueShow(value):
+        return '%.2f' % (float(value or 0) / 100.0)

+ 4 - 4
apps/commodity/serializers.py

@@ -31,10 +31,10 @@ class CommoditySerializer(serializers.ModelSerializer):
         fields = '__all__'
 
     def get_price(self, obj):
-        return Formater.formatPriceShow(obj.price)
+        return Formater.formatValueShow(obj.price)
 
     def get_vip_price(self, obj):
-        return Formater.formatPriceShow(obj.vip_price)
+        return Formater.formatValueShow(obj.vip_price)
 
     def get_detail_image(self, obj):
         count = CommodityImage.objects.filter(commodity=obj, type=CommodityImage.DETAILS).count()
@@ -51,9 +51,9 @@ class CommoditySerializer(serializers.ModelSerializer):
             if attrs['category'].delete:
                 raise CustomError(u'该商品类别已被删除,请刷新后重试!')
         if 'price' in self.initial_data:
-            attrs['price'] = Formater.formatPrice(self.initial_data['price'])
+            attrs['price'] = Formater.formatValue(self.initial_data['price'])
         if 'vip_price' in self.initial_data:
-            attrs['vip_price'] = Formater.formatPrice(self.initial_data['vip_price'])
+            attrs['vip_price'] = Formater.formatValue(self.initial_data['vip_price'])
         if 'point_price' in self.initial_data:
             attrs['point_price'] = self.initial_data['point_price']
 

+ 4 - 7
apps/commodity/views.py

@@ -54,13 +54,10 @@ class CommodityViewSet(CustomModelViewSet):
         validated_data = serializer.validated_data
         BizLog.objects.addnew(self.request.user, BizLog.UPDATE, u'修改商品[%s], id=%d' % (instance.name, instance.id), validated_data)
 
-    def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            instance.delete = True
-            instance.save()
-            BizLog.objects.addnew(self.request.user, BizLog.DELETE, u'删除商品[%s],id=%d' % (instance.name, instance.id))
-        return response_ok()
+    def perform_destroy(self, instance):
+        instance.delete = True
+        instance.save()
+        BizLog.objects.addnew(self.request.user, BizLog.DELETE, u'删除商品[%s],id=%d' % (instance.name, instance.id))
 
     @action(methods=['post'], detail=True)
     def upload_show_image(self, request, pk):

+ 0 - 0
apps/customer/address/__init__.py


+ 27 - 0
apps/customer/address/serializers.py

@@ -0,0 +1,27 @@
+# coding=utf-8
+
+from rest_framework import serializers
+from apps.customer.models import CustomerAddress
+from utils.exceptions import CustomError
+
+
+class AddressSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = CustomerAddress
+        fields = '__all__'
+
+    def create(self, validated_data):
+        validated_data['customer'] = self.context['request'].customer
+        if validated_data['default']:
+            CustomerAddress.objects.filter(customer=validated_data['customer']).update(default=False)
+        instance = super(AddressSerializer, self).create(validated_data)
+        return instance
+
+    def update(self, instance, validated_data):
+        if instance.delete:
+            raise CustomError(u'该收货地址已被删除,禁止重复操作!')
+        if validated_data['default']:
+            CustomerAddress.objects.filter(customer=instance.customer).update(default=False)
+        instance = super(AddressSerializer, self).update(instance, validated_data)
+        return instance

+ 14 - 0
apps/customer/address/urls.py

@@ -0,0 +1,14 @@
+# coding=utf-8
+
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+
+]
+
+router = SimpleRouter()
+router.register(r'', CustomerAddressViewSet)
+urlpatterns += router.urls

+ 56 - 0
apps/customer/address/views.py

@@ -0,0 +1,56 @@
+# coding=utf-8
+
+from django.db import transaction
+from rest_framework.decorators import action
+
+from utils import response_ok, response_error
+from utils.exceptions import CustomError
+from utils.permission import IsCustomer
+from utils.custom_modelviewset import CustomModelViewSet
+from apps.customer.models import CustomerAddress
+from apps.customer.filters import CustomerAddressFilter
+from apps.customer.address.serializers import AddressSerializer
+from apps.log.models import BizLog
+
+
+class CustomerAddressViewSet(CustomModelViewSet):
+    permission_classes = [IsCustomer, ]
+    queryset = CustomerAddress.objects.filter(delete=False)
+    serializer_class = AddressSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(customer=self.request.customer)
+        f = CustomerAddressFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        queryset = self.filter_queryset(self.get_queryset())
+        serializer = self.get_serializer(queryset, many=True)
+        return response_ok(serializer.data)
+
+    def perform_create(self, serializer):
+        super(CustomerAddressViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(instance.customer.user, BizLog.INSERT, u'客户添加收货地址,id=%d' % instance.id, validated_data)
+
+    def perform_update(self, serializer):
+        super(CustomerAddressViewSet, self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(instance.customer.user, BizLog.UPDATE, u'客户修改收货地址,id=%d' % instance.id, validated_data)
+
+    def perform_destroy(self, instance):
+        queryset = self.get_queryset().filter(customer=self.request.customer).exclude(id=instance.id)
+        instance.destory(queryset)
+        BizLog.objects.addnew(instance.customer.user, BizLog.DELETE, u'客户删除收货地址,id=%d' % instance.id)
+
+    @action(methods=['get'], detail=True)
+    def set_default(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            self.get_queryset().filter(customer=self.request.customer, default=True).update(default=False)
+            instance.default = True
+            instance.save()
+            BizLog.objects.addnew(instance.customer.user, BizLog.UPDATE, u'客户设置默认收货地址,id=%d' % instance.id)
+        return response_ok()

+ 11 - 5
apps/customer/commodity/serializers.py

@@ -20,10 +20,10 @@ class CommoditySerializer(serializers.ModelSerializer):
         return count
 
     def get_price(self, obj):
-        return Formater.formatPriceShow(obj.price)
+        return Formater.formatValueShow(obj.price)
 
     def get_vip_price(self, obj):
-        return Formater.formatPriceShow(obj.vip_price)
+        return Formater.formatValueShow(obj.vip_price)
 
     def get_show_image_url(self, obj):
         if obj.show_image:
@@ -42,6 +42,7 @@ class CommodityDetailSerializer(serializers.ModelSerializer):
     details_urls = serializers.SerializerMethodField()
     price = serializers.SerializerMethodField()
     vip_price = serializers.SerializerMethodField()
+    show_image = serializers.SerializerMethodField()
     # 评论
 
     def get_sale_count(self, obj):
@@ -72,16 +73,21 @@ class CommodityDetailSerializer(serializers.ModelSerializer):
             result.append(url)
         return result
 
+    def get_show_image(self, obj):
+        if obj.show_image:
+            return obj.show_image.get_path()
+        return ''
+
     def get_price(self, obj):
-        return Formater.formatPriceShow(obj.price)
+        return Formater.formatValueShow(obj.price)
 
     def get_vip_price(self, obj):
-        return Formater.formatPriceShow(obj.vip_price)
+        return Formater.formatValueShow(obj.vip_price)
 
     class Meta:
         model = Commodity
         fields = (
-            'id', 'name', 'price', 'vip_price', 'point_price', 'sale_count', 'is_collection', 'carousel_urls', 'details_urls',
+            'id', 'name', 'price', 'vip_price', 'point_price', 'sale_count', 'is_collection', 'carousel_urls', 'details_urls', 'show_image',
         )
 
 

+ 6 - 1
apps/customer/models.py

@@ -221,9 +221,14 @@ class CustomerAddress(models.Model):
         default_permissions = ()
 
     def get_address(self):
-        return '{}{}{}{}'.format(self.province, self.city, self.area, self.address)
+        return '{}{}{}{}'.format(self.province or '', self.city or '', self.area or '', self.address)
 
     def destory(self, queryset):
+        '''
+        删除收货地址 如果收货地址是默认地址 就将客户剩余地址的第一个设置为默认地址
+        :param queryset:
+        :return:
+        '''
         if self.default:
             self.default = False
             default = queryset.first()

+ 38 - 0
apps/customer/order/serializers.py

@@ -0,0 +1,38 @@
+# coding=utf-8
+
+import datetime
+
+from rest_framework import serializers
+
+from utils.exceptions import CustomError
+
+from apps.order.models import ShoppingCart
+
+
+class ShoppingCartSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = ShoppingCart
+        fields = '__all__'
+
+    def validate(self, attrs):
+        if 'quantity' in attrs:
+            try:
+                quantity = int(attrs['quantity'])
+            except:
+                raise CustomError(u'商品数量错误,请修改!')
+            if quantity <= 0:
+                raise CustomError(u'商品数量错误,请修改!')
+        return attrs
+
+    def create(self, validated_data):
+        validated_data['customer'] = self.context['request'].customer
+        if int(validated_data['quantity']) <= 0:
+            raise CustomError('商品数量错误,请修改!')
+        instance = ShoppingCart.objects.filter(commodity_details=validated_data['commodity_details'], customer=validated_data['customer']).first()
+        if instance:
+            instance.quantity += validated_data['quantity']
+            instance.save()
+        else:
+            instance = super(ShoppingCartSerializer, self).create(validated_data)
+        return instance

+ 3 - 2
apps/customer/order/urls.py

@@ -15,6 +15,7 @@ urlpatterns = [
     # url(r'^commodity/', include('apps.customer.commodity.urls'))
 ]
 
-# router = SimpleRouter()
+router = SimpleRouter()
+router.register(r'cart', ShoppingCartViewSet)
 # router.register(r'', CustomerViewSet)
-# urlpatterns += router.urls
+urlpatterns += router.urls

+ 27 - 0
apps/customer/order/views.py

@@ -0,0 +1,27 @@
+# coding=utf-8
+
+from django.db import transaction
+from rest_framework.decorators import action
+
+from utils import response_ok, response_error
+from utils.exceptions import CustomError
+from utils.permission import IsCustomer
+from utils.custom_modelviewset import CustomModelViewSet
+from apps.order.models import ShoppingCart
+from apps.order.filters import ShoppingCartFilter
+from apps.customer.order.serializers import ShoppingCartSerializer
+from apps.log.models import BizLog
+
+
+class ShoppingCartViewSet(CustomModelViewSet):
+    permission_classes = [IsCustomer, ]
+    queryset = ShoppingCart.objects.filter()
+    serializer_class = ShoppingCartSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(customer=self.request.customer)
+        f = ShoppingCartFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def perform_create(self, serializer):
+        super(ShoppingCartViewSet, self).perform_create(serializer)

+ 5 - 4
apps/customer/serializers.py

@@ -6,6 +6,7 @@ from rest_framework import serializers
 from rest_framework_jwt.settings import api_settings
 
 from apps.customer.models import *
+from apps.order.models import ShoppingCart
 from apps.log.models import BizLog
 from apps.base import Formater
 
@@ -41,7 +42,7 @@ class WechatLoginSerializer(serializers.Serializer):
                 'openid': wx_customer.openid,
                 'name': wx_customer.customer.name or '',
                 'tel': wx_customer.customer.tel or '',
-                'face': wx_customer.customer.face and wx_customer.customer.face.get_path() or '',
+                'face': wx_customer.customer.face or '',
                 'customer_id': wx_customer.customer.id,
             }
 
@@ -67,7 +68,7 @@ class WechatBindSerializer(serializers.Serializer):
                 'token': jwt_encode_handler(payload),
                 'name': customer.name or '',
                 'tel': customer.tel or '',
-                'face': customer.face and customer.face.get_path() or '',
+                'face': customer.face or '',
                 'customer_id': customer.id,
             }
 
@@ -93,7 +94,7 @@ class CustomerSerializer(serializers.ModelSerializer):
         return u'否'
 
     def get_balance(self, obj):
-        return Formater.formatAmountShow(obj.balance)
+        return Formater.formatValueShow(obj.balance)
 
     def get_total_amount(self, obj):
-        return Formater.formatAmountShow(obj.total_amount)
+        return Formater.formatValueShow(obj.total_amount)

+ 3 - 1
apps/customer/urls.py

@@ -12,7 +12,9 @@ urlpatterns = [
     url(r'^token/refresh/$', CustomerRefreshTokenView),
     url(r'^token/verify/$', CustomerVerifyTokenView),
 
-    url(r'^commodity/', include('apps.customer.commodity.urls'))
+    url(r'^commodity/', include('apps.customer.commodity.urls')),
+    url(r'^address/', include('apps.customer.address.urls')),
+    url(r'^order/', include('apps.customer.order.urls')),
 ]
 
 router = SimpleRouter()

+ 2 - 2
apps/customer/views.py

@@ -92,10 +92,10 @@ class CustomerViewSet(CustomModelViewSet):
             balance=Sum('balance'), points=Sum('points'), success_count=Sum('success_count'),
             total_amount=Sum('total_amount'), total_point=Sum('total_point')
         )
-        footer['total_balance'] = Formater.formatAmountShow(total_row['balance'] or 0)
+        footer['total_balance'] = Formater.formatValueShow(total_row['balance'] or 0)
         footer['total_points'] = str(total_row['points'] or 0)
         footer['total_success_count'] = str(total_row['success_count'] or 0)
-        footer['all_total_amount'] = Formater.formatAmountShow(total_row['total_amount'] or 0)
+        footer['all_total_amount'] = Formater.formatValueShow(total_row['total_amount'] or 0)
         footer['all_total_point'] = str(total_row['total_point'] or 0)
         page = self.paginate_queryset(queryset)
         if page is not None:

+ 3 - 3
apps/order/serializers.py

@@ -29,7 +29,7 @@ class OrderSerializer(serializers.ModelSerializer):
         fields = '__all__'
 
     def get_total_amount(self, obj):
-        return Formater.formatPriceShow(obj.total_amount)
+        return Formater.formatValueShow(obj.total_amount)
 
     def get_express_info(self, obj):
         if obj.express_no and obj.express_company:
@@ -48,10 +48,10 @@ class OrderDetailsSerializer(serializers.ModelSerializer):
         fields = '__all__'
 
     def get_price(self, obj):
-        return Formater.formatPriceShow(obj.price)
+        return Formater.formatValueShow(obj.price)
 
     def get_amount(self, obj):
-        return Formater.formatPriceShow(obj.amount)
+        return Formater.formatValueShow(obj.amount)
 
     def get_images(self, obj):
         if obj.commodity.show_image:

+ 2 - 4
uis/views/commodity/index.html

@@ -100,10 +100,8 @@
 
                     <script type="text/html" id="commodity-operate-bar">
                         <div class="layui-btn-group">
-                            <a class="layui-btn layui-btn-xs" lay-event="commodity_edit"
-                            >修改</a>
-                            <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="commodity_delete"
-                            >删除</a>
+                            <a class="layui-btn layui-btn-xs" lay-event="commodity_edit">修改</a>
+                            <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="commodity_delete">删除</a>
                         </div>
                     </script>
                 </div>