wushaodong 3 rokov pred
rodič
commit
85d316393e

+ 2 - 2
apps/option/views.py

@@ -49,7 +49,7 @@ class CategoryView(APIView):
         return response_ok(result)
 
 class CategoryWXView(APIView):
-    permission_classes = [isLogin, ]
+    # permission_classes = [isLogin, ]
 
     def get(self, request):
         rows = CommodityLevel.objects.filter(enable=True, home_show=True)
@@ -131,7 +131,7 @@ class SchoolTreeView(APIView):
         return response_ok(source_data)
 
 class CategoryTreeView(APIView):
-    permission_classes = [isLogin, ]
+    # permission_classes = [isLogin, ]
 
     # @cache_response()
     def get(self, request):

+ 5 - 6
apps/order/models.py

@@ -15,15 +15,13 @@ from apps.option.models import CommodityLevel, School
 class Coupon(models.Model):
 
     name = models.CharField(max_length=50, verbose_name='优惠券名称', unique=True, null=True)
-    amount = models.BigIntegerField(verbose_name=u"优惠券金额")
+    amount = models.BigIntegerField(verbose_name=u"优惠券金额", default=0)
 
-    category = models.ForeignKey(CommodityLevel, verbose_name='使用分类', on_delete=models.PROTECT, null=True,
-                                   related_name='coupon_category')
-    school = models.ForeignKey(School, verbose_name='使用学校', on_delete=models.PROTECT, null=True,
-                                   related_name='coupon_category')
+    category = models.CharField(max_length=200, verbose_name='使用分类', null=True,)
+    school = models.CharField(max_length=200, verbose_name='使用学校', null=True,)
     create_time = models.DateTimeField(verbose_name=u"创建时间", default=timezone.now)
     create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'创建人', related_name='coupon_create_user',
-                             on_delete=models.PROTECT)
+                             on_delete=models.PROTECT, editable=False)
     begin_date = models.DateField(verbose_name=u"开始时间", null=True)
     end_date = models.DateField(verbose_name=u"结束时间", null=True)
     enable = models.BooleanField(verbose_name=u"是否在用", default=True)
@@ -134,6 +132,7 @@ class Order(models.Model):
     no = models.CharField(max_length=50, verbose_name=u'订单号', blank=True)
     pay = models.ForeignKey(Pay, verbose_name='支付信息', on_delete=models.PROTECT, null=True, editable=False)
     coupon = models.ForeignKey(Coupon, verbose_name='优惠券', editable=False, on_delete=models.PROTECT, null=True)
+    commodity = models.ForeignKey(Commodity, verbose_name='商品', on_delete=models.PROTECT, null=True)
 
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u"订单状态", default=WAIT_PAY)
     notes = models.CharField(max_length=500, verbose_name=u"备注", null=True)

+ 42 - 4
apps/order/serializers.py

@@ -5,14 +5,18 @@ from .models import *
 from django.conf import settings
 from utils.booleancharfield import PriceShowCharField
 from apps.base import Formater
+from utils.booleancharfield import BooleanCharField
 
 class OrderSerializer(serializers.ModelSerializer):
+    commodity_name = serializers.CharField(source='commodity.name', read_only=True)
+    student_name = serializers.CharField(source='student.name', read_only=True)
     payment_name = serializers.CharField(source='get_payment_display', read_only=True)
     create_user_text = serializers.CharField(source='create_user.username', read_only=True)
     status_text = serializers.CharField(source='get_status_display', read_only=True)
 
     total_amount = PriceShowCharField(read_only=True)
     actual_amount = PriceShowCharField(read_only=True)
+
     class Meta:
         model = Order
         fields = '__all__'
@@ -26,15 +30,49 @@ class OrderSerializer(serializers.ModelSerializer):
 
 class CouponSerializer(serializers.ModelSerializer):
     create_user_text = serializers.CharField(source='create_user.username', read_only=True)
