ورود


در این سوال قصد داریم تغییر کوچکی در سیستم ورود لاراول ایجاد کنیم.

Authentication پیش‌فرض لاراول ورود را با ایمیل بررسی می‌کند، اما ما دوست داریم کاربران با نام کاربری‌ای که در هنگام ثبت‌نام وارد می‌کنند وارد سایت شوند، به همین دلیل در این امر از شما کمک می‌خواهیم.

پروژه اولیه🔗

پروژه اولیه را از اینجا دانلود کنید. ساختار فایل‌های این پروژه به صورت زیر است:

authentication_initial
├─ app
│   ├─ Console
│   │   └─ Kernel.php
│   ├─ Exceptions
│   │   └─ Handler.php
│   ├─ Http
│   │   ├─ Controllers
│   │   │   ├─ Auth
│   │   │   │   ├─ ForgotPasswordController.php
│   │   │   │   ├─ LoginController.php
│   │   │   │   ├─ RegisterController.php
│   │   │   │   ├─ ResetPasswordController.php
│   │   │   │   └─ VerificationController.php
│   │   │   ├─ Controller.php
│   │   │   └─ HomeController.php
│   │   ├─ Middleware
│   │   │   ├─ Authenticate.php
│   │   │   ├─ CheckForMaintenanceMode.php
│   │   │   ├─ EncryptCookies.php
│   │   │   ├─ RedirectIfAuthenticated.php
│   │   │   ├─ TrimStrings.php
│   │   │   ├─ TrustProxies.php
│   │   │   └─ VerifyCsrfToken.php
│   │   └─ Kernel.php
│   ├─ Providers
│   │   ├─ AppServiceProvider.php
│   │   ├─ AuthServiceProvider.php
│   │   ├─ BroadcastServiceProvider.php
│   │   ├─ EventServiceProvider.php
│   │   └─ RouteServiceProvider.php
│   └─ User.php
├─ bootstrap
│   ├─ cache
│   └─ app.php
├─ config
│   ├─ app.php
│   ├─ auth.php
│   ├─ broadcasting.php
│   ├─ cache.php
│   ├─ database.php
│   ├─ filesystems.php
│   ├─ hashing.php
│   ├─ logging.php
│   ├─ mail.php
│   ├─ queue.php
│   ├─ services.php
│   ├─ session.php
│   └─ view.php
├─ database
│   ├─ factories
│   │   └─ UserFactory.php
│   ├─ migrations
│   │   ├─ 2014_10_12_000000_create_users_table.php
│   │   └─ 2014_10_12_100000_create_password_resets_table.php
│   └─ seeds
│       └─ DatabaseSeeder.php
├─ public
│   ├─ css
│   │   └─ app.css
│   ├─ js
│   │   └─ app.js
│   ├─ svg
│   │   ├─ 403.svg
│   │   ├─ 404.svg
│   │   ├─ 500.svg
│   │   └─ 503.svg
│   ├─ .htaccess
│   ├─ favicon.ico
│   ├─ index.php
│   └─ robots.txt
├─ resources
│   ├─ js
│   │   ├─ components
│   │   │   └─ ExampleComponent.vue
│   │   ├─ app.js
│   │   └─ bootstrap.js
│   ├─ lang
│   │   └─ en
│   │       ├─ auth.php
│   │       ├─ pagination.php
│   │       ├─ passwords.php
│   │       └─ validation.php
│   ├─ sass
│   │   ├─ _variables.scss
│   │   └─ app.scss
│   └─ views
│       ├─ auth
│       │   ├─ passwords
│       │   │   ├─ email.blade.php
│       │   │   └─ reset.blade.php
│       │   ├─ login.blade.php
│       │   ├─ register.blade.php
│       │   └─ verify.blade.php
│       ├─ layouts
│       │   └─ app.blade.php
│       ├─ home.blade.php
│       └─ welcome.blade.php
├─ routes
│   ├─ api.php
│   ├─ channels.php
│   ├─ console.php
│   └─ web.php
├─ storage
│   ├─ app
│   ├─ framework
│   │   ├─ cache
│   │   ├─ sessions
│   │   ├─ testing
│   │   └─ views
│   └─ logs
├─ tests
│   ├─ CreatesApplication.php
│   └─ TestCase.php
├─ .editorconfig
├─ .env
├─ .env.example
├─ .gitattributes
├─ artisan
├─ composer.json
├─ composer.lock
├─ database.sqlite
├─ package.json
├─ phpunit.xml
├─ server.php
├─ webpack.mix.js
└─ yarn.lock
Plain text

