كل المشاريع/RIQUID PLATFORM

نظرة عامة

Riquid منظومة منتجات متعدّدة الوحدات تغطّي دورة التجارة من طرفها إلى طرفها — البيع والتنفيذ والتتبّع والتسويق. وهي مبنيّة لعملية تجارة بين الشركات تُدير متجرها الإلكتروني الخاصّ وتُدير في الوقت نفسه الخدمات اللوجستية والتقارير داخليًا. وبدلًا من تطبيق واحد متجانس، تتألّف المنظومة من ثلاث قواعد كود منفصلة للواجهة الأمامية — نواة عمليات بـ React + Vite، ومتجر إلكتروني بـ Next.js، وموقع أعمال بـ Next.js — تتشارك نظام تصميم موحّدًا.

التحدي

أي عملية تجارية ذات حجم حقيقي تتجاوز حدود المتجر الواحد سريعًا. فالبيع ليس سوى واجهة واحدة: الطلبات لا بدّ أن تُنفَّذ، والشحنات لا بدّ أن تُحدَّد مواقعها وتُتبَّع، والمبيعات لا بدّ أن تُقاس، والعمل يحتاج إلى وجه عامّ يتحدّث لغة المنتج البصرية نفسها. والمسار البديهي هو إلحاق كل واحد من هذه العناصر بأي قاعدة كود قائمة بالفعل، والنتيجة المتوقَّعة تطبيق واحد يحمل مسار دفع وتكامل Mapbox ومكتبة رسوم بيانية وصفحة هبوط تسويقية في حزمة واحدة — وكل واجهة تتنافس على قطار الإصدار نفسه. أمّا نمط الفشل البديل فهو فصلها وترك كلٍّ منها ينحرف على هواه، حتى يشعر العميل المنتقل من الموقع التسويقي إلى المتجر إلى واجهة التتبّع أنّه أمام ثلاثة منتجات لا صلة بينها. وكانت المشكلة هي تحقيق الفصل دون الانحراف: تطبيقات متمايزة بوتائر إصدار متمايزة، تُقرأ مع ذلك بوصفها نظامًا واحدًا.

تصميم النظام

تتألّف المنظومة من ثلاث واجهات أمامية قابلة للنشر. نواة العمليات (riquid-website) تطبيق React 18 يعمل على Vite 4، ويُوجَّه بـ React Router v6. وهي تحمل التكاملين اللذين سيكونان عبئًا ميتًا في حزمة متجر إلكتروني: Mapbox GL — مغلَّفًا بـ react-map-gl — لواجهات المواقع والخدمات اللوجستية، وChart.js عبر react-chartjs-2 لتحليلات المبيعات. وتُدار الحركة والعرض بـ Framer Motion وAOS وSwiper، مع react-intersection-observer لقيادة الظهور المرتبط بالتمرير وreact-countup لتحريك الأرقام. ويوفّر Tailwind CSS مع PostCSS وAutoprefixer طبقة التنسيق، ويعمل ESLint بالخيار --max-warnings 0، فتكون بوّابة الفحص اللغوي بوّابة صارمة لا مجرّد توصية.

والمتجر الإلكتروني (riquid-store) مشروع Next.js 14 بنمط App Router مكتوب بـ TypeScript، ومنشور على Vercel عبر ملف vercel.json وملف .env.production مُودَعين في المستودع. وتسكن حالة السلة وحالة العميل في Zustand الإصدار 5 — مخزن بدلًا من سياق يُمرَّر عبر الخصائص، ممّا يُبقي السلة قابلة للوصول من أي موضع في الشجرة دون سلسلة من المزوّدات. وتمرّ المدفوعات عبر روابط Stripe الخاصة بـ React، أي @stripe/react-stripe-js فوق @stripe/stripe-js، فيحدث إدخال بيانات البطاقة داخل إطارات Elements المستضافة لدى Stripe ولا تلامس بيانات البطاقة الخام حالة التطبيق إطلاقًا. وتُجلب بيانات الخادم بـ axios وتُخزَّن مؤقتًا ويُعاد التحقّق منها بـ SWR، ممّا يمنح سلوك stale-while-revalidate في قراءات الكتالوج والطلبات. وطبقة المكوّنات هي shadcn/ui فوق @base-ui/react، مع class-variance-authority وclsx وtailwind-merge لتركيب أسماء الأصناف المبنيّة على المتغيّرات، وlucide-react للأيقونات، وFramer Motion الإصدار 12 للانتقالات. وهي الوحدة الوحيدة التي تملك منظومة اختبار: Vitest مع jsdom، وTesting Library (react وjest-dom وuser-event) وملف vitest.setup.ts — فالوحدة التي تتعامل مع المال هي الوحدة التي تحصل على الاختبارات.

وموقع الأعمال (riquid-business) تطبيق Next.js 14 بـ TypeScript خفيف عن قصد، وهو أيضًا على Vercel، ويعمل على المنفذ 4601 في بيئة التطوير ليتمكّن من العمل جنبًا إلى جنب مع المتجر محليًا دون تعارض في المنافذ. وهو يتشارك مع المتجر مفردات التنسيق والأدوات المساعدة — Tailwind وtailwindcss-animate وclsx وtailwind-merge وlucide-react وZustand وaxios — لكنّه لا يحمل شيئًا من ثقل المدفوعات أو الاختبارات أو الخرائط. وتلك المفردات المشتركة هي ما يمسك المنظومة معًا: ثلاث قواعد كود تلتقي عند إعدادات Tailwind نفسها، وأدوات تركيب الأصناف نفسها، ومجموعة الأيقونات نفسها، حتى يكون المكوّن المكتوب لواجهة واحدة مفهومًا في أي واجهة أخرى. ولا شيء يُجبر الوحدات على التقدّم في صفّ واحد؛ فلكلٍّ منها ملف package.json الخاصّ، وإعدادات الفحص اللغوي الخاصّة، وعملية النشر الخاصّة.

