作者 Karson

新增SelectPage插件

新增CRUD生成Swith类型的Checkbox,支持tinyint和char
移除Typeahead、Tagsinput、Bootstrap-select-ajax插件
修复快捷搜索不能使用关联表字段的BUG
@@ -17,6 +17,72 @@ class Crud extends Command @@ -17,6 +17,72 @@ class Crud extends Command
17 17
18 protected $stubList = []; 18 protected $stubList = [];
19 19
  20 + /**
  21 + * Selectpage搜索字段关联
  22 + */
  23 + protected $fieldSelectpageMap = [
  24 + 'nickname' => ['user_id', 'user_ids', 'admin_id', 'admin_ids']
  25 + ];
  26 +
  27 + /**
  28 + * Enum类型识别为单选框的结尾字符,默认会识别为单选下拉列表
  29 + */
  30 + protected $enumRadioSuffix = 'data';
  31 +
  32 + /**
  33 + * Set类型识别为复选框的结尾字符,默认会识别为多选下拉列表
  34 + */
  35 + protected $setCheckboxSuffix = 'data';
  36 +
  37 + /**
  38 + * Int类型识别为日期时间的结尾字符,默认会识别为数字文本框
  39 + */
  40 + protected $intDateSuffix = 'time';
  41 +
  42 + /**
  43 + * 开头后缀
  44 + */
  45 + protected $switchSuffix = 'switch';
  46 +
  47 + /**
  48 + * 以指定字符结尾的字段格式化函数
  49 + */
  50 + protected $fieldFormatterSuffix = [
  51 + 'status' => 'status',
  52 + 'icon' => 'icon',
  53 + 'flag' => 'flag',
  54 + 'url' => 'url',
  55 + 'url' => 'url',
  56 + 'image' => 'image',
  57 + 'images' => 'images',
  58 + 'time' => ['type' => ['int', 'timestamp'], 'name' => 'datetime']
  59 + ];
  60 +
  61 + /**
  62 + * 识别为图片字段
  63 + */
  64 + protected $imageField = ['image', 'images', 'avatar', 'avatars'];
  65 +
  66 + /**
  67 + * 识别为文件字段
  68 + */
  69 + protected $fileField = ['file', 'files'];
  70 +
  71 + /**
  72 + * 保留字段
  73 + */
  74 + protected $reservedField = ['createtime', 'updatetime'];
  75 +
  76 + /**
  77 + * 排序字段
  78 + */
  79 + protected $sortField = 'weigh';
  80 +
  81 + /**
  82 + * 编辑器的Class
  83 + */
  84 + protected $editorClass = 'summernote';
  85 +