جزئیات🔗

پروژه‌ی اولیه، پروژه‌ی لاراول خامی است که روی آن دستور php artisan make:auth اجرا شده و کمی viewهای آن تغییر کرده‌اند.

شما تنها مجاز به تغییر فایل app/Http/Controllers/Auth/LoginController.php هستید، باید کاری کنید که در کنترلر ورود به جای ایمیل از نام کاربری برای ورود استفاده شود.

نکات🔗

  • شما تنها مجاز به تغییر فایل app/Http/Controllers/Auth/LoginController.php هستید، بقیه‌ی تغییرات نادیده گرفته می‌شوند.
  • پس از اعمال تغییرات کل پروژه به غیر از پوشه‌ی vendor را Zip کرده و ارسال کنید.
  • نام فایل Zip اهمیتی ندارد.

درس افزار


در این سوال قصد داریم برای یک دبستان ، درس افزار هوشمند طراحی کنیم.

البته تنها بخش طراحی ارتباط مدل ها برای Eloquent ، به شما سپرده شده است.

پروژه اولیه🔗

پروژه اولیه را از اینجا دانلود کنید. ساختار فایل‌های این پروژه به صورت زیر است:

ocw_initial
├─ app
│   ├─ Console
│   │   └─ Kernel.php
│   ├─ Exceptions
│   │   └─ Handler.php
│   ├─ Http
│   │   ├─ Controllers
│   │   │   ├─ Auth
│   │   │   │   ├─ ForgotPasswordController.php
│   │   │   │   ├─ LoginController.php
│   │   │   │   ├─ RegisterController.php
│   │   │   │   ├─ ResetPasswordController.php
│   │   │   │   └─ VerificationController.php
│   │   │   └─ Controller.php
│   │   ├─ Middleware
│   │   │   ├─ Authenticate.php
│   │   │   ├─ CheckForMaintenanceMode.php
│   │   │   ├─ EncryptCookies.php
│   │   │   ├─ RedirectIfAuthenticated.php
│   │   │   ├─ TrimStrings.php
│   │   │   ├─ TrustProxies.php
│   │   │   └─ VerifyCsrfToken.php
│   │   └─ Kernel.php
│   ├─ Providers
│   │   ├─ AppServiceProvider.php
│   │   ├─ AuthServiceProvider.php
│   │   ├─ BroadcastServiceProvider.php
│   │   ├─ EventServiceProvider.php
│   │   └─ RouteServiceProvider.php
│   ├─ Assignment.php
│   ├─ Classroom.php
│   ├─ Course.php
│   ├─ Grade.php
│   ├─ Score.php
│   ├─ Student.php
│   ├─ Teacher.php
│   └─ User.php
├─ bootstrap
│   ├─ cache
│   └─ app.php
├─ config
│   ├─ app.php
│   ├─ auth.php
│   ├─ broadcasting.php
│   ├─ cache.php
│   ├─ database.php
│   ├─ filesystems.php
│   ├─ hashing.php
│   ├─ logging.php
│   ├─ mail.php
│   ├─ queue.php
│   ├─ services.php
│   ├─ session.php
│   └─ view.php
├─ database
│   ├─ factories
│   │   └─ UserFactory.php
│   ├─ migrations
│   │   ├─ 2014_10_12_000000_create_users_table.php
│   │   ├─ 2014_10_12_100000_create_password_resets_table.php
│   │   ├─ 2018_10_17_210426_create_assignments_table.php
│   │   ├─ 2018_10_17_210433_create_classrooms_table.php
│   │   ├─ 2018_10_17_210438_create_scores_table.php
│   │   ├─ 2018_10_17_210449_create_grades_table.php
│   │   ├─ 2018_10_17_210608_create_students_table.php
│   │   ├─ 2018_10_17_210613_create_teachers_table.php
│   │   ├─ 2018_10_17_212155_create_courses_table.php
│   │   └─ 2018_10_17_214617_create_assignment_student_table.php
│   └─ seeds
│       └─ DatabaseSeeder.php
├─ public
│   ├─ css
│   │   └─ app.css
│   ├─ js
│   │   └─ app.js
│   ├─ svg
│   │   ├─ 403.svg
│   │   ├─ 404.svg
│   │   ├─ 500.svg
│   │   └─ 503.svg
│   ├─ .htaccess
│   ├─ favicon.ico
│   ├─ index.php
│   └─ robots.txt
├─ resources
│   ├─ js
│   │   ├─ components
│   │   │   └─ ExampleComponent.vue
│   │   ├─ app.js
│   │   └─ bootstrap.js
│   ├─ lang
│   │   └─ en
│   │       ├─ auth.php
│   │       ├─ pagination.php
│   │       ├─ passwords.php
│   │       └─ validation.php
│   ├─ sass
│   │   ├─ _variables.scss
│   │   └─ app.scss
│   └─ views
│       └─ welcome.blade.php
├─ routes
│   ├─ api.php
│   ├─ channels.php
│   ├─ console.php
│   └─ web.php
├─ storage
│   ├─ app
│   ├─ framework
│   │   ├─ cache
│   │   ├─ sessions
│   │   ├─ testing
│   │   └─ views
│   └─ logs
├─ tests
│   ├─ CreatesApplication.php
│   └─ TestCase.php
├─ .editorconfig
├─ .env.example
├─ .gitattributes
├─ artisan
├─ composer.json
├─ composer.lock
├─ package.json
├─ phpunit.xml
├─ server.php
└─ webpack.mix.js
Plain text

