wushaodong 3 роки тому
батько
коміт
ed5c7b5bcb

+ 3 - 0
apps/commodity/models.py

@@ -4,6 +4,7 @@ from django.db import models
 from django.conf import settings
 from utils.exceptions import CustomError
 from apps.upload.models import Upload
+from apps.option.models import CommodityLevel
 from django.core.cache import cache
 from django.db.models.signals import post_save
 
@@ -18,6 +19,8 @@ class Commodity(models.Model):
     total_sales = models.IntegerField(verbose_name='总销量', null=True, editable=False, default=0)
     status = models.PositiveSmallIntegerField(choices=settings.SALES_STATUS_CHOICES, verbose_name=u"状态",
                                               default=settings.ONLINE)
+    category = models.ForeignKey(CommodityLevel, verbose_name='分类', on_delete=models.PROTECT, null=True,
+                                   related_name='main_category')
     main_image = models.ForeignKey(Upload, verbose_name='主图', on_delete=models.SET_NULL, null=True,
                                    related_name='main_image')
     list_image = models.ForeignKey(Upload, verbose_name='列表图片', on_delete=models.SET_NULL, null=True,

+ 11 - 0
apps/commodity/serializers.py

@@ -12,12 +12,23 @@ class CommoditySerializer(serializers.ModelSerializer):
     create_time_f = serializers.DateTimeField(source='create_time', format=settings.SHORT_DATETIME_FORMAT,
                                               read_only=True)
     create_user_text = serializers.CharField(source='create_user.name', read_only=True)
+    category_text = serializers.SerializerMethodField()
     main_image_url = serializers.CharField(source='main_image.picture', read_only=True)
     list_image_url = serializers.CharField(source='list_image.picture', read_only=True)
     detail_image = serializers.SerializerMethodField()
     price = PriceShowCharField()
     status_text = serializers.CharField(source='get_status_display', read_only=True)
 
+    def get_category_text(self, obj):
+        name = ''
+        if obj.category:
+            name = obj.category.name
+            if obj.category.category:
+                name = '{} — {}'.format(obj.category.category.name, name)
+                if obj.category.category.category:
+                    name = '{} — {}'.format(obj.category.category.category.name, name)
+        return name
+
     def get_detail_image(self, obj):
         count = CommodityImages.objects.filter(product=obj, type=CommodityImages.DETAILS).count()
         return count

+ 4 - 4
apps/option/views.py

@@ -123,12 +123,12 @@ class SchoolTreeView(APIView):
         return response_ok(source_data)
 
 class CategoryTreeView(APIView):
-    # permission_classes = [isLogin, ]
+    permission_classes = [isLogin, ]
 
     # @cache_response()
     def get(self, request):
         area_data = []
-        provinces = CommodityLevel.objects.filter(level=CommodityLevel.ONE, category_id__isnull=True).values('id', 'name')
+        provinces = CommodityLevel.objects.filter(level=CommodityLevel.ONE, category_id__isnull=True, enable=True).values('id', 'name')
         for province in provinces:
             province_item = {
                 'name': province['name'],
@@ -136,7 +136,7 @@ class CategoryTreeView(APIView):
                 'field': 'level',
                 'children': [],
             }
-            citys = CommodityLevel.objects.filter(level=CommodityLevel.TWO, category_id=province['id']).values('id', 'name')
+            citys = CommodityLevel.objects.filter(level=CommodityLevel.TWO, category_id=province['id'], enable=True).values('id', 'name')
             for city in citys:
                 city_item = {
                     'name': city['name'],
@@ -145,7 +145,7 @@ class CategoryTreeView(APIView):
                     'children': [],
                 }
                 province_item['children'].append(city_item)
-                countys = CommodityLevel.objects.filter(level=CommodityLevel.THREE, category_id=city['id']).values('id', 'name')
+                countys = CommodityLevel.objects.filter(level=CommodityLevel.THREE, category_id=city['id'], enable=True).values('id', 'name')
                 for county in countys:
                     county_item = {
                         'name': county['name'],

+ 55 - 3
uis/views/commodity/edit.html

@@ -20,7 +20,12 @@
 
                 <div class="layui-card-body">
                     <form class="layui-form" action="" lay-filter="component-form-element">
-
+                        <div class="layui-form-item">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>分类:</label>
+                            <div class="layui-input-block">
+                                <select name="category" xm-select="categoryGroup" lay-verify="required"></select>
+                            </div>
+                        </div>
                         <div class="layui-form-item">
                             <label class="layui-form-label"><font color='red' size="4">*</font>名称:</label>
                             <div class="layui-input-block">
@@ -99,10 +104,11 @@
     }).extend({
         index: 'lib/index',
         formSelects: 'formSelects-v4',
-    }).use(['index', 'form', 'utils', 'laydate',], function () {
+    }).use(['index', 'form', 'formSelects', 'laydate',], function () {
         var $ = layui.$
             , admin = layui.admin
             , laydate = layui.laydate
+            , formSelects = layui.formSelects
             , form = layui.form;
         laydate.render({
             elem: '#id_begin_date'
@@ -118,11 +124,57 @@
             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 ?? 0;
+                    for (var n in result.data) {
+                        var item = result.data[n];
+                        if (parseInt(category) == parseInt(item.value)) {
+                            item.selected = 'selected';
+                            break
+                        } else {
+                            var children1 = item.children
+                            for (var c in children1) {
+                                if (parseInt(category) == parseInt(children1[c].value)) {
+                                    children1[c].selected = 'selected';
+                                    break
+                                } else {
+                                    var children2 = children1[c].children
+                                    for (var i in children2) {
+                                        if (parseInt(category) == parseInt(children2[i].value)) {
+                                            children2[i].selected = 'selected';
+                                            break
+                                        }
+                                    }
+                                }
+                                break
+                            }
+                            break
+                        }
+                    }
+                }
+                return result;
+            },
+        });
+
+        formSelects.render('categoryGroup', {
+            max: 1,
+            quickBtns: [],
+            maxTips: function () {
+                layer.msg("只能选择一个分类", {icon: 2});
+            }
+        });
+        formSelects.btns('categoryGroup', []);
+        formSelects.data('categoryGroup', 'server', {
+            url: '/option/get_category_tree/'
+        });
+
         var url = id ? '/commodity/' + id + '/' : '/commodity/',
             method = id ? 'put' : 'post';
 
         form.on('submit(component-form-element)', function (data) {
-            if(!data.field.status){
+            if (!data.field.status) {
                 data.field.status = '0'
             }
             admin.req({

+ 1 - 0
uis/views/commodity/index.html

@@ -137,6 +137,7 @@
             , cols: [[
                 {field: 'name', title: '商品名称', width: 150}
                 , {field: 'introduce', title: '简介', width: 200}
+                , {field: 'category_text', title: '分类', width: 200}
                 , {field: 'price', title: '销售价', width: 100}
                 , {field: 'discount', title: '折扣', width: 100}
                 , {field: 'stock', title: '库存', width: 100}