20 protected function configure() 86 protected function configure()
21 { 87 {
22 $this 88 $this
@@ -286,7 +352,7 @@ class Crud extends Command @@ -286,7 +352,7 @@ class Crud extends Command
286 } 352 }
287 $inputType = ''; 353 $inputType = '';
288 //createtime和updatetime是保留字段不能修改和添加 354 //createtime和updatetime是保留字段不能修改和添加
289 - if ($v['COLUMN_KEY'] != 'PRI' && !in_array($field, ['createtime', 'updatetime'])) 355 + if ($v['COLUMN_KEY'] != 'PRI' && !in_array($field, $this->reservedField))
290 { 356 {
291 $inputType = $this->getFieldType($v); 357 $inputType = $this->getFieldType($v);
292 358
@@ -381,34 +447,72 @@ class Crud extends Command @@ -381,34 +447,72 @@ class Crud extends Command
381 } 447 }
382 else if ($inputType == 'textarea') 448 else if ($inputType == 'textarea')
383 { 449 {
384 - $cssClassArr[] = substr($field, -7) == 'content' ? 'summernote' : ''; 450 + $cssClassArr[] = substr($field, -7) == 'content' ? $this->editorClass : '';
385 $attrArr['class'] = implode(' ', $cssClassArr); 451 $attrArr['class'] = implode(' ', $cssClassArr);
386 $attrArr['rows'] = 5; 452 $attrArr['rows'] = 5;
387 $formAddElement = Form::textarea($fieldName, $defaultValue, $attrArr); 453 $formAddElement = Form::textarea($fieldName, $defaultValue, $attrArr);
388 $formEditElement = Form::textarea($fieldName, $editValue, $attrArr); 454 $formEditElement = Form::textarea($fieldName, $editValue, $attrArr);
389 } 455 }
390 - else if ($field == 'category_id' || $field == 'category_ids') 456 + else if ($inputType == 'switch')
391 { 457 {
392 - $type = $table;  
393 - if ($field == 'category_ids') 458 + if ($defaultValue === '1' || $defaultValue === 'Y')
394 { 459 {
395 - $attrArr['multiple'] = ''; 460 + $yes = $defaultValue;
  461 + $no = $defaultValue === '1' ? '0' : 'N';
  462 + }
  463 + else
  464 + {
  465 + $no = $defaultValue;
  466 + $yes = $defaultValue === '0' ? '1' : 'Y';
396 } 467 }
397 - $attrStr = $this->getArrayString($attrArr);  
398 - $formAddElement = "{:build_category_select('{$fieldName}', '{$type}', '{$defaultValue}', [{$attrStr}])}";  
399 - $formEditElement = "{:build_category_select('{$fieldName}', '{$type}', \$row.{$field}, [{$attrStr}])}"; 468 + $formAddElement = $formEditElement = Form::hidden($fieldName, $no, array_merge(['checked' => ''], $attrArr));
  469 + $attrArr['id'] = $fieldName . "-switch";
  470 + $formAddElement .= sprintf(Form::label("{$attrArr['id']}", "%s abcdefg"), Form::checkbox($fieldName, $yes, $defaultValue === $yes, $attrArr));
  471 + $formEditElement .= sprintf(Form::label("{$attrArr['id']}", "%s abcdefg"), Form::checkbox($fieldName, $yes, 0, $attrArr));
  472 + $formEditElement = str_replace('type="checkbox"', 'type="checkbox" {in name="' . "\$row.{$field}" . '" value="' . $yes . '"}checked{/in}', $formEditElement);
400 } 473 }
401 else 474 else
402 { 475 {
403 - //CSS类名  
404 - $cssClassArr[] = substr($field, -3) == '_id' ? 'typeahead' : '';  
405 - $cssClassArr[] = substr($field, -4) == '_ids' ? 'tagsinput' : '';  
406 - $cssClassArr = array_filter($cssClassArr); 476 + $search = $replace = '';
  477 + //特殊字段为关联搜索
  478 + if (substr($field, -3) == '_id' || substr($field, -4) == '_ids')
  479 + {
  480 + $inputType = 'text';
  481 + $defaultValue = '';
  482 + $attrArr['data-rule'] = 'required';
  483 + $cssClassArr[] = 'selectpage';
  484 + $attrArr['data-db-table'] = substr($field, 0, strripos($field, '_'));
  485 + if ($attrArr['data-db-table'] == 'category')
  486 + {
  487 + $attrArr['data-params'] = '##replacetext##';
  488 + $search = '"##replacetext##"';
  489 + $replace = '\'{"custom[type]":"' . $table . '"}\'';
  490 + }
  491 + if (substr($field, -4) == '_ids')
  492 + {
  493 + $attrArr['data-multiple'] = 'true';
  494 + }
  495 + foreach ($this->fieldSelectpageMap as $m => $n)
  496 + {
  497 + if (in_array($field, $n))
  498 + {
  499 + $attrArr['data-field'] = $m;
  500 + break;
  501 + }
  502 + }
  503 + }
407 //因为有自动完成可输入其它内容 504 //因为有自动完成可输入其它内容
408 - $step = array_intersect($cssClassArr, ['typeahead', 'tagsinput']) ? 0 : $step; 505 + $step = array_intersect($cssClassArr, ['selectpage']) ? 0 : $step;
409 $attrArr['class'] = implode(' ', $cssClassArr); 506 $attrArr['class'] = implode(' ', $cssClassArr);
410 -  
411 - $isUpload = in_array(substr($field, -4), ['file']) || in_array(substr($field, -5), ['files', 'image']) || in_array(substr($field, -6), ['images', 'avatar']) || in_array(substr($field, -7), ['avatars']) ? TRUE : FALSE; 507 + $isUpload = false;
  508 + foreach (array_merge($this->imageField, $this->fileField) as $m => $n)
  509 + {
  510 + if (preg_match("/{$n}$/i", $field))
  511 + {
  512 + $isUpload = true;
  513 + break;
  514 + }
  515 + }
412 //如果是步长则加上步长 516 //如果是步长则加上步长
413 if ($step) 517 if ($step)
414 { 518 {
@@ -422,7 +526,11 @@ class Crud extends Command @@ -422,7 +526,11 @@ class Crud extends Command
422 526
423 $formAddElement = Form::input($inputType, $fieldName, $defaultValue, $attrArr); 527 $formAddElement = Form::input($inputType, $fieldName, $defaultValue, $attrArr);
424 $formEditElement = Form::input($inputType, $fieldName, $editValue, $attrArr); 528 $formEditElement = Form::input($inputType, $fieldName, $editValue, $attrArr);
425 - 529 + if ($search && $replace)
  530 + {
  531 + $formAddElement = str_replace($search, $replace, $formAddElement);
  532 + $formEditElement = str_replace($search, $replace, $formEditElement);
  533 + }
426 //如果是图片或文件 534 //如果是图片或文件
427 if ($isUpload) 535 if ($isUpload)
428 { 536 {
@@ -450,8 +558,8 @@ class Crud extends Command @@ -450,8 +558,8 @@ class Crud extends Command
450 { 558 {
451 $javascriptList[] = $this->getJsColumn($field, $v['DATA_TYPE'], '_text'); 559 $javascriptList[] = $this->getJsColumn($field, $v['DATA_TYPE'], '_text');
452 } 560 }
453 - //排序方式,如果有weigh则按weigh,否则按主键排序  
454 - $order = $field == 'weigh' ? 'weigh' : $order; 561 + //排序方式,如果有指定排序字段,否则按主键排序
  562 + $order = $field == $this->sortField ? $this->sortField : $order;
455 } 563 }
456 } 564 }
457 565
@@ -579,7 +687,7 @@ class Crud extends Command @@ -579,7 +687,7 @@ class Crud extends Command
579 } 687 }
580 catch (\think\exception\ErrorException $e) 688 catch (\think\exception\ErrorException $e)
581 { 689 {
582 - throw new Exception("Code: " . $e->getCode() . "\nLine: " . $e->getLine() . "\nMessage: " . $e->getMessage()); 690 + throw new Exception("Code: " . $e->getCode() . "\nLine: " . $e->getLine() . "\nMessage: " . $e->getMessage() . "\nFile: " . $e->getFile());
583 } 691 }
584 $output->info("Build Successed"); 692 $output->info("Build Successed");
585 } 693 }
@@ -846,21 +954,26 @@ EOD; @@ -846,21 +954,26 @@ EOD;
846 break; 954 break;
847 } 955 }
848 $fieldsName = $v['COLUMN_NAME']; 956 $fieldsName = $v['COLUMN_NAME'];
849 - // 如果后缀以time结尾说明也是个时间字段  
850 - if (substr($fieldsName, -4) == 'time') 957 + // 指定后缀说明也是个时间字段
  958 + if (preg_match("/{$this->intDateSuffix}$/i", $fieldsName))
851 { 959 {
852 $inputType = 'datetime'; 960 $inputType = 'datetime';
853 } 961 }
854 - // 如果后缀以data结尾且类型为enum,说明是个单选框  
855 - if (substr($fieldsName, -4) == 'data' && $v['DATA_TYPE'] == 'enum') 962 + // 指定后缀结尾且类型为enum,说明是个单选框
  963 + if (preg_match("/{$this->enumRadioSuffix}$/i", $fieldsName) && $v['DATA_TYPE'] == 'enum')
