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

Ahmed Elmrsawy

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

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

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

كل منشورات العضو Ahmed Elmrsawy

  1. السلام عليكم , يوجد العديد من المكتبات التي تحتوي على ذلك , و من ضمنهم : -material ui - and design -flowbite - في حال استعمال tailwind - chakra ui -core ui -react prime - في حال استعمال react مثال من ant design import React from 'react'; import { Rate } from 'antd'; const App: React.FC = () => <Rate allowHalf defaultValue={2.5} />; export default App;
  2. السلام عليكم , هذا معناة ان الserver يعمل بشكل صحيح ولكن يوجد مشكلة في الكود نفسة . تأكد من أن الخادم node js يعمل على port 8080 او البورت الأساسي للموقع و ليس على بورت أخر خاص بالdevelopment اذا كنت تستعمل api فتأكد من أضافة /api للroutes التي تريدها
  3. السلام عليكم , الpromise هو feature أساسية في الجافاسكريبت , و هو أساسي للتعامل مع الevents و الأشياء التي تحتاج الى وقت ليتم تنفيذها مثل ما ذكرت setTimeout , و احضار بيانات من قاعدة البيانات على سبيل المثال . و فائدة الpromise أنه ابسط من استعمال الcallback و كتابتة أسهل . و يتم انشاء الpromise في ابسط صورة كالتالي : const myPromise = new Promise((resolve, reject) => { // الشيفرة الرئيسية هنا // إذا تمت العملية بنجاح resolve("نجاح!"); // إذا حدث خطأ reject("حدث خطأ!"); }); في الpromise يوجد 3 حالات و هم : قيد التنفيذ (Pending): الحالة الابتدائية للـ Promise. لا يتم تحقيقها ولا يتم رفضها بعد. تم التحقيق (Fulfilled): الحالة التي تحدث عندما تكتمل العملية الغير متزامنة بنجاح. النتيجة متاحة، ويمكنك الوصول إليها باستخدام طريقة then. تم الرفض (Rejected): الحالة التي تحدث عند فشل العملية الغير متزامنة. السبب في الفشل متاح، ويمكنك التعامل معه باستخدام طريقة catch. و يتم التعامل معه كالتالي : myPromise .then((result) => { console.log("تم بنجاح:", result); }) .catch((error) => { console.error("حدث خطأ:", error); }); يمكنك استخدام .then للتعامل مع نتيجة ال Promise عندما تنجح، و .catch للتعامل مع الأخطاء عند فشلها. و يمنك أيضا ان شاء سلاسل كالتالي : promise1() .then(result1 => { return promise2(result1); }) .then(result2 => { // استخدم result2 هنا }) .catch(error => { console.error("حدث خطأ:", error); }); و استعمال async و await هو الشكل الأحدث و الأسلس و الأكثر انتشارا لأنة يسهل العملية أكثر من أي وقت مضى مثال : // دالة تقوم بإرجاع Promise بعد فترة زمنية معينة function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } // دالة async تستخدم await لاستنظار إكمال الPromise async function exampleAsyncFunction() { console.log("قبل الانتظار"); // استخدام await لاستنظار إكمال الPromise await wait(2000); console.log("بعد الانتظار"); } // استدعاء الدالة الasync exampleAsyncFunction();
  4. مرحبا , نعم يمكن البدأ مباشرة ب redux toolkit و لكن ينصح بفهم المبادئ العامة للتعامل مع redux في البداية مثل الreducers و الstore و غيرها . كما أنة أيضا يمكنك تجربة RTK Query و البدأ بها مباشرة و التي سوف تسهل التعامل أكثر و أكثر .
  5. السلام عليكم , يمكنك تنفيذ ذلك باستعمال مكتبة مثل jsPdF و هي مكتبة جافاسكريبت , يمكنك أيضا استعمال العديد من المكاتب الأخرى و لكن بتجربتي وجدت أنها الأسلس , و هي تؤدي الى استخراج الجدول في شكل pdf و هذا مثال على الكود : import jsPDF from "jspdf"; const downloadPDF = () => { setNumberOfRows(wishList?.length); setTimeout(() => { const capture = document.querySelector(".table-to-print"); setLoader(true); html2canvas(capture).then((canvas) => { const imgData = canvas.toDataURL("img/png"); const doc = new jsPDF("p", "mm", "a4"); const componentWidth = doc.internal.pageSize.getWidth(); const componentHeight = doc.internal.pageSize.getHeight(); doc.addImage(imgData, "PNG", 0, 0, componentWidth, componentHeight); setLoader(false); doc.save("table.pdf"); setNumberOfRows(10); }); }, 100); }; و يمكنك استخدام مكتبة xlsx لاستخراج البيانات في excel sheet و هذا مثال أخر : import * as XLSX from "xlsx"; const exportExel = (data) => { const workSheet = XLSX.utils.json_to_sheet(data); const workBook = XLSX.utils.book_new(data); XLSX.utils.book_append_sheet(workBook, workSheet, `test`); //Buffer XLSX.write(workBook, { bookType: "xlsx", type: "buffer" }); //Binary string XLSX.write(workBook, { bookType: "xlsx", type: "binary" }); //Download XLSX.writeFile(workBook, "report.xlsx"); };
  6. السلام عليكم , يمكنك اتباع الخطوات التالية: - إنشاء صفحة تسجيل الدخول: قم بإنشاء مكون في React يُظهر واجهة تسجيل الدخول. استخدم حالة الدخول لتحديد ما إذا كان المستخدم مسجل الدخول أم لا. - تحديد مسار لتسجيل الدخول: استخدم React Router لتحديد مسار لصفحة تسجيل الدخول. في مكون الأمان (الذي يتحكم في مسألة الدخول)، قم بتحديد السلوك المناسب بناءً على حالة الدخول. - توجيه المستخدم غير المسجلين: عندما يحاول المستخدم الوصول إلى صفحة المدونة، تحقق من حالة تسجيل الدخول. إذا كان غير مسجل، قم بتوجيهه إلى صفحة تسجيل الدخول. - تحديث حالة تسجيل الدخول: بعد تسجيل الدخول بنجاح، قم بتحديث حالة تسجيل الدخول في التطبيق. يمكنك استخدام سياق (Context) للتحكم في حالة تسجيل الدخول عبر مكونات التطبيق. - تخزين حالة تسجيل الدخول: للحفاظ على حالة تسجيل الدخول بين جلسات التصفح، يمكنك استخدام ميزات التخزين المحلي مثل localStorage أو sessionStorage. قد يكون هذا شكلًا عامًا لهيكل التطبيق: // AuthContext.js import React, { createContext, useContext, useState, useEffect } from 'react'; const AuthContext = createContext(); export const AuthProvider = ({ children }) => { const [isLoggedIn, setLoggedIn] = useState(() => { // استرجاع قيمة isLoggedIn من localStorage عند تحميل التطبيق return localStorage.getItem('isLoggedIn') === 'true'; }); useEffect(() => { // حفظ قيمة isLoggedIn في localStorage عندما تتغير localStorage.setItem('isLoggedIn', isLoggedIn.toString()); }, [isLoggedIn]); const login = () => { setLoggedIn(true); }; const logout = () => { setLoggedIn(false); }; return ( <AuthContext.Provider value={{ isLoggedIn, login, logout }}> {children} </AuthContext.Provider> ); }; export const useAuth = () => { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; };
  7. السلام عليكم , السبب في ذلك هو نسخة next 13 الجديدة التي تحتوي على العديد من التحديثات من ضمنها تغيير نظام الrouting من النظام القديم الذي يحتوي على مجلد pages و ما الى الإعتماد فقط على مجلد app و اعتبارة هو ملف الsrc بمعنى أصح و الاعتماد علية في الrouting و تغيير الطريقة و النظام بشكل عام و يمكنك الأطلاع و معرفة المذيد من خلال هذا الرابط : https://nextjs.org/docs/app/building-your-application/routing/pages-and-layouts ____ هناك العديد من المميزات لهذا النظام الجديد و لكنة لا يزال في مرحلة تجريبية و اذا كنت ترغب في النظام القديم ف يجب عليك اختيار استخدام مجلد pages و ليس app عند مرحلة تنزيل الnext js من البداية .
  8. ASP.NET Core يُوفر مرونة كبيرة في كيفية بناء تطبيقات الويب، ويمكن استخدام نمطين رئيسيين هما MVC و API بشكل مستقل أو معًا حسب احتياجات التطبيق. MVC (Model-View-Controller): التعريف: يعتمد نمط MVC على تقسيم التطبيق إلى ثلاثة أقسام رئيسية: Model (النموذج) الذي يتعامل مع البيانات والتفاعل مع قاعدة البيانات، View (العرض) الذي يعرض البيانات للمستخدم، و Controller (التحكم) الذي يدير تدفق البيانات بين Model و View. استخدامه: يُستخدم نمط MVC عادةً لبناء تطبيقات الويب التقليدية التي تحتاج إلى صفحات متعددة وتفاعل مع المستخدم عبر واجهة المستخدم. المكونات: يشمل على مستوى العرض (Views) ومستوى التحكم (Controllers) ومستوى النموذج (Models). ______ API (Application Programming Interface): التعريف: تقدم واجهة برمجة تطبيق (API) نقاط نهاية (Endpoints) للتفاعل مع التطبيق. يمكن أن تكون البيانات مرجعية على شكل JSON أو XML. استخدامه: يستخدم لبناء خدمات الويب والتطبيقات التي تحتاج إلى تبادل البيانات بشكل فعال بين العميل والخادم، ويُستخدم أيضًا في تطوير تطبيقات SPA (Single Page Applications). المكونات: يركز بشكل أساسي على إنشاء Endpoints (عناوين URL) التي يمكن الوصول إليها بواسطة العملاء. ______________ الفرق: MVC vs API: MVC يستخدم لبناء تطبيقات الويب الكاملة، بينما يُستخدم API لتبادل البيانات بين العميل والخادم. عناصر مكوناتهم: في MVC، تحتاج إلى عناصر النموذج والعرض والتحكم. في API، تحتاج إلى نقاط نهاية API التي تستجيب لطلبات الويب. التفضيل والمتى استخدام كل واحد: استخدم MVC عندما تحتاج إلى بناء تطبيق ويب تقليدي يتضمن صفحات متعددة ويتفاعل مع المستخدم عبر واجهة المستخدم. استخدم API عندما تحتاج إلى توفير خدمات واجهة برمجة تطبيق للعملاء للتفاعل مع التطبيق أو عندما تقوم ببناء تطبيق SPA. ________________ ASP.NET Core: ASP.NET Core هو إطار عمل (framework) يدعم ويجمع بين كلا النمطين (MVC و API) بشكل جيد. يمكنك استخدام MVC و API معًا في نفس التطبيق والاستفادة من المزيد من المرونة. لا يمكن قول أن أحدًا منهم أفضل من الآخر، حيث يعتمد الاختيار على احتياجات التطبيق الخاص بك.
  9. يمكن عمل dark mode في العموم بأكثر نمن حل و الفكرة دائما تقوم على تخزين ملف يحتوي على المتغيرات التي تحتوي على الوان او متغيرات الخاصة بالtheme و هذة المتغيرات اما يتم تخزينها في ملف في الكود نفسة أو في الcss variables و يمكن تخزينها في context او استعمال redux مثال على استعمال الcss variable : :root { --background-color: #ffffff; /* اللون العادي */ --text-color: #000000; /* لون النص في الوضع العادي */ } .dark-mode { --background-color: #121212; /* اللون في وضع الظلام */ --text-color: #ffffff; /* لون النص في وضع الظلام */ } body { background-color: var(--background-color); color: var(--text-color); } _________________ مثال على استعمال context : import React, { useState, useEffect } from 'react'; const ThemeContext = React.createContext(); const ThemeProvider = ({ children }) => { const [isDarkMode, setDarkMode] = useState(false); useEffect(() => { const savedDarkMode = localStorage.getItem('darkMode'); if (savedDarkMode) { setDarkMode(savedDarkMode === 'true'); } }, []); const toggleDarkMode = () => { setDarkMode((prevMode) => { const newMode = !prevMode; localStorage.setItem('darkMode', newMode.toString()); return newMode; }); }; return ( <ThemeContext.Provider value={{ isDarkMode, toggleDarkMode }}> {children} </ThemeContext.Provider> ); }; const useTheme = () => { const context = React.useContext(ThemeContext); if (!context) { throw new Error('useTheme must be used within a ThemeProvider'); } return context; }; export { ThemeProvider, useTheme }; _________________________ أما بالنسبة لسؤال كيف يمكن تخزين الحالة حتا تكون نفسها عند عودة المستخدم مرة أخرى فللقيام بذلك نستعمل الlocal storage و نقوم بفحصها كل مرة يقوم المستخدم بذيارة الموقع استخدم localStorage لتخزين حالة الثيم بين جلسات التصفح. useEffect(() => { localStorage.setItem('darkMode', isDarkMode.toString()); }, [isDarkMode]); عند تحميل الصفحة، قم بقراءة حالة الثيم من localStorage وقم بتعيينها لـ isDarkMode في التأثير الجانبي. useEffect(() => { const savedDarkMode = localStorage.getItem('darkMode'); if (savedDarkMode) { setDarkMode(savedDarkMode === 'true'); } }, []);
  10. السلام عليكم , لقد راجعت الكود الخاص بك و وجدت خطأ في صفحة الloginScreen و الخطأ هو في استخدام الaxios حيث أنك تقوم باستخدامة دول عمل import لة يجب عمل import كهذا : import Axios from 'axios'; و من الممكن أيضا استعماله بصورة أخرى كهذة : let response = await Axios({ method: 'post', url: Urls.AUTH, data: data, });
  11. السلام عليكم , هناك بعض الحلول التي من الممكن اتباعها في تلك الحالة : 1) npm config set puppeteer_skip_chromium_download true 2) Add puppeteer_skip_chromium_download=true to .npmrc file where the package.json location و بعدها npm install --unsafe-perm=true --allow-root و يمكنك معرفة المذيد من هنا https://github.com/GoogleChrome/puppeteer/issues/2270 https://medium.com/forcit/seo-for-single-page-applications-8543619e1d0c _______________________________ ايضا يمكنك محاولة هذا الأمر npm set strict-ssl false npm config set puppeteer_skip_chromium_download true ثم npm install
  12. 1. Pass by Reference (المرور عبر الإشارة): في هذا السياق، عندما يتم تمرير متغير إلى دالة، يتم تمرير إشارة (رابط) إلى الكائن الأصلي في الذاكرة، وليس نسخة جديدة من القيمة. أي تغيير يتم داخل الدالة يؤثر مباشرة على الكائن الأصلي. مثال: function edit(arr) { arr.push(4); } var myArray = [1, 2, 3]; edit(myArray); console.log(myArray); // الإخراج: [1, 2, 3, 4] فائدة: تُستخدم عندما نريد تعديل الكائن الأصلي من خلال دالة. __________________________ 2-Pass by Value (المرور عبر القيمة): في هذا السياق، يتم تمرير نسخة جديدة من القيمة إلى دالة، وأي تغيير يحدث داخل الدالة لا يؤثر على القيمة الأصلية خارج الدالة. مثال: function edit(val) { val = 10; } var myNumber = 5; edit(myNumber); console.log(myNumber); // الإخراج: 5 فائدة: تُستخدم عندما نريد تجنب تأثير التغييرات داخل الدالة على القيمة الأصلية. ___________________________________________ 3-Shallow Copy (النسخ السطحي): في النسخ السطحي، يتم إنشاء نسخة جديدة من الكائن، ولكن إذا كان الكائن يحتوي على كائنات فرعية، يتم نسخ الإشارات إلى تلك الكائنات بدلاً من إعادة إنشاء نسخ عميقة. مثال: var originalArray = [1, [2, 3]]; // النسخ السطحي باستخدام spread operator var shallowCopy = [...originalArray]; shallowCopy[1][0] = 99; console.log(originalArray[1][0]); // الإخراج: 99 _____________________________________________________ 4-Deep Copy (النسخ العميق): في النسخ العميق، يتم إنشاء نسخة جديدة من الكائن بما في ذلك جميع الكائنات الفرعية، بحيث لا تشير أي إشارات إلى الكائنات الأصلية. مثال: var originalArray = [1, [2, 3]]; // النسخ العميق باستخدام JSON var deepCopy = JSON.parse(JSON.stringify(originalArray)); deepCopy[1][0] = 99; console.log(originalArray[1][0]); // الإخراج: 2 فائدة: تُستخدم عندما نريد نسخ الكائن مع تجنب ربط الإشارات بالكائنات الأصلية. _________________ 5- Type Coercion (تحويل الأنواع): هو عملية تحويل الأنواع البيانية في لغات البرمجة تلقائيًا خلال التشغيل. على سبيل المثال، في JavaScript، قد يحدث تحويل الأنواع تلقائيًا في بعض السياقات. مثال: var num = 5; var str = "10"; var result = num + str; console.log(result); // الإخراج: "510" فائدة: تسمح بالتعامل بشكل أكثر مرونة مع الأنواع المختلفة، ولكن قد تؤدي أحيانًا إلى نتائج غير متوقعة، لذلك يجب استخدامها بحذر. You
  13. السلام عليكم , بالنسبة لل Dom manipulation الdom هو document object model و هو عبارة عن صفحة الhtml التي تظهر أمامك ولكن بالتعامل معها على أنها شجرة من العناصر و هذا يسهل التلاعب بها و من استخداماتة : 1- تحديث محتوى الصفحة دون إعادة تحميلها و هذا يضمن أن يستمر الزائر في صفحتك وقت أطول و لهذا السبب أيضا تم انشاء اطارات العمل الحديثة مثل react و angulalr و vue لأنهم يقومون بالتنقل دون اعادة التحميل . 2-event handling : و هو المقصود بة التحكم في event معين مثل الضغطة على button أو عمل submit لform او حتا تحريك الماوس 3-تغيير الstyle نتيجة لحدث معين أو بعد مدة معينة . مثال: // تحديث نص العنصر الذي لديه id="example" document.getElementById("example").innerHTML = "النص بعد التحديث"; // إضافة عنصر جديد إلى الصفحة var newElement = document.createElement("p"); newElement.innerHTML = "هذا نص جديد للعنصر"; document.body.appendChild(newElement); ______________________________________________________________________________ 2-Ajax (Asynchronous JavaScript and XML): Ajax هو نهج لتبادل البيانات بين الخادم والعميل بشكل غير متزامن، أي بدون إعادة تحميل الصفحة. يستخدم Ajax تقنيات JavaScript و XML (أو بشكل أكثر شيوعًا JSON) لتحقيق هذا التبادل الفعّال. مما يؤدي الى تبادل البيانات و المحافظة على الصفحة بدون اعادة تحميل . الاستخدامات : -تحميل البيانات ديناميكياً: يُستخدم Ajax لتحميل البيانات من الخادم بدون إعادة تحميل الصفحة. -تحديث جزئي للصفحة: يُمكن تحديث أجزاء صغيرة من الصفحة بدلاً من تحميلها كاملة. -تفاعل الواجهة الرسومية: يُستخدم في تطبيقات الويب التي تتيح للمستخدم التفاعل بسرعة مع البيانات. مثال : // استخدام Axios لإجراء طلب HTTP axios.get("https://example.com/api/data") .then(function (response) { // التعامل مع البيانات المستلمة هنا console.log(response.data); }) .catch(function (error) { // التعامل مع أخطاء الطلب هنا console.error("حدث خطأ في الطلب:", error); });
  14. السلام عليكم , نعم تعتمد هجمات الcsrf على بيانات الإعتماد الموجودة في المتصفح حيث يتم محاولة استخدام تلك المعلومات و التي فالغالب تكون اسم المستخدم و كلمة السر في أغراض ليست مناسبة . و نعم تخزن بيانات الاعتماد أحيانا في الcookies كما يمكن تخزينها في الlocal storage بالنسبة للسؤال الثاني ف عادة ما تسجل المواقع بيانات الاعتماد في الcookies او الlocalstorage لذلك كمستخدمين نعم نحن معرضين لهجمات الcsrf و من واجبات المبرمجين وقايتنا منها ولسنا نحن من نتحكم في ذلك .
  15. من الأشياء التي يجب وضعها في عين الإعتبار في موقعك هي التالي : -تحسين قاعدة البيانات: تحسين الأصول (Assets): ضغط وتقليل حجم الصور والملفات الوسائط. استخدام خوارزميات ضغط الصور. - استخدام تقنيات الـ CDN لتوفير الأصول من مواقع متعددة. -تحسين الكاش (Caching): استخدام نظام كاش لتخزين نسخ من الصفحات والاستجابة السريعة للزوار. تكوين الـ caching بشكل صحيح لتجنب الاستجابة من الخادم في كل طلب. -استخدام شبكة تسليم المحتوى (CDN): تقديم محتوى الموقع من خوادم قريبة من موقع الزائر. تقليل الوقت الذي يحتاجه المحتوى للوصول إلى المتصفح الخاص بالزائر. - تحسين تكوين الخادم : تكوين خوادم الويب لديك لتحمل حمولة أكبر. تحديث الـ PHP و MySQL بما يتناسب مع متطلبات التطبيق الخاص بك. - تحسين البرمجة: تحسين كود التطبيق لتقليل استهلاك الموارد. استخدام أحدث إصدارات لغات البرمجة والأطر البرمجية. -زيادة قدرة الخوادم: استفادة من إمكانيات الاستضافة الخاصة بك وزيادة موارد الخوادم عند الحاجة. - الاستفادة من تقنيات الحماية: استخدام تقنيات الـ Load Balancing لتوزيع الحمولة بين خوادم متعددة. استخدام أجهزة التوجيه المتقدمة لتحسين الأداء. - قم بتفعيل خاصية الlazy loading لضمان عدم تحميل الملفات الا عند الحاجة
  16. في ملف php.ini الخاص بك، قم بإلغاء تعليق : ;extension=php_pdo_mysql.dll (يمكنك العثور على ملف php.ini الخاص بك في المجلد php حيث تم تثبيت خادم الإعداد الخاص بك.) إذا كنت على نظام Windows، قم بتحويله إلى: extension=php_pdo_mysql.dll إذا كنت على نظام Linux، قم بتحويله إلى: extension=pdo_mysql.so ثم قم بإعادة تشغيل الخادم الخاص بك بسرعة. إذا لم تكن هذه الخطوة تعمل بالنسبة لك، فقد تحتاج إلى تثبيت امتداد pdo_mysql في مكتبة php الخاصة بك.
  17. السلام عليكم هناك بعض المشاكل في الكود : 1-استهدام onsubmit بدلا من onSubmit على الرغم من تعريف الدالة باسم onSubmit <Formik initialValues={{ name: null, email: null, password: null, confPassword: null, }} validationSchema={validationSchema} onSubmit={(values, { resetForm }) => { console.log(values); onsubmit(values); // هنا تحديدا يجب تبديلها ب onSubmit resetForm({ values: "" }); }} > 2-استخدام نفس الname field لكل من الpassword و الconfirmPassword حيث كلاهما يأخذان الأسم password و يجب أن يأخذا أسماء مختلفة : <Input name="password" type="password" value={formikProps.values.confPassword} onChange={formikProps.handleChange} /> <Input name="confPassword" // أسم مختلف type="password" value={formikProps.values.confPassword} onChange={formikProps.handleChange} /> 3- بما أننا نعتمد على الform submission فلا يوجد داعي لإستعمال onClick في الsubmit button //خطأ <Button onClick={onSubmit} type="submit" value="Submit"> //صحيح <Formik initialValues={{ name: null, email: null, password: null, confPassword: null, }} validationSchema={validationSchema} onSubmit={(values, { resetForm }) => { console.log(values); onsubmit(values); resetForm({ values: "" }); }} > {/* ... your form fields ... */} <Button type="submit" value="Submit">
  18. نعم يجب أن تتقنها في حالة اذا كنت ترغب في أن تكون front-end developer ولكن في حالة إذا كنت ترغب أن تكون full-stack مثلا أو back-end developer ف يكفيك فقط أن تتقنها بنسبة من 70 الى 80 % و مع الوقت و المشاريع سوف تتطور فيها و يذداد مستواك تدريجيا . و لكن بشكل عام فمن الضرورة أن يكون لديك خلفية قوية في الcss مهما كان المسمى الوظيفي لأن بالتأكيد سوف تحتاجها في وقت ما , أو ستساعدك في فهم كود معين أو تكوين صورة أفضل عن دورة حياة الويب بشكل عام .
  19. -تحديد أهداف المنصة: ما هو الهدف الرئيسي للمنصة؟ هل ترغب في تعليم البرمجة بشكل عام أم تركيز على مجالات محددة؟ -تصميم واجهة المستخدم: تصميم واجهة مستخدم سهلة الاستخدام وجذابة لتحفيز الطلاب. تأكد من أن التصميم يتناسب مع مستوى الفئة العمرية المستهدفة. -محتوى التعلم: إعداد موارد تعليمية غنية ومنوعة في مجال البرمجة. توفير دروس متقدمة ومستويات متعددة لتناسب مستويات مختلفة من الطلاب. -نظام الإدارة والتتبع: نظام لإدارة المحتوى وإدارة الطلاب والمدرسين. أدوات لتتبع تقدم الطلاب وتقييم أدائهم. -نظام الاختبار والتقييم: إضافة نظام لإجراء الاختبارات وتقديم التقييمات. توفير ردود فعل فورية للطلاب حول أدائهم. -التفاعل الاجتماعي: إدراج أدوات للتفاعل بين الطلاب والمدرسين، مثل منتديات النقاش أو الدردشة المباشرة. -تكنولوجيا الموقع والاستضافة: اختيار التكنولوجيا المناسبة لتطوير الموقع (مثل Django، Ruby on Rails، ReactJS) واختيار مزود خدمة استضافة موثوق. سواء للواجهه او السيرفر و تحديد إذا كنت سوف تحتاج الى تطبيق جوال ام لا و البدء ك MVP (minimum valuable product) في البداية و بعدها تتوسع و تضيف مميزات أكثر تدريجيا . -الأمان وحماية البيانات: تأمين المنصة وضمان حماية البيانات الشخصية للطلاب. -التسويق والترويج: وضع خطة تسويقية لجذب الطلاب والمدرسين.
  20. السلام عليكم , لقد قمت بمراجة الكود الخاص بك و وجدت الخطأ في التالي : //في ملف الprojects export const projects = [ { title: "Notes App", description: "this app can helping you to seve your notes or and save it on browser local storage .", image: "/images/noteapp.PNG", // لاحظ استعمال PNG // و هو ليس بالأمر الصحيح // يجب استعمال .png tags: ["HTML", "CSS", "JavaSctipt", "React"], source: "https://github.com/ahmedzehry55/notesApp", visit: "https://ahmedzehry55.github.io/notesApp/", id: 0, }, { title: "Baba abdo restaurant menu", description: "this design is about restaurant menu ", image: "/babaabdoRest.PNG", tags: ["HTML", "CSS", "JavaSctipt", "React"], source: "https://github.com/ahmedzehry55/babaAbdo", visit: "https://ahmedzehry55.github.io/babaAbdo/", id: 1, }, الخطأ كان في استعمال .PNG و ليس .png حيث يجب مراعاة الدقة أن تكون بنفس صيغة الملفات الموجودة ف الpublic بالضبط مثال على ذلك مقتبس من الاستضافة الخاصة بك : هذة صورة لمشروع من المشاريع مستعملا PNG https://az-portpholio.vercel.app/_next/image?url=%2Fnoteapp.PNG&w=640&q=75 لاحظ أنها لن تعمل مثال على نفس الصورة باستعمال .png https://az-portpholio.vercel.app/_next/image?url=%2Fnoteapp.png&w=640&q=75 لاحظ انها تعمل جيدا
  21. السلام عليكم , فكرة Migrations في Node.js، خاصةً مع Sequelize، تشبه إلى حد كبير ما تقوم به في Laravel. فكرة الMigration: Migrations هي عمليات تغيير في هيكل قاعدة البيانات. عندما تقوم بتطوير تطبيقك، قد تحتاج إلى إجراء تغييرات في هيكل الجداول في قاعدة البيانات، مثل إضافة حقل جديد، أو حذف حقل، أو تعديل نوع البيانات، وما إلى ذلك. في Laravel: لنفترض أن لديك جدول users في Laravel وتحتاج إلى إضافة حقل جديد لتخزين العناوين. تقوم بكتابة Migration لتنفيذ هذا التغيير. قد يكون المثال كالتالي: php artisan make:migration add_address_to_users_table public function up() { Schema::table('users', function (Blueprint $table) { $table->string('address'); }); } public function down() { Schema::table('users', function (Blueprint $table) { $table->dropColumn('address'); }); } ثم تقوم بتنفيذ: php artisan migrate و يمكن التنفيذ أيضا في mongoDb على النحو التالي const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/your_database', { useNewUrlParser: true, useUnifiedTopology: true }); const userSchema = new mongoose.Schema({ // Existing schema fields name: String, email: String, }); // Adding a new field userSchema.add({ address: String }); const User = mongoose.model('User', userSchema); // Sample migration script async function runMigration() { await User.updateMany({}, { $set: { address: null } }); mongoose.connection.close(); } runMigration(); و يمكن التنفيذ مع mySql و PostgreSQL عبر Sequelize ORM على النحو التالي : 'use strict'; module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.addColumn('Users', 'address', { type: Sequelize.STRING, allowNull: true, }); }, down: async (queryInterface, Sequelize) => { await queryInterface.removeColumn('Users', 'address'); }, }; و التنفيذ : npx sequelize-cli db:migrate
  22. السلام عليكم , يوجد عدة عناصر و عدة طرق يجب تجربتها لنتأكد من أين الخطأ و منها : 1- من الممكن أن تكون نسخة node لديك هي النسخة الأحدث وليست النسخة المستقرة فتأكد من أن لديك النسخة المستقرة 2- -قم بإزالة 'node-sass' من ملف package.json -run npm install -run npm i sass -run npm start 3-إذا كنت تستخدم الإصدار 8.0.0، فسيتم تنزيل الملف الثنائي المُعد مسبقًا من https://github.com/sass/node-sass/releases/tag/v8.0.0 قد يكون لديك تبعية أخرى تحاول سحبها وإصدار أقدم لا يدعمه Node 18
  23. و عليكم السلام . بالنسبة للسؤال الأول : نعم، يمكنك استخدام عامل الجمع "+" بدلاً من "Number" لتحويل القيم المدخلة إلى أعداد. في JavaScript، العمليتين تؤديان إلى نفس النتيجة، ولكن استخدام "+" يكون أكثر شيوعًا وأقل تعقيدًا. يوجد فروقات صغيرة بينهم مثل تعاملهم مع الnull pde: // تحويل القيمة null إلى عدد (ستعود 0 في حالة Number() و NaN في حالة +) console.log(Number(null)); // 0 console.log(+null); // NaN بالنسبة للسؤال الثاني : ${total} هو جزء من تركيب النصوص (template literals) في JavaScript، ولكن يجب استخدام العلامات الخاصة بالتركيب بالطريقة الصحيحة. في السياق الحالي، قمت باستخدام علامات "``" (backticks) بدلاً من علامات '' (single qoutes). يجب عليك استخدام backticks لتحقيق تركيب النصوص بشكل صحيح. إليك الكود المعدل: let total = 0; while (total <= 100) { total = +prompt(`your total is ${total}`); console.log(total); }
  24. السلام عليكم بما أن حضرتك تستخدم react-chartjs-2 ف هناك component موجود فيها خاص بالprogress bar و هذا مثال على عمل الcomponent و جعلة جاهز للاستخدام import { Bar } from "react-chartjs-2"; export default function ProgressBar({ data, options }) { return <Bar options={options} data={data} />; } و بعد أن تقوم بانشاء ذلك الcomponent فقم باستخدامة في الملف الذي قمت بإدراجة في المكان الذي تريدة على هذا النحو let data = { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'], datasets: [ { label: 'Temperature', data: [20, 22, 25, 24, 26, 28, 30], borderColor: 'rgba(54, 162, 235, 1)', tension: 0.1, }, ], }; useEffect(() => { const chartData = { labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'], datasets: [ { label: 'Temperature', data: [20, 22, 25, 24, 26, 28, 30], borderColor: 'rgba(54, 162, 235, 1)', tension: 0.1, }, ], }; const chartOptions = { scales: { yAxes: [ { ticks: { beginAtZero: true, }, }, ], }, }; const createGradientLineAnnotation = (chart) => { const ctx = chart.ctx; const xAxis = chart.scales['x-axis-0']; const yAxis = chart.scales['y-axis-0']; const bottomLineY = yAxis.bottom; const gradient = ctx.createLinearGradient(0, bottomLineY - 10, 0, bottomLineY); gradient.addColorStop(0, 'rgba(255, 0, 0, 1)'); // Red gradient.addColorStop(0.5, 'rgba(0, 255, 0, 1)'); // Green gradient.addColorStop(1, 'rgba(0, 0, 255, 1)'); // Blue const annotation = { type: 'line', mode: 'horizontal', scaleID: 'y-axis-0', value: bottomLineY, borderColor: gradient, borderWidth: 10, }; chart.annotation.elements.push(annotation); }; const ctx = document.getElementById('myChart').getContext('2d'); const chart = new Chart(ctx, { type: 'line', data: chartData, options: chartOptions, plugins: [createGradientLineAnnotation], }); return () => { chart.destroy(); }; }, []); return ( <> <div style={{ height: "100vh" }}> <div style={{ width: "50%", margin: "auto" }}> <Line data={data} /> </div> <div style={{ width: "50%", margin: "auto", position: "relative" }}> <canvas id="myChart" /> <div style={{ position: 'absolute', bottom: '30', left: "27", width: '70%', borderBottom: '2px solid black', }} > <Bar data={data} /> </div> </div> </div> </> ) مع ملاحظة أنني قمت بنقل المتغير data ليكون global حتى يمكن التعرف علية من أي مكان في الكود
×
×
  • أضف...