انتقل إلى المحتوى
كل المشاريع
Lawz

دراسة حالة · المشروع الرئيسي

Lawz

منصة SaaS لإدارة المكاتب العقارية ومعارض السيارات

أول منتجات شركتي الناشئة Lawz: منصة SaaS متعددة المستأجرين صمّمتها وبنيتها وأطلقتها بمفردي بالكامل، ويستخدمها مكتبان فعليان.

زيارة lawz-sy.com(يفتح في تبويب جديد)

الدور
عمل فردي من البداية إلى النهاية
الحالة
يستخدمه مكتبان
النوع
SaaS متعدد المستأجرين
التقنيات
NestJS · Vue 3 · PostgreSQL · Supabase

01

المشكلة

تحتاج المكاتب العقارية ومعارض السيارات إلى مكان واحد تدير فيه عروضها وطلبات عملائها، من دون أن يطّلع أيٌّ منها على بيانات غيره، وبخطة اشتراك تناسب حجمه.

ما الذي كان على المنتج أن يتعامل معه

  • مساحة عمل معزولة لكل مكتب أو معرض.
  • عروض للعقارات والمركبات معاً، بخصائص ديناميكية.
  • مطابقة العقارات مع طلبات العملاء، وتصفية بحسب المدن والمناطق السورية.
  • خطط اشتراك تضبط التوسّع من دون أن تمنع أي مكتب من الوصول إلى بياناته.

02

دوري

بنيت Lawz بمفردي بالكامل، وهو أول منتجات شركتي الناشئة. وهذا يشمل كل الطبقات: نموذج البيانات وواجهة NestJS API، وواجهة Vue 3 الأمامية، ومجموعات الاختبارات، والعمل الأمني، والإطلاق في بيئة الإنتاج.

  • الواجهة الخلفية و API
  • الواجهة الأمامية
  • قاعدة البيانات
  • التخزين والصور
  • الاختبارات
  • الأمان
  • الإطلاق

03

البنية

بنية Lawzيستخدم موظفو المكاتب والمشرف العام تطبيق ويب مبنياً بـ Vue 3، وهو يتصل بواجهة NestJS API عبر HTTPS. تتولى الواجهة المصادقة مع تحديد معدل الطلبات، وعزل المستأجرين، وحدود الاشتراك، والعروض والمطابقة، ومعالجة الصور، والحذف المؤقت. وتخزّن البيانات في PostgreSQL على Supabase والصور في Supabase Storage.مستخدمو المكاتبمكاتب ومعارضالمشرف العامينشئ حسابات المكاتبتطبيق الويب Vue 3الواجهة الأماميةHTTPSNestJS APIواجهة واحدة لجميع المستأجرينالمصادقة · تحديد المعدلعزل المستأجرينحدود الاشتراكالعروض والمطابقةمعالجة الصورالسلة · الحذف المؤقتالبياناتالصورPostgreSQLSupabase Postgresالتخزين الكائنيSupabase Storage
يستخدم موظفو المكاتب والمشرف العام تطبيق الويب المبني بـ Vue 3، وهو يتصل بواجهة NestJS API واحدة. تفرض هذه الواجهة عزل المستأجرين وحدود الخطط، وتخزّن البيانات في PostgreSQL، وترسل الصور بعد معالجتها إلى التخزين الكائني (object storage)، فتبقى طبقة التطبيق عديمة الحالة (stateless).
  • واجهة API واحدة لجميع المستأجرين

    تمرّ طلبات كل المكاتب والمشرف العام عبر تطبيق Vue 3 نفسه وواجهة NestJS API واحدة.

  • طبقة تطبيق عديمة الحالة

    الملفات المرفوعة تُحفظ في التخزين الكائني (Supabase Storage)، لا على خادم التطبيق.

  • طبقة بيانات مُدارة

    PostgreSQL وتخزين الملفات يعملان كلاهما على Supabase.

04

أهم القرارات والتحديات

  1. 01

    عزل المستأجرين، مع التحقق منه

    كل مكتب عقاري أو معرض سيارات مستأجر معزول بذاته. ولأن اطّلاع مكتب على بيانات مكتب آخر يهدم ثقته بالمنتج، لم أكتفِ بافتراض أن العزل يعمل، بل تحققت منه باختبارات end-to-end.

  2. 02

    حدود اشتراك لا تحتجز البيانات

    ثلاث خطط: Basic (30 عرضاً) و Pro (100) و Max (أكثر من 300). وكان المطلوب تطبيق الحدود من دون أن يُمنع أحد من الوصول إلى حسابه: فانتهاء الاشتراك يوقف إضافة عروض جديدة ويُبقي تسجيل الدخول والاستعراض متاحَين، وتخفيض الخطة إلى ما دون الاستخدام الحالي يوقف الإضافات الجديدة ويحتفظ بكل العروض الموجودة.

  3. 03

    معالجة صور تراعي الخصوصية والسرعة

    صور العروض قد تحمل بيانات الموقع الجغرافي. لذلك تمرّ كل عملية رفع، وهي تشمل عدة صور دفعة واحدة، بمسار معالجة يحذف بيانات EXIF / GPS، ويغيّر أبعاد الصورة، ويحوّلها إلى WebP، وينشئ صوراً مصغّرة.

  4. 04

    خصائص ديناميكية للعقارات والمركبات

    تحمل العقارات والمركبات خصائص ديناميكية، إلى جانب مطابقة العقارات مع طلبات العملاء والتصفية بحسب المدن والمناطق السورية.

  5. 05

    شبكات أمان افتراضية

    حذف مؤقت مع سلة محذوفات، وتحديد لمعدل الطلبات على مسارات المصادقة، وتدقيقات أمنية مخصّصة.

  6. 06

    الإطلاق منفرداً بثقة

    في غياب فريق يراجع التغييرات، تقوم مجموعات الاختبارات مقام شبكة الأمان.

05

النتائج

  • 2مكتبان فعليان يستخدمان Lawz
  • 3خطط اشتراك
  • 380+اختبار وحدة للواجهة الخلفية
  • 330+اختبار للواجهة الأمامية
  • 14اختبار e2e