856 { 964 {
857 $inputType = "radio"; 965 $inputType = "radio";
858 } 966 }
859 - // 如果后缀以data结尾且类型为set,说明是个复选框  
860 - if (substr($fieldsName, -4) == 'data' && $v['DATA_TYPE'] == 'set') 967 + // 指定后缀结尾且类型为set,说明是个复选框
  968 + if (preg_match("/{$this->setCheckboxSuffix}$/i", $fieldsName) && $v['DATA_TYPE'] == 'set')
861 { 969 {
862 $inputType = "checkbox"; 970 $inputType = "checkbox";
863 } 971 }
  972 + // 指定后缀结尾且类型为char或tinyint且长度为1,说明是个Switch复选框
  973 + if (preg_match("/{$this->switchSuffix}$/i", $fieldsName) && ($v['COLUMN_TYPE'] == 'tinyint(1)' || $v['COLUMN_TYPE'] == 'char(1)') && $v['COLUMN_DEFAULT'] !== '' && $v['COLUMN_DEFAULT'] !== null)
  974 + {
  975 + $inputType = "switch";
  976 + }
864 return $inputType; 977 return $inputType;
865 } 978 }
866 979
@@ -891,7 +1004,15 @@ EOD; @@ -891,7 +1004,15 @@ EOD;
891 */ 1004 */
892 protected function getImageUpload($field, $content) 1005 protected function getImageUpload($field, $content)
893 { 1006 {
894 - $filter = substr($field, -4) == 'avatar' || substr($field, -5) == 'image' || substr($field, -6) == 'images' ? ' data-mimetype="image/*"' : ""; 1007 + $filter = '';
  1008 + foreach ($this->imageField as $k => $v)
  1009 + {
  1010 + if (preg_match("/{$v}$/i", $field))
  1011 + {
  1012 + $filter = ' data-mimetype="image/*"';
  1013 + break;
  1014 + }
  1015 + }
895 $multiple = substr($field, -1) == 's' ? ' data-multiple="true"' : ' data-multiple="false"'; 1016 $multiple = substr($field, -1) == 's' ? ' data-multiple="true"' : ' data-multiple="false"';
896 $preview = $filter ? ' data-preview-id="p-' . $field . '"' : ''; 1017 $preview = $filter ? ' data-preview-id="p-' . $field . '"' : '';
897 $previewcontainer = $preview ? '<ul class="row list-inline plupload-preview" id="p-' . $field . '"></ul>' : ''; 1018 $previewcontainer = $preview ? '<ul class="row list-inline plupload-preview" id="p-' . $field . '"></ul>' : '';
@@ -914,22 +1035,26 @@ EOD; @@ -914,22 +1035,26 @@ EOD;
914 { 1035 {
915 $lang = ucfirst($field); 1036 $lang = ucfirst($field);
916 $html = str_repeat(" ", 24) . "{field: '{$field}{$extend}', title: __('{$lang}')"; 1037 $html = str_repeat(" ", 24) . "{field: '{$field}{$extend}', title: __('{$lang}')";
917 - $field = stripos($field, ".") !== false ? substr($field, stripos($field, '.') + 1) : $field;  
918 $formatter = ''; 1038 $formatter = '';
919 - if ($field == 'status')  
920 - $formatter = 'status';  
921 - else if ($field == 'icon')  
922 - $formatter = 'icon';  
923 - else if ($field == 'flag')  
924 - $formatter = 'flag';  
925 - else if (substr($field, -4) == 'time' && in_array($datatype, ['int', 'timestamp']))  
926 - $formatter = 'datetime';  
927 - else if (substr($field, -3) == 'url' || substr($field, -4) == 'file')  
928 - $formatter = 'url';  
929 - else if (substr($field, -5) == 'image')  
930 - $formatter = 'image';  
931 - else if (substr($field, -6) == 'images')  
932 - $formatter = 'images'; 1039 + foreach ($this->fieldFormatterSuffix as $k => $v)
  1040 + {
  1041 + if (preg_match("/{$k}$/i", $field))
  1042 + {
  1043 + if (is_array($v))
  1044 + {
  1045 + if (in_array($datatype, $v['type']))
  1046 + {
  1047 + $formatter = $v['name'];
  1048 + break;
  1049 + }
  1050 + }
  1051 + else
  1052 + {
  1053 + $formatter = $v;
  1054 + break;
  1055 + }
  1056 + }
  1057 + }
933 if ($extend) 1058 if ($extend)
934 $html .= ", operate:false"; 1059 $html .= ", operate:false";
935 if ($formatter && !$extend) 1060 if ($formatter && !$extend)
@@ -62,6 +62,78 @@ class Ajax extends Backend @@ -62,6 +62,78 @@ class Ajax extends Backend
62 } 62 }
63 63
64 /** 64 /**
  65 + * SelectPage通用下拉列表搜索
  66 + */
  67 + public function selectpage()
  68 + {
  69 + //搜索关键词,客户端输入以空格分开,这里接收为数组
  70 + $word = $this->request->request("q_word/a");
  71 + //当前页
  72 + $page = $this->request->request("pageNumber");
  73 + //分页大小
  74 + $pagesize = $this->request->request("pageSize");
  75 + //搜索条件
  76 + $andor = $this->request->request("and_or");
  77 + //排序方式
  78 + $orderby = $this->request->request("order_by/a");
  79 + //表名
  80 + $table = $this->request->request("db_table");
  81 + //显示的字段
  82 + $field = $this->request->request("field");
  83 + //主键
  84 + $primarykey = $this->request->request("pkey_name");
  85 + //主键值
  86 + $primaryvalue = $this->request->request("pkey_value");
  87 + //搜索字段
  88 + $searchfield = $this->request->request("search_field/a");
  89 + //自定义搜索条件
  90 + $custom = $this->request->request("custom/a");
  91 + $order = [];
  92 + foreach ($orderby as $k => $v)
  93 + {
  94 + $order[$v[0]] = $v[1];
  95 + }
  96 + $field = $field ? $field : 'name';
  97 +
  98 + //如果不使用ajax/selectpage这个页面提供结果,则是自己的控制器单独写搜索条件,$where按自己的需求写即可
  99 + //这里只是能用考虑,所以搜索条件写得比较复杂
  100 + //如果有primaryvalue,说明当前是初始化传值
  101 + if ($primaryvalue)
  102 + {
  103 + $where = [$primarykey => ['in', $primaryvalue]];
  104 + }
  105 + else
  106 + {
  107 + $where = function($query) use($word, $andor, $field, $searchfield, $custom) {
  108 + $where = $andor == "OR" ? "whereOr" : "where";
  109 + foreach ($word as $k => $v)
  110 + {
  111 + foreach ($searchfield as $m => $n)
  112 + {
  113 + $query->{$where}($n, "like", "%{$v}%");
  114 + }
  115 + }
  116 + if ($custom && is_array($custom))
  117 + {
  118 + foreach ($custom as $k => $v)
  119 + {
  120 + $query->where($k, '=', $v);
  121 + }
  122 + }
  123 + };
  124 + }
  125 + $list = [];
  126 + $total = Db::name($table)->where($where)->count();
  127 + if ($total > 0)
  128 + {
  129 + $list = Db::name($table)->where($where)->order($order)->page($page, $pagesize)->field("{$primarykey},{$field}")->select();
  130 + }
  131 +
  132 + //这里一定要返回有list这个字段,total是可选的,如果total<=list的数量,则会隐藏分页按钮
  133 + return json(['list' => $list, 'total' => $total]);
  134 + }
  135 +
  136 + /**
65 * 加载语言包 137 * 加载语言包
66 */ 138 */
67 public function lang() 139 public function lang()
@@ -27,6 +27,7 @@ class Relationmodel extends Backend @@ -27,6 +27,7 @@ class Relationmodel extends Backend
27 public function index() 27 public function index()
28 { 28 {
29 $this->relationSearch = true; 29 $this->relationSearch = true;
  30 + $this->searchFields = "admin.username,id";
30 if ($this->request->isAjax()) 31 if ($this->request->isAjax())
31 { 32 {
32 list($where, $sort, $order, $offset, $limit) = $this->buildparams(); 33 list($where, $sort, $order, $offset, $limit) = $this->buildparams();
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <div class="form-group"> 2 <div class="form-group">
3 <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> 3 <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
4 <div class="col-xs-12 col-sm-8"> 4 <div class="col-xs-12 col-sm-8">
5 - <input id="c-category_id" class="form-control typeahead" name="row[category_id]" type="text" value="0" data-rule="required"> 5 + <input id="c-category_id" class="form-control selectpage" data-db-table="category" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="" data-rule="required">
6 </div> 6 </div>
7 </div> 7 </div>
8 <div class="form-group"> 8 <div class="form-group">
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <div class="form-group"> 3 <div class="form-group">
4 <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label> 4 <label for="c-category_id" class="control-label col-xs-12 col-sm-2">{:__('Category_id')}:</label>
5 <div class="col-xs-12 col-sm-8"> 5 <div class="col-xs-12 col-sm-8">
6 - <input id="c-category_id" class="form-control typeahead" name="row[category_id]" type="text" value="{$row.category_id}" data-rule="required"> 6 + <input id="c-category_id" class="form-control selectpage" data-db-table="category" data-params='{"custom[type]":"page"}' name="row[category_id]" type="text" value="{$row.category_id}" data-rule="required">
7 </div> 7 </div>
8 </div> 8 </div>
9 <div class="form-group"> 9 <div class="form-group">
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
2 <div class="form-group"> 2 <div class="form-group">
3 <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label> 3 <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
4 <div class="col-xs-12 col-sm-8"> 4 <div class="col-xs-12 col-sm-8">
5 - <input type="text" name="row[user_id]" value="0" id="c-user_id" class="form-control typeahead " /> 5 + <input type="text" name="row[user_id]" value="0" id="c-user_id" class="form-control" />
6 </div> 6 </div>
7 </div> 7 </div>
8 <div class="form-group"> 8 <div class="form-group">
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 <div class="form-group"> 3 <div class="form-group">
4 <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label> 4 <label for="c-user_id" class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>
5 <div class="col-xs-12 col-sm-8"> 5 <div class="col-xs-12 col-sm-8">
6 - <input type="text" name="row[user_id]" value="{$row.user_id}" id="c-user_id" class="form-control typeahead " /> 6 + <input type="text" name="row[user_id]" value="{$row.user_id}" id="c-user_id" class="form-control" />
7 </div> 7 </div>
8 </div> 8 </div>
9 <div class="form-group"> 9 <div class="form-group">
@@ -2,25 +2,25 @@ @@ -2,25 +2,25 @@
2 <div class="form-group"> 2 <div class="form-group">
3 <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label> 3 <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label>
4 <div class="col-xs-12 col-sm-8"> 4 <div class="col-xs-12 col-sm-8">
5 - <input type="text" name="row[partner_id]" value="" id="c-partner_id" class="form-control typeahead "required /> 5 + <input type="text" name="row[partner_id]" value="" id="c-partner_id" class="form-control "required />
6 </div> 6 </div>
7 </div> 7 </div>
8 <div class="form-group"> 8 <div class="form-group">
9 <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label> 9 <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label>
10 <div class="col-xs-12 col-sm-8"> 10 <div class="col-xs-12 col-sm-8">
11 - <input type="text" name="row[role_id]" value="0" id="c-role_id" class="form-control typeahead " /> 11 + <input type="text" name="row[role_id]" value="0" id="c-role_id" class="form-control " />
12 </div> 12 </div>
13 </div> 13 </div>
14 <div class="form-group"> 14 <div class="form-group">
15 <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label> 15 <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label>
16 <div class="col-xs-12 col-sm-8"> 16 <div class="col-xs-12 col-sm-8">
17 - <input type="text" name="row[area_id]" value="0" id="c-area_id" class="form-control typeahead " /> 17 + <input type="text" name="row[area_id]" value="0" id="c-area_id" class="form-control " />
18 </div> 18 </div>
19 </div> 19 </div>
20 <div class="form-group"> 20 <div class="form-group">
21 <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label> 21 <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label>
22 <div class="col-xs-12 col-sm-8"> 22 <div class="col-xs-12 col-sm-8">
23 - <input type="text" name="row[editor_id]" value="0" id="c-editor_id" class="form-control typeahead " /> 23 + <input type="text" name="row[editor_id]" value="0" id="c-editor_id" class="form-control " />
24 </div> 24 </div>
25 </div> 25 </div>
26 <div class="form-group"> 26 <div class="form-group">
@@ -3,25 +3,25 @@ @@ -3,25 +3,25 @@
3 <div class="form-group"> 3 <div class="form-group">
4 <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label> 4 <label for="c-partner_id" class="control-label col-xs-12 col-sm-2">{:__('Partner_id')}:</label>
5 <div class="col-xs-12 col-sm-8"> 5 <div class="col-xs-12 col-sm-8">
6 - <input type="text" name="row[partner_id]" value="{$row.partner_id}" id="c-partner_id" class="form-control typeahead "required /> 6 + <input type="text" name="row[partner_id]" value="{$row.partner_id}" id="c-partner_id" class="form-control "required />
7 </div> 7 </div>
8 </div> 8 </div>
9 <div class="form-group"> 9 <div class="form-group">
10 <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label> 10 <label for="c-role_id" class="control-label col-xs-12 col-sm-2">{:__('Role_id')}:</label>
11 <div class="col-xs-12 col-sm-8"> 11 <div class="col-xs-12 col-sm-8">
12 - <input type="text" name="row[role_id]" value="{$row.role_id}" id="c-role_id" class="form-control typeahead " /> 12 + <input type="text" name="row[role_id]" value="{$row.role_id}" id="c-role_id" class="form-control " />
13 </div> 13 </div>
14 </div> 14 </div>
15 <div class="form-group"> 15 <div class="form-group">
16 <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label> 16 <label for="c-area_id" class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label>
17 <div class="col-xs-12 col-sm-8"> 17 <div class="col-xs-12 col-sm-8">
18 - <input type="text" name="row[area_id]" value="{$row.area_id}" id="c-area_id" class="form-control typeahead " /> 18 + <input type="text" name="row[area_id]" value="{$row.area_id}" id="c-area_id" class="form-control " />
19 </div> 19 </div>
20 </div> 20 </div>
21 <div class="form-group"> 21 <div class="form-group">
22 <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label> 22 <label for="c-editor_id" class="control-label col-xs-12 col-sm-2">{:__('Editor_id')}:</label>
23 <div class="col-xs-12 col-sm-8"> 23 <div class="col-xs-12 col-sm-8">
24 - <input type="text" name="row[editor_id]" value="{$row.editor_id}" id="c-editor_id" class="form-control typeahead " /> 24 + <input type="text" name="row[editor_id]" value="{$row.editor_id}" id="c-editor_id" class="form-control " />
25 </div> 25 </div>
26 </div> 26 </div>
27 <div class="form-group"> 27 <div class="form-group">
@@ -215,7 +215,7 @@ class Backend extends Controller @@ -215,7 +215,7 @@ class Backend extends Controller
215 $searchlist = []; 215 $searchlist = [];
216 foreach ($searcharr as $k => $v) 216 foreach ($searcharr as $k => $v)
217 { 217 {
218 - $searchlist[] = "{$modelName}`{$v}` LIKE '%{$search}%'"; 218 + $searchlist[] = (stripos($v, ".") !== false ? $v : "{$modelName}`{$v}`") . " LIKE '%{$search}%'";
219 } 219 }
220 $where[] = "(" . implode(' OR ', $searchlist) . ")"; 220 $where[] = "(" . implode(' OR ', $searchlist) . ")";
221 } 221 }
@@ -30,16 +30,14 @@ @@ -30,16 +30,14 @@
30 "jquery-slimscroll": "slimscroll#^1.3.8", 30 "jquery-slimscroll": "slimscroll#^1.3.8",
31 "jquery.cookie": "^1.4.1", 31 "jquery.cookie": "^1.4.1",
32 "Sortable": "^1.5.0", 32 "Sortable": "^1.5.0",
33 - "typeahead.js": "^0.11.1",  
34 - "bootstrap-tagsinput": "^0.8.0",  
35 "nice-validator": "^1.0.10", 33 "nice-validator": "^1.0.10",
36 - "art-template": "^3.0.1",  
37 - "ajax-bootstrap-select": "^1.3.8" 34 + "art-template": "^3.0.1"
38 }, 35 },
39 "devDependencies": { 36 "devDependencies": {
40 "dragsort": "https://github.com/karsonzhang/dragsort.git", 37 "dragsort": "https://github.com/karsonzhang/dragsort.git",
41 "jquery-addtabs": "https://github.com/karsonzhang/jquery-addtabs.git", 38 "jquery-addtabs": "https://github.com/karsonzhang/jquery-addtabs.git",
42 - "jquery-cxselect": "https://github.com/karsonzhang/cxSelect.git#",  
43 - "jqcron": "https://github.com/karsonzhang/jqcron.git#" 39 + "jquery-cxselect": "https://github.com/karsonzhang/cxSelect.git",
  40 + "jqcron": "https://github.com/karsonzhang/jqcron.git",
  41 + "selectpage": "https://github.com/karsonzhang/selectpage.git"
44 } 42 }
45 } 43 }
@@ -8,6 +8,7 @@ @@ -8,6 +8,7 @@
8 @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css"); 8 @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css");
9 @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"); 9 @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css");
10 @import url("../libs/nice-validator/dist/jquery.validator.css"); 10 @import url("../libs/nice-validator/dist/jquery.validator.css");
  11 +@import url("../libs/selectpage/selectpage.css");
