// ================================================== // توابع مخصوص پنل مدیریت (me.khademindrb.ir) // ================================================== // احراز هویت const ADMIN_HASH = hashString('admin1234'); function checkAuth() { const logged = localStorage.getItem('admin_logged'); if (logged !== 'true') { // نمایش صفحه لاگین showLoginForm(); return false; } return true; } function showLoginForm() { document.getElementById('pageContent').innerHTML = `
`; } function adminLogin() { const user = document.getElementById('adminUser').value.trim(); const pass = document.getElementById('adminPass').value; const hash = hashString(pass); const users = getFromLocalStorage('kh_users', []); let valid = false; if (user === 'admin' && hash === ADMIN_HASH) { valid = true; if (!users.find(u => u.username === 'admin')) { users.push({ username: 'admin', passwordHash: ADMIN_HASH, role: 'admin' }); saveToLocalStorage('kh_users', users); } } else { valid = users.some(u => u.username === user && u.passwordHash === hash); } if (valid) { localStorage.setItem('admin_logged', 'true'); showToast('خوش آمدید', 'success'); renderPage(); } else { showToast('نام کاربری یا رمز عبور اشتباه است'); } } function logout() { localStorage.removeItem('admin_logged'); showToast('خارج شدید'); showLoginForm(); } // متغیرهای صفحه‌بندی let currentAdminPage = 'dashboard'; let newsPage = 1, martyrsPage = 1, newsFilter = [], martyrsFilter = [], newsSort = 'date-desc'; function renderPage() { if (!checkAuth()) return; const page = currentAdminPage; const titles = { dashboard: '📊 داشبورد', news: '📰 مدیریت اخبار', martyrs: '🌟 مدیریت شهدا', registrations: '👥 ثبت‌نام‌ها', settings: '⚙️ تنظیمات' }; document.getElementById('pageTitle').innerHTML = titles[page] || 'مدیریت'; if (page === 'dashboard') renderDashboard(); else if (page === 'news') renderNewsList(); else if (page === 'martyrs') renderMartyrsList(); else if (page === 'registrations') renderRegistrations(); else if (page === 'settings') renderSettings(); } // ========== داشبورد ========== function renderDashboard() { const news = getFromLocalStorage('kh_news_admin', []); const martyrs = getFromLocalStorage('kh_martyrs_admin', martyrsData); const regs = getFromLocalStorage('kh_registrations', []); const published = news.filter(n => n.status === 'published').length; const drafts = news.filter(n => n.status === 'draft').length; const pinned = news.filter(n => n.pinned).length; let html = `
${news.length}
کل اخبار
${published}
منتشر شده
${drafts}
پیش‌نویس
${pinned}
اخبار ویژه
${martyrs.length}
شهدا
${regs.length}
ثبت‌نام خادمی

📰 آخرین اخبار

