Ver código fonte

二手车档案

lyh 1 ano atrás
pai
commit
46c724326d

+ 0 - 0
apps/images/__init__.py


+ 131 - 0
apps/images/models.py

@@ -0,0 +1,131 @@
+# coding=utf-8
+
+from PIL import Image
+
+from django.db import models
+from django.conf import settings
+from django.utils import timezone
+
+from utils.file_operation import UploadFile, DeleteFile, DownloadFace
+
+class ImagesManager(models.Manager):
+
+    def employee_addnew(self, user, type, file):
+        return self._addnew(user. employee.user, type, file)
+
+    def _addnew(self, user, type, file):
+        width = None
+        height = None
+
+        path = ImagesManager.calculatePath(type, user.id)
+        modify_size = ImagesManager.canModifySize(type)
+        filename = UploadFile(file, path)
+        fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
+
+        try:
+            img = Image.open(fullname)
+            width, height = img.size
+            # 缩略图压缩宽或高最大200
+            if modify_size and (width > 200 or height > 200):
+                if width > height:
+                    size = (200, int(height * 200 / width))
+                elif width < height:
+                    size = (int(width * 200 / height), 200)
+                else:
+                    size = (200, 200)
+                img = img.resize(size, Image.ANTIALIAS)
+                img.save(fullname)
+                width, height = img.size
+        except:
+            pass
+        instance = self.model(
+            user=user,
+            type=type,
+            name=file.name,
+            picture=filename,
+            width=width,
+            height=height,
+            create_time=timezone.now()
+        )
+        instance.save()
+        return instance
+
+    @staticmethod
+    def calculatePath(type, user_id):
+        path_map = {
+            Images.USEDVEHICLE_FILE: usedvehicle_file,
+            Images.USEDVEHICLE_THUMBNAIL: usedvehicle_thumbnail_file,
+
+        }
+
+        return path_map[type] + str(user_id) + '/'
+
+    @staticmethod
+    def canModifySize(type):
+        modify_size = False
+        can_modify_list = [
+            Images.USEDVEHICLE_THUMBNAIL
+        ]
+        if type in can_modify_list:
+            modify_size = True
+
+        return modify_size
+
+usedvehicle_file = "usedvehicle/detail/"
+usedvehicle_thumbnail_file = "usedvehicle/"
+
+class Images(models.Model):
+    USEDVEHICLE_FILE = 1
+    USEDVEHICLE_THUMBNAIL = 2
+    TYPE_CHOICES = (
+        (USEDVEHICLE_FILE, u'二手车图片'),
+        (USEDVEHICLE_THUMBNAIL, u'二手车缩略图'),
+    )
+
+    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'操作人', on_delete=models.PROTECT)
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
+    name = models.CharField(verbose_name=u'图片名', max_length=250)
+    picture = models.CharField(verbose_name=u'图片路径', max_length=250)
+    width = models.IntegerField(verbose_name=u"图片宽度")
+    height = models.IntegerField(verbose_name=u"图片高度")
+    create_time = models.DateTimeField(verbose_name=u'上传时间', default=timezone.now, editable=False)
+
+    objects = ImagesManager()
+
+    class Meta:
+        db_table = 'images'
+        verbose_name = u'图片'
+        ordering = ['-create_time']
+        index_together = (
+            'type',
+            'create_time',
+        )
+        default_permissions = ()
+
+    def del_images(self):
+        picture = self.picture
+        self.delete()
+        DeleteFile(picture)
+
+    def get_path(self):
+        return '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, self.picture)
+
+    # @staticmethod
+    # def downLoadFace(customer, url):
+    #     save_path = customer_face_file + str(customer.user.id) + '/'
+    #     filename = DownloadFace(url, save_path, 'jpg')
+    #     name = filename.split('/')[-1]
+    #     fullname = "%s/%s" % (settings.MEDIA_ROOT, filename)
+    #     width = None
+    #     height = None
+    #     try:
+    #         img = Image.open(fullname)
+    #         width, height = img.size
+    #     except:
+    #         pass
+    #     instance = Images.objects.create(
+    #         tenant=customer.tenant, user=customer.user, type=Images.CUSTOMER_FACE, name=name, picture=filename,
+    #         width=width, height=height, create_time=timezone.now()
+    #     )
+    #     instance.save()
+    #     return instance

+ 3 - 0
apps/usedvehicle/models.py

@@ -6,6 +6,7 @@ from django.db import models
 from django.utils import timezone
 from django.conf import settings
 from apps.foundation.models import Option
+from apps.images.models import Images
 
 class UsedVehicle(models.Model):
     STOCK = 0
