انتقل إلى المحتوى

البنية

السابقالتالي

أربع طبقات منفصلة — المحتوى، والإعدادات، ومنطق النطاق، والواجهة.

أربع طبقات

  • المحتوى — الفعاليات، والبرامج، والفرص، والقصص، والأشخاص، والشركات، والشركاء تعيش في قاعدة البيانات وتُدار من /dashboard. كل سجل مكتوب بلغة واحدة محفوظة في الحقل lang.
  • الإعدادات — كتالوج المساحة، ومنتجات الحجز وقواعده، وباقات العضوية، وقنوات التواصل، والتنقل تعيش في ملفات إعداد لا في قاعدة البيانات.
  • منطق النطاق — خدمة الحجز، وسعة التسجيل، وحالات المواعيد النهائية، ومخططات التحقق. لا شيء منها داخل مكوّنات الواجهة.
  • الواجهة — مكوّنات الخادم افتراضياً. كود العميل محصور في القائمة، ومبدّل اللغة، وحالة النماذج، ومحسّن خطوات الحجز.

نمط المرآة

المسارات أغلفة رقيقة. كل صفحة تحت src/app/[lang]/(site) تعرض content.tsx من مجلد الميزة المطابق في src/components/site/<feature>.

src/app/[lang]/(site)/events/page.tsx
import { EventsContent } from "@/components/site/events/content"
 
export default async function EventsPage(props: PageProps<"/[lang]/events">) {
  const { lang } = await props.params
  return <EventsContent lang={lang} />
}

مسار الطلب

  1. يحوّل src/proxy.ts المسارات المجرّدة إلى /ar أو /en ويجري فحصاً متفائلاً لملف جلسة الإدارة.
  2. تقرأ الصفحة قاموسها وبياناتها على الخادم.
  3. ترسل النماذج إلى Server Actions تتحقق بـ Zod، وتمرّ بحقل المصيدة وحدّ المعدل، ثم تكتب عبر Prisma.

الأمان

  • التحقق يجري على الخادم في كل إجراء.
  • للنماذج العامة حقل مصيدة وحدّ معدل لكل عنوان IP.
  • جلسة الإدارة ملف موقَّع بـ HMAC، وhttpOnly، وSameSite=Lax، ويُعاد التحقق منه في كل صفحة وإجراء إداري.
  • مُحسِّن الصور مقيّد بنطاقات مسموحة.