A shared commerce core serves several module frontends — storefront, business, operations and logistics — over one API and data tier.

CLIENTS
Storefront (Next.js)Business Portal (React)Command / Ops (React)Logistics Trace (React)
EDGE
CDNLoad Balancer
API GATEWAY
API Gateway
SERVICES
Auth & OrgsCatalog & OrdersPaymentsLogistics & TrackingAnalytics
ASYNC · REALTIME
Task WorkersEvent Bus
DATA
PostgreSQLRedisObject Storage
EXTERNAL
StripeMapbox

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

كيف يعمل

01/03
01

الدفع في المتجر الإلكتروني

ينتقل العميل من تصفّح الكتالوج إلى دفعة مؤكَّدة عبر Stripe دون أن تدخل بيانات البطاقة حالة التطبيق إطلاقًا.

  1. 1يُعرض الكتالوج من App Router في Next.js، مع جلب قراءات المنتجات والمخزون عبر axios وتخزينها مؤقتًا بـ SWR.
  2. 2وإضافة عنصر تُرسل إجراءً إلى مخزن السلة في Zustand، الذي يحتفظ ببنود الطلب والكمّيات كحالة على جانب العميل يمكن قراءتها من أي مكوّن.
  3. 3وتشتقّ واجهة السلة الإجماليات من ذلك المخزن وتعكس التغييرات فورًا، دون رحلة ذهاب وإياب إلى الخادم عند تعديل الكمّيات.
  4. 4وتُركّب صفحة الدفع مكوّنات Stripe Elements عبر @stripe/react-stripe-js، فتُعرض حقول البطاقة داخل إطارات iframe يتحكّم بها Stripe.
  5. 5وتُؤكَّد الدفعة لدى Stripe باستخدام المفتاح العلني المأخوذ من ملف بيئة الإنتاج؛ ولا تدخل تفاصيل البطاقة مخزن Zustand ولا حزمة التطبيق إطلاقًا.
  6. 6وعند التأكيد، يُفرَّغ مخزن السلة وتُعيد واجهة الطلبات الجلب عبر SWR لالتقاط الطلب المُنشأ حديثًا.
02

الخدمات اللوجستية والتحليلات في نواة العمليات

تُحوّل النواة المبنيّة بـ React + Vite المسار المطلوب إمّا إلى واجهة لوجستية مدعومة بـ Mapbox أو إلى واجهة تقارير بـ Chart.js تعمل على بيانات المبيعات نفسها.

  1. 1تُحمَّل نواة العمليات تحت React Router، فتُحوّل المسار المطلوب إلى واجهة لوجستية أو واجهة تحليلات.
  2. 2وتُركّب الواجهات اللوجستية react-map-gl فوق Mapbox GL، مُهيّئةً خريطة بالرمز المُمرَّر عبر إعدادات بيئة التطبيق.
  3. 3وتُسقَط بيانات المواقع والشحنات على الخريطة كعلامات وطبقات، ممّا يمنح سياقًا مكانيًا للتنفيذ والتتبّع.
  4. 4وتُغذّي واجهات التحليلات بيانات المبيعات الأساسية نفسها إلى react-chartjs-2، الذي يرسم لوحات Chart.js لواجهات التقارير.
  5. 5ويُطلق react-intersection-observer ظهور العناصر ويُحرّك react-countup أرقام الملخّص كلّما دخلت كل لوحة إلى نطاق الرؤية أثناء التمرير.
03

نشر مستقلّ لكل وحدة

كل واجهة من الواجهات الأمامية الثلاث تُبنى وتُفحص لغويًا وتُنشر بوتيرتها الخاصّة، مع التقائها جميعًا عند مفردات تصميم مشتركة.

  1. 1كل وحدة مستودع مستقلّ بذاته، له ملف package.json خاصّ به وملف قفل خاصّ وإعدادات فحص لغوي خاصّة.
  2. 2وأي تغيير في المتجر الإلكتروني يُشغّل next lint ومجموعة اختبارات Vitest؛ وأي تغيير في نواة العمليات يُشغّل ESLint بالخيار --max-warnings 0، الذي يُفشل البناء عند أي تحذير.
  3. 3ويُبنى المتجر الإلكتروني وموقع الأعمال بأمر next build ويُنشران على Vercel بملف vercel.json خاصّ بكل منهما؛ أمّا نواة العمليات فتُبنى بأمر vite build.
  4. 4ولأنّ مفردات التصميم المشتركة تسكن في إعدادات Tailwind وأدوات تركيب الأصناف بدلًا من اعتمادية تعمل وقت التشغيل، يمكن نشر وحدة واحدة دون إعادة بناء الوحدات الأخرى أو إعادة نشرها.

أبرز الميزات

  • متجر إلكتروني بـ Next.js مع دفع عبر Stripe
  • سلة وحالة تطبيق مدعومتان بـ Zustand
  • خدمات لوجستية وتتبّع مواقع بـ Mapbox
  • تحليلات مبيعات بـ Chart.js
  • نظام تصميم مشترك بين الوحدات
  • موقع هبوط للتسويق والأعمال

Outcomes

  • منظومة متعدّدة التطبيقات ومتماسكة بدلًا من أدوات مفكّكة
  • نشر مستقلّ لكل وحدة
  • هوية بصرية متّسقة عبر كل واجهة

أعمال أخرى

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

CureAxis

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

عرض المشروع