diff --git a/public/assets/js/backend/history.js b/public/assets/js/backend/history.js
index f700488..996cbd7 100644
--- a/public/assets/js/backend/history.js
+++ b/public/assets/js/backend/history.js
@@ -785,12 +785,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
'' +
'
' +
' ' +
- ' ' +
- ' ' +
- ' ' +
- ' —' +
- ' ' +
+ ' ' +
'
' +
+ '' +
'' +
'';
@@ -823,15 +820,27 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
Controller.api.applyNumberFilters(layero);
});
- // 区间模式切换
- $('.nf-range-mode', layero).on('click', function () {
- $('.nf-range-mode', layero).removeClass('btn-info').addClass('btn-default');
- $(this).removeClass('btn-default').addClass('btn-info');
+ // 新增区间
+ $('.btn-nf-add-range', layero).on('click', function () {
+ Controller.api.addRangeRow(layero, 1, 49, 'include');
Controller.api.applyNumberFilters(layero);
});
- // 区间输入
- $('#nf-range-min, #nf-range-max', layero).on('input', function () {
+ // 区间输入 & 删除事件委托
+ $('#nf-range-list', layero).on('input change', '.nf-range-min, .nf-range-max', function () {
+ Controller.api.applyNumberFilters(layero);
+ });
+ $('#nf-range-list', layero).on('click', '.nf-range-mode', function () {
+ var $btn = $(this);
+ if ($btn.hasClass('btn-info')) {
+ $btn.removeClass('btn-info').addClass('btn-default');
+ } else {
+ $btn.removeClass('btn-default').addClass('btn-info');
+ }
+ Controller.api.applyNumberFilters(layero);
+ });
+ $('#nf-range-list', layero).on('click', '.nf-range-del', function () {
+ $(this).closest('.nf-range-row').remove();
Controller.api.applyNumberFilters(layero);
});
@@ -840,16 +849,30 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
$('#nf-tail', layero).val('');
$('.nf-zodiac', layero).removeClass('btn-gray').addClass('btn-default');
$('.nf-color-btn', layero).removeClass('btn-gray').addClass('btn-default');
- $('#nf-range-min', layero).val(1);
- $('#nf-range-max', layero).val(49);
- $('.nf-range-mode', layero).removeClass('btn-info').addClass('btn-default');
- $('#nf-range-mode-include', layero).removeClass('btn-default').addClass('btn-info');
+ $('#nf-range-list', layero).html('');
Controller.api.applyNumberFilters(layero);
});
}
});
},
+ /**
+ * 新增一行区间筛选
+ */
+ addRangeRow: function (layero, min, max, mode) {
+ var rowId = 'nf-range-' + Date.now();
+ var isInclude = mode === 'include';
+ var html = '' +
+ ' ' + (isInclude ? '在区间' : '排除') + '' +
+ ' ' +
+ ' —' +
+ ' ' +
+ ' ' +
+ ' ' +
+ '
';
+ $('#nf-range-list', layero).append(html);
+ },
+
/**
* 渲染筛号器号码网格
*/
@@ -887,10 +910,15 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
$('.nf-color-btn.btn-gray', layero).each(function () {
excludedColors.push($(this).data('color'));
});
- // 区间筛选
- var rangeMin = parseInt($('#nf-range-min', layero).val()) || 1;
- var rangeMax = parseInt($('#nf-range-max', layero).val()) || 49;
- var rangeMode = $('#nf-range-mode-include', layero).hasClass('btn-info') ? 'include' : 'exclude';
+ // 收集所有区间
+ var ranges = [];
+ $('.nf-range-row', layero).each(function () {
+ var $row = $(this);
+ var min = parseInt($row.find('.nf-range-min').val()) || 1;
+ var max = parseInt($row.find('.nf-range-max').val()) || 49;
+ var mode = $row.find('.nf-range-mode').hasClass('btn-info') ? 'include' : 'exclude';
+ ranges.push({min: min, max: max, mode: mode});
+ });
$('.nf-number', layero).each(function () {
var $num = $(this);
@@ -905,16 +933,36 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
if (tailVal !== '' && parseInt(tailVal) === tail) {
hidden = true;
}
- // 区间筛选
- if (rangeMode === 'include') {
- // 在区间模式:不在区间内则屏蔽
- if (num < rangeMin || num > rangeMax) {
- hidden = true;
+ // 区间筛选:在区间=白名单(OR)、排除区间=黑名单(OR)
+ if (!hidden) {
+ var includeRanges = [];
+ var excludeRanges = [];
+ for (var r = 0; r < ranges.length; r++) {
+ if (ranges[r].mode === 'include') {
+ includeRanges.push(ranges[r]);
+ } else {
+ excludeRanges.push(ranges[r]);
+ }
}
- } else {
- // 排除区间模式:在区间内则屏蔽
- if (num >= rangeMin && num <= rangeMax) {
- hidden = true;
+ // 黑名单:任一排除区间命中则屏蔽
+ for (var r = 0; r < excludeRanges.length; r++) {
+ if (num >= excludeRanges[r].min && num <= excludeRanges[r].max) {
+ hidden = true;
+ break;
+ }
+ }
+ // 白名单:有在区间规则时,号码不在任一区间则屏蔽
+ if (!hidden && includeRanges.length > 0) {
+ var inAnyInclude = false;
+ for (var r = 0; r < includeRanges.length; r++) {
+ if (num >= includeRanges[r].min && num <= includeRanges[r].max) {
+ inAnyInclude = true;
+ break;
+ }
+ }
+ if (!inAnyInclude) {
+ hidden = true;
+ }
}
}
// 排除的生肖