diff --git a/remember_laravel/app/Http/Controllers/GalleryController.php b/remember_laravel/app/Http/Controllers/GalleryController.php new file mode 100644 index 0000000000000000000000000000000000000000..dff9d02c60e345b4318ced9b999d6157b692c065 --- /dev/null +++ b/remember_laravel/app/Http/Controllers/GalleryController.php @@ -0,0 +1,72 @@ +<?php + +namespace App\Http\Controllers; + +use Illuminate\Http\Request; +use Illuminate\Support\Facades\File; +use App\Http\Requests\ImageRequest; +use App\Http\Requests\UpdateImageRequest; +use App\Image; + +class GalleryController extends Controller +{ + public function index() + { + $images = Image::all(); + return view('dashboard.galeria.index')->with(['images' => $images]); + } + + public function create() + { + return view('dashboard.galeria.create'); + } + + public function store(ImageRequest $request) + { + $image = Image::create([ + 'title' => $request['title'], + 'description' => $request['description'], + /* Cadastra a imagem em storage/app/public/images/ e devolve o caminho como public/images/nomeImagem.extensao + depois remove o public/images/, deixando apenas o nome da imagem */ + 'path' => str_replace("public/images/galeria/", "", ($request->file('image')->store('public/images/galeria'))), + ]); + + $image->save(); + + return redirect('dashboard/galeria'); + } + + public function show($id) + { + $image = Image::findOrFail($id); + + return view('dashboard.galeria.show')->with(['image' => $image]); + } + + public function edit($id) + { + $image = Image::findOrFail($id); + + return view('dashboard.galeria.edit')->with(['image' => $image]); + } + + public function update(UpdateImageRequest $request, $id) + { + $image = Image::findOrFail($id); + + $image->title = $request->title; + $image->description = $request->description; + + $image->update(); + + return redirect('dashboard/galeria'); + } + + public function destroy($id) + { + $image = Image::findOrFail($id); + File::delete('storage/images/galeria/' . $image->path); + Image::destroy($id); + return redirect('dashboard/galeria'); + } +} diff --git a/remember_laravel/app/Http/Requests/ImageRequest.php b/remember_laravel/app/Http/Requests/ImageRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..057cb35da0effad370413f5869a2d5d70f8a4422 --- /dev/null +++ b/remember_laravel/app/Http/Requests/ImageRequest.php @@ -0,0 +1,32 @@ +<?php + +namespace App\Http\Requests; + +use Illuminate\Foundation\Http\FormRequest; + +class ImageRequest extends FormRequest +{ + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'title' => 'required|string|max:100', + 'description' => 'string|max:200', + 'image' => 'required|file|image|max:4096' + ]; + } +} diff --git a/remember_laravel/app/Http/Requests/UpdateImageRequest.php b/remember_laravel/app/Http/Requests/UpdateImageRequest.php new file mode 100644 index 0000000000000000000000000000000000000000..7d6b26e09aa6f081e48bed88036dff059349220f --- /dev/null +++ b/remember_laravel/app/Http/Requests/UpdateImageRequest.php @@ -0,0 +1,31 @@ +<?php + +namespace App\Http\Requests; + +use Illuminate\Foundation\Http\FormRequest; + +class UpdateImageRequest extends FormRequest +{ + /** + * Determine if the user is authorized to make this request. + * + * @return bool + */ + public function authorize() + { + return true; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'title' => 'required|string|max:100', + 'description' => 'string|max:200' + ]; + } +} diff --git a/remember_laravel/app/Image.php b/remember_laravel/app/Image.php new file mode 100644 index 0000000000000000000000000000000000000000..b871b573b1370aa73b737458144af4589ab5b7f4 --- /dev/null +++ b/remember_laravel/app/Image.php @@ -0,0 +1,12 @@ +<?php + +namespace App; + +use Illuminate\Database\Eloquent\Model; + +class Image extends Model +{ + protected $fillable = [ + 'title', 'description', 'path' + ]; +} diff --git a/remember_laravel/database/migrations/2019_03_04_135050_create_images_table.php b/remember_laravel/database/migrations/2019_03_04_135050_create_images_table.php new file mode 100644 index 0000000000000000000000000000000000000000..90241af4eb85c0d34e6c9d0f39de0681e7e1ab2d --- /dev/null +++ b/remember_laravel/database/migrations/2019_03_04_135050_create_images_table.php @@ -0,0 +1,34 @@ +<?php + +use Illuminate\Support\Facades\Schema; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Database\Migrations\Migration; + +class CreateImagesTable extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('images', function (Blueprint $table) { + $table->increments('id'); + $table->string('title'); + $table->text('description'); + $table->string('path'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('images'); + } +} diff --git a/remember_laravel/public/css/dashboard/dashboard.css b/remember_laravel/public/css/dashboard/dashboard.css index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6a432db1c2b04137f9c7850186322219fdbdabc5 100644 --- a/remember_laravel/public/css/dashboard/dashboard.css +++ b/remember_laravel/public/css/dashboard/dashboard.css @@ -0,0 +1,40 @@ +#image-preview { + max-width: 260px; +} + +.options-dropdown-btn { + background:none!important; + border:none; + font: inherit; + cursor: pointer; + display: block; + padding: 6px 20px!important; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #f05050; + white-space: nowrap; + width: 100%; + text-align: left; +} + +.options-dropdown-btn:hover { + text-decoration: none; + background-color: #f5f5f5!important; +} + +.dropdown-btn:hover { + color: #262626; + text-decoration: none; + background-color: #f5f5f5!important; +} + +.thumb-gallery { + width: 100%; + max-width: inherit; + height: 150px; +} + +.img-show { + width: 100%; +} \ No newline at end of file diff --git a/remember_laravel/resources/views/dashboard/galeria/create.blade.php b/remember_laravel/resources/views/dashboard/galeria/create.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..d6f1eb27f06d4c5ef2e0c3935b34b5f6b6f52dba --- /dev/null +++ b/remember_laravel/resources/views/dashboard/galeria/create.blade.php @@ -0,0 +1,100 @@ +@extends('dashboard.layout.base') + +@section('content') +<div class="row"> + <div class="col-sm-12"> + <h4 class="page-title">Galeria</h4> + <ol class="breadcrumb"> + <li><a href="{{ route('dashboard') }}">Dashboard</a></li> + <li><a href="{{ route('gallery') }}">Galeria</a></li> + <li class="active">Nova imagem</li> + </ol> + </div> +</div> + +<div class="col-xs-12"> + <div class="card-box"> + <h4 class="m-t-0 m-b-30 header-title"><b>Nova Imagem</b></h4> + <form role="form" method="POST" action="{{ action('GalleryController@store') }}" enctype="multipart/form-data"> + @csrf + <div class="row"> + <div class="col-xs-12 col-md-3"> + <label for="image-input"> + <div class="form-group{{ $errors->has('thumbnail') ? ' has-error' : '' }}"> + <label for="image-input">Upload da imagem</label> + <div class="image-placeholder outer-container cursor-pointer"> + <img id="image-preview" class="img-rounded hidden" src=""> + <div id="image-preview-empty"> + <b><i class="fa fa-arrow-up fa-3x"></i></b> + </div> + </div> + </div> + </label> + <div class="form-group{{ $errors->has('image') ? ' has-error' : '' }}"> + <input id="image-input" type="file" name="image" value="{{ old('image') }}" class="hidden" autofocus required> + + @if ($errors->has('image')) + <span class="help-block"> + <strong>{{ $errors->first('image') }}</strong> + </span> + @endif + </div> + </div> + <div class="col-xs-12 col-md-9"> + <div class="form-group{{ $errors->has('title') ? ' has-error' : '' }}"> + <label for="title">Título da imagem</label> + <input id="title" type="text" class="form-control" name="title" value="{{ old('title') }}" autofocus required> + <div> + @if ($errors->has('title')) + <span class="help-block"> + <strong>{{ $errors->first('title') }}</strong> + </span> + @endif + </div> + </div> + <div class="form-group{{ $errors->has('description') ? ' has-error' : '' }}"> + <label for="description">Descrição curta da imagem</label> + <input id="description" type="text" class="form-control" name="description" value="{{ old('description') }}" autofocus required> + <div> + @if ($errors->has('description')) + <span class="help-block"> + <strong>{{ $errors->first('description') }}</strong> + </span> + @endif + </div> + </div> + </div> + <div class="col-xs-12"> + <div class="form-group text-right m-b-0"> + <button type="submit" class="btn btn-primary waves-effect waves-light" autofocus>Cadastrar</button> + <a href="{{ route('gallery') }}" class="btn btn-white waves-effect waves-light m-l-5">Cancelar</a> + </div> + </div> + </div> + </form> + </div> + </div> +@endsection + +@section('bottomJs') +<script type="text/javascript"> + function readURL(input) { + if (input.files && input.files[0]) { + var reader = new FileReader(); + + reader.onload = function (e) { + $('#image-preview').attr('src', e.target.result); + $('#image-preview').removeClass('hidden'); + $('#image-preview').next().addClass('hidden'); + $('#image-preview').parent().css('border', 'none'); + } + + reader.readAsDataURL(input.files[0]); + } + } + + $("#image-input").change(function(){ + readURL(this); + }); +</script> +@endsection \ No newline at end of file diff --git a/remember_laravel/resources/views/dashboard/galeria/edit.blade.php b/remember_laravel/resources/views/dashboard/galeria/edit.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..3f985b65febb66896ebac49a1d593077591b27a3 --- /dev/null +++ b/remember_laravel/resources/views/dashboard/galeria/edit.blade.php @@ -0,0 +1,66 @@ +@extends('dashboard.layout.base') + +@section('content') +<div class="row"> + <div class="col-sm-12"> + <h4 class="page-title">Galeria</h4> + <ol class="breadcrumb"> + <li><a href="{{ route('dashboard') }}">Dashboard</a></li> + <li><a href="{{ route('gallery') }}">Galeria</a></li> + <li class="active">Editar {{ $image->title }}</li> + </ol> + </div> +</div> + +<div class="col-xs-12"> + <div class="card-box"> + <h4 class="m-t-0 m-b-30 header-title"><b>Editar informações de {{ $image->title }}</b></h4> + <form role="form" method="POST" action="{{ action('GalleryController@update', $image->id) }}" enctype="multipart/form-data"> + @method('PUT') + @csrf + <div class="row"> + <div class="col-xs-12 col-md-3"> + <div class="form-group{{ $errors->has('thumbnail') ? ' has-error' : '' }}"> + <div class="image-placeholder outer-container cursor-pointer"> + <img id="image-preview" class="image-rounded" src="{{ asset('storage/images/galeria/' . $image->path) }}"/> + </div> + </div> + </div> + <div class="col-xs-12 col-md-9"> + <div class="form-group{{ $errors->has('title') ? ' has-error' : '' }}"> + <label for="title">Título da imagem</label> + <input id="title" type="text" class="form-control" value="{{ $image->title }}" name="title" autofocus required> + <div> + @if ($errors->has('title')) + <span class="help-block"> + <strong>{{ $errors->first('title') }}</strong> + </span> + @endif + </div> + </div> + <div class="form-group{{ $errors->has('description') ? ' has-error' : '' }}"> + <label for="description">Descrição curta da imagem</label> + <input id="description" type="text" class="form-control" value="{{ $image->description }}" name="description" autofocus required> + <div> + @if ($errors->has('description')) + <span class="help-block"> + <strong>{{ $errors->first('description') }}</strong> + </span> + @endif + </div> + </div> + </div> + <div class="col-xs-12"> + <div class="form-group text-right m-b-0"> + <button type="submit" class="btn btn-primary waves-effect waves-light" autofocus>Atualizar</button> + <a href="{{ route('gallery') }}" class="btn btn-white waves-effect waves-light m-l-5">Cancelar</a> + </div> + </div> + </div> + </form> + </div> + </div> +@endsection + +@section('bottomJs') +@endsection \ No newline at end of file diff --git a/remember_laravel/resources/views/dashboard/galeria/index.blade.php b/remember_laravel/resources/views/dashboard/galeria/index.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..6cda3a5154ab6d450cc92d70a1f1ecfcc3a005ee --- /dev/null +++ b/remember_laravel/resources/views/dashboard/galeria/index.blade.php @@ -0,0 +1,39 @@ +@extends('dashboard.layout.base') + +@section('content') +<div class="row"> + <div class="col-sm-12"> + <div class="btn-group pull-right m-t-15"> + <button type="button" class="btn btn-default dropdown-toggle waves-effect waves-light" data-toggle="dropdown" aria-expanded="false">Opções <span class="m-l-5"><i class="fa fa-cog"></i></span></button> + <ul class="dropdown-menu drop-menu-right" role="menu"> + <li><a href="{{ route('upload') }}">Nova imagem</a></li> + </ul> + </div> + + <h4 class="page-title">Galeria</h4> + <ol class="breadcrumb"> + <li><a href="{{ route('dashboard') }}">Dashboard</a></li> + <li class="active">Galeria</li> + </ol> + </div> +</div> + +<div class="row port m-b-20"> + <div class="portfolioContainer"> + @foreach ($images as $image) + <div class="col-sm-6 col-lg-3 col-md-4"> + <div class="gal-detail thumb"> + <a href="{{ route('show-image', $image->id) }}" class="image-popup" title="{{ $image->description }}"> + <img src="{{ asset('storage/images/galeria/' . $image->path) }}" class="thumb-img thumb-gallery" alt="work-thumbnail"> + </a> + <h4>{{ $image->title }}</h4> + </div> + </div> + @endforeach + </div> +</div> <!-- End row --> +@endsection + +@section('bottomJs') + +@endsection \ No newline at end of file diff --git a/remember_laravel/resources/views/dashboard/galeria/show.blade.php b/remember_laravel/resources/views/dashboard/galeria/show.blade.php new file mode 100644 index 0000000000000000000000000000000000000000..d358ed6f573b3dec737cf1e3a655cacf3054eef3 --- /dev/null +++ b/remember_laravel/resources/views/dashboard/galeria/show.blade.php @@ -0,0 +1,40 @@ +@extends('dashboard.layout.base') + +@section('content') +<div class="row"> + <div class="col-sm-12"> + <div class="btn-group pull-right m-t-15"> + <button type="button" class="btn btn-default dropdown-toggle waves-effect waves-light" data-toggle="dropdown" aria-expanded="false">Opções <span class="m-l-5"><i class="fa fa-cog"></i></span></button> + <ul class="dropdown-menu drop-menu-right" role="menu"> + <li><a href="{{ route('edit', $image->id) }}">Editar</a></li> + <form role="form" method="POST" action="{{ action('GalleryController@destroy', $image->id) }}" enctype="multipart/form-data"> + @method('DELETE') + @csrf + <li class="dropdown-btn"><a> + <button class="options-dropdown-btn" type="submit">Delete</button> + </a></li> + </form> + </ul> + </div> + + <h4 class="page-title">Galeria</h4> + <ol class="breadcrumb"> + <li><a href="{{ route('dashboard') }}">Dashboard</a></li> + <li><a href="{{ route('gallery') }}">Galeria</a></li> + <li class="active">{{$image->title}}</li> + </ol> + </div> +</div> + +<div class="col-xs-12"> + <div class="card-box"> + <h4 class="m-t-0 m-b-10 header-title" align="center"><b>Título:</b> {{ $image->title }}</h4> + <p class="m-b-30"><b>Descrição: </b>{{ $image->description }}</p> + <img class="img-responsive img-show" src="{{ asset('storage/images/galeria/' . $image->path) }}"/> + </div> + </div> +@endsection + +@section('bottomJs') + +@endsection \ No newline at end of file diff --git a/remember_laravel/resources/views/dashboard/layout/navbar.blade.php b/remember_laravel/resources/views/dashboard/layout/navbar.blade.php index fca4d61e8b15c72123d2553e8243d4167c423a04..40acdb0bc970bb6ee31c90683504f9262713cdb5 100644 --- a/remember_laravel/resources/views/dashboard/layout/navbar.blade.php +++ b/remember_laravel/resources/views/dashboard/layout/navbar.blade.php @@ -5,7 +5,7 @@ <!-- Logo container--> <div class="logo"> - <a href="index.html" class="logo"><span>RememberPET</span></a> + <a href="{{ route('dashboard') }}" class="logo"><span>RememberPET</span></a> </div> <!-- End Logo container--> @@ -46,8 +46,10 @@ <a href="#"><i class="md md-dashboard"></i>Galeria</a> <ul class="submenu"> <li> - <a href="/dashboard">Lista de imagens</a> - <a href="/dashboard">Nova imagem</a> + <a href="{{ route('gallery') }}">Lista de imagens</a> + </li> + <li> + <a href="{{ route('upload') }}">Nova imagem</a> </li> </ul> </li> diff --git a/remember_laravel/routes/web.php b/remember_laravel/routes/web.php index f733d9b5ea5af25c5773cdec4ef0e8a7099af652..a8e1363de8b9d82c094079a7e5bad907a58becdb 100644 --- a/remember_laravel/routes/web.php +++ b/remember_laravel/routes/web.php @@ -21,7 +21,17 @@ Route::get('/', 'HomeController@index')->name('home'); Route::group(['prefix' => 'dashboard', 'middleware' => ['web', 'auth']], function () { Route::get('/', function () { return view('dashboard.home'); - })->name('dashboard-home'); + })->name('dashboard'); + + Route::group(['prefix' => 'galeria'], function () { + Route::get('/', 'GalleryController@index')->name('gallery'); + Route::get('/upload', 'GalleryController@create')->name('upload'); + Route::post('/upload', 'GalleryController@store'); + Route::get('/{id}', 'GalleryController@show')->name('show-image'); + Route::get('/{id}/editar', 'GalleryController@edit')->name('edit'); + Route::put('/{id}/editar', 'GalleryController@update'); + Route::delete('/{id}/deletar', 'GalleryController@destroy')->name('delete-image'); + }); }); Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');