مع SerpClix أصبح كسب المال أمرا سهلا

الأفراد المهتمين بكسب المال من خلال النقر على الروابط

 حذف سجل (DELETE )
يمكنك حذف سجلات من جدول موجود باستخدام عبارة "DELETE FROM":
مثال
احذف أي سجل (address) بعنوان  "Mountain 21":

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  var sql = "DELETE FROM customers WHERE address = 'Mountain 21'";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Number of records deleted: " + result.affectedRows);
  });
});
لاحظ عبارة WHERE في بناء جملة DELETE: تحدد جملة WHERE السجل أو السجلات التي يجب حذفها. إذا حذفت جملة WHERE ، فسيتم حذف جميع السجلات!

 احفظ الكود أعلاه في ملف بإسم "demo_db_delete.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_delete.js
النتيجة
Number of records deleted: 1
كائن النتيجة result object
عند تنفيذ استعلام ، يتم إرجاع  object في المتغير result.
يحتوي object result على معلومات حول كيفية تأثير الاستعلام على الجدول.
يبدو الكائن الناتج الذي تم إرجاعه من المثال أعلاه كما يلي:
{
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 34,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}
يمكن عرض قيم الخصائص على النحو التالي: 
مثال قم بإرجاع عدد الصفوف المتأثرة:
 console.log(result.affectedRows)
النتيجة
1
 ترتيب حسب MySQL Order By
فرز النتيجة
استخدم عبارة ORDER BY لفرز النتيجة بترتيب تصاعدي أو تنازلي.
تقوم الكلمة الأساسية ORDER BY بفرز النتيجة تصاعديًا افتراضيًا. لفرز النتيجة بترتيب تنازلي ، استخدم الكلمة الأساسية DESC.
مثال
فرز النتيجة أبجديًا حسب name:
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers ORDER BY name", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
احفظ الكود أعلاه في ملف  بإسم "demo_db_orderby.js" وقم بتشغيل الملف: 
C:\Users\Your Name>node demo_db_orderby.js
النتيجة

[
  { id: 3, name: 'Amy', address: 'Apple st 652'},
  { id: 11, name: 'Ben', address: 'Park Lane 38'},
  { id: 7, name: 'Betty', address: 'Green Grass 1'},
  { id: 13, name: 'Chuck', address: 'Main Road 989'},
  { id: 4, name: 'Hannah', address: 'Mountain 21'},
  { id: 1, name: 'John', address: 'Higheay 71'},
  { id: 5, name: 'Michael', address: 'Valley 345'},
  { id: 2, name: 'Peter', address: 'Lowstreet 4'},
  { id: 8, name: 'Richard', address: 'Sky st 331'},
  { id: 6, name: 'Sandy', address: 'Ocean blvd 2'},
  { id: 9, name: 'Susan', address: 'One way 98'},
  { id: 10, name: 'Vicky', address: 'Yellow Garden 2'},
  { id: 14, name: 'Viola', address: 'Sideway 1633'},
  { id: 12, name: 'William', address: 'Central st 954'}
]
ترتيب تنازلي DESC
 استخدم الكلمة الأساسية DESC لفرز النتيجة بترتيب تنازلي.
مثال فرز النتيجة عكسيًا أبجديًا حسب name :

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers ORDER BY name DESC", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
احفظ الكود أعلاه في ملف يسمى "demo_db_orderby_desc.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_orderby_desc.js
النتيجة
[
  { id: 12, name: 'William', address: 'Central st 954'},
  { id: 14, name: 'Viola', address: 'Sideway 1633'},
  { id: 10, name: 'Vicky', address: 'Yellow Garden 2'},
  { id: 9, name: 'Susan', address: 'One way 98'},
  { id: 6, name: 'Sandy', address: 'Ocean blvd 2'},
  { id: 8, name: 'Richard', address: 'Sky st 331'},
  { id: 2, name: 'Peter', address: 'Lowstreet 4'},
  { id: 5, name: 'Michael', address: 'Valley 345'},
  { id: 1, name: 'John', address: 'Higheay 71'},
  { id: 4, name: 'Hannah', address: 'Mountain 21'},
  { id: 13, name: 'Chuck', address: 'Main Road 989'},
  { id: 7, name: 'Betty', address: 'Green Grass 1'},
  { id: 11, name: 'Ben', address: 'Park Lane 38'},
  { id: 3, name: 'Amy', address: 'Apple st 652'}
]
 تصفية تحديد البيانات باستخدام  الامر"WHERE":
عند تحديد السجلات من جدول ، يمكنك تصفية التحديد باستخدام الأمر"WHERE":
مثال اجلب البيانات بحيث يكون حقل address  يساوي "Park Lane 38":

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers WHERE address = 'Park Lane 38'", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
احفظ الكود أعلاه في ملف بإسم "demo_db_where.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_where.js
لتكون النتيجة بالشكل التالي
[
  { id: 11, name: 'Ben', address: 'Park Lane 38'}
]
أحرف البدل (بالانجليزية  Wildcard Characters)
يمكنك أيضًا تحديد السجلات التي تبدأ أو تتضمن أو تنتهي بحرف أو عبارة معينة.

استخدم حرف البدل "٪" لتمثيل حرف واحد أو أحرف متعددة:

مثال
حدد السجلات حيث يبدأ  حقل address بالحرف "S":

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers WHERE address LIKE 'S%'", function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
احفظ الكود أعلاه في ملف باسم "demo_db_where_s.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_where_s.js
لتكون النتيجة بالشكل التالي
[
  { id: 8, name: 'Richard', address: 'Sky st 331'},
  { id: 14, name: 'Viola', address: 'Sideway 1633'}
]
حماية  قيم الاستعلام اذا كانت  متغيرات يرسلها المستخدم 
عندما تكون قيم الاستعلام متغيرات يرسلها المستخدم ، يجب عليك حمايتها فبل تنفيذ الاستعلام.
هذا لمنع حقن SQL ، وهو أسلوب شائع لاختراق الويب لتدمير قاعدة البيانات الخاصة بك أو إساءة استخدامها.
تحتوي الوحدة النمطية (بالانجليزية module) MySQL على دوال للتخلص و تنظيف  قيم الاستعلام:
مثال تنظيف  قيم الاستعلام باستخدام  الدالة mysql.escape ():

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "myusername",
  password: "mypassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  var adr = 'Mountain 21';
  //Escape the address value:
  var sql = 'SELECT * FROM customers WHERE address = ' + mysql.escape(adr);
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
احفظ الكود في الاعلى في ملف بإسم "demo_db_where_escape.js" وشغل الملف
C:\Users\My Name>node demo_db_where_escape.js
لتكون النتيجة بالشكل التالي
[
  { id: 4, name: 'Hannah', address: 'Mountain 21'}
]
يمكنك أيضا استخدام؟ كعنصر نائب للقيم التي تريد الهروب منها. في هذه الحالة ، يتم إرسال المتغير كمعامل ثاني في الدالة query()  وهذا يمنحك تنظيف القيم قبل ارسالها لتنفيذ الاستعلام : 
مثال
كيفية حماية  قيم الاستعلام باستخدام العنصر النائب ؟ علامة الاستفهام  طريقة:

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "myusername",
  password: "mypassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  var adr = 'Mountain 21';
  //Escape the address value:
  var sql = 'SELECT * FROM customers WHERE address = ?';
  //Send an array with value(s) to replace the escaped values:
  con.query(sql, [adr], function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
احفظ الملف باسم "demo_db_where_placeholder.js" وشغل الملف
C:\Users\My Name>node demo_db_where_placeholder.js
النتيجة
[
  { id: 4, name: 'Hannah', address: 'Mountain 21'}
]
إذا كان لديك عدة عناصر نائبة ، فإن المصفوفة تحتوي على قيم متعددة ، بهذا الترتيب:
مثال
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "myusername",
  password: "mypassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  var name = 'Amy';
  var adr = 'Mountain 21';
  //Escape the name and the address values:
  var sql = 'SELECT * FROM customers WHERE name = ? OR address = ?';
  //Send an array with value(s) to replace the escaped values:
  con.query(sql, [name, adr], function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});
 جلب البيانات من قاعدة البيانات (Node.js (MySQL 
لتحديد البيانات من جدول في MySQL ، استخدم  الامر "SELECT".
مثال
حدد جميع السجلات من جدول "customers" ، وتخزينها في  result object :  
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});
الامر SELECT * سيرجع جميع البيانات من جدول "customers"
احفظ الكود أعلاه في ملف يسمى "demo_db_select.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_select.js
لتكون النتيجة بالشكل التالي
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT name, address FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});[
  { id: 1, name: 'John', address: 'Highway 71'},
  { id: 2, name: 'Peter', address: 'Lowstreet 4'},
  { id: 3, name: 'Amy', address: 'Apple st 652'},
  { id: 4, name: 'Hannah', address: 'Mountain 21'},
  { id: 5, name: 'Michael', address: 'Valley 345'},
  { id: 6, name: 'Sandy', address: 'Ocean blvd 2'},
  { id: 7, name: 'Betty', address: 'Green Grass 1'},
  { id: 8, name: 'Richard', address: 'Sky st 331'},
  { id: 9, name: 'Susan', address: 'One way 98'},
  { id: 10, name: 'Vicky', address: 'Yellow Garden 2'},
  { id: 11, name: 'Ben', address: 'Park Lane 38'},
  { id: 12, name: 'William', address: 'Central st 954'},
  { id: 13, name: 'Chuck', address: 'Main Road 989'},
  { id: 14, name: 'Viola', address: 'Sideway 1633'}
]
اختيار الأعمدة المحددة
لتحديد بعض الأعمدة  فقط في جدول ، استخدم عبارة "SELECT" متبوعة باسم العمود.

مثال
حدد الاسم والعنوان من جدول "customers" ، واعرض كائن الإرجاع result:
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT name, address FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});
احفظ الكود أعلاه في ملف يسمى "demo_db_select2.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_select2.js
لتكون النتيجة كما في مثال التالي
[
  { name: 'John', address: 'Highway 71'},
  { name: 'Peter', address: 'Lowstreet 4'},
  { name: 'Amy', address: 'Apple st 652'},
  { name: 'Hannah', address: 'Mountain 21'},
  { name: 'Michael', address: 'Valley 345'},
  { name: 'Sandy', address: 'Ocean blvd 2'},
  { name: 'Betty', address: 'Green Grass 1'},
  { name: 'Richard', address: 'Sky st 331'},
  { name: 'Susan', address: 'One way 98'},
  { name: 'Vicky', address: 'Yellow Garden 2'},
  { name: 'Ben', address: 'Park Lane 38'},
  { name: 'William', address: 'Central st 954'},
  { name: 'Chuck', address: 'Main Road 989'},
  { name: 'Viola', address: 'Sideway 1633'}
]
ارجاع النتيجة على شكل كائن Object
 كما ترى من نتيجة المثال في الاعلى ، فإن الكائن الناتج هوعبارة عن مصفوفة تحتوي على كل صف ككائن Object.