@@ -26,6 +27,8 @@ class UsedVehicle(models.Model):
     emission = models.CharField(max_length=20, verbose_name=u"排放标准")
     address = models.CharField(max_length=50, verbose_name=u"车辆所在地", blank=True, null=True)
     seat_count = models.IntegerField(verbose_name=u"座位数")
+    thumbnail = models.ForeignKey(Images, verbose_name=u'缩略图', on_delete=models.PROTECT,
+                                  related_name=u'usedvehicle_thumbnail', null=True)
     plate_date = models.DateField(verbose_name=u"上牌日期", blank=True, null=True)
     factory_date = models.DateField(verbose_name=u"出厂日期", blank=True, null=True)
     oil_type = models.CharField(max_length=20, verbose_name=u"燃油类型")

+ 24 - 0
apps/usedvehicle/views.py

@@ -50,3 +50,27 @@ class UsedVehicleViewSet(CustomModelViewSet):
             order.status =  UsedVehicle.SALE
             order.save()
         return response_ok()
+
+    @action(methods=['post'], detail=True)
+    def update_model(self, request, pk):
+        instance = self.get_object()
+        user = request.user
+        thumbnail = request.FILES.get('image', None)
+
+        with transaction.atomic():
+            serializer = self.get_serializer(instance, data=request.data)
+            serializer.is_valid(raise_exception=True)
+            self.perform_update(serializer)
+
+            tenant_log(self.request.user, BizLog.UPDATE, u'修改二手车[%s],id=%d' % (instance.number, instance.id),
+                       request.data)
+
+            if thumbnail:
+                old_thumbnail = instance.thumbnail
+                thumbnail = Images.objects.employee_addnew(user, Images.USEDVEHICLE_THUMBNAIL, thumbnail)
+                instance.thumbnail = thumbnail
+                instance.save()
+                if old_thumbnail:
+                    old_thumbnail.del_images()
+
+        return response_ok()

+ 1 - 1
shop/settings.py

