بنية النظام
تُقدّم هذه الصفحة تعمّقًا في كيفية بناء FeedbackPulse SaaS. يساعدك فهم البنية على تصحيح الأخطاء وتوسيع المنصة واتخاذ قرارات نشر مدروسة.
مكدس التقنيات
| الطبقة | التقنية | الغرض |
|---|---|---|
| الخلفية | Laravel 12 (PHP 8.4+) | إطار التطبيق، والتوجيه، وORM، وقائمة الانتظار |
| قاعدة البيانات | MySQL 8.0+ / MariaDB 10.6+ | التخزين الدائم للبيانات |
| الواجهة الأمامية | Blade + Alpine.js + Tailwind CSS | واجهة مستخدم مُصيَّرة من الخادم مع مكونات تفاعلية |
| المدفوعات | Stripe PHP SDK + PayPal REST API | فوترة الاشتراكات |
| الذكاء الاصطناعي | OpenAI GPT API | تحليل المشاعر، الوسوم التلقائية، اقتراحات الردود |
| المصادقة | Laravel Socialite | Google & GitHub OAuth |
| البريد الإلكتروني | Laravel Mail (SMTP) | رسائل بريد تحويلية، ملخصات، تقارير |
| الوقت الفعلي | Server-Sent Events (SSE) | بث التقديمات الحية |
| جدولة المهام | Laravel Scheduler (cron) | الملخصات، انتهاء صلاحية التجربة، الاحتفاظ بالبيانات |
نموذج تعدد المستأجرين
يستخدم FeedbackPulse نموذج تعدد مستأجرين بـ قاعدة بيانات واحدة ومخطط مشترك. هذا يعني:
- قاعدة بيانات واحدة تخدم جميع المستأجرين
- كل جدول خاص بالمستأجر لديه عمود
tenant_id - نطاق عام (
TenantScope) يُصفّي تلقائيًا جميع الاستعلامات للمستأجر الحالي - سمة (
BelongsToTenant) تملأtenant_idتلقائيًا عند الإنشاء وتُطبّق النطاق
كيف يعمل تحديد المستأجر
عند ورود طلب، يُحدّد برنامج الوسيط ResolveTenant المستأجر الحالي بهذا الترتيب:
- النطاق الفرعي —
acme.yourdomain.com← يبحث عن المستأجر بالنطاق الفرعي "acme" - النطاق المخصص —
feedback.acmecorp.com← يبحث عن نطاق موثَّق في جدولtenant_domains - المستخدم المصادق — يعود إلى
tenant_idالخاص بالمستخدم المسجّل دخوله
بالنسبة للصفحات العامة (مثل /wall/acme-corp)، يُحدَّد المستأجر من slug في URL مباشرةً في المتحكم (متجاوزًا برنامج الوسيط).