يمكننا عمل حلقة تكرار للوصول الى جميع الاعمدة 
للوصول الى العمود الثالث مثلا حقل  address ، ما عليك سوى الرجوع إلى خاصية عنوان كائن المصفوفة الثالثة:
مثال
console.log(result[2].address);
لتكون النتيجة بالشكل التالي
Apple st 652
كائن Fields الباراميتر الثالث
المتغير الثالث لدالة رد الاتصال هي مصفوفة تحتوي على معلومات حول كل حقل في النتيجة.

مثال
حدد جميع السجلات من جدول "العملاء" ، واعرض كائن Fields :
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT name, address FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(fields);
  });
});
احفظ الكود أعلاه في ملف بإسم "demo_db_select_fields.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_select_fields.js
لتكون النتيجة على هذا الشكل
[
  {
    catalog: 'def',
    db: 'mydb',
    table: 'customers',
    orgTable: 'customers',
    name: 'name',
    orgName: 'name',
    charsetNr: 33,
    length: 765,
    type: 253,
    flags: 0,
    decimals: 0,
    default: undefined,
    zeroFill: false,
    protocol41: true
  },
  {
    catalog: 'def',
    db: 'mydb',
    table: 'customers',
    orgTable: 'customers',
    name: 'address',
    orgName: 'address',
    charsetNr: 33,
    length: 765,
    type: 253,
    flags: 0,
    decimals: 0,
    default: undefined,
    zeroFill: false,
    protocol41: true
  }
]
كما ترى من نتيجة المثال أعلاه ، فإن كائن  fields عبارة عن مصفوفة تحتوي على معلومات حول كل حقل ككائن. 
للوصول على سبيل المثال الى اسم الحقل الثاني بالخصوص  name  ، ما عليك سوى الرجوع إلى خاصية اسم عنصر المصفوفة الثانية:
مثال
console.log(fields[1].name); 
لتكون النتيجة
address
إدخال البيانات الى قاعدة البيانات Node.js MySQL   
إدراج  حقل  في الجدول
لملء جدول في MySQL ، استخدم الامر "INSERT INTO".
مثال
إدخال بيانات في جدول "customers":
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("تم الاتصال!");
  var sql = "INSERT INTO customers (name, address) VALUES ('Company Inc', 'Highway 37')";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("تم اضافة حقل واحد");
  });
});
احفظ الكود أعلاه في ملف بإسم "demo_db_insert.js" ، وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_insert.js
في حال نجح الاستعلام سيطبع البرنامج
تم الاتصال!
تم اضافة حقل واحد
أدخل حقول متعددة
لإدراج أكثر من حقل باسعلام واحد ، أنشئ مصفوفة تحتوي على القيم ، وأدخل علامة استفهام ? في SQL ، والتي سيتم استبدالها بمصفوفة القيم:
أدخل قيم العملاء (الاسم والعنوان)؟

مثال
 ملء جدول "العملاء" بالبيانات:
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("تم الاتصال بنجاح!");
  var sql = "INSERT INTO customers (name, address) VALUES ?";
  var values = [
    ['John', 'Highway 71'],
    ['Peter', 'Lowstreet 4'],
    ['Amy', 'Apple st 652'],
    ['Hannah', 'Mountain 21'],
    ['Michael', 'Valley 345'],
    ['Sandy', 'Ocean blvd 2'],
    ['Betty', 'Green Grass 1'],
    ['Richard', 'Sky st 331'],
    ['Susan', 'One way 98'],
    ['Vicky', 'Yellow Garden 2'],
    ['Ben', 'Park Lane 38'],
    ['William', 'Central st 954'],
    ['Chuck', 'Main Road 989'],
    ['Viola', 'Sideway 1633']
  ];
  con.query(sql, [values], function (err, result) {
    if (err) throw err;
    console.log("عدد الحقول التي تم اضافتها: " + result.affectedRows);
  });
});
احفظ الكود أعلاه في ملف يسمى "demo_db_insert_multple.js" ، وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_insert_multiple.js
في حال نجح الاستعلام سيطبع البرنامج
تم الاتصال بنجاح!
عدد الحقول التي تم اضافتها: 14
الاستعلام المتعدد الحقول، يرجع object في 'result' .
في حال نجح الاتصال وادخال البيانات سيرجع لنا النتيجة في البرامتر (result) على شكل  كائن (Object).
يبدو الكائن الناتج الذي تم إرجاعه من المثال أعلاه كما يلي:
{
  fieldCount: 0,
  affectedRows: 14,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '\'Records:14  Duplicated: 0  Warnings: 0',
  protocol41: true,
  changedRows: 0
}
يمكن عرض قيم الخصائص على النحو التالي:
 مثال قم بإرجاع عدد الصفوف المتأثرة:

console.log(result.affectedRows)
لتكون النتيجة على الشكل التالي
14 
احصل على رقم id الحقل الذي اضفته 
 بالنسبة للجداول التي تحتوي على حقل معرف زيادة تلقائي ، يمكنك الحصول على معرف الصف الذي أدخلته للتو عن طريق سؤال الكائن الناتج  result .
ملاحظة: لتتمكن من الحصول على المعرف المدرج ، يمكن إدراج صف واحد فقط
مثال أدخل سجلًا في جدول "customers" ، وأعد المعرف id:

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  var sql = "INSERT INTO customers (name, address) VALUES ('Michelle', 'Blue Village 1')";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("  تم إدراج سجل واحد, رقم التعريف: " + result.insertId);
  });
});
احفظ الكود أعلاه في ملف باسم "demo_db_insert_id.js" ، وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_insert_id.js
لتكون التيجة على الشكل التالي

تم إدراج سجل واحد ، رقم التعريف:15
انشاء جدول في قاعدة البيانات
لإنشاء جدول في MySQL ، استخدم  الامر "CREATE TABLE".
تأكد من تحديد اسم قاعدة البيانات عند إنشاء الاتصال :
مثال
أنشئ جدولاً باسم "customers":

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Table created");
  });
});
احفظ الكود أعلاه في ملف يسمى "demo_create_table.js" وقم بتشغيل الملف: 
قم بتشغيل "demo_create_table.js"
C:\Users\Your Name>node demo_create_table.js
اذا نجح الاتصال سيطبع البرنامج
Connected!
Table created
المفتاح الأساسي
عند إنشاء جدول ، يجب  إنشاء عمود بمفتاح فريد لكل سجل او حقل.

يمكن القيام بذلك عن طريق تحديد عمود على أنه "INT AUTO_INCREMENT PRIMARY KEY" والذي سيدرج رقمًا فريدًا لكل حقل. بدءًا من 1 ، ويزداد بمقدار واحد لكل سجل او حقل.

مثال  
إنشاء مفتاح أساسي عند إنشاء الجدول:


var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "CREATE TABLE customers (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), address VARCHAR(255))";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Table created");
  });
});
إذا كان الجدول موجودًا بالفعل ، فاستخدم الكلمة الأساسية ALTER TABLE:

مثال
إنشاء مفتاح أساسي في جدول موجود:

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "ALTER TABLE customers ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY";
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Table altered");
  });
});
إنشاء قاعدة بيانات
لإنشاء قاعدة بيانات في MySQL ، استخدم الامر "CREATE DATABASE" ثم اسم القاعدة:
مثال
var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  con.query("CREATE DATABASE mydb", function (err, result) {
    if (err) throw err;
    console.log("Database created");
  });
});
احفظ الكود أعلاه في ملف بإسم "demo_create_db.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_create_db.js
في حال نجح الاتصال وأنشاء قاعدة البيانات تيطبع البرنامج الرسالة التالية
Connected!
Database created
يمكن استخدام Node.js في تطبيقات قواعد البيانات.
تعد MySQL واحدة من أكثر قواعد البيانات شيوعًا.
قاعدة بيانات MySQL
لتتمكن من تجربة  الأوامر البرمجية ، يجب أن يكون لديك MySQL مثبتًا على جهاز الكمبيوتر الخاص بك.
يمكنك تنزيل قاعدة بيانات MySQL مجانية على  https://www.mysql.com/downloads/.
او يمكنك تنزيل سيرفر محلي (xampp ) مجاني  https://www.apachefriends.org/download.html يحتوي على MySQL
قم بتثبيت برنامج MySQL Driver
بمجرد تثبيت MySQL على جهاز الكمبيوتر الخاص بك ، يمكنك الوصول إليه باستخدام Node.js.
للوصول إلى قاعدة بيانات MySQL باستخدام Node.js ، تحتاج إلى برنامج تشغيل MySQL. سيستخدم هذا البرنامج التعليمي وحدة (module ) "mysql" ، التي يتم تنزيلها من NPM.

لتنزيل وحدة "mysql" وتثبيتها ، افتح Command Terminal وقم بتنفيذ ما يلي:
C:\Users\Your Name>npm install mysql
الآن قمت بتنزيل وتثبيت برنامج تشغيل قاعدة بيانات mysql.
يمكن لـ Node.js استخدام هذه الوحدة لمعالجة قاعدة بيانات MySQL:
var mysql = require('mysql');
إنشاء اتصال بقاعدة البيانات.
استخدم اسم المستخدم وكلمة المرور من قاعدة بيانات MySQL.
ملف demo_db_connection.js
var mysql = require('mysql');
 
var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword"
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
});
احفظ الكود أعلاه في ملف باسم "demo_db_connection.js" وقم بتشغيل الملف:
C:\Users\Your Name>node demo_db_connection.js
سيطبع كلمة connected! إذ كان اسم المستخدم وكلمة السر صحيحة

الآن يمكنك البدء في الاستعلام من قاعدة البيانات باستخدام  أوامر SQL.
الإستعلام من قاعدة بيانات
استخدم أوامر SQL جلب البيانات من (أو ادخال البيانات إلى) قاعدة بيانات MySQL. وهذا ما يسمى أيضًا "الإستعلام" من قاعدة البيانات. يحتوي كائن الاتصال الذي تم إنشاؤه في المثال أعلاه على دالة للاستعلام من قاعدة البيانات:

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log("Result: " + result);
  });
});
أسلوب الاستعلام يأخذ عبارات sql كمعامل ويعيد النتيجة. تعرف على كيفية قراءة قاعدة بيانات وكتابتها وحذفها وتحديثها في الفصول التالية.دورة تعلم أوامر SQL
في مكان sql نكتب الاستعلام الذي نريده مثل  حذف البيانات او ادخال البيانات او جلب البيانات او تحديث البيانات ...الخ


 Node.js إرسال بريد إلكتروني
