️ بناء منصة تصويت إلكترونية: التحديات، الحلول، والدروس المستفادة

مرحباً بالجميع! 👋 مؤخرًا، عملت على منصة تصويت عبر الإنترنت بسيطة وآمنة online voting platform لمشروعي الصغير في الكلية، وأردت مشاركة كيف قمت بذلك. من إدارة تسجيلات المستخدمين إلى إعداد نظام موافقة إدارية، علمني هذا المشروع الكثير عن بناء تطبيقات ويب وظيفية باستخدام JavaScript و localStorage. في هذه المقالة على المدونة، سأرشدكم خلال تطوير المنصة والتحديات التي واجهتها وكيف التغلب عليها.

الهدف كان إنشاء منصة تصويت بسيطة يمكنها التعامل مع:

  • تسجيلات المستخدم: السماح للمستخدمين بالتسجيل بناءً على تفاصيلهم.

  • التصويت: السماح للمستخدمين بالتصويت بشكل آمن على الاستفتاءات.

  • التحكم الإداري: تمكين الإدارة من إدارة الاستفتاءات وموافقة/رفض تسجيلات المستخدمين والإشراف على عملية التصويت.

في البداية، كنت أفكر في استخدام خلفية كاملة مع MongoDB، لكني أردت الحفاظ على بساطة الأمور، لذلك استخدمت localStorage لإدارة البيانات لهذه الإصدار الأولى من المشروع.

  1. صفحات تسجيل الدخول والتحقق: يمكن للمستخدمين إنشاء حساب أو تسجيل الدخول.

  2. موافقة المشرف: يتطلب تسجيل المستخدم موافقة المشرف قبل أن يتمكن من التصويت.

  3. نظام التصويت: يمكن للمستخدمين المسجلين التصويت في الاستطلاعات النشطة.

  4. لوحة الإدارة: يمكن للمشرف إنشاء وإدارة الاستطلاعات، وعرض طلبات المستخدمين، والتحكم في من يحق له التصويت.

بدأت ببناء نظام بسيط لتسجيل الدخول والتسجيل باستخدام HTML وCSS وJavaScript وlocalStorage للتعامل مع بيانات المستخدم. تم تعيين حساب المشرف مسبقًا، ولكن يمكن للمستخدمين التسجيل من خلال تقديم اسمهم الكامل ورقم هوية الناخب وكلمة المرور. ومع ذلك، أدركت سريعًا أن السماح لأي شخص بالتسجيل والتصويت دون موافقة المشرف لم يكن الفكرة الأفضل.

لجعل المنصة أكثر أمانًا، قمت بإدخال نظام موافقة المشرف. عندما يقوم المستخدم بالتسجيل، يتم تخزين طلبه في localStorage ويتم وضع علامة “قيد الانتظار” عليه. يمكن للمشرف بعد ذلك مراجعة هذه الطلبات والموافقة عليها أو رفضها.

  • تتبع الطلبات المعلقة: كنت بحاجة إلى التأكد من أن المستخدمين الذين ينتظرون الموافقة لن يتمكنوا من التصويت بعد ذلك.

  • الموافقة على المستخدمين: بمجرد الموافقة، كان يجب نقل بيانات المستخدم من قائمة “المعلقة” إلى قائمة “المستخدمين المسجلين” في localStorage.

قمت بإنشاء نظام بسيط حيث:

  1. تم تخزين طلبات التسجيل في localStorage تحت مفتاح خاص (accountRequests).

  2. عندما وافق المسؤول على مستخدم، تم نقل تفاصيله إلى قائمة users، مما يمنحه الوصول إلى نظام التصويت.

  3. إذا تم رفضه، ظل الطلب في localStorage للرجوع إليه في المستقبل، حتى يتمكن المسؤول من تتبع جميع القرارات.

الصفحة الإدارية سمحت بإنشاء استطلاعات ديناميكية، حيث كان المسؤول يمكنه إضافة خيارات تصويت متعددة. تم تخزين بيانات الاستطلاع في localStorage وعرضها على المستخدمين بمجرد تسجيل دخولهم والموافقة عليهم.

  • يتم إنشاء الاستطلاعات بواسطة المسؤول باستخدام نموذج يسمح بخيارات ديناميكية. يسمح النموذج للمسؤول بإضافة أي عدد من الخيارات اللازمة لكل استطلاع.

  • ثم يمكن للمستخدمين عرض هذه الاستطلاعات والتصويت عليها.

