jiaweiqi há 3 anos atrás
pai
commit
4249c37de2

+ 21 - 4
apps/config/models.py

@@ -18,6 +18,8 @@ class Config(models.Model):
     KEY_AGAIN_LEVEL3 = "again_lv3"
     KEY_AGAIN_LEVEL4 = "again_lv4"
     KEY_AGAIN_LEVEL5 = "again_lv5"
+    # 成为供应商需购买的指定商品
+    KEY_DISTRIBUTOR_COMMODITY = "distributor_commodity"
 
     property = models.CharField(max_length=100, verbose_name=u'属性')
     value = models.TextField(verbose_name=u'值')
@@ -32,9 +34,24 @@ class Config(models.Model):
         permissions = []
 
     @staticmethod
-    def getPackagePercentage(tenant_id):
+    def get_value(property):
+        item_list = [
+            Config.KEY_POINT_RULE,
+            Config.KEY_FIRST_LEVEL1, Config.KEY_FIRST_LEVEL2, Config.KEY_FIRST_LEVEL3, Config.KEY_FIRST_LEVEL4, Config.KEY_FIRST_LEVEL5,
+            Config.KEY_AGAIN_LEVEL1, Config.KEY_AGAIN_LEVEL2, Config.KEY_AGAIN_LEVEL3, Config.KEY_AGAIN_LEVEL4, Config.KEY_AGAIN_LEVEL5,
+        ]
+        if property in item_list:
+            try:
+                row = Config.objects.get(property=property)
+                return float(row.value)
+            except:
+                return 0
+        return 0
+
+    @staticmethod
+    def get_commodity():
         try:
-            row = Config.objects.get(property=Config.KEY_POINT_RULE)
-            return float(row.value)
+            commodity = Config.objects.get(property=Config.KEY_DISTRIBUTOR_COMMODITY).value
+            return commodity
         except:
-            return 0
+            return ''

+ 0 - 7
apps/config/serializers.py

@@ -15,10 +15,3 @@ class ConfigSerializer(serializers.ModelSerializer):
         model = Config
         fields = '__all__'
 
-    def create(self, validated_data):
-        instance = super(ConfigSerializer, self).create(validated_data)
-        return instance
-
-    def update(self, instance, validated_data):
-        instance = super(ConfigSerializer, self).update(instance, validated_data)
-        return instance

+ 50 - 2
apps/config/views.py

@@ -3,7 +3,8 @@
 import json
 
 from django.db import transaction
-
+from django.conf import settings
+from rest_framework.decorators import action
 from utils.custom_modelviewset import CustomModelViewSet
 from utils import response_ok, response_error
 from utils.exceptions import CustomError
@@ -12,7 +13,9 @@ from utils.permission import IsEmployee
 from apps.config.models import Config
 from apps.config.serializers import ConfigSerializer
 from apps.config.filters import ConfigFilter
+from apps.commodity.models import Commodity
 from apps.log.models import BizLog
+from apps.base import Formater
 
 
 class ConfigViewSet(CustomModelViewSet):
@@ -46,6 +49,51 @@ class ConfigViewSet(CustomModelViewSet):
                         config.save()
                     else:
                         Config.objects.create(property=item['key'], value=item['value'])
-            BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'修改系统配置',data)
+            BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'修改系统配置', data)
+        return response_ok()
+
+    @action(methods=['post'], detail=False)
+    def set_commodity(self, request):
+        '''
+        存在commodity_id  查询相应的商品并保存设置
+        不存在commodity_id  将原来的设置清空
+        :param request:
+        :return:
+        '''
+        commodity_id = request.POST.get('commodity_id', None)
+
+        commodity = None
+        if commodity_id:
+            commodity = Commodity.objects.filter(id=commodity_id).first()
+        if commodity and commodity.delete:
+            raise CustomError(u'该商品已删除!')
+        if commodity and commodity.status == settings.OFFLINE:
+            raise CustomError(u'该商品已下架!')
+        with transaction.atomic():
+            config = Config.objects.filter(property=Config.KEY_DISTRIBUTOR_COMMODITY).first()
+            if config:
+                config.value = commodity_id
+                config.save()
+            else:
+                Config.objects.create(property=Config.KEY_DISTRIBUTOR_COMMODITY, value=commodity_id)
         return response_ok()
 
