浏览代码

自定义项

wushaodong 4 年之前
父节点
当前提交
397fdbec02

+ 2 - 1
apps/account/serializers.py

@@ -30,11 +30,12 @@ class JWTSerializer(JSONWebTokenSerializer):
                 payload = jwt_payload_handler(user)
                 BizLog.objects.addnew(user, BizLog.INSERT,
                                       u'[%s]登录系统,IP[%s]' % (user.username,get_remote_addr(self.request)))
-
+                permissions = list(user.get_all_permissions())
                 return {
                     'token': jwt_encode_handler(payload),
                     'user_id': user.id,
                     'username': user.username,
+                    'permissions': permissions,
                 }
             else:
                 msg = u'账号或者密码错误!'

+ 10 - 0
apps/option/filters.py

@@ -0,0 +1,10 @@
+import django_filters
+from .models import Option
+
+class OptionFilter(django_filters.FilterSet):
+    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
+    type = django_filters.CharFilter(field_name='type')
+
+    class Meta:
+        model = Option
+        fields = '__all__'

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


+ 47 - 0
apps/option/models.py

@@ -0,0 +1,47 @@
+from django.db import models
+from django.db.models import Q
+from django.conf import settings
+
+class Option(models.Model):
+    CUSTOMER_SOURCE =1
+    CATEGORY = 2
+    POTENTIAL_LEVEL = 3
+    STAGE_PROGRESS = 4
+    TYPE_CHOICES = (
+        (CUSTOMER_SOURCE, u'客户来源'),
+        (CATEGORY, u'项目类别'),
+        (POTENTIAL_LEVEL, u'潜客级别'),
+        (STAGE_PROGRESS, u'阶段进度'),
+    )
+
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类别")
+    name = models.CharField(verbose_name=u'名称', max_length=100)
+    sort = models.PositiveSmallIntegerField(verbose_name=u'排序', help_text=u'越小越靠前', default=1)
+    notes = models.CharField(max_length=500, verbose_name=u"备注",null=True)
+    enable = models.BooleanField(verbose_name=u"在用", default=True)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", on_delete=models.PROTECT,
+                                    editable=False)
+    track_day = models.IntegerField(verbose_name=u"跟踪天数", null=True)
+    end_stage = models.BooleanField(verbose_name=u"是否最终阶段", default=False)
+
+    class Meta:
+        db_table = 'system_option'
+        verbose_name = u"系统选项"
+        ordering = ['type', 'sort', ]
+        index_together = (
+            'type',
+            'name',
+        )
+        default_permissions = ()
+        permissions = [
+            ('browse_option', u'查看'),
+            ('add_option', u'添加'),
+            ('delete_option', u'删除'),
+        ]
+
+    @staticmethod
+    def is_exist(type, name, exclude_id=None):
+        rows = Option.objects.filter(type=type, name=name)
+        if exclude_id:
+            rows = rows.filter(~Q(id=exclude_id))
+        return rows.count()

+ 42 - 0
apps/option/serializers.py

@@ -0,0 +1,42 @@
+# coding=utf-8
+
+from rest_framework import serializers
+from .models import Option
+
+from utils.exceptions import CustomError
+
+class OptionSerializer(serializers.ModelSerializer):
+    type_name = serializers.CharField(source='get_type_display', read_only=True)
+    enable_text = serializers.SerializerMethodField()
+    end_stage = serializers.SerializerMethodField()
+
+    def get_enable_text(self,obj):
+        if obj.enable:
+            return '是'
+        return '否'
+
+    def get_end_stage(self,obj):
+        if obj.end_stage:
+            return '是'
+        return '否'
+
+    class Meta:
+        model = Option
+        fields = '__all__'
+
+    def create(self, validated_data):
+        validated_data['create_user'] = self.context['request'].user
+        is_exist = Option.is_exist(validated_data['type'], validated_data['name'])
+        if is_exist:
+            raise CustomError(u'自定义项[%s]已存在!' % validated_data['name'])
+        instance = super(OptionSerializer,self).create(validated_data)
+        return instance
+
+    def update(self, instance, validated_data):
+        if instance.delete:
+            raise CustomError(u'自定义项[%s]已经被删除,禁止操作' % instance.name)
+        is_exist = Option.is_exist(validated_data['type'], validated_data['name'], instance.id)
+        if is_exist:
+            raise CustomError(u'自定义项[%s]已存在!' % validated_data['name'])
+        instance = super(OptionSerializer, self).update(instance, validated_data)
+        return instance

