دوین پس از طراحی موفقیت‌آمیز تمامی سوالات مسیر PHP/Laravel مسابقات المپیک‌فناوری، به دلیل مهارت زیاد مسئولیت جدیدی از سمت کوئرا و پارک‌فناوری پردیس دریافت کرده است، طراحی پیام‌رسان داخلی پردیس‌گرام برای برقراری ارتباط راحت‌تر و سریع‌تر مخصوص شرکت‌کنندگان در این سری مسابقات!

شما در این سوال قرار است سراغ پیاده‌سازی بخش کوچکی از این پیام‌رسان با استفاده از لاراول بپردازید. از آن‌جایی که رابطه دوین با رابطه‌های بین مدل‌ها حسابی شکرآب است، مسئولیت پیاده‌سازی این رابطه‌ها به صورتی که دوین از قبل مشخص کرده است بر عهده شما خواهد بود.

تصویر سوال پیام‌رسان پردیس‌گرام

جزئیات پروژه

پروژه‌ی اولیه را از این لینک دانلود کنید.

ساختار فایل‌ها

pardis-messenger
├── app
│   ├── Console
│   ├── Exceptions
│   ├── Http
│   ├── Models
│   │   ├── Message.php
│   │   ├── Post.php
│   │   ├── Comment.php
│   │   ├── Like.php
│   │   ├── Profile.php
│   │   ├── Group.php
│   │   ├── Channel.php
│   │   └── User.php
│   └── Providers
├── bootstrap
├── config
├── database
│   ├── factories
│   ├── migrations
│   │   ├── 2014_10_12_000000_create_users_table.php
│   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   ├── 2021_03_18_133215_create_messages_table.php
│   │   ├── 2021_03_18_133224_create_posts_table.php
│   │   ├── 2021_03_18_133232_create_comments_table.php
│   │   ├── 2021_03_18_133241_create_likes_table.php
│   │   ├── 2021_03_18_133250_create_groups_table.php
│   │   ├── 2021_03_18_133255_create_channels_table.php
│   └── seeders
├── public
├── resources
├── routes
├── storage
├── tests
├── README.md
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpunit.xml
├── server.php
└── webpack.mix.js
Plain text

راه‌اندازی پروژه

برای اجرای پروژه، باید php و composer را از قبل نصب کرده باشید.

  • ابتدا پروژه‌ی اولیه را دانلود و از حالت فشرده خارج کنید.
  • دستور composer install را در پوشه‌ی اصلی پروژه برای نصب نیازمندی‌ها اجرا کنید.
  • برای اجرای مایگریشن‌ها از دستور php artisan migrate استفاده کنید.

ساختار جداول

مایگریشن‌های مربوط به پروژه از قبل ایجاد شده‌اند. در اولین گام باید ساختار جداول پروژه را مطابق توضیحات زیر تکمیل کنید:

ساختار جدول users:

نام ستون نوع تعریف
id bigint کلید اصلی
name string نام کاربر
email string ایمیل کاربر (منحصربه‌فرد)
email_verified_at timestamp زمان تایید ایمیل
remember_token string حفظ اطلاعات ورود کاربر
password string رمز عبور کاربر
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول profiles:

نام ستون نوع تعریف
id bigint کلید اصلی
user_id bigint کلید خارجی به جدول users
bio text بیوگرافی کاربر
avatar string آدرس تصویر پروفایل
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول messages:

نام ستون نوع تعریف
id bigint کلید اصلی
user_id bigint کلید خارجی به جدول users
content text محتوای پیام
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول posts:

نام ستون نوع تعریف
id bigint کلید اصلی
user_id bigint کلید خارجی به جدول users
channel_id bigint کلید خارجی به جدول channels
content text محتوای پست
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول comments:

نام ستون نوع تعریف
id bigint کلید اصلی
content text محتوای کامنت
user_id bigint کلید خارجی به جدول users
commentable_id bigint شناسه موجودیت (پست یا پیام)
commentable_type string نوع موجودیت (post یا message)
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول likes:

