last_edit / frontend /dashboard.html
Moharek
Deploy Moharek GEO Platform
a74b879
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1"/>
<title>لوحة التحكم — منصة محرك GEO</title>
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/theme.css">
<style>
.bg-mesh{position:fixed;inset:0;z-index:-2;
background:radial-gradient(circle at 10% 10%,rgba(59,130,246,.1) 0%,transparent 40%),
radial-gradient(circle at 90% 90%,rgba(251,191,36,.08) 0%,transparent 40%),
radial-gradient(circle at 50% 50%,rgba(239,68,68,.05) 0%,transparent 60%);
filter:blur(80px);animation:mesh 20s infinite alternate ease-in-out}
@keyframes mesh{0%{transform:scale(1) translate(0,0)}100%{transform:scale(1.1) translate(2%,2%)}}
.bg-grid{position:fixed;inset:0;z-index:-1;background-image:radial-gradient(rgba(255,255,255,.05) 1px,transparent 1px);background-size:32px 32px;opacity:.5}
.services-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:20px;margin:32px 0}
.modal{display:none;position:fixed;inset:0;background:rgba(0,0,0,.8);backdrop-filter:blur(4px);z-index:2000;align-items:center;justify-content:center}
.modal.show{display:flex}
.modal-content{background:var(--bg);border:1px solid var(--border);border-radius:20px;padding:40px;max-width:900px;width:90%;max-height:90vh;overflow-y:auto}
.modal-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:32px}
.modal-title{font-size:24px;font-weight:800;color:var(--text)}
.close-btn{width:32px;height:32px;border-radius:8px;background:var(--bg-card);border:1px solid var(--border);color:var(--text-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:20px;transition:.2s}
.close-btn:hover{background:var(--bg-elevated);color:var(--text)}
.pricing-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:20px}
.price-card{background:var(--bg-card);border:2px solid var(--border);border-radius:16px;padding:32px;text-align:center;transition:.2s;position:relative}
.price-card:hover{border-color:var(--primary);transform:translateY(-4px)}
.price-card.featured{border-color:var(--primary);background:linear-gradient(135deg,rgba(79,70,229,.05),rgba(99,102,241,.02))}
.price-card.featured::before{content:'⭐ الأكثر شعبية';position:absolute;top:-12px;right:50%;transform:translateX(50%);background:var(--primary);color:#fff;padding:4px 16px;border-radius:20px;font-size:12px;font-weight:700}
.price-name{font-size:20px;font-weight:700;margin-bottom:12px;color:var(--text)}
.price-amount{font-size:40px;font-weight:800;color:var(--primary);margin-bottom:4px}
.price-period{font-size:13px;color:var(--text-muted);margin-bottom:24px}
.price-features{text-align:right;margin-bottom:24px;list-style:none}
.price-features li{padding:10px 0;border-bottom:1px solid var(--border);font-size:14px;display:flex;align-items:center;gap:8px}
.price-features li:last-child{border:none}
</style>
</head>
<body>
<div class="bg-mesh"></div>
<div class="bg-grid"></div>
<nav>
<div class="nav-inner">
<div class="logo">
<div class="logo-icon"></div>
محرك GEO
</div>
<div class="nav-links">
<button class="btn btn-secondary btn-sm" onclick="showPricing()">💳 الأسعار</button>
<button class="btn btn-secondary btn-sm" onclick="logout()">خروج</button>
</div>
</div>
</nav>
<div class="wrap">
<section class="hero" style="text-align:center;padding:80px 0 40px;position:relative">
<div style="position:absolute;top:20px;left:15%;width:20px;height:20px;background:#3b82f6;border-radius:50%;box-shadow:0 0 30px #3b82f6;animation:mesh 5s infinite alternate;opacity:0.6"></div>
<div style="position:absolute;top:40px;right:20%;width:15px;height:15px;background:#fbbf24;border-radius:50%;box-shadow:0 0 30px #fbbf24;animation:mesh 6s infinite alternate;opacity:0.6"></div>
<h1 class="hero-title" style="font-size:clamp(40px,6vw,64px);font-weight:900;background:var(--hero-grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent;margin-bottom:20px">لوحة التحكم الذكية</h1>
<p class="hero-subtitle" style="font-size:20px;color:var(--text-muted);max-width:700px;margin:0 auto 40px">تحليل شامل لموقعك مع بيانات حقيقية وتوصيات مدعومة بالذكاء الاصطناعي</p>
</section>
<div class="stats-grid">
<div class="stat-card">
<div class="stat-value" id="totalJobs">0</div>
<div class="stat-label">إجمالي التحليلات</div>
</div>
<div class="stat-card">
<div class="stat-value" id="avgScore">--</div>
<div class="stat-label">متوسط درجة GEO</div>
</div>
<div class="stat-card">
<div class="stat-value" id="totalKeywords">0</div>
<div class="stat-label">الكلمات المفتاحية</div>
</div>
<div class="stat-card">
<div class="stat-value" id="planName">مجاني</div>
<div class="stat-label">الخطة الحالية</div>
</div>
</div>
<div class="input-box">
<div style="font-size:18px;font-weight:700;margin-bottom:16px;color:var(--text)">🔗 تحليل موقع جديد</div>
<div class="input-row">
<input type="url" id="urlInput" placeholder="https://example.com"/>
<input type="text" id="orgName" placeholder="اسم الشركة"/>
<button class="btn" onclick="startAnalysis()" style="background:var(--accent-grad);color:#fff;border:none;font-weight:700;border-radius:10px;padding:12px 32px;box-shadow:0 8px 24px rgba(59,130,246,0.3);transition:0.3s">تحليل الآن</button>
</div>
<div class="msg" id="urlMsg">أدخل رابط موقعك للحصول على تحليل شامل</div>
</div>
<h2 class="section-title">الخدمات المتاحة</h2>
<div class="services-grid" id="servicesGrid"></div>
<h2 class="section-title">التحليلات السابقة</h2>
<div class="grid-3" id="jobsGrid"></div>
</div>
<div class="modal" id="pricingModal">
<div class="modal-content">
<div class="modal-header">
<h2 class="modal-title">خطط الأسعار</h2>
<button class="close-btn" onclick="closePricing()">&times;</button>
</div>
<div class="pricing-grid">
<div class="price-card">
<div class="price-name">مجاني</div>
<div class="price-amount">$0</div>
<div class="price-period">شهرياً</div>
<ul class="price-features">
<li>✓ 3 تحليلات شهرياً</li>
<li>✓ تقرير GEO أساسي</li>
<li>✓ 10 كلمات مفتاحية</li>
<li style="opacity:0.5">✗ تحليل المنافسين</li>
</ul>
<button class="btn btn-secondary" style="width:100%">الخطة الحالية</button>
</div>
<div class="price-card featured">
<div class="price-name">احترافي</div>
<div class="price-amount">$49</div>
<div class="price-period">شهرياً</div>
<ul class="price-features">
<li>✓ تحليلات غير محدودة</li>
<li>✓ تقارير متقدمة</li>
<li>✓ كلمات مفتاحية غير محدودة</li>
<li>✓ تحليل المنافسين</li>
<li>✓ توصيات AI</li>
</ul>
<button class="btn btn-accent" style="width:100%" onclick="upgradePlan('pro')">ترقية الآن</button>
</div>
<div class="price-card">
<div class="price-name">مؤسسات</div>
<div class="price-amount">$199</div>
<div class="price-period">شهرياً</div>
<ul class="price-features">
<li>✓ كل مميزات الاحترافي</li>
<li>✓ API مخصص</li>
<li>✓ دعم أولوية</li>
<li>✓ تقارير مخصصة</li>
<li>✓ فريق متعدد</li>
</ul>
<button class="btn btn-primary" style="width:100%" onclick="upgradePlan('enterprise')">تواصل معنا</button>
</div>
</div>
</div>
</div>
<script>
const API='/api';
const token=localStorage.getItem('token');
if(!token)window.location.href='/login.html';
const services=[
{icon:'🔍',title:'تحليل شامل',desc:'زحف عميق وتحليل كامل للموقع',endpoint:'/jobs'},
{icon:'🔑',title:'الكلمات المفتاحية',desc:'استخراج وتحليل الكلمات الذهبية',endpoint:'/keywords'},
{icon:'✨',title:'المحتوى الذكي',desc:'توليد محتوى احترافي بالAI',endpoint:'/content'},
{icon:'💡',title:'التوصيات',desc:'نصائح مخصصة لتحسين الظهور',endpoint:'/recommendations'},
{icon:'⭐',title:'درجة GEO',desc:'قياس ظهورك في محركات AI',endpoint:'/analyze'},
{icon:'📊',title:'إدارة الإعلانات',desc:'تتبع وتحسين الحملات الإعلانية',endpoint:'/ads'},
{icon:'👥',title:'محلل المنافسين',desc:'اكتشف منافسيك الحقيقيين',endpoint:'/competitor-intel'},
{icon:'🚀',title:'أفعال النمو',desc:'أفعال سريعة وتنفيذ ذكي',endpoint:'/actions'}
];
async function loadDashboard(){
try{
const res=await fetch(`${API}/jobs`,{headers:{Authorization:`Bearer ${token}`}});
const data=await res.json();
if(data.ok){
const jobs=data.jobs||[];
document.getElementById('totalJobs').textContent=jobs.length;
const completed=jobs.filter(j=>j.status==='completed');
if(completed.length>0){
const scores=await Promise.all(completed.slice(0,10).map(async j=>{
try{
const r=await fetch(`${API}/jobs/${j.id}/results`);
const d=await r.json();
return d.analysis?.geo_score?.score||0;
}catch{return 0}
}));
const avg=scores.reduce((a,b)=>a+b,0)/scores.length;
document.getElementById('avgScore').textContent=Math.round(avg);
}
renderJobs(jobs.slice(0,6));
}
}catch(e){
console.error('Load error:',e);
}
}
function renderServices(){
const grid=document.getElementById('servicesGrid');
grid.innerHTML=services.map(s=>`
<div class="card" style="cursor:pointer" onclick="window.location.href='${s.endpoint}.html'">
<div class="card-icon">${s.icon}</div>
<div class="card-title">${s.title}</div>
<div class="card-desc">${s.desc}</div>
<span class="badge badge-success">متاح</span>
</div>
`).join('');
}
function renderJobs(jobs){
const grid=document.getElementById('jobsGrid');
if(!jobs.length){
grid.innerHTML='<div class="card"><p style="text-align:center;color:var(--text-muted)">لا توجد تحليلات سابقة</p></div>';
return;
}
grid.innerHTML=jobs.map(j=>`
<div class="card">
<span class="badge ${j.status==='completed'?'badge-success':'badge-warning'}">${j.status==='completed'?'مكتمل':'جاري'}</span>
<div class="card-title" style="margin-top:12px">${j.org_name||'تحليل'}</div>
<div class="card-desc">${j.url}</div>
<div style="font-size:12px;color:var(--text-dim);margin-bottom:16px">${new Date(j.created_at).toLocaleDateString('ar')}</div>
<button class="btn btn-secondary" style="width:100%" onclick="viewJob(${j.id})">عرض النتائج</button>
</div>
`).join('');
}
async function startAnalysis(){
const url=document.getElementById('urlInput').value;
const org=document.getElementById('orgName').value;
const msgEl=document.getElementById('urlMsg');
if(!url){
msgEl.textContent='⚠️ أدخل رابط الموقع';
msgEl.className='msg msg-error';
return;
}
msgEl.textContent='🔄 جاري التحليل...';
msgEl.className='msg';
try{
const res=await fetch(`${API}/jobs`,{
method:'POST',
headers:{'Content-Type':'application/json',Authorization:`Bearer ${token}`},
body:JSON.stringify({url,org_name:org||'Company',org_url:url,max_pages:5,runs:1})
});
const data=await res.json();
if(data.ok){
msgEl.textContent='✅ تم بدء التحليل!';
msgEl.className='msg msg-success';
setTimeout(()=>window.location.href=`/jobs.html?job=${data.job_id}`,1500);
}else{
msgEl.textContent='❌ '+data.error;
msgEl.className='msg msg-error';
}
}catch(e){
msgEl.textContent='❌ خطأ في الاتصال';
msgEl.className='msg msg-error';
}
}
function viewJob(id){window.location.href=`/jobs.html?job=${id}`}
function showPricing(){document.getElementById('pricingModal').classList.add('show')}
function closePricing(){document.getElementById('pricingModal').classList.remove('show')}
function upgradePlan(plan){alert(`سيتم تفعيل خطة ${plan} قريباً!`)}
function logout(){localStorage.clear();window.location.href='/'}
renderServices();
loadDashboard();
</script>
</body>
</html>