+ 12 - 0
apps/option/urls.py

@@ -0,0 +1,12 @@
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+    url(r'dict/$', DictView.as_view()),
+]
+
+router = SimpleRouter()
+router.register(r'', OptionViewSet)
+urlpatterns += router.urls

+ 38 - 0
apps/option/views.py

@@ -0,0 +1,38 @@
+from utils.custom_modelviewset import CustomModelViewSet
+from utils.permission import IsTenantUser, IsAdministratorUser
+from rest_framework.views import APIView
+from .models import Option
+from .serializers import OptionSerializer
+from .filters import OptionFilter
+from apps.log.models import BizLog
+from utils import response_ok
+
+class DictView(APIView):
+    def get(self, request):
+        ret = {
+            'types':Option.TYPE_CHOICES,
+        }
+        return response_ok(ret)
+
+class OptionViewSet(CustomModelViewSet):
+    queryset = Option.objects.filter()
+    serializer_class = OptionSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter()
+        f = OptionFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def perform_create(self, serializer):
+        super(OptionViewSet,self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(self.request.user, BizLog.INSERT,
+                              u'添加自定义项[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    def perform_update(self, serializer):
+        super(OptionViewSet,self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(self.request.user, BizLog.UPDATE,
+                              u'修改自定义项[%s],id=%d' % (instance.name, instance.id), validated_data)

+ 1 - 0
decorate/settings.py

@@ -48,6 +48,7 @@ INSTALLED_APPS = [
     'apps.api',
     'apps.upload',
     'apps.agent',
+    'apps.option',
 
 ]
 

+ 1 - 0
decorate/urls.py

@@ -25,6 +25,7 @@ urlpatterns = [
     url(r'^$', index),
     url(r'^account/', include('apps.account.urls')),
     url(r'^api/', include('apps.api.urls')),
+    url(r'^option/', include('apps.option.urls')),
 ]
 
 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

+ 4 - 0
uis/views/account/login.html

@@ -99,6 +99,10 @@
             key: 'name'
             ,value: res.data.username
           });
+          layui.data(setter.tableName, {
+            key: 'permissions'
+            ,value: res.data.permissions
+          });
 
           //登入成功的提示与跳转
           layer.msg('登入成功', {

+ 0 - 603
uis/views/dashboard/home.html

@@ -15,139 +15,7 @@
 
   <div class="layui-fluid">
     <div class="layui-row layui-col-space15">
-      <div class="layui-col-md12">
-        <div class="layui-row layui-col-space15">
-          <div class="layui-col-md8">
-            <div class="layui-card">
-              <div class="layui-card-header">快捷方式</div>
-              <div class="layui-card-body">
 
-                <div class="layui-carousel layadmin-carousel layadmin-shortcut">
-                  <div carousel-item>
-                    <ul class="layui-row layui-col-space10">
-                      <li class="layui-col-md3">
-                        <a lay-href="order/edit.html">
-                          <i class="layui-icon layui-icon-util"></i>
-                          <cite>维修开单</cite>
-                        </a>
-                      </li>
-                      <li class="layui-col-md3">
-                        <a lay-href="order/edit_wash.html">
-                          <i class="layui-icon layui-icon-water"></i>
-                          <cite>洗车开单</cite>
-                        </a>
-                      </li>
-                      <li class="layui-col-md3">
-                        <a lay-href="order/order.html">
-                          <i class="layui-icon layui-icon-form"></i>
-                          <cite>工单管理</cite>
-                        </a>
-                      </li>
-                      <li class="layui-col-md3">
-                        <a lay-href="member/member.html">
-                          <i class="layui-icon layui-icon-user"></i>
-                          <cite>会员管理</cite>
-                        </a>
-                      </li>
-                    </ul>
-
-                  </div>
-                </div>
-
-              </div>
-            </div>
-          </div>
-          <div class="layui-col-md4">
-            <div class="layui-card">
-              <div class="layui-card-header">特别提醒</div>
-              <div class="layui-card-body">
-
-                <div class="layui-carousel layadmin-carousel layadmin-backlog">
-                  <div carousel-item>
-                    <ul >
-                      <li class="layui-col-xs4">
-                        <a href="javascript:;" class="layadmin-backlog-body">
-                          <h3.8>本月接车</h3.8>
-                            <br>
-                          <p><cite id="order_count"></cite></p>
-                        </a>
-                      </li>
-                      <li class="layui-col-xs4">
-                        <a href="javascript:;" class="layadmin-backlog-body">
-                          <h3.8>电子档案</h3.8>
-                            <br>
-                          <p><cite id="dzda_count"></cite></p>
-                        </a>
-                      </li>
-                        <li class="layui-col-xs4">
-                        <a href="javascript:;" class="layadmin-backlog-body">
-                          <h3.8>保险提醒</h3.8>
-                            <br>
-                          <p><cite id="insurance_count">4</cite></p>
-                        </a>
-                      </li>
-                        <li class="layui-col-xs4">
-                        <a href="javascript:;" class="layadmin-backlog-body">
-                          <h3.8>定保提醒</h3.8>
-                            <br>
-                          <p><cite id="routine_remind_count">2</cite></p>
-                        </a>
-                      </li>
-
-                      <li class="layui-col-xs4">
-                        <a href="javascript:;" class="layadmin-backlog-body">
-                          <h3.8>年检提醒</h3.8>
-                            <br>
-                          <p><cite id="vehicle_inspection_count">3</cite></p>
-                        </a>
-                      </li>
-                    </ul>
-                  </div>
-                </div>
-              </div>
-            </div>
-          </div>
-
-          <div class="layui-col-md8">
-            <div class="layui-card">
-              <div class="layui-card-header">数据概览(最近12个月)</div>
-              <div class="layui-card-body">
-                <div id="chart1" style="height:360px;">
-
-                </div>
-                <div id="chart2" style="height:360px;">
-
-                </div>
-                <div id="chart3" style="height:360px;">
-
-                </div>
-
-                <div id="chart4" style="height:360px;">
-
-                </div>
-
-              </div>
-            </div>
-          </div>
-          <div class="layui-col-md4">
-          <div class="layui-card" id="Notice">
-              <div class="layui-card-header">公告</div>
-              <table class="layui-hide" id="datagrid" lay-filter="datagrid"></table>
-          </div>
-        </div>
-          <div class="layui-col-md4">
-              <div class="layui-card">
-                  <div class="layui-card-header">手机版</div>
-                  <div class="layui-card-body" style="text-align: center">
-                    <img src="http://soft.zzliaoyuan.com/repairwin_qrcode.png" style="width: 200px; height:200px">
-                    <p>扫描二维码下载安装手机版</p>
-                  </div>
-          </div>
-        </div>
-      </div>
-
-
-    </div>
   </div>
 
   <script src="../../layuiadmin/layui/layui.js?t=1"></script>
@@ -159,478 +27,7 @@
     index: 'lib/index', //主入口模块
   }).use(['index', 'home','echarts', 'table'], function() {
       var $ = layui.$;
-      var admin = layui.admin
-          ,echarts = layui.echarts;
-      var mouth =[]
-      var table = layui.table;
-      var user_id = layui.data(layui.setter.tableName)['USER-ID'];
-
-      table.render({
-      elem: '#datagrid'
-      ,url: '/office/notice/unexpired/data/'
-      ,cols: [[
-        {field:'id',align:'left', width:'9%', templet: function(d){
-            var isRead = false;
-
-            for (var a=0;a<d.browses_user.length;a++){
-               if (d.browses_user[a]['browse_user'] == user_id){
-                   isRead = true;
-                   break;
-               }
-           }
-            if (isRead) {
-                return '<span id="P_'+ d.id +'"><i class="layui-icon layui-icon-ok-circle"></i></span>';
-            } else {
-                return '<span id="P_'+ d.id +'"><i class="layui-icon layui-icon-log"></i></span>';
-            }
-
-        }}
-        ,{field:'title',align:'left', title:'标题', width:'63%'}
-        ,{field:'create_time',align:'left', title:'发布时间', width:'28%'}
-      ]]
-      ,height: '300px'
-      ,done: function (res) {
-        $('th').hide(); // 去掉表头
-        $('td').css({'border': '0px'});
-        layui.index.removeNoPermButtons();
-      }
-    });
-
-
-      admin.req({
-          url: '/order/order/count/'
-          , done: function (res) {
-              $('#order_count').html(res.data.order_count);
-              $('#dzda_count').html(res.data.dzda_count);
-              $('#insurance_count').html(res.data.insurance_count);
-              $('#routine_remind_count').html(res.data.routine_remind_count);
-              $('#vehicle_inspection_count').html(res.data.vehicle_inspection_count);
-          }
-      });
-      admin.req({
-          url:'/order/order/report/?maint_order=1&wash_order=1&deliver_part=1&member=1'
-          , done: function (res) {
-             var mouth=res.data.order_mouth
-             var order_amount=res.data.order_amount
-             var order_count=res.data.order_count
-             var washorder_amount=res.data.washorder_amount
-             var washorder_count=res.data.washorder_count
-             var deliver_count=res.data.deliver_count
-             var deliver_amount=res.data.deliver_amount
-             var member_count=res.data.member_count
-             var member_amount=res.data.member_amount
-             var chart1 = echarts.init($('#chart1')[0]);
-             var chart2 = echarts.init($('#chart2')[0]);
-             var chart3 = echarts.init($('#chart3')[0]);
-             var chart4 = echarts.init($('#chart4')[0]);
-
-              var option1 = {
-                    title: {
-                        text: '工单统计'
-                    },
-                    tooltip: {
-                        trigger: 'axis',
-                        axisPointer: {
-                            type: 'cross',
-                            crossStyle: {
-                                color: '#999'
-                            }
-                        }
-                    },
-                    toolbox: {
-                        feature: {
-                            dataView: {show: true, readOnly: false},
-                            magicType: {show: true, type: ['line', 'bar']},
-                            restore: {show: true},
-                            saveAsImage: {show: true}
-                        }
-                    },
-                    legend: {
-                        data:['金额','台次']
-                    },
-                    xAxis: [
-                        {
-                            type: 'category',
-                            data: mouth,
-                            axisPointer: {
-                                type: 'shadow'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688', // 颜色
-                                }
-                            }
-                        }
-                    ],
-                    yAxis: [
-                        {
-                            type: 'value',
-                            name: '金额',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} 元'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688', // 颜色
-                                }
-                            }
-                        },
-                        {
-                            type: 'value',
-                            name: '台次',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} '
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688', // 颜色
-                                }
-                            }
-                        }
-                    ],
-                    series: [
-                        {
-                            name:'金额',
-                            type:'bar',
-                            itemStyle: {
-                                normal: {
-                                    color: "#FFB800",
-                                    lineStyle: {
-                                        color: "#FFB800"
-                                    }
-                                }
-                            },
-                            data:order_amount,
-                        },
-                        {
-                            name:'台次',
-                            type:'line',
-                            yAxisIndex: 1,
-                            itemStyle: {
-                                normal: {
-                                    color: "#1E9FFF",
-                                    lineStyle: {
-                                        color: "#1E9FFF"
-                                    }
-                                }
-                            },
-                            data:order_count
-                        }
-                    ]
-                };
-              var option2 = {
-                    title: {
-                        text: '洗车统计'
-                    },
-                    tooltip: {
-                        trigger: 'axis',
-                        axisPointer: {
-                            type: 'cross',
-                            crossStyle: {
-                                color: '#999'
-                            }
-                        }
-                    },
-                    toolbox: {
-                        feature: {
-                            dataView: {show: true, readOnly: false},
-                            magicType: {show: true, type: ['line', 'bar']},
-                            restore: {show: true},
-                            saveAsImage: {show: true}
-                        }
-                    },
-                    legend: {
-                        data:['金额','台次']
-                    },
-                    xAxis: [
-                        {
-                            type: 'category',
-                            data: mouth,
-                            axisPointer: {
-                                type: 'shadow'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        }
-                    ],
-                    yAxis: [
-                        {
-                            type: 'value',
-                            name: '台次',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} 元'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        },
-                        {
-                            type: 'value',
-                            name: '台次',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} '
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        }
-                    ],
-                    series: [
-                        {
-                            name:'金额',
-                            type:'bar',
-                            itemStyle: {
-                                normal: {
-                                    color: "#FFB800",
-                                    lineStyle: {
-                                        color: "#FFB800"
-                                    }
-                                }
-                            },
-                            data:washorder_amount,
-                        },
-                        {
-                            name:'台次',
-                            type:'line',
-                            yAxisIndex: 1,
-                            itemStyle: {
-                                normal: {
-                                    color: "#1E9FFF",
-                                    lineStyle: {
-                                        color: "#1E9FFF"
-                                    }
-                                }
-                            },
-                            data:washorder_count
-                        }
-                    ]
-                };
-              var option3 = {
-                    title: {
-                        text: '出库统计'
-                    },
-                    tooltip: {
-                        trigger: 'axis',
-                        axisPointer: {
-                            type: 'cross',
-                            crossStyle: {
-                                color: '#999'
-                            }
-                        }
-                    },
-                    toolbox: {
-                        feature: {
-                            dataView: {show: true, readOnly: false},
-                            magicType: {show: true, type: ['line', 'bar']},
-                            restore: {show: true},
-                            saveAsImage: {show: true}
-                        }
-                    },
-                    legend: {
-                        data:['金额','数量']
-                    },
-                    xAxis: [
-                        {
-                            type: 'category',
-                            data: mouth,
-                            axisPointer: {
-                                type: 'shadow'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        }
-                    ],
-                    yAxis: [
-                        {
-                            type: 'value',
-                            name: '金额',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} 元'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        },
-                        {
-                            type: 'value',
-                            name: '数量',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} '
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        }
-                    ],
-                    series: [
-                        {
-                            name:'金额',
-                            type:'bar',
-                            itemStyle: {
-                                normal: {
-                                    color: "#FFB800",
-                                    lineStyle: {
-                                        color: "#FFB800"
-                                    }
-                                }
-                            },
-                            data:deliver_amount,
-                        },
-                        {
-                            name:'数量',
-                            type:'line',
-                            yAxisIndex: 1,
-                            itemStyle: {
-                                normal: {
-                                    color: "#1E9FFF",
-                                    lineStyle: {
-                                        color: "#1E9FFF"
-                                    }
-                                }
-                            },
-                            data:deliver_count
-                        }
-                    ]
-              };
-              var option4 = {
-                    title: {
-                        text: '会员统计'
-                    },
-                    tooltip: {
-                        trigger: 'axis',
-                        axisPointer: {
-                            type: 'cross',
-                            crossStyle: {
-                                color: '#999'
-                            }
-                        }
-                    },
-                    toolbox: {
-                        feature: {
-                            dataView: {show: true, readOnly: false},
-                            magicType: {show: true, type: ['line', 'bar']},
-                            restore: {show: true},
-                            saveAsImage: {show: true}
-                        }
-                    },
-                    legend: {
-                        data:['金额','数量']
-                    },
-                    xAxis: [
-                        {
-                            type: 'category',
-                            data: mouth,
-                            axisPointer: {
-                                type: 'shadow'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        }
-                    ],
-                    yAxis: [
-                        {
-                            type: 'value',
-                            name: '金额',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} 元'
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        },
-                        {
-                            type: 'value',
-                            name: '数量',
-                            min: 0,
-                            axisLabel: {
-                                formatter: '{value} '
-                            },
-                            axisLine: {
-                                lineStyle: {
-                                    color: '#009688',
-                                }
-                            }
-                        }
-                    ],
-                    series: [
-                        {
-                            name:'销售金额',
-                            type:'bar',
-                            itemStyle: {
-                                normal: {
-                                    color: "#FFB800",
-                                    lineStyle: {
-                                        color: "#FFB800"
-                                    }
-                                }
-                            },
-                            data:member_amount,
-                        },
-                        {
-                            name:'销售数量',
-                            type:'line',
-                            yAxisIndex: 1,
-                            itemStyle: {
-                                normal: {
-                                    color: "#1E9FFF",
-                                    lineStyle: {
-                                        color: "#1E9FFF"
-                                    }
-                                }
-                            },
-                            data:member_count
-                        }
-                    ]
-              };
-              chart1.setOption(option1);
-              chart2.setOption(option2);
-              chart3.setOption(option3);
-              chart4.setOption(option4);
-          }
-
-
-      });
-      table.on('row(datagrid)', function (obj) {
-          var data = obj.data;
-          table.editdata = data;
-          layui.onSubmitChild = function (data) {
-            table.reload('datagrid',{});
-            };
 
-          layer.open({
-          type: 2,
-          title: '查看['+ data.title + ']',
-          shadeClose: true,
-          area: ['80%', '80%'],
-          content: '/views/notice/notice_detail.html?id='+data.id
-        });
-      });
 
     });
 