جزئیات🔗

مدل ها🔗

  1. Assignment : تکلیف
  2. Classroom : کلاس
  3. Course : درس
  4. Grade : پایه تحصیلی
  5. Score : نمره
  6. Student : دانش آموز
  7. Teacher : معلم

ارتباطات مدل ها🔗

  • هر کلاس یک معلم و هر معلم یک کلاس دارد.
  • هر کلاس چندین دانش آموز دارد و هر دانش آموز به یک کلاس اختصاص داده شده است.
  • هر کلاس به یک پایه تحصیلی اختصاص داده شده است و هر پایه تحصیلی چند کلاس دارد.
  • هر پایه تحصیلی چندین درس دارد و هر درس به یک پایه تحصیلی اختصاص داده شده است.
  • هر تکلیف به چندین دانش آموزان اختصاص داده شده و هر دانش آموز نیز چند تکلیف مختص خود دارد.
  • هر نمره به یک درس و یک دانش آموز اختصاص داده شده است. همچنین هر دانش آموز چند نمره و هر درس نیز چند نمره دارد.

مثال🔗

یک نمونه از اجرای این مدل ها شکل زیر است:

$grade = Grade::create();
$classroom = $grade->classrooms()->create();
$teacher = $classroom->teacher()->create();
PHP
  • برای راهنمایی بیشتر می توانید از ستون های ارتباطی موجود در migration ها استفاده کنید.

نکات🔗

  • شما تنها مجاز به تغییر فایل های App/Assignment.php , App/Classroom.php , App/Course.php , App/Grade.php , App/Score.php , App/Student.php , App/Teacher.php هستید، بقیه‌ی تغییرات نادیده گرفته می‌شوند.
  • از migration ها برای فهمیدن آن‌چه باید بنویسید کمک بگیرید.
  • پس از اعمال تغییرات کل پروژه به غیر از پوشه‌ی vendor را Zip کرده و ارسال کنید.
  • نام فایل Zip اهمیتی ندارد.

کوتاه


در این سوال قصد داریم یک کوتاه کننده لینک به کمک لاراول ایجاد کنیم.

طراحی کنترلر های این سیستم به عهده شماست.

پروژه اولیه🔗

پروژه اولیه را از اینجا دانلود کنید. ساختار فایل‌های این پروژه به صورت زیر است:

url-shortener_initial
├─ app
│   ├─ Console
│   │   └─ Kernel.php
│   ├─ Exceptions
│   │   └─ Handler.php
│   ├─ Http
│   │   ├─ Controllers
│   │   │   ├─ Auth
│   │   │   │   ├─ ForgotPasswordController.php
│   │   │   │   ├─ LoginController.php
│   │   │   │   ├─ RegisterController.php
│   │   │   │   ├─ ResetPasswordController.php
│   │   │   │   └─ VerificationController.php
│   │   │   ├─ AdminController.php
│   │   │   ├─ Controller.php
│   │   │   ├─ HomeController.php
│   │   │   └─ OwnerController.php
│   │   ├─ Middleware
│   │   │   ├─ Authenticate.php
│   │   │   ├─ CheckForMaintenanceMode.php
│   │   │   ├─ EncryptCookies.php
│   │   │   ├─ RedirectIfAuthenticated.php
│   │   │   ├─ TrimStrings.php
│   │   │   ├─ TrustProxies.php
│   │   │   └─ VerifyCsrfToken.php
│   │   └─ Kernel.php
│   ├─ Providers
│   │   ├─ AppServiceProvider.php
│   │   ├─ AuthServiceProvider.php
│   │   ├─ BroadcastServiceProvider.php
│   │   ├─ EventServiceProvider.php
│   │   └─ RouteServiceProvider.php
│   ├─ Link.php
│   └─ User.php
├─ bootstrap
│   ├─ cache
│   └─ app.php
├─ config
│   ├─ app.php
│   ├─ auth.php
│   ├─ broadcasting.php
│   ├─ cache.php
│   ├─ database.php
│   ├─ filesystems.php
│   ├─ hashing.php
│   ├─ logging.php
│   ├─ mail.php
│   ├─ queue.php
│   ├─ services.php
│   ├─ session.php
│   └─ view.php
├─ database
│   ├─ factories
│   │   ├─ LinkFactory.php
│   │   └─ UserFactory.php
│   ├─ migrations
│   │   ├─ 2014_10_12_000000_create_users_table.php
│   │   ├─ 2014_10_12_100000_create_password_resets_table.php
│   │   └─ 2018_10_16_141216_create_links_table.php
│   └─ seeds
│       ├─ DatabaseSeeder.php
│       └─ LinksTableSeeder.php
├─ public
│   ├─ css
│   │   └─ app.css
│   ├─ js
│   │   └─ app.js
│   ├─ svg
│   │   ├─ 403.svg
│   │   ├─ 404.svg
│   │   ├─ 500.svg
│   │   └─ 503.svg
│   ├─ .htaccess
│   ├─ favicon.ico
│   ├─ index.php
│   └─ robots.txt
├─ resources
│   ├─ js
│   │   ├─ components
│   │   │   └─ ExampleComponent.vue
│   │   ├─ app.js
│   │   └─ bootstrap.js
│   ├─ lang
│   │   └─ en
│   │       ├─ auth.php
│   │       ├─ pagination.php
│   │       ├─ passwords.php
│   │       └─ validation.php
│   ├─ sass
│   │   ├─ _variables.scss
│   │   └─ app.scss
│   └─ views
│       ├─ layouts
│       │   └─ app.blade.php
│       ├─ admin.blade.php
│       ├─ home.blade.php
│       ├─ login.blade.php
│       └─ owner.blade.php
├─ routes
│   ├─ api.php
│   ├─ channels.php
│   ├─ console.php
│   └─ web.php
├─ storage
│   ├─ app
│   ├─ framework
│   │   ├─ cache
│   │   ├─ sessions
│   │   ├─ testing
│   │   └─ views
│   └─ logs
├─ tests
│   ├─ CreatesApplication.php
│   └─ TestCase.php
├─ .editorconfig
├─ .env.example
├─ .gitattributes
├─ artisan
├─ composer.json
├─ composer.lock
├─ package.json
├─ phpunit.xml
├─ server.php
└─ webpack.mix.js
Plain text

جزئیات🔗

کلاس‌ها🔗

App\Http\Controllers\HomeController🔗

visitLink()🔗

این تابع باید در صورت معتبر بودن آدرس کوتاه شده ورودی ، آدرس هدف را یافته و کاربر را به آن صفحه Redirect کند و در صورت نامعتبر بودن آدرس کوتاه شده، کاربر را با Session(message) با محتوای Invalid به صفحه اصلی سایت Redirect کند.

App\Http\Controllers\AdminController🔗

addLink()🔗