مكتبة Nodemailer
تجعل مكتبة Nodemailer من السهل إرسال رسائل البريد الإلكتروني من جهاز الكمبيوتر الخاص بك.
يمكن تنزيل وحدة Nodemailer وتثبيتها باستخدام npm:
C:\Users\Your Name>npm install nodemailer 
بعد تنزيل مكتبة Nodemailer ، يمكنك تضمين المكتبة في أي تطبيق:
var nodemailer = require('nodemailer');
أرسل بريدا إلكترونيا
أنت الآن جاهز لإرسال رسائل البريد الإلكتروني من الخادم الخاص بك.

استخدم اسم المستخدم وكلمة المرور من مزود البريد الإلكتروني المحدد لإرسال بريد إلكتروني. سيوضح لك هذا البرنامج التعليمي كيفية استخدام حساب Gmail الخاص بك لإرسال بريد إلكتروني:

مثال
var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'youremail@gmail.com',
    pass: 'yourpassword'
  }
});

var mailOptions = {
  from: 'youremail@gmail.com',
  to: 'myfriend@yahoo.com',
  subject: 'ارسال ايميل بواسطة Node.js',
  text: 'من سهل ارسال بريد للعملاء!'
};

transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('تم ارسال الايميل: ' + info.response);
  }
});
وهذا كل شيء! الآن خادمك قادر على إرسال رسائل البريد الإلكتروني.

إرسال بريد إلكتروني إلى أكثر من مستلم
لإرسال بريد إلكتروني إلى أكثر من مستلم ، أضفهم إلى خاصية "to" في كائن mailOptions ، مفصولة بفواصل:
مثال
أرسل بريدًا إلكترونيًا إلى أكثر من عنوان:
 var mailOptions = {
  from: 'youremail@gmail.com',
  to: 'myfriend@yahoo.com, myotherfriend@yahoo.com',
  subject: 'ارسال ايميل بواسطة Node.js',
  text: 'من السهل ارسال بريد الى العملاء!'
}
إرسال نص بتنسيق HTML
لإرسال نص بتنسيق HTML في بريدك الإلكتروني ، استخدم خاصية "html" بدلاً من خاصية "text":

مثال
إرسال بريد إلكتروني يحتوي على HTML:
var mailOptions = {
  from: 'youremail@gmail.com',
  to: 'myfriend@yahoo.com',
  subject: 'ارسال ايميل بواسطة Node.js',
  html: '<h1>مرحبا</h1><p>من السهل ارال بريد اليكتروني</p>'
}
تحميل الملفات في (Node.js) 
   مكتبة Formidable
هناك مكتبة رائعة للعمل على تحميلات الملفات ، تسمى "Formidable".
يمكن تنزيل مكتبة Formidable وتثبيتها باستخدام NPM:

C:\Users\Your Name>npm install formidable
بعد تنزيل الوحدة النمطية Formidable ، يمكنك تضمين  المكتبة في أي تطبيق تريد:
var formidable = require('formidable');
تحميل الملفات
أنت الآن جاهز لإنشاء صفحة ويب في Node.js تتيح للمستخدم تحميل الملفات إلى جهاز الكمبيوتر الخاص بك:
الخطوة 1: قم بإنشاء نموذج تحميل
قم بإنشاء ملف Node.js يكتب نموذج HTML ، مع حقل تحميل:
مثال
سينتج هذا الرمز نموذج HTML:
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
  res.write('<input type="file" name="filetoupload"><br>');
  res.write('<input type="submit">');
  res.write('</form>');
  return res.end();
}).listen(8080);
الخطوة 2: تحليل الملف الذي تم تحميله
قم بتضمين مكتبة Formidable لتتمكن من تحليل الملف الذي تم تحميله بمجرد وصوله إلى الخادم.
عندما يتم تحميل الملف وتحليله ، يتم وضعه في مجلد مؤقت على جهاز الكمبيوتر الخاص بك.
مثال
سيتم تحميل الملف ووضعه في مجلد مؤقت:

var http = require('http');
var formidable = require('formidable');

http.createServer(function (req, res) {
  if (req.url == '/fileupload') {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
      res.write('File uploaded');
      res.end();
    });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
    res.write('<input type="file" name="filetoupload"><br>');
    res.write('<input type="submit">');
    res.write('</form>');
    return res.end();
  }
}).listen(8080);
الخطوة الثالثة: احفظ الملف
عندما يتم تحميل ملف بنجاح إلى الخادم ، يتم وضعه في مجلد مؤقت.

يمكن العثور على المسار إلى هذا الدليل في كائن "files" ، الذي تم تمريره باعتباره الوسيطة الثالثة في دالة رد الاتصال الخاصة بالطريقة parse ().

لنقل الملف إلى المجلد الذي تختاره ، استخدم وحدة نظام الملفات ، وأعد تسمية الملف:


مثال
قم بتضمين مكتبة fs ، وانقل الملف إلى المجلد الحالي:
var http = require('http');
var formidable = require('formidable');
var fs = require('fs');

http.createServer(function (req, res) {
  if (req.url == '/fileupload') {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
      var oldpath = files.filetoupload.path;
      var newpath = 'C:/Users/Your Name/' + files.filetoupload.name;
      fs.rename(oldpath, newpath, function (err) {
        if (err) throw err;
        res.write('File uploaded and moved!');
        res.end();
      });
 });
  } else {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write('<form action="fileupload" method="post" enctype="multipart/form-data">');
    res.write('<input type="file" name="filetoupload"><br>');
    res.write('<input type="submit">');
    res.write('</form>');
    return res.end();
  }
}).listen(8080);

شاهد الشرح بالفيديو

 الأحداث (Events) في Node.js
Node.js مثالي للتطبيقات التي تعتمد على الأحداث(Events).
ماهي الأحداث في Node.js
كل إجراء يتم إجراؤه على جهاز الكمبيوتر هو حدث. مثل عند إجراء اتصال أو فتح ملف او الظغط على زر ...الخ .
يمكن للكائنات في Node.js إطلاق أحداث ، مثل الكائن readStream الذي  يرسل أحداثًا  حدث فتح ملف "open" وإغلاقه "close":
مثال
var fs = require('fs');
var rs = fs.createReadStream('./demofile.txt');
rs.on('open', function () {
  console.log('The file is open');
});
احفظ الكود في ملف "demo_events_open.js"وشغل موجه الاوامر
C:\Users\My Name>node demo_events_open.js
وحدة الأحداث (Events Module)
يحتوي Node.js على مكتبة نمطية مدمجة تسمى "Events" ، حيث يمكنك إنشاء الأحداث (Events) الخاصة بك وإستدعائها.
لتضمين وحدة الأحداث المضمنة (بالإنجليزية (built-in Events module))، استخدم الدالة require() . بالإضافة إلى ذلك ، فإن جميع خصائص وأساليب الحدث (properties and methods)  هي مثيل لكائن EventEmitter. لتتمكن من الوصول إلى هذه الخصائص والأساليب ، قم بإنشاء كائن EventEmitter:
var events = require('events');
var eventEmitter = new events.EventEmitter();
كائن (object) EventEmitter
يمكنك تعيين معالجات الأحداث للأحداث الخاصة بك باستخدام كائن EventEmitter.
في المثال أدناه قمنا بإنشاء وظيفة سيتم تنفيذها عند إطلاق حدث "scream".
لاستخدام الحدث الخاص بك  ، استخدم الدالة emit ()  .
var events = require('events');
var eventEmitter = new events.EventEmitter();
//قم بإنشاء دالة الحدث:
var myEventHandler = function () {
  console.log('I hear a scream!');
}
//قم بتعيين الحدث الخاص بك  إلى دالة حدث:
eventEmitter.on('scream', myEventHandler);
//الان يمكك تشغييل الحدث 'scream' الخاص بك :
eventEmitter.emit('scream');
احفظ الملف باسم "demo_eventemitter.js" وافتح نافذة موجه الاوامر cmd
C:\Users\My Name>node demo_eventemitter.js


 ما هو NPM؟
NPM هو مدير المكتبات والحزم المجانية  Node.js 
يستضيف موقع www.npmjs.com آلاف المكتبات المجانية للتنزيل والاستخدام.
يتم تثبيت برنامج NPM على جهاز الكمبيوتر الخاص بك عند تثبيت Node.js
اذا بدأت الدروس من الاول فانت  جاهز بالفعل للتشغيل (NPM )على جهاز الكمبيوتر الخاص بك!


ما هي المكتبات؟
تحتوي المكتبات في Node.js على جميع الملفات التي تحتاجها للوحدة النمطية (module).
الوحدات النمطية   (modules) هي مكتبات JavaScript يمكنك تضمينها في مشروعك.
تنزيل المكتبات
تنزيل  مكتبة سهل للغاية.
افتح واجهة  موجه الأوامر(cmd) واطلب من NPM تنزيل  المكتبة التي تريدها.

أريد تنزيل حزمة تسمى "الأحرف الكبيرة (upper-case)":
اختر مسار المجلد الموجود فيه مشروعك   واكتب الامر التالي في موجه الاوامر cmd
C:\Users\Your Name>npm install upper-case
الآن قمت بتنزيل وتثبيت  المكتبة الأولى الخاصة بك!
يقوم NPM بإنشاء مجلد باسم "node_modules" ، حيث سيتم وضع المكتبات التي قمت بتنزيلها. سيتم وضع جميع  المكتبات التي تقوم بتثبيتها في المستقبل في هذا المجلد.
يحتوي مشروعي الآن على بنية مجلد مثل هذا:
C:\Users\My Name\node_modules\upper-case
كيفية استخدام المكتبات  التي حملتها
بمجرد تثبيت المكتبة، تصبح جاهزة للاستخدام.
قم بتضمين حزمة "الأحرف الكبيرة " بنفس طريقة تضمين أي وحدة نمطية (module) أخرى:
var uc = require('upper-case');
قم بإنشاء ملف Node.js   يقوم بتحويل الناتج "Hello World!" إلى أحرف كبيرة:
var http = require('http');
var uc = require('upper-case');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write(uc.upperCase("Hello World!"));
  res.end();
}).listen(8080);
احفظ الملف باسم "demo_uppercase.js", وشغل موجه الاوامر cmd :
C:\Users\Your Name>node demo_uppercase.js
افتح المتصفح على الرابط التالي http://localhost:8080

شاهد الشرح في الفيديو


تعريف بسيط  url
محدد موقع المعلومات (بالإنجليزية: Uniform Resource Locator اختصاراً URL)
بواسطته يتم تحديد مواقع الانترنت. وهو ذلك العنوان الذي تكتبه في شريط العنوان للذهاب إلى مواقع الإنترنت ويسبقه تحديد البروتوكول مثال //:http أو البروتوكول //:ftp وعلى سبيل المثال عنوان هذه الصفحة هو https://itqan7.blogspot.com/ 