+    @action(methods=['get'], detail=False)
+    def get_commodity(self, request):
+        '''
+        返回设置商品信息  如果该商品在销售过程中 下架或者删除 设置商品同时失效
+        :param request:
+        :return:
+        '''
+        commodity_id = Config.get_commodity()
+        data = {}
+        if commodity_id:
+            commodity = Commodity.objects.filter(id=commodity_id, delete=False, status=settings.ONLINE).first()
+            if not commodity:
+                return response_ok(data)
+            data['name'] = commodity.name or ''
+            data['price'] = Formater.formatValueShow(commodity.price)
+            data['vip_price'] = Formater.formatValueShow(commodity.vip_price)
+            data['point_price'] = commodity.point_price or '0.00'
+            data['show_image'] = commodity.show_image and commodity.show_image.get_path() or ''
+        return response_ok(data)

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


+ 32 - 0
apps/customer/collection/serializers.py

@@ -0,0 +1,32 @@
+# coding=utf-8
+
+from rest_framework import serializers
+
+from django.conf import settings
+
+from apps.collection.models import Collection
+from apps.base import Formater
+
+
+class CollectionSerializer(serializers.ModelSerializer):
+    name = serializers.CharField(source='commodity.name', read_only=True)
+    image = serializers.SerializerMethodField()
+    price = serializers.SerializerMethodField()
+    vip_price = serializers.SerializerMethodField()
+    point_price = serializers.CharField(source='commodity.point_price', read_only=True)
+    price_type = serializers.CharField(source='commodity.type', read_only=True)
+
+    class Meta:
+        model = Collection
+        fields = '__all__'
+
+    def get_image(self, obj):
+        if obj.commodity and obj.commodity.show_image:
+            return obj.commodity.show_image.get_path()
+        return ''
+
+    def get_price(self, obj):
+        return Formater.formatValueShow(obj.commodity.price)
+
+    def get_vip_price(self, obj):
+        return Formater.formatValueShow(obj.commodity.vip_price)

+ 10 - 0
apps/customer/collection/urls.py

@@ -0,0 +1,10 @@
+# coding=utf-8
+
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+    url(r'list/$', CollectionListViewSet.as_view()),
+]

+ 28 - 0
apps/customer/collection/views.py

@@ -0,0 +1,28 @@
+# coding=utf-8
+
+from rest_framework import generics
+from rest_framework.exceptions import NotFound
+
+from utils.permission import IsCustomer
+from utils import response_ok
+from apps.collection.models import Collection
+from apps.collection.filters import CollectionFilter
+from .serializers import CollectionSerializer
+
+
+class CollectionListViewSet(generics.ListAPIView):
+    permission_classes = [IsCustomer, ]
+    queryset = Collection.objects.filter(delete=False)
+    serializer_class = CollectionSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(customer=self.request.customer)
+        f = CollectionFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(CollectionListViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data

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


+ 21 - 0
apps/customer/distributor/serializers.py

@@ -0,0 +1,21 @@
+# coding=utf-8
+
+
+from rest_framework import serializers
+
+from apps.customer.models import SuperiorDistributor
+
+from apps.base import Formater
+
+
+class DistributorSerializer(serializers.ModelSerializer):
+    name = serializers.CharField(source='customer.name', read_only=True)
+    total_count = serializers.CharField(source='customer.success_count', read_only=True)
+    total_amount = serializers.SerializerMethodField()
+
+    class Meta:
+        model = SuperiorDistributor
+        fields = ('name', 'total_count', 'total_amount', )
+
+    def get_total_amount(self, obj):
+        return Formater.formatValueShow(obj.customer.total_amount)

+ 13 - 0
apps/customer/distributor/urls.py

@@ -0,0 +1,13 @@
+# coding=utf-8
+
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+    url(r'^data/$', DistributorView.as_view()),
+    url(r'^commodity/$', DistributorCommodityView.as_view()),
+    url(r'^type/$', DataTypeView.as_view()),
+]
+