تم تصميم نظام التصويت ليكون بسيطًا: بمجرد تسجيل المستخدمين الدخول والموافقة عليهم من قبل المسؤول، يمكنهم رؤية الاستطلاعات النشطة والتصويت عليها.

  • منع التصويت المتكرر: كان علي التأكد من أن المستخدمين يمكنهم التصويت مرة واحدة فقط في كل استطلاع.

  • تخزين النتائج: تم حفظ الأصوات في localStorage، مرتبطة بالمستخدم المحدد والاستطلاع.

هذا هو الترجمة إلى اللغة العربية:

كان كل صوت مرتبطًا بمعرف المستخدم والاستطلاع المحدد. وهذا ضمن أن كل مستخدم يمكنه التصويت مرة واحدة فقط ، وتم تخزين النتائج بأمان في localStorage.

أردت التأكد من أن المستخدمين يعرفون ما إذا كان تسجيلهم قد تمت الموافقة عليه أو رفضه أو لا يزال قيد الانتظار. لفعل ذلك ، أضفت صفحة “فحص الحالة” حيث يمكن للمستخدمين إدخال معرف التسجيل الخاص بهم للتحقق من حالة الموافقة.

  • الحفاظ على حالة المستخدم: كان من الصعب متابعة كل طلب تسجيل وربطه بالحالة الصحيحة.

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

في البداية ، لم أكن متأكدًا من كيفية هيكلة نظام الموافقة. بعد بعض المحاولات والأخطاء ، قررت استخدام localStorage لإدارة عملية موافقة المستخدم. حافظ هذا على بساطة النظام وسمح بتحديثات سريعة من قبل المسؤول.

السماح للمسؤول بإضافة خيارات تصويت متعددة بشكل ديناميكي كان تحديًا ولكنه مرضٍ. طبقت هذا من خلال السماح للمسؤول بإنشاء استطلاعات بأي عدد من الخيارات المطلوبة ، والتي تم حفظها كمصفوفات في localStorage.

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

بناء هذه المنصة للتصويت علمني الكثير عن التعامل مع بيانات المستخدم، وإنشاء سير عمل الموافقة، وإدارة المحتوى الديناميكي باستخدام localStorage. إليك بعض الدروس المستفادة:

  • إدارة المستخدمين: تعلمت كيفية إدارة حسابات المستخدمين، بما في ذلك التعامل مع التسجيلات المعلقة والموافقات.

  • localStorage للحفاظ على البيانات: كانت هذه المرة الأولى التي أستخدم فيها localStorage بشكل مكثف لمشروع، وكانت تجربة تعليمية رائعة. يعمل بشكل جيد للمشاريع الصغيرة ولكنه قد يحتاج إلى استبداله بقاعدة بيانات مثل MongoDB للتوسع.

  • بناء لوحة إدارة: إنشاء صفحة إدارية لإدارة المستخدمين والاستطلاعات أعطاني نظرة ثاقبة على تعقيدات التحكم الإداري في النظام.

على الرغم من أن الإصدار الحالي من المنصة يعمل بشكل جيد للتصويت على نطاق صغير، إلا أنني أفكر في نقله إلى حل أكثر رسوخية في المستقبل:

  • دمج MongoDB: في المشاريع الكبيرة، يمكن أن يوفر الانتقال إلى MongoDB استمرارية بيانات أفضل وقابلية للتوسع.

  • تنفيذ الواجهة الخلفية: استخدام Express.js للواجهة الخلفية سيتيح معالجة بيانات أكثر أماناً وإدارة أسهل لحسابات المستخدمين والاستطلاعات.

في الوقت الحاضر، أنا سعيد بكيفية تحقيق المنصة. إنها بسيطة وآمنة ووظيفية لنطاق المشروع.


تفقد المنصة الحية: منصة التصويت عبر الإنترنت
استكشف الكود على GitHub: مستودع نظام التصويت


بناء هذا المنصة التصويت عبر الإنترنت كان تجربة تعلم رائعة. من التعامل مع تسجيل المستخدمين والموافقات الإدارية إلى إنشاء استطلاعات ديناميكية وضمان أمن البيانات، ساعدني كل تحدٍ على النمو كمطوّر. أنا متحمس لتطبيق هذه الدروس في المشاريع المستقبلية، وآمل أن يلهمك هذا المنشور لبناء شيء مماثل!

شكرًا لقراءتك، ولا تتردد في مشاركة أفكارك أو أسئلتك أدناه! 😄

Source:
https://arkadiptakundu.hashnode.dev/building-an-online-voting-platform-challenges-solutions-and-key-learnings