وحدة محدد موقع المعلومات المضمنة (Built-in URL Module)  

 تقسم وحدة  رابط الموقع (URL Module)   إلى أجزاء قابلة للقراءة. 
 لتضمين وحدة  رابط الموقع (URL Module) ،نستدعي المكتبة باستخدام  الدالة require() :
var url = require('url');

تحليل رابط الموقع  باستخدام  الدالة url.parse () ، وسيرجع لنا  كائن (object)URL مع كل جزء من العنوان كخصائص:
مثال
التقاط وتقسيم رابط الموقع إلى أجزاء يمكن قراءتها:
var url = require('url');
var adr = 'http://localhost:8080/default.htm?year=2017&amp;amp;month=february';
var q = url.parse(adr, true);
console.log(q.host); //returns 'localhost:8080'
console.log(q.pathname); //returns '/default.htm'
console.log(q.search); //returns '?year=2021&amp;amp;month=february'
var qdata = q.query; //returns an object: { year: 2021, month: 'february' }
console.log(qdata.month); //returns 'february'
احفظ الكود في ملف "demo_url.js" وشغل الملف في cmd
C:\Users\My Name>node demo_url.js
خادم الملفات وعرض الصفحات (File Server) Node.js
الآن نحن نعرف كيفية تحليل سلسلة رابط الموقع  ، وفي الدرس السابق تعلمنا كيفية جعل Node.js يعمل كخادم ملفات. دعونا نجمع بين الاثنين ، ونلتقط الصفحة التي يطلبها العميل في الرابط ونعرضها وفي حال عدم وجود الصفحة نطبع رسالة الصفحة المطلوبة غير موجودة  .
أنشئ ملفين html واحفظهما في نفس المجلد الموجود فيه مشروع  node.js.
الملف الاول باسم 'summer.html'
<!DOCTYPE html>
<html>
<body>
<h1>Summer</h1>
<p>I love the sun!</p>
</body>
</html>
الملف الثاني 'winter.html'
<!DOCTYPE html>
<html>
<body>
<h1>Winter</h1>
<p>I love the snow!</p>
</body>
</html>
قم بإنشاء ملف Node.js يفتح  الصفحة المطلوبة ويعيد المحتوى إلى العميل. إذا حدث خطأ ما او الملف غير موجود ، فقم  بطباعة خطأ 404 الصفحة غير موجودة:

في ملف demo_fileserver.js اكتب الكود التالي :

var http = require('http');
var url = require('url');
var fs = require('fs');

http.createServer(function (req, res) {
  var q = url.parse(req.url, true);
  var filename = "." + q.pathname;
  fs.readFile(filename, function(err, data) {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    } 
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);

احفظ الملف وقم بتشغيله على موجه الاوامر
C:\Users\Your Name>node demo_fileserver.js
افتح المتصفح على الرابط التالي http://localhost:8080/summer.html لعرض محتوى الصفحة الاولى

Summer

I love the sun!


افتح المتصفح على الرابط التالي http://localhost:8080/winter.html لعرض محتوى الصفحة الثانية

Winter

I love the snow!


شاهد الشرح بالفيديو


 وحدة نظام الملفات Node.js

Node.js كخادم ملفات

تسمح لك وحدة نظام الملفات Node.js بالعمل مع نظام الملفات على جهاز الكمبيوتر الخاص بك.
لتضمين  وحدة نظام الملفات (File System module)، استخدم الدالة require('fs')  :
var fs = require('fs');
الاستخدام الشائع لوحدة نظام الملفات  (File System module):
  • قراءة الملفات            (Read files)
  • أنشاء ملفات              (Create files)
  • تحديث الملفات          (Update files)
  • حذف الملفات            (Delete files)
  • إعادة تسمية الملفات    (Rename files)
قراءة الملفات (Read Files)
تُستخدم  fs.readFile() method لقراءة الملفات الموجودة على جهاز الكمبيوتر الخاص بك.
افترض أنه لدينا ملف HTML التالي (موجود في نفس المجلد الموجود في ملف  Node.js):
<html>
<body>
<h1>My Header</h1>
<p>My paragraph.</p>
</body>
</html>
قم بتسمية الملف بإسم "demofile1.html" أنشئ ملف Node.js يقرأ ملف HTML ، وأعد المحتوى: الكود
var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
  fs.readFile('demofile1.html', function(err, data) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(8080);
احفظ ملف نود جي اس باسم "demo_readfile.js" وشغل الملف في cmd
C:\Users\Your Name\desktop\node>node demo_readfile.js
افتح المتصفح على الرابط http://localhost:8080
إنشاء الملفات (Create files)
تحتوي وحدة نظام الملفات على طرق لإنشاء ملفات جديدة:
  • fs.appendFile()
  • fs.open ()
  • fs.writeFile ()
تقوم  الدالة  fs.appendFile()  بإلحاق المحتوى المحدد بملف. إذا كان الملف غير موجود ، فسيتم إنشاء الملف جديد:
مثال
أنشئ ملفًا جديدًا باستخدام طريقة اي (method)  appendFile():
var fs = require('fs');
fs.appendFile('mynewfile1.txt', 'Hello content!', function (err) {
  if (err) throw err;
  console.log('Saved!');
});
احفظ الملف باسم "demo_fs_append.js"ثم قم بتشغيله
C:\Users\My Name\desktop\node>node demo_fs_append.js
تأخذ الدالة fs.open() علامة "علم" كمعامل ثاني ، إذا كانت العلامة "w" من أجل "كتابة" ، يتم فتح الملف المحدد للكتابة. إذا كان الملف غير موجود ، فسيتم إنشاء ملف فارغ:
مثال
أنشئ ملفًا جديدًا فارغًا باستخدام طريقة () open:
var fs = require('fs');

fs.open('mynewfile2.txt', 'w', function (err, file) {
  if (err) throw err;
  console.log('Saved!');
});
تستبدل الدالة fs.writeFile () الملف والمحتوى المحددين إذا كانا موجودين. إذا كان الملف غير موجود ، فسيتم إنشاء ملف جديد يحتوي على المحتوى المحدد:
مثال
أنشئ ملفًا جديدًا باستخدام الدالة writeFile ():
 var fs = require('fs');
fs.writeFile('mynewfile3.txt', 'Hello content!', function (err) {
  if (err) throw err;
  console.log('Saved!');
});
تحديث الملفات(Update files)
تحتوي وحدة نظام الملفات على طرق لتحديث الملفات هي:
  • fs.appendFile()
  • fs.writeFile()
تظيف الدالة fs.appendFile () المحتوى المحدد بنهاية الملف المحدد:
مثال
اظافة   "هذا هو النص الخاص بي".   في نهاية ملف "mynewfile1.txt":
var fs = require('fs');
fs.appendFile('mynewfile1.txt', ' هذا هو النص الخاص بي.', function (err) {
  if (err) throw err;
  console.log('Updated!');
});
تستبدل الدالة  fs.writeFile () الملف والمحتوى المحددين:
var fs = require('fs');
fs.writeFile('mynewfile3.txt', 'This is my text', function (err) {
  if (err) throw err;
  console.log('Replaced!');
});
حذف الملفات (Delete files) 
لحذف ملف باستخدام الوحدة النمطية لنظام الملفات(File System module) ، استخدم الدالة fs.unlink ().
الدالة fs.unlink () تحذف الملف المحدد:
مثال
حذف الملف "mynewfile2.txt":
var fs = require('fs');
fs.unlink('mynewfile2.txt', function (err) {
  if (err) throw err;
  console.log('File deleted!');
});
 إعادة تسمية الملفات (Rename files)
لإعادة تسمية ملف باستخدام وحدة نظام الملفات (File System Module)، استخدم الدالة fs.rename()
 الدالة fs.rename () تعيد تسمية الملف المحدد: 
 مثال 
 أعد تسمية الملف "mynewfile1.txt" إلى "myrenamedfile.txt":
var fs = require('fs');
fs.rename('mynewfile1.txt', 'myrenamedfile.txt', function (err) {
  if (err) throw err;
  console.log('File Renamed!');
});
تحميل الملفات(Upload Files)
يمكنك أيضًا استخدام Node.js لتحميل الملفات إلى جهاز الكمبيوتر الخاص بك. تعلم الكيفية في درس تحميل الملفات Node.js.



شاهد الشرح في الفيديو :


ما هو الموديل المدمج (The Built-in HTTP Module) 
module  يعني  الوحدة 
تحتوي مكتبة Node.js على وحدة نمطية (built-in module) مضمنة تسمى HTTP ، والتي تسمح لـ Node.js بنقل البيانات عبر بروتوكول نقل النص التشعبي (HTTP).
لتضمين  module HTTP ، استدعي الدالة require('http')  :
var http = require('http');
خادم ويب (Node.js as a Web Server)
 يمكن لوحدة HTTP إنشاء خادم HTTP يستمع إلى منافذ الخادم ويعطي استجابة للعميل.
 استخدم  الدالة createServer () لإنشاء خادم HTTP:
var http = require('http');
//إنشاء كائن الخادم:
http.createServer(function (req, res) {
  res.write('Hello World!'); //اكتب ردًا على العميل
  res.end(); //إنهاء الرد 
}).listen(8080); //فتح الخادم على المنفذ  8080
سيتم تنفيذ الدالة (fuction)التي تم تمريرها إلى الاسلوب (method) http.createServer () ، عندما يحاول شخص ما الوصول إلى الكمبيوتر على المنفذ 8080. 
 احفظ الكود أعلاه في ملف يسمى "demo_http.js" ، وابدأ تشغيل الملف:
C:\Users\Your Name>node demo_http.js
افتح المتصفح على الرابط التالي http://localhost:8080
اضافة HTTP الى رأس الصفحة
 إذا كان من المفترض أن يتم عرض الاستجابة من خادم HTTP بتنسيق HTML ، فيجب عليك تضمين رأس HTTP بنوع المحتوى الصحيح:اي "Content-Type text/html" 
مثال
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World!');
  res.end();
}).listen(8080);
شرح الدالة res.writeHead(المتغير الاول ,الالمتغير الثاني)
  • المتغير الاول هو رمز الحالة ، 200 يعني أن كل شيء على ما يرام ، 
  • المتغير الثاني عبارة عن كائن(object) يحتوي على رؤوس الاستجابة.
التقاط القيم المرسلة على الرابط 
تحتوي الدالة التي تم تمريرها إلى http.createServer () على  البرامتر req التي تمثل الطلب من العميل ، ككائن (كائن http.IncomingMessage).

هذا الكائن له خاصية تسمى "url" والتي تحتوي على جزء عنوان url الذي يأتي بعد اسم المجال او النطاق:
مثال
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write(req.url);
  res.end();
}).listen(8080);
احفظ الكود في ملف باسم "demo_http_url.js" وشغله في موجه الاوامر
C:\Users\Your Name>node demo_http_url.js
افتح المتصفح على الرابط التالي http://localhost:8080/hellourl
تقسيم القيم المرسلة على الرابط
توجد وحدات مدمجة لتقسيم سلسلة الاستعلام بسهولة إلى أجزاء قابلة للقراءة ، مثل وحدة الرابط (url). التقاط قيم الرابط وتقسيمها
مثال
التقاط القيم المرسلة من الفورم على الرابط :
var http = require('http');
var url = require('url');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var q = url.parse(req.url, true).query;
  var txt = q.year + " " + q.month;
  res.end(txt);
}).listen(8080);
احفظ الكود في ملف باسم "demo_querystring.js" وشغله في موجه الاوامر cmd :
C:\Users\Your Name>node demo_querystring.js
والان افتح متصفح الويب على الرابط التالي: http://localhost:8080/?year=2021&month=July النتيجة
2021 July 