-    amount = PriceShowCharField(read_only=True)
+    amount = PriceShowCharField()
+    enable_text = BooleanCharField(source='enable', read_only=True)
+    category_text = serializers.SerializerMethodField()
+    school_text = serializers.SerializerMethodField()
+    category_ids = serializers.SerializerMethodField()
+
+    def get_category_ids(self, obj):
+        return obj.category.split(',')
+
+    def get_school_text(self, obj):
+        name = ''
+        if obj.school:
+            rows = School.objects.filter(id__in=obj.school.split(','))
+            for row in rows:
+                name += row.name + ','
+        return name
+
+    def get_category_text(self, obj):
+        name = ''
+        if obj.category:
+            rows = CommodityLevel.objects.filter(id__in=obj.category.split(','))
+            for row in rows:
+                name1 = row.name
+                if row.category:
+                    name1 = '{}-{}'.format(row.category.name, name1)
+                    if row.category.category:
+                        name1 = '{}-{}'.format(row.category.category.name, name1)
+                name += name1 + ','
+        return name
+
     class Meta:
         model = Coupon
         fields = '__all__'
 
     def create(self, validated_data):
         validated_data['create_user'] = self.context['request'].user
+        validated_data['amount'] = Formater.formatPrice(validated_data['amount'])
         instance = super(CouponSerializer, self).create(validated_data)
-        instance.save()
+        return instance
+
+    def update(self, instance, validated_data):
+        validated_data['amount'] = Formater.formatPrice(validated_data['amount'])
+        instance = super(CouponSerializer, self).update(instance, validated_data)
         return instance
 
 class ShoppingCartSerializer(serializers.ModelSerializer):
@@ -44,7 +82,7 @@ class ShoppingCartSerializer(serializers.ModelSerializer):
     images = serializers.SerializerMethodField()
 
     def get_price(self, obj):
-        return Formater.formatPriceShow(obj.commodity.price * obj.commodity.discount/100)
+        return Formater.formatPriceShow(obj.commodity.price * obj.commodity.discount / 100)
 
     def get_images(self, obj):
         if obj.commodity.main_image:
@@ -56,7 +94,7 @@ class ShoppingCartSerializer(serializers.ModelSerializer):
     class Meta:
         model = ShoppingCart
         fields = (
-            'id', 'name', 'price', 'stock',  'images', 'quantity', 'commodity'
+            'id', 'name', 'price', 'stock', 'images', 'quantity', 'commodity'
         )
 
     def create(self, validated_data):

+ 1 - 0
apps/order/urls.py

