diff --git a/application/admin/controller/Addon.php b/application/admin/controller/Addon.php
index 2fdd345..b7d033b 100644
--- a/application/admin/controller/Addon.php
+++ b/application/admin/controller/Addon.php
@@ -259,7 +259,7 @@ class Addon extends Backend
                     Service::importsql($name);
 
                     $info['config'] = get_addon_config($name) ? 1 : 0;
-                    $this->success(__('Installed tips'), null, ['addon' => $info]);
+                    $this->success(__('Offline installed tips'), null, ['addon' => $info]);
                 }
                 catch (Exception $e)
                 {
diff --git a/application/admin/lang/zh-cn/addon.php b/application/admin/lang/zh-cn/addon.php
index be91ce4..7f3257a 100644
--- a/application/admin/lang/zh-cn/addon.php
+++ b/application/admin/lang/zh-cn/addon.php
@@ -7,6 +7,7 @@ return [
     'Array key'                      => '键',
     'Array value'                    => '值',
     'File'                           => '文件',
+    'Donate'                         => '打赏作者',
     'Warmtips'                       => '温馨提示',
     'Offline install'                => '离线安装',
     'Refresh addon cache'            => '刷新插件缓存',
@@ -21,7 +22,11 @@ return [
     'Pay click tips'                 => '请点击这里在新窗口中进行支付!',
     'Pay new window tips'            => '请在新弹出的窗口中进行支付,支付完成后再重新点击安装按钮进行安装!',
     'Uninstall tips'                 => '确认卸载插件?<p class="text-danger">卸载将会删除所有插件文件且不可找回!!! 插件如果有创建数据库表请手动删除!!!</p>如有重要数据请备份后再操作!',
-    'Installed tips'                 => '插件安装成功,你需要手动启用该插件,使之生效',
+    'Offline installed tips'         => '插件安装成功!你需要手动启用该插件,并清除缓存使之生效',
+    'Online installed tips'          => '插件安装成功!清除插件缓存和框架缓存后生效!',
+    'Not login tips'                 => '你当前未登录FastAdmin,登录后将同步已购买的记录,下载时无需二次付费!',
+    'Login now'                      => '立即登录',
+    'Continue install'               => '不登录,继续安装',
     'Recommend'                      => '推荐',
     'Hot'                            => '热门',
     'New'                            => '新',
diff --git a/application/admin/view/addon/index.html b/application/admin/view/addon/index.html
index 12234e4..d0c4aa9 100644
--- a/application/admin/view/addon/index.html
+++ b/application/admin/view/addon/index.html
@@ -2,16 +2,13 @@
     .item-addon{margin-left:15px;margin-bottom:15px;}
     .item-addon img.img-responsive,.item-addon .noimage{width: 300px;height:200px;}
     .noimage {line-height: 200px;text-align: center;background:#18bc9c;color:#fff;}
-    .addon {
-        position: relative;
-    }
-    .addon > span {
-        position:absolute;left:15px;top:15px;
-    }
-    .layui-layer-pay .layui-layer-content {
-        padding:0;height:600px!important;
-    }
+    .addon {position: relative;}
+    .addon > span {position:absolute;left:15px;top:15px;}
+    .layui-layer-pay .layui-layer-content {padding:0;height:600px!important;}
     .layui-layer-pay {border:none;}
+    .payimg{position:relative;width:800px;height:600px;}
+    .payimg .alipaycode {position:absolute;left:265px;top:442px;}
+    .payimg .wechatcode {position:absolute;left:660px;top:442px;}
 </style>
 <div id="warmtips" class="alert alert-dismissable alert-danger hide">
     <button type="button" class="close" data-dismiss="alert">×</button>
@@ -79,13 +76,15 @@
     </div>
 </script>
 <script id="paytpl" type="text/html">
-    <div style="position:relative;width:800px;height:600px;background:url('<%=payimg%>') 0 0 no-repeat;">
-        <div style="position:absolute;left:265px;top:442px;">
+    <div class="payimg" style="background:url('<%=payimg%>') 0 0 no-repeat;background-size:cover;">
+        <%if(paycode){%>
+        <div class="alipaycode">
             <%=paycode%>
         </div>
-        <div style="position:absolute;left:660px;top:442px;">
+        <div class="wechatcode">
             <%=paycode%>
         </div>
+        <%}%>
     </div>
 </script>
 <script id="conflicttpl" type="text/html">
@@ -146,7 +145,7 @@
                 <p class="text-muted">{:__('Createtime')}: <%=Moment(item.createtime*1000).format("YYYY-MM-DD HH:mm:ss")%></p>
                 <p class="operate" data-id="<%=item.id%>" data-name="<%=item.name%>">
                     <% if(!addon){ %>
-                    <a href="javascript:;" class="btn btn-primary btn-success btn-install" data-type="<%=item.price<=0?'free':'price';%>"><i class="fa fa-cloud-download"></i> {:__('Install')}</a> 
+                    <a href="javascript:;" class="btn btn-primary btn-success btn-install" data-type="<%=item.price<=0?'free':'price';%>" data-donateimage="<%=item.donateimage%>"><i class="fa fa-cloud-download"></i> {:__('Install')}</a> 
                     <% if(item.demourl){ %>
                     <a href="<%=item.demourl%>" class="btn btn-primary btn-info btn-demo" target="_blank"><i class="fa fa-flash"></i> {:__('Demo')}</a> 
                     <% } %>
diff --git a/application/common/controller/Backend.php b/application/common/controller/Backend.php
index 87bfb6b..0a85e21 100644
--- a/application/common/controller/Backend.php
+++ b/application/common/controller/Backend.php
@@ -262,7 +262,21 @@ class Backend extends Controller
                     break;
                 case 'BETWEEN':
                 case 'NOT BETWEEN':
-                    $where[] = [$k, $sym, array_slice(explode(',', $v), 0, 2)];
+                    $arr = array_slice(explode(',', $v), 0, 2);
+                    if (stripos($v, ',') === false || !array_filter($arr))
+                        continue;
+                    //当出现一边为空时改变操作符
+                    if ($arr[0] === '')
+                    {
+                        $sym = $sym == 'BETWEEN' ? '<=' : '>';
+                        $arr = $arr[1];
+                    }
+                    else if ($arr[1] === '')
+                    {
+                        $sym = $sym == 'BETWEEN' ? '>=' : '<';
+                        $arr = $arr[0];
+                    }
+                    $where[] = [$k, $sym, $arr];
                     break;
                 case 'LIKE':
                 case 'LIKE %...%':
diff --git a/public/assets/js/backend/addon.js b/public/assets/js/backend/addon.js
index 3bf6c84..d9c9319 100644
--- a/public/assets/js/backend/addon.js
+++ b/public/assets/js/backend/addon.js
@@ -120,6 +120,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
 
             // 点击安装
             $(document).on("click", ".btn-install", function () {
+                var that = this;
                 var name = $(this).closest(".operate").data("name");
                 var userinfo = Controller.api.userinfo.get();
                 var uid = userinfo ? userinfo.id : 0;
@@ -131,6 +132,24 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
                     }, function (data, ret) {
                         Layer.closeAll();
                         Config['addons'][data.addon.name] = ret.data.addon;
+                        Layer.alert(__('Online installed tips'), {
+                            btn: [__('OK'), __('Donate')],
+                            title: __('Warning'),
+                            icon: 1,
+                            btn2: function () {
+                                //打赏
+                                Layer.open({
+                                    content: Template("paytpl", {payimg: $(that).data("donateimage")}),
+                                    shade: 0.8,
+                                    area: ['800px', '600px'],
+                                    skin: 'layui-layer-msg layui-layer-pay',
+                                    title: false,
+                                    closeBtn: true,
+                                    btn: false,
+                                    resize: false,
+                                });
+                            }
+                        });
                         $('.btn-refresh').trigger('click');
                     }, function (data, ret) {
                         //如果是需要购买的插件则弹出二维码提示
@@ -183,6 +202,20 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
                         return false;
                     });
                 };
+                if ($(that).data("type") !== 'free') {
+                    if (parseInt(uid) === 0) {
+                        return Layer.alert(__('Not login tips'), {
+                            title: __('Warning'),
+                            btn: [__('Login now'), __('Continue install')],
+                            yes: function (index, layero) {
+                                $(".btn-userinfo").trigger("click");
+                            },
+                            btn2: function () {
+                                install(name, false);
+                            }
+                        });
+                    }
+                }
                 install(name, false);
             });
 
diff --git a/public/assets/js/backend/index.js b/public/assets/js/backend/index.js
index e513512..015021b 100755
--- a/public/assets/js/backend/index.js
+++ b/public/assets/js/backend/index.js
@@ -8,7 +8,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
 
             //双击重新加载页面
             $(document).on("dblclick", ".sidebar-menu li > a", function (e) {
-                $("#tab_" + $(this).attr("addtabs") + " iframe").attr('src', function (i, val) {
+                $("#con_" + $(this).attr("addtabs") + " iframe").attr('src', function (i, val) {
                     return val;
                 });
                 e.stopPropagation();
diff --git a/public/assets/js/bootstrap-table-commonsearch.js b/public/assets/js/bootstrap-table-commonsearch.js
index a9fb98b..947a434 100644
--- a/public/assets/js/bootstrap-table-commonsearch.js
+++ b/public/assets/js/bootstrap-table-commonsearch.js
@@ -3,6 +3,7 @@
  * @version: v0.0.1
  *
  * @update 2017-05-07 <http://git.oschina.net/pp/fastadmin>
+ * @update 2017-09-03 <http://git.oschina.net/karson/fastadmin>
  */
 
 !function ($) {
@@ -19,8 +20,8 @@
         vModal += vFormCommon.join('');
         vModal += "</div>";
         that.$container.prepend($(vModal));
-
-        var form = $("form.form-commonsearch", that.$container);
+        that.$commonsearch = $(".commonsearch-table", that.$container);
+        var form = $("form.form-commonsearch", that.$commonsearch);
 
         //绑定日期时间元素事件
         if ($(".datetimepicker", form).size() > 0) {
@@ -49,25 +50,26 @@
         // 表单提交
         form.on("submit", function (event) {
             event.preventDefault();
-            that.onColumnCommonSearch();
+            that.onCommonSearch();
             return false;
         });
 
         // 重置搜索
         form.on("click", "button[type=reset]", function (event) {
             form[0].reset();
-            that.onColumnCommonSearch();
+            that.onCommonSearch();
         });
 
     };
 
     var createFormCommon = function (pColumns, that) {
         var htmlForm = [];
-        var opList = ['=', '>', '>=', '<', '<=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'IS NULL', 'IS NOT NULL'];
-        htmlForm.push(sprintf('<form class="form-inline form-commonsearch" action="%s" >', that.options.actionForm));
+        var opList = ['=', '>', '>=', '<', '<=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN', 'NOT IN', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'IS NULL', 'IS NOT NULL'];
+        htmlForm.push(sprintf('<form class="form-horizontal form-commonsearch" action="%s" >', that.options.actionForm));
         htmlForm.push('<fieldset>');
         if (that.options.titleForm.length > 0)
             htmlForm.push(sprintf("<legend>%s</legend>", that.options.titleForm));
+        htmlForm.push('<div class="row">');
         for (var i in pColumns) {
             var vObjCol = pColumns[i];
             if (!vObjCol.checkbox && vObjCol.field !== 'operate' && vObjCol.searchable && vObjCol.operate !== false) {
@@ -75,8 +77,11 @@
                 query = query ? query : '';
                 vObjCol.defaultValue = that.options.renderDefault && query != '' ? query : (typeof vObjCol.defaultValue === 'undefined' ? '' : vObjCol.defaultValue);
                 ColumnsForSearch.push(vObjCol);
-                htmlForm.push('<div class="form-group" style="margin:5px">');
-                htmlForm.push(sprintf('<label for="%s" class="control-label" style="padding:0 10px">%s</label>', vObjCol.field, vObjCol.title));
+
+                htmlForm.push('<div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">');
+                htmlForm.push(sprintf('<label for="%s" class="control-label col-xs-4">%s</label>', vObjCol.field, vObjCol.title));
+                htmlForm.push('<div class="col-xs-8">');
+
                 vObjCol.operate = (typeof vObjCol.operate === 'undefined' || $.inArray(vObjCol.operate, opList) === -1) ? '=' : vObjCol.operate;
                 htmlForm.push(sprintf('<input type="hidden" class="form-control operate" name="field-%s" data-name="%s" value="%s" readonly>', vObjCol.field, vObjCol.field, vObjCol.operate));
 
@@ -86,7 +91,7 @@
                         htmlForm.push(sprintf('<select class="form-control" name="%s" %s>%s</select>', vObjCol.field, style, sprintf('<option value="">%s</option>', that.options.formatCommonChoose())));
                         (function (vObjCol, that) {
                             $.when(vObjCol.searchList).done(function (ret) {
-                                
+
                                 var isArray = false;
                                 if (ret.data && ret.data.searchlist && $.isArray(ret.data.searchlist)) {
                                     var resultlist = {};
@@ -126,17 +131,26 @@
                     if (/BETWEEN$/.test(vObjCol.operate)) {
                         var defaultValueArr = /^.+|.+$/.test(defaultValue) ? defaultValue.split('|') : ['', ''];
                         htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[0], placeholder, vObjCol.field, style, data));
-                        htmlForm.push(sprintf('&nbsp;-&nbsp;<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[1], placeholder, vObjCol.field, style, data));
+
+                        htmlForm.push('</div>');
+                        htmlForm.push('</div>');
+                        htmlForm.push('<div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">');
+                        htmlForm.push(sprintf('<label for="%s" class="control-label col-xs-4">%s</label>', vObjCol.field, "-"));
+                        htmlForm.push('<div class="col-xs-8">');
+                        htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[1], placeholder, vObjCol.field, style, data));
                     } else {
                         htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValue, placeholder, vObjCol.field, style, data));
                     }
                 }
 
                 htmlForm.push('</div>');
+                htmlForm.push('</div>');
             }
         }
-
+        htmlForm.push('<div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">');
         htmlForm.push(createFormBtn(that).join(''));
+        htmlForm.push('</div>');
+        htmlForm.push('</div>');
         htmlForm.push('</fieldset>');
         htmlForm.push('</form>');
 
@@ -147,12 +161,10 @@
         var htmlBtn = [];
         var searchSubmit = that.options.formatCommonSubmitButton();
         var searchReset = that.options.formatCommonResetButton();
-        htmlBtn.push('<div class="form-group" style="margin:5px">');
-        htmlBtn.push('<div class="col-sm-12 text-center">');
+        htmlBtn.push('<div class="col-sm-8 col-xs-offset-4">');
         htmlBtn.push(sprintf('<button type="submit" class="btn btn-success" >%s</button> ', searchSubmit));
         htmlBtn.push(sprintf('<button type="reset" class="btn btn-default" >%s</button> ', searchReset));
         htmlBtn.push('</div>');
-        htmlBtn.push('</div>');
         return htmlBtn;
     };
 
@@ -179,7 +191,7 @@
             if (obj.size() > 1) {
                 if (/BETWEEN$/.test(sym)) {
                     var value_begin = $.trim($("[name='" + name + "']:first").val()), value_end = $.trim($("[name='" + name + "']:last").val());
-                    if (!value_begin.length || !value_end.length) {
+                    if (!value_begin.length && !value_end.length) {
                         return true;
                     }
                     if (typeof vObjCol.process === 'function') {
@@ -187,8 +199,8 @@
                         value_end = vObjCol.process(value_end, 'end');
                     } else if ($("[name='" + name + "']:first").attr('type') === 'datetime') { //datetime类型字段转换成时间戳
                         var Hms = Moment(value_begin).format("HH:mm:ss");
-                        value_begin = parseInt(Moment(value_begin) / 1000);
-                        value_end = parseInt(Moment(value_end) / 1000);
+                        value_begin = value_begin ? parseInt(Moment(value_begin) / 1000) : '';
+                        value_end = value_end ? parseInt(Moment(value_end) / 1000) : '';
                         if (value_begin === value_end && '00:00:00' === Hms) {
                             value_end += 86399;
                         }
@@ -217,7 +229,10 @@
         searchFormVisible: true,
         searchClass: 'searchit',
         renderDefault: true,
-        onColumnCommonSearch: function (field, text) {
+        onCommonSearch: function (field, text) {
+            return false;
+        },
+        onPostCommonSearch: function (table) {
             return false;
         }
     });
@@ -227,7 +242,8 @@
     });
 
     $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
-        'column-common-search.bs.table': 'onColumnCommonSearch'
+        'common-search.bs.table': 'onCommonSearch',
+        'post-common-search.bs.table': 'onPostCommonSearch'
     });
 
     $.extend($.fn.bootstrapTable.locales[$.fn.bootstrapTable.defaults.locale], {
@@ -297,6 +313,7 @@
             params.op = JSON.stringify($.extend(params.op || {}, searchQuery.op));
             return params;
         };
+        this.trigger('post-common-search', that);
 
     };
 
@@ -335,40 +352,23 @@
         }) : this.data;
     };
 
-    BootstrapTable.prototype.onColumnCommonSearch = function (event) {
-        if (typeof event === 'undefined') {
-            var searchquery = getSearchQuery(this);
-            // 追加查询关键字
-            this.options.pageNumber = 1;
-            this.options.queryParams = function (params) {
-                return {
-                    search: params.search,
-                    sort: params.sort,
-                    order: params.order,
-                    filter: JSON.stringify(searchquery.filter),
-                    op: JSON.stringify(searchquery.op),
-                    offset: params.offset,
-                    limit: params.limit,
-                };
+    BootstrapTable.prototype.onCommonSearch = function () {
+        var searchquery = getSearchQuery(this);
+        this.trigger('common-search', this, searchquery);
+
+        // 追加查询关键字
+        this.options.pageNumber = 1;
+        this.options.queryParams = function (params) {
+            return {
+                search: params.search,
+                sort: params.sort,
+                order: params.order,
+                filter: JSON.stringify(searchquery.filter),
+                op: JSON.stringify(searchquery.op),
+                offset: params.offset,
+                limit: params.limit,
             };
-            this.refresh({query: {filter: JSON.stringify(searchquery.filter), op: JSON.stringify(searchquery.op)}});
-
-        } else {
-            var text = $.trim($(event.currentTarget).val());
-            var $field = $(event.currentTarget)[0].id;
-
-            if ($.isEmptyObject(this.filterColumnsPartial)) {
-                this.filterColumnsPartial = {};
-            }
-            if (text) {
-                this.filterColumnsPartial[$field] = text;
-            } else {
-                delete this.filterColumnsPartial[$field];
-            }
-            this.options.pageNumber = 1;
-            this.onSearch(event);
-//        this.updatePagination();
-            this.trigger('column-common-search', $field, text);
-        }
+        };
+        this.refresh({query: {filter: JSON.stringify(searchquery.filter), op: JSON.stringify(searchquery.op)}});
     };
 }(jQuery);
diff --git a/public/assets/js/require-backend.min.js b/public/assets/js/require-backend.min.js
index dfe703b..ccc13a3 100644
--- a/public/assets/js/require-backend.min.js
+++ b/public/assets/js/require-backend.min.js
@@ -7283,6 +7283,7 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
  * @version: v0.0.1
  *
  * @update 2017-05-07 <http://git.oschina.net/pp/fastadmin>
+ * @update 2017-09-03 <http://git.oschina.net/karson/fastadmin>
  */
 
 !function ($) {
@@ -7299,8 +7300,8 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
         vModal += vFormCommon.join('');
         vModal += "</div>";
         that.$container.prepend($(vModal));
-
-        var form = $("form.form-commonsearch", that.$container);
+        that.$commonsearch = $(".commonsearch-table", that.$container);
+        var form = $("form.form-commonsearch", that.$commonsearch);
 
         //绑定日期时间元素事件
         if ($(".datetimepicker", form).size() > 0) {
@@ -7329,25 +7330,26 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
         // 表单提交
         form.on("submit", function (event) {
             event.preventDefault();
-            that.onColumnCommonSearch();
+            that.onCommonSearch();
             return false;
         });
 
         // 重置搜索
         form.on("click", "button[type=reset]", function (event) {
             form[0].reset();
-            that.onColumnCommonSearch();
+            that.onCommonSearch();
         });
 
     };
 
     var createFormCommon = function (pColumns, that) {
         var htmlForm = [];
-        var opList = ['=', '>', '>=', '<', '<=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'IS NULL', 'IS NOT NULL'];
-        htmlForm.push(sprintf('<form class="form-inline form-commonsearch" action="%s" >', that.options.actionForm));
+        var opList = ['=', '>', '>=', '<', '<=', '!=', 'LIKE', 'LIKE %...%', 'NOT LIKE', 'IN', 'NOT IN', 'IN(...)', 'NOT IN(...)', 'BETWEEN', 'NOT BETWEEN', 'IS NULL', 'IS NOT NULL'];
+        htmlForm.push(sprintf('<form class="form-horizontal form-commonsearch" action="%s" >', that.options.actionForm));
         htmlForm.push('<fieldset>');
         if (that.options.titleForm.length > 0)
             htmlForm.push(sprintf("<legend>%s</legend>", that.options.titleForm));
+        htmlForm.push('<div class="row">');
         for (var i in pColumns) {
             var vObjCol = pColumns[i];
             if (!vObjCol.checkbox && vObjCol.field !== 'operate' && vObjCol.searchable && vObjCol.operate !== false) {
@@ -7355,8 +7357,11 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
                 query = query ? query : '';
                 vObjCol.defaultValue = that.options.renderDefault && query != '' ? query : (typeof vObjCol.defaultValue === 'undefined' ? '' : vObjCol.defaultValue);
                 ColumnsForSearch.push(vObjCol);
-                htmlForm.push('<div class="form-group" style="margin:5px">');
-                htmlForm.push(sprintf('<label for="%s" class="control-label" style="padding:0 10px">%s</label>', vObjCol.field, vObjCol.title));
+
+                htmlForm.push('<div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">');
+                htmlForm.push(sprintf('<label for="%s" class="control-label col-xs-4">%s</label>', vObjCol.field, vObjCol.title));
+                htmlForm.push('<div class="col-xs-8">');
+
                 vObjCol.operate = (typeof vObjCol.operate === 'undefined' || $.inArray(vObjCol.operate, opList) === -1) ? '=' : vObjCol.operate;
                 htmlForm.push(sprintf('<input type="hidden" class="form-control operate" name="field-%s" data-name="%s" value="%s" readonly>', vObjCol.field, vObjCol.field, vObjCol.operate));
 
@@ -7366,7 +7371,7 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
                         htmlForm.push(sprintf('<select class="form-control" name="%s" %s>%s</select>', vObjCol.field, style, sprintf('<option value="">%s</option>', that.options.formatCommonChoose())));
                         (function (vObjCol, that) {
                             $.when(vObjCol.searchList).done(function (ret) {
-                                
+
                                 var isArray = false;
                                 if (ret.data && ret.data.searchlist && $.isArray(ret.data.searchlist)) {
                                     var resultlist = {};
@@ -7406,17 +7411,26 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
                     if (/BETWEEN$/.test(vObjCol.operate)) {
                         var defaultValueArr = /^.+|.+$/.test(defaultValue) ? defaultValue.split('|') : ['', ''];
                         htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[0], placeholder, vObjCol.field, style, data));
-                        htmlForm.push(sprintf('&nbsp;-&nbsp;<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[1], placeholder, vObjCol.field, style, data));
+
+                        htmlForm.push('</div>');
+                        htmlForm.push('</div>');
+                        htmlForm.push('<div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">');
+                        htmlForm.push(sprintf('<label for="%s" class="control-label col-xs-4">%s</label>', vObjCol.field, "-"));
+                        htmlForm.push('<div class="col-xs-8">');
+                        htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValueArr[1], placeholder, vObjCol.field, style, data));
                     } else {
                         htmlForm.push(sprintf('<input type="%s" class="%s" name="%s" value="%s" placeholder="%s" id="%s" %s %s>', type, addclass, vObjCol.field, defaultValue, placeholder, vObjCol.field, style, data));
                     }
                 }
 
                 htmlForm.push('</div>');
+                htmlForm.push('</div>');
             }
         }
-
+        htmlForm.push('<div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">');
         htmlForm.push(createFormBtn(that).join(''));
+        htmlForm.push('</div>');
+        htmlForm.push('</div>');
         htmlForm.push('</fieldset>');
         htmlForm.push('</form>');
 
@@ -7427,12 +7441,10 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
         var htmlBtn = [];
         var searchSubmit = that.options.formatCommonSubmitButton();
         var searchReset = that.options.formatCommonResetButton();
-        htmlBtn.push('<div class="form-group" style="margin:5px">');
-        htmlBtn.push('<div class="col-sm-12 text-center">');
+        htmlBtn.push('<div class="col-sm-8 col-xs-offset-4">');
         htmlBtn.push(sprintf('<button type="submit" class="btn btn-success" >%s</button> ', searchSubmit));
         htmlBtn.push(sprintf('<button type="reset" class="btn btn-default" >%s</button> ', searchReset));
         htmlBtn.push('</div>');
-        htmlBtn.push('</div>');
         return htmlBtn;
     };
 
@@ -7459,7 +7471,7 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
             if (obj.size() > 1) {
                 if (/BETWEEN$/.test(sym)) {
                     var value_begin = $.trim($("[name='" + name + "']:first").val()), value_end = $.trim($("[name='" + name + "']:last").val());
-                    if (!value_begin.length || !value_end.length) {
+                    if (!value_begin.length && !value_end.length) {
                         return true;
                     }
                     if (typeof vObjCol.process === 'function') {
@@ -7467,8 +7479,8 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
                         value_end = vObjCol.process(value_end, 'end');
                     } else if ($("[name='" + name + "']:first").attr('type') === 'datetime') { //datetime类型字段转换成时间戳
                         var Hms = Moment(value_begin).format("HH:mm:ss");
-                        value_begin = parseInt(Moment(value_begin) / 1000);
-                        value_end = parseInt(Moment(value_end) / 1000);
+                        value_begin = value_begin ? parseInt(Moment(value_begin) / 1000) : '';
+                        value_end = value_end ? parseInt(Moment(value_end) / 1000) : '';
                         if (value_begin === value_end && '00:00:00' === Hms) {
                             value_end += 86399;
                         }
@@ -7497,7 +7509,10 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
         searchFormVisible: true,
         searchClass: 'searchit',
         renderDefault: true,
-        onColumnCommonSearch: function (field, text) {
+        onCommonSearch: function (field, text) {
+            return false;
+        },
+        onPostCommonSearch: function (table) {
             return false;
         }
     });
@@ -7507,7 +7522,8 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
     });
 
     $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
-        'column-common-search.bs.table': 'onColumnCommonSearch'
+        'common-search.bs.table': 'onCommonSearch',
+        'post-common-search.bs.table': 'onPostCommonSearch'
     });
 
     $.extend($.fn.bootstrapTable.locales[$.fn.bootstrapTable.defaults.locale], {
@@ -7577,6 +7593,7 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
             params.op = JSON.stringify($.extend(params.op || {}, searchQuery.op));
             return params;
         };
+        this.trigger('post-common-search', that);
 
     };
 
@@ -7615,41 +7632,24 @@ return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)
         }) : this.data;
     };
 
-    BootstrapTable.prototype.onColumnCommonSearch = function (event) {
-        if (typeof event === 'undefined') {
-            var searchquery = getSearchQuery(this);
-            // 追加查询关键字
-            this.options.pageNumber = 1;
-            this.options.queryParams = function (params) {
-                return {
-                    search: params.search,
-                    sort: params.sort,
-                    order: params.order,
-                    filter: JSON.stringify(searchquery.filter),
-                    op: JSON.stringify(searchquery.op),
-                    offset: params.offset,
-                    limit: params.limit,
-                };
+    BootstrapTable.prototype.onCommonSearch = function () {
+        var searchquery = getSearchQuery(this);
+        this.trigger('common-search', this, searchquery);
+
+        // 追加查询关键字
+        this.options.pageNumber = 1;
+        this.options.queryParams = function (params) {
+            return {
+                search: params.search,
+                sort: params.sort,
+                order: params.order,
+                filter: JSON.stringify(searchquery.filter),
+                op: JSON.stringify(searchquery.op),
+                offset: params.offset,
+                limit: params.limit,
             };
-            this.refresh({query: {filter: JSON.stringify(searchquery.filter), op: JSON.stringify(searchquery.op)}});
-
-        } else {
-            var text = $.trim($(event.currentTarget).val());
-            var $field = $(event.currentTarget)[0].id;
-
-            if ($.isEmptyObject(this.filterColumnsPartial)) {
-                this.filterColumnsPartial = {};
-            }
-            if (text) {
-                this.filterColumnsPartial[$field] = text;
-            } else {
-                delete this.filterColumnsPartial[$field];
-            }
-            this.options.pageNumber = 1;
-            this.onSearch(event);
-//        this.updatePagination();
-            this.trigger('column-common-search', $field, text);
-        }
+        };
+        this.refresh({query: {filter: JSON.stringify(searchquery.filter), op: JSON.stringify(searchquery.op)}});
     };
 }(jQuery);