11 body { 12 body {
12 background: #f1f4f6; 13 background: #f1f4f6;
13 } 14 }
@@ -6,7 +6,7 @@ require.config({ @@ -6,7 +6,7 @@ require.config({
6 main: 'moment' 6 main: 'moment'
7 }], 7 }],
8 //在打包压缩时将会把include中的模块合并到主文件中 8 //在打包压缩时将会把include中的模块合并到主文件中
9 - include: ['css', 'layer', 'toastr', 'backend', 'table', 'form', 'dragsort', 'drag', 'drop', 'addtabs'], 9 + include: ['css', 'layer', 'toastr', 'backend', 'table', 'form', 'dragsort', 'drag', 'drop', 'addtabs', 'selectpage'],
10 paths: { 10 paths: {
11 'lang': "empty:", 11 'lang': "empty:",
12 'form': 'require-form', 12 'form': 'require-form',
@@ -24,18 +24,13 @@ require.config({ @@ -24,18 +24,13 @@ require.config({
24 'jquery': '../libs/jquery/dist/jquery.min', 24 'jquery': '../libs/jquery/dist/jquery.min',
25 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', 25 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min',
26 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', 26 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min',
27 - 'bootstrap-typeahead': '../libs/bootstrap3-typeahead/bootstrap3-typeahead.min',  
28 - 'bootstrap-tagsinput': '../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.min',  
29 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', 27 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min',
30 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', 28 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min',
31 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', 29 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min',
32 - 'bootstrap-select-ajax': '../libs/ajax-bootstrap-select/dist/js/ajax-bootstrap-select.min',  
33 'bootstrap-table': '../libs/bootstrap-table/dist/bootstrap-table.min', 30 'bootstrap-table': '../libs/bootstrap-table/dist/bootstrap-table.min',
34 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', 31 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min',
35 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', 32 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile',
36 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', 33 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN',
37 - 'typeahead': '../libs/typeahead.js/dist/typeahead.jquery.min',  
38 - 'bloodhound': '../libs/typeahead.js/dist/bloodhound.min',  
39 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', 34 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min',
40 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', 35 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min',
41 'less': '../libs/less/dist/less.min', 36 'less': '../libs/less/dist/less.min',
@@ -54,6 +49,7 @@ require.config({ @@ -54,6 +49,7 @@ require.config({
54 'cookie': '../libs/jquery.cookie/jquery.cookie', 49 'cookie': '../libs/jquery.cookie/jquery.cookie',
55 'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect', 50 'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect',
56 'template': '../libs/art-template/dist/template-native', 51 'template': '../libs/art-template/dist/template-native',
  52 + 'selectpage': '../libs/selectpage/selectpage',
57 }, 53 },
58 // shim依赖配置 54 // shim依赖配置
59 shim: { 55 shim: {
@@ -97,12 +93,6 @@ require.config({ @@ -97,12 +93,6 @@ require.config({
97 deps: ['bootstrap', 'slimscroll'], 93 deps: ['bootstrap', 'slimscroll'],
98 exports: '$.AdminLTE' 94 exports: '$.AdminLTE'
99 }, 95 },
100 - 'typeahead': {  
101 - deps: ['jquery'],  
102 - init: function ($) {  
103 - return require.s.contexts._.registry['typeahead.js'].factory($);  
104 - }  
105 - },  
106 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], 96 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'],
107 'bootstrap-checkbox': ['jquery'], 97 'bootstrap-checkbox': ['jquery'],
108 'bootstrap-radio': ['jquery'], 98 'bootstrap-radio': ['jquery'],
@@ -112,12 +102,6 @@ require.config({ @@ -112,12 +102,6 @@ require.config({
112 'moment/locale/zh-cn', 102 'moment/locale/zh-cn',
113 // 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', 103 // 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
114 ], 104 ],
115 - 'bootstrap-tagsinput': [  
116 - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css',  
117 - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.css',  
118 - 'jquery',  
119 - 'typeahead'  
120 - ],  
121 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], 105 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ],
122 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], 106 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'],
123 // 'toastr': ['css!../libs/toastr/toastr.min.css'], 107 // 'toastr': ['css!../libs/toastr/toastr.min.css'],
@@ -129,6 +113,7 @@ require.config({ @@ -129,6 +113,7 @@ require.config({
129 // 'layer': ['css!../libs/layer/build/skin/default/layer.css'], 113 // 'layer': ['css!../libs/layer/build/skin/default/layer.css'],
130 // 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'], 114 // 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
131 'validator-lang': ['validator-core'], 115 'validator-lang': ['validator-core'],
  116 +// 'selectpage': ['css!../libs/selectpage/selectpage.css'],
132 }, 117 },
133 baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径 118 baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
134 map: { 119 map: {
@@ -105,43 +105,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func @@ -105,43 +105,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func
105 105
106 //绑定select元素事件 106 //绑定select元素事件
107 if ($(".selectpicker", form).size() > 0) { 107 if ($(".selectpicker", form).size() > 0) {
108 - require(['bootstrap-select', 'bootstrap-select-ajax'], function () {  
109 - var selectlist = $('.selectpicker', form).selectpicker();  
110 - $.each(selectlist, function () {  
111 - var that = this;  
112 - if ($(this).data("live-search")) {  
113 - $(this).ajaxSelectPicker({  
114 - ajax: {  
115 - url: 'ajax/selectpicker',  
116 - beforeSend: function (xhr, setting) {  
117 - setting.url = Backend.api.fixurl(setting.url);  
118 - },  
119 - data: function () {  
120 - var params = {  
121 - search: '{{{q}}}',  
122 - field: $(that).attr("name")  
123 - };  
124 - return params;  
125 - },  
126 - dataType: 'json'  
127 - },  
128 - locale: {  
129 - emptyTitle: 'Search...'  
130 - },  
131 - preprocessData: function (ret) {  
132 - var list = [];  
133 - if (ret.hasOwnProperty('data') && ret.data) {  
134 - var len = ret.data.length;  
135 - for (var i = 0; i < len; i++) {  
136 - var curr = ret.data[i];  
137 - list.push(curr);  
138 - }  
139 - }  
140 - return list;  
141 - },  
142 - preserveSelected: true  
143 - });  
144 - } 108 + require(['bootstrap-select'], function () {
  109 + $('.selectpicker', form).selectpicker();
  110 + });
  111 + }
  112 +
  113 + //绑定selectpage元素事件
  114 + if ($(".selectpage", form).size() > 0) {
  115 + require(['selectpage'], function () {
  116 + $('.selectpage', form).selectPage({
  117 + source: 'ajax/selectpage',
145 }); 118 });
146 }); 119 });
147 } 120 }
@@ -156,74 +129,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func @@ -156,74 +129,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func
156 }); 129 });
157 } 130 }
158 131
159 - if ($(".typeahead").size() > 0 || $(".tagsinput").size() > 0) {  
160 - require(['bloodhound'], function () {  
161 - var remotesource = function (input) {  
162 - var url = $(input).data("url") ? $(input).data("url") : "ajax/typeahead";  
163 - return new Bloodhound({  
164 - datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),  
165 - queryTokenizer: Bloodhound.tokenizers.whitespace,  
166 - remote: {  
167 - url: url + '?search=%QUERY&field=' + $(input).attr("name"),  
168 - wildcard: '%QUERY',  
169 - transform: function (ret) {  
170 - return ret.data.searchlist;  
171 - }  
172 - }  
173 - });  
174 - };  
175 -  
176 - //绑定typeahead事件  
177 - if ($(".typeahead", form).size() > 0) {  
178 - require(['typeahead'], function () {  
179 - $(".typeahead", form).each(function () {  
180 - $(this).typeahead({  
181 - hint: true,  
182 - highlight: true,  
183 - minLength: 0  
184 - }, {  
185 - name: 'typeahead',  
186 - limit: 20,  
187 - displayKey: 'id',  
188 - source: remotesource(this),  
189 - templates: {  
190 - empty: '<li class="notfound">' + __('No matches found') + '</li>',  
191 - suggestion: function (item) {  
192 - return '<li>' + item.name + '</li>';  
193 - }  
194 - }  
195 - });  
196 - });  
197 - });  
198 - }  
199 -  
200 - //绑定tagsinput事件  
201 - if ($(".tagsinput", form).size() > 0) {  
202 - require(['bootstrap-tagsinput'], function () {  
203 - $('.tagsinput', form).each(function () {  
204 - $(this).tagsinput({  
205 - freeInput: false,  
206 - itemValue: 'id',  
207 - itemText: 'name',  
208 - typeaheadjs: {  
209 - name: 'tagsinput',  
210 - limit: 20,  
211 - displayKey: 'name',  
212 - source: remotesource(this),  
213 - templates: {  
214 - empty: '<li class="notfound">' + __('No matches found') + '</li>',  
215 - suggestion: function (item) {  
216 - return '<li>' + item.name + '</li>';  
217 - }  
218 - }  
219 - }  
220 - });  
221 - });  
222 - });  
223 - }  
224 - });  
225 - }  
226 -  
227 //绑定日期时间元素事件 132 //绑定日期时间元素事件
228 if ($(".datetimepicker", form).size() > 0) { 133 if ($(".datetimepicker", form).size() > 0) {
229 require(['bootstrap-datetimepicker'], function () { 134 require(['bootstrap-datetimepicker'], function () {
@@ -23,8 +23,6 @@ require.config({ @@ -23,8 +23,6 @@ require.config({
23 'jquery': '../libs/jquery/dist/jquery.min', 23 'jquery': '../libs/jquery/dist/jquery.min',
24 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', 24 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min',
25 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', 25 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min',
26 - 'bootstrap-typeahead': '../libs/bootstrap3-typeahead/bootstrap3-typeahead.min',  
27 - 'bootstrap-tagsinput': '../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.min',  
28 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', 26 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min',
29 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', 27 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min',
30 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', 28 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min',
@@ -32,8 +30,6 @@ require.config({ @@ -32,8 +30,6 @@ require.config({
32 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', 30 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min',
33 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', 31 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile',
34 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', 32 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN',
35 - 'typeahead': '../libs/typeahead.js/dist/typeahead.jquery.min',  
36 - 'bloodhound': '../libs/typeahead.js/dist/bloodhound.min',  
37 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', 33 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min',
38 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', 34 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min',
39 'less': '../libs/less/dist/less.min', 35 'less': '../libs/less/dist/less.min',
@@ -90,12 +86,6 @@ require.config({ @@ -90,12 +86,6 @@ require.config({
90 deps: ['bootstrap', 'slimscroll'], 86 deps: ['bootstrap', 'slimscroll'],
91 exports: '$.AdminLTE' 87 exports: '$.AdminLTE'
92 }, 88 },
93 - 'typeahead': {  
94 - deps: ['jquery'],  
95 - init: function ($) {  
96 - return require.s.contexts._.registry['typeahead.js'].factory($);  
97 - }  
98 - },  
99 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], 89 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'],
100 'bootstrap-checkbox': ['jquery'], 90 'bootstrap-checkbox': ['jquery'],
101 'bootstrap-radio': ['jquery'], 91 'bootstrap-radio': ['jquery'],
@@ -105,12 +95,6 @@ require.config({ @@ -105,12 +95,6 @@ require.config({
105 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', 95 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
106 'moment/locale/zh-cn', 96 'moment/locale/zh-cn',
107 ], 97 ],
108 - 'bootstrap-tagsinput': [  
109 - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css',  
110 - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.css',  
111 - 'jquery',  
112 - 'typeahead'  
113 - ],  
114 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], 98 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ],
115 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], 99 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'],
116 // 'toastr': ['css!../libs/toastr/toastr.min.css'], 100 // 'toastr': ['css!../libs/toastr/toastr.min.css'],
@@ -37,8 +37,6 @@ require.config({ @@ -37,8 +37,6 @@ require.config({
37 'jquery': '../libs/jquery/dist/jquery.min', 37 'jquery': '../libs/jquery/dist/jquery.min',
38 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min', 38 'bootstrap': '../libs/bootstrap/dist/js/bootstrap.min',
39 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min', 39 'bootstrap-validator': '../libs/bootstrap-validator/dist/validator.min',
40 - 'bootstrap-typeahead': '../libs/bootstrap3-typeahead/bootstrap3-typeahead.min',  
41 - 'bootstrap-tagsinput': '../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.min',  
42 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min', 40 'bootstrap-dialog': '../libs/bootstrap3-dialog/dist/js/bootstrap-dialog.min',
43 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min', 41 'bootstrap-datetimepicker': '../libs/eonasdan-bootstrap-datetimepicker/build/js/bootstrap-datetimepicker.min',
44 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min', 42 'bootstrap-select': '../libs/bootstrap-select/dist/js/bootstrap-select.min',
@@ -46,8 +44,6 @@ require.config({ @@ -46,8 +44,6 @@ require.config({
46 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min', 44 'bootstrap-table-export': '../libs/bootstrap-table/dist/extensions/export/bootstrap-table-export.min',
47 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile', 45 'bootstrap-table-mobile': '../libs/bootstrap-table/dist/extensions/mobile/bootstrap-table-mobile',
48 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN', 46 'bootstrap-table-lang': '../libs/bootstrap-table/dist/locale/bootstrap-table-zh-CN',
49 - 'typeahead': '../libs/typeahead.js/dist/typeahead.jquery.min',  
50 - 'bloodhound': '../libs/typeahead.js/dist/bloodhound.min',  
51 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min', 47 'tableexport': '../libs/tableExport.jquery.plugin/tableExport.min',
52 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min', 48 'dropzone': '../libs/dropzone/dist/min/dropzone-amd-module.min',
53 'less': '../libs/less/dist/less.min', 49 'less': '../libs/less/dist/less.min',
@@ -104,12 +100,6 @@ require.config({ @@ -104,12 +100,6 @@ require.config({
104 deps: ['bootstrap', 'slimscroll'], 100 deps: ['bootstrap', 'slimscroll'],
105 exports: '$.AdminLTE' 101 exports: '$.AdminLTE'
106 }, 102 },
107 - 'typeahead': {  
108 - deps: ['jquery'],  
109 - init: function ($) {  
110 - return require.s.contexts._.registry['typeahead.js'].factory($);  
111 - }  
112 - },  
113 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'], 103 'crontab': ['../libs/jqcron/src/jqCron', 'css!../libs/jqcron/src/jqCron.css'],
114 'bootstrap-checkbox': ['jquery'], 104 'bootstrap-checkbox': ['jquery'],
115 'bootstrap-radio': ['jquery'], 105 'bootstrap-radio': ['jquery'],
@@ -119,12 +109,6 @@ require.config({ @@ -119,12 +109,6 @@ require.config({
119 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css', 109 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
120 'moment/locale/zh-cn', 110 'moment/locale/zh-cn',
121 ], 111 ],
122 - 'bootstrap-tagsinput': [  
123 - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput-typeahead.css',  
124 - 'css!../libs/bootstrap-tagsinput/dist/bootstrap-tagsinput.css',  
125 - 'jquery',  
126 - 'typeahead'  
127 - ],  
128 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ], 112 'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ],
129 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'], 113 'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'],
130 // 'toastr': ['css!../libs/toastr/toastr.min.css'], 114 // 'toastr': ['css!../libs/toastr/toastr.min.css'],
@@ -271,14 +271,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table', @@ -271,14 +271,16 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
271 //渲染fontawesome图标 271 //渲染fontawesome图标
272 return '<i class="' + value + '"></i> ' + value; 272 return '<i class="' + value + '"></i> ' + value;
273 }, 273 },
274 - image: function (value, row, index) {  
275 - return '<img class="img-rounded img-sm" src="' + Backend.api.cdnurl(value) + '" />'; 274 + image: function (value, row, index, custom) {
  275 + var classname = typeof custom !== 'undefined' ? custom : 'img-rounded img-sm';
  276 + return '<img class="' + classname + '" src="' + Backend.api.cdnurl(value) + '" />';
276 }, 277 },
277 - images: function (value, row, index) { 278 + images: function (value, row, index, custom) {
  279 + var classname = typeof custom !== 'undefined' ? custom : 'img-rounded img-sm';
278 var arr = value.split(','); 280 var arr = value.split(',');
279 var html = []; 281 var html = [];
280 $.each(arr, function (i, value) { 282 $.each(arr, function (i, value) {
281 - html.push('<img class="img-rounded img-sm" src="' + Backend.api.cdnurl(value) + '" />'); 283 + html.push('<img class="' + classname + '" src="' + Backend.api.cdnurl(value) + '" />');
282 }); 284 });
283 return html.join(' '); 285 return html.join(' ');
284 }, 286 },
@@ -343,7 +345,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table', @@ -343,7 +345,6 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
343 var html = []; 345 var html = [];
344 if (showweigh) 346 if (showweigh)
345 html.push('<a href="javascript:;" class="btn btn-primary btn-dragsort btn-xs"><i class="fa fa-arrows"></i></a>'); 347 html.push('<a href="javascript:;" class="btn btn-primary btn-dragsort btn-xs"><i class="fa fa-arrows"></i></a>');
346 -  
347 if (showedit) 348 if (showedit)
348 html.push('<a href="javascript:;" class="btn btn-success btn-editone btn-xs"><i class="fa fa-pencil"></i></a>'); 349 html.push('<a href="javascript:;" class="btn btn-success btn-editone btn-xs"><i class="fa fa-pencil"></i></a>');
349 if (showdel) 350 if (showdel)
@@ -14,6 +14,7 @@ @@ -14,6 +14,7 @@
14 @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css"); 14 @import url("../libs/bootstrap-table/dist/bootstrap-table.min.css");
15 @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css"); 15 @import url("../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css");
16 @import url("../libs/nice-validator/dist/jquery.validator.css"); 16 @import url("../libs/nice-validator/dist/jquery.validator.css");
  17 +@import url("../libs/selectpage/selectpage.css");
17 18
18 .clearfix() { 19 .clearfix() {
19 &:before, 20 &:before,