این تابع باید در صورت معتبر بودن لینک ورودی ، یک آدرس کوتاه شده و یک آدرس رمز بصورت تصادفی ایجاد کند، اطلاعات مربوط به لینک را در پایگاه داده ذخیره کرده و در انتها Session(shortened) و Session(password) را بطور صحیح تنظیم کند. این تابع در انتها باید کاربر را به صفحه اصلی سایت Redirect کند.

adminLink()🔗

این تابع باید در صورت معتبر بودن آدرس رمز، View مربوط به خود (admin) را با محتوای صحیح نمایش دهد. در صورت نامعتبر بودن آدرس رمز، کاربر را با Session(message) با محتوای Invalid به صفحه اصلی سایت Redirect کند.

editLink()🔗

این تابع باید در صورت معتبر بودن آدرس رمز و اطلاعات ورودی، اطلاعات لینک را به اطلاعات ورودی تغییر دهد (در صورت تکراری بودن آدرس رمز یا آدرس کوتاه شده، از تغییر پارامتر تکراری چشم پوشی کنید) و کاربر را به آدرس رمز Redirect کند. . در صورت نامعتبر بودن آدرس رمز، کاربر را با Session(message) با محتوای Invalid به صفحه اصلی سایت Redirect کند.

App\Http\Controllers\OwnerController🔗

index()🔗

این تابع باید اگر کاربر به عنوان صاحب سایت احراز هویت شده بود View مربوط به خود (owner) را با محتوای صحیح نمایش دهد. در غیر این صورت کاربر را به صفحه Login، Redirect می کند.

login()🔗

این تابع باید اگر کاربر به عنوان صاحب سایت احراز هویت نشده بود View مربوط به خود (login) را نمایش دهد. در غیر این صورت کاربر را به صفحه Owner، Redirect می کند.

authenticate()🔗

این تابع باید معتبر بودن رمز صاحب سایت را بررسی کند، در صورت صحیح بودن، تنظیمات مورد نیاز را انجام داده و سپس کاربر را به صفحه Owner، Redirect کند. در غیر این صورت کاربر را به صفحه Login، Redirect کند.

  • تمام احراز هویت ها باید با استفاده از Session(IsOwner) با مقادیر true یا false انجام شود.

  • برای بررسی معتبر بودن مقادیر ورودی از Validation استفاده کنید.

  • هر لینک باید تنها برای تعدادی محدودی مشاهده معتبر باشد، که تعداد دفعات باقیمانده مشاهده هر لینک از روی ستون expire_after_clicks در جدول links بدست می آید و در ابتدا باید برای هر لینک مقدار آن 50 باشد. بعد از 0 شدن این عدد لینک کوتاه شده نامعتبر می شود.

  • رمز صاحب سایت در فایل .env با کلید SUPER_ADMIN_PASS قرار داده شده است.

نکات🔗

  • شما تنها مجاز به تغییر فایل های app/Http/Controllers/AdminController.php و app/Http/Controllers/HomeController.php و app/Http/Controllers/OwnerController.php هستید، بقیه‌ی تغییرات نادیده گرفته می‌شوند.
  • از view, route , migration ها برای فهمیدن آن‌چه باید بنویسید کمک بگیرید.
  • پس از اعمال تغییرات کل پروژه به غیر از پوشه‌ی vendor را Zip کرده و ارسال کنید.
  • نام فایل Zip اهمیتی ندارد.

سیستم مسابقات


در این سوال قصد داریم سیستم برگزاری آزمون آنلاین، (چیزی شبیه به Quera) طراحی کنیم.

این سیستم تنها قابلیت برگزاری یک آزمون را دارد و سوالات آزمون کوتاه‌پاسخ اند.

  • لیست سوالات آزمون
  • لیست ارسال‌ها
  • جدول امتیازات
  • داوری ارسال‌ها

پروژه اولیه🔗

پروژه اولیه را از اینجا دانلود کنید. ساختار فایل‌های این پروژه به صورت زیر است:

