Commit 209f94dbe83d85bea252603c8989aef9a4222e0b

Authored by zhangximing
1 parent 06b8783a

下拉多选

@@ -909,8 +909,6 @@ class Seller extends Common @@ -909,8 +909,6 @@ class Seller extends Common
909 $data['sdtime'] = $dtime ? strtotime(date($dtime[0],time())) : ''; 909 $data['sdtime'] = $dtime ? strtotime(date($dtime[0],time())) : '';
910 $data['edtime'] = $dtime ? strtotime(date($dtime[1],time())) : ''; 910 $data['edtime'] = $dtime ? strtotime(date($dtime[1],time())) : '';
911 911
912 - //$parame = '&offset='.$data["page"].'&limit='.$data["limit"].'&sellername='.@$sellername.'&stime='.@$stime.'&etime='.@$etime.'&channel='.@$data['channel'].'&id='.$id.'&status='.@$data['status'].'&sdtime='.$sdtime.'&edtime='.$edtime;  
913 -  
914 //////////////////////////////// 912 ////////////////////////////////
915 $arr = array(); 913 $arr = array();
916 $where = ''; 914 $where = '';
@@ -965,9 +963,9 @@ class Seller extends Common @@ -965,9 +963,9 @@ class Seller extends Common
965 $where .= $data['status']==2 ? ' AND r.cdate <= UNIX_TIMESTAMP(date_add(NOW(), interval -5 minute)) AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime'] : ' AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime']; 963 $where .= $data['status']==2 ? ' AND r.cdate <= UNIX_TIMESTAMP(date_add(NOW(), interval -5 minute)) AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime'] : ' AND r.cdate BETWEEN '.$data['stime'].' AND '.$data['etime'];
966 } 964 }
967 965
968 - $data['channel'] = $data['channel'] ? $data['channel'] : 1;  
969 - $where .= $data['channel'] == -1 ? '' : ' AND re.type_id = '.$data['channel']; 966 + $data['channel'] = $data['channel'] ? implode(',',$data['channel']) : 1;
970 967
  968 + $where .= $data['channel'] == -1 ? '' : ' AND re.type_id in ('.$data['channel'].')';
971 #key 969 #key
972 $where .= $data['key'] ? ' AND s.sellername like "%'.$data['key'].'%"' : ''; //商家名称 970 $where .= $data['key'] ? ' AND s.sellername like "%'.$data['key'].'%"' : ''; //商家名称
973 #ID 971 #ID
@@ -33,6 +33,7 @@ @@ -33,6 +33,7 @@
33 </select> 33 </select>
34 </div> 34 </div>
35 </div> 35 </div>
  36 + <!--
36 商家来源: 37 商家来源:
37 <div class="layui-input-inline layui-form"> 38 <div class="layui-input-inline layui-form">
38 <div class="layui-input-8"> 39 <div class="layui-input-8">
@@ -43,7 +44,13 @@ @@ -43,7 +44,13 @@
43 <option value="3">测试</option> 44 <option value="3">测试</option>
44 </select> 45 </select>
45 </div> 46 </div>
  47 + </div>-->
  48 + 商家来源:<div class="layui-input-inline layui-form">
  49 + <div class="layui-input-8">
  50 + <span class="" id="channel"></span>
  51 + </div>
46 </div> 52 </div>
  53 +
47 订单类型: 54 订单类型:
48 <div class="layui-input-inline layui-form"> 55 <div class="layui-input-inline layui-form">
49 <div class="layui-input-8"> 56 <div class="layui-input-8">
@@ -54,6 +61,7 @@ @@ -54,6 +61,7 @@
54 </select> 61 </select>
55 </div> 62 </div>
56 </div> 63 </div>
  64 +
