⚡
التحديات
تطلّب دمج خدمتين مستقلتين — متجر ونظام حجز — في منصة واحدة موحّدة بنية معيارية (Modular) مع نموذج User مشترك. تم حلّ إدارة المخزون المعقّدة في وضع متعدد البائعين (Multi-Vendor) مع تنوّع الألوان والمقاسات والروائح من خلال تصميم نموذج Owners مستقل لكل تركيبة.
تم تنفيذ بوابتي الدفع سپهر وزرينبال في آنٍ واحد، برغم اختلاف هياكلهما، من خلال طبقة خدمة (Service Layer) مستقلة وإدارة ردّ نداء (Callback) مخصّصة. تم دعم التقويم الفارسي (الهجري الشمسي) بشكل كامل في جميع الأقسام باستخدام مكتبات persiantools والتخزين المزدوج (ميلادي + هجري شمسي).
وفّر نظام المصادقة عبر رسائل SMS بنظام OTP من خلال خدمة قاصدك (Ghasedak)، وإدارة 5 مستويات وصول باستخدام حقول Boolean مع فحص دقيق للصلاحيات في كل عرض (View)، الأمان والمرونة اللازمين. كما كان تصميم 3 تخطيطات مستقلة (لوحة التحكم، الموقع، SEO) وإدارة 4 أنواع محتوى مختلفة (مقال، سؤال، فيديو، تجربة) في نموذج واحد باستخدام حقل type من أبرز التحديات الأخرى للمشروع.
تم تأمين أمان المعاملات المالية من خلال التحقق من عدم تكرار رمز التتبّع، واستخدام UUID لمعرّف الفاتورة (InvoiceID)، ومطابقة المبلغ في مرحلة Advice. أما قابلية التوسّع فقد تحقّقت من خلال تحسين الاستعلامات، واستخدام select_related، وتخزين النتائج المتكرّرة مؤقتاً.
💡
الحلول
تم بناء المشروع على بنية معيارية (Modular) تضم 10 تطبيقات Django مستقلة، حيث يعمل نموذج User كنقطة اتصال مركزية بين جميع الخدمات. تم تنفيذ نظام المصادقة باستخدام OTP عبر رسائل SMS مكوّنة من 4 أرقام من خلال خدمة قاصدك (Ghasedak)، مع تخزين الرمز في حقل random_pass.
تتم إدارة 5 مستويات وصول من خلال حقول Boolean في نموذج User، مع فحص دقيق للصلاحيات في بداية كل عرض (View). تتبع جميع العروض نمطاً موحّداً من @login_required + is_ajax() + معامل i=action_name + JsonResponse، مما يبسّط صيانة الكود.
تتم إدارة مخزون المنتجات في وضع متعدد البائعين (Multi-Vendor) بشكل مستقل لكل تركيبة من خلال نموذج Owners مع الحقول owner_id وcolor وsize وscent. تم تنفيذ بوابتي الدفع سپهر وزرينبال بطبقتَي خدمة مستقلتين، وإدارة الجلسة (Session)، والتحقق من Advice، ومطابقة المبلغ.
يتم دعم التقويم الفارسي (الهجري الشمسي) باستخدام مكتبات persiantools مع التخزين المزدوج (ميلادي + هجري شمسي) في حقل jalil_record_data. تم تصميم نظام الرسائل النصية التلقائية بدوال مستقلة لكل حالة (التسجيل، الدخول، الطلب، الإيداع) وقوالب ديناميكية في myclass.py.
يتيح نظام الاستشارة الحوارية متعددة المراحل باستخدام نموذج Counseling وربط ManyToMany بـ Conversation، إمكانية رفع الملفات، ومتابعة المحادثة، والأرشفة التلقائية. يدمج نظام SEO إدارة المحتوى باستخدام نموذج Seo الواحد مع حقل type (مقال، سؤال، تجربة، فيديو) وحقول خاصة بكل نوع.
توفّر ثلاثة تخطيطات مخصّصة (shared_panel، shared_index، shared_seo) مع مكونات مشتركة، تنوّعاً بصرياً دون تكرار الكود. تم تأمين الأمان المالي من خلال UUID لمعرّف الفاتورة (InvoiceID)، والتحقق من عدم تكرار رمز التتبّع، ومطابقة المبلغ في مرحلة Advice.
📚
الإنجازات
تم إطلاق مشروع مهديس بالكامل وهو الآن متاح على الإنترنت على العنوان mahdiss.com، حيث يقدّم منصة موحّدة لبيع مستحضرات التجميل وحجز مواعيد صالونات التجميل. يشمل المشروع 10 تطبيقات Django معيارية، وأكثر من 50 صفحة مخصّصة، و25+ نموذج بيانات، و5 مستويات وصول للمستخدمين، تم تنفيذها في 3 تخطيطات مختلفة.
من الناحية التقنية، تم دمج بوابتي دفع موثوقتين (سپهر وزرينبال) بنجاح، ونظام المصادقة عبر OTP بالرسائل النصية مفعّل، وتم تنفيذ ميزات مثل المحفظة الإلكترونية، والاستشارة الإلكترونية، وتحسين محركات البحث (SEO)، وتقارير Excel، والرسائل النصية التلقائية بشكل كامل. تم تأمين النظام من خلال الالتزام بمبادئ حماية CSRF، ومنع XSS، ومنع حقن SQL في جميع الأقسام.
تم تصميم بنية المشروع بشكل معياري وقابل للتوسّع، مما يسهّل تطوير الميزات المستقبلية. وقد نجح هذا المشروع في حلّ تحديات معقّدة مثل دمج خدمتين مستقلتين، وإدارة المخزون في وضع متعدد البائعين (Multi-Vendor)، ومعالجة بوابتي دفع في وقت واحد، ليصبح في النهاية منتجاً جاهزاً للإنتاج.
🔧
النقاط الفنية البارزة
تم بناء مشروع مهديس على Django 4.2.6 (LTS) مع قاعدة بيانات MySQL وواجهة مستخدم Bootstrap 5 (RTL)، ويستفيد من بنية معيارية (Modular) تضم 10 تطبيقات مستقلة. تتبع جميع العروض (Views) نمطاً موحّداً من @login_required + is_ajax() + معامل i=action_name + JsonResponse، مما يبسّط التطوير والصيانة.
يعتمد نظام المصادقة على OTP عبر الرسائل النصية من خلال خدمة قاصدك (Ghasedak)، مع تخزين الرمز في حقل random_pass، بينما تتم إدارة الوصول في بداية كل عرض (View) باستخدام 5 مستويات Boolean Flag (admin_access، shop_access، barber_access، response_access، is_superuser). تم تنفيذ بوابة الدفع سپهر (باستخدام GetToken/Advice/Session) وزرينبال (باستخدام Authority/Verify) كلٌّ في طبقة خدمة (Service Layer) مستقلة.
يتم دعم التقويم الفارسي (الهجري الشمسي) باستخدام مكتبات persiantools وdjango-jalali مع التخزين المزدوج (ميلادي + هجري شمسي في jalil_record_data). تم تصميم نظام الرسائل النصية التلقائية بدوال مستقلة في myclass.py لكل حالة (التسجيل، الدخول، الطلب، الإيداع) وقوالب ديناميكية.
في قسم SEO، يُستخدم نموذج Seo الواحد مع حقل type للتمييز بين أربعة أنواع محتوى (مقال، سؤال، تجربة، فيديو)، مع حقول خاصة بكل نوع (نتيجة القضية، video_id، الدولة، المدينة) تُطبّق بشكل شرطي. توفّر ثلاثة تخطيطات مخصّصة (shared_panel، shared_index، shared_seo) مع مكونات مشتركة، تنوّعاً بصرياً دون تكرار الكود.
تم تأمين الأمان المالي من خلال UUID لمعرّف فاتورة فريد (InvoiceID)، والتحقق من عدم تكرار رمز التتبّع (digitalreceipt/ref_id)، ومطابقة المبلغ في مرحلة Advice، واستخدام csrf_exempt فقط لردّ نداء (Callback) البوابة. أما قابلية التوسّع فقد تحقّقت من خلال تحسين الاستعلامات (select_related، prefetch_related) وتخزين النتائج المتكرّرة مؤقتاً.
🏗️
الهندسة المعمارية
تم تصميم مشروع مهديس على أساس بنية معيارية (Modular Architecture) ومقسّم إلى 10 تطبيقات Django مستقلة: account (المستخدمون)، barber (صالونات التجميل)، product (المنتجات)، cart (سلة التسوق)، marketing (التسويق)، payment (بوابة سپهر)، zarinpal (بوابة زرينبال)، site_profile (الملف الشخصي للموقع)، seo (إدارة المحتوى)، وresume (السير الذاتية). لكل تطبيق مسؤولية محددة، ويعمل نموذج User كنقطة اتصال مركزية بين جميع الخدمات.
يتم إنشاء الاتصال بين التطبيقات من خلال ForeignKey وManyToMany؛ فعلى سبيل المثال، يرتبط Products بـ User عبر owner_shoper_id، ويُحفظ مخزونه في نموذج Owners مع الحقول owner_id وcolor وsize وscent. تم تنفيذ طبقة العرض باستخدام 3 تخطيطات مخصّصة (shared_panel، shared_index، shared_seo) ومكونات مشتركة (header_component، side_bar_component، footer_component، left_pop_up).
تتبع طبقة منطق الأعمال في العروض (Views) نمطاً موحّداً من @login_required + فحص الصلاحيات + is_ajax() + i=action_name + JsonResponse، مما يبسّط الصيانة والتطوير. تم تنفيذ بوابات الدفع كلٌّ في طبقة خدمة (Service Layer) مستقلة بمنطق مخصّص (GetToken/Advice لسپهر وAuthority/Verify لزرينبال).
تم تأمين الأمان من خلال الالتزام بمبادئ حماية CSRF، ومنع XSS، ومنع حقن SQL، بينما تحقّقت قابلية التوسّع من خلال تحسين الاستعلامات (select_related، prefetch_related) وتخزين النتائج المتكرّرة مؤقتاً. التصميم العام يسمح بإضافة تطبيق جديد أو ميزة جديدة دون التأثير على الأجزاء الأخرى من النظام.
📐
نطاق المشروع
من حيث الحجم، يُعدّ مشروع مهديس منصة متوسطة إلى كبيرة، تضمّ 10 تطبيقات Django مستقلة، وأكثر من 25 نموذج بيانات، وحوالي 80+ عرض (View). تتضمّن واجهة المستخدم أكثر من 50 صفحة HTML مخصّصة، تم تنفيذها في 3 تخطيطات مختلفة (shared_panel، shared_index، shared_seo).
يحتوي النظام على 5 مستويات وصول للمستخدمين (المدير العام، البائع، مصفّف الشعر، المستجيب، المستخدم العادي) وبوابتي دفع نشطتين (سپهر وزرينبال). يشمل قسم SEO 4 أنواع محتوى (مقال، سؤال، تجربة، فيديو) بإدارة منفصلة تماماً، وتوفّر لوحة التحكم الشاملة تقارير Excel إلى جانب السيطرة الكاملة على المستخدمين والمنتجات والطلبات والمتاجر وصالونات التجميل.
من حيث الكود، يتكوّن المشروع من أكثر من 15,000 سطر من كود Python وأكثر من 20,000 سطر من كود Templates وFrontend. تحتوي قاعدة البيانات على أكثر من 30 جدولاً مترابطة من خلال علاقات ForeignKey وManyToMany المعقّدة. المشروع حالياً متاح ومفعّل على العنوان mahdiss.com، وجاهز للاستخدام التجاري.