دورة تطوير نظام إدارة الأعراس والمناسبات ودعوات QR عمليًا

تجربة المسح في بوابة الحفل

تجربة المسح في بوابة الحفل — نظام إدارة الأعراس والمناسبات ودعوات QR | Next.js وPrisma | أديب الصلوي
وقت الدراسة
14 دقيقة

المسار: تطوير نظام إدارة الأعراس ودعوات QR الوحدة: توليد وقراءة رموز QR

مدخل إلى الدرس: تجربة المسح في بوابة الحفل

تجربة المسح في بوابة الحفل — نظام إدارة الأعراس والمناسبات ودعوات QR | Next.js وPrisma | أديب الصلوي

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

أهداف هذا الدرس

  • تصميم صفحة مسح Point-of-View لموظف الفرزة.
  • بناء دالة مسح بالكاميرا تلتقط المحتوى عبر navigator.
  • ترجمة نتيجة API إلى شاشة نجاح/خطأ ناطقة.

مثال

// app/admin/scan/page.tsx + ScanBox component
"use client";

import { useEffect, useRef, useState } from "react";

export default function ScanPage() {
  const videoRef = useRef(null);
  const [result, setResult] = useState(null);
  const [state, setState] = useState<"idle" | "scanning" | "ok" | "err">("idle");

  useEffect(() => {
    let stream: MediaStream | undefined;
    (async () => {
      stream = await navigator.mediaDevices.getUserMedia({
        video: { facingMode: "environment" }, // كاميرا خلفية
      });
      if (videoRef.current) {
        videoRef.current.srcObject = stream;
        await videoRef.current.play();
      }
    })().catch(() => setState("err"));

    return () => stream?.getTracks().forEach((t) => t.stop());
  }, []);

  async function onDetected(text: string) {
    // text = "https://site/i/TOKEN?sig=SIG"
    const m = text.match(/\/i\/([^?]+)\?sig=(\w+)/);
    if (!m) return setResult("رمز غير صالح");
    const [, token, sig] = m;
    const res = await fetch("/api/checkin", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ token, sig, eventId: "EVENT_ID" }),
    });
    const body = await res.json();
    setResult(body.ok ? `تم استقبال ${body.data.guest}` : body.error);
    setState(body.ok ? "ok" : "err");
  }

  return (
    

بوابة المسح

{result ?? "وجّه الكاميرا نحو رموز QR"}
); }

المخطط: تفاعل جهاز الفرزة مع النظام لحظة المسح

flowchart TD
    A["الكاميرا → اكتشاف رمز → (token,sig)"] --> P["POST /api/checkin"]
    P --> R{"النتيجة"}
    R -->|ok| G["شاشة خضراء — تم استقبال {name}"]
    R -->|409| D["مكرر — سبق تسجيله + firstSeen"]
    R -->|403/404| E["شاشة حمراء — أمن / غير موجود"]

تجربة الفرزة

المسح يتلاعب بمسار الوسائط النظيف: تفعّل الكاميرا في صفحات مستقلة، وتوقف تدفقها عند مغادرة الشاشة. ودرّب الموظف: عند الوضع الأحمر أعِد المسح بعد لحظات دون محاولة إدخال يدوي للرمز.

تمرين تطبيقي: أضف إشارة صوتية عند النجاح بوسيلة new Audio() واهتزازاً عبر navigator.vibrate لتنبيه الموظف بين الفرزتين دون النظر للشاشة.

أخطاء شائعة يجب تفاديها

  • تشغيل getUserMedia بلا try/catch فتبقى صفحة بيضاء.
  • فتح الكاميرا مرتين (عند إعادة النقر) دون إيقاف المسار السابق.
  • عدم إغلاق الشاشة بعد نتيجة ناجحة فيعود المسح مراراً لنفس الضيف.

معجم مصطلحات الدرس

facingMode environment
طلب الكاميرا الخلفية في المتصفح.
regexp /i/...
استخرج token وطابع من نص الرابط.
نظف المسار
فتح وإيقاف دفق MediaStream عند انتهاء المكوّن.

مراجعة وتمرين تثبيت المهارة

اختبار سريع: اشرح بعبارتك معنى «تجربة المسح في بوابة الحفل»، ثم بيّن أين ستستخدمه داخل نظام تسجيل حضور دعوات مناسبة عبر رمز QR، وما الخطأ الذي يجب اختباره قبل الاعتماد على الحل.

تحدٍّ إضافي: غيّر شرطًا واحدًا في التطبيق، وتوقع النتيجة، ثم نفّذ الاختبار وفسّر الاختلاف.

الدرس التالي: واجهة تتفهم حالة الحضور والحصر. من الأفضل إنهاء التجربة الحالية قبل متابعة الدرس التالي.

دروس نصية

#1

نظرة عامة على الدورة والمخرجات

#2

مقدمة إلى Next.js وأسباب اختياره

#3

أساسيات schema.prisma والنماذج

#4

مقدمة Route Handlers وبنية الاستجابة

#5

فهم Server Components والجلب الآمن

#6

تصميم الرمز Secured والتوقيع HMAC

#7

بناء الإنتاج وتجنّب أخطاء الحالة المربكة

#8

تحليل المتطلبات وتحديد الكيانات

#9

إنشاء مشروع Next.js وتجربته

#10

نموذج المناسبة Event بالعلاقات

#11

واجهة إنشاء المناسبة POST /api/events

#12

تصميم صفحة الدعوة الإلكترونية

#13

توليد صورة QR من قاعدة الدعوة

#14

نشر المشروع على Vercel

#15

تصميم قاعدة البيانات والعلاقات

#16

تجريب PostgreSQL محلياً وإنشاء قاعدة الداتا

#17

نموذج المدعو Guest مع الرمز الموقّع

#18

واجهات الضيوف الإضافة والقائمة

#19

نموذج الرد RSVP التفاعلي

#20

تجربة المسح في بوابة الحفل

#21

قاعدة بيانات إنتاج مُدارة وأمانها

#22

تدفق الدعوة وقراءة QR من التوليد إلى الحضور

#23

تثبيت Prisma والاتصال بالقاعدة

#24

نموذج الرد Rsvp ومنع التكرار

#25

واجهة تسجيل الحضور POST /api/checkin

#26

صفحة قائمة الضيوف والفرز

#27

واجهة تتفهم حالة الحضور والحصر

#28

إدارة المتغيرات السرية بيئة وواجهة

#29

سيناريو المشروع وقواعد العمل

#30

بنية مجلدات المشروع ومسارات الصفحات

#31

الاستعلام والجلب مع العلاقات

#32

التحقق من المدخلات ومعالجة الأخطاء

#33

لوحة الإحصائيات الحية

#34

تأمين الروابط والهجمات الشائعة

#35

قائمة الفحص النهائي قبل الإطلاق

#36

الترحيلات migrations والبذور seed

عرض الدروس كاملة تحقق من صفحة تعلم الدورة
درس نصي 3/36
أنت تشاهد
تجربة المسح في بوابة الحفل