+ 85 - 0
apps/customer/distributor/views.py

@@ -0,0 +1,85 @@
+# coding=utf-8
+
+import json
+
+from django.db import transaction
+from django.db.models import Q, Sum
+from django.conf import settings
+from rest_framework.decorators import action
+from rest_framework.views import APIView
+from utils.custom_modelviewset import CustomModelViewSet
+from utils import response_ok, response_error
+from utils.exceptions import CustomError
+from utils.permission import IsCustomer, AnyOne
+
+from apps.config.models import Config
+from apps.commodity.models import Commodity
+from apps.customer.commodity.serializers import CommoditySerializer
+from apps.customer.models import SuperiorDistributor
+from apps.customer.filters import SuperiorDistributorFilter
+from apps.customer.distributor.serializers import DistributorSerializer
+from apps.rebate.models import CashRebate, PointRebate
+from apps.base import Formater
+
+from rest_framework import generics
+
+
+class DataTypeView(APIView):
+    permission_classes = [AnyOne, ]
+
+    def get(self, request):
+        '''
+        分销商页面用来判断进入那个页面  如果用户登陆且是分销商 要请求下级分销商数据
+        如果用户没有登陆或者用户不是分销商 要请求成为分销商要购买的商品信息
+        :param request:
+        :return:
+        '''
+        type = 'no'
+        if request.customer and request.customer.is_distributor:
+            type = 'yes'
+        return response_ok(type)
+
+
+class DistributorView(generics.ListAPIView):
+    permission_classes = [IsCustomer, ]
+    queryset = SuperiorDistributor.objects.filter()
+    serializer_class = DistributorSerializer
+
+    def filter_queryset(self, queryset):
+        customer = self.request.customer
+        queryset = queryset.filter(
+            Q(one_level=customer) | Q(two_level=customer) | Q(three_level=customer) | Q(four_level=customer) | Q(five_level=customer)
+        )
+        f = SuperiorDistributorFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        queryset = self.filter_queryset(self.get_queryset())
+        sum_rows = queryset.aggregate(sum_count=Sum('customer__success_count'), sum_amount=Sum('customer__total_amount'))
+        sum_cash = CashRebate.objects.filter(customer=request.customer).aggregate(sum_amount=Sum('amount'))['sum_amount'] or 0
+        sum_point = PointRebate.objects.filter(customer=request.customer).aggregate(sum_amount=Sum('amount'))['sum_amount'] or 0
+        footer = {
+            'sum_count': sum_rows['sum_count'] or 0,
+            'sum_amount': Formater.formatValueShow(sum_rows['sum_amount']),
+            'sum_cash': Formater.formatValueShow(sum_cash),
+            'sum_point': sum_point,
+        }
+
+        page = self.paginate_queryset(queryset)
+        if page is not None:
+            serializer = self.get_serializer(page, many=True)
+            return self.get_paginated_response({'data': serializer.data, 'footer': footer})
+        serializer = self.get_serializer(queryset, many=True)
+        return response_ok({'data': serializer.data, 'footer': footer})
+
+
+class DistributorCommodityView(APIView):
+
+    def get(self, request):
+        data = []
+        commodity_id = Config.get_commodity()
+        if commodity_id:
+            commodity = Commodity.objects.filter(id=commodity_id, delete=False, status=settings.ONLINE).first()
+            serializer = CommoditySerializer(commodity, many=False)
+            data.append(serializer.data)
+        return response_ok(data)