contest_initial
├─ app
│   ├─ Console
│   │   └─ Kernel.php
│   ├─ Database
│   │   ├─ Problem.php
│   │   ├─ Submission.php
│   │   └─ User.php
│   ├─ Exceptions
│   │   └─ Handler.php
│   ├─ Http
│   │   ├─ Controllers
│   │   │   ├─ Auth
│   │   │   │   ├─ ForgotPasswordController.php
│   │   │   │   ├─ LoginController.php
│   │   │   │   ├─ RegisterController.php
│   │   │   │   ├─ ResetPasswordController.php
│   │   │   │   └─ VerificationController.php
│   │   │   ├─ Controller.php
│   │   │   ├─ ProblemController.php
│   │   │   ├─ ScoreboardController.php
│   │   │   └─ SubmissionController.php
│   │   ├─ Middleware
│   │   │   ├─ Authenticate.php
│   │   │   ├─ CheckForMaintenanceMode.php
│   │   │   ├─ EncryptCookies.php
│   │   │   ├─ RedirectIfAuthenticated.php
│   │   │   ├─ TrimStrings.php
│   │   │   ├─ TrustProxies.php
│   │   │   └─ VerifyCsrfToken.php
│   │   └─ Kernel.php
│   └─ Providers
│       ├─ AppServiceProvider.php
│       ├─ AuthServiceProvider.php
│       ├─ BroadcastServiceProvider.php
│       ├─ EventServiceProvider.php
│       └─ RouteServiceProvider.php
├─ bootstrap
│   ├─ cache
│   └─ app.php
├─ config
│   ├─ app.php
│   ├─ auth.php
│   ├─ broadcasting.php
│   ├─ cache.php
│   ├─ database.php
│   ├─ filesystems.php
│   ├─ hashing.php
│   ├─ logging.php
│   ├─ mail.php
│   ├─ queue.php
│   ├─ services.php
│   ├─ session.php
│   └─ view.php
├─ database
│   ├─ factories
│   │   └─ UserFactory.php
│   ├─ migrations
│   │   ├─ 2014_10_12_000000_create_users_table.php
│   │   ├─ 2014_10_12_100000_create_password_resets_table.php
│   │   └─ 2018_10_17_214246_contest.php
│   └─ seeds
│       └─ DatabaseSeeder.php
├─ public
│   ├─ css
│   │   └─ app.css
│   ├─ js
│   │   └─ app.js
│   ├─ svg
│   │   ├─ 403.svg
│   │   ├─ 404.svg
│   │   ├─ 500.svg
│   │   └─ 503.svg
│   ├─ .htaccess
│   ├─ favicon.ico
│   ├─ index.php
│   └─ robots.txt
├─ resources
│   ├─ js
│   │   ├─ components
│   │   │   └─ ExampleComponent.vue
│   │   ├─ app.js
│   │   └─ bootstrap.js
│   ├─ lang
│   │   └─ en
│   │       ├─ auth.php
│   │       ├─ pagination.php
│   │       ├─ passwords.php
│   │       └─ validation.php
│   ├─ sass
│   │   ├─ _variables.scss
│   │   └─ app.scss
│   └─ views
│       ├─ auth
│       │   ├─ passwords
│       │   │   ├─ email.blade.php
│       │   │   └─ reset.blade.php
│       │   ├─ login.blade.php
│       │   ├─ register.blade.php
│       │   └─ verify.blade.php
│       ├─ layouts
│       │   └─ app.blade.php
│       ├─ problem.blade.php
│       ├─ problems.blade.php
│       ├─ scoreboard.blade.php
│       └─ submissions.blade.php
├─ routes
│   ├─ api.php
│   ├─ channels.php
│   ├─ console.php
│   └─ web.php
├─ storage
│   ├─ app
│   ├─ framework
│   │   ├─ cache
│   │   ├─ sessions
│   │   ├─ testing
│   │   └─ views
│   └─ logs
├─ tests
│   ├─ Feature
│   │   └─ Example1Test.php
│   ├─ CreatesApplication.php
│   └─ TestCase.php
├─ .editorconfig
├─ .env
├─ .env.example
├─ .gitattributes
├─ artisan
├─ composer.json
├─ composer.lock
├─ package.json
├─ phpunit.xml
├─ server.php
└─ webpack.mix.js
Plain text

جزئیات🔗

جدول‌های پایگاه داده به شرح زیر است:

users🔗

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

  • id: شناسه‌ی کاربر
  • name: نام نمایشی کاربر
  • email: ایمیل کاربر
  • password: رمز کاربر

problems🔗

این جدول شامل اطلاعات پرسش‌ها است که در فیلد‌های زیر ذخیره شده اند :

  • id: شناسه‌ی پرسش
  • subject: عنوان پرسش
  • content: محتوای پرسش

