هناك بطولتان رائعتان في كرة القدم: دوري الأبطال ودوري أوروبا. بناءً على نتائجها ،
يتم احتساب ما يسمى
تصنيف اتحادات كرة القدم . بناءً على هذا التصنيف ، يتم تحديد عدد الفرق من كل بلد التي ستشارك في البطولات التالية.
في هذه المقالة ، سوف أقوم بإنشاء تطبيق يستند إلى نظام
lsFusion المفتوح
والمجاني الذي سيقوم بحساب هذا التصنيف. سيقوم بتخزين جميع بياناته في PostgreSQL ، ويوفر واجهة ويب لتغييرها وعرضها مع إمكانات التصفية والفرز ، وكذلك استيراد نتائج المطابقة باستخدام واجهة برمجة تطبيقات خاصة.
ستتألف كل شفرة تنفيذ هذا التطبيق من حوالي 300 سطر مهم.
منطق المجال
يبدأ إنشاء أي نظام معلومات بمهمة منطق المجال.
بادئ ذي بدء ، من المنطقي تفرد أبسط الدلائل التي تحتوي فقط على رمز واسم:
- البطولة. دوري أبطال أوروبا أو دوري أوروبا.
- الموسم . 2018-2019 / 2017-2018 إلخ.
- جولة . النهائي ، نصف النهائي ، مرحلة المجموعات ، إلخ. يمكن اعتباره تركيبة للبطولة ، لكن في هذا التطبيق ، حددتها ككيان منفصل.
- البلد. يستخدم هذا التطبيق باسم اتحاد كرة القدم. على سبيل المثال ، يقع نادي موناكو في بلد موناكو ، لكنه يلعب في البطولة الفرنسية.
- النادي. برشلونة ، ريال مدريد ، مانشستر يونايتد ، إلخ.
نظرًا لأن lsFusion يستخدم نفس النوع من المنطق للإعلان عنها ، فسوف نعلن عن كود التعريف (أو قالب الشفرة) الذي سينشئ المنطق المقابل:
سيعلن:
- فئة مع الاسم المحدد
- خصائص مع رمز واسم للفئة الجديدة
- ثلاثة أشكال: تحرير كائن ، نموذج يحتوي على قائمة بجميع الكائنات ، يتم إضافته بعد ذلك إلى لوحة التجول ، مربع حوار لتحديد هذا الكائن. كحوار ، يمكنك استخدام النموذج الثاني ، ولكن بعد ذلك ستتاح للمستخدم الفرصة لتغيير الكائنات عند الاختيار ، مما قد يؤدي إلى أخطاء من جانب المستخدمين.
يتم تمرير أربعة معلمات إلى metacode:
- معرف (كائن) . مع هذا الاسم سيتم إنشاء الطبقات والنماذج. يتم استخدام بناء ### لجعل الحرف الأول من المعرف بالأحرف الكبيرة في التعليمات البرمجية الناتجة.
- الاسم في صيغة المفرد . تستخدم لعنوان الطبقة والشكل.
- الاسم في صيغة الجمع . تستخدم لمربع التحرير والسرد والحوار.
- طول الاسم . في أسماء الكائنات المختلفة ، من المتوقع أطوال مختلفة ، وهو أمر مهم عند بناء الواجهة.
باستخدام الرمز الرئيسي الذي تم إنشاؤه ، أضف الكيانات الخمسة الموضحة أعلاه:
الكود الذي تم إنشاؤه ، على سبيل المثال ، للبطولة سيبدو كما يلي:
أضف الرابط إلى البلد لمنطق النادي الذي تم إنشاؤه. للقيام بذلك ، قم أولاً بإنشاء الخاصية المناظرة ، ثم وضعها على نماذج التحرير وعرض النادي:
نضع كل المنطق الذي تم إنشاؤه في وحدة رئيسية منفصلة (ملف Master.lsf).
الآن إنشاء
رابطة الكيان. ستحدد البطولة لموسم معين. على سبيل المثال ، Champions League 2017-18 أو Europa League 2018-19. الدوري لن يكون له اسم ، ولكن فقط روابط إلى البطولة والموسم. لذلك ، لن نستخدم كود metacode السابق ، لكننا سنفعل نفس المنطق ونضعه في وحدة الجامعة الجديدة:
وأخيراً ، أضف منطق المباريات. للقيام بذلك ، قم بإنشاء "
تطابق الفصل" ، والذي سوف يشير إلى الدوري والجولة. بالنسبة له ، الأندية التي شاركت فيه ، والنتيجة سوف تُسأل أيضًا. نضع كل هذا في وحدة مطابقة منفصلة:
استيراد البيانات
لسوء الحظ ، تمكنت من العثور على واجهة برمجة تطبيقات (API) عامة ومجانية واحدة تدعم جميع برامج Eurocups. هذا هو
API لكرة القدم . ومع ذلك ، هناك مشاكل:
- لا توجد نتائج حتى عام 2016.
- لا توجد مؤهلات لدوري أوروبا حتى عام 2018.
- هناك بعض الأخطاء في البيانات. على سبيل المثال ، تم تعيين Irtysh Pavlodar لروسيا ، على الرغم من أن هذا النادي يمثل كازاخستان. أيضًا ، يشير Europa Fc لسبب ما إلى إسبانيا بدلاً من جبل طارق.
يمكن تصحيح أخطاء البيانات يدويًا باستخدام النماذج التي تم إنشاؤها مسبقًا. ومع ذلك ، نظرًا لأن حساب المعامل الكلي يستند إلى السنوات الخمس الماضية ، لسوء الحظ ، لن يعمل لحساب المعامل الكلي من بيانات API Football. إذا اقترح شخص ما في التعليقات مكان الحصول على البيانات الضرورية بأي تنسيق من السنوات السابقة ، فسأكون ممتنًا للغاية. ولكن نظرًا لوجود بيانات كاملة لعام 2018 ، سيكون من الممكن التحقق من صحة الحساب خلال هذا العام على الأقل.
يتم تطبيق واجهة برمجة التطبيقات التي نحتاجها في شكل طلبات HTTP ، حيث يتم نقل المعلمات عبر عنوان url ، ويشار إلى مفتاح وصول خاص في الرأس. أعلن المنطق المطابق:
سيتم وضع جميع إجراءات استيراد البيانات في نموذج
البطولات الذي تم إنشاؤه مسبقًا. هناك سنضع مفتاح الوصول في شريط أدوات الجدول مع قائمة الدوريات:
أولاً ، ننفذ قائمة الدوريات. لهذا ، يحتوي تطبيق Football API على رابط خاص: / بطولات الدوري. طلب GET لها بإرجاع JSON النموذج:
الجواب { "api":{ "results":2, "leagues":[ { "league_id":1, "name":"2018 Russia World Cup", "country":"World", "country_code":null, "season":2018, "season_start":"2018-06-14", "season_end":"2018-07-15", "logo":"https://www.api-football.com/public/leagues/1.png", "flag":null, "standings":0, "is_current":1 }, { "league_id":2, "name":"Premier League", "country":"England", "country_code":"GB", "season":2018, "season_start":"2018-08-10", "season_end":"2019-05-12", "logo":"https://www.api-football.com/public/leagues/2.png", "flag":"https://www.api-football.com/public/flags/gb.svg", "standings":1, "is_current":1 } ] } }
لإنشاء طلب GET إليه وتسجيل هيئة الاستجابة ، يتم استخدام الإنشاء التالي:
يكتب النتيجة إلى خاصية
النتيجة المحلية دون معلمات من النوع FILE.
لتحليل ملف بتنسيق JSON ، تم بناء نموذج يتوافق هيكله مع بنية JSON. يمكنك توليدها في IDE باستخدام عنصر القائمة:

بالنسبة إلى JSON أعلاه ، سيبدو النموذج كما يلي (مع مراعاة فقط تلك القيم التي سيتم استيرادها):
للاستيراد مباشرة من خاصية
نتيجة JSON بتنسيق نموذج
importL زمالات ، استخدم الأمر التالي:
بعد تنفيذه ، سيتم وضع القيم المطابقة من ملف JSON في خصائص
tourNameName و
seasonName و
leagueId :

أي أن قيمة
البطولة (0) ستكون "كأس العالم" ، وفي
البطولة اسم (1) ستكون "الدوري الممتاز".
لسوء الحظ ، لا يحتوي API Football على كيان البطولة على الإطلاق. الطريقة الوحيدة لربط جميع بطولات الدوري هي الحصول على اسم يطابق بطولات نفس البطولة من مواسم مختلفة. للقيام بذلك ، في عملية الاستيراد ، نجمع أولاً جميع أسماء البطولات المستوردة ، وإذا لم يكن ذلك في قاعدة البيانات ، نقوم بإنشاء دورات جديدة:
لا توجد أيضًا رموز للفصول ، لذلك عند استيراد الدوريات ، يتم إنشاؤها بنفس الطريقة. بعد إنشاء الكائنات المفقودة ، يتم استيراد البطولات مباشرة. يتم البحث في البطولات والفصول بالاسم باستخدام الخصائص التي تم إنشاؤها سابقًا من خلال
GROUP AGGR :
بشكل افتراضي ، سيتم تحميل البيانات ، ولكن سيتم حفظها فقط في قاعدة البيانات عندما يقوم المستخدم بالنقر فوق الزر "حفظ" في النموذج. إذا لزم الأمر ، يمكنك إضافة الأمر
APPLY في نهاية الإجراء بحيث يتم حفظه على الفور في قاعدة البيانات دون معاينة.
وأخيرًا ، أضف إجراء الاستيراد إلى نموذج قائمة الدوري:
وبالمثل ، نحن نستورد الأندية والمباريات. ومع ذلك ، نظرًا لأن واجهة برمجة التطبيقات توفر القدرة على استيرادها فقط لدوري معين ، يجب أن يأخذ الإجراء الدوري كمدخل:
استيراد النوادي والمبارياتهناك خصوصية للمباريات: رموز الفريق تذهب داخل
homeTeam إضافية
وعلامات بعيداTeam . يتم إنشاء مجموعات المقابلة لهم عن طريق القياس مع api. علاوة على ذلك ، في الداخل لديهم نفس علامات
team_id . نظرًا
لأنه لا يمكن إضافة الخصائص التي تحمل الاسم نفسه إلى النموذج ، يتم
استخدام الكلمة الأساسية
EXTID الخاصة ، والتي تحدد اسم العلامة في JSON المستوردة.
لكي تكون جميع الواردات على نفس الشكل ، وبما أنها مرتبطة بالبطولات ، فنحن نأخذها جميعًا إلى نفس النموذج. بالإضافة إلى ذلك ، نضيف فرقًا ومطابقات إلى النموذج حتى نتمكن من رؤية ما يتم استيراده قبل الحفظ:
الشكل الناتج سيبدو كما يلي:

سيتم وضع جميع الواردات في وحدة APIFootball منفصلة.
حساب معامل
ننتقل مباشرة إلى حساب معامل البلد UEFA. من المنطقي وضع كل الكود في وحدة UEFA مثبتة خصيصًا لهذا الغرض.
أولاً ، ضع في اعتبارك أن Football API يوفر واجهة لاستيراد جميع المباريات ، وليس فقط Eurocups. لذلك ، نفصل بين مطابقات كأس الاتحاد الأوروبي وفقًا لاسم البطولة (من الأصح أن يكون لديك خاصية أساسية منفصلة لذلك ، ولكن يمكن دائمًا تغيير تنفيذ الخصائص دون تعديل بقية المنطق):
أولاً ، دعنا نحسب النقاط التي يحصل عليها كل ناد في موسم واحد لنتائج مباريات محددة.
خلال هذه الفترة ، يتلقى كل فريق:
2 نقطة في حالة النصر ؛
1 نقطة في حالة التعادل.
منذ عام 1999 ، يتم تقسيم هذه النقاط إلى نقطتين إذا حصلوا عليها في جولات التأهيل ، أي:
نقطة واحدة في حالة النصر ؛
0.5 نقطة لادراك التعادل.
قم بإنشاء خصائص مساعدة تحدد العلاقة بين المباراة والنادي:
لتحديد عدد النقاط التي يتم تسجيلها في كل تطابق ، نضيف الخاصية الأساسية من النوع الرقمي للجولة ، والتي ستكون افتراضيًا واحدة.
ثم نحسب نقاط الانتصارات والتعادلات ونضيفها معا:
يتم تمييز نقاط التطابق على أنها "مواد" بحيث يتم حفظها في الجدول ، ولا يتم احتسابها في كل مرة.
تحتاج الآن إلى حساب نقاط المكافآت:
بالإضافة إلى ذلك ، يتم منح نقاط المكافآت:
يتم إعطاء نقطة واحدة في حالة وصول الفريق إلى دور الثمانية ونصف النهائي والنهائي في الكؤوس الأوروبية ؛
4 نقاط للوصول إلى مرحلة المجموعات في دوري الأبطال (حتى 1996 - 2 نقطة ، من 1997 إلى 2003 - 1 نقطة ، من 2004 إلى 2008 - 3 نقاط) ؛
5 نقاط في حالة خروج الفريق إلى نهائيات 1/8 من دوري الأبطال (قبل 2008 - نقطة واحدة).
تؤخذ في الاعتبار المباريات التي لعبت فقط (لا تؤخذ الخسائر التقنية في الاعتبار). تعتبر المباريات المنتهية في سلسلة من ركلات الترجيح ، عند حساب المعامل ، مطابقة للنتيجة ، والتي يتم إصلاحها من خلال نتائج اللعبة في الوقت الرئيسي والإضافي.
في هذا التطبيق ، نفترض أن النادي دخل في جولة البطولة إذا لعب مباراة واحدة على الأقل فيها. للقيام بذلك ، نحسب عدد المباريات التي لعبها النادي في موسم معين أو دورة أو جولة:
الآن تحتاج إلى تحديد عدد النقاط التي يجب تسجيلها للمرور في جولة معينة. نظرًا لأنه يعتمد على البطولة (على سبيل المثال ، يتم إعطاء مرور في دوري أبطال أوروبا 5 نقاط ، ولكن لا يوجد شيء في دوري أوروبا). للقيام بذلك ، نقدم الملكية الأساسية:
الآن دعونا نحسب نقاط المكافأة وإجمالي عدد النقاط للنادي لهذا الموسم:
أخيرًا ، نذهب مباشرةً إلى معامل البلد.
لحساب تصنيف الاتحاد ، تتم إضافة جميع النقاط التي سجلتها الأندية المشاركة في دوري الأبطال ودوري أوروبا ، والنتيجة مقسومة على عدد الأندية من هذا الاتحاد [2] [3].
دعونا نحسب عدد الأندية لكل جمعية شاركت في المسابقات الأوروبية:
الآن نحن نعتبر إجمالي عدد نقاط الاتحاد لهذا الموسم ونقسم على عدد الأندية:
تصنيف الدولة هو مجموع معاملات الدولة للسنوات الخمس السابقة.
للقيام بذلك ، نقوم بترقيم جميع الفصول التي تبدأ من الأخير بواسطة الكود الداخلي (نفترض أن الأخير قد تم إضافته لاحقًا وله رمز أكبر):
إذا لزم الأمر ، يمكنك إدخال حقل منفصل أو رقم بالاسم.
يبقى فقط لحساب التصنيف النهائي للبلد:
أعلاه ، أعلنا احتمالات عن البطولات والجولات. أضفهم إلى نموذج تحرير الدورة ، مع تصفية تلك الجولات التي كانت موجودة في هذه البطولات فقط:
إعدادات الصعاب ، على سبيل المثال ، لدوري الأبطال ، تحتاج إلى تعيين مثل هذا:

لنرسم نموذجًا يعرض التصنيف ، حيث سيتم عرض الفرق لكل بلد ، ولكل فريق مبارياته:
الشكل الناتج سيبدو كما يلي:

يظهر اللون في جداول الأندية عندما شارك في المواسم ، وفي جدول المباريات - من فاز.
تُظهر الصورة أن التصنيفات لعام 2018 تُحسب تمامًا كما في ويكيبيديا. للسنوات السابقة ، كما ذكر أعلاه ، لا يوفر Football API جميع المعلومات.
يؤدي
لقد أنشأنا تطبيقًا صغيرًا موصوفًا بالكامل من خلال الرمز أعلاه ويخزن بياناته في PostgreSQL ، ويوفر واجهة ويب لعرض البيانات وتحريرها. في الوقت نفسه ، ستعمل بفعالية على وحدات التخزين الكبيرة ، نظرًا لأن جميع النماذج تقرأ فقط النافذة المرئية. كما يوجد خارج الصندوق عوامل تصفية وفرز وتحميل إلى Excel والمزيد.
تجدر الإشارة إلى مدى سهولة استخدام المنصة في تحليل مهمة حساب معامل إلى خصائص فردية. عند التنفيذ ، سيتم ترجمة كل هذا المنطق إلى استعلامات SQL ، وسيتم تنفيذ جميع العمليات الحسابية مباشرةً على خادم قاعدة البيانات باستخدام جميع عمليات تحسين قواعد البيانات.
يمكن العثور على مثال عن كيفية عمل التطبيق مع البيانات المحملة فيه على:
https://demo.lsfusion.org/euroleague . تسجيل دخول ضيف بدون كلمة مرور. المستخدم في وضع القراءة فقط.
يمكن لأولئك الذين يرغبون في
ضبط أنفسهم كل شيء محليًا ، وعلى سبيل المثال ، صياغة المعاملات من خلال إدخال نتائج المباريات المستقبلية. يتم استضافة جميع وحدات التطبيق المذكورة أعلاه على
جيثب . بعد التثبيت التلقائي ، تحتاج فقط إلى ظهور هذه الملفات في المجلد المناسب من التعليمات وإعادة تشغيل الخادم.
من أجل تنزيل البيانات من Football API ، تحتاج إلى التسجيل معهم والحصول على مفتاح API. تتطلب بطاقة ، ولكن إذا لم تقدم أكثر من 50 طلبًا يوميًا ، فلن يتم خصم أي شيء منها.
بالإضافة إلى ذلك ، يمكنك تشغيل هذا التطبيق عبر الإنترنت في
القسم المناسب على الموقع. في علامة التبويب النظام الأساسي ، حدد مثال حساب UEFA Odds ، ثم انقر فوق تشغيل.
بالمناسبة ، إذا احتاج شخص ما إلى تطبيق نظام بسيط لم يعد Excel مناسبًا له ، فاكتب في التعليقات. من أجل معرفة قدرات النظام الأساسي ، سنحاول تنفيذه وكتابة المقالة المقابلة.