+ 9 - 1
apps/customer/filters.py

@@ -2,7 +2,7 @@
 
 import django_filters
 
-from apps.customer.models import Customer, CustomerAddress
+from apps.customer.models import Customer, CustomerAddress, SuperiorDistributor
 
 
 class CustomerFilter(django_filters.FilterSet):
@@ -27,3 +27,11 @@ class CustomerAddressFilter(django_filters.FilterSet):
     class Meta:
         model = CustomerAddress
         fields = '__all__'
+
+
+class SuperiorDistributorFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='customer__name', lookup_expr='icontains')
+
+    class Meta:
+        model = SuperiorDistributor
+        fields = '__all__'

+ 20 - 3
apps/customer/order/serializers.py

@@ -1,20 +1,34 @@
 # coding=utf-8
 
 import datetime
-
+from django.conf import settings
 from rest_framework import serializers
 
 from utils.exceptions import CustomError
 
 from apps.order.models import ShoppingCart
+from apps.base import Formater
 
 
 class ShoppingCartSerializer(serializers.ModelSerializer):
+    name = serializers.CharField(source='commodity_details.name', read_only=True)
+    image = serializers.SerializerMethodField()
+    price = serializers.SerializerMethodField()
+    point_price = serializers.CharField(source='commodity_details.point_price', read_only=True)
+    price_type = serializers.CharField(source='commodity_details.type', read_only=True)
 
     class Meta:
         model = ShoppingCart
         fields = '__all__'
 
+    def get_price(self, obj):
+        return Formater.formatValueShow(obj.commodity_details.price)
+
+    def get_image(self, obj):
+        if obj.commodity_details and obj.commodity_details.show_image:
+            return obj.commodity_details.show_image.get_path()
+        return ''
+
     def validate(self, attrs):
         if 'quantity' in attrs:
             try:
@@ -23,12 +37,15 @@ class ShoppingCartSerializer(serializers.ModelSerializer):
                 raise CustomError(u'商品数量错误,请修改!')
             if quantity <= 0:
                 raise CustomError(u'商品数量错误,请修改!')
+        if 'commodity_details' in attrs:
+            if attrs['commodity_details'].delete:
+                raise CustomError(u'该商品已删除,禁止购买!')
+            if attrs['commodity_details'].status == settings.OFFLINE:
+                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']

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

@@ -25,3 +25,26 @@ class ShoppingCartViewSet(CustomModelViewSet):
 
     def perform_create(self, serializer):
         super(ShoppingCartViewSet, self).perform_create(serializer)
+
+    @action(methods=['post'], detail=True)
+    def update_quantity(self, request, pk):
+        quantity = request.POST.get('quantity')
+        try:
+            quantity = int(quantity)
+        except:
+            raise CustomError(u'商品数量错误,请修改!')
+        if quantity <= 0:
+            raise CustomError(u'请输入正确的商品数量!')
+        with transaction.atomic():
+            instance = ShoppingCart.objects.filter(id=pk, customer=request.customer).first()
+            if instance:
+                instance.quantity = quantity
+                instance.save()
+        return response_ok()
+
+    @action(methods=['post'], detail=False)
+    def del_cart(self, request):
+        car_ids = request.POST.get('ids').split(',')
+        with transaction.atomic():
+            ShoppingCart.objects.filter(id__in=car_ids, customer=request.customer).delete()
+        return response_ok()

+ 3 - 1
apps/customer/urls.py

@@ -12,8 +12,10 @@ urlpatterns = [
     url(r'^token/refresh/$', CustomerRefreshTokenView),
     url(r'^token/verify/$', CustomerVerifyTokenView),
 
-    url(r'^commodity/', include('apps.customer.commodity.urls')),
     url(r'^address/', include('apps.customer.address.urls')),
+    url(r'^commodity/', include('apps.customer.commodity.urls')),
+    url(r'^collection/', include('apps.customer.collection.urls')),
+    url(r'^distributor/', include('apps.customer.distributor.urls')),
     url(r'^order/', include('apps.customer.order.urls')),
 ]
 