@@ -10,5 +10,6 @@ urlpatterns = [
 
 router = SimpleRouter()
 router.register(r'shopping_cart', ShoppingCartViewSet)
+router.register(r'coupon', CouponViewSet)
 router.register(r'', OrderViewSet)
 urlpatterns += router.urls

+ 9 - 0
apps/order/views.py

@@ -195,3 +195,12 @@ class ShoppingCartViewSet(CustomModelViewSet):
         except Exception as e:
             traceback.print_exc()
             return response_error(str(e))
+
+class CouponViewSet(CustomModelViewSet):
+    permission_classes = [isLogin]
+    queryset = Coupon.objects.filter()
+    serializer_class = CouponSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(create_user=self.request.user)
+        return queryset

+ 3 - 0
uis/views/index.html

@@ -102,6 +102,9 @@
                             <cite>订单管理</cite>
                         </a>
                         <dl class="layui-nav-child">
+                            <dd data-name="nav">
+                                <a lay-href="order/coupon.html">优惠券管理</a>
+                            </dd>
                             <dd data-name="nav">
                                 <a lay-href="order/index.html">用户订单</a>
                             </dd>

+ 142 - 0
uis/views/order/coupon.html

@@ -0,0 +1,142 @@
+<!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=device-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">
+    <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+    <style type="text/css">
+        .seach_items {
+            display: inline-block;
+            margin-right: 5px;
+            margin-top: 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;">
+                        <div style="float:left; margin-right: 5px; margin-top: 5px;">
+                            <button class="layui-btn" id="btn_add">
+                                <i class="layui-icon layui-icon-add-circle"></i>添加
+                            </button>
+                        </div>
+
+                        <div style="clear: both;"></div>
+                    </div>
+                    <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
+
+                    <script type="text/html" id="datagrid-operate-bar">
+                        <div class="layui-btn-group">
+                            <a class="layui-btn layui-btn-xs" lay-event="edit"
+                               data-permission="account.add_user">修改</a>
+                        </div>
+                    </script>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js?t=1"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index' //主入口模块
+        , formSelects: 'formSelects-v4'
+    }).use(['index', 'table', 'form', 'formSelects'], function () {
+        var $ = layui.$
+            , table = layui.table
+            , form = layui.form;
+        table.render({
+            elem: '#datagrid'
+            , url: '/order/coupon/'
+            , cols: [[
+                {field: 'name', title: '优惠券名称', width: 200}
+                , {field: 'amount', title: '优惠券金额', width: 100}
+                , {field: 'category_text', title: '使用分类', width: 260}
+                , {field: 'school_text', title: '使用学校', width: 260}
+                , {field: 'begin_date', title: '开始时间', width: 120}
+                , {field: 'end_date', title: '结束时间', width: 120}
+                , {field: 'count', title: '已用数量', width: 100}
+                , {field: 'enable_text', title: '是否在用', width: 100}
+                , {field: 'create_time', title: '添加时间', width: 150}
+                , {field: 'create_user_text', title: '添加人', width: 100}
+                , {width: 100, align: 'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+            ]]
+            , page: true
+            , height: 'full-108'
+        });
+        var _params;
+        form.on('submit(query-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            _params = data.field;
+            table.reload('datagrid', {
+                where: data.field
+                , page: {curr: 1}
+            });
+            layer.closeAll();
+            return false;
+        });
+        //监听工具条
+        table.on('tool(datagrid-operate)', function (obj) {
+            var data = obj.data;
+            if (obj.event === 'edit') {
+                table.editdata = data;
+                layer.open({
+                    type: 2,
+                    title: '修改优惠券',
+                    shadeClose: false,
+                    area: ['50%', '90%'],
+                    btn: ['保存', '取消'],
+                    yes: function (index, dom) {
+                        layui.onSubmitChild = function (res) {
+                            layer.close(index);
+                            table.reload('datagrid', {});
+                        };
+                        layui.submitChild();
+                    },
+                    btn2: function (index, layero) {
+                        layer.close(index);//关闭当前按钮
+                    },
+                    content: 'coupon_edit.html?id=' + data.id
+                });
+            }
+        });
+
+        $('#btn_add').on('click', function () {
+            layer.open({
+                type: 2,
+                title: '添加优惠券',
+                shadeClose: false,
+                area: ['40%', '90%'],
+                btn: ['保存', '取消'],
+                yes: function (index, dom) {
+                    layui.onSubmitChild = function (res) {
+                        layer.close(index);
+                        table.reload('datagrid', {});
+                    };
+                    layui.submitChild();
+                },
+                btn2: function (index, layero) {
+                    layer.close(index);//关闭当前按钮
+                },
+                content: 'coupon_edit.html'
+            });
+        });
+    });
+</script>
+</body>
+</html>
+

+ 202 - 0
uis/views/order/coupon_edit.html

@@ -0,0 +1,202 @@
+<!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=device-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">
+    <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+</head>
+<body>
+
+<div class="layui-fluid">
+    <div class="layui-row layui-col-space15">
+        <div class="layui-col-md6">
+            <div class="layui-card">
+
+                <div class="layui-card-body">
+                    <form class="layui-form" action="" lay-filter="component-form-element">
+                        <div class="layui-row layui-col-space10 layui-form-item">
+                            <div class="layui-col-lg6">
+                                <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
+                                <div class="layui-input-block">
+                                    <input type="text" name="name" lay-verify="required" placeholder="请输入优惠券名称"
+                                           autocomplete="off" class="layui-input">
+                                </div>
+                            </div>
+                            <div class="layui-col-lg6">
+                                <label class="layui-form-label"><font color='red' size="4">*</font>金额:</label>
+                                <div class="layui-input-block">
+                                    <input type="text" name="amount" lay-verify="number" placeholder="请输入优惠券金额"
+                                           autocomplete="off" class="layui-input">
+                                </div>
+                            </div>
+                            <div>
+                                <label class="layui-form-label"><font color='red' size="4">*</font>开始日期:</label>
+                                <div class="layui-input-block">
+                                    <input type="text" id="id_start_date" name="begin_date" placeholder="请输入开始日期"
+                                           autocomplete="off" class="layui-input">
+                                </div>
+                            </div>
+                            <div>
+                                <label class="layui-form-label"><font color='red' size="4">*</font>结束日期:</label>
+                                <div class="layui-input-block">
+                                    <input type="text" id="id_end_date" name="end_date" placeholder="请输入结束日期"
+                                           autocomplete="off" class="layui-input">
+                                </div>
+                            </div>
+                            <div>
+                                <label class="layui-form-label"><font color='red' size="4">*</font>使用学校:</label>
+                                <div class="layui-input-block">
+                                    <select name="school" xm-select="schoolGroup"></select>
+                                </div>
+                            </div>
+                            <div>
+                                <label class="layui-form-label"><font color='red' size="4">*</font>使用分类:</label>
+                                <div class="layui-input-block">
+                                    <select name="category" xm-select="categoryGroup"></select>
+                                </div>
+                            </div>
+
+                            <div>
+                                <label class="layui-form-label">是否在用:</label>
+                                <div class="layui-input-block">
+                                    <input type="checkbox" name="enable" lay-skin="switch" lay-text="是|否" checked=""
+                                           value="1">
+                                </div>
+                            </div>
+                        </div>
+                        <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
+                                style="display: none">保存
+                        </button>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="../../layuiadmin/layui/layui.js"></script>
+<script>
+    layui.config({
+        base: '../../../layuiadmin/' //静态资源所在路径
+    }).extend({
+        index: 'lib/index', //主入口模块
+        formSelects: 'formSelects-v4',
+    }).use(['index', 'form', 'laydate', 'formSelects',], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , form = layui.form
+            , laydate = layui.laydate
+            , formSelects = layui.formSelects;
+        laydate.render({
+            elem: '#id_start_date'
+        });
+        laydate.render({
+            elem: '#id_end_date'
+        });
+        var id = layui.view.getParameterByName('id');
+        if (id) {
+            var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+            form.val("component-form-element", editdata);
+        }
+        formSelects.config('categoryGroup', {
+            beforeSuccess: function (eid, url, searchVal, result) {
+                if (id) {
+                    var category = parent.layui.table.editdata.category_ids ?? [];
+                    for (var n in result.data) {
+                        var item = result.data[n];
+                        for (var c1 in category) {
+                            if (category[c1] == item.value.toString()) {
+                                item.selected = 'selected';
+                            }
+                        }
+                        var children1 = item.children
+                        for (var c in children1) {
+                            for (var c2 in category) {
+                                if (category[c2] == children1[c].value.toString()) {
+                                    children1[c].selected = 'selected';
+                                }
+                            }
+                            var children2 = children1[c].children
+                            for (var i in children2) {
+                                for (var c3 in category) {
+                                    if (category[c3] == children2[i].value.toString()) {
+                                        children2[i].selected = 'selected';
+                                    }
+                                }
+                            }
+
+                        }
+
+                    }
+                }
+                return result;
+            },
+        });
+        formSelects.data('categoryGroup', 'server', {
+            url: '/option/get_category_tree/'
+        });
+
+        formSelects.config('schoolGroup', {
+            beforeSuccess: function (eid, url, searchVal, result) {
+                if (id) {
+                    var school = parent.layui.table.editdata.school ?? [];
+                    for (var n in result.data) {
+                        var item = result.data[n];
+                        if (school.indexOf(item.value) > -1) {
+                            item.selected = 'selected';
+
+                            var children1 = item.children
+                            for (var c in children1) {
+                                if (school.indexOf(children1[c].value) > -1) {
+                                    children1[c].selected = 'selected';
+
+                                    var children2 = children1[c].children
+                                    for (var i in children2) {
+                                        if (school.indexOf(children2[i].value) > -1) {
+                                            children2[i].selected = 'selected';
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                return result;
+            },
+        });
+        formSelects.data('schoolGroup', 'server', {
+            url: '/option/get_school/'
+        });
+        if (id) {
+            var url = '/order/coupon/' + id + '/'
+            var type = 'put'
+        } else {
+            var url = '/order/coupon/'
+            var type = 'post'
+        }
+
+        form.on('submit(component-form-element)', function (data) {
+            admin.req({
+                url: url
+                , data: data.field
+                , type: type
+                , done: function (res) {
+                    parent.layui.onSubmitChild(res);
+                }
+            });
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 1 - 1
uis/views/order/index.html

@@ -126,7 +126,7 @@
             , totalRow: true
             , cols: [[
                 {field: 'no', title: '订单号', width: 215}
-                , {field: 'commodity_text', title: '商品', width: 150}
+                , {field: 'commodity_name', title: '商品', width: 150}
                 , {field: 'total_amount', title: '总金额',totalRow:true, width: 100}
                 , {field: 'coupon_deduction', title: '优惠券抵扣',totalRow:true, width: 100}
                 , {field: 'actual_amount', title: '实付金额',totalRow:true, width: 100}