فهرست منبع

新增跨页记忆已选中的行
新增多个扁平化样式按钮
优化表格高亮颜色

Karson 4 سال پیش
والد
کامیت
13da01a48c

+ 2 - 0
application/admin/lang/zh-cn.php

@@ -163,6 +163,8 @@ return [
     'File is too big (%sMiB), Max filesize: %sMiB'          => '当前上传(%sM),最大允许上传文件大小:%sM',
     'An unexpected error occurred'                          => '发生了一个意外错误,程序猿正在紧急处理中',
     'This page will be re-directed in %s seconds'           => '页面将在 %s 秒后自动跳转',
+    'Click to uncheck all'                                  => '点击取消全部',
+    'Multiple selection mode: %s checked'                    => '跨页选择模式,已选 %s 项',
     //菜单
     'Dashboard'                                             => '控制台',
     'General'                                               => '常规管理',

+ 3 - 0
public/assets/css/backend.css

@@ -637,6 +637,9 @@ form.form-horizontal .control-label {
 .fixed-table-container {
   border: none !important;
 }
+.fixed-table-container tbody .selected td {
+  background-color: rgba(216, 224, 230, 0.5);
+}
 /*修复nice-validator新版下的一处BUG*/
 .nice-validator input,
 .nice-validator select,

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
public/assets/css/backend.min.css


+ 64 - 0
public/assets/css/fastadmin.css

@@ -2378,6 +2378,70 @@ select.form-control {
 .btn-default.hover {
   background-color: #e7e7e7;
 }
+.btn-primary-light {
+  background-color: #E2E5E8;
+  border-color: #D0D4D8;
+  color: #85878A;
+}
+.btn-primary-light:hover,
+.btn-primary-light:active,
+.btn-primary-light.hover {
+  background-color: #d4d8dd;
+  border-color: #c6ccd1;
+  color: #85878A;
+}
+.btn-success-light {
+  background-color: #dff0d8;
+  border-color: #d1eac8;
+  color: #468847;
+}
+.btn-success-light:hover,
+.btn-success-light:active,
+.btn-success-light.hover {
+  background-color: #d0e9c6;
+  border-color: #c1e2b3;
+  color: #468847;
+}
+.btn-danger-light,
+.btn-error-light {
+  background-color: #f2dede;
+  border-color: #ebcdcd;
+  color: #b94a48;
+}
+.btn-danger-light:hover,
+.btn-error-light:hover,
+.btn-danger-light:active,
+.btn-error-light:active,
+.btn-danger-light.hover,
+.btn-error-light.hover {
+  background-color: #ebcccc;
+  border-color: #e4b9b9;
+  color: #b94a48;
+}
+.btn-warning-light {
+  background-color: #fcf8e3;
+  border-color: #faf3cd;
+  color: #c09853;
+}
+.btn-warning-light:hover,
+.btn-warning-light:active,
+.btn-warning-light.hover {
+  background-color: #faf2cc;
+  border-color: #f7ecb5;
+  color: #c09853;
+}
+.btn-info-light {
+  background-color: #d9edf7;
+  border-color: #c6e4f3;
+  color: #3a87ad;
+}
+.btn-info-light:hover,
+.btn-info-light:active,
+.btn-info-light.hover {
+  background-color: #c4e3f3;
+  border-color: #afd9ee;
+  color: #3a87ad;
+}
 .btn-outline {
   border: 1px solid #fff;
   background: transparent;

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
public/assets/css/frontend.min.css


+ 3 - 9
public/assets/js/backend/general/attachment.js

@@ -72,6 +72,8 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
                 }
             });
             var urlArr = [];
+            var multiple = Backend.api.query('multiple');
+            multiple = multiple == 'true' ? true : false;
 
             var table = $("#table");
 
@@ -101,7 +103,7 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
                 showExport: false,
                 columns: [
                     [
-                        {field: 'state', checkbox: true},
+                        {field: 'state', checkbox: multiple, visible: multiple},
                         {field: 'id', title: __('Id')},
                         {field: 'admin_id', title: __('Admin_id'), formatter: Table.api.formatter.search, visible: false},
                         {field: 'user_id', title: __('User_id'), formatter: Table.api.formatter.search, visible: false},
@@ -119,8 +121,6 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
                         {
                             field: 'operate', title: __('Operate'), events: {
                                 'click .btn-chooseone': function (e, value, row, index) {
-                                    var multiple = Backend.api.query('multiple');
-                                    multiple = multiple == 'true' ? true : false;
                                     Fast.api.close({url: row.url, multiple: multiple});
                                 },
                             }, formatter: function () {
@@ -133,12 +133,6 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
 
             // 选中多个
             $(document).on("click", ".btn-choose-multi", function () {
-                // var urlArr = [];
-                // $.each(table.bootstrapTable("getAllSelections"), function (i, j) {
-                //     urlArr.push(j.url);
-                // });
-                var multiple = Backend.api.query('multiple');
-                multiple = multiple == 'true' ? true : false;
                 Fast.api.close({url: urlArr.join(","), multiple: multiple});
             });
 

+ 1 - 0
public/assets/js/bootstrap-table-commonsearch.js

@@ -295,6 +295,7 @@
                 $(this).css("min-width", column['width']);
             }
         });
+        this.options.stateField = this.header.stateField;
     };
     BootstrapTable.prototype.initToolbar = function () {
         _initToolbar.apply(this, Array.prototype.slice.apply(arguments));

+ 104 - 34
public/assets/js/require-backend.min.js

@@ -10808,6 +10808,7 @@ define('form',['jquery', 'bootstrap', 'upload', 'validator'], function ($, undef
                 $(this).css("min-width", column['width']);
             }
         });
+        this.options.stateField = this.header.stateField;
     };
     BootstrapTable.prototype.initToolbar = function () {
         _initToolbar.apply(this, Array.prototype.slice.apply(arguments));
@@ -11097,6 +11098,8 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
             cardView: false, //卡片视图
             checkOnInit: true, //是否在初始化时判断
             escape: true, //是否对内容进行转义
+            selectedIds: [],
+            selectedData: [],
             extend: {
                 index_url: '',
                 add_url: '',
@@ -11113,7 +11116,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
             valign: 'middle',
         },
         config: {
-            firsttd: 'tbody>tr>td.bs-checkbox',
+            checkboxtd: 'tbody>tr>td.bs-checkbox',
             toolbar: '.toolbar',
             refreshbtn: '.btn-refresh',
             addbtn: '.btn-add',
@@ -11161,6 +11164,9 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                 if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) {
                     Table.defaults.cardView = true;
                 }
+                $.fn.bootstrapTable.Constructor.prototype.getSelectItem = function () {
+                    return this.$selectItem;
+                };
                 // 写入bootstrap-table默认配置
                 $.extend(true, $.fn.bootstrapTable.defaults, Table.defaults, defaults);
                 // 写入bootstrap-table column配置
@@ -11198,7 +11204,24 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                 var options = table.bootstrapTable('getOptions');
                 //Bootstrap操作区
                 var toolbar = $(options.toolbar, parenttable);
+                //跨页提示按钮
+                var tipsBtn = $(".btn-selected-tips", parenttable);
+                if (tipsBtn.size() === 0) {
+                    tipsBtn = $('<a href="javascript:" class="btn btn-warning-light btn-selected-tips hide" data-animation="false" data-toggle="tooltip" data-title="' + __("Click to uncheck all") + '"><i class="fa fa-info-circle"></i> ' + __("Multiple selection mode: %s checked", "<b>0</b>") + '</a>').appendTo(toolbar);
+                }
+                //点击提示按钮
+                tipsBtn.off("click").on("click", function (e) {
+                    table.trigger("uncheckbox");
+                    table.bootstrapTable("refresh");
+                });
                 //当刷新表格时
+                table.on('uncheckbox', function (status, res, e) {
+                    options.selectedIds = [];
+                    options.selectedData = [];
+                    tipsBtn.tooltip('hide');
+                    tipsBtn.addClass('hide');
+                });
+                //表格加载出错时
                 table.on('load-error.bs.table', function (status, res, e) {
                     if (e.status === 0) {
                         return;
@@ -11215,21 +11238,30 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                 table.on('refresh.bs.table', function (e, settings, data) {
                     $(Table.config.refreshbtn, toolbar).find(".fa").addClass("fa-spin");
                 });
+                //当执行搜索时
+                table.on('search.bs.table common-search.bs.table', function (e, settings, data) {
+                    table.trigger("uncheckbox");
+                });
                 if (options.dblClickToEdit) {
                     //当双击单元格时
                     table.on('dbl-click-row.bs.table', function (e, row, element, field) {
                         $(Table.config.editonebtn, element).trigger("click");
                     });
                 }
+                //渲染内容前
+                table.on('pre-body.bs.table', function (e, data) {
+                    $.each(data, function (i, row) {
+                        row[options.stateField] = $.inArray(row[options.pk], options.selectedIds) > -1;
+                    });
+                });
                 //当内容渲染完成后
                 table.on('post-body.bs.table', function (e, settings, json, xhr) {
                     $(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
-                    $(Table.config.disabledbtn, toolbar).toggleClass('disabled', true);
-                    if ($(Table.config.firsttd + ":first", table).find("input[type='checkbox'][data-index]").size() > 0) {
+                    if ($(Table.config.checkboxtd + ":first", table).find("input[type='checkbox'][data-index]").size() > 0) {
                         // 拖拽选择,需要重新绑定事件
                         require(['drag', 'drop'], function () {
-                            var firsttd = $(Table.config.firsttd, table);
-                            firsttd.drag("start", function (ev, dd) {
+                            var checkboxtd = $(Table.config.checkboxtd, table);
+                            checkboxtd.drag("start", function (ev, dd) {
                                 return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
                             }).drag(function (ev, dd) {
                                 $(dd.proxy).css({
@@ -11241,7 +11273,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                             }).drag("end", function (ev, dd) {
                                 $(dd.proxy).remove();
                             });
-                            firsttd.drop("start", function () {
+                            checkboxtd.drop("start", function () {
                                 Table.api.toggleattr(this);
                             }).drop(function () {
                                 Table.api.toggleattr(this);
@@ -11255,9 +11287,32 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                     }
                 });
                 // 处理选中筛选框后按钮的状态统一变更
-                table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function () {
-                    var ids = Table.api.selectedids(table);
-                    $(Table.config.disabledbtn, toolbar).toggleClass('disabled', !ids.length);
+                table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table post-body.bs.table', function (e) {
+                    var allIds = table.bootstrapTable("getData").map(function (item) {
+                        return item[options.pk];
+                    });
+                    var selectedIds = Table.api.selectedids(table, true),
+                        selectedData = Table.api.selecteddata(table, true);
+                    //开启分页checkbox分页记忆
+                    if (options.maintainSelected) {
+                        options.selectedIds = options.selectedIds.filter(function (element, index, self) {
+                            return $.inArray(element, allIds) === -1;
+                        }).concat(selectedIds);
+                        options.selectedData = options.selectedData.filter(function (element, index, self) {
+                            return $.inArray(element[options.pk], allIds) === -1;
+                        }).concat(selectedData);
+                        if (options.selectedIds.length > selectedIds.length) {
+                            $("b", tipsBtn).text(options.selectedIds.length);
+                            tipsBtn.removeClass('hide');
+                        } else {
+                            tipsBtn.addClass('hide');
+                        }
+                    } else {
+                        options.selectedIds = selectedIds;
+                        options.selectedData = selectedData;
+                    }
+                    $(Table.config.disabledbtn, toolbar).toggleClass('disabled', !options.selectedIds.length);
+
                 });
                 // 绑定TAB事件
                 $('.panel-heading [data-field] a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
@@ -11269,15 +11324,16 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                     } else {
                         object.val(value);
                     }
+                    table.trigger("uncheckbox");
                     table.bootstrapTable('refresh', {pageNumber: 1});
                     return false;
                 });
                 // 刷新按钮事件
-                $(toolbar).on('click', Table.config.refreshbtn, function () {
+                toolbar.on('click', Table.config.refreshbtn, function () {
                     table.bootstrapTable('refresh');
                 });
                 // 添加按钮事件
-                $(toolbar).on('click', Table.config.addbtn, function () {
+                toolbar.on('click', Table.config.addbtn, function () {
                     var ids = Table.api.selectedids(table);
                     var url = options.extend.add_url;
                     if (url.indexOf("{ids}") !== -1) {
@@ -11293,19 +11349,24 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                                 url: options.extend.import_url,
                                 data: {file: data.url},
                             }, function (data, ret) {
+                                table.trigger("uncheckbox");
                                 table.bootstrapTable('refresh');
                             });
                         });
                     });
                 }
                 // 批量编辑按钮事件
-                $(toolbar).on('click', Table.config.editbtn, function () {
+                toolbar.on('click', Table.config.editbtn, function () {
                     var that = this;
+                    var ids = Table.api.selectedids(table);
+                    if (ids.length > 10) {
+                        return;
+                    }
                     //循环弹出多个编辑框
-                    $.each(table.bootstrapTable('getSelections'), function (index, row) {
+                    $.each(Table.api.selecteddata(table), function (index, row) {
                         var url = options.extend.edit_url;
                         row = $.extend({}, row ? row : {}, {ids: row[options.pk]});
-                        var url = Table.api.replaceurl(url, row, table);
+                        url = Table.api.replaceurl(url, row, table);
                         Fast.api.open(url, __('Edit'), $(that).data() || {});
                     });
                 });
@@ -11316,6 +11377,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                         var url = $(that).data("url") ? $(that).data("url") : $(that).attr("href");
                         Fast.api.ajax(url, function () {
                             Layer.closeAll();
+                            table.trigger("uncheckbox");
                             table.bootstrapTable('refresh');
                         }, function () {
                             Layer.closeAll();
@@ -11328,17 +11390,18 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                     var that = this;
                     var url = $(that).data("url") ? $(that).data("url") : $(that).attr("href");
                     Fast.api.ajax(url, function () {
+                        table.trigger("uncheckbox");
                         table.bootstrapTable('refresh');
                     });
                     return false;
                 });
                 // 批量操作按钮事件
-                $(toolbar).on('click', Table.config.multibtn, function () {
+                toolbar.on('click', Table.config.multibtn, function () {
                     var ids = Table.api.selectedids(table);
                     Table.api.multi($(this).data("action"), ids, table, this);
                 });
                 // 批量删除按钮事件
-                $(toolbar).on('click', Table.config.delbtn, function () {
+                toolbar.on('click', Table.config.delbtn, function () {
                     var that = this;
                     var ids = Table.api.selectedids(table);
                     Layer.confirm(
@@ -11400,16 +11463,15 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                         placeHolderTemplate: ""
                     });
                 });
-                $(table).on("click", "input[data-id][name='checkbox']", function (e) {
+                table.on("click", "input[data-id][name='checkbox']", function (e) {
                     var ids = $(this).data("id");
-                    var row = Table.api.getrowbyid(table, ids);
-                    table.trigger('check.bs.table', [row, this]);
+                    table.bootstrapTable($(this).prop("checked") ? 'checkBy' : 'uncheckBy', {field: options.pk, values: [ids]});
                 });
-                $(table).on("click", "[data-id].btn-change", function (e) {
+                table.on("click", "[data-id].btn-change", function (e) {
                     e.preventDefault();
                     Table.api.multi($(this).data("action") ? $(this).data("action") : '', [$(this).data("id")], table, this);
                 });
-                $(table).on("click", "[data-id].btn-edit", function (e) {
+                table.on("click", "[data-id].btn-edit", function (e) {
                     e.preventDefault();
                     var ids = $(this).data("id");
                     var row = Table.api.getrowbyid(table, ids);
@@ -11417,7 +11479,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                     var url = Table.api.replaceurl(options.extend.edit_url, row, table);
                     Fast.api.open(url, __('Edit'), $(this).data() || {});
                 });
-                $(table).on("click", "[data-id].btn-del", function (e) {
+                table.on("click", "[data-id].btn-del", function (e) {
                     e.preventDefault();
                     var id = $(this).data("id");
                     var that = this;
@@ -11438,11 +11500,12 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
             multi: function (action, ids, table, element) {
                 var options = table.bootstrapTable('getOptions');
                 var data = element ? $(element).data() : {};
-                var ids = ($.isArray(ids) ? ids.join(",") : ids);
+                ids = ($.isArray(ids) ? ids.join(",") : ids);
                 var url = typeof data.url !== "undefined" ? Table.api.replaceurl(data.url, {ids: ids}, table) : (action == "del" ? options.extend.del_url : options.extend.multi_url);
                 var params = typeof data.params !== "undefined" ? (typeof data.params == 'object' ? $.param(data.params) : data.params) : '';
-                var options = {url: url, data: {action: action, ids: ids, params: params}};
+                options = {url: url, data: {action: action, ids: ids, params: params}};
                 Fast.api.ajax(options, function (data, ret) {
+                    table.trigger("uncheckbox");
                     var success = $(element).data("success") || $.noop;
                     if (typeof success === 'function') {
                         if (false === success.call(element, data, ret)) {
@@ -11777,17 +11840,24 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
                 return url;
             },
             // 获取选中的条目ID集合
-            selectedids: function (table) {
+            selectedids: function (table, current) {
                 var options = table.bootstrapTable('getOptions');
-                if (options.templateView) {
-                    return $.map($("input[data-id][name='checkbox']:checked"), function (dom) {
-                        return $(dom).data("id");
-                    });
-                } else {
-                    return $.map(table.bootstrapTable('getSelections'), function (row) {
-                        return row[options.pk];
-                    });
+                //如果有设置翻页记忆模式
+                if (!current && options.maintainSelected) {
+                    return options.selectedIds;
+                }
+                return $.map(table.bootstrapTable('getSelections'), function (row) {
+                    return row[options.pk];
+                });
+            },
+            //获取选中的数据
+            selecteddata: function (table, current) {
+                var options = table.bootstrapTable('getOptions');
+                //如果有设置翻页记忆模式
+                if (!current && options.maintainSelected) {
+                    return options.selectedData;
                 }
+                return table.bootstrapTable('getSelections');
             },
             // 切换复选框状态
             toggleattr: function (table) {
@@ -11807,7 +11877,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
             getrowbyid: function (table, id) {
                 var row = {};
                 var options = table.bootstrapTable("getOptions");
-                $.each(table.bootstrapTable('getData'), function (i, j) {
+                $.each(Table.api.selecteddata(table), function (i, j) {
                     if (j[options.pk] == id) {
                         row = j;
                         return false;

+ 103 - 34
public/assets/js/require-table.js

@@ -41,6 +41,8 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
             cardView: false, //卡片视图
             checkOnInit: true, //是否在初始化时判断
             escape: true, //是否对内容进行转义
+            selectedIds: [],
+            selectedData: [],
             extend: {
                 index_url: '',
                 add_url: '',
@@ -57,7 +59,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
             valign: 'middle',
         },
         config: {
-            firsttd: 'tbody>tr>td.bs-checkbox',
+            checkboxtd: 'tbody>tr>td.bs-checkbox',
             toolbar: '.toolbar',
             refreshbtn: '.btn-refresh',
             addbtn: '.btn-add',
@@ -105,6 +107,9 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                 if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) {
                     Table.defaults.cardView = true;
                 }
+                $.fn.bootstrapTable.Constructor.prototype.getSelectItem = function () {
+                    return this.$selectItem;
+                };
                 // 写入bootstrap-table默认配置
                 $.extend(true, $.fn.bootstrapTable.defaults, Table.defaults, defaults);
                 // 写入bootstrap-table column配置
@@ -142,7 +147,24 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                 var options = table.bootstrapTable('getOptions');
                 //Bootstrap操作区
                 var toolbar = $(options.toolbar, parenttable);
+                //跨页提示按钮
+                var tipsBtn = $(".btn-selected-tips", parenttable);
+                if (tipsBtn.size() === 0) {
+                    tipsBtn = $('<a href="javascript:" class="btn btn-warning-light btn-selected-tips hide" data-animation="false" data-toggle="tooltip" data-title="' + __("Click to uncheck all") + '"><i class="fa fa-info-circle"></i> ' + __("Multiple selection mode: %s checked", "<b>0</b>") + '</a>').appendTo(toolbar);
+                }
+                //点击提示按钮
+                tipsBtn.off("click").on("click", function (e) {
+                    table.trigger("uncheckbox");
+                    table.bootstrapTable("refresh");
+                });
                 //当刷新表格时
+                table.on('uncheckbox', function (status, res, e) {
+                    options.selectedIds = [];
+                    options.selectedData = [];
+                    tipsBtn.tooltip('hide');
+                    tipsBtn.addClass('hide');
+                });
+                //表格加载出错时
                 table.on('load-error.bs.table', function (status, res, e) {
                     if (e.status === 0) {
                         return;
@@ -159,21 +181,30 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                 table.on('refresh.bs.table', function (e, settings, data) {
                     $(Table.config.refreshbtn, toolbar).find(".fa").addClass("fa-spin");
                 });
+                //当执行搜索时
+                table.on('search.bs.table common-search.bs.table', function (e, settings, data) {
+                    table.trigger("uncheckbox");
+                });
                 if (options.dblClickToEdit) {
                     //当双击单元格时
                     table.on('dbl-click-row.bs.table', function (e, row, element, field) {
                         $(Table.config.editonebtn, element).trigger("click");
                     });
                 }
+                //渲染内容前
+                table.on('pre-body.bs.table', function (e, data) {
+                    $.each(data, function (i, row) {
+                        row[options.stateField] = $.inArray(row[options.pk], options.selectedIds) > -1;
+                    });
+                });
                 //当内容渲染完成后
                 table.on('post-body.bs.table', function (e, settings, json, xhr) {
                     $(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
-                    $(Table.config.disabledbtn, toolbar).toggleClass('disabled', true);
-                    if ($(Table.config.firsttd + ":first", table).find("input[type='checkbox'][data-index]").size() > 0) {
+                    if ($(Table.config.checkboxtd + ":first", table).find("input[type='checkbox'][data-index]").size() > 0) {
                         // 拖拽选择,需要重新绑定事件
                         require(['drag', 'drop'], function () {
-                            var firsttd = $(Table.config.firsttd, table);
-                            firsttd.drag("start", function (ev, dd) {
+                            var checkboxtd = $(Table.config.checkboxtd, table);
+                            checkboxtd.drag("start", function (ev, dd) {
                                 return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
                             }).drag(function (ev, dd) {
                                 $(dd.proxy).css({
@@ -185,7 +216,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                             }).drag("end", function (ev, dd) {
                                 $(dd.proxy).remove();
                             });
-                            firsttd.drop("start", function () {
+                            checkboxtd.drop("start", function () {
                                 Table.api.toggleattr(this);
                             }).drop(function () {
                                 Table.api.toggleattr(this);
@@ -199,9 +230,32 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                     }
                 });
                 // 处理选中筛选框后按钮的状态统一变更
-                table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function () {
-                    var ids = Table.api.selectedids(table);
-                    $(Table.config.disabledbtn, toolbar).toggleClass('disabled', !ids.length);
+                table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table post-body.bs.table', function (e) {
+                    var allIds = table.bootstrapTable("getData").map(function (item) {
+                        return item[options.pk];
+                    });
+                    var selectedIds = Table.api.selectedids(table, true),
+                        selectedData = Table.api.selecteddata(table, true);
+                    //开启分页checkbox分页记忆
+                    if (options.maintainSelected) {
+                        options.selectedIds = options.selectedIds.filter(function (element, index, self) {
+                            return $.inArray(element, allIds) === -1;
+                        }).concat(selectedIds);
+                        options.selectedData = options.selectedData.filter(function (element, index, self) {
+                            return $.inArray(element[options.pk], allIds) === -1;
+                        }).concat(selectedData);
+                        if (options.selectedIds.length > selectedIds.length) {
+                            $("b", tipsBtn).text(options.selectedIds.length);
+                            tipsBtn.removeClass('hide');
+                        } else {
+                            tipsBtn.addClass('hide');
+                        }
+                    } else {
+                        options.selectedIds = selectedIds;
+                        options.selectedData = selectedData;
+                    }
+                    $(Table.config.disabledbtn, toolbar).toggleClass('disabled', !options.selectedIds.length);
+
                 });
                 // 绑定TAB事件
                 $('.panel-heading [data-field] a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
@@ -213,15 +267,16 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                     } else {
                         object.val(value);
                     }
+                    table.trigger("uncheckbox");
                     table.bootstrapTable('refresh', {pageNumber: 1});
                     return false;
                 });
                 // 刷新按钮事件
-                $(toolbar).on('click', Table.config.refreshbtn, function () {
+                toolbar.on('click', Table.config.refreshbtn, function () {
                     table.bootstrapTable('refresh');
                 });
                 // 添加按钮事件
-                $(toolbar).on('click', Table.config.addbtn, function () {
+                toolbar.on('click', Table.config.addbtn, function () {
                     var ids = Table.api.selectedids(table);
                     var url = options.extend.add_url;
                     if (url.indexOf("{ids}") !== -1) {
@@ -237,19 +292,24 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                                 url: options.extend.import_url,
                                 data: {file: data.url},
                             }, function (data, ret) {
+                                table.trigger("uncheckbox");
                                 table.bootstrapTable('refresh');
                             });
                         });
                     });
                 }
                 // 批量编辑按钮事件
-                $(toolbar).on('click', Table.config.editbtn, function () {
+                toolbar.on('click', Table.config.editbtn, function () {
                     var that = this;
+                    var ids = Table.api.selectedids(table);
+                    if (ids.length > 10) {
+                        return;
+                    }
                     //循环弹出多个编辑框
-                    $.each(table.bootstrapTable('getSelections'), function (index, row) {
+                    $.each(Table.api.selecteddata(table), function (index, row) {
                         var url = options.extend.edit_url;
                         row = $.extend({}, row ? row : {}, {ids: row[options.pk]});
-                        var url = Table.api.replaceurl(url, row, table);
+                        url = Table.api.replaceurl(url, row, table);
                         Fast.api.open(url, __('Edit'), $(that).data() || {});
                     });
                 });
@@ -260,6 +320,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                         var url = $(that).data("url") ? $(that).data("url") : $(that).attr("href");
                         Fast.api.ajax(url, function () {
                             Layer.closeAll();
+                            table.trigger("uncheckbox");
                             table.bootstrapTable('refresh');
                         }, function () {
                             Layer.closeAll();
@@ -272,17 +333,18 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                     var that = this;
                     var url = $(that).data("url") ? $(that).data("url") : $(that).attr("href");
                     Fast.api.ajax(url, function () {
+                        table.trigger("uncheckbox");
                         table.bootstrapTable('refresh');
                     });
                     return false;
                 });
                 // 批量操作按钮事件
-                $(toolbar).on('click', Table.config.multibtn, function () {
+                toolbar.on('click', Table.config.multibtn, function () {
                     var ids = Table.api.selectedids(table);
                     Table.api.multi($(this).data("action"), ids, table, this);
                 });
                 // 批量删除按钮事件
-                $(toolbar).on('click', Table.config.delbtn, function () {
+                toolbar.on('click', Table.config.delbtn, function () {
                     var that = this;
                     var ids = Table.api.selectedids(table);
                     Layer.confirm(
@@ -344,16 +406,15 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                         placeHolderTemplate: ""
                     });
                 });
-                $(table).on("click", "input[data-id][name='checkbox']", function (e) {
+                table.on("click", "input[data-id][name='checkbox']", function (e) {
                     var ids = $(this).data("id");
-                    var row = Table.api.getrowbyid(table, ids);
-                    table.trigger('check.bs.table', [row, this]);
+                    table.bootstrapTable($(this).prop("checked") ? 'checkBy' : 'uncheckBy', {field: options.pk, values: [ids]});
                 });
-                $(table).on("click", "[data-id].btn-change", function (e) {
+                table.on("click", "[data-id].btn-change", function (e) {
                     e.preventDefault();
                     Table.api.multi($(this).data("action") ? $(this).data("action") : '', [$(this).data("id")], table, this);
                 });
-                $(table).on("click", "[data-id].btn-edit", function (e) {
+                table.on("click", "[data-id].btn-edit", function (e) {
                     e.preventDefault();
                     var ids = $(this).data("id");
                     var row = Table.api.getrowbyid(table, ids);
@@ -361,7 +422,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                     var url = Table.api.replaceurl(options.extend.edit_url, row, table);
                     Fast.api.open(url, __('Edit'), $(this).data() || {});
                 });
-                $(table).on("click", "[data-id].btn-del", function (e) {
+                table.on("click", "[data-id].btn-del", function (e) {
                     e.preventDefault();
                     var id = $(this).data("id");
                     var that = this;
@@ -382,11 +443,12 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
             multi: function (action, ids, table, element) {
                 var options = table.bootstrapTable('getOptions');
                 var data = element ? $(element).data() : {};
-                var ids = ($.isArray(ids) ? ids.join(",") : ids);
+                ids = ($.isArray(ids) ? ids.join(",") : ids);
                 var url = typeof data.url !== "undefined" ? Table.api.replaceurl(data.url, {ids: ids}, table) : (action == "del" ? options.extend.del_url : options.extend.multi_url);
                 var params = typeof data.params !== "undefined" ? (typeof data.params == 'object' ? $.param(data.params) : data.params) : '';
-                var options = {url: url, data: {action: action, ids: ids, params: params}};
+                options = {url: url, data: {action: action, ids: ids, params: params}};
                 Fast.api.ajax(options, function (data, ret) {
+                    table.trigger("uncheckbox");
                     var success = $(element).data("success") || $.noop;
                     if (typeof success === 'function') {
                         if (false === success.call(element, data, ret)) {
@@ -721,17 +783,24 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                 return url;
             },
             // 获取选中的条目ID集合
-            selectedids: function (table) {
+            selectedids: function (table, current) {
                 var options = table.bootstrapTable('getOptions');
-                if (options.templateView) {
-                    return $.map($("input[data-id][name='checkbox']:checked"), function (dom) {
-                        return $(dom).data("id");
-                    });
-                } else {
-                    return $.map(table.bootstrapTable('getSelections'), function (row) {
-                        return row[options.pk];
-                    });
+                //如果有设置翻页记忆模式
+                if (!current && options.maintainSelected) {
+                    return options.selectedIds;
+                }
+                return $.map(table.bootstrapTable('getSelections'), function (row) {
+                    return row[options.pk];
+                });
+            },
+            //获取选中的数据
+            selecteddata: function (table, current) {
+                var options = table.bootstrapTable('getOptions');
+                //如果有设置翻页记忆模式
+                if (!current && options.maintainSelected) {
+                    return options.selectedData;
                 }
+                return table.bootstrapTable('getSelections');
             },
             // 切换复选框状态
             toggleattr: function (table) {
@@ -751,7 +820,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
             getrowbyid: function (table, id) {
                 var row = {};
                 var options = table.bootstrapTable("getOptions");
-                $.each(table.bootstrapTable('getData'), function (i, j) {
+                $.each(Table.api.selecteddata(table), function (i, j) {
                     if (j[options.pk] == id) {
                         row = j;
                         return false;

+ 4 - 0
public/assets/less/backend.less

@@ -777,6 +777,10 @@ form.form-horizontal .control-label {
 /*去除bootstrap-table的边框*/
 .fixed-table-container {
   border: none !important;
+
+  tbody .selected td {
+    background-color: rgba(216, 224, 230, .5);
+  }
 }
 
 /*修复nice-validator新版下的一处BUG*/

+ 67 - 0
public/assets/less/fastadmin/buttons.less

@@ -65,6 +65,73 @@
     }
 }
 
+
+.btn-primary-light {
+    background-color: @primary-light-bg;
+    border-color: @primary-light-border;
+    color: @primary-light-text;
+    &:hover,
+    &:active,
+    &.hover {
+        background-color: darken(@primary-light-bg, 5%);
+        border-color: darken(@primary-light-bg, 10%);
+        color: @primary-light-text;
+    }
+}
+
+.btn-success-light {
+    background-color: @success-light-bg;
+    border-color: @success-light-border;
+    color: @success-light-text;
+    &:hover,
+    &:active,
+    &.hover {
+        background-color: darken(@success-light-bg, 5%);
+        border-color: darken(@success-light-bg, 10%);
+        color: @success-light-text;
+    }
+}
+
+.btn-danger-light,
+.btn-error-light {
+    background-color: @danger-light-bg;
+    border-color: @danger-light-border;
+    color: @danger-light-text;
+    &:hover,
+    &:active,
+    &.hover {
+        background-color: darken(@danger-light-bg, 5%);
+        border-color: darken(@danger-light-bg, 10%);
+        color: @danger-light-text;
+    }
+}
+
+.btn-warning-light {
+    background-color: @warning-light-bg;
+    border-color: @warning-light-border;
+    color: @warning-light-text;
+    &:hover,
+    &:active,
+    &.hover {
+        background-color: darken(@warning-light-bg, 5%);
+        border-color: darken(@warning-light-bg, 10%);
+        color: @warning-light-text;
+    }
+}
+
+.btn-info-light {
+    background-color: @info-light-bg;
+    border-color: @info-light-border;
+    color: @info-light-text;
+    &:hover,
+    &:active,
+    &.hover {
+        background-color: darken(@info-light-bg, 5%);
+        border-color: darken(@info-light-bg, 10%);
+        color: @info-light-text;
+    }
+}
+
 .btn-outline {
     border: 1px solid #fff;
     background: transparent;