${news.slice(0,5).map(n => `
${escHtml(n.title)} ${n.status === 'published' ? 'منتشر' : 'پیش‌نویس'}
`).join('') || '

خبری وجود ندارد

'}

🌟 شهدای اخیر

${martyrs.slice(0,5).map(m => `
${escHtml(m.name)} - ${m.born}
`).join('') || '

شهیدی ثبت نشده

'}
`; document.getElementById('pageContent').innerHTML = html; } // ========== مدیریت اخبار ========== function renderNewsList() { let news = getFromLocalStorage('kh_news_admin', []); const search = document.getElementById('newsSearch')?.value || ''; const status = document.getElementById('newsStatus')?.value || ''; let filtered = news.filter(n => { if (search && !n.title.includes(search)) return false; if (status && n.status !== status) return false; return true; }); if (newsSort === 'date-desc') filtered.sort((a, b) => (b.createdAt || 0) - (a.createdAt || 0)); else if (newsSort === 'date-asc') filtered.sort((a, b) => (a.createdAt || 0) - (b.createdAt || 0)); else filtered.sort((a, b) => a.title.localeCompare(b.title, 'fa')); const totalPages = Math.ceil(filtered.length / 10); const start = (newsPage - 1) * 10; const pageData = filtered.slice(start, start + 10); let html = `
${pageData.map((n, i) => ` `).join('')}
#عنواندستهتاریخوضعیتعملیات
${start + i + 1} ${escHtml(n.title)} ${escHtml(n.category || '-')} ${n.date || '-'} ${n.status === 'published' ? '✅ منتشر' : '📝 پیش‌نویس'}
`; document.getElementById('pageContent').innerHTML = html; } function openNewsForm(editId = null) { const news = getFromLocalStorage('kh_news_admin', []); const item = editId ? news.find(n => n.id == editId) : null; let html = `

${editId ? '✏️ ویرایش خبر' : '➕ خبر جدید'}

`; document.getElementById('pageContent').innerHTML = html; if (item?.image) document.getElementById('newsImagePreview').style.display = 'block'; } function previewImage(input, previewId, dataId) { if (input.files && input.files[0]) { const reader = new FileReader(); reader.onload = e => { const preview = document.getElementById(previewId); preview.src = e.target.result; preview.style.display = 'block'; document.getElementById(dataId).value = e.target.result; }; reader.readAsDataURL(input.files[0]); } } function saveNews(editId) { const title = document.getElementById('newsTitle').value.trim(); if (!title) { showToast('عنوان خبر الزامی است'); return; } const news = getFromLocalStorage('kh_news_admin', []); const newItem = { id: editId || Date.now().toString(), title, category: document.getElementById('newsCategory').value, author: document.getElementById('newsAuthor').value, date: document.getElementById('newsDate').value, status: document.getElementById('newsStatusForm').value, pinned: document.getElementById('newsPinned').value === '1', link: document.getElementById('newsLink').value, excerpt: document.getElementById('newsExcerpt').value, body: document.getElementById('newsBody').value, image: document.getElementById('newsImageData').value, createdAt: editId ? (news.find(n => n.id == editId)?.createdAt || Date.now()) : Date.now(), updatedAt: Date.now() }; if (editId) { const idx = news.findIndex(n => n.id == editId); if (idx !== -1) news[idx] = newItem; } else { news.unshift(newItem); } saveToLocalStorage('kh_news_admin', news); showToast('خبر ذخیره شد', 'success'); renderNewsList(); } function viewNews(id) { const news = getFromLocalStorage('kh_news_admin', []); const item = news.find(n => n.id == id); if (item) { if (item.link) { window.open(item.link, '_blank'); } else { const win = window.open(); win.document.write(` ${item.title} ${item.image ? `` : ''}

${item.title}

${item.date || ''} | ${item.author || ''}

${item.body || item.excerpt || ''}
`); } } } function editNews(id) { openNewsForm(id); } function deleteNews(id) { openConfirmModal('آیا از حذف این خبر مطمئن هستید؟', () => { let news = getFromLocalStorage('kh_news_admin', []); news = news.filter(n => n.id != id); saveToLocalStorage('kh_news_admin', news); renderNewsList(); showToast('خبر حذف شد'); }); } // ========== مدیریت شهدا ========== function renderMartyrsList() { let martyrs = getFromLocalStorage('kh_martyrs_admin', martyrsData); const search = document.getElementById('martyrsSearch')?.value || ''; let filtered = martyrs.filter(m => !search || m.name.includes(search)); const totalPages = Math.ceil(filtered.length / 20); const start = (martyrsPage - 1) * 20; const pageData = filtered.slice(start, start + 20); let html = `
${pageData.map((m, i) => ` `).join('')}
#نام شهیدتاریخ تولدتاریخ شهادتعملیات
${start + i + 1} ${escHtml(m.name)} ${m.born} ${m.died}
`; document.getElementById('pageContent').innerHTML = html; } function openMartyrForm(editId = null) { const martyrs = getFromLocalStorage('kh_martyrs_admin', martyrsData); const item = editId ? martyrs.find(m => m.id == editId) : null; let html = `

${editId ? '✏️ ویرایش شهید' : '🌟 شهید جدید'}

`; document.getElementById('pageContent').innerHTML = html; if (item?.image) document.getElementById('martyrImagePreview').style.display = 'block'; } function saveMartyr(editId) { const name = document.getElementById('martyrName').value.trim(); if (!name) { showToast('نام شهید الزامی است'); return; } const born = document.getElementById('martyrBorn').value; const died = document.getElementById('martyrDied').value; const parts = born.split('/'); const month = parseInt(parts[1] || 0); const day = parseInt(parts[2] || 0); const martyrs = getFromLocalStorage('kh_martyrs_admin', martyrsData); const newItem = { id: editId || Date.now().toString(), name, born, died, month, day, description: document.getElementById('martyrDesc').value, will: document.getElementById('martyrWill').value, image: document.getElementById('martyrImageData').value || '' }; if (editId) { const idx = martyrs.findIndex(m => m.id == editId); if (idx !== -1) martyrs[idx] = newItem; } else { martyrs.push(newItem); } saveToLocalStorage('kh_martyrs_admin', martyrs); showToast('شهید ذخیره شد', 'success'); renderMartyrsList(); } function deleteMartyr(id) { openConfirmModal('آیا از حذف این شهید مطمئن هستید؟', () => { let martyrs = getFromLocalStorage('kh_martyrs_admin', martyrsData); martyrs = martyrs.filter(m => m.id != id); saveToLocalStorage('kh_martyrs_admin', martyrs); renderMartyrsList(); showToast('شهید حذف شد'); }); } function editMartyr(id) { openMartyrForm(id); } // ========== ثبت‌نام‌ها ========== function renderRegistrations() { const regs = getFromLocalStorage('kh_registrations', []); let html = `
${regs.map((r, i) => ` `).join('') || ''}
#نامشماره موبایلمنطقهتاریخ ثبت
${i + 1} ${escHtml(r.name)} ${r.phone} ${escHtml(r.area || '-')} ${new Date(r.date).toLocaleDateString('fa-IR')}
هیچ ثبت‌نامی وجود ندارد
`; document.getElementById('pageContent').innerHTML = html; } // ========== تنظیمات ========== function renderSettings() { let html = `

تنظیمات پنل مدیریت


`; document.getElementById('pageContent').innerHTML = html; } function changePassword() { const pwd = document.getElementById('newPassword').value; if (!pwd) { showToast('رمز جدید را وارد کنید'); return; } const users = getFromLocalStorage('kh_users', []); const adminIdx = users.findIndex(u => u.username === 'admin'); if (adminIdx !== -1) { users[adminIdx].passwordHash = hashString(pwd); saveToLocalStorage('kh_users', users); } showToast('رمز عبور تغییر کرد', 'success'); } function exportData() { const data = { news: getFromLocalStorage('kh_news_admin', []), martyrs: getFromLocalStorage('kh_martyrs_admin', martyrsData), registrations: getFromLocalStorage('kh_registrations', []) }; const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'khadem_data_backup.json'; a.click(); URL.revokeObjectURL(a.href); } function importData() { const input = document.createElement('input'); input.type = 'file'; input.accept = 'application/json'; input.onchange = e => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = ev => { try { const data = JSON.parse(ev.target.result); if (data.news) saveToLocalStorage('kh_news_admin', data.news); if (data.martyrs) saveToLocalStorage('kh_martyrs_admin', data.martyrs); if (data.registrations) saveToLocalStorage('kh_registrations', data.registrations); showToast('داده‌ها وارد شدند', 'success'); renderDashboard(); } catch(err) { showToast('خطا در خواندن فایل'); } }; reader.readAsText(file); }; input.click(); } function resetToDefault() { openConfirmModal('آیا از بازنشانی همه داده‌ها به حالت پیش‌فرض مطمئن هستید؟', () => { saveToLocalStorage('kh_news_admin', []); saveToLocalStorage('kh_martyrs_admin', martyrsData); showToast('داده‌ها بازنشانی شدند', 'success'); renderDashboard(); }); } // ========== توابع کمکی مودال ========== function openConfirmModal(msg, onConfirm) { document.getElementById('confirmMsg').innerText = msg; const btn = document.getElementById('confirmYesBtn'); btn.onclick = () => { onConfirm(); closeConfirmModal(); }; document.getElementById('confirmModal').classList.add('active'); } function closeConfirmModal() { document.getElementById('confirmModal').classList.remove('active'); } // ========== ناوبری ========== document.querySelectorAll('.nav-item').forEach(btn => { btn.addEventListener('click', () => { if (btn.id === 'logoutBtn') { logout(); return; } document.querySelectorAll('.nav-item').forEach(b => b.classList.remove('active')); btn.classList.add('active'); currentAdminPage = btn.dataset.page; newsPage = 1; martyrsPage = 1; renderPage(); }); }); // مقداردهی اولیه if (!localStorage.getItem('kh_martyrs_admin')) { saveToLocalStorage('kh_martyrs_admin', martyrsData); } renderPage();