نظرة عامة

AirAds منصّة فائقة المحلّية لاكتشاف التجّار والإعلان عنهم، تساعد العملاء على العثور على النشاط التجاري القريب المناسب في اللحظة التي يحتاجون إليه فيها — عبر البحث بالخريطة والقائمة والواقع المعزّز والصوت. وهي تخدم طرفَي سوق محلّي: المستهلكون الذين يتصفّحون العروض والمقاطع القصيرة والملفات التعريفية للتجّار من حولهم، وأصحاب الأنشطة التجارية الذين يطالبون بقوائمهم ويديرونها ويروّجون لها. ويُسلَّم المنتج على شكل سبعة تطبيقات فرعية متناسقة — نظام خلفي Django REST، وثلاث بوّابات React (الإدارة والتاجر والعميل)، وعميل جوّال Flutter مخطّط له، ومستودع مشترك للبنية التحتية، ومستودع للتوثيق — وجميعها مطوّرة كعمل مملوك لـ AmalAxis.

جولة توضيحية

جولة قصيرة في AirAds.

التحدي

يعاني الاكتشاف المحلّي من مشكلة البداية الباردة: الدليل بلا قيمة ما لم يكن مكتظًّا بأنشطة تجارية دقيقة، ومع ذلك لن يُدخل أي مالك بيانات قائمته يدويًا في منصّة فارغة. تحلّ AirAds ذلك بنموذج «المطالبة للتملّك» — إذ يُزوَّد الدليل مسبقًا ببيانات أوّلية من Google Places وGeoNames، ثم تُزال تكراراته، ثم يُسلَّم إلى المُلّاك الحقيقيين ليطالبوا بمُدخلاتهم ويُثروها. وفوق ذلك تأتي مشكلات أصعب: ترتيب النتائج وفق الصلة المحلّية الحقيقية لا وفق القرب الخام، وفرض تحكّم صارم بالوصول جغرافيًا وبحسب الأدوار بحيث لا يمسّ مدير المدينة إلا بيانات مدينته، وحماية معلومات التعريف الشخصية من طرف إلى طرف، ونقل فيديوهات التجّار (المقاطع القصيرة) إلى تخزين الكائنات دون حجب مسار الطلب. وكان على النظام أن يوفّق بين هذه الاعتبارات عبر نظام خلفي واحد يغذّي ثلاث واجهات أمامية مختلفة، وتطبيق جوّال في نهاية المطاف.

تصميم النظام

النظام الخلفي تطبيق أحادي البنية بـ Django 5.1 + Django REST Framework، منظّم في أكثر من ستة عشر تطبيقًا مركّزًا — accounts وvendors وdiscovery وgeo وreels وsubscriptions وpayments وaudit وgovernance وimports وnotifications وtags وanalytics والتطبيقان الخاصان بالبوّابات vendor_portal/user_portal — تكشف نحو 98 نقطة نهاية. تعتمد المصادقة على djangorestframework-simplejwt، مع فئة CustomerUserJWTAuthentication منفصلة بحيث تبقى رموز المستهلك والتاجر معزولة عن رموز الإدارة، وتحمل رموز JWT مطالبات جغرافية تقود تحديد النطاق. ويدعم GeoDjango فوق PostgreSQL + PostGIS الاستعلامات المكانية، بينما يعمل Redis ذاكرةَ تخزين مؤقت ووسيطًا لـ Celery في الأعمال غير المتزامنة (الإشعارات والاستيراد ومعالجة الفيديو) المجدولة عبر django-celery-beat. أما معلومات التعريف الشخصية المصنّفة كمقيّدة فتُشفَّر أثناء التخزين بـ AES-256-GCM عبر مكتبة cryptography، وتُقنَّع عند العرض وتُستبعد من السجلات؛ ويولّد drf-spectacular مخطّط OpenAPI، ويخدم Daphne طبقة ASGI.

التكاملات مقصودة وحاملة للثقل. فـ Stripe (Checkout وبوّابة العملاء وwebhooks) يشغّل نموذج الاشتراكات المتدرّج — Silver وGold وDiamond وPlatinum — الذي تتغذّى مُضاعِفاته مباشرةً في ترتيب النتائج. ويتولّى Twilio مصادقة الرسائل النصية ورموز التحقّق لمرّة واحدة. وتُرفع مقاطع التجّار القصيرة وصورهم إلى DigitalOcean Spaces (المتوافق مع S3) عبر django-storages وboto3، باستخدام نمط الرفع المباشر إلى التخزين الذي لا يسلّم الـ API سوى s3_key والمدّة، مع بديل محلّي MEDIA_ROOT أثناء التطوير. ويوفّر Google Places كلًّا من مسار التزويد بالبيانات الأوّلية والإثراء على مستوى كل تاجر، محكومًا باستراتيجية موثّقة لإزالة التكرارات.