+ 21 - 37
uis/views/index.html

@@ -54,44 +54,28 @@
       </div>
 
       <!-- 侧边菜单 -->
-      <div class="layui-side layui-side-menu">
-        <div class="layui-side-scroll">
-          <div class="layui-logo">
-            <span>装集客<span style="font-size: 12px;">管理系统</span></span>
-          </div>
-
-          <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">
-                <i class="layui-icon layui-icon-set"></i>
-                <cite>系统设置</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd data-name="button" data-permission="foundation.manage_branch">
-                  <a lay-href="branch/branch.html">代理商管理</a>
-                </dd>
-                <dd data-name="button" data-permission="foundation.manage_branch">
-                  <a lay-href="branch/branch.html">门店管理</a>
-                </dd>
-                <dd data-name="button" data-permission="foundation.manage_user">
-                  <a lay-href="account/employee.html">人员管理</a>
-                </dd>
-                <dd data-name="button" data-permission="foundation.manage_group">
-                  <a lay-href="account/group.html">权限管理</a>
-                </dd>
-                <dd data-name="nav" data-permission="foundation.manage_option">
-                  <a lay-href="foundation/option.html">自定义项</a>
-                </dd>
-                  <!--
-                <dd data-name="nav" data-permission="foundation.manage_option">
-                  <a lay-href="foundation/config.html">综合设置</a>
-                </dd>
-
-              </dl>
-            </li>
-          </ul>
+        <div class="layui-side layui-side-menu">
+            <div class="layui-side-scroll">
+                <div class="layui-logo">
+                    <span>装集客管理系统</span>
+                </div>
+
+                <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">
+                            <i class="layui-icon layui-icon-set"></i>
+                            <cite>基础数据</cite>
+                        </a>
+                        <dl class="layui-nav-child">
+                            <dd data-name="nav" data-user_type="1">
+                                <a lay-href="option/index.html">自定义项</a>
+                            </dd>
+                        </dl>
+                    </li>
+                </ul>
+            </div>
         </div>