57 <button class="layui-btn" id="search" data-type="reload">查询统计</button> 65 <button class="layui-btn" id="search" data-type="reload">查询统计</button>
58 </div> 66 </div>
59 <br> 67 <br>
@@ -121,6 +129,61 @@ @@ -121,6 +129,61 @@
121 ,limit:15 129 ,limit:15
122 }); 130 });
123 131
  132 + /************** 下拉框多选 ****************/
  133 + var tagData = [{"id":1,"name":"合作"},{"id":2,"name":"推广"},{"id":3,"name":"测试"}];
  134 + layui.config({
  135 + base : '../'
  136 + }).extend({
  137 + //selectN: '../static/plugins/layui/layui_extends/selectN',
  138 + selectM: '../static/plugins/layui/layui_extends/selectM',
  139 + }).use(['selectM'],function(){
  140 + $ = layui.jquery;
  141 + var form = layui.form
  142 + ,selectN = layui.selectN
  143 + ,selectM = layui.selectM
  144 +
  145 + //多选标签-基本配置
  146 + var tagIns1 = selectM({
  147 + //元素容器【必填】
  148 + elem: '#channel'
  149 + //候选数据【必填】
  150 + ,data: tagData
  151 + //最大可选
  152 + ,max:3
  153 + //宽度
  154 + ,width:240
  155 + //默认值
  156 + ,selected: [1]
  157 + //添加验证
  158 + ,verify:'required'
  159 + });
  160 +
  161 + //搜索
  162 + $('#search').on('click', function() {
  163 + //ID
  164 + var nokey = $('#nokey').val();
  165 + //关键字
  166 + var key = $('#key').val();
  167 +
  168 + var time = $('#time').val();
  169 + console.log(time);
  170 +
  171 + var dtime = $('#dtime').val();
  172 + //商家来源
  173 + var channel = tagIns1.values;
  174 + console.log(channel);
  175 + //筛选条件:订单状态
  176 + var status = $('#status').val();
  177 + console.log(status);
  178 + //筛选条件:订单类型
  179 + var order = $('#order').val();
  180 + //传参
  181 + tableIn.reload({ page: {page: 1},where: {nokey: nokey,key: key,status: status,time: time,dtime:dtime,channel: channel,order: order}});
  182 + });
  183 + });
  184 + /************** 下拉框多选 ****************/
  185 +
  186 +
