jiaweiqi 3 жил өмнө
parent
commit
feca82d929

+ 2 - 0
apps/customer/filters.py

@@ -6,6 +6,8 @@ from apps.customer.models import Customer
 
 
 class CustomerFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='user__name', lookup_expr='icontains')
+    tel = django_filters.CharFilter(field_name='user__tel', lookup_expr='icontains')
 
     class Meta:
         model = Customer

+ 11 - 1
apps/customer/serializers.py

@@ -1,6 +1,7 @@
 # coding=utf-8
 
 from django.contrib.auth import get_user_model
+from django.conf import settings
 
 from rest_framework import serializers
 from rest_framework_jwt.settings import api_settings
@@ -77,7 +78,16 @@ class StatementSerializer(serializers.ModelSerializer):
 
 
 class CustomerSerializer(serializers.ModelSerializer):
+    name = serializers.CharField(source='user.name', read_only=True)
+    tel = serializers.CharField(source='user.tel', read_only=True)
+    gender_txt = serializers.SerializerMethodField()
+    create_time = serializers.DateTimeField(source='user.date_joined', read_only=True)
 
     class Meta:
         model = Customer
-        fields = '__all__'
+        fields = ('name', 'tel', 'gender_txt', 'create_time', )
+
+    def get_gender_txt(self, obj):
+        if obj.user and obj.user.gender:
+            return settings.GENDER_CHOICES[obj.user.gender][1]
+        return u'未知'

+ 1 - 1
apps/customer/views.py

@@ -96,7 +96,7 @@ class SetUserInfoView(APIView):
 
 class CsutomerListViewSet(generics.ListAPIView):
     permission_classes = [IsAdministratorUser, ]
-    queryset = Customer.objects.filter()
+    queryset = Customer.objects.filter(user__isnull=False)
     serializer_class = CustomerSerializer
 
     def filter_queryset(self, queryset):

+ 3 - 0
apps/vehicle/filters.py

@@ -6,6 +6,9 @@ from apps.vehicle.models import Vehicle
 
 
 class VehicleFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
+    tel = django_filters.CharFilter(field_name='tel', lookup_expr='icontains')
+    number = django_filters.CharFilter(field_name='number', lookup_expr='icontains')
 
     class Meta:
         model = Vehicle

+ 0 - 172
uis/views/customer/edit.html

@@ -1,172 +0,0 @@
-<!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>
-        img{
-            width: 40%;
-            height: 30%;
-        }
-    </style>
-</head>
-<body>
-
-  <div class="layui-fluid">
-        <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>
-                  <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>
-                  <label class="layui-form-label"><font color='red' size="4">*</font>电话:</label>
-                  <div class="layui-input-block">
-                    <input type="text" name="tel" placeholder="请输入电话" lay-verify="required|tel" 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 id="id_gender" name="gender" lay-verify="required">
-                            <option value="2">先生</option>
-                            <option value="1">女士</option>
-                        </select>
-                      </div>
-                  </div>
-                   <div>
-                      <label class="layui-form-label">激活:</label>
-                      <div class="layui-input-block">
-                        <input type="checkbox" name="is_active" lay-skin="switch" lay-text="是|否" checked="" value="1">
-                      </div>
-                    </div>
-                <div>
-                  <label class="layui-form-label">头像:</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">
-                  </div>
-                </div>
-                <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
-                  <button class="layui-btn" type="button" id="upload_image" style="display: none"></button>
-              </div>
-            </form>
-          </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', 'utils', 'upload'], function(){
-    var $ = layui.$
-    ,admin = layui.admin
-    ,upload = layui.upload
-    ,form = layui.form;
-    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);
-        if(editdata.img_url){
-            $('#demo1').attr('src', editdata.img_url);
-        }
-    }
-
-    form.render(null, 'component-form-element');
-    form.val("component-form-element", {
-                'password':'1111'
-    });
-
-    var form_data = {field:{}};
-
-    if (id){
-          var url = '/tenant/customer/'+id + '/update_customer/';
-      }else{
-          url =  '/tenant/customer/';
-      }
-
-     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:{
-             name: function(){return form_data.field.name;},
-             gender: function(){return form_data.field.gender;},
-             tel: function(){return form_data.field.tel;},
-             is_active: function(){
-                 if (form_data.field.is_active){
-                     return form_data.field.is_active;
-                 }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(!('is_active' in data.field)){
-            data.field.is_active = 0;
-        }
-
-        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);
-                }
-              });
-        }
-
-      return false;
-    });
-
-    parent.layui.submitChild = function () {
-      $("#id_save").click();
-    };
-  });
-  </script>
-</body>
-</html>

+ 13 - 156
uis/views/customer/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>员管理</title>
+  <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">
@@ -28,43 +28,21 @@
           <div class="layui-col-md12">
             <div class="LAY-btns" style="margin-bottom: 10px;">
               <div class="layui-col-xs12">
