Table of Contents
- المقدمة: الواجهة الخلفية أصبحت الآن محادثة
- ما هي "مهارة Directus" هذه على أي حال؟
- المتطلبات الأساسية: ما تحتاجه قبل أن تبدأ
- تثبيت المهارة في وكيل هيرميس
- تشريح مواصفات الواجهة الخلفية ذات المطالبة الواحدة
- المثال 1: الواجهة الخلفية للمدونة (جاهزة ومتعددة اللغات)
- المثال 2: الواجهة الخلفية للتجارة الإلكترونية في موجه واحد
- مثال 3: إدارة علاقات العملاء (CRM) البسيطة (جهات الاتصال + الشركات + التفاعلات)
- كيف تعمل في الواقع: صلصة المهارة السرية
- أنماط الإنتاج المثبتة التي اكتشفناها
- معالجة الأخطاء: الأخطاء التي تحدث وكيفية إصلاحها
- الأنماط المتقدمة: عوامل التصفية والعلاقات وحقول التعداد
- واجهة برمجة تطبيقات المشرف: عندما تحتاج إلى لمس المخطط برمجيًا
- تجميع كل ذلك معًا: جلستك الأولى لبرمجة Vibe-Code
- ما يتيحه هذا: النماذج الأولية السريعة على نطاق واسع
- القيود والمشاكل
- الاستنتاج: الواجهة الخلفية أصبحت الآن محادثة
- الخطوات التالية
المقدمة: الواجهة الخلفية أصبحت الآن محادثة
!Vibe-coding workflow diagram: natural language prompt to Directus schema to production API
إليك نمطًا محبطًا يعرفه معظم المطورين جيدًا:
- لديك فكرة تطبيق رائعة
- البدء في بناء قاعدة البيانات - "المستخدمون"، و"المشاركات"، و"الطلبات"
- يمكنك إنشاء طبقة واجهة برمجة التطبيقات (API) - نقاط نهاية REST، ومحللات GraphQL
- تقوم بتوصيل المصادقة والأذونات والتحقق من الصحة
- بعد مرور ثلاثة أيام، وصلت أخيرًا إلى الميزة الفعلية التي أردت إنشاءها
هذا الاحتكاك حقيقي. وفي عام 2026، مات.
ماذا لو كان بإمكانك تخطي الخطوات من 2 إلى 4 بالكامل؟ ماذا لو كان بإمكانك وصف الواجهة الخلفية بأكملها باللغة الإنجليزية البسيطة، والضغط على زر الإدخال، والحصول على مخطط جاهز للإنتاج، وواجهة برمجة التطبيقات، ولوحة الإدارة جاهزة للاستخدام؟
هذا ما يعنيه الترميز الديناميكي للواجهة الخلفية. ومع Directus - نظام إدارة المحتوى بدون رأس مفتوح المصدر الذي يحول قاعدة بياناتك إلى واجهة برمجة تطبيقات فورية - مقترنًا بمهارة nikola66 Directus (عميل GraphQL عالمي لعملاء الذكاء الاصطناعي)، أصبح من الممكن الآن دعم طبقة بيانات كاملة في طلقة واحدة.
هذه ليست لعبة تجريبية. هذا هو سير العمل الحقيقي الذي نستخدمه في Ainex لتدوير الواجهات الخلفية للمشروع في دقائق، وليس أيام. في هذا الدليل، ستتعلم:
- ما الذي تفعله مهارة Directus فعليًا تحت الغطاء
- كيفية تثبيته والاتصال بمثيل Directus الخاص بك
- تشريح مواصفات الواجهة الخلفية ذات المطالبة الواحدة
- أمثلة خطوة بخطوة: إنشاء مدونة، ومتجر للتجارة الإلكترونية، وإدارة علاقات العملاء
- أنماط الإنتاج، ومعالجة الأخطاء، والأخطاء التي واجهناها بالفعل
- كيفية التحقق من أن الواجهة الخلفية المدعومة حديثًا لديك حية وقابلة للاستعلام عنها
دعونا ندخل في ذلك.
ما هي "مهارة Directus" هذه على أي حال؟
المهارة الموجودة في nikola66/directus-skill هي عميل Python الذي يتحدث مباشرة عن واجهات برمجة تطبيقات GraphQL وREST الخاصة بـ Directus. لقد تم تصميمه لعملاء الذكاء الاصطناعي مثل Hermes، ولكن يمكنك أيضًا استخدامه كمكتبة مستقلة.
الخصائص الرئيسية التي تجعل الترميز الديناميكي ممكنًا:
- محايد للمجموعة: لا يهم إذا كنت تعمل مع "Blog_Posts" أو "Ecom_Products". نفس الأساليب تعمل على أي مجموعة.
- سطح CRUD كامل:
getوinsertوupdateوdeleteوcountوحتىcreate_collectionوcreate_fieldلعمليات المخطط (للمسؤول فقط). - توسيع العلاقات الذكية: استخدم التدوين النقطي مثل
author.nameأوorder_items.product.titleوستقوم المهارة بإنشاء مجموعات تحديد GraphQL المتداخلة الصحيحة. - عوامل التصفية: جميع عوامل تصفية Directus مدعومة -
_eq،_contains،_in،_gt،_null، إلخ. - معالجة الأخطاء: يعرض خطأ DirectusError بتفاصيل منظمة حتى تعرف بالضبط سبب فشل شيء ما.
عندما تقوم بتحميل هذه المهارة إلى وكيل الذكاء الاصطناعي، فإنك تمنح هذا الوكيل القدرة على تمهيد مخطط قاعدة البيانات بالكامل من خلال المحادثة.
المتطلبات الأساسية: ما تحتاجه قبل أن تبدأ
قبل أن تتمكن من برمجة الواجهة الخلفية، تحتاج إلى ثلاثة أشياء:
- مثيل Directus - إما مستضاف ذاتيًا أو Directus Cloud. نحن نعمل على
https://hub.aratech.ae. - رمز واجهة برمجة التطبيقات مع الأذونات المناسبة. لإنشاء المخطط، ستحتاج إلى رمز مميز للمسؤول. احصل عليه من Directus → الإعدادات → رموز API → إنشاء (نطاق المسؤول، جميع الأذونات).
- Python 3.9+ مع تثبيت المهارة:
# الخيار أ: التثبيت من PyPI (عند النشر)
نقطة تثبيت Directus-Skill
## الخيار ب: الاستنساخ والاستخدام المباشر (الحالي)
استنساخ بوابة https://github.com/nikola66/directus-skill.git
## انسخ الحزمة إلى مشروعك أو أضفها إلى sys.pathاعتبارًا من أبريل 2026، سيتم الحفاظ على المهارة بشكل نشط والتحقق من صحة الإنتاج مقابل مثيل Directus 10+ مع CRUD الكامل ومشغلي التصفية وإدارة المجموعة التي تعمل بشكل موثوق.
تثبيت المهارة في وكيل هيرميس
إذا كنت تقوم بتشغيل Hermes Agent (نظامنا الأساسي للتنسيق متعدد الوكلاء)، فإن إضافة المهارة هو أمر واحد:
مهارات هيرميس تثبيت Directusأو لإضافة إصدار GitHub المنبع مباشرةً:
تضيف مهارات npx nikola66/directus-skillبمجرد التثبيت، يتم تحميل مهارة Directus تلقائيًا عندما تسأل عن عمليات Directus. لا تحتاج إلى استيراد أي شيء يدويًا، حيث يتولى الوكيل ذلك.
قم بتعيين متغيرات البيئة الخاصة بك (نحتفظ بها في ~/.bashrc أو جلسة البوابة):
تصدير DIRECTUS_URL="https://hub.aratech.ae"
تصدير DIRECTUS_API_TOKEN="user_token_here" # عمليات CRUD
export DIRECTUS_ADMIN_TOKEN="admin_token_here" # إدارة المخططملاحظة: في بوابة Hermes، يتم إدخال هذه العناصر تلقائيًا من تكوين البوابة. إذا كنت تقوم بتشغيل برامج نصية مستقلة، فقم بتعيينها بنفسك.
تشريح مواصفات الواجهة الخلفية ذات المطالبة الواحدة
يحدث السحر عندما تصف نموذج البيانات بالكامل في موجه واحد باللغة الطبيعية. وهنا النمط:
أنشئ لي واجهة خلفية [TYPE] باستخدام Directus. قم بإنشاء هذه المجموعات:
1. [اسم المجموعة] - [الغرض]
- field_name (النوع)، field2 (النوع)، ...
- العلاقات: [تفاصيل العلاقة]
2. [اسم المجموعة] - ...
...
بعد إنشاء كافة المجموعات:
- تحقق عن طريق استدعاء get_collections() وطباعة القائمة
- سجلات عينة البذور [N] لكل مجموعة
- إخراج البرنامج النصي بايثون الكامليفسر الوكيل ذلك، ويترجمه إلى استدعاءات Directus admin API (POST /collections مع تعريفات الحقول الكاملة)، وينفذه، ويعيد مخطط العمل.
المهارة تقوم برفع الأحمال الثقيلة:
- يبني بنية الحمولة الصحيحة لمتطلبات "المخطط" و"الفوقية" الخاصة بـ Directus
- يستدعي
create_collection()لكل مجموعة مع قائمة الحقول الكاملة - اختياريا بذور بيانات العينة عبر عمليات CRUD
- التحقق من النجاح باستخدام
get_collections()
كل ذلك في تنفيذ واحد، دون تدخل يدوي.
المثال 1: الواجهة الخلفية للمدونة (جاهزة ومتعددة اللغات)
لنبدأ بمدونة كلاسيكية - مدونة تدعم 5 لغات. إليك المطالبة الكاملة التي ستقدمها للوكيل:
أنشئ لي واجهة خلفية لمدونة متعددة اللغات باستخدام Directus. قم بإنشاء هذه المجموعات:
1. Blog_Authors - الملفات الشخصية للمؤلفين
- الاسم (سلسلة)، سبيكة (سلسلة، فريدة)، السيرة الذاتية (نص)، الصورة الرمزية (ملف)، Social_twitter (سلسلة، لاغية)
- الحالة: مسودة/منشورة
- الحقول: المعرف، create_at، Update_at
2. Blog_Categories – التصنيف الهرمي
- الاسم (سلسلة)، سبيكة (سلسلة، فريدة)، وصف (نص)، فئة الأصل (متعدد إلى واحد → Blog_Categories، لاغية)
- رمز (سلسلة، اسم الرمز)، اللون (سلسلة، عرافة)
- الحقول: المعرف،sort_order
3. Blog_Tags – العلامات المسطحة
- الاسم (سلسلة)، سبيكة (سلسلة، فريدة)، اللون (سلسلة، عرافة)
- الحقول: معرف
4. Blog_Posts - السجلات الأصلية (بيانات التعريف فقط، وفقًا لتصميم مخططنا)
- الحالة (مسودة/منشورة)، Published_at (التاريخ والوقت، لاغية)
- المؤلف (متعدد إلى واحد → Blog_Authors)، الفئة (متعدد إلى واحد → Blog_Categories)
- المميز_الصورة (ملف)، وقت_القراءة_الدقائق (عدد صحيح)
- is_featured (منطقي)، is_pillar (منطقي)
- الحقول: المعرف، create_at، Update_at
5. Blog_Posts_Translations - المحتوى لكل لغة (سجلات فرعية)
- blog_posts_id (عدد صحيح FK → Blog_Posts)، languages_code (سلسلة: en/ar/de/es/fr)
- العنوان (سلسلة)، سبيكة (سلسلة)، المحتوى (نص تخفيض السعر)
- مقتطف (نص، بحد أقصى 200 حرف)، key_takeaways (صفيف json، 3-5 عناصر)
- عنوان meta_title (سلسلة، ≥60)، وصف meta_description (سلسلة، ≥160)
- feature_image_alt (سلسلة)
- cta_headline (سلسلة)، cta_button_text (سلسلة)، cta_button_url (سلسلة)
- علامة المخطط (json - مقالة schema.org)
- الحقول: معرف
6. Blog_Posts_Tags - نقطة الوصل بين علامة ↔ لمنشور متعدد إلى متعدد
- blog_posts_id (FK → Blog_Posts)، blog_tags_id (FK → Blog_Tags)
- الحقول: معرف
هام:
- استخدم create_collection() لجميع المجموعات الست
- يجب أن يتضمن كل حقل المخطط: {} والوصف التعريفي: {} في الحمولة
- تحديد جميع الحقول مقدمًا (لا توجد إضافة إلى الحقول الإضافية)
- بعد إنشاء المجموعات، قم بنشر نموذجين أساسيين من مشاركات المدونة كحد أدنى:
* المنشور 1: "مقدمة لأمن الذكاء الاصطناعي" - المؤلف = 1، الفئة = 33 (الذكاء الاصطناعي والماجستير في إدارة الأعمال)، تم نشره
* المشاركة 2: "فهم الامتثال لـ SOC 2" - المؤلف = 1، الفئة = 37 (الامتثال)، المسودة
* لكل مشاركة، قم بإنشاء ترجمة باللغة الإنجليزية فقط (تخطي AR/DE/ES/FR في الوقت الحالي)
- التحقق من الطباعة: قم بإدراج جميع المجموعات وعدد سجلاتهاماذا يفعل هذا
عندما تقوم بتشغيل هذه المطالبة من خلال وكيل تم تحميل مهارة Directus فيه:
- إنشاء 6 مجموعات مع تعريفات الحقول الكاملة بالترتيب الصحيح (الأصول أولًا، ثم الوصلات، ثم الترجمات)
- إضافة علاقات مناسبة - متعدد إلى واحد من المشاركات → المؤلفين/الفئة، متعدد إلى متعدد عبر جدول الوصلات
- يحترم تصميم مخططك الفعلي - سجلات الترجمة عبارة عن مجموعة فرعية منفصلة مرتبطة بواسطة
blog_posts_id - البيانات الحقيقية للبذور - نموذجان للمشاركات مع ملء الحقول المطلوبة
- التحقق - يطبع ما تم إنشاؤه
الكود الذي تم إنشاؤه (ما يجري تحت الغطاء)
يُنتج الوكيل شيئًا مثل برنامج Python النصي هذا:
من directus.client قم باستيراد DirectusClient
استيراد نظام التشغيل
العميل = DirectusClient(
url=os.getenv('DIRECTUS_URL'),
token=os.getenv('DIRECTUS_ADMIN_TOKEN') # رمز المشرف لعمليات المخطط
)
## 1. مؤلفو المدونة
client.create_collection('Blog_Authors'، الحقول=[
{'field': 'id'، 'type': 'integer'، 'schema': {'is_primary_key': True، 'has_auto_increment': True}، 'meta': {'hidden': True، 'interface': 'numeric'، 'readonly': True}}،
{'الحقل': 'الاسم'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'slug'، 'type': 'string'، 'schema': {'is_unique': True}، 'meta': {'interface': 'input'}}،
{'الحقل': 'bio'، 'type': 'text'، 'schema': {}، 'meta': {'interface': 'textarea'}}،
{'حقل': 'صورة رمزية'، 'نوع': 'ملف'، 'مخطط': {}، 'ميتا': {'واجهة': 'ملف'، 'خيارات': {'ملفات_مقبولة': 'صورة/*'}}}،
{'الحقل': 'social_twitter'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'الحالة'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'تحديد'، 'الخيارات': {'الاختيارات': ['مسودة'، 'منشور']}}}،
{'الحقل': 'created_at'، 'type': 'timestamp'، 'schema': {}، 'meta': {'interface': 'datetime'، 'readonly': True}}،
{'الحقل': 'updated_at'، 'النوع': 'الطابع الزمني'، 'المخطط': {}، 'التعريف': {'الواجهة': 'التاريخ والوقت'، 'للقراءة فقط': صحيح}}
])
## 2. فئات المدونة
client.create_collection('Blog_Categories'، الحقول=[
{'field': 'id'، 'type': 'integer'، 'schema': {'is_primary_key': True، 'has_auto_increment': True}، 'meta': {'hidden': True، 'interface': 'numeric'، 'readonly': True}}،
{'الحقل': 'الاسم'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'slug'، 'type': 'string'، 'schema': {'is_unique': True}، 'meta': {'interface': 'input'}}،
{'حقل': 'وصف'، 'نوع': 'نص'، 'مخطط': {}، 'ميتا': {'واجهة': 'منطقة النص'}}،
{'الحقل': 'فئة_الأم'، 'النوع': 'عدد صحيح'، 'المخطط': {}، 'التعريف': {'الواجهة': 'العلاقة'، 'الخيارات': {'مجموعة_ذات صلة': 'فئات_المدونة'}}}،
{'حقل': 'رمز'، 'نوع': 'سلسلة'، 'مخطط': {}، 'ميتا': {'واجهة': 'إدخال'}}،
{'حقل': 'لون'، 'نوع': 'سلسلة'، 'مخطط': {}، 'ميتا': {'واجهة': 'لون'}}،
{'الحقل': 'ترتيب_الترتيب'، 'النوع': 'عدد صحيح'، 'المخطط': {}، 'التعريف': {'الواجهة': 'رقمية'}}،
{'الحقل': 'created_at'، 'type': 'timestamp'، 'schema': {}، 'meta': {'interface': 'datetime'، 'readonly': True}}،
{'الحقل': 'updated_at'، 'النوع': 'الطابع الزمني'، 'المخطط': {}، 'التعريف': {'الواجهة': 'التاريخ والوقت'، 'للقراءة فقط': صحيح}}
])
## 3. علامات المدونة
client.create_collection('Blog_Tags'، الحقول=[
{'field': 'id'، 'type': 'integer'، 'schema': {'is_primary_key': True، 'has_auto_increment': True}، 'meta': {'hidden': True، 'interface': 'numeric'، 'readonly': True}}،
{'الحقل': 'الاسم'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'slug'، 'type': 'string'، 'schema': {'is_unique': True}، 'meta': {'interface': 'input'}}،
{'حقل': 'لون'، 'نوع': 'سلسلة'، 'مخطط': {}، 'ميتا': {'واجهة': 'لون'}}،
{'الحقل': 'created_at'، 'type': 'timestamp'، 'schema': {}، 'meta': {'interface': 'datetime'، 'readonly': True}}
])
## 4. Blog_Posts - سجل البيانات الوصفية الأصلية
client.create_collection('Blog_Posts', الحقول=[
{'field': 'id'، 'type': 'integer'، 'schema': {'is_primary_key': True، 'has_auto_increment': True}، 'meta': {'hidden': True، 'interface': 'numeric'، 'readonly': True}}،
{'الحقل': 'الحالة'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'تحديد'، 'الخيارات': {'الاختيارات': ['مسودة'، 'منشور']}}}،
{'الحقل': 'منشور_في'، 'النوع': 'الطابع الزمني'، 'المخطط': {}، 'التعريف': {'الواجهة': 'التاريخ والوقت'، 'للقراءة فقط': خطأ}}،
{'حقل': 'مؤلف'، 'نوع': 'عدد صحيح'، 'مخطط': {}، 'ميتا': {'واجهة': 'علاقة'، 'خيارات': {'مجموعة_ذات صلة': 'مؤلفو_المدونة'}}}،
{'حقل': 'فئة'، 'نوع': 'عدد صحيح'، 'مخطط': {}، 'ميتا': {'واجهة': 'علاقة'، 'خيارات': {'مجموعة_ذات صلة': 'فئات_المدونة'}}}،
{'الحقل': 'featured_image'، 'type': 'ملف'، 'المخطط': {}، 'meta': {'interface': 'file'، 'options': {'accepted_files': 'image/*'}}}،
{'الحقل': 'قراءة_وقت_الدقائق'، 'النوع': 'عدد صحيح'، 'المخطط': {}، 'التعريف': {'الواجهة': 'رقمية'}}،
{'الحقل': 'is_featured'، 'النوع': 'منطقي'، 'المخطط': {}، 'التعريف': {'الواجهة': 'منطقي'}}،
{'الحقل': 'is_pillar'، 'النوع': 'منطقي'، 'المخطط': {}، 'التعريف': {'الواجهة': 'منطقي'}}،
{'الحقل': 'created_at'، 'type': 'timestamp'، 'schema': {}، 'meta': {'interface': 'datetime'، 'readonly': True}}،
{'الحقل': 'updated_at'، 'النوع': 'الطابع الزمني'، 'المخطط': {}، 'التعريف': {'الواجهة': 'التاريخ والوقت'، 'للقراءة فقط': صحيح}}
])
## 5. ترجمات منشورات المدونة - المحتوى لكل لغة
client.create_collection('Blog_Posts_Translations'، الحقول=[
{'field': 'id'، 'type': 'integer'، 'schema': {'is_primary_key': True، 'has_auto_increment': True}، 'meta': {'hidden': True، 'interface': 'numeric'، 'readonly': True}}،
{'الحقل': 'blog_posts_id'، 'type': 'عدد صحيح'، 'المخطط': {}، 'meta': {'interface': 'relation'، 'options': {'available_collection': 'Blog_Posts'}}}،
{'field': 'languages_code', 'type': 'string', 'schema': {}, 'meta': {'interface': 'select', 'options': {'choices': ['en', 'ar', 'de', 'es', 'fr']}}},
{'الحقل': 'العنوان'، 'النوع': 'سلسلة'، 'المخطط': {'is_required': True}، 'meta': {'interface': 'input'}}،
{'الحقل': 'slug'، 'type': 'string'، 'schema': {'is_required': True، 'is_unique': True}، 'meta': {'interface': 'input'}}،
{'حقل': 'محتوى'، 'نوع': 'نص'، 'مخطط': {}، 'ميتا': {'واجهة': 'تخفيض السعر'}}،
{'حقل': 'مقتطف'، 'نوع': 'نص'، 'مخطط': {}، 'ميتا': {'واجهة': 'منطقة النص'}}،
{'الحقل': 'key_takeaways'، 'النوع': 'json'، 'المخطط': {}، 'التعريف': {'الواجهة': 'قائمة'}}،
{'الحقل': 'meta_title'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'وصف_وصفي'، 'النوع': 'نص'، 'المخطط': {}، 'ميتا': {'الواجهة': 'منطقة النص'}}،
{'الحقل': 'featured_image_alt'، 'النوع': 'نص'، 'المخطط': {}، 'ميتا': {'الواجهة': 'منطقة النص'}}،
{'الحقل': 'cta_headline'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'cta_button_text'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'cta_button_url'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'الحقل': 'schema_markup'، 'type': 'json'، 'schema': {}، 'meta': {'interface': 'json'}}،
{'الحقل': 'created_at'، 'type': 'timestamp'، 'schema': {}، 'meta': {'interface': 'datetime'، 'readonly': True}}،
{'الحقل': 'updated_at'، 'النوع': 'الطابع الزمني'، 'المخطط': {}، 'التعريف': {'الواجهة': 'التاريخ والوقت'، 'للقراءة فقط': صحيح}}
])
## 6. علامات_منشورات المدونة - جدول الوصلات
client.create_collection('Blog_Posts_Tags'، الحقول=[
{'field': 'id'، 'type': 'integer'، 'schema': {'is_primary_key': True، 'has_auto_increment': True}، 'meta': {'hidden': True، 'interface': 'numeric'، 'readonly': True}}،
{'الحقل': 'blog_posts_id'، 'type': 'عدد صحيح'، 'المخطط': {}، 'meta': {'interface': 'relation'، 'options': {'available_collection': 'Blog_Posts'}}}،
{'الحقل': 'blog_tags_id'، 'type': 'عدد صحيح'، 'المخطط': {}، 'meta': {'interface': 'relation'، 'options': {'available_collection': 'Blog_Tags'}}}،
{'الحقل': 'created_at'، 'type': 'timestamp'، 'schema': {}، 'meta': {'interface': 'datetime'، 'readonly': True}}
])
## بيانات عينة البذور
## 1. إنشاء مؤلف (إن لم يكن موجودا)
Author = client.insert({'name': 'Alex Chen', 'slug': 'alex-chen', 'bio': 'مهندس أمان في Ainex.', 'status': 'منشور'}, المجموعة='Blog_Authors')
Author_id = المؤلف['id']
## 2. إنشاء فئة
الفئة = client.insert({'name': 'AI & LLMs', 'slug': 'ai-llms', 'description': 'مقالات حول أمان الذكاء الاصطناعي وLLMS.', 'sort_order': 1}, المجموعة='Blog_Categories')
فئة_معرف = فئة ['معرف']
## 3. إنشاء سجل منشور للمدونة الأصلية
آخر = العميل.إدراج ({
"الحالة": "منشور"،
"المؤلف": معرف_المؤلف،
"الفئة": class_id،
"وقت_القراءة_دقائق": 8،
'is_featured': خطأ،
'pulished_at': '2026-05-03T10:00:00.000Z'
}, المجموعة='Blog_Posts')
post_id = منشور['id']
## 4. إنشاء ترجمة باللغة الإنجليزية
العميل.إدراج({
'blog_posts_id': post_id،
'languages_code': 'ar',
'العنوان': 'مقدمة لأمن الذكاء الاصطناعي'،
'slug': 'مقدمة إلى أمن الذكاء الاصطناعي'،
'content': '# AI Security Fundamentals\n\nهذه مقالة نموذجية حول تأمين أنظمة الذكاء الاصطناعي...\n\n## المخاطر الرئيسية\n\n- الحقن الفوري\n- تسرب البيانات\n- إفساد النماذج\n\n## أفضل الممارسات\n\nالتحقق دائمًا من صحة المدخلات، وتنفيذ نموذج الحماية، ومراقبة الحالات الشاذة.',
'مقتطف': 'دليل مناسب للمبتدئين لفهم وتخفيف مخاطر نظام الذكاء الاصطناعي.',
'key_takeaways': ['أنظمة الذكاء الاصطناعي عرضة لهجمات الحقن الفوري', 'التحقق دائمًا من صحة مدخلات النموذج وتعقيمها', 'مراقبة سلوك النموذج الشاذ'],
'meta_title': 'مقدمة إلى أمن الذكاء الاصطناعي - دليل Ainex',
'meta_description': 'تعرّف على أساسيات أمان الذكاء الاصطناعي والتهديدات الشائعة وأفضل الممارسات لحماية تطبيقات LLM الخاصة بك.',
'featured_image_alt': 'تصور مجرد لأمن الشبكات العصبية',
'cta_headline': 'هل أنت مستعد لتأمين الذكاء الاصطناعي الخاص بك؟',
'cta_button_text': 'ابدأ'،
'cta_button_url': '/البدء',
"علامة_المخطط": {
'@السياق': 'https://schema.org'،
'@النوع': 'مقالة'،
'headline': 'مقدمة لأمن الذكاء الاصطناعي'،
"المؤلف": {"@النوع": "شخص"، "الاسم": "أليكس تشين"}،
'تاريخ النشر': '2026-05-03T10:00:00.000Z',
'description': 'دليل مناسب للمبتدئين لفهم وتخفيف مخاطر نظام الذكاء الاصطناعي.'
}
}, المجموعة='Blog_Posts_Translations')
print(f"✔ تم إنشاء الواجهة الخلفية للمدونة! معرف المشاركة: {post_id}")يتم إنشاء هذا البرنامج النصي وتنفيذه بواسطة الوكيل في دورة واحدة. يمكنك الحصول على مخطط كامل وقابل للاستعلام وبيانات مصنفة على الفور.
المثال 2: الواجهة الخلفية للتجارة الإلكترونية في موجه واحد
دعونا نذهب أكبر. إليك كيفية دعم طبقة بيانات التجارة الإلكترونية الكاملة:
أنشئ واجهة خلفية للتجارة الإلكترونية للإنتاج باستخدام Directus. قم بإنشاء هذه المجموعات:
1. **المنتجات** - عناصر الكتالوج
- العنوان، سبيكة (فريدة)، الوصف (نص)، الحالة (مسودة/متوفر/out_of_stock)
- سنتات السعر (عدد صحيح)، مقارنة_سنتات (عدد صحيح لاغ)، سنتات التكلفة (عدد صحيح)
- SKU (فريد)، الباركود (فارغ)، Weight_grams (عدد صحيح)
- كمية_المخزون، عتبة_المخزون_المنخفض (الافتراضي 10)
- feature_image (ملف)، الصور (M2M عبر الوصلة)
- الفئة (M2O → الفئات)، العلامات (M2M → العلامات عبر الوصلة)
- نشرت_في
2. **الفئات** - التصنيف المتداخل
- الاسم، سبيكة (فريدة)، الوصف، فئة الوالدين (قيمة M2O الذاتية)
- صورة (ملف)،sort_order
3. **العلامات** - علامات المنتج
- الاسم، سبيكة (فريد)، اللون (ست عشري)
4. **العملاء** - الحسابات
- البريد الإلكتروني (الفريد)، الاسم الأول، اسم العائلة، الهاتف
- عنوان الشحن الافتراضي (json)، عنوان الفاتورة الافتراضي (json)
- إجمالي_السنتات_المنفقة، عدد_الطلبات، آخر_طلب_في (فارغة)
- الحالة (نشطة / محظورة)، والملاحظات
5. **الأوامر** - المعاملات
- رقم_الطلب (فريد)، الحالة (معلق/جاري المعالجة/تم الشحن/التسليم/الإلغاء)
- العميل (M2O → العملاء)
- الإجمالي_السنت، سنت_الضرائب، سنت_الشحن، إجمالي_سنت، سنت_الخصم
- عنوان_الشحن، عنوان_الفوترة (json)
- حالة_الدفع (مدفوعة/مستردة/فاشلة)، طريقة الدفع (شريطية/بايبال/يدوية)
- Payment_intent_id (فارغة)، رقم التتبع (فارغة)
- الملاحظات، Cancel_at (لاغية)
6. **Order_Items** - البنود (الجدول المشترك للطلبات ↔ المنتجات)
- الطلب (M2O → الطلبات)، المنتج (M2O → المنتجات)
- الكمية، سعر_الوحدة_سنتًا، إجمالي_سعر_سنتًا
-variant_name (سلسلة، لاغية)
7. **تعديلات_المخزون** - سجل التدقيق
- المنتج (M2O → المنتجات)، السبب (إعادة التخزين/البيع/الإرجاع/التدقيق/التعديل)
- كمية دلتا، الكمية السابقة، الكمية الجديدة
-reference_id (قيمة فارغة - روابط للطلب/التعديل)، ملاحظات
8. **المجموعات** - مجموعات منسقة
- الاسم، سبيكة (فريدة)، مقبض (سلسلة صديقة لواجهة برمجة التطبيقات)
- النوع (يدوي/تلقائي)، القواعد (json للقواعد التلقائية)
- ترتيب_الفرز، المنشور (منطقي)
9. **الخصومات** - الرموز الترويجية
- الكود (فريد، لاغٍ للتلقائي)، النوع (نسبة مئوية/ثابت)
- القيمة (int - النسبة المئوية أو السنتات)، max_uses،used_count
- valid_from، valid_until (فارغة)
- ينطبق على (الكل/الفئات/المنتجات)، معرفات_المنتجات القابلة للتطبيق (صفيف json)
- min_order_amount_cents (فارغة)، استبعاد_sale_items (منطقي)
القيود:
- استخدم create_collection() لجميع المجموعات التسعة + جداول الوصلات الواضحة (Products_Images إذا لزم الأمر)
- كل حقل: قم بتضمين المخطط: {} والفوقية: {} مقدمًا
- استخدم أنواع حقول Directus المناسبة: عدد صحيح، سلسلة، نص، منطقي، وقت التاريخ، json، ملف، محوري
- إضافة فهارس فريدة من نوعها على سبيكة، SKU، order_number
- البذور: أنشئ 3 نماذج من المنتجات مع نماذج من الصور (استخدم معرفات الملفات إذا كانت متوفرة)، واربطها بالفئة
- التحقق: استدعاء get_collections() وطباعة أعداد السجلات
- إخراج البرنامج النصي بايثون الكامليؤدي تشغيل هذا من خلال الوكيل إلى إنتاج برنامج نصي مكون من 300 سطر تقريبًا يبني نموذج بيانات التجارة الإلكترونية بالكامل دفعة واحدة. من الصفر إلى "هذه هي لوحة الإدارة الخاصة بك" قبل أن تبرد قهوتك.
مثال 3: إدارة علاقات العملاء (CRM) البسيطة (جهات الاتصال + الشركات + التفاعلات)
هل تحتاج إلى شيء خفيف الوزن؟ إليك إدارة علاقات العملاء:
أنشئ واجهة خلفية لإدارة علاقات العملاء (CRM) باستخدام Directus:
1. الشركات
- الاسم، المجال (الفريد)، الصناعة، الحجم (1-10/11-50/51-200/200+)
- الموقع الإلكتروني، الهاتف، العنوان (json)، Annual_revenue_cents (nullable)
- المالك (M2O → المستخدمون)، الحالة (القائد/العميل/المحتمل/المخضوض)
- آخر_تم الاتصال به، الملاحظات (النص)
2. جهات الاتصال
- الاسم الأول، الاسم الأخير، البريد الإلكتروني (الفريد)، الهاتف، عنوان الوظيفة
- الشركة (M2O → الشركات)، المالك (M2O → المستخدمون)
- الحالة (نشط/غير نشط/عميل محتمل)، جهة الاتصال المفضلة (البريد الإلكتروني/الهاتف/لينكد إن)
- LinkedIn_url، الملاحظات
3. التفاعلات
- جهة الاتصال (M2O → جهات الاتصال)، اكتب (مكالمة/بريد إلكتروني/اجتماع/ملاحظة)
- الاتجاه (الوارد/الصادر)، Duration_Minutes (عدد صحيح)
- ملخص (نص)، next_steps (نص)، تاريخ الاستحقاق (فارغ)
- صفقة ذات صلة (M2O → الصفقات لاغية)
4. الصفقات
- العنوان، قيمة_السنت، المرحلة (اقتراح/تفاوض/فوز_مغلق/خسارة_مغلقة)
- الاحتمال (0-100)، تاريخ الإغلاق (المتوقع)
- جهة الاتصال (M2O → جهات الاتصال)، المالك (M2O → المستخدمون)
- ملاحظات
القيود:
- استخدم create_collection() لجميع العناصر الأربعة
- جميع الحقول القياسية: تمت إضافة المعرف، وcreate_at، وupdate_at تلقائيًا
- تم إعداد العلاقات بشكل صحيح (FKs هي أعداد صحيحة)
- البذور: شركتان، 4 جهات اتصال، 3 تفاعلات، صفقة واحدةمرة أخرى - مطالبة واحدة وتنفيذ واحد.
كيف تعمل في الواقع: صلصة المهارة السرية
دعونا نزيل الغموض عما يحدث عندما تطلب من الوكيل "إنشاء واجهة خلفية":
الخطوة 1 – يقوم الوكيل بتحليل مطالبتك
يستخدم الوكيل منطقه لاستخراج:
- أسماء المجموعات والغرض منها
- أسماء الحقول وأنواعها وقيودها
- اتجاهات العلاقة (متعدد إلى واحد، متعدد إلى متعدد)
- متطلبات بيانات البذور
- خطوات التحقق
لا يحتاج إلى رؤية لغة تعريف المخطط - فهو يقرأ فقط اللغة الإنجليزية البسيطة ويبني البنية.
الخطوة الثانية - تولد المهارة الحمولات الصحيحة
هذا هو المكان الذي تشرق فيه المهارة. من المعروف أن نقطة نهاية POST /collections الخاصة بـ Directus صعبة الإرضاء:
**بدون المخطط: {} والتعريف: {} لكل حقل؟ ** → 403 محظور (حتى مع وجود رمز مشرف صالح).
اسم نوع الحقل خاطئ؟ → المجموعة لا تظهر بصمت.
** هل فقدت خيارات التعريف الخاصة بالعلاقة؟ ** → العلاقات لا تعمل.
تعرف المهارة عقد Directus API وتقوم بإنشاء حمولات صحيحة للإنتاج تلقائيًا. إليك ما يبدو عليه تعريف الحقل الصحيح:
{
'الحقل': 'price_cents'،
"النوع": "عدد صحيح"،
'المخطط': {'is_required': True}، # ← قم بتضمين هذا دائمًا
'meta': {'interface': 'numeric'} # ← قم بتضمين هذا دائمًا
}الخطوة 3 - استدعاءات واجهة برمجة تطبيقات المشرف بالترتيب
يتم إنشاء المجموعات بترتيب التبعية (الآباء قبل الأبناء، لا توجد تنازلات دائرية). لكل:
- يقوم
POST /collectionsبإنشاء المجموعة بقائمة الحقول الكاملة - تتحقق المهارة باستخدام
GET /collections/{name}من وجودها - إذا كان موجودًا بالفعل، فسيتم إسقاطه وإعادة إنشائه (الوضع المستقل)
بالنسبة لجداول الوصلات (M2M)، يتم استخدام النوع "المحوري" أو حقول FK الصريحة مع "meta.interface: 'relation'".
الخطوة 4 – بيانات البذور + التحقق
بعد وجود جميع المجموعات، يقوم الوكيل بما يلي:
- إدراج سجلات نموذجية باستخدام CRUD القياسي (
insert()) - قم بالرد على الاستعلامات باستخدام
get()أوget_expanded()للتأكيد - طباعة ملخص إلى المحطة الخاصة بك
أنماط الإنتاج المثبتة التي اكتشفناها
لقد قمنا بتشغيل سير العمل هذا مقابل https://hub.aratech.ae من خلال مخطط مدونتنا الكامل. وهنا الدروس:
1. المخطط والميتا إلزاميان
لا يمكن التأكيد على هذا بما فيه الكفاية. يقوم Directus 10+ بإرجاع 403 عندما يكون أي منهما مفقودًا، ولكن رسالة الخطأ مضللة ("ليس لديك إذن") عندما تكون المشكلة الحقيقية هي بنية الحمولة لديك.
تأكد دائما:
- تحتوي حمولة المجموعة على
المخطط: {}وmeta: {}في المستوى الأعلى - يحتوي كل حقل على "المخطط" و"التعريف".
- قيم الحقل
typeهي أنواع Directus صالحة (integer، وليسint، وstring، وليسvarchar)
2. استخدم get_expanded() للعلاقات
يتطلب Directus GraphQL مجموعات تحديد متداخلة لحقول العلاقات. إذا حاولت:
{ Blog_Posts_Translations { معرف blog_posts_id } }لقد حصلت على خطأ 400: `يجب أن يحتوي الحقل "blog_posts_id" من النوع "Blog_Posts" على مجموعة مختارة من الحقول الفرعية.
تعالج طريقة get_expanded() الخاصة بالمهارة مع التدوين النقطي هذا تلقائيًا:
Client.get_expanded(
الحقول = ['id'، 'title'، 'blog_posts_id.id'، 'blog_posts_id.status']،
المجموعة='Blog_Posts_Translations',
الحد=50
)
## يُرجع الإملاء: blog_posts_id = {'id': '5', 'status': 'published'}3. المعرفات هي سلاسل في GraphQL، وأعداد صحيحة في REST
يقوم GraphQL بإرجاع جميع حقول id على هيئة سلاسل. لكن حقول المفاتيح الخارجية (مثل blog_posts_id) تكون أعدادًا صحيحة عند استخدامها كمرشحات أو قيم مُدرجة.
عند إنشاء منشور والعودة إلى post_id = "42"، يجب عليك إرسال:
العميل.إدراج({
'blog_posts_id': int(post_id), # NOT post_id
'languages_code': 'ar',
...
}, المجموعة='Blog_Posts_Translations')وإلا فستحصل على خطأ في التحقق من صحة GraphQL 400.
4. تتم كتابة جدول الوصلات عبر مجموعة الوصلات
يعرض Directus علاقات M2M كحقول افتراضية للقراءة فقط على الأصل. ** لا يمكنك ** تصحيح حقل "العلامات" في "Blog_Posts" مباشرة - تحصل على 403 محظور.
بدلاً من ذلك، اكتب إلى جدول الوصلات:
## خطأ: فشل التصحيح المباشر على Blog_Posts
client.update(post_id, {'tags': [1, 2, 3]}, Collection='Blog_Posts') # ❌ 403
## الصحيح: أدخل في جدول الوصلات
بالنسبة إلى tag_id في [1، 2، 3]:
Client.insert({'blog_posts_id': post_id, 'blog_tags_id': tag_id}, المجموعة='Blog_Posts_Tags')5. تحتاج مجموعات الترجمة إلى إدراجات من خطوتين
وفقًا لتصميم المخطط الخاص بنا: قم أولاً بإنشاء سجل Blog_Posts الأصلي، ثم قم بإنشاء سجل Blog_Posts_Translations الفرعي باستخدام FK:
## الخطوة 1: الأصل (البيانات الوصفية فقط)
آخر = العميل.إدراج ({
"الحالة": "منشور"،
"المؤلف": معرف_المؤلف،
"الفئة": class_id،
"دقائق_وقت_القراءة": 8
}, المجموعة='Blog_Posts')
post_id = منشور['id']
## الخطوة الثانية: الترجمة (المحتوى الفعلي)
العميل.إدراج({
'blog_posts_id': post_id،
'languages_code': 'ar',
'العنوان': 'مشاركتي'،
'slug': 'مشاركتي'،
'content': '# أهلاً بالعالم...',
...
}, المجموعة='Blog_Posts_Translations')6. خطأ POST Trunction وإصلاح التصحيح
لقد اكتشفنا أن حقول "المحتوى" الكبيرة POSTs (> ~ 1500 حرف) يتم اقتطاعها بصمت بواسطة طبقة البوابة/الوكيل. تُرجع استجابة REST النجاح، ولكن يتم تخزين أول ~ 1.5 كيلو بايت فقط من عملية التخفيض.
التخفيف: أنشئ سجل الترجمة بالبيانات الأولية، ثم قم فورًا بتصحيح حقل "المحتوى":
## الخطوة أ: الإنشاء (خطر الاقتطاع)
trans = client.insert({ ... حقول_أولية ..., 'المحتوى': 'عنصر نائب قصير' }, المجموعة='Blog_Posts_Translations')
trans_id = trans['id']
## الخطوة ب: تصحيح المحتوى الكامل (تجاوز الاقتطاع)
Client.update(trans_id, {'content': full_markdown_body}, Collection='Blog_Posts_Translations')7. تحقق من إمكانية الكتابة قبل النشر
قبل محاولة الكتابة المهمة (النشر، التحديث المجمع)، قم بإجراء اختبار بسيط:
## إرسال سجل اختبار الحد الأدنى
اختبار = {'الحالة': 'مسودة'، 'المؤلف': 1، 'الفئة': 33}
test_record =client.insert(test, Collection='Blog_Posts')
test_id = test_record['id']
#إذا نجحت قم بحذفها
client.delete(test_id, hard=True, Collection='Blog_Posts')
طباعة (" ✅ تم تأكيد الوصول للكتابة")إذا فشل هذا مع 403/404، فإن الرمز المميز الخاص بك لا يحتوي على أذونات الكتابة - ولا فائدة من محاولة العملية الكاملة.
معالجة الأخطاء: الأخطاء التي تحدث وكيفية إصلاحها
إليك جدول الأخطاء من الإنتاج:
تتعامل المهارة مع معظم هذه العناصر داخليًا الآن (الإصدار 1.4.1+)، ولكن من الجيد معرفة الأنماط.
الأنماط المتقدمة: عوامل التصفية والعلاقات وحقول التعداد
التصفية باستخدام المشغلين
تدعم المهارة جميع عوامل تصفية Directus:
## متساوي
النتائج =client.get(
الحقول = ['id'، 'title'، 'الحالة']،
المرشحات={'الحالة': {'_eq': 'منشور'}}،
المجموعة='Blog_Posts',
الحد=10
)
#لا يساوي
المسودات = client.get(filters={'status': {'_neq': 'published'}}, Collection='Blog_Posts')
## يحتوي على (غير حساس لحالة الأحرف)
البحث = Client.get(
المرشحات={'title': {'_icontains': 'الأمان'}}،
المجموعة='Blog_Posts'
)
#في القائمة
النتائج =client.get(
المرشحات={'الفئة': {'_in': [33, 37, 42]}},
المجموعة='Blog_Posts'
)
#أعظم من
باهظة الثمن = client.get(
المرشحات={'price_cents': {'_gt': 10000}},
المجموعة='المنتجات'
)
#فحص فارغ
غير متصل = client.get(
المرشحات={'last_contacted_at': {'_null': صحيح}}،
المجموعة='جهات الاتصال'
)
## مجتمعة (و مجتمعة)
النتائج =client.get(
المرشحات={
'الحالة': {'_eq': 'منشور'}،
'الفئة': {'_في': [33، 37]}،
'تم النشر في': {'_not_null': صحيح}
},
المجموعة='Blog_Posts'
)توسيع العلاقات متعددة المستويات
باستخدام التدوين النقطي، يمكنك جلب العلاقات المتداخلة بمكالمة واحدة:
## جلب المشاركات مع المؤلف والفئة والعلامات
السجلات = client.get_expanded(
الحقول=[
"المعرف"، "العنوان"، "الحالة"،
"author.id"، "author.name"، "author.email"، # علاقة M2O
'category.id'، 'category.name'، # علاقة M2O
"tags.id"، "tags.name"، "tags.slug" # M2M عبر الوصلة
]،
المجموعة='Blog_Posts',
الحد=20
)
## النتيجة: يحتوي كل سجل على إملاءات متداخلة مثل {'author': {'id': 1, 'name': 'Alex'}, 'tags': [{'id': 5, 'name': 'AI'}, ...]}حقول JSON للبيانات المرنة
استخدم نوع json للبيانات المنظمة التعسفية:
العميل.إدراج({
"عنوان_الشحن": {
"شارع": "123 جادة التكنولوجيا"،
"المدينة": "دبي"،
"البلد": "الإمارات العربية المتحدة"،
'الرمز_البريدي': '00000'
},
"البيانات الوصفية": {
'utm_source': 'النشرة الإخبارية'،
'campaign_id': 'Q2-2026-ai-launch'
}
}, المجموعة='الطلبات')يتم تخزين JSON محليًا ويمكن الاستعلام عنه باستخدام المرشحات الموجودة على المفاتيح المتداخلة.
واجهة برمجة تطبيقات المشرف: عندما تحتاج إلى لمس المخطط برمجيًا
تكشف المهارة create_collection() وcreate_field() من خلال Directus admin REST API (/collections و/fields/{collection})، وليس GraphQL.
مطلوب رمز مميز للمشرف. DIRECTUS_API_TOKEN الخاص بك مخصص لـ CRUD؛ DIRECTUS_ADMIN_TOKEN مخصص لعمليات المخطط.
العميل = DirectusClient(
url=os.getenv('DIRECTUS_URL'),
token=os.getenv('DIRECTUS_API_TOKEN')، # لـ CRUD
admin_token=os.getenv('DIRECTUS_ADMIN_TOKEN') # للمخطط
)
## إنشاء مجموعة جديدة
client.create_collection('TEST_Items'، الحقول=[
{'field': 'id'، 'type': 'integer'، 'schema': {'is_primary_key': True، 'has_auto_increment': True}، 'meta': {'hidden': True، 'interface': 'numeric'، 'readonly': True}}،
{'الحقل': 'الاسم'، 'النوع': 'سلسلة'، 'المخطط': {}، 'التعريف': {'الواجهة': 'الإدخال'}}،
{'حقل': 'قيمة'، 'نوع': 'عدد صحيح'، 'مخطط': {}، 'ميتا': {'واجهة': 'رقمية'}}
])
## أضف حقلاً إلى المجموعة الموجودة (استخدمه بحذر - قد يؤدي إلى إتلاف مخطط GraphQL)
client.create_field('TEST_Items', 'description', 'text', meta={'interface': 'textarea'})
## قائمة بجميع المجموعات
المجموعات = client.get_collections()
طباعة (مجموعات) # ['Blog_Posts'، 'Blog_Authors'، ...]
## احصل على مخطط المجموعة
المخطط =client.get_collection_schema('Blog_Posts')
print(schema['fields'].keys()) # dict_keys(['id', 'status', 'author', ...])تحذير: يمكن أن تؤدي إضافة الحقول بشكل متزايد عبر create_field() إلى إتلاف مخطط GraphQL لتلك المجموعة، مما يتسبب في فشل جميع استعلامات GraphQL اللاحقة مع 400. النمط الأكثر أمانًا: حدد كل حقل مقدمًا في create_collection().
تجميع كل ذلك معًا: جلستك الأولى لبرمجة Vibe-Code
إليك ما يبدو عليه سير العمل الكامل:
## 1. ابدأ تشغيل المحطة الطرفية (باستخدام رموز Directus المميزة في env)
$export DIRECTUS_URL="https://hub.aratech.ae"
$export DIRECTUS_API_TOKEN="sZk-st..." # رمز مميز للمستخدم
$export DIRECTUS_ADMIN_TOKEN="ad-..." # رمز المشرف
## 2. إطلاق وكيل هيرميس
$ هيرميس
## 3. قم بإعطاء المطالبة (نسخ ولصق من الأعلى)
أنت: أنشئ لي واجهة مدونة خلفية باستخدام Directus. قم بإنشاء هذه المجموعات:...
## 4. يفكر الوكيل، وينشئ البرنامج النصي، وينفذه
🤖 الوكيل: إنشاء Blog_Authors... ✅
إنشاء فئات_المدونة... ✅
إنشاء علامات المدونة... ✅
إنشاء منشورات المدونة... ✅
إنشاء ترجمات_منشورات_المدونة... ✅
إنشاء علامات_منشورات المدونة... ✅
زرع 2 عينة من المشاركات... ✅
التحقق:
- منشورات المدونة: 2 سجل
- Blog_Posts_Translations: سجلان (باللغة الإنجليزية فقط)
- مؤلفو المدونة: سجل واحد
- فئات_المدونة: سجل واحد
- علامات المدونة: 0 سجلات
✅ تم سقالة الواجهة الخلفية بنجاح! تعرض لوحة إدارة Directus الخاصة بك على https://hub.aratech.ae/admin الآن جميع المجموعات المملوءة.
## 5. لقد انتهيت. تحقق من واجهة المستخدم الإدارية أو الاستعلام:
$ python3 -c "من directus.client import DirectusClient; c = DirectusClient(); print(c.get(collection='Blog_Posts', Limit=3))"هذا كل شيء. من مثيل Directus الفارغ إلى الواجهة الخلفية للمدونة الكاملة مع العلاقات وعينات البيانات في أقل من دقيقة.
ما يتيحه هذا: النماذج الأولية السريعة على نطاق واسع
لا يتعلق الأمر فقط بتوفير الوقت في إنشاء المخطط (على الرغم من أن هذا ضخم). يتعلق الأمر بـ تقليل حلقة التغذية الراجعة بين الفكرة والنموذج الأولي للعمل:
- تصميم مخطط لمدة أسبوع → 5 دقائق لوصف ما تريد
- ملفات الترحيل اليدوي → برنامج نصي واحد تم إنشاؤه وتنفيذه
- صياغة مواصفات واجهة برمجة التطبيقات → يقوم Directus تلقائيًا بإنشاء نقاط نهاية REST وGraphQL
- ** تكوين لوحة الإدارة ** → واجهة مستخدم Directus admin جاهزة على الفور مع مجموعاتك وحقولك وأذوناتك
يمكنك الآن تشغيل الواجهة الخلفية الخاصة بالمشروع من أجل:
- الأدوات الداخلية (المخزون، التذاكر، تتبع الأصول)
- بوابات العملاء (سجل الطلبات، تذاكر الدعم)
- نماذج بيانات SaaS (الاشتراكات والمستأجرين وسجلات الاستخدام)
- MVPs لعمل العميل (قم بوصف المجال، واحصل على واجهة خلفية فورية مدعومة بنظام CMS)
ولأن Directus هي مجرد قاعدة بياناتك بالإضافة إلى طبقة API ذكية، فأنت تمتلك البيانات. لا يوجد قفل للبائع. تصدير SQL في أي وقت.
القيود والمشاكل
ليست كل أنماط الواجهة الخلفية تناسب Directus
Directus هي منصة CMS الأولى. يتفوق في:
- النماذج التي تركز على المحتوى (المدونات والأخبار والمستندات والكتالوجات)
- البيانات العلائقية المنظمة (المستخدمين، الطلبات، المنتجات)
- تطبيقات الوسائط الثقيلة (إدارة الملفات المضمنة)
إنها ** ليست مثالية لـ **:
- أنظمة المعاملات عالية التردد (الخدمات المصرفية، العطاءات في الوقت الحقيقي)
- مصادر الأحداث المعقدة أو بنيات CQRS
- الأنظمة التي تتطلب وظائف أو مشغلات SQL مخصصة
- مقابس الويب في الوقت الفعلي (على الرغم من أنه يمكنك استخدام الخطافات وخطافات الويب الخاصة بها)
لا تزال بحاجة إلى التفكير في نمذجة البيانات
لا يحل التشفير الديناميكي محل فهم مجالك. القمامة في الداخل والقمامة في الخارج:
- حقول ذات أسماء سيئة → واجهة برمجة تطبيقات مربكة
- فهارس مفقودة → استعلامات بطيئة على نطاق واسع
- بنية مسطحة للتداخل العميق → قراءات غير فعالة
سقالات المهارة بناءً على المواصفات الخاصة بك. المواصفات الجيدة تأتي من النمذجة الجيدة.
الأذونات لا تزال بحاجة إلى التكوين
تقوم هذه المهارة بإنشاء مجموعات وحقول كمسؤول، ولكنك لا تزال بحاجة إلى تكوين أذونات Directus (الأدوار والسياسات) لعرض البيانات الصحيحة لمستخدمي الواجهة الأمامية. المهارة لا تلمس الأذونات بعد.
المحتوى الكبير يتطلب التصحيح
إذا كنت تنشر مقالات تخفيض السعر أكثر من 1500 حرف، فاستخدم دائمًا نمط POST-then-PATCH لتجنب الاقتطاع. لم يتم تصحيح المهارة تلقائيًا بعد - تحتاج إلى التعامل معها في نص البذر الخاص بك.
الاستنتاج: الواجهة الخلفية أصبحت الآن محادثة
يُستخدم إنشاء واجهة خلفية ليعني كتابة عمليات ترحيل SQL، وتكوين ORM، وبناء مسارات وحدة التحكم، وتوصيل مسؤول. أيام أو أسابيع من العمل.
في عام 2026، مع Directus ومهارة nikola66، أصبح الأمر كما يلي:
- قم بوصف مخططك باللغة الإنجليزية البسيطة
- اسمح للوكيل بإنشاء وتنفيذ لغة بايثون
- الواجهة الخلفية الخاصة بك حية
لقد استخدمنا هذا النمط لتدوير ثلاثة واجهات خلفية للمشروع هذا الشهر وحده. ما كان في السابق بمثابة مانع - "نحن بحاجة إلى بناء طبقة البيانات أولاً" - أصبح الآن غير مشكلة. لقد انتقل عنق الزجاجة إلى أعلى: فنحن الآن نقضي وقتنا في منطق المنتج وتجربة المستخدم، وليس السباكة.
لقد وصل عصر الترميز الحيوي. الواجهة الخلفية الخاصة بك جاهزة عندما تكون كذلك.
الخطوات التالية
- تثبيت المهارة:
إضافة مهارات npx nikola66/directus-skill - الاتصال بـ Directus: قم بتعيين
DIRECTUS_URL،DIRECTUS_API_TOKEN،DIRECTUS_ADMIN_TOKEN - جرب مثال المدونة أعلاه (يؤدي إلى إنشاء مخطط جاهز متعدد اللغات وقابل للاستعلام بالكامل)
- توسيعها: إضافة مجموعات للتعليقات والإعجابات والاشتراكات وسجلات خطاف الويب
- ربط الأذونات في Directus Admin → الإعدادات → الأدوار والسياسات
هل لديك أسئلة؟ راسلنا على Telegram @Hermdroid أو افتح مشكلة في مستودع المهارات. بناء سعيد.
مدة القراءة: ~9 دقائق الفئة: البرنامج التعليمي ** العلامات **: Directus، تطوير الواجهة الخلفية، وكلاء الذكاء الاصطناعي، Vibe Coding، CMS، GraphQL، Python، مخطط قاعدة البيانات، API، بدون كود