-      </div>
 
       <!-- 页面标签 -->
       <div class="layadmin-pagetabs" id="LAY_app_tabs">

+ 134 - 0
uis/views/option/edit.html

@@ -0,0 +1,134 @@
+<!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">
+                                    <select id="id_type" lay-verify="required" name="type" style="width: 40px;">
+                                    </select>
+                                </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="name" lay-verify="required" placeholder="请输入名称"
+                                           autocomplete="off" class="layui-input">
+                                </div>
+                            </div>
+
+                            <div class="layui-col-lg6">
+                                <label class="layui-form-label">排序:</label>
+                                <div class="layui-input-block">
+                                    <input type="text" name="sort" placeholder="请输入排序" autocomplete="off"
+                                           class="layui-input">
+                                </div>
+                            </div>
+                            <div class="layui-col-lg6">
+                                <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 class="layui-col-lg6">
+                                <label class="layui-form-label">备注:</label>
+                                <div class="layui-input-block">
+                                    <input type="text" name="notes" placeholder="请输入备注" autocomplete="off"
+                                           class="layui-input">
+                                </div>
+                            </div>
+                        </div>
+                        <button class="layui-btn" id="id_option_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', 'utils'], function () {
+        var $ = layui.$
+            , admin = layui.admin
+            , form = layui.form
+
+        var id = layui.view.getParameterByName('id');
+        admin.req({
+            url: '/option/dict/',
+            done: function (res) {
+                var types = res.data.types;
+                var type_node = $('#id_type');
+                for (var i in types) {
+                    var pid = types[i][0];
+                    var value = types[i][1];
+                    type_node.append("<option value='" + pid + "'>" + value + "</option>");
+                }
+                form.render();
+                loadData();
+            }
+        });
+
+        var loadData = function () {
+            if (id) {
+                var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
+                form.val("component-form-element", editdata);
+            }
+        };
+
+        form.on('submit(component-form-element)', function (data) {
+            //layer.msg(JSON.stringify(data.field));
+            if (id) {
+                var url = '/option/' + id + '/';
+                var type = 'put'
+            } else {
+                url = '/option/';
+                type = 'post'
+            }
+            admin.req({
+                url: url
+                , data: data.field
+                , type: type
+                , done: function (res) {
+                    parent.layui.onSubmitChild(res.data);
+                }
+            });
+
+            return false;
+        });
+
+        parent.layui.submitChild = function () {
+            $("#id_option_save").click();
+        };
+    });
+</script>
+</body>
+</html>