submissions🔗

این جدول شامل اطلاعات ارسال‌ها است که در فیلد‌های زیر ذخیره شده اند :

  • id: شناسه‌ی ارسال
  • user_id: شناسه‌ی کاربر ارسال‌کننده‌ی پاسخ
  • problem_id: شناسه‌ی سوالی که ارسال برای آن انجام شده‌است.
  • answer: پاسخ ارسالی
  • status: وضعیت پاسخ
    • 0: به معنی داوری نشده
    • 1: به معنی داوری شده و درست
    • 2: به معنی داوری شده و غلط
  • submitted_at: زمانی که پاسخ ارسال شده‌است

بخش‌هایی از این سیستم پیاده‌سازی شده‌است و شما کافی‌ است بخش‌های زیر را پیاده‌سازی کنید:

پرسش‌ها🔗

در صفحه‌ی نخست سایت بخشی برای ورود به سایت و بخشی برای نمایش لیست پرسش‌های مسابقه باشد.

صفحه‌ی پرسش🔗

کاربر با کلیک بر روی هر یک از پرسش‌ها به صفحه‌ی پرسش برود که صفحه‌ی پرسش دو قسمت دارد.

  1. بخش نمایش پرسش که عنوان و متن پرسش را نشان بدهد.
  2. بخش ارسال پاسخ، در صورتی که کاربر وارد سایت شده‌بود، باید فرمی برای ارسال پاسخ به او نشان داده‌شود.

بخش ارسال پاسخ🔗

در صورتی که کاربر وارد سایت شده بود پاسخ او به عنوان یک sumbission داوری نشده ثبت شود و به صفحه‌ی ارسال‌ها منتقل شود و در غیر این‌صورت خطای ۴۰۳ بدهد.

صفحه‌ی ارسال‌ها🔗

در صورتی که کاربری وارد سایت شده‌بود در این بخش تمام ارسال‌های انجام شده توسط خودش را ببیند در غیر این‌صورت خطای ۴۰۳ بدهد.

رتبه‌بندی🔗

در این صفحه لیست رتبه‌بندی تمام کاربران شامل رتبه‌ی آن‌ها، پنالتی گرفته شده و تعداد پرسش‌های حل شده‌ی هر کاربر نمایش داده می شود.

منظور از پنالتی یک کاربر مجموع پنالتی پرسش‌هایی که کاربر توانسته در انتها به آن‌ها پاسخ بدهد است.

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

نفر aa از نفر bb رتبه بهتری دارد اگر تعداد پرسش‌های حل‌شده توسط aa از bb بیشتر باشد و در صورت برابری تعداد پرسش‌های حل‌شده، پنالتی کمتری داشته‌باشد.

دقت کنید که زمان شروع کانتست داخل فایل .env تنظیم شده‌است و تمام کاربران (چه ارسالی داشته‌اند یا نداشته‌اند) در رتبه‌بندی می‌آیند.

داوری🔗

با دستور php artisan judge باید داوری اجرا شود.

اولین ارسال داوری نشده به ترتیب زمان ارسال را برای داوری انتخاب می‌کند. سپس در صورت وجود ارسال، اطلاعاتی به شکل زیر نمایش می‌دهد:

Problem ID: {problem_id}
Answer: {answer}
Plain text

که {problem_id} شناسه‌ی سوالی است که ارسال برای آن انجام شده و {answer} پاسخ ارسالی است. سپس یک سوال با محتوا Is it OK? می‌پرسد که در صورتی که yes وارد شود ارسال به عنوان پاسخ صحیح علامت‌گذاری و در غیر این‌صورت به عنوان پاسخ غلط علامت‌گذاری می‌شود.

نکات🔗

  • شما مجاز به تغییر همه‌ی فایل‌های داخل پوشه‌ی app/ هستید.
  • حق تغییر در ساختار اصلی مدل‌ها را ندارید اما می‌توانید فیلد‌ها و ریلیشن‌های دلخواهتان را به آن اضافه کنید.
  • از viewها برای فهمیدن آن‌چه باید بنویسید کمک بگیرید.
  • پس از اعمال تغییرات کل پروژه به غیر از پوشه‌ی vendor را Zip کرده و ارسال کنید.
  • نام فایل Zip اهمیتی ندارد.