دوین پس از طراحی موفقیتآمیز تمامی سوالات مسیر 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
راهاندازی پروژه
برای اجرای پروژه، باید 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 اهمیتی ندارد.
ارسال پاسخ برای این سؤال