ما هي الوحدة النمطية(module) في Node.js؟

 ضع في اعتبارك أن الوحدات النمطية (modules)هي نفسها مكتبات JavaScript. مجموعة من الوظائف التي تريد تضمينها في
تطبيقك. وحدات مدمجة يحتوي Node.js على مجموعة من الوحدات المدمجة التي يمكنك استخدامها دون أي تثبيت إضافي. ،
تضمين الوحدات Include Modules
لتضمين وحدة نمطية ، استخدم الدالة() require  مع اسم الوحدة (module):
<script>
var http = require('http');
</script>
الآن يمكن للتطبيق الخاص بك الوصول إلى وحدة HTTP ، وهو قادر على إنشاء خادم:
<script>
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('Hello World!');
}).listen(8080);
</script>

قم بإنشاء الوحدات الخاصة بك
يمكنك إنشاء الوحدات النمطية   (modules) الخاصة بك ، وتضمينها بسهولة في تطبيقاتك. 

 يقوم المثال التالي بإنشاء وحدة نمطية  (module)  تقوم بإرجاع كائن التاريخ والوقت:
مثال: قم بإنشاء وحدة (module) ترجع التاريخ والوقت الحاليين:
<script>
exports.myDateTime = function () {
  return Date();
};
</script>
استخدم الكلمة الأساسية للتصدير(exports) لإتاحة الخصائص والأساليب (properties and methods) خارج ملف الوحدة النمطية (module).
احفظ الكود أعلاه في ملف يسمى "myfirstmodule.js"
قم بتضمين الوحدة الخاصة بك(Include Module)
يمكنك الآن تضمين الوحدة النمطية (modules) واستخدامها في أي من ملفات Node.js الخاصة بك.
مثال
استخدم الوحدة النمطية (module) "myfirstmodule" ( في ملف Node.js:)
 var http = require('http');
var dt = require('./myfirstmodule');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write("The date and time are currently: " + dt.myDateTime());
  res.end();
}).listen(8080);
لاحظ أننا نستخدم (/.) لتحديد موقع الوحدة (module)، وهذا يعني أن الوحدة موجودة في نفس المجلد مثل ملف Node.js. احفظ الكود أعلاه في ملف يسمى "demo_module.js" ، وابدأ الملف  :
افتج موجه الاوامر (cmd)
بدء demo_module.js بكتابة الامر التالي:
C:\Users\Your Name>node demo_module.js
الان افتح المتصفح على الرابط التالي : http://localhost:8080
شاهد الفيديو



 ابدأ تعلم Node.js
تنزيل Node.js
يحتوي موقع Node.js الرسمي على إرشادات التثبيت لـ Node.js: https://nodejs.org
ابدء التعلم
بمجرد تنزيل Node.js وتثبيته على جهاز الكمبيوتر الخاص بك ، دعنا نحاول عرض "Hello World" في متصفح الويب.
قم بإنشاء ملف Node.js باسم "myfirst.js" ، وأضف الكود التالي:

var http = require('http'); 

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end('Hello World!');
}).listen(8080);

احفظ الملف على جهاز الكمبيوتر الخاص بك: C: \ Users \ Your Name \ myfirst.js

يخبر الرمز الكمبيوتر أن يكتب "Hello World!" إذا حاول أي شخص (فتح متصفح الويب) الوصول إلى جهاز الكمبيوتر الخاص بك على المنفذ 8080.

في الوقت الحالي ، لا يتعين عليك فهم الكود. سيتم شرحه لاحقا.

 cmd موجه الأوامر  (Command Line Interface)
يجب بدء تشغيل ملفات Node.js في برنامج "Command Line" بجهاز الكمبيوتر الخاص بك.

تعتمد كيفية فتح واجهة سطر الأوامر على جهاز الكمبيوتر الخاص بك على نظام التشغيل. بالنسبة لمستخدمي Windows ، اضغط على زر البدء وابحث عن "موجه الأوامر" ، أو ببساطة اكتب "cmd" في حقل البحث.

انتقل إلى المجلد الذي يحتوي على الملف "myfirst.js" ، يجب أن تبدو نافذة واجهة سطر الأوامر كما يلي:
C:\Users\Your Name>_
ابدأ تشغيل ملف Node.js
يجب أن يبدأ الملف الذي أنشأته للتو بواسطة Node.js قبل أن يتم تنفيذ أي إجراء.
ابدأ واجهة سطر الأوامر ، واكتب node myfirst.js واضغط على Enter: 
ليكون الامر كالاتي
C:\Users\Your Name>node myfirst.js
الآن ، يعمل جهاز الكمبيوتر الخاص بك كخادم! إذا حاول أي شخص الوصول إلى جهاز الكمبيوتر الخاص بك على المنفذ 8080 ، فسيحصل على "Hello World!" رسالة في المقابل! افتح  متصفح الإنترنت الخاص بك ، واكتب العنوان: http: // localhost: 8080
شاهد الفيديو 






ما هو Node.js؟


  1. Node.js هي بيئة خادم مفتوحة المصدر
  2. Node.js مجاني
  3. يعمل Node.js على العديد من الأنظمة الأساسية (Windows و Linux و Unix و Mac OS X وما إلى ذلك)
  4. يستخدم Node.js JavaScript على الخادم
مميزات نود.جي إس
من مميزات نود.جي إس سرعة الآداة مع المحافظة على الفاعلية، فسرعتها في إرسال الرسائل البريدية هي 10 أضعاف سرعة بي إتش بي، مع عدد أقل من العمليات الغير ناجحة، من مميزاتها أيضا أنك تستدعي المكتبات التي تعمل عليها في الوقت الذي تريد، الأمر الذي يفضي إلى أفضل استغلال للموارد.

سرعة نود.جي إس هي نتيجة لسرعة المحرك الذي تستخدمه الذي يعتبر نواتها. تقوم نود.جي إس بمعالجة النص المصدري سطرا سطرا، من خلال خيط واحد على عكس ما يحدث في PHP مثلا، المعنى أنه لو زار 1000 شخص موقعا يعمل على نود.جي إس فسيتم خدمتهم بالتتالي، المشكل أنه لو أضطر شخص ما لانتظار عملية ما مدة دقيقة فيجب على الكل الانتظار حتى تنتهي تلك العملية، إلا أنه يكمن تفادي هذا من خلال بنية الجافا سكربت التي تمكن من استدعاء دالة ما (أو مع صياغتها) عند الانتهاء من عملية ما والمرور للعملية الموالية، ككل تمكن نود.جي إس من بناء تطبيقات كبيرة، أحيانا بسهولة،

لماذا Node.js؟

يستخدم Node.js البرمجة غير المتزامنة!

يمكن أن تكون المهمة الشائعة لخادم الويب هي فتح ملف على الخادم وإعادة المحتوى إلى العميل.

إليك كيفية تعامل PHP أو ASP مع طلب ملف:

  1. يرسل المهمة إلى نظام ملفات الكمبيوتر.
  2. ينتظر بينما يفتح نظام الملفات ويقرأ الملف.
  3. يعيد المحتوى إلى العميل.
  4. جاهز للتعامل مع الطلب التالي.

إليك كيفية معالجة Node.js لطلب ملف:

  1. يرسل المهمة إلى نظام ملفات الكمبيوتر.
  2. جاهز للتعامل مع الطلب التالي.
  3. عندما يتم فتح نظام الملفات وقراءته ، يقوم الخادم بإرجاع المحتوى إلى العميل.
يلغي Node.js الانتظار ، ويستمر ببساطة مع الطلب التالي. وهذه ميزة رائعة لن تجدها في لغات البرمجة الاخرى مثل php  
يقوم Node.js بتشغيل البرمجة أحادية الترابط ، وغير المحظورة ، وغير المتزامنة ، وهي فعالة للغاية في الذاكرة.

ما الذي يمكن أن يفعله Node.js؟

  • يمكن لـ Node.js إنشاء محتوى صفحة ديناميكي
  • يمكن لـ Node.js إنشاء الملفات على الخادم وفتحها وقراءتها وكتابتها وحذفها وإغلاقها
  • يمكن لـ Node.js جمع بيانات النموذج
  • يمكن لـ Node.js إضافة أو حذف أو تعديل البيانات في قاعدة البيانات الخاصة بك

ما هو ملف Node.js؟

  • تحتوي ملفات Node.js على مهام سيتم تنفيذها على أحداث معينة
  • حدث نموذجي هو شخص يحاول الوصول إلى منفذ على الخادم
  • يجب بدء ملفات Node.js على الخادم قبل أن يكون لها أي تأثير
  • ملفات Node.js لها امتداد ".js"  





هو إطار عمل جافا سكريبت لبناء واجهات المستخدم. يعتمد على (HTML و CSS و JavaScript)

يوفر نموذج برمجة تعريفي وقائم على المكونات يساعدك على تطوير واجهات المستخدم بكفاءة، سواء كانت بسيطة أو معقدة.

إليك ابسط مثال للإنطلاق في فيو ثلاثة

 
<!-- استدعاء مكتبة فيو الإصدار الثالث -->
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>

<div id="app">
  <button @click="count++">
    عند الضغط فوقي سوف اضاعف العدد: {{ count }}
  </button>
</div>
<script>
const { createApp, ref} = Vue

createApp({
  setup() {
    return {
      count: ref(0)
    }
  }
}).mount('#app')
</script>

يوضح المثال أعلاه السمتين الأساسيتين لـ Vue:

العرض التعريفي:

يُمكِّن العرض التعريفي المستخدم من تحديد مخرجات HTML بشكل تصريحي اعتمادًا على حالة JavaScript. يتوسع Vue في HTML العادي بمساعدة بناء جملة النموذج.

التفاعل:

يتتبع Vue تلقائيًا تغييرات حالة JavaScript ويقوم بتحديث DOM بكفاءة عند حدوث التغييرات.

متطلبات تعلم فيو الاصدار الثالث

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

نبذة مختصرة عن فيو