تتشارك الواجهات الأمامية الثلاث منظومة تقنية واحدة — React 18، وTypeScript 5، وVite، وZustand لحالة العميل، وTanStack Query v5 لحالة الخادم، وaxios، وreact-hook-form مع تحقّق Zod، وRecharts، وأيقونات Lucide، ونظام تصميم مخصّص باسم «AirAd DLS» — لكنها تتباين بحسب الدور. فلوحة الإدارة تضيف خرائط Leaflet، واستيراد CSV عبر PapaParse، وعرض الفروقات للتغييرات المدقَّقة؛ وبوّابة التاجر تتكامل مع Stripe Elements وLottie ومنتقيات التواريخ للعروض الترويجية؛ وبوّابة العميل تتّكئ على Google Maps وFramer Motion وSwiper وتدفّق مقاطع قصيرة على غرار TikTok. أما تطبيق الجوّال المخطّط له بـ Flutter (مع Riverpod وGo Router وDio والواقع المعزّز على الجهاز وspeech_to_text وإشعارات FCM) فيعيد استخدام عقد الـ API نفسه. وكل ذلك مُعبّأ في حاويات Docker Compose خلف وكيل Nginx عكسي، ويُشحن إلى DigitalOcean App Platform عبر بيئات التطوير والتجهيز والإنتاج، مع GitLab CI/CD الذي يشغّل الفحص اللغوي وSemgrep وفحص الأسرار بـ TruffleHog والاختبارات، إضافة إلى نسخ احتياطي مُبرمَج وخطة تعافٍ من الكوارث.

A geospatial platform: map-based discovery served from spatial indexes, with campaign and billing services over a shared, replicated data tier.

CLIENTS
Web App (React + Vite)
EDGE
CDNNginx / Load Balancer
API GATEWAY
API Gateway (Django REST)
SERVICES
Auth & AccountsGeo Search & DiscoveryAd CampaignsBillingNotifications
ASYNC · REALTIME
Task Workers (Celery)
DATA
PostgreSQL + PostGISRedisObject Storage (S3)
EXTERNAL
StripeTwilioMaps

High-level architecture — abstracted for confidentiality; no internal endpoints, hostnames, or credentials are shown.

كيف يعمل

01/04
01

اكتشاف العميل للتجّار

يتحوّل بحث العميل إلى استعلام PostGIS مُرشَّح جغرافيًا، ثم يُقيّمه محرّك الترتيب، ثم يُعرض كواقع معزّز أو خريطة أو قائمة.

  1. 1يُرسل تطبيق العميل عملية بحث (نص أو وسم أو صوت أو إطار عرض الخريطة) مع موقع المستخدم
  2. 2يُنفّذ تطبيقا discovery/geo استعلامًا مكانيًا في PostGIS مُرشَّحًا إلى النطاق الجغرافي الصحيح
  3. 3يُحتسب تقييم للتجّار المرشّحين: مطابقة النيّة 30%، المسافة 25%، الترويج 15%، التفاعل 15%، مُضاعِف الاشتراك 15%
  4. 4تعود النتائج مرتّبة ومقسّمة إلى صفحات، مع الملفات التعريفية والعروض النشطة والمقاطع القصيرة
  5. 5يعرضها العميل كطبقة واقع معزّز فوق الكاميرا، أو خريطة تفاعلية، أو قائمة لا نهائية التمرير
02

مطالبة التاجر والتفعيل التدريجي

يطالب المُلّاك بالقوائم المزوّدة مسبقًا، فيوافق عليها مسؤولون محدّدو النطاق الجغرافي، ثم تتقدّم عبر سُلّم التفعيل.

  1. 1تُزوَّد الأنشطة التجارية مسبقًا من Google Places وGeoNames، ثم تُزال تكراراتها
  2. 2يبحث المالك عن قائمته ويقدّم طلب مطالبة
  3. 3يراجع مسؤول محدّد النطاق الجغرافي الطلب فيوافق عليه أو يرفضه، مع كتابة قيد تدقيق
  4. 4عند الموافقة يتقدّم التاجر من CLAIM إلى ENGAGEMENT إلى MONETIZATION إلى GROWTH إلى RETENTION
  5. 5يفتح مستوى الاشتراك وبوّابات الميزات الخصومات والمقاطع القصيرة والمساعد الصوتي