@@ -46,7 +46,7 @@ INSTALLED_APPS = [
     'apps.account',
     'apps.foundation',
     'apps.usedvehicle',
-    # 'apps.images',
+    'apps.images',
     # 'apps.shop',
     # 'apps.employee',
     # 'apps.option',

+ 87 - 15
uis/views/usedvehicle/edit.html

@@ -121,6 +121,13 @@
                     <input type="text" name="notes" 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">
+                      <button type="button" class="layui-btn-sm" id="test1">上传图片</button><br><br>
+                      <img class="layui-upload-img" id="demo1" style="max-width: 300px; max-height: 200px;">
+                  </div>
+                </div>
                 <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
               </div>
             </form>
@@ -136,10 +143,11 @@
   }).extend({
     index: 'lib/index',
     formSelects: 'formSelects-v4'
-  }).use(['index', 'form', 'utils', 'laydate'], function(){
+  }).use(['index', 'form', 'utils', 'upload', 'laydate'], function(){
     var $ = layui.$
     ,admin = layui.admin
     ,laydate = layui.laydate
+    ,upload = layui.upload
     ,form = layui.form;
     var id = layui.view.getParameterByName('id');
 
@@ -173,26 +181,90 @@
         if(id){
             var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
             form.val("component-form-element", editdata);
+            if(editdata.thumbnail_url){
+                $('#demo1').attr('src', editdata.thumbnail_url);
+            }
         }
     };
 
+     var form_data = {field:{}};
+    if (id){
+          var url = '/usedvehicle/usedvehicle/' +id + '/update_model/';
+      }else{
+          url =  '/usedvehicle/usedvehicle/';
+      }
+
+    upload.render({
+         elem: '#test1',
+         url: url,
+         auto: false,
+         field: 'image',
+         bindAction: '#upload_image',
+         choose: function(obj) {
+             obj.preview(
+                 function(index, file, result) {
+                     $('#demo1').attr('src', result);
+                 }
+             );
+         },
+         data:{
+             brand: function(){return form_data.field.brand;},
+             model: function(){return form_data.field.model;},
+             number: function(){return form_data.field.number;},
+             guide_price: function(){return form_data.field.guide_price},
+             sale_price: function(){return form_data.field.sale_price;},
+             gearbox: function(){return form_data.field.gearbox;},
+             color: function(){return form_data.field.color;},
+             displacement: function(){return form_data.field.displacement;},
+             emission: function(){return form_data.field.emission;},
+             address: function(){return form_data.field.address;},
+             seat_count: function(){return form_data.field.seat_count;},
+             plate_date: function(){return form_data.field.plate_date;},
+             factory_date: function(){return form_data.field.factory_date;},
+             address: function(){return form_data.field.address;},
+             sort: function(){return form_data.field.sort;},
+             enabled: function(){
+                 if (form_data.field.enabled){
+                     return form_data.field.enabled;
+                 }else{
+                     return '0';
+                 }
+             },
+             is_hot: function(){
+                 if (form_data.field.is_hot){
+                     return form_data.field.is_hot;
+                 }else{
+                     return '0';
+                 }
+             }
+             },
+        done: function (res) {
+            if (res.code != 0) {
+                layer.msg(res.msg);
+            }else {
+                parent.layui.onSubmitChild(res.data);
+            }
+        },
+        error: function () {
+            layer.msg('保存失败');
+        }
+    });
+
     form.on('submit(component-form-element)', function(data){
       //layer.msg(JSON.stringify(data.field));
-        if (id) {
-            var url = '/usedvehicle/usedvehicle/' + id + '/';
-            var type = 'put'
-        }else{
-            url = '/usedvehicle/usedvehicle/';
-            type = 'post'
+        if (data.field.image){
+            form_data = data;
+            $('#upload_image').click();
+        }else {
+            admin.req({
+              url: url
+              ,data: data.field
+              ,type: 'post'
+              ,done: function(res){
+                  parent.layui.onSubmitChild(res.data);
+              }
+            });
         }
-        admin.req({
-            url: url
-            ,data: data.field
-            ,type: type
-            ,done: function(res){
-                parent.layui.onSubmitChild(res.data);
-            }
-          });
 
       return false;
     });

+ 2 - 2
uis/views/usedvehicle/index.html

@@ -145,7 +145,7 @@
           type: 2,
           title: '修改',
           shadeClose: false,
-          area: ['40%', '450px'],
+          area: ['60%', '80%'],
           btn: ['保存', '取消'],
           yes: function (index, dom) {
             layui.onSubmitChild = function (data) {
@@ -194,7 +194,7 @@
           type: 2,
           title: '添加',
           shadeClose: false,
-          area: ['40%', '80%'],
+          area: ['60%', '80%'],
           btn: ['保存', '取消'],
           yes: function (index, dom) {
             layui.onSubmitChild = function (data) {

+ 113 - 0
uis/views/usedvehicle/upload.html

@@ -0,0 +1,113 @@
+<!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">
+</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">
+                    <form class="layui-form" action="" lay-filter="component-form-element">
+                        <div class="layui-upload">
+                          <button type="button" class="layui-btn" id="upload_image">上传图片</button>
+                          <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+                            已上传图片:
+                            <div class="layui-upload-list" id="show_image" style="display: flex;flex-wrap: wrap;"></div>
+                         </blockquote>
+                        </div>
+
+                        <button class="layui-btn" id="upload_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>
+   var main_id = null;
+  layui.link('../../../layuiadmin/style/autocomplete.css');
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    autocomplete: 'autocomplete'
+  }).use(['index','utils', 'form', 'element', 'upload'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,element = layui.element
+    ,form = layui.form
+    ,upload = layui.upload;
+
+    var id = layui.view.getParameterByName('id');
+    main_id = id;
+
+    form.render(null, 'component-form-element');
+    element.render('breadcrumb', 'breadcrumb');
+    refresh();
+
+    //多图片上传
+  upload.render({
+    elem: '#upload_image'
+    ,url:  '/tenant/vehicle/model/'+id+'/set_vehicle_img/'
+    ,field: 'images'
+    ,exts: 'jpg|png|jpeg|bmp'
+    ,acceptMime: '.jpg,.png,.jpeg,.bmp'
+    ,multiple: true
+    ,done: function (res) {
+        if (res.code != 0) {
+            layer.msg(res.msg);
+        }else {
+            refresh();
+        }
+    },
+    error: function () {
+        layer.msg('保存失败');
+    }
+  });
+    parent.layui.submitChild = function () {
+      $("#upload_save").click();
+    };
+  });
+
+  function refresh () {
+      var $ = layui.$;
+      layui.admin.req({
+        url: '/tenant/vehicle/images/?vehicle_model=' + main_id,
+        done: function (res) {
+           $('#show_image').html('');
+           var data = res.data;
+           for (var i in data){
+               var html = '<div style="margin-top: 10px;"><a href="'+data[i].img_url+'" target="_blank"><img src="'+ data[i].img_url +'" class="layui-upload-img" style="margin-left: 5px;min-width: 80px; height: 100px;max-width: 200px;"></a>' +
+                      '<div align="center" style="margin-top: 3px;" ><button type="button" class="layui-btn layui-btn-danger layui-btn-xs" onclick="delImage('+data[i].id+')">删除</button></div></div>';
+                $('#show_image').append(html)
+           }
+        }
+    });
+  }
+
+  function delImage(id) {
+
+      layui.admin.req({
+         url: '/tenant/vehicle/images/'+id + '/'
+         ,type: 'delete'
+         ,done: function(res){
+             refresh();
+         }
+      });
+  }
+
+  </script>
+</body>
+</html>