-                  <div style="float: left">
-                      <button class="layui-btn" id="btn_download" data-permission="customer.export_customer"><i class="layui-icon layui-icon-download-circle"></i>导出</button>
-                  </div>
                     <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">
-                            <input type="text"  name="tel" autocomplete="off" class="layui-input" placeholder="客户电话"/>
+                            <input type="text"  name="tel" autocomplete="off" class="layui-input" placeholder="会员电话"/>
                         </div>
                         <div class="seach_items">
-                            <input type="text"  name="name" autocomplete="off" class="layui-input" placeholder="客户姓名"/>
-                        </div>
-                        <div class="seach_items">
-                            <div class="layui-inline">
-                              <div class="layui-input-inline">
-                                <input type="text" name="range_time" class="layui-input" id="range_time" placeholder="注册时间">
-                              </div>
-                            </div>
+                            <input type="text"  name="name" autocomplete="off" class="layui-input" placeholder="会员姓名"/>
                         </div>
                     </form>
                 </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="customer.edit_customer">修改</a>
-                    {{# if(!d.is_stop){ }}
-                    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="stop">停止佣金计提</a>
-                    {{# } }}
-                    {{# if(d.is_stop){ }}
-                    <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="recovery">恢复佣金计提</a>
-                    {{# } }}
-                </div>
-            </script>
           </div>
         </div>
         </div>
@@ -84,66 +62,23 @@
             ,table = layui.table
             ,laydate = layui.laydate
             ,form = layui.form;
+
     table.render({
       elem: '#datagrid'
-      ,url: '/tenant/customer/'
-      ,title: '客户信息'
-      ,id: 'datagrid'
+      ,url: '/customer/list/'
       ,cols: [[
-        {field:'name', title:'名称',width: 100}
-       ,{field:'tel', title:'电话',width: 150}
-       ,{field:'gender_text', title:'性别',width: 80}
-       ,{field:'date_join', title:'注册时间',width: 150}
-       ,{field:'commission_balance', align: 'right', title:'佣金余额',width: 100}
-       ,{field:'points', align:'right', title:'积分数', width:80}
-       ,{field:'recommend_count', align: 'right', title:'推荐数',width: 80}
-       ,{field:'success_count', align: 'right', title:'成交数',width: 80}
-       ,{field:'order_count', align: 'right', title:'订单数',width: 80}
-       ,{field:'collection_count', align: 'right', title:'收藏数',width: 80}
-        ,{width:150, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+        {field:'name', title:'姓名',width: 100}
+        ,{field:'tel', title:'电话',width: 150}
+        ,{field:'gender_txt', title:'性别',width: 80}
+       ,{field:'create_time', title:'注册时间',width: 200}
       ]]
-      ,totalRow:true
-      ,parseData:function(res) {
-        if(res.code === 1){
-            return;
-        }
-        var cols = this.cols[0];
-        for (var i in cols) {
-            if (cols[i].field === 'commission_balance') {
-                cols[i].totalRowText = res.data.footer.total_commission;
-            }
-            if (cols[i].field === 'recommend_count') {
-                cols[i].totalRowText = res.data.footer.total_recommend
-            }
-            if (cols[i].field === 'success_count') {
-                cols[i].totalRowText = res.data.footer.total_success
-            }
-            if (cols[i].field === 'order_count') {
-                cols[i].totalRowText = res.data.footer.total_order
-            }
-            if (cols[i].field === 'collection_count') {
-                cols[i].totalRowText = res.data.footer.total_collection
-            }
-            if (cols[i].field === 'points') {
-                cols[i].totalRowText = res.data.footer.total_points
-            }
-        }
-        return {
-          "code": res.code, //解析接口状态
-          "count": res.count, //解析数据长度
-          "data": res.data.data //解析数据列表
-        };
-      }
+      ,page: true
+      ,height: 'full-115'
       , done: function () {
-        layui.index.removeNoPermButtons()
+
       }
-      ,page: true
-      ,height: 'full-108'
-    });
-    laydate.render({
-        elem: '#range_time'
-        ,range:true
     });
+
     form.on('submit(query-form-element)', function(data){
       //layer.msg(JSON.stringify(data.field));
       table.reload('datagrid', {
@@ -154,84 +89,6 @@
       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: ['500px', '500px'],
-          btn: ['保存', '取消'],
-          yes: function (index, dom) {
-            layui.onSubmitChild = function (data) {
-                layer.close(index);
-                table.reload('datagrid', {});
-              };
-              layui.submitChild();
-          },
-          btn2: function(index, layero){
-            layer.close(index);//关闭当前按钮
-          },
-          content: 'edit.html?id='+data.id
-        });
-      }else if(obj.event === 'stop'){
-            // 暂停该账号的一些功能
-            if (data.is_stop){
-                layer.msg('该客户功能已被暂停,禁止重复操作!');
-                return;
-            }
-
-            layer.confirm('确定要暂停该客户功能吗?', function(index){
-                layer.close(index);
-                layui.admin.req({
-                    notice: true
-                    ,url: '/tenant/customer/'+data.id + '/stop/'
-                    ,data: {}
-                    ,type: 'post'
-                    ,done: function(res){
-                        table.reload('datagrid',{});
-                    }
-                });
-            });
-        }else if(obj.event === 'recovery'){
-            // 恢复该客户被暂停的功能
-            if (!data.is_stop){
-                layer.msg('该客户功能未被暂停,禁止操作!');
-                return;
-            }
-
-            layer.confirm('确定要恢复该客户功能吗?', function(index){
-                layer.close(index);
-                layui.admin.req({
-                    notice: true
-                    ,url: '/tenant/customer/'+data.id + '/recovery/'
-                    ,data: {}
-                    ,type: 'post'
-                    ,done: function(res){
-                        table.reload('datagrid',{});
-                    }
-                });
-            });
-        }
-    });
-    // 导出数据
-    $('#btn_download').on('click', function(){
-        $.get({
-            url: '/tenant/customer/export/',
-            dataType: 'json',
-            data: _params,
-            success: function (res) {
-                if(res.code === 1){
-                    layer.msg(res.msg);
-                    return;
-                }
-                table.exportFile('datagrid', res.data, 'xlsx')
-            }
-        })
-    });
   });
   </script>
 </body>

+ 11 - 6
uis/views/index.html

@@ -62,13 +62,18 @@
 
           <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-muen" lay-filter="layadmin-system-side-menu">
               <li data-name="set" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="营销作业" lay-direction="2">
+              <a href="javascript:;" lay-tips="设备管理" lay-direction="2">
                 <i class="layui-icon layui-icon-set"></i>
-                <cite>营销作业</cite>
+                <cite>设备管理</cite>
               </a>
               <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="coupon.browse_coupon_item">
-                  <a lay-href="coupon_write_off/index.html">优惠券核销</a>
+                <dd data-name="nav">
+                  <a lay-href="vehicle/index.html">设备管理</a>
+                </dd>
+              </dl>
+                  <dl class="layui-nav-child">
+                <dd data-name="nav">
+                  <a lay-href="customer/index.html">会员管理</a>
                 </dd>
               </dl>
             </li>
@@ -78,12 +83,12 @@
                 <cite>系统设置</cite>
               </a>
               <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="employee.browse_employee">
+                <dd data-name="nav">
                   <a lay-href="employee/index.html">员工管理</a>
                 </dd>
               </dl>
                 <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="employee.browse_employee">
+                <dd data-name="nav">
                   <a lay-href="wechat/index.html">小程序设置</a>
                 </dd>
               </dl>

+ 100 - 0
uis/views/vehicle/index.html

@@ -0,0 +1,100 @@
+<!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">
+    .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: 30px;}
+    .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;}
+    .seach_items {float:right;margin-left: 10px;}
+  </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 class="layui-col-xs12">
+                    <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">
+                            <input type="text"  name="number" autocomplete="off" class="layui-input" placeholder="车牌号"/>
+                        </div>
+                        <div class="seach_items">
+                            <input type="text"  name="tel" autocomplete="off" class="layui-input" placeholder="电话"/>
+                        </div>
+                        <div class="seach_items">
+                            <input type="text"  name="name" autocomplete="off" class="layui-input" placeholder="姓名"/>
+                        </div>
+                    </form>
+                </div>
+                <div style="clear: both;"></div>
+            </div>
+            <table class="layui-hide" id="datagrid" lay-filter="datagrid-operate"></table>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>
+
+  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+  <script>
+  var _params = '';
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index' //主入口模块
+     ,formSelects: 'formSelects-v4'
+  }).use(['index', 'table', 'form', 'formSelects', 'upload', 'laydate'], function(){
+    var $ = layui.$
+            ,table = layui.table
+            ,laydate = layui.laydate
+            ,form = layui.form;
+
+    table.render({
+      elem: '#datagrid'
+      ,url: '/vehicle/list/'
+      ,cols: [[
+        {field:'name', title:'姓名',width: 100}
+        ,{field:'tel', title:'电话',width: 150}
+        ,{field:'number', title:'车牌号',width: 100}
+       ,{field:'model', title:'车型',width: 200}
+       ,{field:'create_time', title:'绑定时间',width: 200}
+      ]]
+      ,page: true
+      ,height: 'full-115'
+      , done: function () {
+
+      }
+    });
+
+    form.on('submit(query-form-element)', function(data){
+      //layer.msg(JSON.stringify(data.field));
+      table.reload('datagrid', {
+          where: data.field
+          ,page:{curr:1}
+      });
+      _params = data.field;
+      layer.closeAll();
+      return false;
+    });
+  });
+  </script>
+</body>
+</html>
+