03

رفع التاجر لمقطع قصير

تُرفع الفيديوهات مباشرةً إلى DigitalOcean Spaces، وتُسجَّل ببياناتها الوصفية، ثم يعالجها Celery بشكل غير متزامن.

  1. 1يختار التاجر مقطع فيديو قصيرًا أو يسجّله داخل البوّابة
  2. 2يرفع العميل الملف مباشرةً إلى DigitalOcean Spaces ويستلم s3_key
  3. 3ثم يرسل البيانات الوصفية (s3_key إضافة إلى duration_seconds) إلى نقطة نهاية المقاطع القصيرة
  4. 4يعالج عامل Celery الأصل بشكل غير متزامن
  5. 5وبمجرّد اكتمال المعالجة يصبح المقطع مرئيًا للعملاء
04

عمليات الإدارة محدّدة النطاق الجغرافي

كل إجراء إداري يمرّ بالمصادقة، ثم التحقّق من الدور، ثم الترشيح بحسب النطاق، ثم التنفيذ، ثم التدقيق.

  1. 1يُصادَق المسؤول فيستلم رمز JWT يحمل مطالبات الدور والنطاق الجغرافي
  2. 2يمرّ كل طلب بتحقّق من الدور مقابل مصفوفة RBAC (من SUPER_ADMIN إلى SUB_ADMIN إلى CITY_MANAGER وما دونها)
  3. 3تُرشَّح الاستعلامات تلقائيًا إلى النطاق الجغرافي للفاعل
  4. 4تُنفَّذ عملية الإنشاء أو القراءة أو التحديث أو الحذف
  5. 5يُسجَّل التعديل في سجلّ التدقيق مع الفاعل وعنوان IP ومعرّف الطلب والحالة قبل التغيير وبعده

أبرز الميزات

  • اكتشاف متعدّد الأنماط: طبقة واقع معزّز، وخريطة تفاعلية، وقائمة، وبحث صوتي باللغة الطبيعية
  • نموذج «المطالبة للتملّك» للتجّار، مزوّد ببيانات أوّلية من Google Places وGeoNames مع إزالة التكرارات
  • ترتيب بحسب الصلة يمزج النيّة والمسافة والترويج والتفاعل ومستوى الاشتراك
  • نظام RBAC هرمي مع تحديد نطاق جغرافي عبر أكثر من أحد عشر دورًا
  • اشتراكات Stripe متدرّجة (Silver/Gold/Diamond/Platinum) تتحكّم في إتاحة الميزات وفي وزن الترتيب
  • رفع المقاطع القصيرة مباشرةً إلى DigitalOcean Spaces مع معالجة غير متزامنة عبر Celery
  • خصومات وعروض ترويجية محدّدة بمدّة زمنية، مع جدولة وعدّادات تنازلية مباشرة
  • تشفير AES-256-GCM لمعلومات التعريف الشخصية المقيّدة، إضافة إلى تسجيل تدقيقي كامل لكل عملية تعديل

Outcomes

  • تسليم نظام خلفي جاهز للإنتاج وثلاث بوّابات React انطلاقًا من عقد API واحد مُدار بالإصدارات، مع عميل Flutter مخطّط له على نقاط النهاية نفسها
  • توحيد نحو 98 نقطة نهاية موزّعة على أكثر من ستة عشر تطبيق Django خلف مصادقة JWT موحّدة، بمصادقة مزدوجة للإدارة والعملاء وتحديد للنطاق عبر المطالبات الجغرافية
  • حلّ مشكلة البداية الباردة للدليل عبر مسار تزويد ومطالبة يعتمد على Google Places/GeoNames مع استراتيجية صريحة لإزالة التكرارات
  • إرساء دفاع متعدّد الطبقات: تشفير معلومات التعريف الشخصية بـ AES-256-GCM، وتسجيل تدقيقي شامل، وفحص Semgrep وTruffleHog مدمج في CI

أعمال أخرى

CureAxis preview
منصّة رعاية صحية

CureAxis

منصّة رعاية صحية متعدّدة المستأجرين بمعايير HIPAA

عرض المشروع
Riquid Platform preview
منظومة تجارة إلكترونية

Riquid Platform

منظومة متعدّدة الوحدات للتجارة بين الشركات والمتجر الإلكتروني والخدمات اللوجستية

عرض المشروع