در این سوال قصد داریم تغییر کوچکی در سیستم ورود لاراول ایجاد کنیم.
`Authentication` پیشفرض لاراول ورود را با ایمیل بررسی میکند، اما ما دوست داریم کاربران با نام کاربریای که در هنگام ثبتنام وارد میکنند وارد سایت شوند، به همین دلیل در این امر از شما کمک میخواهیم.
# پروژه اولیه
پروژه اولیه را از
[اینجا](http://bayanbox.ir/download/1321519985967862558/authentication-initial.zip)
دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
```
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
```
# جزئیات
پروژهی اولیه، پروژهی لاراول خامی است که روی آن دستور `php artisan make:auth` اجرا شده و کمی `view`های آن تغییر کردهاند.
شما تنها مجاز به تغییر فایل `app/Http/Controllers/Auth/LoginController.php` هستید، باید کاری کنید که در کنترلر ورود به جای ایمیل از نام کاربری برای ورود استفاده شود.
# نکات
- شما تنها مجاز به تغییر فایل `app/Http/Controllers/Auth/LoginController.php` هستید، بقیهی تغییرات نادیده گرفته میشوند.
- پس از اعمال تغییرات کل پروژه به غیر از پوشهی `vendor` را _Zip_ کرده و ارسال کنید.
- نام فایل Zip اهمیتی ندارد.
در این سوال قصد داریم برای یک دبستان ، درس افزار هوشمند طراحی کنیم.
البته تنها بخش طراحی ارتباط مدل ها برای `Eloquent` ، به شما سپرده شده است.
# پروژه اولیه
پروژه اولیه را از
[اینجا](http://bayanbox.ir/download/8187669729275658244/ocw-initial.zip)
دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
```
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
```
# جزئیات
## مدل ها
1. `Assignment` : تکلیف
2. `Classroom` : کلاس
3. `Course` : درس
4. `Grade` : پایه تحصیلی
5. `Score` : نمره
6. `Student` : دانش آموز
7. `Teacher` : معلم
### ارتباطات مدل ها
+ هر کلاس یک معلم و هر معلم یک کلاس دارد.
+ هر کلاس چندین دانش آموز دارد و هر دانش آموز به یک کلاس اختصاص داده شده است.
+ هر کلاس به یک پایه تحصیلی اختصاص داده شده است و هر پایه تحصیلی چند کلاس دارد.
+ هر پایه تحصیلی چندین درس دارد و هر درس به یک پایه تحصیلی اختصاص داده شده است.
+ هر تکلیف به چندین دانش آموزان اختصاص داده شده و هر دانش آموز نیز چند تکلیف مختص خود دارد.
+ هر نمره به یک درس و یک دانش آموز اختصاص داده شده است. همچنین هر دانش آموز چند نمره و هر درس نیز چند نمره دارد.
## مثال
یک نمونه از اجرای این مدل ها شکل زیر است:
```php
$grade = Grade::create();
$classroom = $grade->classrooms()->create();
$teacher = $classroom->teacher()->create();
```
+ برای راهنمایی بیشتر می توانید از ستون های ارتباطی موجود در `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 اهمیتی ندارد.
در این سوال قصد داریم یک کوتاه کننده لینک به کمک لاراول ایجاد کنیم.
طراحی کنترلر های این سیستم به عهده شماست.
# پروژه اولیه
پروژه اولیه را از
[اینجا](http://bayanbox.ir/download/1588563219113169092/url-shortener-initial.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
```
# جزئیات
## کلاسها
### `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) طراحی کنیم.
این سیستم تنها قابلیت برگزاری یک آزمون را دارد و سوالات آزمون کوتاهپاسخ اند.
- لیست سوالات آزمون
- لیست ارسالها
- جدول امتیازات
- داوری ارسالها
# پروژه اولیه
پروژه اولیه را از
[اینجا](http://bayanbox.ir/download/2261348370094388608/contest-initial.zip)
دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
```
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
```
# جزئیات
جدولهای پایگاه داده به شرح زیر است:
### 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 داوری نشده ثبت شود و به صفحهی ارسالها منتقل شود و در غیر اینصورت خطای ۴۰۳ بدهد.
### صفحهی ارسالها
در صورتی که کاربری وارد سایت شدهبود در این بخش تمام ارسالهای انجام شده توسط خودش را ببیند در غیر اینصورت خطای ۴۰۳ بدهد.
### رتبهبندی
در این صفحه لیست رتبهبندی تمام کاربران شامل رتبهی آنها، پنالتی گرفته شده و تعداد پرسشهای حل شدهی هر کاربر نمایش داده می شود.
منظور از پنالتی یک کاربر مجموع پنالتی پرسشهایی که کاربر توانسته در انتها به آنها پاسخ بدهد است.
پنالتی یک پرسش حلشده مثل $p$ برای کاربری مثل $u$ برابر با زمان ثبت اولین ارسال درست برای آن پرسش توسط $u$ از زمان شروع مسابقه به دقیقه، بهاضافهی بیست برابر تعداد ارسالهای غلط ثبتشده توسط $u$ برای پرسش $p$ قبل از زمان ارسال اولین پاسخ صحیح توسط $u$ برای پرسش $p$ است.
نفر $a$ از نفر $b$ رتبه بهتری دارد اگر تعداد پرسشهای حلشده توسط $a$ از $b$ بیشتر باشد و در صورت برابری تعداد پرسشهای حلشده، پنالتی کمتری داشتهباشد.
دقت کنید که زمان شروع کانتست داخل فایل `.env` تنظیم شدهاست و تمام کاربران (چه ارسالی داشتهاند یا نداشتهاند) در رتبهبندی میآیند.
### داوری
با دستور `php artisan judge` باید داوری اجرا شود.
اولین ارسال داوری نشده به ترتیب زمان ارسال را برای داوری انتخاب میکند. سپس در صورت وجود ارسال، اطلاعاتی به شکل زیر نمایش میدهد:
```
Problem ID: {problem_id}
Answer: {answer}
```
که `{problem_id}` شناسهی سوالی است که ارسال برای آن انجام شده و `{answer}` پاسخ ارسالی است.
سپس یک سوال با محتوا `Is it OK?` میپرسد که در صورتی که `yes` وارد شود ارسال به عنوان پاسخ صحیح علامتگذاری و در غیر اینصورت به عنوان پاسخ غلط علامتگذاری میشود.
# نکات
- شما مجاز به تغییر همهی فایلهای داخل پوشهی `app/` هستید.
- حق تغییر در ساختار اصلی مدلها را ندارید اما میتوانید فیلدها و ریلیشنهای دلخواهتان را به آن اضافه کنید.
- از `view`ها برای فهمیدن آنچه باید بنویسید کمک بگیرید.
- پس از اعمال تغییرات کل پروژه به غیر از پوشهی `vendor` را _Zip_ کرده و ارسال کنید.
- نام فایل Zip اهمیتی ندارد.