297 lines
9.6 KiB
JavaScript
297 lines
9.6 KiB
JavaScript
|
|
// 会员查看页面 - H5版本
|
||
|
|
|
||
|
|
let memberData = [];
|
||
|
|
let filteredData = [];
|
||
|
|
let sortOrder = {};
|
||
|
|
let selectedMembers = new Set();
|
||
|
|
|
||
|
|
// 页面初始化
|
||
|
|
document.addEventListener('DOMContentLoaded', function() {
|
||
|
|
loadMemberData();
|
||
|
|
});
|
||
|
|
|
||
|
|
// 加载会员数据
|
||
|
|
function loadMemberData() {
|
||
|
|
// 使用模拟数据
|
||
|
|
memberData = [
|
||
|
|
{ id: 1, name: '张三', phone: '138****1234', level: 'LV2', points: 1250, joinDate: '2024-01-15' },
|
||
|
|
{ id: 2, name: '李四', phone: '139****5678', level: 'LV3', points: 2800, joinDate: '2024-02-20' },
|
||
|
|
{ id: 3, name: '王五', phone: '137****9012', level: 'LV1', points: 580, joinDate: '2024-03-10' },
|
||
|
|
{ id: 4, name: '赵六', phone: '136****3456', level: 'LV4', points: 5200, joinDate: '2024-01-08' },
|
||
|
|
{ id: 5, name: '钱七', phone: '135****7890', level: 'LV2', points: 1580, joinDate: '2024-02-15' },
|
||
|
|
{ id: 6, name: '孙八', phone: '134****2345', level: 'LV1', points: 420, joinDate: '2024-03-20' },
|
||
|
|
{ id: 7, name: '周九', phone: '133****6789', level: 'LV3', points: 3200, joinDate: '2024-01-25' },
|
||
|
|
{ id: 8, name: '吴十', phone: '132****0123', level: 'LV4', points: 4800, joinDate: '2024-02-10' }
|
||
|
|
];
|
||
|
|
|
||
|
|
filteredData = [...memberData];
|
||
|
|
renderTable();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 渲染表格
|
||
|
|
function renderTable() {
|
||
|
|
const tableBody = document.getElementById('member-table-body');
|
||
|
|
tableBody.innerHTML = filteredData.map(member => `
|
||
|
|
<tr>
|
||
|
|
<td>
|
||
|
|
<input type="checkbox" class="member-checkbox" value="${member.id}"
|
||
|
|
onchange="toggleMemberSelection(${member.id})"
|
||
|
|
${selectedMembers.has(member.id) ? 'checked' : ''}>
|
||
|
|
</td>
|
||
|
|
<td>${member.name}</td>
|
||
|
|
<td>${member.phone}</td>
|
||
|
|
<td>${member.level}</td>
|
||
|
|
<td>${member.points}</td>
|
||
|
|
<td>${member.joinDate}</td>
|
||
|
|
<td>
|
||
|
|
<button class="btn btn-small btn-primary" onclick="viewMemberDetail(${member.id})">
|
||
|
|
查看详情
|
||
|
|
</button>
|
||
|
|
</td>
|
||
|
|
</tr>
|
||
|
|
`).join('');
|
||
|
|
updateSelectedCount();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 筛选会员
|
||
|
|
function filterMembers() {
|
||
|
|
const levelFilter = document.getElementById('level-filter').value;
|
||
|
|
const searchText = document.getElementById('member-search').value.toLowerCase();
|
||
|
|
|
||
|
|
filteredData = memberData.filter(member => {
|
||
|
|
const matchLevel = !levelFilter || member.level === levelFilter;
|
||
|
|
const matchSearch = !searchText ||
|
||
|
|
member.name.toLowerCase().includes(searchText) ||
|
||
|
|
member.phone.includes(searchText);
|
||
|
|
|
||
|
|
return matchLevel && matchSearch;
|
||
|
|
});
|
||
|
|
|
||
|
|
renderTable();
|
||
|
|
updateSelectAllState();
|
||
|
|
showNotification(`筛选结果:${filteredData.length} 名会员`, 'info');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 表格排序
|
||
|
|
function sortTable(column) {
|
||
|
|
const isAscending = sortOrder[column] !== 'asc';
|
||
|
|
sortOrder = {}; // 重置其他列的排序状态
|
||
|
|
sortOrder[column] = isAscending ? 'asc' : 'desc';
|
||
|
|
|
||
|
|
filteredData.sort((a, b) => {
|
||
|
|
let valueA = a[column];
|
||
|
|
let valueB = b[column];
|
||
|
|
|
||
|
|
// 处理数字类型
|
||
|
|
if (column === 'points') {
|
||
|
|
valueA = parseInt(valueA);
|
||
|
|
valueB = parseInt(valueB);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 处理日期类型
|
||
|
|
if (column === 'joinDate') {
|
||
|
|
valueA = new Date(valueA);
|
||
|
|
valueB = new Date(valueB);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (valueA < valueB) {
|
||
|
|
return isAscending ? -1 : 1;
|
||
|
|
}
|
||
|
|
if (valueA > valueB) {
|
||
|
|
return isAscending ? 1 : -1;
|
||
|
|
}
|
||
|
|
return 0;
|
||
|
|
});
|
||
|
|
|
||
|
|
renderTable();
|
||
|
|
updateSelectAllState();
|
||
|
|
showNotification(`按${getColumnName(column)}${isAscending ? '升序' : '降序'}排列`, 'info');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取列名中文
|
||
|
|
function getColumnName(column) {
|
||
|
|
const names = {
|
||
|
|
'name': '姓名',
|
||
|
|
'phone': '手机号',
|
||
|
|
'level': '等级',
|
||
|
|
'points': '积分',
|
||
|
|
'joinDate': '加入时间'
|
||
|
|
};
|
||
|
|
return names[column] || column;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 查看会员详情
|
||
|
|
function viewMemberDetail(memberId) {
|
||
|
|
const member = memberData.find(m => m.id === memberId);
|
||
|
|
if (member) {
|
||
|
|
// 这里可以跳转到会员详情页面,或者显示弹窗
|
||
|
|
showNotification(`查看会员:${member.name} 的详情`, 'info');
|
||
|
|
console.log('会员详情:', member);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 批量选择相关功能
|
||
|
|
function toggleSelectAll() {
|
||
|
|
const selectAllCheckbox = document.getElementById('select-all');
|
||
|
|
const memberCheckboxes = document.querySelectorAll('.member-checkbox');
|
||
|
|
|
||
|
|
if (selectAllCheckbox.checked) {
|
||
|
|
// 全选当前页面显示的会员
|
||
|
|
filteredData.forEach(member => {
|
||
|
|
selectedMembers.add(member.id);
|
||
|
|
});
|
||
|
|
memberCheckboxes.forEach(checkbox => {
|
||
|
|
checkbox.checked = true;
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
// 取消全选
|
||
|
|
selectedMembers.clear();
|
||
|
|
memberCheckboxes.forEach(checkbox => {
|
||
|
|
checkbox.checked = false;
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
updateSelectedCount();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 切换单个会员选择状态
|
||
|
|
function toggleMemberSelection(memberId) {
|
||
|
|
console.log('toggleMemberSelection called, memberId:', memberId);
|
||
|
|
|
||
|
|
if (selectedMembers.has(memberId)) {
|
||
|
|
selectedMembers.delete(memberId);
|
||
|
|
console.log('Member removed from selection');
|
||
|
|
} else {
|
||
|
|
selectedMembers.add(memberId);
|
||
|
|
console.log('Member added to selection');
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log('Selected members:', Array.from(selectedMembers));
|
||
|
|
|
||
|
|
updateSelectedCount();
|
||
|
|
updateSelectAllState();
|
||
|
|
}
|
||
|
|
|
||
|
|
// 更新选中数量显示
|
||
|
|
function updateSelectedCount() {
|
||
|
|
const selectedCount = selectedMembers.size;
|
||
|
|
const countElement = document.getElementById('selected-count');
|
||
|
|
const batchEditBtn = document.getElementById('batch-edit-btn');
|
||
|
|
|
||
|
|
countElement.textContent = `已选择 ${selectedCount} 位会员`;
|
||
|
|
batchEditBtn.disabled = selectedCount === 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 更新全选checkbox状态
|
||
|
|
function updateSelectAllState() {
|
||
|
|
const selectAllCheckbox = document.getElementById('select-all');
|
||
|
|
const currentPageMemberIds = filteredData.map(member => member.id);
|
||
|
|
const selectedCurrentPageCount = currentPageMemberIds.filter(id => selectedMembers.has(id)).length;
|
||
|
|
|
||
|
|
if (selectedCurrentPageCount === 0) {
|
||
|
|
selectAllCheckbox.checked = false;
|
||
|
|
selectAllCheckbox.indeterminate = false;
|
||
|
|
} else if (selectedCurrentPageCount === currentPageMemberIds.length) {
|
||
|
|
selectAllCheckbox.checked = true;
|
||
|
|
selectAllCheckbox.indeterminate = false;
|
||
|
|
} else {
|
||
|
|
selectAllCheckbox.checked = false;
|
||
|
|
selectAllCheckbox.indeterminate = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 打开批量编辑弹窗
|
||
|
|
function openBatchEditModal() {
|
||
|
|
console.log('openBatchEditModal called, selectedMembers size:', selectedMembers.size);
|
||
|
|
|
||
|
|
if (selectedMembers.size === 0) {
|
||
|
|
showNotification('请先选择要编辑的会员', 'warning');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 显示选中的会员列表
|
||
|
|
const selectedMembersList = document.getElementById('selected-members-list');
|
||
|
|
const selectedMembersData = memberData.filter(member => selectedMembers.has(member.id));
|
||
|
|
|
||
|
|
console.log('selectedMembersData:', selectedMembersData);
|
||
|
|
|
||
|
|
selectedMembersList.innerHTML = selectedMembersData.map(member =>
|
||
|
|
`<div style="margin-bottom: 5px;">${member.name} (${member.phone}) - 当前等级: ${member.level}</div>`
|
||
|
|
).join('');
|
||
|
|
|
||
|
|
// 重置表单
|
||
|
|
document.getElementById('new-level').value = '';
|
||
|
|
document.getElementById('batch-edit-remark').value = '';
|
||
|
|
|
||
|
|
// 显示弹窗
|
||
|
|
const modal = document.getElementById('batch-edit-modal');
|
||
|
|
console.log('Modal element:', modal);
|
||
|
|
if (modal) {
|
||
|
|
modal.style.display = 'flex';
|
||
|
|
console.log('Modal display set to flex');
|
||
|
|
} else {
|
||
|
|
console.error('Modal element not found!');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// 关闭批量编辑弹窗
|
||
|
|
function closeBatchEditModal() {
|
||
|
|
document.getElementById('batch-edit-modal').style.display = 'none';
|
||
|
|
}
|
||
|
|
|
||
|
|
// 确认批量编辑
|
||
|
|
function confirmBatchEdit() {
|
||
|
|
const newLevel = document.getElementById('new-level').value;
|
||
|
|
const remark = document.getElementById('batch-edit-remark').value;
|
||
|
|
|
||
|
|
if (!newLevel) {
|
||
|
|
showNotification('请选择新的会员等级', 'warning');
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 执行批量编辑
|
||
|
|
const selectedMembersData = memberData.filter(member => selectedMembers.has(member.id));
|
||
|
|
let updatedCount = 0;
|
||
|
|
|
||
|
|
selectedMembersData.forEach(member => {
|
||
|
|
if (member.level !== newLevel) {
|
||
|
|
member.level = newLevel;
|
||
|
|
updatedCount++;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
// 重新渲染表格
|
||
|
|
renderTable();
|
||
|
|
|
||
|
|
// 关闭弹窗
|
||
|
|
closeBatchEditModal();
|
||
|
|
|
||
|
|
// 清除选择
|
||
|
|
selectedMembers.clear();
|
||
|
|
document.getElementById('select-all').checked = false;
|
||
|
|
updateSelectedCount();
|
||
|
|
|
||
|
|
// 显示成功消息
|
||
|
|
const message = remark ?
|
||
|
|
`批量编辑完成:${updatedCount}位会员等级已更新为${newLevel}。备注:${remark}` :
|
||
|
|
`批量编辑完成:${updatedCount}位会员等级已更新为${newLevel}`;
|
||
|
|
|
||
|
|
showNotification(message, 'success');
|
||
|
|
|
||
|
|
console.log('批量编辑完成:', {
|
||
|
|
updatedCount,
|
||
|
|
newLevel,
|
||
|
|
remark,
|
||
|
|
selectedMembers: selectedMembersData.map(m => ({ id: m.id, name: m.name }))
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 导出函数到全局
|
||
|
|
window.filterMembers = filterMembers;
|
||
|
|
window.sortTable = sortTable;
|
||
|
|
window.viewMemberDetail = viewMemberDetail;
|
||
|
|
window.toggleSelectAll = toggleSelectAll;
|
||
|
|
window.toggleMemberSelection = toggleMemberSelection;
|
||
|
|
window.openBatchEditModal = openBatchEditModal;
|
||
|
|
window.closeBatchEditModal = closeBatchEditModal;
|
||
|
|
window.confirmBatchEdit = confirmBatchEdit;
|