資料導出與查閱

功能說明

此頁面提供抽獎系統數據的查閱與導出功能:

  • 查看所有參與者的完整資訊
  • 查閱抽獎者獲得的密碼
  • 導出各種格式的數據報表
  • 管理系統數據

搜尋與篩選

參與者資料總覽

總參與者: 0
0 已使用 / 0 未使用

導出選項

數據管理

警告:以下操作不可恢復,請謹慎操作!

新會員首次購物即享全單 9 折優惠!

購物滿 HKD 300.00即享免運費優惠!(適用於 本地送貨、本地取貨 )

-SILVER925

314項 商品
// 更新導出頁面 function updateExportTab() { const participants = Object.keys(lotteryData.emailCodes); const usedCount = participants.filter(email => lotteryData.emailCodes[email].used).length; const unusedCount = participants.length - usedCount; document.getElementById('totalParticipants').textContent = participants.length; document.getElementById('usedCount').textContent = usedCount; document.getElementById('unusedCount').textContent = unusedCount; displayParticipants(participants); } // 顯示參與者表格 function displayParticipants(participantList) { const table = document.getElementById('participantsTable'); if (participantList.length === 0) { table.innerHTML = '
目前沒有參與者資料
'; return; } let tableHTML = ` `; // 按時間排序,最新的在前面 const sortedParticipants = participantList.sort((a, b) => { return lotteryData.emailCodes[b].time - lotteryData.emailCodes[a].time; }); sortedParticipants.forEach((email, index) => { const data = lotteryData.emailCodes[email]; const status = data.used ? '已使用' : '未使用'; const statusColor = data.used ? 'var(--primary-color)' : '#4CAF50'; const registerTime = new Date(data.time).toLocaleString('zh-TW'); // 檢查是否中獎 let lastActivity = '尚未抽獎'; const winnerInfo = lotteryData.winners.find(w => w.email === email); if (winnerInfo) { lastActivity = `中獎: ${winnerInfo.gift}`; } else if (data.used) { lastActivity = '已抽獎未中'; } tableHTML += ` `; }); tableHTML += `
序號 電子郵件 抽獎密碼 狀態 註冊時間 最後活動
${index + 1}
${email}
IP: ${getIP()}
${data.code}
${data.used ? '已使用' : '可使用'}
${status} ${registerTime} ${lastActivity}
`; table.innerHTML = tableHTML; } // 搜尋參與者 function searchParticipants() { const query = document.getElementById('searchQuery').value.toLowerCase().trim(); const statusFilter = document.getElementById('filterStatus').value; let participants = Object.keys(lotteryData.emailCodes); // 應用搜尋過濾 if (query) { participants = participants.filter(email => { const data = lotteryData.emailCodes[email]; return email.toLowerCase().includes(query) || data.code.toLowerCase().includes(query); }); } // 應用狀態過濾 if (statusFilter) { participants = participants.filter(email => { const data = lotteryData.emailCodes[email]; if (statusFilter === 'used') return data.used; if (statusFilter === 'unused') return !data.used; return true; }); } displayParticipants(participants); // 更新計數器 const usedCount = participants.filter(email => lotteryData.emailCodes[email].used).length; const unusedCount = participants.length - usedCount; document.getElementById('totalParticipants').textContent = participants.length; document.getElementById('usedCount').textContent = usedCount; document.getElementById('unusedCount').textContent = unusedCount; } // 清除搜尋 function clearSearch() { document.getElementById('searchQuery').value = ''; document.getElementById('filterStatus').value = ''; searchParticipants(); } // 導出帶有密碼的完整資料 function exportWithPasswords() { const emails = Object.keys(lotteryData.emailCodes); if (emails.length === 0) { alert('目前沒有數據可以導出!'); return; } let csvContent = "data:text/csv;charset=utf-8,\uFEFF"; csvContent += "序號,電子郵件,抽獎密碼,抽獎狀態,註冊時間,最後活動,中獎獎品\n"; emails.forEach((email, index) => { const data = lotteryData.emailCodes[email]; const status = data.used ? '已使用' : '未使用'; const registerTime = new Date(data.time).toLocaleString('zh-TW'); // 檢查是否中獎 let lastActivity = '尚未抽獎'; let prize = ''; const winnerInfo = lotteryData.winners.find(w => w.email === email); if (winnerInfo) { lastActivity = '已中獎'; prize = winnerInfo.gift; } else if (data.used) { lastActivity = '已抽獎未中'; } csvContent += `${index + 1},"${email}","${data.code}","${status}","${registerTime}","${lastActivity}","${prize}"\n`; }); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", `抽獎密碼清單_${new Date().toISOString().split('T')[0]}.csv`); document.body.appendChild(link); link.click(); document.body.removeChild(link); alert(`已導出 ${emails.length} 筆資料,包含抽獎密碼!`); } // 導出完整資料 function exportFullData() { let csvContent = "data:text/csv;charset=utf-8,\uFEFF"; csvContent += "數據類型,總數,詳細資訊\n"; // 基本統計 csvContent += `總參與者,${Object.keys(lotteryData.emailCodes).length},\n`; csvContent += `已使用密碼,${Object.keys(lotteryData.emailCodes).filter(email => lotteryData.emailCodes[email].used).length},\n`; csvContent += `未使用密碼,${Object.keys(lotteryData.emailCodes).filter(email => !lotteryData.emailCodes[email].used).length},\n`; csvContent += `總抽獎次數,${lotteryData.stats.totalSpins},\n`; csvContent += `中獎人數,${lotteryData.stats.winners},\n`; csvContent += `中獎率,${lotteryData.stats.totalSpins > 0 ? ((lotteryData.stats.winners / lotteryData.stats.totalSpins) * 100).toFixed(2) : 0}%,\n`; csvContent += `,\n`; // 獎品庫存 csvContent += `獎品名稱,當前庫存,中獎概率,已兌換\n`; lotteryData.gifts.forEach((gift, index) => { if (gift.name !== "未中獎") { const redeemed = gift.stock; // 假設初始庫存為初始值 csvContent += `${gift.name},${gift.stock},${gift.probability}%,${redeemed}\n`; } }); csvContent += `,\n`; // 參與者列表 csvContent += `序號,電子郵件,抽獎密碼,狀態,註冊時間,最後活動,中獎獎品\n`; const emails = Object.keys(lotteryData.emailCodes); emails.forEach((email, index) => { const data = lotteryData.emailCodes[email]; const status = data.used ? '已使用' : '未使用'; const registerTime = new Date(data.time).toLocaleString('zh-TW'); let lastActivity = '尚未抽獎'; let prize = ''; const winnerInfo = lotteryData.winners.find(w => w.email === email); if (winnerInfo) { lastActivity = '已中獎'; prize = winnerInfo.gift; } else if (data.used) { lastActivity = '已抽獎未中'; } csvContent += `${index + 1},"${email}","${data.code}","${status}","${registerTime}","${lastActivity}","${prize}"\n`; }); const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); link.setAttribute("download", `抽獎完整報表_${new Date().toISOString().split('T')[0]}.csv`); document.body.appendChild(link); link.click(); document.body.removeChild(link); alert(`完整報表已導出,包含 ${emails.length} 位參與者資料!`); } // 清除未使用密碼 function clearUnusedData() { const unusedEmails = Object.keys(lotteryData.emailCodes).filter(email => !lotteryData.emailCodes[email].used); if (unusedEmails.length === 0) { alert('目前沒有未使用的密碼可以清除!'); return; } if (confirm(`確定要清除 ${unusedEmails.length} 個未使用的抽獎密碼嗎?\n此操作不可恢復!`)) { // 從activeCodes中移除未使用的密碼 unusedEmails.forEach(email => { const code = lotteryData.emailCodes[email].code; const index = lotteryData.activeCodes.indexOf(code); if (index > -1) { lotteryData.activeCodes.splice(index, 1); } }); // 移除未使用的email記錄 unusedEmails.forEach(email => { delete lotteryData.emailCodes[email]; }); saveData(); updateExportTab(); alert(`已清除 ${unusedEmails.length} 個未使用的抽獎密碼!`); } } // 清除所有數據 function clearAllData() { if (confirm('警告:這將清除所有抽獎數據(包括電郵地址、密碼、中獎記錄等)!\n\n確定要繼續嗎?')) { // 重置所有數據 lotteryData.activeCodes = []; lotteryData.usedCodes = []; lotteryData.emailCodes = {}; lotteryData.ipRecords = {}; lotteryData.winners = []; lotteryData.stats = { totalSpins: 0, winners: 0, history: [] }; saveData(); updateStats(); updateExportTab(); alert('所有數據已清除!'); } } // 在管理員登入時更新導出頁面 function loginAdmin() { const code = document.getElementById('adminPass').value.trim(); if (code === lotteryData.adminCode) { showAdminPage('adminPanel'); loadSettings(); updateGiftPreview(); updateStats(); updateExportTab(); // 新增這行 } else { alert('管理員密碼錯誤!'); document.getElementById('adminPass').value = ''; document.getElementById('adminPass').focus(); } } // 切換到導出頁面時更新數據 function switchTab(tabId) { // 移除所有active document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active')); document.querySelectorAll('.tab-content').forEach(tab => tab.style.display = 'none'); // 激活當前 document.getElementById(tabId).style.display = 'block'; const activeBtn = document.querySelector(`[onclick="switchTab('${tabId}')"]`); if (activeBtn) { activeBtn.classList.add('active'); } // 更新導出頁面數據 if (tabId === 'exportTab') { updateExportTab(); } }