Vue هو إطار عمل ونظام بيئي يغطي معظم الميزات المشتركة المطلوبة في تطوير الواجهة الأمامية. باالرغم من وجود العديد من المكتبات المختلفة والمتنوعة - فالأشياء التي نبنيها على الويب قد تختلف بشكل كبير من حيث الشكل والحجم. مع أخذ ذلك في الاعتبار، تم تصميم Vue ليكون مرنًا وقابلاً للاعتماد بشكل تدريجي. اعتمادًا على حالة الاستخدام الخاصة بك، يمكن استخدام Vue بطرق مختلفة: المتمثلة في التالي

  • تضمين المكونات في أي صفحة
  • تطبيق الصفحة الواحدة (Single-Page Application)
  • Fullstack / العرض من جانب الخادم (Server-Side Rendering)
  • Jamstack / إنشاء الموقع الثابت (Static Site Generation)
  • استهداف سطح المكتب والجوال وWebGL وحتى الجهاز الطرفي

مكونات الملف الواحد

مكونات الملف الواحد بالإنجليزية (Single-File Component) نقوم بتأليف مكونات الفيو باستخدام تنسيق ملف يشبه html لكن يكون بتنسيق *.vue ويشتمل على اكواد (JavaScript) (HTML) (CSS) في ملف واحد. يؤدي هذا الملف عملية عرض مقال او تعديل مقال او زر اعجاب او تسجيل دخول او خروج ...إلخ

إليك المثال السابق، مكتوبًا بتنسيق (Single-File Component)


<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>

<template>
  <button @click="count++">Count is: {{ count }}</button>
</template>

<style scoped>
button {
  font-weight: bold;
}
</style>

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

أنماط واجهة برمجة التطبيقات (API Styles)

يمكن تأليف مكونات Vue في نمطين مختلفين من واجهة برمجة التطبيقات: Options API وComposition API.

واجهة برمجة التطبيقات (Options API)

باستخدام Options API، يمكننا اختيار الداتا كدالة ولا يمكننا اختيارها ككائن الخيارات التالية ( data, methods, and mounted) يتم عرضها بواسطة Options في هذه الوظائف الداخلية، والتي تشير إلى (component instance):


   <script>
export default {
// الخصائص التي يتم إرجاعها من البيانات () تصبح حالة تفاعلية
// وسيتم عرضه على `هذا`.
  data() {
    return {
      count: 0
    }
  },

// الأساليب هي وظائف تعمل على تغيير الحالة وتفعيل التحديثات.
   // يمكن ربطها كمعالجات للأحداث في القوالب.
  methods: {
    increment() {
      this.count++
    }
  },

// يتم استدعاء خطافات دورة الحياة في مراحل مختلفة
// دورة حياة المكون.
// سيتم استدعاء هذه الوظيفة عند تثبيت المكون.
  mounted() {
    console.log(`العد الأولي هو ${this.count}.`)
  }
}
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>
   

واجهة برمجة التطبيقات (Composition API)

المثال التالي يوضح لك طريقة الاستخدام

<script setup>
import { ref, onMounted } from 'vue'

// reactive state -- حالة رد الفعل
const count = ref(0)

// functions that mutate state and trigger updates
//الوظائف التي تغير الحالة وتطلق التحديثات
function increment() {
  count.value++
}

// lifecycle hooks -- خطافات دورة الحياة
onMounted(() => {
  console.log(`The initial count is ${count.value}.`)
})
</script>

<template>
  <button @click="increment">Count is: {{ count }}</button>
</template>

ايهما اختار في مشاريع

كلاهما يمكنك من انشاء مشاريع كبيرة والامر يعود لك فانت صاحب القرار اختر الطريقة التي ترتاح لها

مقدمة


1- اولا نقوم  بانشاء الصفحة الرئيسية  index.html في اي مكان تريد في سطح المكتب مثلا ونكتب الكود التالي


 <html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title> 
    <script src="https://unpkg.com/vue@next"></script>
    </head>
    <body>
    <div id="app">
        {{ counter }} 
    </div> 
    <script> 
       const Counter = {
         data() {
           return {
             counter:0 
           }
         }
       }  
       Vue.createApp(Counter).mount('#app')
    </script> 
    </body>
    </html>

النتيجة

0


 السلام عليكم ورحمة الله وبركاته 

في هذا الدرس سنتعلم تكبير الصور للمنتجات عند مرور الفأرة الماوس على الصورة بلغة vue js 3  سوف استخدم vue cli  

اولا افتح cmd و قم بانشاء مشروع جديد باضافة الامر التالي 


  vue create zoomimage
  
  


المكتبة المستعملة في التصميم css هي


"dependencies": { 
    "bulma": "^0.9.3",   
  }
  }

template انشأ كومبوننت جديد والصق الكود التالي


<template>
  <div class="container">
    <section class="section">
      <div class="columns">
        <div class="column is-1">
          <div class="img-zoom-item">
            <img
              v-for="(im, index) in img"
              :key="index"
              @click="shangimg(im.imgs)"
              id="momo"
              :src="im.imgs"
              alt="Girl"
            />
          </div>
        </div>

        <div class="column is-5">
          <div class="img-zoom-container " @mouseout="clearopacityz">
            <img
              id="momo"
              ref="imgtopz"
              @load="imageZoomz"
              :src="image"
              alt="Girl"
              @mousemove="moveLensz"
              @touchmove="moveLensz"
            />
          </div>

          <div class="img-magnifier-container ">
            <img
              id="myimage"
              :src="image"
              ref="imgmobaile"
              @load="magnify"
              @mousemove="moveMagnifier"
              @touchmove="moveMagnifier"
            />
          </div>
        </div>

        <div class="column is-5">
          <div class="img-zoom-result" ref="resulz"></div>

          <div class="product__details__text">
            <div class="content">
              <h1>product d_etails rating</h1>
              <div class="block product__details__rating">
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa :icon="['fas', 'star-half']"></fa>
                </span>
                <span> (18 reviews)</span>
              </div>
              <h3>$50.00</h3>

              <div class="block flex-2-item">
                <div class="item-12-flex">
                  <div class="nav">
                    <div>
                      <input type="number" class="input" value="1" min="1" />
                    </div>
                    <div>
                      <a href="#" class="primary-btn">ADD TO CARD</a>
                      <a href="#" class="heart-icon">
                        <fa :icon="['fas', 'heart']"></fa>
                      </a>
                    </div>
                  </div>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Availability</b>
                </div>
                <div class="item-2-flex">
                  <span>In Stock</span>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Shipping</b>
                </div>
                <div class="item-2-flex">
                  <span>01 day shipping. <samp>Free pickup today</samp></span>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Weight</b>
                </div>
                <div class="item-2-flex">
                  <span>0.5 kg</span>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Share on</b>
                </div>
                <div class="item-2-flex">
                  <span class="icon is-large fa-2x  has-text-info">
                    <fa :icon="['fab', 'twitter']"></fa>
                  </span>
                  <span class="icon is-large fa-2x  has-text-link">
                    <fa :icon="['fab', 'facebook']"></fa>
                  </span>
                  <span class="icon is-large fa-2x  has-text-warning">
                    <fa :icon="['fab', 'instagram']"></fa>
                  </span>
                  <span class="icon is-large    fa-2x  has-text-danger">
                    <fa :icon="['fab', 'pinterest']"></fa>
                  </span>
                </div>
              </div>

              <p>
                Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a.
                Vestibulum ac diam sit amet quam vehicula elementum sed sit amet
                dui. Sed porttitor lectus nibh. Vestibulum ac diam sit amet quam
                vehicula elementum sed sit amet dui. Proin eget tortor risus.
              </p>
            </div>
          </div>
        </div>

        <div class="column is-1"></div>
      </div>
    </section>
  </div>
</template>

وفي عنصر جافاسكريبت الصق الاكود التالي js


<script>
  import { computed, ref, onMounted } from "vue";
