الموقع وحساب الحاضر
ما يفعله الموقع العام: كتالوج الفعاليات وفلاتره، وصفحة الفعالية، واختيار المقاعد، والدفع، وتذاكر الحاضر وطلباته وفعالياته المحفوظة وملفه الشخصي، ونموذج التواصل، ومحركات البحث وعلامات التسويق.
لحزمة الحزمة الكاملة
الصفحات
كل صفحة موجودة بالإنجليزية تحت /en وبالعربية تحت /ar. ليس للموقع بيانات خاصة به: كل فعالية ومقعد وحجز وطلب وتذكرة تأتي من واجهة API الخاصة بتيكيتوري.
| الصفحة | المسار | ما تعرضه |
|---|---|---|
| الرئيسية | /en | واجهة رئيسية ببطاقات تذاكر حية، ثم الاستكشاف وكيف يعمل وحجز المقاعد وتسجيل الدخول والمنظّمون والأماكن والأسعار والأسئلة الشائعة، ودعوة إلى الإجراء. |
| الفعاليات | /en/events | الكتالوج، مع بحث وفلاتر تبقى في العنوان، بست فعاليات في كل صفحة. |
| فعالية | /en/events/design-talks | تبويبات نبذة والبرنامج والمكان، ولوحة الحجز بأنواع التذاكر، ومعاينة المقاعد، والحفظ، والمنظّم. |
| اختيار المقاعد | /en/events/design-talks/seats | خريطة المقاعد الحية لفعالية بمقاعد محجوزة، مع العدّ التنازلي للحجز. |
| إتمام الشراء | /en/checkout | بيانات المشتري وطريقة الدفع والشروط. تُفتح من اختيار محجوز. |
| تأكيد الطلب | /en/orders/TKT-1042/confirmation | بطاقة واحدة برمز QR لكل تذكرة، وتذاكر PDF، وملف تقويم، وحالة رسالة التذاكر. لا يفتحها إلا مشتريها. |
| تذاكري وطلباتي وملفي الشخصي | /en/account/tickets, /en/account/orders, /en/account/profile | الصفحات الخاصة بالحاضر المسجَّل دخوله. |
| الفعاليات المحفوظة | /en/saved | الفعاليات التي وضع الحاضر عليها نجمة. |
| الأماكن والمنظّمون | /en/venues, /en/organisers | أدلة، لكل منها صفحة لكل مكان أو منظّم وفعالياته. |
| الأسعار والأسئلة الشائعة والتواصل | /en/pricing, /en/faq, /en/contact | باقات للمثال ورسوم الحجز، وأسئلة شائعة، ونموذج التواصل. |
| تسجيل الدخول وإنشاء حساب | /en/auth/login, /en/auth/register | مع إعادة ضبط كلمة المرور وتأكيد البريد الإلكتروني بجانبهما. |
| الخصوصية والشروط والإلغاء | /en/privacy, /en/terms, /en/cancellation-policy | نص من القالب في messages/legal تعيد كتابته لعملك قبل الإطلاق. |
«بِع التذاكر» وروابط المنظّم ترسل المنظّمين إلى تسجيل الدخول في اللوحة على NEXT_PUBLIC_DASHBOARD_URL.
كتالوج الفعاليات
- بحث في العناوين والملخصات والأماكن والمدن والمنظّمين، ومدينة، ونطاق تواريخ، ونوع (
workshopأوtalkأوfestival)، يبقى كله في العنوان بالأسماءqوcityوfromوtoوcategoryوpage، فيمكن مشاركة البحث وتحديثه والتنقل فيه بزرّي الرجوع والتقدم. - تظهر الفعاليات العامة القادمة فقط، الأقرب أولًا. أما المسودات والفعاليات غير المدرجة والملغاة والمؤرشفة فلا تظهر أبدًا؛ والفعالية غير المدرجة تُباع برابطها وحده.
- تسرد البيانات التجريبية الجديدة 22 فعالية من أربعة منظّمين، ثلاث منها جارية الآن.
صفحة الفعالية واختيار المقاعد
- لا صورة للفعالية: يُرسم عنوانها وتاريخها ولونها على شكل تذكرة. يعرض تبويب البرنامج الجدول بالمنطقة الزمنية للفعالية نفسها، ويعرض تبويب المكان طرق الوصول والمواصلات والسعة.
- المقاعد المحجوزة: يفتح اختر المقاعد خريطة المقاعد. يبدأ اختيار أول مقعد الحجز، الذي يُبقي المقاعد طوال مدة حجز المنظّم (عشر دقائق في البيانات التجريبية)، محسوبة بساعة الخادم. تُقرأ الخريطة مرة أخرى كل 20 ثانية، وتعمل بلوحة المفاتيح، وفيها عرض قائمة ميسّر وتكبير. يحجز الطلب الواحد 8 مقاعد على الأكثر.
- الدخول العام: يختار المشتري الكمية في صفحة الفعالية ويضغط متابعة، فتُحجز الأماكن.
- الفعالية التي نفدت تذاكرها تبقى مفتوحة ويمكن حفظها؛ والفعالية الملغاة تقول ذلك ولا تبيع شيئًا.
إتمام الشراء
لا يحتاج الدفع إلى حساب. يكتب المشتري اسمًا أول واسم عائلة وبريدًا إلكترونيًا، ويختار Stripe أو PayPal أو دفع اختباري (أيًّا تعرضه واجهة API)، ويقبل الشروط ويضغط المتابعة إلى الدفع. تتم الدفعة نفسها في صفحة المزوّد، أو في صفحة الدفع الاختباري التي تحل محلها؛ ولا يوجد أي حقل بطاقة في الموقع أبدًا. التذاكر المجانية لا تعرض طريقة دفع، ويفتح احصل على التذاكر صفحة التأكيد فورًا.
الحجز يخص تبويب المتصفح الذي أنشأه. ولا تعرض صفحة التأكيد البطاقات إلا بعد أن تعلن واجهة API أن الطلب مدفوع.
حساب الحاضر
- إنشاء حساب: الاسم الأول واسم العائلة والبريد الإلكتروني وكلمة مرور من 8 إلى 72 حرفًا فيها حرف واحد على الأقل ورقم واحد. ترسل واجهة API رمز تحقق من ستة أرقام بالبريد، صالحًا 24 ساعة؛ ومن دون خدمة بريد يُكتب الرمز في سجل واجهة API.
- طلبات الضيوف تنضم إلى الحساب: بمجرد قبول الرمز يصبح كل طلب قُدّم بذلك البريد ملكًا للحساب.
- تذاكري: الحجوزات القادمة والسابقة مع تقويم، وكل بطاقة برمز QR وملف PDF وملف تقويم.
- الطلبات: كل طلب مع إيصاله وجدول زمني لما حدث له.
- الفعاليات المحفوظة: النجمة على الفعالية تحفظها في الحساب. ويُرسَل الزائر غير المسجَّل دخوله إلى تسجيل الدخول أولًا.
- الملف الشخصي: الاسم والبريد (البريد الجديد يطلب تأكيدًا من جديد) وتفضيلان للبريد. تذكيرات الفعاليات (مفعّلة افتراضيًا) ترسل رسالة واحدة قبل نحو يوم من كل فعالية لدى الحاضر تذاكر لها، وتسردها. والأخبار والعروض يُحفظ كاختيار للحاضر فقط: لا يرسل القالب رسائل أخبار. أما رسائل التذاكر والإيصالات والاسترداد فتُرسل دائمًا.
- تسجيل الدخول: تذكّرني يُبقي الحاضر مسجَّلًا دخوله 30 يومًا بدلًا من يوم واحد. والبريد الخاطئ وكلمة المرور الخاطئة يظهران بالنص نفسه، ورابط إعادة ضبط كلمة المرور يعمل ساعة واحدة.
تتضمن البيانات التجريبية حاضرًا لديه ثمانية طلبات وأربع فعاليات محفوظة؛ وبيانات دخوله في دليل التثبيت.
نموذج التواصل
اسم وبريد إلكتروني وموضوع (سؤال عام، أو التذاكر والطلبات، أو البيع كمنظّم، أو باقة التوسّع، أو الصحافة) ورسالة من 10 إلى 2000 حرف. يتحول كل نموذج إلى استفسار في اللوحة، مع إشعار لأعضاء الفريق الذين يستطيعون قراءة الاستفسارات.
يحمل النموذج حقلًا مخفيًا يصطاد الروبوتات، ويرسل الرسالة نفسها مرة واحدة فقط، ويقبل خمس رسائل لكل عنوان خلال عشر دقائق. خلف وسيط عكسي اضبط TRUST_PROXY=1 في .env الخاص بواجهة API، وإلا يتشارك كل الزوار حصة الوسيط.
كيف تصل التغييرات إلى الصفحات
الصفحات الرئيسية وصفحات الفعاليات والأماكن والمنظّمين تُبنى مسبقًا وتُحفظ ساعة على الأكثر. وحين تُنشر فعالية أو تُعدَّل أو تُلغى أو تنفد تذاكرها، تخبر واجهة API الموقع بإعادة بنائها فورًا، ما دام الاثنان يتشاركان REVALIDATE_SECRET نفسه. يضبط Docker Compose ذلك بنفسه؛ ومن دون Docker ضع القيمة نفسها في back-end/.env وstorefront/.env. أما توفر المقاعد والحجوزات والتذاكر وصفحات الحساب فتُقرأ دائمًا مباشرة.
محركات البحث
- تضبط كل صفحة عنوانها ووصفها وعنوانها الأساسي ولغتها البديلة، وتُبنى من
NEXT_PUBLIC_SITE_URL، فاضبطه على عنوانك الحقيقي قبل البناء. - يسرد
/sitemap.xmlكل صفحة عامة باللغتين، وكل فعالية قادمة في الكتالوج، وكل مكان ومنظّم. ويشير إليه/robots.txtويُبعد الزواحف عن صفحات الحساب والدفع والطلبات وتسجيل الدخول. - صفحات الحساب والدفع والتأكيد وتسجيل الدخول والفعاليات المحفوظة واختيار المقاعد موسومة بـ
noindex.
أوسمة التحليلات والتتبع
هناك ست شبكات مربوطة. شغّل واحدة بوضع معرّفها في storefront/.env (ومع Docker Compose في .env بجانب docker-compose.yml) ثم أعد البناء؛ والمعرّف الفارغ لا يحمّل أي سكربت.
| المتغير | الشبكة |
|---|---|
NEXT_PUBLIC_GTM_ID | Google Tag Manager |
NEXT_PUBLIC_GA4_MEASUREMENT_ID | Google Analytics 4 |
NEXT_PUBLIC_META_PIXEL_ID | Facebook و Instagram |
NEXT_PUBLIC_TIKTOK_PIXEL_ID | TikTok |
NEXT_PUBLIC_SNAPCHAT_PIXEL_ID | Snapchat |
NEXT_PUBLIC_PINTEREST_TAG_ID |
| الحدث | متى |
|---|---|
page_view | كل تغيير مسار |
view_event | تُعرض صفحة فعالية |
save_event | تُحفظ فعالية |
begin_checkout | تُرسل بيانات الدفع ويغادر المشتري إلى الدفع |
purchase | يُعرض تأكيد مدفوع لأول مرة |
contact_submit | يصل نموذج التواصل |
- إذا كان GA4 يعمل داخل حاوية Tag Manager لديك، فاترك معرّف GA4 فارغًا، وإلا حُسبت كل جلسة مرتين.
- يُرسل
NEXT_PUBLIC_ANALYTICS_CURRENCY(USDافتراضيًا) مع الحدث الذي لا يحمل عملة خاصة به، ويسجّلNEXT_PUBLIC_ANALYTICS_DEBUG=trueكل حدث في وحدة تحكم المتصفح. - تُحمَّل الأوسمة بمجرد تحميل الصفحة. إذا كنت تخدم زوارًا في الاتحاد الأوروبي أو المملكة المتحدة، فضع أمامهم لافتة موافقة أولًا.
كيف يترابط كود الموقع
مُضمَّن مع مشترياتك. سجّل الدخول لقراءته، أو افتحه في ملف التنزيل.
بنية الكود والأعراف التي يجب الحفاظ عليها عند تغييره.