// ==================================================
// توابع مخصوص پنل مدیریت (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 = `
${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 = `
`;
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) => `
| ${start + i + 1} |
${escHtml(m.name)} |
${m.born} |
${m.died} |
|
`).join('')}
`;
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) => `
| ${i + 1} |
${escHtml(r.name)} |
${r.phone} |
${escHtml(r.area || '-')} |
${new Date(r.date).toLocaleDateString('fa-IR')} |
`).join('') || '| هیچ ثبتنامی وجود ندارد |
'}
`;
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();