+ 1 - 0
apps/customer/views.py

@@ -97,6 +97,7 @@ class CustomerViewSet(CustomModelViewSet):
         footer['total_success_count'] = str(total_row['success_count'] 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:
             serializer = self.get_serializer(page, many=True)

+ 0 - 0
apps/rebate/__init__.py


+ 0 - 0
apps/rebate/filters.py


+ 0 - 0
apps/rebate/migrations/__init__.py


+ 139 - 0
apps/rebate/models.py

@@ -0,0 +1,139 @@
+# coding=utf-8
+
+from django.db import models
+from django.db.models import Q
+from django.conf import settings
+from django.utils import timezone
+
+from apps.customer.models import Customer
+from apps.order.models import Order
+
+'''
+现金返利及现金变动记录
+'''
+
+
+class CashLog(models.Model):
+    CASH_REBATE = 1
+    TYPE_CHOICES = (
+        (CASH_REBATE, u'现金返利'),
+    )
+
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
+    happen_time = models.DateTimeField(verbose_name=u"发生时间", default=timezone.now)
+    amount = models.BigIntegerField(verbose_name=u"变动额")
+    balance = models.BigIntegerField(verbose_name=u"余额")
+
+    class Meta:
+        db_table = "cash_log"
+        verbose_name = u'现金日志'
+        ordering = []
+        index_together = ()
+        default_permissions = ()
+        permissions = []
+
+
+class CashRebate(models.Model):
+
+    order = models.ForeignKey(Order, verbose_name=u'订单', related_name='cash_rebate_order', editable=False, on_delete=models.PROTECT)
+    ratio = models.FloatField(verbose_name=u'返利比例', default=0)
+    amount = models.BigIntegerField(verbose_name=u'返利金额', default=0)
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
+
+    class Meta:
+        db_table = "cash_rebate"
+        verbose_name = u'现金返利'
+        ordering = []
+        index_together = ()
+        default_permissions = ()
+        permissions = []
+
+
+class CashRebateLog(models.Model):
+    rebate = models.OneToOneField(CashRebate, verbose_name=u'现金返利', related_name='rebate', editable=False, on_delete=models.PROTECT)
+    log = models.OneToOneField(CashLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = "cahs_rebate_log"
+        verbose_name = u'现金返利日志'
+        ordering = []
+        index_together = ()
+        default_permissions = ()
+        permissions = []
+
+'''
+积分返利及积分变动记录
+'''
+
+
+class PointLog(models.Model):
+
+    POINT_REBATE = 1
+    POINT_ORDER = 2
+    TYPE_CHOICES = (
+        (POINT_REBATE, u'积分返利'),
+        (POINT_ORDER, u'积分兑换'),
+    )
+
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', on_delete=models.PROTECT)
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
+    happen_time = models.DateTimeField(verbose_name=u"发生时间", default=timezone.now)
+    amount = models.IntegerField(verbose_name=u"变动额")
+    balance = models.IntegerField(verbose_name=u"余额")
+
+    class Meta:
+        db_table = "point_log"
+        verbose_name = u'积分日志'
+        ordering = []
+        index_together = ()
+        default_permissions = ()
+        permissions = []
+
+
+class PointRebate(models.Model):
+
+    order = models.ForeignKey(Order, verbose_name=u'订单', related_name='point_rebate_order', editable=False, on_delete=models.PROTECT)
+    ratio = models.FloatField(verbose_name=u'返利比例', default=0)
+    amount = models.IntegerField(verbose_name=u'返利积分', default=0)
+    customer = models.ForeignKey(Customer, verbose_name=u'客户', editable=False, on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now, editable=False)
+
+    class Meta:
+        db_table = "point_rebate"
+        verbose_name = u'积分返利'
+        ordering = []
+        index_together = ()
+        default_permissions = ()
+        permissions = []
+
+
+class PointLogOrder(models.Model):
+
+    order = models.OneToOneField(Order, verbose_name=u'订单', related_name='order', editable=False, on_delete=models.PROTECT)
+    log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='order_log', editable=False, on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = "point_log_order"
+        verbose_name = u'积分兑换日志'
+        ordering = []
+        index_together = ()
+        default_permissions = ()
+        permissions = []
+
+
+class PointLogRebate(models.Model):
+    rebate = models.OneToOneField(PointRebate, verbose_name=u'积分返利', related_name='rebate', editable=False, on_delete=models.PROTECT)
+    log = models.OneToOneField(PointLog, verbose_name=u'日志', related_name='rebate_log', editable=False, on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = "point_log_rebate"
+        verbose_name = u'积分返利日志'
+        ordering = []
+        index_together = ()
+        default_permissions = ()
+        permissions = []
+
+
+

+ 1 - 0
cosmetics_shop/settings.py

@@ -55,6 +55,7 @@ INSTALLED_APPS = [
     'apps.log',
     'apps.option',
     'apps.order',
+    'apps.rebate',
     'apps.WechatApplet',
 ]
 

+ 179 - 0
uis/views/config/commodity_choice.html

@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>商品</title>
+    <meta name="renderer" content="webkit">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=agent-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+    <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+    <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+    <style type="text/css">
+        .seach_items {
+            float: right;
+            margin-left: 10px;
+        }
+    </style>
+    <style type="text/css">
+        .LAY-btns .layui-nav {
+            padding-left: 0;
+            padding-right: 10px;
+            top: -4px;
+            margin: 0 10px;
+            border: 0;
+            background-color: #009688;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-item {
+            line-height: 40px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child {
+            top: 34px;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-bar {
+            display: none;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a {
+            color: #333;
+            background-color: #fff;
+        }
+
+        .LAY-btns .layui-nav .layui-nav-child dd.layui-this a:hover {
+            background-color: #f2f2f2;
+            color: #000;
+        }
+
+        .tableContent {
+            width: 100%;
+            display: flex;
+            justify-content: space-between;
+            flex-direction: row;
+        }
+
+        .layui-table-cell {
+            padding: 0 5px;
+        }
+    </style>
+
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+            <div class="layui-row layui-col-space15">
+                <div class="layui-col-md12">
+                    <!--商品-->
+                    <div class="LAY-btns" style="margin-bottom: 10px;">
+                        <form class="layui-form" lay-filter="query-form-element">
+                            <div class="seach_items">
+                                <button class="layui-btn" lay-submit lay-filter="query-form-element"><i class="layui-icon layui-icon-search"></i>查询
+                                </button>
+                            </div>
+                            <div class="seach_items" style="width: 150px;">
+                                <select name="type">
+                                    <option value="">请选择价格类型</option>
+                                    <option value="1">现金商品</option>
+                                    <option value="2">积分商品</option>
+                                </select>
+                            </div>
+                            <div class="seach_items" style="width: 150px">
+                                <select name="category" id="select_category">
+                                    <option value="">请选择商品类别</option>
+                                </select>
+                            </div>
+                            <div class="seach_items">
+                                <input type="text" name="name" autocomplete="off" class="layui-input" placeholder="名称"/>
+                            </div>
+                        </form>
+                        <div style="clear: both;"></div>
+                    </div>
+                    <table class="layui-hide" id="commodity_datagrid" lay-filter="commodity-operate"></table>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<script src="../../layuiadmin/layui/layui.js?t=1"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+    }).use(['index', 'table', 'form', ], function () {
+        var $ = layui.$;
+        var table = layui.table
+            , form = layui.form
+            , admin = layui.admin;
+
+        admin.req({
+            url: '/commodity/dict/',
+            done: function (res) {
+                var data = res.data.category;
+                var category = $('#select_category');
+                for (var i in data) {
+                    var pid1 = data[i].value;
+                    var name1 = data[i].name;
+                    category.append("<option value='" + pid1 + "'>" + name1 + "</option>");
+                }
+                form.render();
+            }
+        });
+
+        table.render({
+            elem: '#commodity_datagrid'
+            , url: '/commodity/'
+            , cols: [[
+                {type:'radio'}
+                , {field: 'name', title: '商品名称', width: 200}
+                , {field: 'category_text', title: '商品类别', width: 100}
+                , {field: 'type_text', title: '价格类型', width: 100}
+                , {field: 'price', title: '销售价格', width: 120}
+                , {field: 'vip_price', title: '会员价格', width: 120}
+                , {field: 'point_price', title: '积分价格', width: 120}
+                , {field: 'status_text', title: '状态', width: 120}
+            ]]
+            , page: true
+            , height: 'full-108'
+            , done: function () {
+                layui.index.removeNoPermButtons();
+            }
+        });
+
+        form.on('submit(query-form-element)', function (data) {
+            table.reload('commodity_datagrid', {
+                where: data.field
+                , page: {curr: 1}
+            });
+            layer.closeAll();
+            return false
+        });
+        
+        parent.layui.submitChild = function () {
+            var checkStatus = table.checkStatus('commodity_datagrid');
+            var commodity_id = '';
+            if (checkStatus.data.length === 1) {
+                 commodity_id = checkStatus.data[0].id;
+            }
+            admin.req({
+                url: '/config/set_commodity/'
+                ,data: {'commodity_id': commodity_id}
+                ,type: 'post'
+                ,done: function(res){
+                    parent.layui.onSubmitChild(res.data);
+                }
+              });
+            return false;
+
+        }
+        
+    });
+
+</script>
+</body>
+</html>

+ 105 - 26
uis/views/config/index.html

@@ -10,10 +10,7 @@
     <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
     <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
     <style>
-        img {
-            width: 40%;
-            height: 30%;
-        }
+
     </style>
 </head>
 <body>
@@ -21,6 +18,34 @@
 <div class="layui-fluid">
     <div class="layui-card">
         <div class="layui-card-body" pad15>
+            <div class="layui-inline">
+                <label class="layui-form-label " style="width: 10px"></label>
+                <div class="layui-form-mid " style="color: green">设置成为分销商需购买的商品</div>
+            </div>
+            <div class="layui-input-block" style="margin-left: 20px">
+                <button class="layui-btn" id="set_distributor_commodity">设置商品</button>
+            </div>
+            <div class="layui-input-block" style="width: 600px; margin-left: 20px">
+                <table class="layui-table">
+                    <tr>
+                        <td rowspan="5" style="height: 200px; width: 200px" id="commodity_show_image"></td>
+                    </tr>
+                    <tr>
+                        <td id="commodity_name">名称:</td>
+                    </tr>
+                    <tr>
+                        <td id="commodity_price">销售价:</td>
+                    </tr>
+                    <tr>
+                        <td id="commodity_vip_price">会员价:</td>
+                    </tr>
+                    <tr>
+                        <td id="commodity_point_price">积分价:</td>
+                    </tr>
+                </table>
+
+            </div>
+
             <form class="layui-form" action="" lay-filter="component-form-element">
                 <div class="layui-form-item">
                     <div class="layui-inline">
@@ -126,16 +151,6 @@
                         <div class="layui-form-mid ">%</div>
                     </div>
                     <br>
-                    <div class="layui-inline">
-                        <label class="layui-form-label " style="width: 10px"></label>
-                        <div class="layui-form-mid " style="color: green">设置成为分销商需购买的商品</div>
-                    </div>
-                    <div>
-                        <div class="layui-input-block">
-                            <button type="button" class="layui-btn layui-btn-primary layui-border-blue" id="pay_picture">设置商品</button>
-                        </div>
-                    </div>
-
                     <div class="layui-input-block" style="margin-top: 20px">
                         <button class="layui-btn" lay-submit lay-filter="component-form-element">保存</button>
                     </div>
@@ -156,20 +171,61 @@
         var $ = layui.$
             , admin = layui.admin
             , form = layui.form;
-        form.render(null, 'component-form-element');
 
-        admin.req({
-            url: '/config/',
-            done: function (res) {
-                var data = res.data;
-                var edit_data = {};
-                for (var i in data) {
-                    edit_data[data[i].property] = data[i].value
+        function load_commodity() {
+            admin.req({
+                url: '/config/get_commodity/',
+                done: function (res) {
+                    var data = res.data;
+                    if (data.name) {
+                        $('#commodity_name').html('名称:' + data.name)
+                    } else {
+                        $('#commodity_name').html('名称:')
+                    }
+                    if (data.price) {
+                        $('#commodity_price').html('销售价:' + data.price)
+                    } else {
+                        $('#commodity_price').html('销售价:')
+                    }
+                    if (data.vip_price) {
+                        $('#commodity_vip_price').html('会员价:' + data.vip_price)
+                    } else {
+                        $('#commodity_vip_price').html('会员价:');
+                    }
+                    if (data.point_price) {
+                        $('#commodity_point_price').html('积分价:' + data.point_price)
+                    } else {
+                        $('#commodity_point_price').html('积分价:');
+                    }
+                    if (data.show_image) {
+                        $('#commodity_show_image').html('<img src="' + data.show_image + '"/>')
+                    } else {
+                        $('#commodity_show_image').html('')
+                    }
+
                 }
-                form.val("component-form-element", edit_data);
-                form.render();
-            }
-        });
+            });
+        }
+
+        function load_config() {
+            admin.req({
+                url: '/config/',
+                done: function (res) {
+                    var data = res.data;
+                    var edit_data = {};
+                    for (var i in data) {
+                        edit_data[data[i].property] = data[i].value
+                    }
+                    form.val("component-form-element", edit_data);
+                    form.render();
+                }
+            });
+        }
+
+        form.render(null, 'component-form-element');
+
+        load_config();
+        load_commodity();
 
         var form_data = [];
 
@@ -190,6 +246,7 @@
                         , btnAlign: 'c' //按钮居中
                         , shade: 0.3 //不显示遮罩
                         , yes: function () {
+                            load_config();
                             layer.closeAll();
                             //admin.exit();
                         }
@@ -199,6 +256,28 @@
             return false;
         });
 
+        $('#set_distributor_commodity').on('click', function(){
+            layer.open({
+              type: 2,
+              title: '设置成为分销商指定商品',
+              shadeClose: false,
+              area: ['70%', '95%'],
+              btn: ['保存', '取消'],
+              yes: function (index, dom) {
+                layui.onSubmitChild = function (data) {
+                    layer.close(index);
+                    load_commodity();
+                  };
+
+                  layui.submitChild();
+              },
+              btn2: function(index, layero){
+                layer.close(index);//关闭当前按钮
+              },
+              content: 'commodity_choice.html'
+            });
+        });
+
     });
 </script>
 </body>

+ 10 - 0
utils/permission.py

@@ -23,3 +23,13 @@ class IsEmployee(permissions.BasePermission):
         if not request.user or not request.user.is_authenticated:
             return False
         return request.user.is_employee()
+
+
+class AnyOne(permissions.BasePermission):
+    '''都有权限,只是如果是customer的话可以获取到customer'''
+    def has_permission(self, request, view):
+        customer = None
+        if request.user and request.user.is_authenticated and request.user.is_customer():
+            customer = Customer.objects.filter(user_id=request.user.id).first()
+        request.customer = customer
+        return True