إنتقل إلى المحتوى الرئيسي

بناء تطبيق كامل متعدد الوحدات المدارية

المصدر: tests/schemas/09-full-app.orb

هذا التعليمي يمشي عبر برنامج full-app-test الكامل - تطبيق حقيقي بثلاث وحدات مدارية مترابطة. يجمع كل شيء من التعليمات السابقة: الكيانات (Entities)، آلات الحالة (State Machines)، render-ui، الحراس (Guards)، والأحداث عبر الوحدات المدارية.

OrderLifecycleFulfillment/orders/track
Orbital Unit = Entity + Traits + Pages

نظرة عامة على التطبيق

TaskManager orbital          ProjectManager orbital       UserManager orbital
entity: Task entity: Project entity: User
traits: traits: traits:
TaskLifecycle ProjectStats UserBrowser
TaskCRUD listens: pages:
pages: TASK_COMPLETED /users
/tasks TASK_CREATED
emits:
TASK_COMPLETED
TASK_CREATED

تدفق البيانات:

  1. المستخدم ينشئ أو يكمل مهمة في TaskManager
  2. TaskManager يُرسل TASK_CREATED أو TASK_COMPLETED
  3. ProjectManager يستمع ويحدّث عدادات المشروع

الوحدة المدارية 1: TaskManager

الكيان (Entity)

{
"اسم": "Task",
"استمرارية": "دائم",
"مجموعة": "tasks",
"حقول": [
{
"اسم": "id",
"نوع": "نص",
"مطلوب": true
},
{
"اسم": "title",
"نوع": "نص",
"مطلوب": true
},
{
"اسم": "description",
"نوع": "نص"
},
{
"اسم": "priority",
"نوع": "تعداد",
"قيم": [
"low",
"medium",
"high"
],
"افتراضي": "medium"
},
{
"اسم": "dueDate",
"نوع": "تاريخ"
},
{
"اسم": "assigneeId",
"نوع": "نص"
},
{
"اسم": "projectId",
"نوع": "نص"
}
]
}

السمة 1: TaskLifecycle

تدير حالة سير عمل المهمة. تُرسل TASK_COMPLETED عند الموافقة على المهمة أو إكمالها مباشرة.

الحالات: todo → inProgress → review → done

السمة 2: TaskCRUD

تدير واجهة القائمة. تُرسل TASK_CREATED عند حفظ مهمة جديدة.

الحالات: listing → creating | editing

Emits على مستوى الوحدة المدارية

"emits": ["TASK_COMPLETED", "TASK_CREATED"]

الوحدة المدارية 2: ProjectManager

الكيان (Entity)

يتتبع إحصائيات مجمّعة لكل مشروع، تُحدَّث تفاعلياً عند تغيير المهام:

{
"اسم": "Project",
"استمرارية": "دائم",
"مجموعة": "projects",
"حقول": [
{
"اسم": "id",
"نوع": "نص",
"مطلوب": true
},
{
"اسم": "name",
"نوع": "نص",
"مطلوب": true
},
{
"اسم": "description",
"نوع": "نص"
},
{
"اسم": "taskCount",
"نوع": "رقم",
"افتراضي": 0
},
{
"اسم": "completedCount",
"نوع": "رقم",
"افتراضي": 0
}
]
}

السمة: ProjectStats

تستمع لكل من TASK_COMPLETED وTASK_CREATED وتزيد العدادات:

{
"اسم": "ProjectStats",
"كيان_مرتبط": "Project",
"فئة": "interaction",
"يستمع": [
{
"حدث": "TASK_COMPLETED",
"نطاق": "external"
},
{
"حدث": "TASK_CREATED",
"نطاق": "external"
}
],
"آلة_حالة": {
"حالات": [
{
"اسم": "idle",
"أولي": true
}
],
"أحداث": [
{
"مفتاح": "INIT",
"اسم": "Initialize"
},
{
"مفتاح": "TASK_COMPLETED",
"اسم": "Task Completed"
},
{
"مفتاح": "TASK_CREATED",
"اسم": "Task Created"
}
],
"انتقالات": [
{
"من": "idle",
"حدث": "INIT",
"إلى": "idle",
"تأثيرات": [
[
"جلب",
"Project"
],
[
"عرض_واجهة",
"main",
{
"نوع": "stats",
"عناصر": [
{
"تسمية": "Total Tasks",
"value": "@كيان.taskCount"
},
{
"تسمية": "Completed",
"value": "@كيان.completedCount"
}
]
}
]
]
},
{
"من": "idle",
"حدث": "TASK_CREATED",
"إلى": "idle",
"تأثيرات": [
[
"increment",
"@كيان.taskCount",
1
]
]
},
{
"من": "idle",
"حدث": "TASK_COMPLETED",
"إلى": "idle",
"تأثيرات": [
[
"increment",
"@كيان.completedCount",
1
]
]
}
]
}
}

أحداث TASK_CREATED وTASK_COMPLETED تُستقبل من TaskManager. تحفّز انتقالات حلقة ذاتية تُطلق تأثيرات increment لتحديث إحصائيات المشروع في الوقت الحقيقي.


الوحدة المدارية 3: UserManager

أبسط وحدة مدارية - متصفح قراءة فقط للمستخدمين مع إجراء تنقل إلى التفاصيل.

{
"اسم": "UserBrowser",
"كيان_مرتبط": "User",
"فئة": "interaction",
"آلة_حالة": {
"حالات": [
{
"اسم": "browsing",
"أولي": true
}
],
"أحداث": [
{
"مفتاح": "INIT",
"اسم": "Initialize"
},
{
"مفتاح": "VIEW",
"اسم": "View User",
"حمولة": [
{
"اسم": "id",
"نوع": "نص",
"مطلوب": true
}
]
}
],
"انتقالات": [
{
"من": "browsing",
"حدث": "INIT",
"إلى": "browsing",
"تأثيرات": [
[
"جلب",
"User"
],
[
"عرض_واجهة",
"main",
{
"نوع": "entity-table",
"كيان": "User",
"columns": [
"name",
"email",
"role"
],
"itemActions": [
{
"حدث": "VIEW",
"تسمية": "View"
}
]
}
]
]
},
{
"من": "browsing",
"حدث": "VIEW",
"إلى": "browsing",
"تأثيرات": [
[
"انتقال",
"/users/@payload.id"
]
]
}
]
}
}

ملخص مسارات التطبيق

المسارالوحدة المداريةالسمةالوصف
/tasksTaskManagerTaskCRUDتصفح، إنشاء، تعديل، حذف المهام
/tasks/:idTaskManagerTaskCRUDالتنقل إلى تفاصيل المهمة (عبر تأثير navigate)
/projectsProjectManagerProjectStatsعرض إحصائيات المشروع المُحدَّثة بأحداث المهام
/usersUserManagerUserBrowserتصفح المستخدمين، نقر لعرض التفاصيل

الأنماط في هذا التطبيق

المفهومأين يظهر
سمات متعددة لكل وحدة مداريةTaskManager لديها TaskLifecycle + TaskCRUD
حالات نهائيةdone في TaskLifecycle (isTerminal: true)
إرسال عبر الوحدات المداريةTaskLifecycle تُرسل TASK_COMPLETED، TaskCRUD تُرسل TASK_CREATED
استماع عبر الوحدات المداريةProjectStats تستمع لكلا الحدثين وتزيد العدادات
انتقالات حلقة ذاتيةجميع انتقالات INIT؛ معالجات أحداث ProjectStats
الحمولة في الأحداثVIEW تحمل id؛ TASK_COMPLETED تحمل taskId + projectId
تأثير navigateانتقال VIEW في TaskCRUD ينتقل إلى /tasks/@payload.id
تأثير incrementProjectStats تستخدم ["increment", "@entity.taskCount", 1]

الخطوات التالية