اذهب إلى المحتوى

ياسر مسكين

الأعضاء
  • المساهمات

    2888
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    6

كل منشورات العضو ياسر مسكين

  1. السلام عليكم ورحمة الله تعالى وبركاته، يمكنك تصفح مقالات ASP.NET المتوفرة حاليا من هنا: https://academy.hsoub.com/programming/c-sharp/dotnet/aspnet/ كما يتم تحديثها وإضافة المزيد منها، يمكنك عمل متابعة للصفحة لكي يصلك أي تحديث بخصوصها كالتالي: كما أنّ المقالات الموجودة في الأكاديمية تحتوي على مصادر ومراجع وحتى على توثيقات رسمية تقودك مباشرة للتصفح أكثر والتعمق في الدرس.
  2. السلام عليكم ورحمة الله تعالى وبركاته، المشكلة الأساسية هي وضع handler404 في ملف main_app/urls.py بدلا من الملف الرئيسي urls.py للمشروع مما يجعل Django يتجاهله ويعطي خطأ 500 عند DEBUG=False لحل المشكلة انقل السطر: handler404 = views.error404 إلى ملف project/urls.py أي الرئيسي وليس تطبيقك مع التأكد من الاستيراد الصحيح، وبالنسبة لمشكلة الملفات الثابتة عند DEBUG=False تحتاج collectstatic وإعداد STATIC_ROOT: STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR / 'staticfiles' STATICFILES_DIRS = [BASE_DIR / 'static'] ثم شغل: python manage.py collectstatic --noinput بعدها أعد تشغيل الخادم، في حال كان سؤاك متعلقا بأحد الدروس في إحدى الدورات أرجو نقله أسفل الدرس الذي تواجه فيه المشكلة فهنا نجيب فقط عن الأسئلة العامة الخارجة عن محتوة الدورة.
  3. وعليكم السلام ورحمة الله تعالى وبركاته، دورة الذكاء الاصطناعي ستفيدك في مجال الروبوتات من ناحية البرمجة والذكاء الاصطناعي والتحليل واتخاذ القرار لكنها لا تغطي جانب الهاردوير أو الإلكترونيات والتحكم في المحركات والحساسات فهي تركّز على بايثون وعلى تحليل البيانات، تعلم الآلة، التعلم العميق، الرؤية الحاسوبية (YOLO، ViT، CLIP)، والتعلم المعزز. وأيضا على بناء نماذج يمكن دمجها لاحقا في أنظمة روبوتية عبر واجهات برمجية أو تكامل مع منصات أخرى، أي أنها تمنحك العقل البرمجي للروبوت وليس جسمه، ولإكمال طريق الروبوتات تحتاج لاحقا لدراسة أساسيات الإلكترونيات والتحكم مثل Arduino أو ROS بجانب ما تتعلمه في هذه الدورة.
  4. السلام عليكم ورحمة الله تعالى وبركاته، هذا الأمر طبيعي فالبيئة الافتراضية تحتاج إلى التفعيل في كل مرة تفتح فيها terminal جديد أو تعود للمشروع. فعند إغلاق ال terminal تفقد البيئة حالتها لأنها مجرد تعديلات مؤقتة على متغيرات البيئة في ال shell الحالي، وليست برنامجا يعمل في الخلفية والحل هو إعادة تنفيذ أمر التفعيل في كل مرة تعود للمشروع فإذا كنت على Linux/Mac استخدم: source venv/bin/activate وأما على Windows استخدم الأمر: venv\Scripts\activate أما إذا كنت تستخدم VS Code يمكنك اختيار البيئة الافتراضية ك Python interpreter عبر Ctrl+Shift+P ثم: Python: Select Interpreter وذلك لتفعيلها تلقائيًا عند فتح terminal جديد داخل المحرر وهذا السلوك مقصود للحفاظ على عزل المشاريع عن بعضها، ولا يعني وجود مشكلة في البيئة الافتراضية.
  5. وعليكم السلام ورحمة الله تعالى وبركاته، لا داعي للقلق، فمحتوى الدورة يبقى متاحا مدى الحياة، حتى بعد عمل التحديثات، لكن يفضل عدم التأخر كثيرا أو الانقطاع مطولا عن الدراسة. لذا فالحل في حالتك هو في عمل مراجعة سريعة (في حال كنت قد نسيت المفاهيم التي درستها) ثم ابحث عن أي جزئية لم تفهمها جيدا ثم اطرح أسئلتك حولها لمساعدتك على تخطّيها. وفي حال كنت قد عملت جميع المشاريع السابقة، يمكنك تسريع الفيديو للوصول إلى المسار الذي توقفت فيه، ثم يمكنك إكماله أيضا، لكن لا تنس عمل المشاريع والتطبيقات العملية كما يجب. بالنسبة لشروط التقدم للامتحان فهي واضحة ويمكنك مراجعتها من هنا: https://support.academy.hsoub.com/exams لكننا ننصح دائما بإتمام الدورة كاملة حتى بعد إتمام شرط الأربع مسارات، وذلك للاستفادة القصوى من محتوى الدورة، فهي أساسية وضرورية، يمكنك مراجعة الإجابة التالية:
  6. وعليكم السلام ورحمة الله تعالى وبركاته، عمل ممتاز، لقد اطلعت على معرض أعمالك وهو جيد جدا. فهو يبرز مهارات frontend قوية مع hover effects ممتازة وتصميم minimalist يمكنك إضافة قسم "Journey" يظهر تطورك زمنيا من مشاريع البكالوريوس (Django/IoT) إلى الماستر (MERN/OAuth) مع timeline تفاعلي. البعض يفضل أيضا إضافة "Live Metrics" للمشاريع مثل uptime 99.9% على Vercel أو stars على GitHub وقسم "Open Source" يوضح مساهماتك إن وجدت. لكن الذي يجذب حقا هو الشهادات وهذا أمر جيد، وأيضا يجب إضافة المشاريع فهي التي تجذب صراحة، أما التنسيقات فيكفي أن تكون كما هي الآن فهي جيدة.
  7. وعليكم السلام ورحمة الله تعالى وبركاته، إحصائيات الحساب في أكاديمية حسوب مثل النقاط والسمعة والمساهمات والمتابعين تعمل كنظام تحفيزي ذكي لبناء مجتمع تعليمي نشيط حيث ترتفع النقاط عبر تفاعلات إيجابية مع أسئلتك وإجاباتك ومقالاتك مما يعزز ثقتك لدى الأعضاء ويجعلهم أكثر استجابة لرأيك، وتعكس جديتك وتطور خبرتك التقنية علنا لينظر إليها إيجابا بالإضافة إلى تمييز المساهمات القيمة وتشجيع المشاركة المفيدة فهي ليست مجرد عرض للتميز بل أداة تنظيمية ترفع جودة النقاشات وتقلل المحتوى العشوائي. أما المخالفات فتشمل نشر محتوى غير لائق أو إساءة للأعضاء أو روابط دعائية دون إذن أو تكرار أسئلة بلا قيمة أو نسخ حلول دون مصدر، مما قد يؤدي إلى تحذيرات أولية ثم إيقاف مؤقت أو دائم حتى للمشتركين في الدورات إذا تكررت الانتهاكات وهذا للحفاظ على بيئة محترمة منفصلة عن نظام الاشتراك.
  8. وعليكم السلام ورحمة الله تعالى وبركاته، يمكن للطالب في المرحلة الثانوية الاشتراك في دورات أكاديمية حسوب حيث الدورات مفتوحة مدى الحياة وتبدأ من الصفر، لكنه قد يحتاج إلى ولي أمر للدفع أو إدارة الحساب وسيستفيد من جميع المميزات التعليمية مثل الدعم المستمر والشهادة المعتمدة وضمان استعادة الاستثمار خلال 6 أشهر عبر مساعدة فريق تطوير الخبرات في إعداد ملف على منصة "مستقل" وبعيد مع إمكانية العمل عليها بعد إتمام الدورة وبناء محفظة أعمال. لكن مواقع العمل الحر لا تقبل من هم دون 18فهي تشترط سن 18 قانونيا لإنشاء حساب وتفعيله برفع الهوية لذا يمكنه أن يدرس الآن لبناء المهارات ومعرض الأعمال ثم ينتظر بلوغه السن القانوني للتقدم للامتحان والشهادة وضمان استرجاع الاستثمار خلال 6 أشهر مع إمكانية العمل غير الرسمي عبر مشاريع شخصية أو عبر معارفه. بخصوص دورة الذكاء الاصطناعي فهي مصممة للمبتدئين تماما من الصفر بتعليم Python أساسياتها، فلا حاجة لدورة علوم الحاسوب إلزاميا لكنها موصى بها لتعزيز الفهم العام للحاسوب والمنطق البرمجي مما يقلل الإحباط ويسرع التقدم. أما بخصوص المتطلبات فهي بسيطة جدا فيكفي حاسوب متوسط المواصفات مع إنترنت مستقر ومحرر كود مثل VS Code، بالإضافة إلى الالتزام اليومي والصبر والاستمرارية هي سر النجاح في هذا المجال.
  9. السلام عليكم ورحمة الله تعالى وبركاته، يبدو أنك لم تطّلع بعد على مميزات الدورة، وعلى شروط إتمامها والتقدم على الشهادة، أذكّرك بأنها متاحة دوما من خلال هذا الرابط: https://support.academy.hsoub.com/exams كما يمكنك الاستفسار حول الامتحان أو أي شيء آخر مباشرة من خلال مركز مساعدة أكاديمية حسوب من هنا: https://support.academy.hsoub.com/conversations وأما حول استفسارك حول كيفية سير الامتحان والاختبار النهائي فأرجو مراجعة الإجابة التالية:
  10. السلام عليكم ورحمة الله تعالى وبركاته، إضافة إلى المعلومات التي تم تقديمها، فإنه من الضروري الاطلاع على مميزات الدورات التي قمت بالاشتراك فيها من هنا: https://support.academy.hsoub.com/page/courses-features ولتحقيق أقصى استفادة من محتوى الدورات، وتقسيم الوقت لدراستها بشكل جيد أرجو الاطلاع على الإجابات التالية:
  11. السلام عليكم ورحمة الله تعالى وبركاته، أكاديمية حسوب لا تقتصر على المحتوى المرئي فقط، عبر دروس الدورات، بل تقدم محتوى نصي ضخم يشمل أكثر من 7500 مقالة و35 كتابا متاحا للتحميل مجانا في مختلف المجالات البرمجية. لذا يمكنك استغلال هذا المحتوى المجاني لدعم مسيرتك التعليمية سواء من خلال المقالات البرمجية أو الكتب من هنا: https://academy.hsoub.com/programming/ https://academy.hsoub.com/files/ أو من خلال توثيق موسوعة حسوب من هنا: https://wiki.hsoub.com/الصفحة_الرئيسية أما الدروس فهي تتيح لك التحميل والاطلاع على الملفات المصدرية النهائية، ولكن لا يوجد ملخصات للدروس بل يحبّذ إنجازها بنفسك ليسهل عليك مراجعتها فيما بعد لتحقق أقصى استفادة من الدروس، كما أنّ ثلة من المدربين متاحين على مدار اليوم والساعة لمرافقتك والإجابة عن أي استفسار يخطر ببالك حول أيّ درس.
  12. السلام عليكم ورحمة الله تعالى وبركاته، أسهل طريقة هي إضافة الخاصية: dir="rtl" و: lang="ar" إلى عنصر <html> في ملف layout الرئيسي: <html dir="rtl" lang="ar"> ثم في قسم <head> من ملف HTML استبدل ملف CSS الافتراضي بالنسخة RTL استبدل التالي: <link rel="stylesheet" href="dist/css/adminlte.min.css"> ب: <link rel="stylesheet" href="dist/css/adminlte.rtl.min.css">
  13. وعليكم السلام ورحمة الله تعالى وبركاته، عالم البيانات لا يحتاج للتعمق الأكاديمي في Data Structures & Algorithms مثل مهندس البرمجيات لكن الفهم الجيد للأساسيات ضروري وليس اختياريا والسبب أنك ستعتمد على مكتبات محسّنة مثل Pandas وScikit-Learn ولن تكتب Binary Search Tree من الصفر، لكن الجهل التام بالأساسيات يجعلك تكتب كود بطيء وغير قابل للتوسع. فعند التعامل مع ملايين الصفوف فالفرق بين استخدام List وSet للبحث قد يعني الفرق بين كود ينتهي في ثانية وآخر في ساعة (O(n) vs O(1)) وفهمك ل Big-O Notation يمنعك من كتابة حلقات متداخلة تدمر الأداء وخوارزميات Machine Learning نفسها مبنية على هياكل بيانات Decision Trees التي تعتمد على الأشجار، Neural Networks على المصفوفات، وNLP على Graphs.
  14. وعليكم السلام ورحمة الله تعالى وبركاته، ملفات composer.json, composer.lock, وpackage.json لا يجب أن تكون في public_html أبدا لأنها تكشف جميع المكتبات والإصدارات المستخدمة مما يسهل على المخترقين معرفة الثغرات الموجودة في مشروعك. أما السبب الذي منعك من الوصول إليها هو أن Apache/Nginx قد يحظر بعض الملفات افتراضيا أو أن الإعدادات الأمنية في Hostinger تمنع الوصول المباشر لذا فالحل الصحيح هو جعل Document Root يشير لمجلد public فقط وليس للمجلد الرئيسي لل Laravel، بحيث تبقى جميع ملفات Composer خارج public_html. أما بخصوص اختبار الاختراق، لا يجب استخدام أدوات تهكير قوية على استضافة مشتركة لأنها قد تؤثر على مواقع أخرى على نفس السيرفر وتخرق شروط الخدمة في Hostinger التي تمنع أي نشاط يهدد استقرار الشبكة يمكنك استخدم اختبارات خفيفة يدوية أو أدوات online scanners أو انشئ بيئة محلية (VM) لاختبار موقعك بحرية.
  15. وعليكم السلام ورحمة الله تعالى وبركاته، الفرق الأساسي بين الكودين هو آلية التكرار ففي الكود الأول يستخدم zip(capitals, cpas) الذي يجمع العنصر الأول من capitals مع العنصر الأول من cpas في tuple واحد (cap, cpa) ثم يطبعهما معا وهذا يتطلب أن يكون للقائمتين نفس الطول ويتوقف عند أقصر قائمة. بينما الكود الثاني يستخدم capitals.items() الذي يتكرر على capitals ك dictionary وليس list ويعيد أزواج key-value على شكل (cpas, capitals) حيث cpas هو المفتاح وcapitals هو القيمة المرتبطة به. فالكود الأول يعمل على قائمتين منفصلتين بالتوازي، بينما الكود الثاني يفترض أن capitals هو dictionary واحد ويستخرج العناصر منه مباشرة - لكن لاحظ أن capitals معرف ك list وليس dictionary مما يعني أن الكود الثاني سيعطي خطأ AttributeError لأن lists لا تملك دالة items().
  16. وعليكم السلام ورحمة الله تعالى وبركاته، بعد تنزيل حزمة Flutter يمكنك فك الضغط في مسار ثابت مثل: C:\src\flutter أو: C:\dev\flutter وأرجو تجنب المسارات التي تحتوي على مسافات أو داخل Program Files ثم أضف مسار مجلد bin داخل Flutter إلى متغيرات البيئة (Environment Variables) عبر البحث عن "environment variables" في Windows، ثم اختر Path وأضف المسار الكامل مثل C:\src\flutter\bin بعدها افتح Command Prompt أو PowerShell وشغّل الأمر التالي: flutter doctor وذلك للتحقق من التثبيت واكتشاف أي مكونات ناقصة بالنسبة ل Android Studio فنعم تحتاجه لأنه يوفر Android SDK الضروري لتطوير تطبيقات Flutter على Android حتى لو كنت ستستخدم VS Code للبرمجة يمكنك تثبيت Android Studio وتفعيل Flutter و Dart plugins من داخله وتثبيت Android SDK Command-line Tools من SDK Manager.
  17. وعليكم السلام ورحمة الله تعالى وبركاته، المشكلة ليست في استخدام الذكاء الاصطناعي وأدواته من عدمه، المشكلة تكمن في توقيت وكيفية استخدامه، ففي فترة التعلم ينصح بعدم الاعتماد عليه لانجاز المشاريع والتطبيقات بدلا منك، كما لا ينصح به لاستخدامه لانجاز التمارين وحل المشكلات بدلا منك، لأنّك بذلك لن تتعلم وستكون تعتمد عليه بشكل مطلق وهذا خطأ، يمكنك قطعا استخدامه لطرح الأسئلة التي تخطر ببالك لكن قد لا تكون مثالية مثل التي موجودة في التوثيقات الرسمية أو الإجابات التي تكون من مبرمجين محترفين، لأنّ الإجابة ستكون وفقا للسياق وليست عامة، لذا ننصحك بطرح أسئلتك وقتما تريد أسفل الدرس الذي تواجه فيه المشكلة.
  18. وعليكم السلام ورحمة الله تعالى وبركاته، الفرق الأساسي بين Class Diagram وER Diagram هو أن الأول يمثل البنية الكائنية الكاملة للنظام البرمجي ويترجم إلى أكواد OOP بينما الثاني يركز حصريا على تمثيل هيكل قاعدة البيانات ويترجم مباشرة إلى جداول SQL. عند تمثيل تطبيق Android في Class Diagram يجب إضافة كل من Java Classes وال Activities لأن Activities هي classes ترث من Android framework وتشكل جزء من معمارية النظام لكن يفضل فصلها في طبقة presentation layer وربطها بال Models وال Controllers حسب المعمارية المستخدمة (MVC/MVVM). بالنسبة ل Firebase، يمكنك استخدام ER Diagram أو Class Diagram مع تعديلات لتناسب بنية NoSQL مثل تمثيل Collections ك entitie وال Documents ك instances مع السماح بتكرار البيانات (denormalization) وdata embedding بدلا من العلاقات التقليدية، مع استخدام Sub-collections للعلاقات المتداخلة. أما تحويل الكود إلى Sequence Diagram (SQD) فيتبع قواعد معينة بحيث كل class/object يصبح lifeline، كل method call يمثل ك message arrow، أما الشروط (if/else) تمثل بـ alt fragments والحلقات (loops) ب loop fragments والترتيب هنا يكون من أعلى لأسفل حسب التسلسل الزمني للتنفيذ.
  19. السلام عليكم ورحمة الله تعالى وبركاته، عمل ممتاز لقد قمت بمراجعة مشروعك وهو جيد لكني أود التأكيد على نقطة مهمة خاصة حول كيفية استخدام الذكاء الاصطناعي لبناء المشاريع صحيح أنه يعتبر أداة قوية لكنها تحتاج أيضا لفهم عميق من جانب المتعلم أو المستخدم لضمان التعلم الحقيقي فالمشروع يبدو منظما من الناحية الهيكلية، لكن التحدي الأكبر هو أنك قد تفوت فرصة التعلم من الأخطاء والتجربة العملية المباشرة. لذا أنصحك بشدة أن تقوم بإعادة بناء أجزاء محددة من المشروع يدويا إن لم تقم بذلك، أي دون الاعتماد على AI خاصة الأجزاء المعقدة مثل إدارة الحالة (state management) أو التعامل مع API فهذا سيعزز قدرتك على حل المشكلات بشكل مستقل وهو ما سيميز المطور المحترف عن المبتدئ.
  20. وعليكم السلام ورحمة الله تعالى وبركاته، قم بتجربة استخدام خيار --web-download من خلال هذا الأمر: wsl --install --web-download إذا لم يعمل مباشرة، جرب التثبيت على مرحلتين: wsl --install --web-download ثم أعد تشغيل الجهاز، وبعدها: wsl --install -d Ubuntu --web-download
  21. وعليكم السلام ورحمة الله تعالى وبركاته، هنا في الأكاديمية ننصح دائما الطلبة بأن يركزو على تعلم المهارات وفهم الدروس والتطبيق العملي مع المدرب وإنجاز التمارين والمشاريع باستمرار أكثر من الاهتمام بالوقت اللازم لانهاء الدورات أو التركيز على الحصول على الشهادة، فكما تعلم فدورات الأكاديمية متاحة لجميع المشتركين مدى الحياة فلا يوجد ما يستدعي الاستعجال لانهائها خاصة إن كانت هذه العجلة دون فهم أو تطبيق عملي. مع ذلك أنصح بعدم خلق فجوة عند التعلم كالتوقف الطويل الذي يفوق الأسبوعين، فهذا سيجعلك تنسى ما تعلمتع وستضطر للبدء من جديد في أغلب الأحيان. بعض الطلبة يقوم بتخطي بعض الدروس والمسارات وهذا أيضا لا نشجع عليه، فيجب دراسة الدروس وفقا للترتيب المعمول به، فهو ترتيب مدروس ولم يتم عمله بشكل عشوائي، لكن يمكن تخطي بعضها والعودة إليها لاحقا، لكن بشرط توضيح ذلك للمدربين وسيقدمون لك الاستشارة بخصوص ذلك بناء على المعطيات التي تقدمها لهم.
  22. وعليكم السلام ورحمة الله تعالى وبركاته، من المستحيل تقنيا منع المتصفح تماما من الوصول إلى API في Laravel لأن المتصفح وأي API Client آخر مثل Postman أو تطبيقات الهاتف أو curl يستخدمون نفس بروتوكول HTTP/HTTPS وأي طلب يمكن محاكاته من أي أداة. الحل الصحيح هو تأمين API بدلا من محاولة حظر نوع معين من العملاء وذلك عبر تطبيق المصادقة (Authentication) باستخدام Laravel Sanctum للتطبيقات البسيطة و SPAs والتطبيقات التي تملكها بالكامل أو Laravel Passport إذا كنت تحتاج OAuth2 الكامل للتطبيقات الخارجية التابعة لجهات ثالثة. أي يجب أن تفرض على كل الطلبات إرسال Token صالح في ال Authorization header مع تطبيق التفويض (Authorization) عبر Policies وGates للتحكم الدقيق في الصلاحيات واستخدام CORS لتحديد النطاقات المسموح لها بالوصول مع العلم أن CORS يُطبق فقط من المتصفحات وليس من أدوات مثل Postman بالإضافة إلى تفعيل HTTPS + HSTS لتأمين النقل وتشفير البيانات الحساسة ومراقبة السجلات (Logging) لرصد المحاولات المشبوهة.
  23. وعليكم السلام ورحمة الله تعالى وبركاته، ال WSL في وضعه الافتراضي يعمل ك Terminal فقط مثل CMD تماما حيث تتعامل معه عبر سطر أوامر Linux. لكن مع Windows 11 يأتي WSL مدعوما بخاصية WSLg (Windows Subsystem for Linux GUI) المفعّلة تلقائيا والتي تتيح تشغيل تطبيقات Linux الرسومية مباشرة دون أي إعدادات إضافية. هنا كل ما عليك هو تثبيت التطبيق وتشغيله وسيظهر كأي برنامج Windows عادي أما إذا كنت على Windows 10 فالواجهة الرسومية غير مدمجة افتراضيا وتحتاج إعدادات إضافية مثل تثبيت X Server. للاستخدام اليومي في البرمجة. معظم المطورين يفضلون استخدام WSL عبر Terminal مباشرة أو فتح VS Code من داخل WSL باستخدام الأمر code . للحصول على تجربة متكاملة ولست بحاجة للواجهة الرسومية الكاملة إلا في حالات محددة جداً
  24. وعليكم السلام ورحمة الله تعالى وبركاته، في الحقيقة لا يمكن إنشاء محاكي من الهاتف نفسه أو استخدام ميزة مدمجة في النظام لكن يمكنك تشغيل Flutter مباشرة على هاتفك الحقيقي كبديل ممتاز للمحاكي أولا من خلال تفعيل خيارات المطور بالضغط 7 مرات على "رقم الإصدار" في إعدادات الهاتف ثم الدخول إلى "خيارات المطور" وتفعيل "USB Debugging". ثم بعد توصيل الهاتف بكابل USB نفتح VS Code ونختار الهاتف من قائمة الأجهزة أسفل اليمين أو من خلال الضغط عليها لإظهار الأجهزة المتصلة ثم تشغيل المشروع بالضغط F5 أو كتابة flutter run في Terminal.
  25. وعليكم السلام ورحمة الله تعالى وبركاته، المشكلة التي واجهتك تحدث لأن جميع التعليقات تعرض بيانات currentUser بدلا من بيانات المستخدم الذي كتب التعليق فعليا فالحل يتطلب تعديلين أساسيين أولا في جهة ال Backend حيث نستخدم Mongoose populate لجلب بيانات المستخدم مع كل تعليق وثانيا في جهة ال Frontend لعرض البيانات الصحيحة لذا في في ملف app/models/Comment.ts أرجو إضافة virtual property لإنشاء علاقة بين التعليق والمستخدم: commentSchema.virtual('user', { ref: 'User', localField: 'userId', foreignField: '_id', justOne: true }); هنا تأكد من إضافة toJSON: { virtuals: true } في إعدادات ال Schema حتى يتم إرجاع ال virtuals عند تحويل ال document إلى JSON وفي ملف app/api/comments/route.ts استخدم .populate() لجلب بيانات المستخدم مع التعليقات: const comments = await Comment.find({ imageId }) .populate("user", "fullname avatar") .sort({ createdAt: -1 }); في ملف app/images/[id]/page.tsx استبدل currentUser ب c.user لعرض بيانات صاحب التعليق الفعلي: <img src={c.user?.avatar || "default-avatar.jpg"} alt={c.user?.fullname || "Anonymous"} /> <p>{c.user?.fullname || "Anonymous"}</p>
×
×
  • أضف...