+ 192 - 0
uis/views/option/index.html

@@ -0,0 +1,192 @@
+<!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 {
+            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="float:right;">
+                            <form class="layui-form" lay-filter="query-form-element">
+                                <div class="seach_items">
+                                    <input type="text" name="name" autocomplete="off" class="layui-input"
+                                           placeholder="名称"/>
+                                </div>
+                                <div class="seach_items">
+                                    <select name="type" style="width: 40px;">
+                                        <option value="">请选择分类</option>
+                                        <option value="1">客户来源</option>
+                                        <option value="2">项目类别</option>
+                                        <option value="3">潜客级别</option>
+                                        <option value="4">阶段进度</option>
+                                    </select>
+                                </div>
+                                <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>
+                            </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">修改</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', 'upload'], function () {
+        var $ = layui.$
+            , table = layui.table
+            , form = layui.form
+        var data = [{'username': 1001, 'date_joined': 2020}, {'username': 1002, 'date_joined': 2022},]
+        table.render({
+            elem: '#datagrid'
+            , url: '/option/'
+            , cols: [[
+                {field: 'name', title: '名称', width: 250}
+                , {field: 'type_name', title: '分类', width: 100}
+                , {field: 'sort', title: '排序', width: 100, sort: true}
+                , {field: 'enable_text', title: '是否在用', width: 100}
+                , {field: 'track_day', title: '跟踪天数', width: 100}
+                , {field: 'end_stage', title: '是否最终阶段', width: 120}
+                , {field: 'notes', title: '备注', width: 300}
+                , {width: 140, 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%', '70%'],
+                    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
+                });
+            }
+        });
+
+        $('#btn_add').on('click', function () {
+            layer.open({
+                type: 2,
+                title: '添加',
+                shadeClose: false,
+                area: ['50%', '70%'],
+                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'
+            });
+        });
+    });
+</script>
+</body>
+</html>
+