export default {
  setup() {
    const img = ref([
      { imgs: require("../assets/blog/blog-1.jpg") },
      { imgs: require("../assets/blog/blog-2.jpg") },
      { imgs: require("../assets/blog/blog-3.jpg") },
      { imgs: require("../assets/blog/blog-4.jpg") },
      { imgs: require("../assets/blog/blog-5.jpg") },
    ]);
    const image = ref(img.value[0].imgs);
    const resultez = ref("");
    const lensz = ref("");
    const imgz = ref("");
    const resultz = ref("");
    const cxz = ref("");
    const cyz = ref("");
    const imgtopz = ref(null);
    const resulz = ref(null);
    const zoom = ref(2);

    const imgmobaile = ref(null);
    const imgmob = ref("");
    const glass = ref("");
    const h = ref("");
    const w = ref("");
    const bw = ref("");
    const wit = ref(screen.width);
    const witW = computed(() => {
      console.log(wit.value);
      return wit.value;
    });

    const shangimg = (index) => {
      if (image.value !== index) {
        image.value = index;
      } else return;
    };

    onMounted(() => {
      witW.value;
    });
    const imageZoomz = () => {
      if (witW.value >= 676) {
        var myobj = document.querySelectorAll(".img-zoom-lens");
        if (myobj.length > 0) {
          myobj[0].remove();
        }

        imgz.value = imgtopz.value;
        resultz.value = resulz.value;
        /*create lens:*/
        lensz.value = document.createElement("DIV");
        lensz.value.setAttribute("class", "img-zoom-lens");
        /*insert lens:*/
        imgz.value.parentElement.insertBefore(lensz.value, imgz.value);
        /*calculate the ratio between result DIV and lens:*/
        cxz.value = resultz.value.offsetWidth / lensz.value.offsetWidth;
        cyz.value = resultz.value.offsetHeight / lensz.value.offsetHeight;
        /*set background properties for the result DIV:*/
        resultz.value.style.backgroundImage = "url('" + imgz.value.src + "')";
        resultz.value.style.backgroundSize =
          imgz.value.width * cxz.value +
          "px " +
          imgz.value.height * cyz.value +
          "px";

        lensz.value.addEventListener("mousemove", moveLensz, { passive: true });

        lensz.value.addEventListener("touchmove", moveLensz, { passive: true });
      } else return false;
      //
    };
    const moveLensz = (e) => {
      if (witW.value >= 676) {
        var pos, x, y;

        pos = getCursorPosz(e);
        /*calculate the position of the lens:*/
        x = pos.x - lensz.value.offsetWidth / 2;
        y = pos.y - lensz.value.offsetHeight / 2;
        /*prevent the lens from being positioned outside the image:*/
        if (x > imgz.value.width - lensz.value.offsetWidth) {
          x = imgz.value.width - lensz.value.offsetWidth;
        }
        if (x < 0) {
          x = 0;
        }
        if (y > imgz.value.height - lensz.value.offsetHeight) {
          y = imgz.value.height - lensz.value.offsetHeight;
        }
        if (y < 0) {
          y = 0;
        }
        /*set the position of the lens:*/
        lensz.value.style.left = x + "px";
        lensz.value.style.top = y + "px";
        /*display what the lens "sees":*/
        resultz.value.style.opacity = 1;
        resultz.value.style.position = "relative";
        resultz.value.style.backgroundPosition =
          "-" + x * cxz.value + "px -" + y * cyz.value + "px";
      } else return;
    };
    const clearopacityz = () => {
      if (witW.value >= 676) {
        resultz.value.style.opacity = 0;
        resultz.value.style.position = "absolute";
      } else return;
    };
    const getCursorPosz = (e) => {
      var a,
        x = 0,
        y = 0;
      e = e || window.event;
      /*get the x and y positions of the image:*/
      a = imgz.value.getBoundingClientRect();
      /*calculate the cursor's x and y coordinates, relative to the image:*/
      x = e.pageX - a.left;
      y = e.pageY - a.top;
      /*consider any page scrolling:*/
      x = x - window.pageXOffset;
      y = y - window.pageYOffset;
      return { x: x, y: y };
    };

    //-imageZoom--------imageZoom---------imageZoom--//

    const magnify = () => {
      var magnifier = document.querySelectorAll(".img-magnifier-glass");
      if (magnifier.length > 0) {
        magnifier[0].remove();
      }

      imgmob.value = imgmobaile.value;
      /*create magnifier glass:*/
      glass.value = document.createElement("DIV");
      glass.value.setAttribute("class", "img-magnifier-glass");
      /*insert magnifier glass.value:*/
      imgmob.value.parentElement.insertBefore(glass.value, imgmob.value);
      //console.log(glass.value);console.log( imgmob.value);
      /*set background properties for the magnifier glass.value:*/
      glass.value.style.backgroundImage = "url('" + imgmob.value.src + "')";
      glass.value.style.backgroundRepeat = "no-repeat";
      glass.value.style.backgroundSize =
        imgmob.value.width * zoom.value +
        "px " +
        imgmob.value.height * zoom.value +
        "px";
      bw.value = 3;
      w.value = glass.value.offsetWidth / 2;
      h.value = glass.value.offsetHeight / 2;
      /*execute a function when someone moves the magnifier glass.value over the image:*/
      glass.value.addEventListener("mousemove", moveMagnifier, {
        passive: true,
      });

      /*and also for touch screens:*/
      glass.value.addEventListener("touchmove", moveMagnifier, {
        passive: true,
      });
    };
    const moveMagnifier = (e) => {
      var pos, x, y;
      /*prevent any other actions that may occur when moving over the image*/
      //e.preventDefault();
      /*get the cursor's x and y positions:*/
      pos = getCursorPoss(e);
      x = pos.x;
      y = pos.y;
      /*prevent the magnifier glass.value from being positioned outside the image:*/
      if (x > imgmob.value.width - w.value / zoom.value) {
        x = imgmob.value.width - w.value / zoom.value;
      }
      if (x < w.value / zoom.value) {
        x = w.value / zoom.value;
      }
      if (y > imgmob.value.height - h.value / zoom.value) {
        y = imgmob.value.height - h.value / zoom.value;
      }
      if (y < h.value / zoom.value) {
        y = h.value / zoom.value;
      }
      /*set the position of the magnifier glass.value:*/
      glass.value.style.left = x - w.value + "px";
      glass.value.style.top = y - h.value + "px";
      /*display what the magnifier glass.value "sees":*/
      glass.value.style.backgroundPosition =
        "-" +
        (x * zoom.value - w.value + bw.value) +
        "px -" +
        (y * zoom.value - h.value + bw.value) +
        "px";
    };
    const getCursorPoss = (e) => {
      var a,
        x = 0,
        y = 0;
      e = e || window.event;
      /*get the x and y positions of the image:*/
      a = imgmob.value.getBoundingClientRect();
      /*calculate the cursor's x and y coordinates, relative to the image:*/
      x = e.pageX - a.left;
      y = e.pageY - a.top;
      /*consider any page scrolling:*/
      x = x - window.pageXOffset;
      y = y - window.pageYOffset;
      return { x: x, y: y };
    };

    //-imageZoom--------imageZoom---------imageZoom--//

    return {
      resultez,
      lensz,
      imgz,
      resultz,
      cxz,
      cyz,
      imgtopz,
      resulz,
      imageZoomz,
      img,
      moveLensz,
      clearopacityz,
      getCursorPosz,
      image,
      shangimg,
      zoom,
      imgmob,
      glass,
      h,
      w,
      bw,
      magnify,
      moveMagnifier,
      getCursorPoss,
      imgmobaile,
      witW,
      wit,
    };
  },
}; </script>
  
  

والصق الكود التالي في style


<style>
.flex-2-item {
  display: flex;
  justify-content: flex-start;
  align-items: center;
}
.item-1-flex {
  flex: 40%;
}
.item-2-flex {
  flex: 60%;
}

.item-12-flex {
  flex: 100%;
}

.product__details__text {
  z-index: 100;
}
.img-zoom-item {
  position: relative;
  overflow: hidden;
}
.img-zoom-item img {
  height: 50px;
  width: 50px;
  display: block;
  border-radius: 50%;
  cursor: pointer;
}

.column {
  position: relative !important ;
}
.img-zoom-container {
  position: relative;
  width: 100%;
  height: auto;
  min-height: 300px;
  display: block;
}
.img-zoom-container img {
  width: 100%;
  height: auto;
}

.img-zoom-lens {
  display: block;
  position: absolute;
  border: 1px solid #d4d4d4;
  /*set the size of the lens:*/
  width: 200px;
  height: 200px;
}
.img-zoom-lens-remove {
  border: 0px;
}

.img-zoom-result {
  position: absolute;
  border: 1px solid #d4d4d4;
  /*set the size of the result div:*/
  width: 100%;
  height: 100%;
  max-block-size: 400px;
  opacity: 0;
  transition: 0.8s ease;
  /*clear: both;*/
  background-repeat: no-repeat;
}

#descreption {
  position: relative;
  z-index: 1000;
}
.img-zoom-container img:hover .img-zoom-result {
  opacity: 1 !important;
}
/*zome mobaile*/

.img-magnifier-container {
  display: none;
  position: relative;
  width: 100%;

  height: 100%;
}
.img-magnifier-container img {
  width: 100%;
  height: 100%;
}

.img-magnifier-glass {
  position: absolute;
  border: 4px solid #e3e3e3;
  border-radius: 5px;
  cursor: none;
  /*Set the size of the magnifier glass:*/
  display: block;
  width: 200px !important;
  height: 200px !important;
}
.row-img img {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  border: 2px solid #cecece;
  cursor: pointer;
}
.row-img {
  margin-inline-start: 3px;
}
.row {
  position: relative;
}

.active {
  padding: 1em;
  border: 1px solid rgb(9, 160, 67);
}

@media screen and (max-width: 769px) {
  .row {
    display: flex;
  }

  .img-zoom-item img {
    height: 25px;
    width: 25px;
    display: inline-block;
    margin-inline-end: 15px;
  }
  .img-magnifier-container {
    display: block;
  }

  .img-zoom-container {
    display: none;
  }
  .flex-2-item {
    flex-direction: column;
    align-items: flex-start;
  }
  .img-magnifier-glass {
    width: 280px !important;
    height: 280px !important;
  }
}

/*-------- */
@media only screen and (min-width: 467px) and (max-width: 769px) {
  .img-magnifier-glass {
    width: 200px !important;
    height: 200px !important;
  }
}
@media only screen and (max-width: 467px) {
  .img-magnifier-glass {
    width: 150px !important;
    height: 150px !important;
  }
}</style>

الكود كامل


<template>
  <div class="container">
    <section class="section">
      <div class="columns">
        <div class="column is-1">
          <div class="img-zoom-item">
            <img
              v-for="(im, index) in img"
              :key="index"
              @click="shangimg(im.imgs)"
              id="momo"
              :src="im.imgs"
              alt="Girl"
            />
          </div>
        </div>

        <div class="column is-5">
          <div class="img-zoom-container " @mouseout="clearopacityz">
            <img
              id="momo"
              ref="imgtopz"
              @load="imageZoomz"
              :src="image"
              alt="Girl"
              @mousemove="moveLensz"
              @touchmove="moveLensz"
            />
          </div>

          <div class="img-magnifier-container ">
            <img
              id="myimage"
              :src="image"
              ref="imgmobaile"
              @load="magnify"
              @mousemove="moveMagnifier"
              @touchmove="moveMagnifier"
            />
          </div>
        </div>

        <div class="column is-5">
          <div class="img-zoom-result" ref="resulz"></div>

          <div class="product__details__text">
            <div class="content">
              <h1>product d_etails rating</h1>
              <div class="block product__details__rating">
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa icon="star"></fa>
                </span>
                <span class=" has-text-warning">
                  <fa :icon="['fas', 'star-half']"></fa>
                </span>
                <span> (18 reviews)</span>
              </div>
              <h3>$50.00</h3>

              <div class="block flex-2-item">
                <div class="item-12-flex">
                  <div class="nav">
                    <div>
                      <input type="number" class="input" value="1" min="1" />
                    </div>
                    <div>
                      <a href="#" class="primary-btn">ADD TO CARD</a>
                      <a href="#" class="heart-icon">
                        <fa :icon="['fas', 'heart']"></fa>
                      </a>
                    </div>
                  </div>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Availability</b>
                </div>
                <div class="item-2-flex">
                  <span>In Stock</span>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Shipping</b>
                </div>
                <div class="item-2-flex">
                  <span>01 day shipping. <samp>Free pickup today</samp></span>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Weight</b>
                </div>
                <div class="item-2-flex">
                  <span>0.5 kg</span>
                </div>
              </div>
              <div class="block flex-2-item">
                <div class="item-1-flex">
                  <b>Share on</b>
                </div>
                <div class="item-2-flex">
                  <span class="icon is-large fa-2x  has-text-info">
                    <fa :icon="['fab', 'twitter']"></fa>
                  </span>
                  <span class="icon is-large fa-2x  has-text-link">
                    <fa :icon="['fab', 'facebook']"></fa>
                  </span>
                  <span class="icon is-large fa-2x  has-text-warning">
                    <fa :icon="['fab', 'instagram']"></fa>
                  </span>
                  <span class="icon is-large    fa-2x  has-text-danger">
                    <fa :icon="['fab', 'pinterest']"></fa>
                  </span>
                </div>
              </div>

              <p>
                Mauris blandit aliquet elit, eget tincidunt nibh pulvinar a.
                Vestibulum ac diam sit amet quam vehicula elementum sed sit amet
                dui. Sed porttitor lectus nibh. Vestibulum ac diam sit amet quam
                vehicula elementum sed sit amet dui. Proin eget tortor risus.
              </p>
            </div>
          </div>
        </div>

        <div class="column is-1"></div>
      </div>
    </section>
  </div>
