أربع طبقات
- المحتوى — الفعاليات، والبرامج، والفرص، والقصص، والأشخاص، والشركات، والشركاء تعيش في قاعدة البيانات وتُدار من
/dashboard. كل سجل مكتوب بلغة واحدة محفوظة في الحقلlang. - الإعدادات — كتالوج المساحة، ومنتجات الحجز وقواعده، وباقات العضوية، وقنوات التواصل، والتنقل تعيش في ملفات إعداد لا في قاعدة البيانات.
- منطق النطاق — خدمة الحجز، وسعة التسجيل، وحالات المواعيد النهائية، ومخططات التحقق. لا شيء منها داخل مكوّنات الواجهة.
- الواجهة — مكوّنات الخادم افتراضياً. كود العميل محصور في القائمة، ومبدّل اللغة، وحالة النماذج، ومحسّن خطوات الحجز.
نمط المرآة
المسارات أغلفة رقيقة. كل صفحة تحت src/app/[lang]/(site) تعرض content.tsx من مجلد الميزة المطابق في src/components/site/<feature>.
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} />
}مسار الطلب
- يحوّل
src/proxy.tsالمسارات المجرّدة إلى/arأو/enويجري فحصاً متفائلاً لملف جلسة الإدارة. - تقرأ الصفحة قاموسها وبياناتها على الخادم.
- ترسل النماذج إلى Server Actions تتحقق بـ Zod، وتمرّ بحقل المصيدة وحدّ المعدل، ثم تكتب عبر Prisma.
الأمان
- التحقق يجري على الخادم في كل إجراء.
- للنماذج العامة حقل مصيدة وحدّ معدل لكل عنوان IP.
- جلسة الإدارة ملف موقَّع بـ HMAC، وhttpOnly، وSameSite=Lax، ويُعاد التحقق منه في كل صفحة وإجراء إداري.
- مُحسِّن الصور مقيّد بنطاقات مسموحة.