diff --git a/app/Http/Controllers/ChapterController.php b/app/Http/Controllers/ChapterController.php index c96e9ad..f685f3e 100644 --- a/app/Http/Controllers/ChapterController.php +++ b/app/Http/Controllers/ChapterController.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers; +use App\Models\Chapter; +use Illuminate\Support\Facades\Auth; use App\Http\Requests\StoreChapterRequest; use App\Http\Requests\UpdateChapterRequest; -use App\Models\Chapter; +use App\Models\Manga; class ChapterController extends Controller { @@ -13,15 +15,17 @@ class ChapterController extends Controller */ public function index() { - // + $mangas = Manga::latest('id')->paginate(8)->withQueryString(); + return view('chapter.index', compact('mangas')); } + /** * Show the form for creating a new resource. */ public function create() { - // + return view('chapter.create'); } /** @@ -29,7 +33,19 @@ class ChapterController extends Controller */ public function store(StoreChapterRequest $request) { - // + $formData = $request->validated(); + $formData['user_id'] = Auth::id(); + if($request->hasFile('images')) { + foreach ($request->file('images') as $image) { + $images[] = $image->store($request->manga_id.'OfChapter', 'public'); + } + $formData['images'] = $images; + } + + Chapter::create($formData); + + return redirect()->route('home')->with(['message' => 'New Chapter has been added!!']); + } /** @@ -61,6 +77,12 @@ class ChapterController extends Controller */ public function destroy(Chapter $chapter) { - // + $chapter->delete(); + return back()->with(['message' => "Successfully Deleted!"]); + } + + public function manage(Manga $manga) + { + return view('chapter.manageChapter', compact('manga')); } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 7cbc2c3..2631f8f 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -25,4 +25,6 @@ class HomeController extends Controller { return view('home'); } + + } diff --git a/app/Http/Controllers/MangaController.php b/app/Http/Controllers/MangaController.php index b240061..a5b8235 100644 --- a/app/Http/Controllers/MangaController.php +++ b/app/Http/Controllers/MangaController.php @@ -2,9 +2,13 @@ namespace App\Http\Controllers; +use App\Models\Manga; +use Illuminate\Support\Str; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use App\Http\Requests\StoreMangaRequest; use App\Http\Requests\UpdateMangaRequest; -use App\Models\Manga; +use Illuminate\Support\Facades\Request as FacadesRequest; class MangaController extends Controller { @@ -13,7 +17,8 @@ class MangaController extends Controller */ public function index() { - // + $mangas = Manga::latest('id')->paginate(10)->withQueryString(); + return view('manga.index', compact('mangas')); } /** @@ -21,7 +26,7 @@ class MangaController extends Controller */ public function create() { - // + return view('manga.create'); } /** @@ -29,15 +34,26 @@ class MangaController extends Controller */ public function store(StoreMangaRequest $request) { - // + $formData = $request->validated(); + $formData['slug'] = Str::slug($request->title); + $formData['excerpt'] = Str::words($request->summary, 10, '...'); + $formData['author_id'] = Auth::id(); + if ($request->hasFile('cover')) { + $formData['cover'] = $request->file('cover')->store('covers', 'public'); + } + + Manga::create($formData); + + return redirect()->route('manga.index')->with(['message' => 'A New Manga is created']); } /** * Display the specified resource. */ - public function show(Manga $manga) + public function show($slug) { - // + $manga = Manga::where('slug', $slug)->first(); + return view('manga.detail', compact('manga')); } /** @@ -45,7 +61,7 @@ class MangaController extends Controller */ public function edit(Manga $manga) { - // + return view('manga.edit', compact('manga')); } /** @@ -53,7 +69,15 @@ class MangaController extends Controller */ public function update(UpdateMangaRequest $request, Manga $manga) { - // + $formData = $request->validated(); + $formData['slug'] = Str::slug($request->title); + $formData['excerpt'] = Str::words($request->summary, 10, '...'); + if ($request->hasFile('cover')) { + $formData['cover'] = $request->file('cover')->store('covers', 'public'); + } + + $manga->update($formData); + return redirect()->back()->with(['message' => 'Manga has been updated!']); } /** @@ -61,6 +85,8 @@ class MangaController extends Controller */ public function destroy(Manga $manga) { - // + $manga->delete(); + return redirect()->back()->with(['message' => 'Manga has been deleted!']); } + } diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php new file mode 100644 index 0000000..adb4ac0 --- /dev/null +++ b/app/Http/Controllers/PageController.php @@ -0,0 +1,32 @@ +paginate(10)->withQueryString(); + $hotMangas = Manga::latest('id')->limit('3')->get(); + return view('index', [ + 'mangas' => $mangas, + 'hotMangas' => $hotMangas + ]); + } + + public function manga($slug) + { + $manga = Manga::where('slug', $slug)->first(); + return view('manga', compact('manga')); + } + + public function chapter(Manga $manga, Chapter $chapter ) + { + return view('chapter_page', ['manga' => $manga, 'chapter' => $chapter]); + } + +} diff --git a/app/Http/Requests/StoreChapterRequest.php b/app/Http/Requests/StoreChapterRequest.php index 2febe3f..81e9360 100644 --- a/app/Http/Requests/StoreChapterRequest.php +++ b/app/Http/Requests/StoreChapterRequest.php @@ -11,7 +11,7 @@ class StoreChapterRequest extends FormRequest */ public function authorize(): bool { - return false; + return true; } /** @@ -22,7 +22,16 @@ class StoreChapterRequest extends FormRequest public function rules(): array { return [ - // + 'title' => 'min:3', + 'manga_id' => 'required|exists:mangas,id' + ]; + } + + public function messages() + { + return [ + 'manga_id.required' => 'Please Select the Manga', + 'manga_id.exists' => 'Please Select the Manga' ]; } } diff --git a/app/Http/Requests/StoreMangaRequest.php b/app/Http/Requests/StoreMangaRequest.php index 8c1ddd5..b30e909 100644 --- a/app/Http/Requests/StoreMangaRequest.php +++ b/app/Http/Requests/StoreMangaRequest.php @@ -11,7 +11,7 @@ class StoreMangaRequest extends FormRequest */ public function authorize(): bool { - return false; + return true; } /** @@ -22,7 +22,8 @@ class StoreMangaRequest extends FormRequest public function rules(): array { return [ - // + 'title' => 'required|min:3|max:100', + 'summary' => 'required|min:3' ]; } } diff --git a/app/Http/Requests/UpdateMangaRequest.php b/app/Http/Requests/UpdateMangaRequest.php index 79a29e3..5ff876a 100644 --- a/app/Http/Requests/UpdateMangaRequest.php +++ b/app/Http/Requests/UpdateMangaRequest.php @@ -11,7 +11,7 @@ class UpdateMangaRequest extends FormRequest */ public function authorize(): bool { - return false; + return true; } /** @@ -22,7 +22,8 @@ class UpdateMangaRequest extends FormRequest public function rules(): array { return [ - // + 'title' => 'required|min:3', + 'summary' => 'required|min:3|max:2000' ]; } } diff --git a/app/Models/Chapter.php b/app/Models/Chapter.php index 6a00768..0460a6b 100644 --- a/app/Models/Chapter.php +++ b/app/Models/Chapter.php @@ -8,4 +8,14 @@ use Illuminate\Database\Eloquent\Model; class Chapter extends Model { use HasFactory; + + protected $fillable = ['title', 'images', 'manga_id', 'user_id']; + protected $casts = [ + 'images' => 'array' + ]; + + public function manga() + { + return $this->belongsTo(Manga::class, 'manga_id'); + } } diff --git a/app/Models/Manga.php b/app/Models/Manga.php index bc732e5..0650d24 100644 --- a/app/Models/Manga.php +++ b/app/Models/Manga.php @@ -8,4 +8,17 @@ use Illuminate\Database\Eloquent\Model; class Manga extends Model { use HasFactory; + + protected $fillable = ['title', 'slug', 'summary', 'excerpt', 'cover', 'author_id']; + + + public function user() + { + return $this->belongsTo(User::class, 'author_id'); + } + + public function chapters() + { + return $this->hasMany(Chapter::class); + } } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 452e6b6..86b1719 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use Illuminate\Pagination\Paginator; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider @@ -19,6 +20,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - // + Paginator::useBootstrapFive(); } } diff --git a/config/filesystems.php b/config/filesystems.php index e9d9dbd..101542f 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -13,7 +13,7 @@ return [ | */ - 'default' => env('FILESYSTEM_DISK', 'local'), + 'default' => env('FILESYSTEM_DISK', 'public'), /* |-------------------------------------------------------------------------- diff --git a/database/factories/ChapterFactory.php b/database/factories/ChapterFactory.php index d06d157..12fe81a 100644 --- a/database/factories/ChapterFactory.php +++ b/database/factories/ChapterFactory.php @@ -16,8 +16,15 @@ class ChapterFactory extends Factory */ public function definition(): array { + $images = []; + for ($i = 0; $i < 10; $i++) { + $images[] = fake()->imageUrl(400,400,'cats'); + } return [ - // + 'title' => fake()->title(), + 'images' => $images, + 'manga_id' => rand(1, 10), + 'user_id' => rand(1, 10) ]; } } diff --git a/database/factories/MangaFactory.php b/database/factories/MangaFactory.php index 6081190..9562f08 100644 --- a/database/factories/MangaFactory.php +++ b/database/factories/MangaFactory.php @@ -2,6 +2,9 @@ namespace Database\Factories; +use Illuminate\Support\Str; + +use function Laravel\Prompts\text; use Illuminate\Database\Eloquent\Factories\Factory; /** @@ -16,8 +19,15 @@ class MangaFactory extends Factory */ public function definition(): array { + $title = fake()->name(); + $summary = fake()->paragraph(5); return [ - // + 'title' => $title, + 'slug' => Str::slug($title), + 'summary' => $summary, + 'excerpt' => Str::words($summary, 10, '...'), + 'cover' => fake()->imageUrl(400, 400, 'cats'), + 'author_id' => rand(1,10), ]; } } diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index a6ecc0a..a916a96 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -3,6 +3,7 @@ namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; /** @@ -21,7 +22,8 @@ class UserFactory extends Factory 'name' => fake()->name(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'password' => Hash::make('12345678'), + // 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; } diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 444fafb..ac18148 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -15,6 +15,7 @@ return new class extends Migration $table->id(); $table->string('name'); $table->string('email')->unique(); + $table->enum('role', ['user', 'admin'])->default('user'); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); diff --git a/database/migrations/2023_08_23_114850_create_mangas_table.php b/database/migrations/2023_08_23_114850_create_mangas_table.php index 9144c6a..782a16d 100644 --- a/database/migrations/2023_08_23_114850_create_mangas_table.php +++ b/database/migrations/2023_08_23_114850_create_mangas_table.php @@ -13,6 +13,12 @@ return new class extends Migration { Schema::create('mangas', function (Blueprint $table) { $table->id(); + $table->string('title'); + $table->string('slug')->nullable(); + $table->longText('summary'); + $table->string('excerpt')->nullable(); + $table->string('cover')->nullable(); + $table->foreignId('author_id'); $table->timestamps(); }); } diff --git a/database/migrations/2023_08_23_115026_create_chapters_table.php b/database/migrations/2023_08_23_115026_create_chapters_table.php index 83b34c8..1b62d18 100644 --- a/database/migrations/2023_08_23_115026_create_chapters_table.php +++ b/database/migrations/2023_08_23_115026_create_chapters_table.php @@ -13,8 +13,13 @@ return new class extends Migration { Schema::create('chapters', function (Blueprint $table) { $table->id(); + $table->string('title')->nullable(); + $table->json('images'); + $table->foreignId('manga_id')->constrained()->onDelete('cascade'); + $table->foreignId('user_id'); $table->timestamps(); }); + } /** diff --git a/database/seeders/ChapterSeeder.php b/database/seeders/ChapterSeeder.php index ce36c31..d84f860 100644 --- a/database/seeders/ChapterSeeder.php +++ b/database/seeders/ChapterSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\Chapter; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -12,6 +13,6 @@ class ChapterSeeder extends Seeder */ public function run(): void { - // + Chapter::factory(50)->create(); } } diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index a9f4519..f25bb03 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; + use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder @@ -15,8 +16,14 @@ class DatabaseSeeder extends Seeder // \App\Models\User::factory(10)->create(); // \App\Models\User::factory()->create([ - // 'name' => 'Test User', - // 'email' => 'test@example.com', + // 'name' => 'Luke', + // 'email' => 'luke@gmail.com', + // 'password' => Hash::make('12345678'), // ]); + $this->call([ + UserSeeder::class, + MangaSeeder::class, + ChapterSeeder::class + ]); } } diff --git a/database/seeders/MangaSeeder.php b/database/seeders/MangaSeeder.php index 760b087..a977112 100644 --- a/database/seeders/MangaSeeder.php +++ b/database/seeders/MangaSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use App\Models\Manga; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; @@ -12,6 +13,6 @@ class MangaSeeder extends Seeder */ public function run(): void { - // + Manga::factory(10)->create(); } } diff --git a/database/seeders/UserSeeder.php b/database/seeders/UserSeeder.php new file mode 100644 index 0000000..e6d107e --- /dev/null +++ b/database/seeders/UserSeeder.php @@ -0,0 +1,25 @@ +create(); + User::factory()->create([ + 'name' => 'Luke', + 'email' => 'luke@gmail.com', + 'password' => Hash::make('12345678'), + 'role' => 'admin' + ]); + } +} diff --git a/resources/sass/app.scss b/resources/sass/app.scss index 5c5a5bd..f2d9bd0 100644 --- a/resources/sass/app.scss +++ b/resources/sass/app.scss @@ -18,23 +18,7 @@ // Bootstrap @import 'bootstrap/scss/bootstrap'; -@import "../../node_modules/bootstrap/scss/functions"; - -// Required -@import "../../node_modules/bootstrap/scss/variables"; -@import "../node_modules/bootstrap/scss/variables-dark"; -@import "../node_modules/bootstrap/scss/maps"; -@import "../node_modules/bootstrap/scss/mixins"; -@import "../node_modules/bootstrap/scss/root"; - - - - -$custom-colors:( - 'lightGrey' : #ebebeb, - 'grey' : #7b7b7b -); - -// Merge the maps -$theme-colors : map-merge($theme-colors, $custom-colors); +.alert-msg { + transform: translateX(-50%) translateY(10%); +} diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index ea9ac94..d9f0b8c 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.app') +@extends('layouts.master') @section('content')
{{ $chapter->title }}
+{{ $manga->summary }}
+No Chapter Yet!
+ @endforelse +Cover Image :
+Summary :
+{{ $manga->summary }}
+ +Total Chapter : {{$manga->chapters->count()}} chapters
+ +# | +Title | +Author | +Total Chapters | +Handle | +
---|---|---|---|---|
{{ $manga->id }} | +
+ {{ $manga->title }} + {{ $manga->excerpt }} + |
+ + {{ $manga->user->name }} + | ++ {{$manga->chapters->count()}} + | + ++ + + | +
{{ session('message') }}
+Copyright All Served @MangaDex
+{{ $hotManga->title }}
+ @foreach ($hotManga->chapters()->latest('id')->limit(2)->get() as $hotChap) +