- مقدمة
- العرض
- MVP
- خارطة الطريق
- متطلبات المنتج
- ابدأ الآن
- البيئة المحلية
- البنية المعمارية
- الهيكل
- الأنماط
- الحزمة التقنية
- قاعدة البيانات
- تعدّد المستأجرين
- الفهرس (Catalog)
- العمل دون اتصال
- المصادقة
- التهيئة (Onboarding)
- تدفق التكامل (Integration Flow)
- التهيئة (Provision)
- القبول
- الحضور
- الامتثال التنظيمي
- الملف الشخصي
- الاجتماعات
- إدارة الرسوم
- الفاتورة
- التدويل
- الترجمة
- دليل الترجمة
- أمان قاعدة البيانات
- المساهمة
- هَوْغوارتس
- عرض حي
- الإلهام
يحصل كل مستخدم في المدرسة (طالب، معلّم، ولي أمر، موظف) على ملف شخصي بأسلوب GitHub: شريط جانبي على اليسار (الصورة، الاسم، إحصاءات حقيقية، الشارات المكتسبة، المنظمات) ومحتوى على اليمين (تبويبات الدور، رسم بياني حقيقي للنشاط، العناصر المثبتة، سجل النشاط). يتعامل مسار شامل اختياري واحد مع الملف الذاتي وعرض ملف مستخدم آخر معاً.
كل ما يُعرض في الصفحة حقيقي ومحصور بالمدرسة. أُعيد بناء الوحدة (2026-06-15) لإزالة البيانات المُصطنعة في النسخة الأولية — إحصاءات ثابتة، نشاط عشوائي (
Math.random())، شارات وهمية مثل «طالب العام»، ومنظمات وهمية مثل «نادي الشطرنج». عند غياب مصدر حقيقي، تُعرض حالة فارغة صادقة.
المسارات
| المسار | الصفحة | السلوك |
|---|---|---|
/profile | profile/[[...id]]/page.tsx | الملف الذاتي (isOwner=true) |
/profile/<id> | profile/[[...id]]/page.tsx | عرض حسب المعرّف (مستخدم أو كيان معالج) |
المسار: src/app/[lang]/s/[subdomain]/(school-dashboard)/profile/[[...id]]/.
يحتوي على loading.tsx (هيكل مطابق للتخطيط) وerror.tsx (حد خطأ يراعي اللغة).
قد يكون id معرّف User، أو معرّف Student/Teacher أنشأه المعالج بلا صف
User (يُعالَج عبر مسار احتياطي).
البنية
تستدعي الصفحة قراءة واحدة مُنمّطة وتمرّر النتيجة إلى مكوّنات عرض خالصة — لا يجلب أي مكوّن عميل البيانات ولا يصطنعها.
page.tsx ──> getProfileView(targetId, lang) // queries.ts (مُنمّطة، مُخفية حسب الصلاحية)
└─> ProfileDetailContent ──> ProfileContent (client.tsx)
├─ الشريط الجانبي (الصورة، الإحصاءات، الشارات، المنظمات، تحرير)
├─ العناصر المثبتة (حقيقية؛ إعادة ترتيب/حذف للمالك، محفوظة)
├─ رسم النشاط (SWR → getContributionData؛ شبكة فارغة عند الغياب)
├─ سجل النشاط (UserActivity حقيقي مُجمّع شهرياً)
└─ لوحات الدور (مواد/فصول/أبناء/منظمات حقيقية)
queries.ts ليست "use server" عمداً ليتمكن المستدعون من تغليفها بـcache().
عمليات التعديل القابلة للاستدعاء من العميل في actions.ts ("use server").
نموذج البيانات
| النموذج | الجدول | الغرض |
|---|---|---|
UserActivity | user_activities | سجل النشاط ورسم النشاط |
PinnedItem | pinned_items | حتى 6 عناصر مثبتة لكل مستخدم |
ProfileBadge | profile_badges | الشارات المكتسبة (يمنحها المحرّك) |
Organization | organizations | أندية/لجان/فرق المدرسة |
OrganizationMembership | organization_memberships | عضوية المستخدم في منظمة مع الدور |
Achievement (قائم) | achievements | إنجازات الطالب → شارات |
ملاحظة النشر: طُبِّق ترحيل السجل
prisma/migrations/20260615000000_add_profile_badges_organizations/على الإنتاج بتاريخ 2026-06-15. لتعبئة أقسام الملف الشخصي في المدرسة التجريبية شغّلpnpm db:seed:single profile-extrasثمpnpm db:seed:single profile-activity.
بيانات العرض التجريبي (سيد profile-activity)
كل قسم في الصفحة يُعرض من صفوف حقيقية، لذلك يحتاج العرض التجريبي إلى صفوف
حقيقية. السيد profile-activity (ضمن seedMain، قابل لإعادة التشغيل بأمان)
ينشئ للمدرسة التجريبية: حضور العام الحالي لشعبة الطالب التجريبي مرصودًا من
المعلم التجريبي (يُضيء مخططي النشاط ويمنح شارات الحضور)، وخلاصة نشاط عربية
لحسابات العرض وطلاب الشعبة والمعلمين وأولياء الأمور، وعناصر مثبّتة مناسبة
لكل دور مشتقة من مواد/فصول/أبناء/منظمات حقيقية، ومحادثة بين ولي أمر ومعلم
تُضيء مخطط ولي الأمر، واعتمادات مصروفات موزّعة على مدير/موظف/محاسب، وإنجازات
للطالب التجريبي بفئات متنوعة، وحقول الملف الشخصي (الحالة، الموقع، الروابط
الاجتماعية). صور الشارات تُقدَّم من CDN على المسار hogwarts/<icon>.png
(المصادر في /public/github؛ لإعادة الرفع:
npx tsx prisma/scripts/upload-badge-art.ts).
محرّك اكتساب الشارات
تشتق badges.ts → recomputeProfileBadges الشارات من إشارات حقيقية
(الحضور، النتائج، ترتيب الجدارة، حجم النشاط، عضوية المنظمات، وسجلات إنجاز
الطالب) وتوفّق صفوف الشارات تلقائياً بشكل idempotent. الشارات الممنوحة يدوياً لا
تُمَس.
الصلاحيات (آمنة عبر المدارس)
تُرجع getPermissionLevel أحد المستويات
OWNER | ADMIN | STAFF | RELATED | PUBLIC:
- DEVELOPER هو الدور الوحيد ذو الوصول عبر المدارس.
- ADMIN / TEACHER / STAFF / ACCOUNTANT تُرفع صلاحياتهم فقط عند
viewerSchoolId === profileSchoolId، وإلا فـPUBLIC. - الطلاب/أولياء الأمور في نفس المدرسة يحصلون على
RELATED.
بيانات حقيقية بلا اصطناع
كل العناصر مدعومة بقاعدة البيانات: الإحصاءات (أعداد المواد/الفصول/الطلاب/الأبناء)، سجل النشاط الحقيقي، الشارات المكتسبة، المنظمات، والعناصر المثبتة (مع حالة فارغة عند عدم وجودها).
انظر أيضاً
- الاختبارات:
src/tests/school-dashboard/profile/ - سجلات الوحدة:
src/components/school-dashboard/profile/{README,ISSUE,CLAUDE}.md