مرحبًا بك في البوابة التّعليميّة للاختبارات المعياريّة
اختر البوابة المناسبة للمتابعة: بوابة الطّالب لأداء الاختبارات التّتابعيّة وإصدار شهادات الاجتياز، أو إدارة المعلّم للتحكّم في الصّفوف والنّماذج والطّلّاب.
اختر البوابة المناسبة للمتابعة: بوابة الطّالب لأداء الاختبارات التّتابعيّة وإصدار شهادات الاجتياز، أو إدارة المعلّم للتحكّم في الصّفوف والنّماذج والطّلّاب.
اضغط على صفّك الدّراسيّ لعرض نماذج الاختبارات المخصّصة لك
اختر الصّفّ لاستعراض وتعديل نماذجه الخمسة أو أضف صفوفًا جديدة
انقر على أيّ نموذج بالأسفل لتعديل فقراته أو طباعته مباشرة
مُصنّفة وفق مستويات بلوم وعمق المعرفة (DOK) مع ضبط قاعدة تنوين الفتح السّليمة
أضف أو عدّل المهارات المقرّرة لكلّ صفّ واضغط «+ إدراج» لإضافتها لطلب البناء
حدّد الصّفّ أو اتركه للتّعرّف التّلقائي، وارفع ملفّات PDF أو صورًا متعدّدة لاستخراج الأسئلة منها ودمجها بالتنسيق المعياري.
يدعم رفع عدّة ملفّات PDF وصور معًا لتحليل محتواها واستخراج الأسئلة.
الصق قائمة الأسماء من (نظام نور، أو Excel، أو Word) أو ارفع ملفًّا نصّيًّا، وسيقوم النّظام تلقائيًّا بتنظيف الأرقام والرّموز البادئة وإضافتها للكشف.
حدّد الطّلّاب لتصدير أوراقهم دفعةً واحدة في ملفّ PDF واحد، أو عدّل بياناتهم مباشرة
| م | الاسم الثّلاثيّ | طالب / طالبة | الشّعبة | النّموذج المخصّص | إجراءات |
|---|
حدّد الصّفّ الدّراسيّ، واختر نموذجًا واحدًا أو عدّة نماذج أو جميع النّماذج الخمسة لتصديرها معًا في ملفّ PDF رسميّ واحد خالٍ تمامًا من روابط المتصفّح والتّواريخ، مع شعارات عالية الدّقّة وتباعد مريح للأسطر.
يمكنك اختيار نموذج واحد أو تحديد عدّة نماذج أو تحديد النّماذج الخمسة كاملةً لتصديرها في ملفّ واحد
تُحفظ النّتائج تلقائيًّا وتُزامن مع قاعدة بيانات Firebase عند تفعيلها (الاجتياز من 85% فأعلى)
| اسم الطّالب | الصّفّ الدّراسيّ | النّموذج المنجز | الدّرجة | التّقدير | التّاريخ | الشّهادة |
|---|
اختر بين إظهار الشّعارات الأربعة المستقلّة أو رفع كليشة موحّدة بعرض هامش الصّفحة
ارفع صورة تجمع الشّعارات معًا لتمتدّ أعلى أوراق الاختبار والشّهادات.
يُنصح بتغيير كلمة المرور الافتراضيّة (1234) إلى كلمة مرور خاصّة بك؛ وبمجرّد تحديثها تُقفل الخزنة السّحابيّة ببصمتك المشفّرة لمنع أيّ متطفّل من التّعديل.
يُحفظ المفتاح في إعداداتك لتشغيل استخراج الأسئلة من ملفّات PDF والصّور وإنشاء النّماذج.
مشروعك المدمج: interactive-exam-models • مزامنة لحظيّة بين جميع الأجهزة
• عزل صلاحيّات الطّالب عن المعلّم: أجهزة الطّلّاب ترسل نتيجتها الفرديّة فقط في نفس اللّحظة دون أيّ تضارب لو دخل 100 طالب معًا، ولا يمكن لجهاز طالب تعديل النّماذج أو الكشوف.
• تشفير كلمة المرور سحابيًّا: تُحفظ كلمة مرور المعلّم ببصمة مشفّرة (SHA-256) ولا تظهر أبدًا في البيانات العامّة.
• خزنة سرّيّة معزولة (admin_lock): تُحفظ بصمة كلمة مرور المعلّم في مسار سحابيّ مغلق القراءة تمامًا (allow read: if false) لا يمكن لأيّ متطفّل أو مخترق قراءته حتّى عبر أدوات المطوّرين.
• منع التّعديل أو المسح من خارج لوحة المعلّم: لا تقبل خوادم Google Firebase أيّ تعديل على الأسئلة أو الصّفوف أو الكشوف أو حذف النّتائج إلّا إذا طابق رمز جلسة المعلّم البصمة المشفّرة المحفوظة في الخزنة السّرّيّة.
• حماية سجلّ النّتائج من التّخريب: يُسمح لجهاز الطّالب بإضافة نتيجته الجديدة فقط وفق شروط صارمة (درجة بين 0 و100)، ويُمنع منعًا باتًّا من حذف أو تعديل أيّ نتيجة سابقة.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// 1. خزنة بصمة المعلم السرية (مغلقة القراءة تماما، وتدعم التحديث بالبصمة السابقة أو بمفتاح الاسترداد السري للمعلم)
match /arabic_exam_portal_vault/admin_lock {
allow read: if false;
allow create: if !exists(/databases/$(database)/documents/arabic_exam_portal_vault/admin_lock)
&& request.resource.data.secretHash is string
&& request.resource.data.secretHash.size() >= 12;
allow update: if (request.resource.data.previousSecretHash == resource.data.secretHash
|| ('recoveryHash' in resource.data && request.resource.data.recoveryProofHash == resource.data.recoveryHash))
&& request.resource.data.secretHash is string
&& request.resource.data.secretHash.size() >= 12;
allow delete: if false;
}
// 2. تذاكر التفويض المشفرة لمرة واحدة (One-Time Tickets — مغلقة القراءة ولا تصدر إلا بمطابقة الخزنة)
match /arabic_exam_portal_admins/{ticketId} {
allow read: if false;
allow create, update: if !exists(/databases/$(database)/documents/arabic_exam_portal_vault/admin_lock)
|| request.resource.data.secretHash == get(/databases/$(database)/documents/arabic_exam_portal_vault/admin_lock).data.secretHash;
allow delete: if false;
}
// 3. بيانات المنظومة والنماذج والطلاب (يشترط تذكرة تفويض جديدة لم تستخدم من قبل لمنع نسخ الطلبات Replay Attack)
match /arabic_exam_portal/{docId} {
allow read: if true;
allow create: if !exists(/databases/$(database)/documents/arabic_exam_portal_vault/admin_lock)
|| (request.resource.data.lastTicketId is string
&& exists(/databases/$(database)/documents/arabic_exam_portal_admins/$(request.resource.data.lastTicketId)));
allow update: if !exists(/databases/$(database)/documents/arabic_exam_portal_vault/admin_lock)
|| (request.resource.data.lastTicketId is string
&& (!('lastTicketId' in resource.data) || request.resource.data.lastTicketId != resource.data.lastTicketId)
&& exists(/databases/$(database)/documents/arabic_exam_portal_admins/$(request.resource.data.lastTicketId)));
allow delete: if false;
}
// 4. سجل نتائج الطلاب (إضافة محكومة للطلاب، ومنع تام للحذف أو التعديل إلا بتذكرة معلم موثقة)
match /arabic_exam_portal_results/{resultId} {
allow read: if true;
allow create: if request.resource.data.keys().hasAll(['id', 'studentName', 'gradeId', 'modelId', 'percentage', 'earnedPoints', 'totalPoints'])
&& request.resource.data.studentName is string
&& request.resource.data.studentName.size() >= 2
&& request.resource.data.studentName.size() <= 120
&& request.resource.data.percentage is number
&& request.resource.data.percentage >= 0
&& request.resource.data.percentage <= 100;
allow update, delete: if request.resource.data.lastTicketId is string
&& exists(/databases/$(database)/documents/arabic_exam_portal_admins/$(request.resource.data.lastTicketId));
}
}
}
{
"rules": {
"arabic_exam_portal_vault": {
".read": false,
"secretHash": {
".write": "!data.exists() || newData.parent().child('previousSecretHash').val() === data.val()"
},
"previousSecretHash": {
".write": true
}
},
"arabic_exam_portal_v1": {
".read": true,
"grades": {
".write": "!root.child('arabic_exam_portal_vault/secretHash').exists() || newData.parent().child('adminAuthProof').val() === root.child('arabic_exam_portal_vault/secretHash').val()"
},
"students": {
".write": "!root.child('arabic_exam_portal_vault/secretHash').exists() || newData.parent().child('adminAuthProof').val() === root.child('arabic_exam_portal_vault/secretHash').val()"
},
"publicSettings": {
".write": "!root.child('arabic_exam_portal_vault/secretHash').exists() || newData.parent().child('adminAuthProof').val() === root.child('arabic_exam_portal_vault/secretHash').val()"
},
"adminAuthProof": {
".read": false,
".write": true
},
"updatedAt": { ".write": true },
"results": {
".write": "!root.child('arabic_exam_portal_vault/secretHash').exists() || newData.parent().child('adminAuthProof').val() === root.child('arabic_exam_portal_vault/secretHash').val()"
},
"results_map": {
"$resultId": {
".write": "!data.exists() && newData.hasChildren(['studentName', 'gradeId', 'modelId', 'percentage']) && newData.child('percentage').isNumber() && newData.child('percentage').val() >= 0 && newData.child('percentage').val() <= 100"
}
}
}
}
}