بناء تطبيق كامل متعدد الوحدات المدارية
المصدر:
tests/schemas/09-full-app.orb
هذا التعليمي يمشي عبر برنامج full-app-test الكامل - تطبيق حقيقي بثلاث وحدات مدارية مترابطة. يجمع كل شيء من التعليمات السابقة: الكيانات (Entities)، آلات الحالة (State Machines)، render-ui، الحراس (Guards)، والأحداث عبر الوحدات المدارية.
نظرة عامة على التطبيق
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
تدفق البيانات:
- المستخدم ينشئ أو يكمل مهمة في
TaskManager TaskManagerيُرسلTASK_CREATEDأوTASK_COMPLETEDProjectManagerيستمع ويحدّث عدادات المشروع
الوحدة المدارية 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"
]
]
}
]
}
}
ملخص مسارات التطبيق
| المسار | الوحدة المدارية | السمة | الوصف |
|---|---|---|---|
/tasks | TaskManager | TaskCRUD | تصفح، إنشاء، تعديل، حذف المهام |
/tasks/:id | TaskManager | TaskCRUD | التنقل إلى تفاصيل المهمة (عبر تأثير navigate) |
/projects | ProjectManager | ProjectStats | عرض إحصائيات المشروع المُحدَّثة بأحداث المهام |
/users | UserManager | UserBrowser | تصفح المستخدمين، نقر لعرض التفاصيل |
الأنماط في هذا التطبيق
| المفهوم | أين يظهر |
|---|---|
| سمات متعددة لكل وحدة مدارية | 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 |
| تأثير increment | ProjectStats تستخدم ["increment", "@entity.taskCount", 1] |
الخطوات التالية
- توليد البرامج بالذكاء الاصطناعي - جعل الذكاء الاصطناعي يولّد برامج مثل هذا
- الحراس وقواعد العمل - إضافة حراس صلاحيات لسير عمل المهام
- أنماط الواجهة وrender-ui - تحسين الواجهة بمزيد من أنواع الأنماط