From d3f517d5087782c5e81b4ec2fffb72c8364d7a09 Mon Sep 17 00:00:00 2001 From: Dawid Lisiecki Date: Tue, 10 Dec 2019 16:36:11 +0100 Subject: [PATCH] =?UTF-8?q?Zintegorwano=20detektor=20twarzy=20z=20backende?= =?UTF-8?q?m.=20Utworzono=20modele=20i=20migracje=20dla=20u=C5=BCytkownik?= =?UTF-8?q?=C3=B3w,=20ksi=C4=85=C5=BCek=20oraz=20komentarzy.=20Przygotowan?= =?UTF-8?q?o=20w=20pe=C5=82ni=20funkcjonalne=20widoki=20dla=20dodawania=20?= =?UTF-8?q?ksi=C4=85=C5=BCek,=20przegl=C4=85dania=20user=C3=B3w=20i=20prze?= =?UTF-8?q?gl=C4=85dania=20ksi=C4=85=C5=BCek.=20Dodano=20podstawowe=20zabe?= =?UTF-8?q?zpieczenia=20i=20walidacje.=20Przygotowano=20modele=20dla=20edy?= =?UTF-8?q?cji=20i=20usuwania=20ksi=C4=85=C5=BCek.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Library/.editorconfig | 3 + Library/.idea/Library.iml | 5 + Library/.idea/php.xml | 5 + .../Controllers/Auth/RegisterController.php | 26 +- .../app/Http/Controllers/BookController.php | 91 ++++ .../app/Http/Controllers/HomeController.php | 17 +- .../app/Http/Controllers/UserController.php | 24 ++ Library/app/Http/Kernel.php | 1 + .../app/Http/Middleware/BookPermission.php | 21 + Library/app/Http/Request/BookRequest.php | 33 ++ Library/app/Models/Book.php | 45 ++ Library/app/Models/Comment.php | 26 ++ Library/app/Models/User.php | 74 ++++ Library/app/User.php | 39 -- Library/composer.json | 3 + Library/composer.lock | 406 ++++++++++++++++-- Library/config/auth.php | 2 +- .../2014_10_12_000000_create_users_table.php | 4 + .../2019_12_10_140611_create_books_table.php | 37 ++ ...019_12_10_140659_create_comments_table.php | 36 ++ Library/resources/images/default-avatar.jpg | Bin 12741 -> 19252 bytes Library/resources/js/facedatection.js | 2 + Library/resources/sass/app.scss | 4 + Library/resources/sass/sections/book.scss | 5 + Library/resources/sass/sections/books.scss | 10 + Library/resources/sass/sections/user.scss | 10 + Library/resources/sass/sections/users.scss | 27 ++ .../resources/views/auth/register.blade.php | 4 +- Library/resources/views/book/create.blade.php | 68 +++ Library/resources/views/book/show.blade.php | 39 ++ Library/resources/views/home.blade.php | 47 +- Library/resources/views/layouts/app.blade.php | 4 +- Library/resources/views/user/layout.blade.php | 33 ++ Library/resources/views/user/show.blade.php | 20 + Library/routes/breadcrumbs.php | 18 + Library/routes/web.php | 22 +- Library/storage/debugbar/.gitignore | 2 + 37 files changed, 1091 insertions(+), 122 deletions(-) create mode 100644 Library/app/Http/Controllers/BookController.php create mode 100644 Library/app/Http/Controllers/UserController.php create mode 100644 Library/app/Http/Middleware/BookPermission.php create mode 100644 Library/app/Http/Request/BookRequest.php create mode 100644 Library/app/Models/Book.php create mode 100644 Library/app/Models/Comment.php create mode 100644 Library/app/Models/User.php delete mode 100644 Library/app/User.php create mode 100644 Library/database/migrations/2019_12_10_140611_create_books_table.php create mode 100644 Library/database/migrations/2019_12_10_140659_create_comments_table.php create mode 100644 Library/resources/sass/sections/book.scss create mode 100644 Library/resources/sass/sections/books.scss create mode 100644 Library/resources/sass/sections/user.scss create mode 100644 Library/resources/sass/sections/users.scss create mode 100644 Library/resources/views/book/create.blade.php create mode 100644 Library/resources/views/book/show.blade.php create mode 100644 Library/resources/views/user/layout.blade.php create mode 100644 Library/resources/views/user/show.blade.php create mode 100644 Library/routes/breadcrumbs.php create mode 100644 Library/storage/debugbar/.gitignore diff --git a/Library/.editorconfig b/Library/.editorconfig index 6537ca4..26ef3ca 100644 --- a/Library/.editorconfig +++ b/Library/.editorconfig @@ -8,6 +8,9 @@ indent_style = space indent_size = 4 trim_trailing_whitespace = true +[*.scss] +indent_size = 2 + [*.md] trim_trailing_whitespace = false diff --git a/Library/.idea/Library.iml b/Library/.idea/Library.iml index 91de2b0..861ac01 100644 --- a/Library/.idea/Library.iml +++ b/Library/.idea/Library.iml @@ -4,7 +4,11 @@ + + + + @@ -25,6 +29,7 @@ + diff --git a/Library/.idea/php.xml b/Library/.idea/php.xml index 07f5143..b53c0f4 100644 --- a/Library/.idea/php.xml +++ b/Library/.idea/php.xml @@ -88,6 +88,11 @@ + + + + + diff --git a/Library/app/Http/Controllers/Auth/RegisterController.php b/Library/app/Http/Controllers/Auth/RegisterController.php index 6fdcba0..572c58e 100644 --- a/Library/app/Http/Controllers/Auth/RegisterController.php +++ b/Library/app/Http/Controllers/Auth/RegisterController.php @@ -3,7 +3,8 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\User; +use App\Models\User; +use \Cviebrock\EloquentSluggable\Services\SlugService; use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; @@ -28,7 +29,7 @@ class RegisterController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. @@ -49,6 +50,8 @@ class RegisterController extends Controller protected function validator(array $data) { return Validator::make($data, [ + 'avatar' => ['required', 'max:1500'], + 'avatar_rating' => ['required', 'numeric', 'min:0', 'max:10' ], 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => ['required', 'string', 'min:8', 'confirmed'], @@ -63,10 +66,25 @@ class RegisterController extends Controller */ protected function create(array $data) { - return User::create([ + $user = User::create([ + 'avatar' => NULL, + 'avatar_rating' => $data['avatar_rating'], 'name' => $data['name'], 'email' => $data['email'], - 'password' => Hash::make($data['password']), + 'password' => bcrypt($data['password']), ]); + if($data['avatar_rating'] === '10') { + $user->update([ + 'user_verified_at' => now(), + ]); + } + if (isset($data['avatar'])) { + $upload_path = 'public/users/user_'.$user->id.'/avatars'; + $avatar_path = $data['avatar']->store($upload_path); + $user->update([ + 'avatar' => $avatar_path, + ]); + } + return $user; } } diff --git a/Library/app/Http/Controllers/BookController.php b/Library/app/Http/Controllers/BookController.php new file mode 100644 index 0000000..ad9cbd8 --- /dev/null +++ b/Library/app/Http/Controllers/BookController.php @@ -0,0 +1,91 @@ +middleware('BookPermission', ['only' => ['edit', 'update', 'destroy']]); + $this->middleware('auth', ['only' => ['create']]); + } + + /** + * Show the form for creating a new resource. + */ + public function create(User $user) + { + return view('book.create', [ + 'user' => $user + ]); + } + + /** + * Store a newly created resource in storage. + */ + public function store(BookRequest $request) + { + $upload_path = 'public/users/user_' . Auth::id() . '/books'; + $photo_path = $request->file('photo')->store($upload_path); + $book = Book::create([ + 'user_id' => Auth::id(), + 'photo' => $photo_path, + 'name' => $request->name, + 'description' => $request->description + ]); + + return redirect()->route('book.show', $book); + } + + /** + * Display the specified resource. + */ + public function show(Book $book) + { + return view('book.show', [ + 'book' => $book->load('comments', 'comments.user', 'user') + ]); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Book $book) + { + return view('book.edit', [ + 'book' => $book, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(BookRequest $request, Book $book) + { + if ($request->file('photo')) { + $upload_path = 'public/users/user_' . Auth::id() . '/books/'; + $photo_path = $request->file('photo')->store($upload_path); + $book->photo = $photo_path; + } + $book->name = $request->name; + $book->description = $request->description; + $book->save(); + + return redirect()->route('book.show', ['book' => $book]); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Book $book) + { + $book->delete(); + return redirect()->route('user.show', ['book' => $book->user()]); + + } +} diff --git a/Library/app/Http/Controllers/HomeController.php b/Library/app/Http/Controllers/HomeController.php index 7cbc2c3..11c4de5 100644 --- a/Library/app/Http/Controllers/HomeController.php +++ b/Library/app/Http/Controllers/HomeController.php @@ -3,19 +3,11 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; +use App\Models\Book; +use App\Models\User; class HomeController extends Controller { - /** - * Create a new controller instance. - * - * @return void - */ - public function __construct() - { - $this->middleware('auth'); - } - /** * Show the application dashboard. * @@ -23,6 +15,9 @@ class HomeController extends Controller */ public function index() { - return view('home'); + return view('home', [ + 'books' => Book::orderBy('created_at','desc')->take(5)->get(), + 'users' => User::orderBy('created_at','desc')->take(5)->get(), + ]); } } diff --git a/Library/app/Http/Controllers/UserController.php b/Library/app/Http/Controllers/UserController.php new file mode 100644 index 0000000..c189e97 --- /dev/null +++ b/Library/app/Http/Controllers/UserController.php @@ -0,0 +1,24 @@ +middleware('UserPermission', ['only' => ['edit', 'update', 'destroy']]); + } + + /** + * Display the specified resource. + */ + public function show(User $user) + { + return view('user.show', [ + 'user' => $user->load('books'), + ]); + } +} diff --git a/Library/app/Http/Kernel.php b/Library/app/Http/Kernel.php index 2741c0a..ea04643 100644 --- a/Library/app/Http/Kernel.php +++ b/Library/app/Http/Kernel.php @@ -54,6 +54,7 @@ class Kernel extends HttpKernel 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, + 'BookPermission' => \App\Http\Middleware\BookPermission::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, diff --git a/Library/app/Http/Middleware/BookPermission.php b/Library/app/Http/Middleware/BookPermission.php new file mode 100644 index 0000000..40a861c --- /dev/null +++ b/Library/app/Http/Middleware/BookPermission.php @@ -0,0 +1,21 @@ +book->user_id != Auth::id()) { + abort(403, 'Access denied'); + } + return $next($request); + } +} diff --git a/Library/app/Http/Request/BookRequest.php b/Library/app/Http/Request/BookRequest.php new file mode 100644 index 0000000..2cafbbb --- /dev/null +++ b/Library/app/Http/Request/BookRequest.php @@ -0,0 +1,33 @@ + 'max:1500|required', + 'name' => 'string|max:100', + 'description' => 'required|string|max:255', + ]; + } + +} diff --git a/Library/app/Models/Book.php b/Library/app/Models/Book.php new file mode 100644 index 0000000..4005562 --- /dev/null +++ b/Library/app/Models/Book.php @@ -0,0 +1,45 @@ + [ + 'source' => 'name' + ] + ]; + } + + public function user() + { + return $this->belongsTo(User::class); + } + + public function comments() + { + return $this->hasMany(Comment::class); + } +} diff --git a/Library/app/Models/Comment.php b/Library/app/Models/Comment.php new file mode 100644 index 0000000..71d16a3 --- /dev/null +++ b/Library/app/Models/Comment.php @@ -0,0 +1,26 @@ +belongsTo(Book::class); + } + + public function user() + { + return $this->belongsTo(User::class); + } + +} diff --git a/Library/app/Models/User.php b/Library/app/Models/User.php new file mode 100644 index 0000000..fb5ce18 --- /dev/null +++ b/Library/app/Models/User.php @@ -0,0 +1,74 @@ + 'datetime', + ]; + + public function books() + { + return $this->hasMany(Book::class); + } + + public function comments() + { + return $this->hasMany(Comment::class); + } + + public function getRouteKeyName() + { + return 'slug'; + } + + public function sluggable() + { + return [ + 'slug' => [ + 'source' => 'name' + ] + ]; + } + + public function UserAvatar(){ + if(is_null($this->avatar)){ + $url = asset('images/default-avatar.jpg'); + } + else { + $url = url(Storage::url($this->avatar)); + } + return $url; + } +} diff --git a/Library/app/User.php b/Library/app/User.php deleted file mode 100644 index e79dab7..0000000 --- a/Library/app/User.php +++ /dev/null @@ -1,39 +0,0 @@ - 'datetime', - ]; -} diff --git a/Library/composer.json b/Library/composer.json index bfa54bd..37df675 100644 --- a/Library/composer.json +++ b/Library/composer.json @@ -9,12 +9,15 @@ "license": "MIT", "require": { "php": "^7.2", + "cviebrock/eloquent-sluggable": "^6.0", + "davejamesmiller/laravel-breadcrumbs": "^5.3", "fideloper/proxy": "^4.0", "laravel/framework": "^6.2", "laravel/tinker": "^1.0", "laravel/ui": "^1.1" }, "require-dev": { + "barryvdh/laravel-debugbar": "^3.2", "facade/ignition": "^1.4", "fzaninotto/faker": "^1.4", "mockery/mockery": "^1.0", diff --git a/Library/composer.lock b/Library/composer.lock index 8abc3f6..dec9d3d 100644 --- a/Library/composer.lock +++ b/Library/composer.lock @@ -4,8 +4,195 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1b9e73ad57a9bbfb35d3c7cc0d815d97", + "content-hash": "e8b5db1221abaa3c21d7a4760eb7bbd0", "packages": [ + { + "name": "cocur/slugify", + "version": "v3.2", + "source": { + "type": "git", + "url": "https://github.com/cocur/slugify.git", + "reference": "d41701efe58ba2df9cae029c3d21e1518cc6780e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cocur/slugify/zipball/d41701efe58ba2df9cae029c3d21e1518cc6780e", + "reference": "d41701efe58ba2df9cae029c3d21e1518cc6780e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.5.9" + }, + "require-dev": { + "laravel/framework": "~5.1", + "latte/latte": "~2.2", + "league/container": "^2.2.0", + "mikey179/vfsstream": "~1.6", + "mockery/mockery": "~0.9", + "nette/di": "~2.2", + "phpunit/phpunit": "~4.8.36|~5.2", + "pimple/pimple": "~1.1", + "plumphp/plum": "~0.1", + "silex/silex": "~1.3", + "symfony/config": "~2.4|~3.0|~4.0", + "symfony/dependency-injection": "~2.4|~3.0|~4.0", + "symfony/http-kernel": "~2.4|~3.0|~4.0", + "twig/twig": "~1.26|~2.0", + "zendframework/zend-modulemanager": "~2.2", + "zendframework/zend-servicemanager": "~2.2", + "zendframework/zend-view": "~2.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cocur\\Slugify\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ivo Bathke", + "email": "ivo.bathke@gmail.com" + }, + { + "name": "Florian Eckerstorfer", + "email": "florian@eckerstorfer.co", + "homepage": "https://florian.ec" + } + ], + "description": "Converts a string into a slug.", + "keywords": [ + "slug", + "slugify" + ], + "time": "2019-01-31T20:38:55+00:00" + }, + { + "name": "cviebrock/eloquent-sluggable", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/cviebrock/eloquent-sluggable.git", + "reference": "20f39ae0eeb54c73756834570be7f514fa350cbb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/cviebrock/eloquent-sluggable/zipball/20f39ae0eeb54c73756834570be7f514fa350cbb", + "reference": "20f39ae0eeb54c73756834570be7f514fa350cbb", + "shasum": "" + }, + "require": { + "cocur/slugify": "^3.2", + "illuminate/config": "^6.0", + "illuminate/database": "^6.0", + "illuminate/support": "^6.0", + "php": "^7.2" + }, + "require-dev": { + "limedeck/phpunit-detailed-printer": "^5.0", + "mockery/mockery": "^1.2.3", + "orchestra/database": "4.*", + "orchestra/testbench": "4.*", + "phpunit/phpunit": "^8.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Cviebrock\\EloquentSluggable\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Cviebrock\\EloquentSluggable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin Viebrock", + "email": "colin@viebrock.ca" + } + ], + "description": "Easy creation of slugs for your Eloquent models in Laravel", + "homepage": "https://github.com/cviebrock/eloquent-sluggable", + "keywords": [ + "eloquent", + "eloquent-sluggable", + "laravel", + "lumen", + "slug", + "sluggable" + ], + "time": "2019-10-10T04:32:04+00:00" + }, + { + "name": "davejamesmiller/laravel-breadcrumbs", + "version": "5.3.1", + "source": { + "type": "git", + "url": "https://github.com/davejamesmiller/laravel-breadcrumbs.git", + "reference": "40a73bc9b32fbbee18938dc92228dea161365245" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/davejamesmiller/laravel-breadcrumbs/zipball/40a73bc9b32fbbee18938dc92228dea161365245", + "reference": "40a73bc9b32fbbee18938dc92228dea161365245", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "illuminate/support": "^5.6|^6.0", + "illuminate/view": "^5.6|^6.0", + "php": ">=7.1.3" + }, + "require-dev": { + "orchestra/testbench": "^3.6", + "php-coveralls/php-coveralls": "^1.0", + "phpunit/phpunit": "^7.0|^8.0", + "spatie/phpunit-snapshot-assertions": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "DaveJamesMiller\\Breadcrumbs\\BreadcrumbsServiceProvider" + ], + "aliases": { + "Breadcrumbs": "DaveJamesMiller\\Breadcrumbs\\Facades\\Breadcrumbs" + } + } + }, + "autoload": { + "psr-4": { + "DaveJamesMiller\\Breadcrumbs\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dave James Miller", + "email": "dave@davejamesmiller.com" + } + ], + "description": "A simple Laravel-style way to create breadcrumbs.", + "homepage": "https://github.com/davejamesmiller/laravel-breadcrumbs", + "keywords": [ + "laravel" + ], + "time": "2019-10-20T18:25:39+00:00" + }, { "name": "dnoegel/php-xdg-base-dir", "version": "0.1", @@ -326,6 +513,50 @@ ], "time": "2019-03-17T18:48:37+00:00" }, + { + "name": "facade/ignition-contracts", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", + "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", + "shasum": "" + }, + "require": { + "php": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "time": "2019-08-30T14:06:08+00:00" + }, { "name": "fideloper/proxy", "version": "4.2.1", @@ -2954,6 +3185,74 @@ } ], "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.2.8", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/18208d64897ab732f6c04a19b319fe8f1d57a9c0", + "reference": "18208d64897ab732f6c04a19b319fe8f1d57a9c0", + "shasum": "" + }, + "require": { + "illuminate/routing": "^5.5|^6", + "illuminate/session": "^5.5|^6", + "illuminate/support": "^5.5|^6", + "maximebf/debugbar": "~1.15.0", + "php": ">=7.0", + "symfony/debug": "^3|^4", + "symfony/finder": "^3|^4" + }, + "require-dev": { + "laravel/framework": "5.5.x" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ], + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facade" + } + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "time": "2019-08-29T07:01:03+00:00" + }, { "name": "doctrine/instantiator", "version": "1.3.0", @@ -3135,50 +3434,6 @@ ], "time": "2019-11-14T10:51:35+00:00" }, - { - "name": "facade/ignition-contracts", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition-contracts.git", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/f445db0fb86f48e205787b2592840dd9c80ded28", - "reference": "f445db0fb86f48e205787b2592840dd9c80ded28", - "shasum": "" - }, - "require": { - "php": "^7.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facade\\IgnitionContracts\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://flareapp.io", - "role": "Developer" - } - ], - "description": "Solution contracts for Ignition", - "homepage": "https://github.com/facade/ignition-contracts", - "keywords": [ - "contracts", - "flare", - "ignition" - ], - "time": "2019-08-30T14:06:08+00:00" - }, { "name": "filp/whoops", "version": "2.5.0", @@ -3336,6 +3591,67 @@ ], "time": "2016-01-20T08:20:44+00:00" }, + { + "name": "maximebf/debugbar", + "version": "v1.15.1", + "source": { + "type": "git", + "url": "https://github.com/maximebf/php-debugbar.git", + "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/6c4277f6117e4864966c9cb58fb835cee8c74a1e", + "reference": "6c4277f6117e4864966c9cb58fb835cee8c74a1e", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "psr/log": "^1.0", + "symfony/var-dumper": "^2.6|^3|^4" + }, + "require-dev": { + "phpunit/phpunit": "^5" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.15-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug", + "debugbar" + ], + "time": "2019-09-24T14:55:42+00:00" + }, { "name": "mockery/mockery", "version": "1.2.4", diff --git a/Library/config/auth.php b/Library/config/auth.php index aaf982b..ba1a4d8 100644 --- a/Library/config/auth.php +++ b/Library/config/auth.php @@ -68,7 +68,7 @@ return [ 'providers' => [ 'users' => [ 'driver' => 'eloquent', - 'model' => App\User::class, + 'model' => App\Models\User::class, ], // 'users' => [ diff --git a/Library/database/migrations/2014_10_12_000000_create_users_table.php b/Library/database/migrations/2014_10_12_000000_create_users_table.php index a91e1d3..1edd959 100644 --- a/Library/database/migrations/2014_10_12_000000_create_users_table.php +++ b/Library/database/migrations/2014_10_12_000000_create_users_table.php @@ -15,7 +15,11 @@ class CreateUsersTable extends Migration { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); + $table->string('avatar')->nullable(); + $table->integer('avatar_rating')->nullable(); + $table->timestamp('user_verified_at')->nullable(); $table->string('name'); + $table->string('slug')->unique(); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); diff --git a/Library/database/migrations/2019_12_10_140611_create_books_table.php b/Library/database/migrations/2019_12_10_140611_create_books_table.php new file mode 100644 index 0000000..1f168ad --- /dev/null +++ b/Library/database/migrations/2019_12_10_140611_create_books_table.php @@ -0,0 +1,37 @@ +bigIncrements('id'); + $table->bigInteger('user_id')->unsigned(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->string('photo'); + $table->string('name'); + $table->string('slug')->unique(); + $table->string('description'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('books'); + } +} diff --git a/Library/database/migrations/2019_12_10_140659_create_comments_table.php b/Library/database/migrations/2019_12_10_140659_create_comments_table.php new file mode 100644 index 0000000..3e8afb0 --- /dev/null +++ b/Library/database/migrations/2019_12_10_140659_create_comments_table.php @@ -0,0 +1,36 @@ +bigIncrements('id'); + $table->bigInteger('book_id')->unsigned(); + $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade'); + $table->integer('user_id')->unsigned(); + $table->string('comment'); + $table->dateTime('edited_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('comments'); + } +} diff --git a/Library/resources/images/default-avatar.jpg b/Library/resources/images/default-avatar.jpg index 9c474861eb77f59acde6ffce898e946445648222..63c8cb642fe082457a2f0ac093c4b4f074ae096e 100644 GIT binary patch literal 19252 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 literal 12741 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%0DkxxAZ6y zxA6Z8@qyoA{LJ7TC-Ea}>vNnLAbyJ@B`vTxenZmN7xCT&u|}gl3wPp-%qa-w$Vh;z zp^nWRr*)+ly3u`k%$+$V6PpmXhhgc?d%{XLCi17z0K=N>S{CabntvpchaAlJR&_lw zaIKHH&$T9fz5%228wjJ9AF7~v^8WkuV=>&AzZvAo*I#KI@~(7*su7Cb@LJvP4;Z-? zq%_sqpF8R2#iwH7({nO&kGs+DEXR4WbJYxH!q8C^GK7kcVd2UwyrpjMDcd-rfC2Qt;PquMw}O1&Av``YtB#C-Bxu3I$$~ zpb;8|;G&S0gn03U0B=UZhjTyX8Wx<~&lh?2=)zGo} zsx>K#+vmb>{4{VkSh_YfGH9A|X+d-hsWEudcU<+pK1)(u&@%f3Lru!3&v%9QjMX5< zISy6)LkKS)&6C0fEk7Wbj*f)5`j0`!p8Z^tU;A9e@M}6vVOejVzMQ{az1k|q^269o zHeda`d zzv^q?6c)2SI=pP}{FOgdHP(e1lkHhT;1M0FbyEVAk2~16l+$@EW zW}#Ns%;_I6tY9q)q%edOtxT+WG!^tZTc^8I%K4R&k)Q3)SA*35unW~5g~KYvxB*7L!vqIE>m>@~uPdxk3< z8GO}{XJIEg1$@Hrgq%AwsostF{_;de*=ntK;oZw98GN6UXLPT@Gdbp-=EJ$hcTd`C z8h?)0EDOysTzqlI=x$(vXCu1ro{93!I43!3(p}6!1Q>BpD4cpT34jsDFJ*|*KwG-y zlsAC6AS7vgq5HGN`lTnRO^m&l%;C{ODMi15IOknjK#UV9x{EfQhTl{D!#`?a1BvI`PxwTpD+)|lB4R$rmUHhc;}-w%ZtdwoDc6Ucj3Id1C5)x%(~$JRvIp#MJ+-wN1ljC)1FU|$sH~qnY~)qqav7(^ z+~m~r)Hh+~mB2@h>R2ZBv$MHSX+-Y?#g+aD$~DMxuU;m{?oUyRP6z4C@C<@)Z01)7 z!?hcBFXsJxIXxIlkx_bPo^JH|iI08Q;uZ-pfurGT=Ea4QZG3D!!jby@pDNE~>&?v5 z`i8U)-qYRN)x%OenGG&cg858RZNp%>ec0!ZKa9ET z5mCs+FY@RNmX}Q|EWIeb2R+T2*Fx{x<$1Lo1(@1d7y3l*x^;PwKEOzbN-(-o1I>!1 zKkKbp_RRr&-=ezb{vb-Qk=r^tLg+Me)3?$ukST?gPVU}1{}>Jq`Xg4uDN#?%v^6>V zjSn$;ejp47)V1+Zx}7#>6?^=;>9A%|-{&HhxT7bGzBEE!H~u{1J6?Ct7kN2Z`7UK< z&`s9h*hf(})M-EJw2R}85LkmMGOwKJ{`81~H9p@>;$`N7OkfC-^DSS*Yx~eZYl;Gw5g^LQ@WrYn&XI^ooH$U+{&~q-l|A+9Bd1&dJTi8_y@KHDS z`<^Fg@%p`V7%wNn;w_YT@jlOB-`e4tJGsHkFIujusWp7Obby!2hgCRJ>dYy7L}341 zR*BO>WoGsn@CB-#$r$X!)5|e?oBB1`7*3xaYD)`==~J7GbpCX6+2xzm>I;d*)5Sf* zg#;bfN-CTCh`Gi1#NE0t2+f+)T_!*5oJajBZ-%Z#RH3Su53Qcdqi(M*L#y7bLk+K% zziVMm%&6vnJW#Y8L0Lrgwa8OwDu2v$9Q{Oj&JK2|YtQ~jQ!Cce1`TLbfxpURPEJR2 zdSOgf4MG{}^!la~1wa8Q)RHuN5tYT21ei?o5t#OdJ${t=eU2mBRSQ166!6%)S^xI( zM7NeJ|MUzciWNgueZc?paC=)Q5TEqg!1L@&-7KBYZ#~UuikDx%Go_<{$QRF{%k1~W zCRskD&wiF8f}N8BRZyYQB`$G;E!f(1h}Za?nI;?0&p?OnnF#MsGYkb(dCdvsGf$iw z6GvvS#m&0UVnPMF>fy zB5-t^z4OM#o8|Z0^hay>Es&7N{>YnWx}OLUvr$@-{imms+82ph5jjlhn{My<0AY` zb=Oeh1VYff;)QR0pXRl__5}nzyDIvk@$`o^4T)r>?4W5%4qnAP#3?A0LB#i9K#;$& zEiPcPtEcP~^V8H28k)K$^H!c9_>$P98XLkbxOyJdHlcY0W0UY8mnq}@hucq+n^&?` zYPJf=qaBBAFYV4njyn6*Z z>4tuN70U`!k()0gtR{rSPt}ecwomlab%pC(JSP`Cmak(wI`WIg+s8gg{!GSohD#58 zIk-ykmNGnNpD(R)y7JI8)#a#Z!IrBs<1^YPR#_j`PtS35z;5dvc!QPgW9H^eKDD1u zk@}y<`8T*r8XLZv?>Ts1;6f?|0>SA9*kn2{FSaILMEB#a_{v$UhR$CW5=zLWI^&pV zHB)}d*0gH>06TDs_iDVRTwCATa3TBgGwNIz@MY_4xxmV5eWOw}R|eu4$o}-4sO!>p174C!>4HQm1K(l+yQJe0N#BGKz`j zVv&Naf^AJ^1-`9JvDG9*;j%3Kae=k2@^k!yl_CwC$5nI(!(S`bP1B85>aTi=)6}CM zDm>OBtngp{p6AAA%OCyIQM}%f;e^dn&UpQPFW2{%97h#fDn%%too#ri`PdWNa>U@8 bSufi8jdX#{DME1ry0t*M06hQeeh>T?jPg)= diff --git a/Library/resources/js/facedatection.js b/Library/resources/js/facedatection.js index 31a4f91..53bbae8 100644 --- a/Library/resources/js/facedatection.js +++ b/Library/resources/js/facedatection.js @@ -1,6 +1,7 @@ const utils = new Utils('errorMessage'), imageInput = document.getElementById('imageInput'), fileInput = document.getElementById('fileInput'), + avatarRatingInput = document.getElementById('avatarRating'), imageResult = document.getElementById('imageResult'); fileInput.addEventListener('change', (e) => { @@ -118,6 +119,7 @@ function isMatching(facesSize, imageWidth, imageHeight, facePoint1, facePoint2, } result(imageRating, errorMassages, errorMessageId, massageAlertPrimaryId); + avatarRatingInput.setAttribute('value', imageRating); } function result(imageRating, errorMassages, errorMessageId, massageAlertPrimaryId) { diff --git a/Library/resources/sass/app.scss b/Library/resources/sass/app.scss index 51df9f8..842b34c 100644 --- a/Library/resources/sass/app.scss +++ b/Library/resources/sass/app.scss @@ -8,4 +8,8 @@ @import '~bootstrap/scss/bootstrap'; // Sections +@import 'sections/book.scss'; +@import 'sections/books.scss'; @import 'sections/register.scss'; +@import 'sections/user.scss'; +@import 'sections/users.scss'; diff --git a/Library/resources/sass/sections/book.scss b/Library/resources/sass/sections/book.scss new file mode 100644 index 0000000..295805e --- /dev/null +++ b/Library/resources/sass/sections/book.scss @@ -0,0 +1,5 @@ +.book{ + img{ + width: 100%; + } +} diff --git a/Library/resources/sass/sections/books.scss b/Library/resources/sass/sections/books.scss new file mode 100644 index 0000000..86555b2 --- /dev/null +++ b/Library/resources/sass/sections/books.scss @@ -0,0 +1,10 @@ +.books{ + img{ + width: 100%; + } + h2 { + font-size: 20px; + margin: 20px 0 0 0; + color: #000000 + } +} diff --git a/Library/resources/sass/sections/user.scss b/Library/resources/sass/sections/user.scss new file mode 100644 index 0000000..0dc4e38 --- /dev/null +++ b/Library/resources/sass/sections/user.scss @@ -0,0 +1,10 @@ +.profile { + img { + width: 100%; + } + + h1 { + font-size: 20px; + margin: 20px 0 0 0; + } +} diff --git a/Library/resources/sass/sections/users.scss b/Library/resources/sass/sections/users.scss new file mode 100644 index 0000000..d6bb425 --- /dev/null +++ b/Library/resources/sass/sections/users.scss @@ -0,0 +1,27 @@ +.users { + ul { + list-style: none; + margin: 0px; + padding: 0px; + + li { + a { + display: flex; + align-items: center; + img { + width: 60px; + height: 60px; + border-radius: 100%; + margin-right: 20px; + object-fit: cover; + } + + p { + width: calc(100% - 80px); + margin-bottom: 0px; + font-size: 16px; + } + } + } + } +} diff --git a/Library/resources/views/auth/register.blade.php b/Library/resources/views/auth/register.blade.php index 43e4ad0..901da49 100644 --- a/Library/resources/views/auth/register.blade.php +++ b/Library/resources/views/auth/register.blade.php @@ -13,7 +13,7 @@
{{ __('Register') }}
-
+ @csrf
@@ -33,7 +33,7 @@ class="col-md-4 col-form-label text-md-right">Avatar
- +
diff --git a/Library/resources/views/book/create.blade.php b/Library/resources/views/book/create.blade.php new file mode 100644 index 0000000..35e0353 --- /dev/null +++ b/Library/resources/views/book/create.blade.php @@ -0,0 +1,68 @@ +@extends('layouts.app') + +@section('content') +
+
+
+
+
{{ __('Register') }}
+
+ + {{csrf_field()}} + {{method_field('POST')}} + +
+
+ +
+ + @if ($errors->has('photo')) + + {{ $errors->first('photo') }} + + @endif +
+
+ +
+ +
+ + @if ($errors->has('name')) + + {{ $errors->first('name') }} + + @endif +
+
+ + +
+ +
+ + @if ($errors->has('description')) + + {{ $errors->first('description') }} + + @endif +
+
+ +
+
+ +
+
+
+ +
+
+
+
+
+@endsection diff --git a/Library/resources/views/book/show.blade.php b/Library/resources/views/book/show.blade.php new file mode 100644 index 0000000..2d8591d --- /dev/null +++ b/Library/resources/views/book/show.blade.php @@ -0,0 +1,39 @@ +@extends('layouts.app') + +@section('content') + +
+
+
+
+
+
Book
+
+ +

{{$book->name}}

+
+
+
+ +
+
+
+@endsection diff --git a/Library/resources/views/home.blade.php b/Library/resources/views/home.blade.php index 05dfca9..4c60cf7 100644 --- a/Library/resources/views/home.blade.php +++ b/Library/resources/views/home.blade.php @@ -1,23 +1,42 @@ @extends('layouts.app') @section('content') -
-
-
-
-
Dashboard
- -
- @if (session('status')) - @endsection diff --git a/Library/resources/views/layouts/app.blade.php b/Library/resources/views/layouts/app.blade.php index 282cb4c..526a3e7 100644 --- a/Library/resources/views/layouts/app.blade.php +++ b/Library/resources/views/layouts/app.blade.php @@ -46,11 +46,13 @@ @endif @else +