</template>
<script>
import { computed, ref, onMounted } from "vue";
export default {
  setup() {
    const img = ref([
      { imgs: require("../assets/blog/blog-1.jpg") },
      { imgs: require("../assets/blog/blog-2.jpg") },
      { imgs: require("../assets/blog/blog-3.jpg") },
      { imgs: require("../assets/blog/blog-4.jpg") },
      { imgs: require("../assets/blog/blog-5.jpg") },
    ]);
    const image = ref(img.value[0].imgs);
    const resultez = ref("");
    const lensz = ref("");
    const imgz = ref("");
    const resultz = ref("");
    const cxz = ref("");
    const cyz = ref("");
    const imgtopz = ref(null);
    const resulz = ref(null);
    const zoom = ref(2);

    const imgmobaile = ref(null);
    const imgmob = ref("");
    const glass = ref("");
    const h = ref("");
    const w = ref("");
    const bw = ref("");
    const wit = ref(screen.width);
    const witW = computed(() => {
      console.log(wit.value);
      return wit.value;
    });

    const shangimg = (index) => {
      if (image.value !== index) {
        image.value = index;
      } else return;
    };

    onMounted(() => {
      witW.value;
    });
    const imageZoomz = () => {
      if (witW.value >= 676) {
        var myobj = document.querySelectorAll(".img-zoom-lens");
        if (myobj.length > 0) {
          myobj[0].remove();
        }

        imgz.value = imgtopz.value;
        resultz.value = resulz.value;
        /*create lens:*/
        lensz.value = document.createElement("DIV");
        lensz.value.setAttribute("class", "img-zoom-lens");
        /*insert lens:*/
        imgz.value.parentElement.insertBefore(lensz.value, imgz.value);
        /*calculate the ratio between result DIV and lens:*/
        cxz.value = resultz.value.offsetWidth / lensz.value.offsetWidth;
        cyz.value = resultz.value.offsetHeight / lensz.value.offsetHeight;
        /*set background properties for the result DIV:*/
        resultz.value.style.backgroundImage = "url('" + imgz.value.src + "')";
        resultz.value.style.backgroundSize =
          imgz.value.width * cxz.value +
          "px " +
          imgz.value.height * cyz.value +
          "px";

        lensz.value.addEventListener("mousemove", moveLensz, { passive: true });

        lensz.value.addEventListener("touchmove", moveLensz, { passive: true });
      } else return false;
      //
    };
    const moveLensz = (e) => {
      if (witW.value >= 676) {
        var pos, x, y;

        pos = getCursorPosz(e);
        /*calculate the position of the lens:*/
        x = pos.x - lensz.value.offsetWidth / 2;
        y = pos.y - lensz.value.offsetHeight / 2;
        /*prevent the lens from being positioned outside the image:*/
        if (x > imgz.value.width - lensz.value.offsetWidth) {
          x = imgz.value.width - lensz.value.offsetWidth;
        }
        if (x < 0) {
          x = 0;
        }
        if (y > imgz.value.height - lensz.value.offsetHeight) {
          y = imgz.value.height - lensz.value.offsetHeight;
        }
        if (y < 0) {
          y = 0;
        }
        /*set the position of the lens:*/
        lensz.value.style.left = x + "px";
        lensz.value.style.top = y + "px";
        /*display what the lens "sees":*/
        resultz.value.style.opacity = 1;
        resultz.value.style.position = "relative";
        resultz.value.style.backgroundPosition =
          "-" + x * cxz.value + "px -" + y * cyz.value + "px";
      } else return;
    };
    const clearopacityz = () => {
      if (witW.value >= 676) {
        resultz.value.style.opacity = 0;
        resultz.value.style.position = "absolute";
      } else return;
    };
    const getCursorPosz = (e) => {
      var a,
        x = 0,
        y = 0;
      e = e || window.event;
      /*get the x and y positions of the image:*/
      a = imgz.value.getBoundingClientRect();
      /*calculate the cursor's x and y coordinates, relative to the image:*/
      x = e.pageX - a.left;
      y = e.pageY - a.top;
      /*consider any page scrolling:*/
      x = x - window.pageXOffset;
      y = y - window.pageYOffset;
      return { x: x, y: y };
    };

    //-imageZoom--------imageZoom---------imageZoom--//

    const magnify = () => {
      var magnifier = document.querySelectorAll(".img-magnifier-glass");
      if (magnifier.length > 0) {
        magnifier[0].remove();
      }

      imgmob.value = imgmobaile.value;
      /*create magnifier glass:*/
      glass.value = document.createElement("DIV");
      glass.value.setAttribute("class", "img-magnifier-glass");
      /*insert magnifier glass.value:*/
      imgmob.value.parentElement.insertBefore(glass.value, imgmob.value);
      //console.log(glass.value);console.log( imgmob.value);
      /*set background properties for the magnifier glass.value:*/
      glass.value.style.backgroundImage = "url('" + imgmob.value.src + "')";
      glass.value.style.backgroundRepeat = "no-repeat";
      glass.value.style.backgroundSize =
        imgmob.value.width * zoom.value +
        "px " +
        imgmob.value.height * zoom.value +
        "px";
      bw.value = 3;
      w.value = glass.value.offsetWidth / 2;
      h.value = glass.value.offsetHeight / 2;
      /*execute a function when someone moves the magnifier glass.value over the image:*/
      glass.value.addEventListener("mousemove", moveMagnifier, {
        passive: true,
      });

      /*and also for touch screens:*/
      glass.value.addEventListener("touchmove", moveMagnifier, {
        passive: true,
      });
    };
    const moveMagnifier = (e) => {
      var pos, x, y;
      /*prevent any other actions that may occur when moving over the image*/
      //e.preventDefault();
      /*get the cursor's x and y positions:*/
      pos = getCursorPoss(e);
      x = pos.x;
      y = pos.y;
      /*prevent the magnifier glass.value from being positioned outside the image:*/
      if (x > imgmob.value.width - w.value / zoom.value) {
        x = imgmob.value.width - w.value / zoom.value;
      }
      if (x < w.value / zoom.value) {
        x = w.value / zoom.value;
      }
      if (y > imgmob.value.height - h.value / zoom.value) {
        y = imgmob.value.height - h.value / zoom.value;
      }
      if (y < h.value / zoom.value) {
        y = h.value / zoom.value;
      }
      /*set the position of the magnifier glass.value:*/
      glass.value.style.left = x - w.value + "px";
      glass.value.style.top = y - h.value + "px";
      /*display what the magnifier glass.value "sees":*/
      glass.value.style.backgroundPosition =
        "-" +
        (x * zoom.value - w.value + bw.value) +
        "px -" +
        (y * zoom.value - h.value + bw.value) +
        "px";
    };
    const getCursorPoss = (e) => {
      var a,
        x = 0,
        y = 0;
      e = e || window.event;
      /*get the x and y positions of the image:*/
      a = imgmob.value.getBoundingClientRect();
      /*calculate the cursor's x and y coordinates, relative to the image:*/
      x = e.pageX - a.left;
      y = e.pageY - a.top;
      /*consider any page scrolling:*/
      x = x - window.pageXOffset;
      y = y - window.pageYOffset;
      return { x: x, y: y };
    };

    //-imageZoom--------imageZoom---------imageZoom--//

    return {
      resultez,
      lensz,
      imgz,
      resultz,
      cxz,
      cyz,
      imgtopz,
      resulz,
      imageZoomz,
      img,
      moveLensz,
      clearopacityz,
      getCursorPosz,
      image,
      shangimg,
      zoom,
      imgmob,
      glass,
      h,
      w,
      bw,
      magnify,
      moveMagnifier,
      getCursorPoss,
      imgmobaile,
      witW,
      wit,
    };
  },
};
</script>

<style>
.flex-2-item {
  display: flex;
  justify-content: flex-start;
  align-items: center;
}
.item-1-flex {
  flex: 40%;
}
.item-2-flex {
  flex: 60%;
}

.item-12-flex {
  flex: 100%;
}

.product__details__text {
  z-index: 100;
}
.img-zoom-item {
  position: relative;
  overflow: hidden;
}
.img-zoom-item img {
  height: 50px;
  width: 50px;
  display: block;
  border-radius: 50%;
  cursor: pointer;
}

.column {
  position: relative !important ;
}
.img-zoom-container {
  position: relative;
  width: 100%;
  height: auto;
  min-height: 300px;
  display: block;
}
.img-zoom-container img {
  width: 100%;
  height: auto;
}

.img-zoom-lens {
  display: block;
  position: absolute;
  border: 1px solid #d4d4d4;
  /*set the size of the lens:*/
  width: 200px;
  height: 200px;
}
.img-zoom-lens-remove {
  border: 0px;
}

.img-zoom-result {
  position: absolute;
  border: 1px solid #d4d4d4;
  /*set the size of the result div:*/
  width: 100%;
  height: 100%;
  max-block-size: 400px;
  opacity: 0;
  transition: 0.8s ease;
  /*clear: both;*/
  background-repeat: no-repeat;
}

#descreption {
  position: relative;
  z-index: 1000;
}
.img-zoom-container img:hover .img-zoom-result {
  opacity: 1 !important;
}
/*zome mobaile*/

.img-magnifier-container {
  display: none;
  position: relative;
  width: 100%;

  height: 100%;
}
.img-magnifier-container img {
  width: 100%;
  height: 100%;
}

.img-magnifier-glass {
  position: absolute;
  border: 4px solid #e3e3e3;
  border-radius: 5px;
  cursor: none;
  /*Set the size of the magnifier glass:*/
  display: block;
  width: 200px !important;
  height: 200px !important;
}
.row-img img {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  border: 2px solid #cecece;
  cursor: pointer;
}
.row-img {
  margin-inline-start: 3px;
}
.row {
  position: relative;
}

.active {
  padding: 1em;
  border: 1px solid rgb(9, 160, 67);
}

@media screen and (max-width: 769px) {
  .row {
    display: flex;
  }

  .img-zoom-item img {
    height: 25px;
    width: 25px;
    display: inline-block;
    margin-inline-end: 15px;
  }
  .img-magnifier-container {
    display: block;
  }

  .img-zoom-container {
    display: none;
  }
  .flex-2-item {
    flex-direction: column;
    align-items: flex-start;
  }
  .img-magnifier-glass {
    width: 280px !important;
    height: 280px !important;
  }
}

/*-------- */
@media only screen and (min-width: 467px) and (max-width: 769px) {
  .img-magnifier-glass {
    width: 200px !important;
    height: 200px !important;
  }
}
@media only screen and (max-width: 467px) {
  .img-magnifier-glass {
    width: 150px !important;
    height: 150px !important;
  }
}
</style>