نام ستون نوع تعریف
id bigint کلید اصلی
user_id bigint کلید خارجی به جدول users
likeable_id bigint شناسه موجودیت (پست یا کامنت)
likeable_type string نوع موجودیت (post یا comment)
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول groups:

نام ستون نوع تعریف
id bigint کلید اصلی
name string نام گروه
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول group_user:

نام ستون نوع تعریف
group_id bigint کلید خارجی به جدول groups
user_id bigint کلید خارجی به جدول users

ساختار جدول channels:

نام ستون نوع تعریف
id bigint کلید اصلی
name string نام چنل
created_at timestamp زمان ایجاد
updated_at timestamp زمان آخرین به‌روزرسانی

ساختار جدول channel_user:

نام ستون نوع تعریف
channel_id bigint کلید خارجی به جدول channels
user_id bigint کلید خارجی به جدول users

شما در این سوال صرفا قرار است تا روابط بین مدل‌های پیام‌رسان را پیاده‌سازی کنید. مایگریشن‌ها از قبل پیاده‌سازی شده‌اند و در قالب پروژه اولیه به همراه توضیحات آن‌ها در بخش ساختار جداول در اختیار شما قرار داده شده‌اند. توضیحات روابطی که باید پیاده‌سازی شوند به شکل زیر است:

مدل‌های پیام‌رسان پردیس‌گرام:

لیست مدل‌های این پیام‌رسان به شرح زیر است:

  • مدل User: کاربران سیستم
  • مدل Profile: پروفایل کاربر
  • مدل Message: پیام‌های کاربران
  • مدل Post: پست‌های ارسال‌شده توسط کاربران در چنل‌ها
  • مدل Comment: کامنت‌های پست‌ها و پیام‌ها
  • مدل Like: لایک‌های داده‌شده به پست‌ها و کامنت‌ها
  • مدل Group: گروه‌های کاربری شامل کاربران مختلف
  • مدل Channel: چنل‌ها که پست‌ها در آن‌ها ارسال می‌شوند

روابط بین مدل‌ها:

  • هر کاربر یک پروفایل دارد.
  • هر کاربر می‌تواند چند پیام ارسال کند.
  • هر کاربر می‌تواند چند پست ایجاد کند و در چندین چنل عضو باشد.
  • هر پست می‌تواند چند کامنت داشته باشد.
  • هر پست و کامنت می‌توانند لایک داشته باشد (استفاده از رابطه‌ی پولیمورفیک برای لایک‌ها).
  • هر کامنت متعلق به یک پست یا پیام است (رابطه‌ی پولیمورفیک برای کامنت‌ها).
  • هر کاربر می‌تواند در چند گروه کاربری عضو باشد (رابطه‌ی چند به چند برای گروه‌ها).
  • هر چنل شامل چندین کاربر است و هر کاربر می‌تواند در چند چنل عضو باشد.
  • هر پست متعلق به یک چنل است و هر کاربر می‌تواند در چندین چنل پست ارسال کند.

آن‌چه باید آپلود کنید

  • توجه: نیازی به پیاده‌سازی مایگریشن‌ها در این سوال نیست و این مایگریشن‌ها از قبل در اختیار شما قرار داده شده است. وظیفه شما در این سوال تنها پیاده‌سازی روابط مدل‌ها می‌باشد.

  • توجه: تنها تغییرات مورد نیاز را در مدل‌ها اعمال کنید تا روابط به‌درستی تعریف شوند.

  • توجه: پس از تعریف روابط، کل فایل‌های پروژه به‌جز پوشه‌ی vendor را زیپ کرده و ارسال کنید.

  • توجه: که شما مجاز به افزودن فایل جدیدی در این ساختار نیستید و تنها باید تغییرات را در فایل‌های موجود اعمال کنید.

  • توجه: که نام فایل Zip اهمیتی ندارد.


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.