124 //监听行双击事件 187 //监听行双击事件
125 table.on('rowDouble(list)', function(obj){ 188 table.on('rowDouble(list)', function(obj){
126 //table.on('row(list)', function(obj){ 双击事件 189 //table.on('row(list)', function(obj){ 双击事件
@@ -155,30 +218,6 @@ @@ -155,30 +218,6 @@
155 ,range: true 218 ,range: true
156 }); 219 });
157 220
158 - //搜索  
159 - $('#search').on('click', function() {  
160 - //ID  
161 - var nokey = $('#nokey').val();  
162 - //关键字  
163 - var key = $('#key').val();  
164 -  
165 - var time = $('#time').val();  
166 - console.log(time);  
167 -  
168 - var dtime = $('#dtime').val();  
169 -  
170 - //商家来源  
171 - var channel = $('#channel').val();  
172 - console.log(channel);  
173 - //筛选条件:订单状态  
174 - var status = $('#status').val();  
175 - console.log(status);  
176 - //筛选条件:订单类型  
177 - var order = $('#order').val();  
178 - //传参  
179 - tableIn.reload({ page: {page: 1},where: {nokey: nokey,key: key,status: status,time: time,dtime:dtime,channel: channel,order: order}});  
180 - });  
181 -  
182 var $ = layui.$, active = { 221 var $ = layui.$, active = {
183 reload: function(){ 222 reload: function(){
184 var nokey = $('#nokey'); 223 var nokey = $('#nokey');
  1 +/*
  2 +* @version: 2.0
  3 +* @Author: tomato
  4 +* @Date: 2018-5-5 11:29:57
  5 +* @Last Modified by: tomato
  6 +* @Last Modified time: 2018-5-26 18:08:43
  7 +*/
  8 +//多选下拉框
  9 +layui.define(['jquery', 'layer'], function(exports){
  10 + var MOD_NAME = 'selectM';
  11 + var $ = layui.jquery,layer=layui.layer;
  12 + var obj = function(config){
  13 + this.disabledIndex =[];
  14 + //当前选中的值名数据
  15 + this.selected = [];
  16 + //当前选中的值
  17 + this.values =[];
  18 + //当前选中的名称
  19 + this.names =[];
  20 +
  21 + //初始化设置参数
  22 + this.config = {
  23 + //选择器id或class
  24 + elem: '',
  25 + //候选项数据[{id:"1",name:"名称1",status:0},{id:"2",name:"名称2",status:1}]
  26 + data: [],
  27 +
  28 + //默认选中值
  29 + selected: [],
  30 +
  31 + //空值项提示,支持将{max}替换为max
  32 + tips: '请选择 最多 {max} 个',
  33 +
  34 + //最多选中个数,默认5
  35 + max : 5,
  36 +
  37 + //选择框宽度
  38 + width:null,
  39 +
  40 + //值验证,与lay-verify一致
  41 + verify: '',
  42 +
  43 + //input的name 不设置与选择器相同(去#.)
  44 + name: '',
  45 +
  46 + //值的分隔符
  47 + delimiter: ',',
  48 +
  49 + //候选项数据的键名 status=0为禁用状态
  50 + field: {idName:'id',titleName:'name',statusName:'status'}
  51 + }
  52 +
  53 + this.config = $.extend(this.config,config);
  54 + //创建选项元素
  55 + this.createOption = function(){
  56 + var o=this,c=o.config,f=c.field,d = c.data;
  57 + var s = c.selected;
  58 + $E = $(c.elem);
  59 + var tips = c.tips.replace('{max}',c.max);
  60 + var inputName = c.name=='' ? c.elem.replace('#','').replace('.','') : c.name;
  61 + var verify = c.verify=='' ? '' : 'lay-verify="'+c.verify+'" ';
  62 + var html = '';
  63 + html += '<div class="layui-unselect layui-form-select">';
  64 + html += '<div class="layui-select-title">';
  65 + html += '<input '+verify+'name="'+inputName+'" type="text" readonly="" class="layui-input layui-unselect">';
  66 + html += '</div>';
  67 + html += '<div class="layui-input multiple">';
  68 + html += '</div>';
  69 + html += '<dl class="layui-anim layui-anim-upbit">';
  70 + html += '<dd lay-value="" class="layui-select-tips">'+tips+'</dd>';
  71 + for(var i=0;i<d.length;i++){
  72 + var disabled1='',disabled2='';
  73 + if(d[i][f.statusName]==0){
  74 + o.disabledIndex[d[i][f.idName]] = d[i][f.titleName];
  75 + disabled1 = d[i][f.statusName]==0 ? 'layui-disabled' : '';
  76 + disabled2 = d[i][f.statusName]==0 ? ' layui-checkbox-disbaled layui-disabled' : '';
  77 + }
  78 + html +='<dd lay-value="'+d[i][f.idName]+'" class="'+disabled1+'">';
  79 + html += '<div class="layui-unselect layui-form-checkbox'+disabled2+'" lay-skin="primary">';
  80 + html += '<span>'+d[i][f.titleName]+'</span><i class="layui-icon">&#xe605;</i>';
  81 + html += '</div>';
  82 + html +='</dd>';
  83 + }
  84 + html += '</dl>';
  85 + html += '</div>';
  86 + $E.html(html);
  87 + }
  88 +
  89 + //设置选中值
  90 + this.set = function(selected){
  91 + var o=this,c=o.config;
  92 + var s = typeof selected=='undefined' ? c.selected : selected;
  93 + $E = $(c.elem);
  94 + $E.find('.layui-form-checkbox').removeClass('layui-form-checked');
  95 + $E.find('dd').removeClass('layui-this');
  96 + //为默认选中值添加类名
  97 + var max = s.length>c.max ? c.max : s.length;
  98 + for(var i=0;i<max;i++){
  99 + if(s[i] && !o.disabledIndex.hasOwnProperty(s[i])){
  100 + $E.find('dd[lay-value='+s[i]+']').addClass('layui-this');
  101 + }
  102 + }
  103 + $E.find('dd.layui-this').each(function(){
  104 + $(this).find('div').addClass('layui-form-checked');
  105 + });
  106 + o.setSelected(selected);
  107 + }
  108 +
  109 + //设置选中值 每次点击操作后执行
  110 + this.setSelected = function(first){
  111 + var o=this,c=o.config,f=c.field;
  112 + $E = $(c.elem);
  113 + var values=[],names=[],selected = [],spans = [];
  114 + var items = $E.find('dd.layui-this');
  115 + if(items.length==0){
  116 + var tips = c.tips.replace('{max}',c.max);
  117 + spans.push('<span class="tips">'+tips+'</span>');
  118 + }
  119 + else{
  120 + items.each(function(){
  121 + $this = $(this);
  122 + var item ={};
  123 + var v = $this.attr('lay-value');
  124 + var n = $this.find('span').text();
  125 + item[f.idName] = v;
  126 + item[f.titleName] = n;
  127 + values.push(v);
  128 + names.push(n);
  129 + spans.push('<a href="javascript:;"><span lay-value="'+v+'">'+n+'</span><i class="layui-icon">&#x1006;</i></a>');
  130 + selected.push(item);
  131 + });
  132 + }
  133 + spans.push('<i class="layui-edge" style="pointer-events: none;"></i>');
  134 + $E.find('.multiple').html(spans.join(''));
  135 + $E.find('.layui-select-title').find('input').each(function(){
  136 + if(typeof first=='undefined'){
  137 + this.defaultValue = values.join(c.delimiter);
  138 + }
  139 + this.value = values.join(c.delimiter);
  140 + });
  141 +
  142 + var h = $E.find('.multiple').height()+14;
  143 + $E.find('.layui-form-select dl').css('top',h+'px');
  144 + o.values=values,o.names=names,o.selected = selected;
  145 + }
  146 + //ajax方式获取候选数据
  147 + this.getData = function(url){
  148 + var d;
  149 + $.ajax({
  150 + url:url,
  151 + dataType:'json',
  152 + async:false,
  153 + success:function(json){
  154 + d=json;
  155 + },
  156 + error: function(){
  157 + console.error(MOD_NAME+' hint:候选数据ajax请求错误 ');
  158 + d = false;
  159 + }
  160 + });
  161 + return d;
  162 + }
  163 + };
  164 + //渲染一个实例
  165 + obj.prototype.render = function(){
  166 + var o=this,c=o.config,f=c.field;
  167 + $E = $(c.elem);
  168 + if($E.length==0){
  169 + console.error(MOD_NAME+' hint:找不到容器 ' +c.elem);
  170 + return false;
  171 + }
  172 + if(Object.prototype.toString.call(c.data)!='[object Array]'){
  173 + var data = o.getData(c.data);
  174 + if(data===false){
  175 + console.error(MOD_NAME+' hint:缺少分类数据');
  176 + return false;
  177 + }
  178 + o.config.data = data;
  179 + }
  180 +
  181 + //给容器添加一个类名
  182 + $E.addClass('lay-ext-mulitsel');
  183 + if(/^\d+$/.test(c.width)){
  184 + $E.css('width',c.width+'px');
  185 + }
  186 + //添加专属的style
  187 + if($('#lay-ext-mulitsel-style').length==0){
  188 + var style = '.lay-ext-mulitsel .layui-form-select dl dd div{margin-top:0px!important;}.lay-ext-mulitsel .layui-form-select dl dd.layui-this{background-color:#fff}.lay-ext-mulitsel .layui-input.multiple{line-height:auto;height:auto;padding:4px 10px 4px 10px;overflow:hidden;min-height:38px;margin-top:-38px;left:0;z-index:99;position:relative;background:#fff;}.lay-ext-mulitsel .layui-input.multiple a{padding:2px 5px;background:#5FB878;border-radius:2px;color:#fff;display:block;line-height:20px;height:20px;margin:2px 5px 2px 0;float:left;}.lay-ext-mulitsel .layui-input.multiple a i{margin-left:4px;font-size:14px;} .lay-ext-mulitsel .layui-input.multiple a i:hover{background-color:#009E94;border-radius:2px;}.lay-ext-mulitsel .danger{border-color:#FF5722!important}.lay-ext-mulitsel .tips{pointer-events: none;position: absolute;left: 10px;top: 10px;color:#757575;}';
  189 + $('<style id="lay-ext-mulitsel-style"></style>').text(style).appendTo($('head'));
  190 + };
  191 +
  192 + //创建选项
  193 + o.createOption();
  194 + //设置选中值
  195 + o.set();
  196 +
  197 + //展开/收起选项
  198 + $E.on('click','.layui-select-title,.multiple,.multiple.layui-edge',function(e){
  199 + //隐藏其他实例显示的弹层
  200 + $('.lay-ext-mulitsel').not(c.elem).removeClass('layui-form-selected');
  201 + if($(c.elem).is('.layui-form-selected')){
  202 + $(c.elem).removeClass('layui-form-selected');
  203 +
  204 + $(document).off('click',mEvent);
  205 + }
  206 + else{
  207 + $(c.elem).addClass('layui-form-selected');
  208 +
  209 + $(document).on('click',mEvent=function(e){
  210 + if(e.target.id!==c.elem && e.target.className!=='layui-input multiple'){
  211 + $(c.elem).removeClass('layui-form-selected');
  212 + $(document).off('click',mEvent);
  213 + }
  214 + });
  215 + }
  216 + });
  217 +
  218 + //点击选项
  219 + $E.on('click','dd',function(e){
  220 + var _dd = $(this);
  221 + if(_dd.hasClass('layui-disabled')){
  222 + return false;
  223 + }
  224 + //点 请选择
  225 + if(_dd.is('.layui-select-tips')){
  226 + _dd.siblings().removeClass('layui-this');
  227 + $(c.elem).find('.layui-form-checkbox').removeClass('layui-form-checked');
  228 + }
  229 + //取消选中
  230 + else if(_dd.is('.layui-this')){
  231 + _dd.removeClass('layui-this');
  232 + _dd.find('.layui-form-checkbox').removeClass('layui-form-checked');
  233 + e.stopPropagation();
  234 + }
  235 + //选中
  236 + else{
  237 + if(o.selected.length >= c.max){
  238 + $(c.elem+' .multiple').addClass('danger');
  239 + layer.tips('最多只能选择 '+c.max+' 个', c.elem+' .multiple', {
  240 + tips: 3,
  241 + time: 1000,
  242 + end:function(){
  243 + $(c.elem+' .multiple').removeClass('danger');
  244 + }
  245 + });
  246 + return false;
  247 + }
  248 + else{
  249 + _dd.addClass('layui-this');
  250 + _dd.find('.layui-form-checkbox').addClass('layui-form-checked');
  251 + e.stopPropagation();
  252 + }
  253 + }
  254 +
  255 + o.setSelected();
  256 + });
  257 +
  258 + //删除选项
  259 + $E.on('click','a i',function(e){
  260 + var _this = $(this).prev('span');
  261 + var v = _this.attr('lay-value');
  262 + if(v){
  263 + var _dd = $(c.elem).find('dd[lay-value='+v+']');
  264 + _dd.removeClass('layui-this');
  265 + _dd.find('.layui-form-checkbox').removeClass('layui-form-checked');
  266 + }
  267 + o.setSelected();
  268 + _this.parent().remove();
  269 + e.stopPropagation();
  270 +
  271 + });
  272 +
  273 + //验证失败样式
  274 + $E.find('input').focus(function(){
  275 + $(c.elem+' .multiple').addClass('danger');
  276 + setTimeout(function(){
  277 + $(c.elem+' .multiple').removeClass('danger');
  278 + },3000);
  279 + });
  280 + }
  281 +
  282 + //输出模块
  283 + exports(MOD_NAME, function (config) {
  284 + var _this = new obj(config);
  285 + _this.render();
  286 + return _this;
  287 + });
  288 +});
  1 +/*
  2 +* @version: 1.2
  3 +* @Author: tomato
  4 +* @Date: 2018-4-24 22:56:00
  5 +* @Last Modified by: tomato
  6 +* @Last Modified time: 2018-5-26 18:08:43
  7 +*/
  8 +//无限级下拉框
  9 +layui.define(['jquery', 'form'], function(exports){
  10 + var MOD_NAME = 'selectN';
  11 + var $ = layui.jquery;
  12 + var form = layui.form;
  13 + var obj = function(config){
  14 + //当前选中数据值名数据
  15 + this.selected =[];
  16 + //当前选中的值
  17 + this.values = [];
  18 + //当前选中的名
  19 + this.names = [];
  20 + //当前选中最后一个值
  21 + this.lastValue = '';
  22 + //当前选中最后一个值
  23 + this.lastName = '';
  24 + //是否已选
  25 + this.isSelected = false;
  26 + //初始化配置
  27 + this.config = {
  28 + //选择器id或class
  29 + elem: '',
  30 + //无限级分类数据
  31 + data: [],
  32 + //默认选中值
  33 + selected: [],
  34 + //空值项提示,可设置为数组['请选择省','请选择市','请选择县']
  35 + tips: '请选择',
  36 + //是否允许搜索,可设置为数组[true,true,true]
  37 + search:false,
  38 + //选择项宽度,可设置为数组['80','90','100']
  39 + width:null,
  40 + //为真只取最后一个值
  41 + last: false,
  42 + //值验证,与lay-verify一致
  43 + verify: '',
  44 + //事件过滤器,lay-filter名
  45 + filter: '',
  46 + //input的name 不设置与选择器相同(去#.)
  47 + name: '',
  48 + //数据分隔符
  49 + delimiter: ',',
  50 + //数据的键名 status=0为禁用状态
  51 + field:{idName:'id',titleName:'name',statusName:'status',childName:'children'},
  52 + //多表单区分 form.render(type, filter); 为class="layui-form" 所在元素的 lay-filter="" 的值
  53 + formFilter: null
  54 + }
  55 +
  56 + //实例化配置
  57 + this.config = $.extend(this.config,config);
  58 +
  59 + //“请选择”文字
  60 + this.setTips = function(){
  61 + var o = this,c = o.config;
  62 + if(Object.prototype.toString.call(c.tips)!='[object Array]'){
  63 + return c.tips;
  64 + }
  65 + else{
  66 + var i=$(c.elem).find('select').length;
  67 + return c.tips.hasOwnProperty(i) ? c.tips[i] : '请选择';
  68 + }
  69 + }
  70 +
  71 + //设置是否允许搜索
  72 + this.setSearch = function(){
  73 + var o = this,c = o.config;
  74 + if(Object.prototype.toString.call(c.search)!='[object Array]'){
  75 + return c.search===true ? 'lay-search ' : ' ';
  76 + }
  77 + else{
  78 + var i=$(c.elem).find('select').length;
  79 + if(c.search.hasOwnProperty(i)){
  80 + return c.search[i]===true ? 'lay-search ' : ' ';
  81 + }
  82 + }
  83 + return ' ';
  84 + }
  85 +
  86 + //设置是否允许搜索
  87 + this.setWidth = function(){
  88 + var o = this,c = o.config;
  89 + if(Object.prototype.toString.call(c.width)!='[object Array]'){
  90 + return /^\d+$/.test(c.width) ? 'style="width:'+c.width+'px;" ' : ' ';
  91 + }
  92 + else{
  93 + var i=$(c.elem).find('select').length;
  94 + if(c.width.hasOwnProperty(i)){
  95 + return /^\d+$/.test(c.width[i]) ? 'style="width:'+c.width[i]+'px;" ' : ' ';
  96 + }
  97 + }
  98 + }
  99 +
  100 + //创建一个Select
  101 + this.createSelect = function(optionData){
  102 + var o = this,c = o.config,f=c.field;
  103 + var html = '';
  104 + html+= '<div class="layui-input-inline" '+o.setWidth()+'>';
  105 + html+= ' <select '+o.setSearch()+'lay-filter="'+c.filter+'">';
  106 + html+= ' <option value="">'+o.setTips()+'</option>';
  107 + for(var i=0;i<optionData.length;i++){
  108 + var disabled = optionData[i][f.statusName]==0 ? 'disabled="" ' : '';
  109 + html+= ' <option '+disabled+'value="'+optionData[i][f.idName]+'">'+optionData[i][f.titleName]+'</option>';
  110 + }
  111 + html+= ' </select>';
  112 + html+= '</div>';
  113 + return html;
  114 + };
  115 +
  116 + //获取当前option的数据
  117 + this.getOptionData=function(catData,optionIndex){
  118 + var f = this.config.field;
  119 + var item = catData;
  120 + for(var i=0;i<optionIndex.length;i++){
  121 + if('undefined' == typeof item[optionIndex[i]]){
  122 + item = null;
  123 + break;
  124 + }
  125 + else if('undefined' == typeof item[optionIndex[i]][f.childName]){
  126 + item = null;
  127 + break;
  128 + }
  129 + else{
  130 + item = item[optionIndex[i]][f.childName];
  131 + }
  132 + }
  133 + return item;
  134 + };
  135 +
  136 + //初始化
  137 + this.set = function(selected){
  138 + var o = this,c = o.config;
  139 + $E = $(c.elem);
  140 + //创建顶级select
  141 + var verify = c.verify=='' ? '' : 'lay-verify="'+c.verify+'" ';
  142 + var html = '<div style="height:0px;width:0px;overflow:hidden"><input '+verify+'name="'+c.name+'"></div>';
  143 + html += o.createSelect(c.data);
  144 + $E.html(html);
  145 + selected = typeof selected=='undefined' ? c.selected : selected;
  146 + var index=[];
  147 + for(var i=0;i<selected.length;i++){
  148 + //设置最后一个select的选中值
  149 + $E.find('select:last').val(selected[i]);
  150 + //获取该选中值的索引
  151 + var lastIndex = $E.find('select:last').get(0).selectedIndex-1;
  152 + index.push(lastIndex);
  153 + //取出下级的选项值
  154 + var childItem = o.getOptionData(c.data,index);
  155 + //下级选项值存在则创建select
  156 + if(childItem){
  157 + var html = o.createSelect(childItem);
  158 + $E.append(html);
  159 + }
  160 + }
  161 + form.render('select',c.formFilter);
  162 + o.getSelected();
  163 + };
  164 +
  165 + //下拉事件
  166 + this.change = function(elem){
  167 + var o = this,c = o.config;
  168 + var $thisItem = elem.parent();
  169 + //移除后面的select
  170 + $thisItem.nextAll('div.layui-input-inline').remove();
  171 + var index=[];
  172 + //获取所有select,取出选中项的值和索引
  173 + $thisItem.parent().find('select').each(function(){
  174 + index.push($(this).get(0).selectedIndex-1);
  175 + });
  176 +
  177 + var childItem = o.getOptionData(c.data,index);
  178 + if(childItem){
  179 + var html = o.createSelect(childItem);
  180 + $thisItem.after(html);
  181 + form.render('select',c.formFilter);
  182 + }
  183 + o.getSelected();
  184 + };
  185 +
  186 + //获取所有值-数组 每次选择后执行
  187 + this.getSelected=function(){
  188 + var o = this,c = o.config;
  189 + var values =[];
  190 + var names =[];
  191 + var selected =[];
  192 + $E = $(c.elem);
  193 + $E.find('select').each(function(){
  194 + var item = {};
  195 + var v = $(this).val()
  196 + var n = $(this).find('option:selected').text();
  197 + item.value = v;
  198 + item.name = n;
  199 + values.push(v);
  200 + names.push(n);
  201 + selected.push(item);
  202 + });
  203 + o.selected =selected;
  204 + o.values = values;
  205 + o.names = names;
  206 + o.lastValue = $E.find('select:last').val();
  207 + o.lastName = $E.find('option:selected:last').text();
  208 +
  209 + o.isSelected = o.lastValue=='' ? false : true;
  210 + var inputVal = c.last===true ? o.lastValue : o.values.join(c.delimiter);
  211 + $E.find('input[name='+c.name+']').val(inputVal);
  212 + };
  213 + //ajax方式获取候选数据
  214 + this.getData = function(url){
  215 + var d;
  216 + $.ajax({
  217 + url:url,
  218 + dataType:'json',
  219 + async:false,
  220 + success:function(json){
  221 + d=json;
  222 + },
  223 + error: function(){
  224 + console.error(MOD_NAME+' hint:候选数据ajax请求错误 ');
  225 + d = false;
  226 + }
  227 + });
  228 + return d;
  229 + }
  230 +
  231 +
  232 + };
  233 +
  234 + //渲染一个实例
  235 + obj.prototype.render = function(){
  236 + var o=this,c=o.config;
  237 + $E = $(c.elem);
  238 + if($E.length==0){
  239 + console.error(MOD_NAME+' hint:找不到容器 '+c.elem);
  240 + return false;
  241 + }
  242 + if(Object.prototype.toString.call(c.data)!='[object Array]'){
  243 + var data = o.getData(c.data);
  244 + if(data===false){
  245 + console.error(MOD_NAME+' hint:缺少分类数据');
  246 + return false;
  247 + }
  248 + o.config.data = data;
  249 + }
  250 +
  251 + c.filter = c.filter=='' ? c.elem.replace('#','').replace('.','') : c.filter;
  252 + c.name = c.name=='' ? c.elem.replace('#','').replace('.','') : c.name;
  253 + o.config = c;
  254 +
  255 + //初始化
  256 + o.set();
  257 +
  258 + //监听下拉事件
  259 + form.on('select('+c.filter+')',function(data){
  260 + o.change($(data.elem));
  261 + });
  262 + //验证失败样式
  263 + $E.find('input[name='+c.name+']').focus(function(){
  264 + var t = $(c.elem).offset().top;
  265 + $('html,body').scrollTop(t-200);
  266 + $(c.elem).find('select:last').addClass('layui-form-danger');
  267 + setTimeout(function(){
  268 + $(c.elem).find('select:last').removeClass('layui-form-danger');
  269 + },3000);
  270 + });
  271 + }
  272 +
  273 + //输出模块
  274 + exports(MOD_NAME, function (config) {
  275 + var _this = new obj(config);
  276 + _this.render();
  277 + return _this;
  278 + });
  279 +});