Crud of books

 books/index.php

<!-- resources/views/books/index.blade.php -->


<x-app-layout>

    <div class="container mx-auto p-4">

        <div class="flex justify-between items-center mb-4">

            <h1 class="text-2xl font-bold">Books</h1>


            <!-- Search Form -->

            <form method="GET" action="{{ route('books.index') }}" class="flex items-center space-x-2">

                <input type="text" name="search" value="{{ request('search') }}" placeholder="Search by title or author" class="px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm">

                <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded">Search</button>

                @if(request('search'))

                    <a href="{{ route('books.index') }}" class="bg-gray-500 text-white px-4 py-2 rounded">Clear Search</a>

                @endif

            </form>


            <a href="{{ route('books.create') }}" class="bg-blue-500 text-white px-4 py-2 rounded">Add New Book</a>

        </div>


        <table class="min-w-full bg-white border border-gray-200 rounded-lg">

            <thead>

                <tr class="w-full bg-gray-100 border-b border-gray-200">

                    <th class="py-2 px-4 text-left">ID</th>

                    <th class="py-2 px-4 text-left">Title</th>

                    <th class="py-2 px-4 text-left">Author</th>

                    <!-- th class="py-2 px-4 text-left">ISBN</>

                    <th class="py-2 px-4 text-left">Published Date</th -->

                    <th class="py-2 px-4 text-left">Status</th>

                    <th class="py-2 px-4 text-left">Actions</th>

                </tr>

            </thead>

            <tbody>

                @forelse ($books as $book)

                    <tr>

                        <td class="py-2 px-4 border-b">{{ $book->id }}</td>

                        <td class="py-2 px-4 border-b">{{ $book->title }}</td>

                        <td class="py-2 px-4 border-b">{{ $book->author }}</td>

                        <!-- td class="py-2 px-4 border-b">{{ $book->isbn }}</>

                        <td class="py-2 px-4 border-b">{{ \Carbon\Carbon::parse($book->published_date)->format('Y-m-d') }}</td -->

                        <td class="py-2 px-4 border-b">{{ ucfirst($book->status) }}</td>

                        <td class="py-2 px-4 border-b flex space-x-2">

                            <a href="{{ route('books.show', $book) }}" class="text-blue-500">View</a>

                            <a href="{{ route('books.edit', $book) }}" class="text-green-500">Edit</a>


                            <!-- Check Out / Return Buttons -->

                            @if ($book->status == 'available')

                                <form action="{{ route('books.checkout', $book->id) }}" method="POST">

                                    @csrf

                                    <button type="submit" class="text-yellow-500">Check Out</button>

                                </form>

                            @else

                                <form action="{{ route('books.return', $book->id) }}" method="POST">

                                    @csrf

                                    <button type="submit" class="text-green-500">Return</button>

                                </form>

                            @endif


                            <!-- Delete Form -->

                            <form action="{{ route('books.destroy', $book) }}" method="POST" class="inline">

                                @csrf

                                @method('DELETE')

                                <button type="submit" class="text-red-500">Delete</button>

                            </form>

                        </td>

                    </tr>

                @empty

                    <tr>

                        <td colspan="7" class="py-2 px-4 text-center">No books found</td>

                    </tr>

                @endforelse

            </tbody>

        </table>

    </div>

</x-app-layout>






books/show.blade.php

<!-- resources/views/books/show.blade.php -->


<x-app-layout>

    <div class="container mx-auto p-4">

        <h1 class="text-2xl font-bold mb-4">Book Details</h1>


        <div class="bg-white p-6 border border-gray-200 rounded-lg">

            <p><strong>ID:</strong> {{ $book->id }}</p>

            <p><strong>Title:</strong> {{ $book->title }}</p>

            <p><strong>Author:</strong> {{ $book->author }}</p>

            <p><strong>ISBN:</strong> {{ $book->isbn }}</p>

            <p><strong>Published Date:</strong> {{ \Carbon\Carbon::parse($book->published_date)->format('Y-m-d') }}</p>

            <p><strong>Status:</strong> {{ ucfirst($book->status) }}</p>


            <div class="mt-4">

                <a href="{{ route('books.edit', $book) }}" class="bg-green-500 text-white px-4 py-2 rounded">Edit</a>

                <a href="{{ route('books.index') }}" class="bg-gray-500 text-white px-4 py-2 rounded ml-4">Back to list</a>


                <!-- Check Out / Return Buttons -->

                @if ($book->status == 'available')

                    <form action="{{ route('books.checkout', $book) }}" method="POST" class="inline">

                        @csrf

                        <button type="submit" class="bg-yellow-500 text-white px-4 py-2 rounded ml-4">Check Out</button>

                    </form>

                @else

                    <form action="{{ route('books.return', $book) }}" method="POST" class="inline">

                        @csrf

                        <button type="submit" class="bg-green-500 text-white px-4 py-2 rounded ml-4">Return</button>

                    </form>

                @endif

            </div>

        </div>

    </div>

</x-app-layout>






books/edit.blade.php

<!-- resources/views/books/edit.blade.php -->


<x-app-layout>

    <div class="container mx-auto p-4">

        <h1 class="text-2xl font-bold mb-4">Edit Book</h1>


        <form action="{{ route('books.update', $book) }}" method="POST" class="bg-white p-6 border border-gray-200 rounded-lg">

            @csrf

            @method('PUT')

            <div class="mb-4">

                <label for="title" class="block text-sm font-medium text-gray-700">Title</label>

                <input type="text" id="title" name="title" value="{{ old('title', $book->title) }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('title')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <div class="mb-4">

                <label for="author" class="block text-sm font-medium text-gray-700">Author</label>

                <input type="text" id="author" name="author" value="{{ old('author', $book->author) }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('author')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <div class="mb-4">

                <label for="isbn" class="block text-sm font-medium text-gray-700">ISBN</label>

                <input type="text" id="isbn" name="isbn" value="{{ old('isbn', $book->isbn) }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('isbn')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <div class="mb-4">

                <label for="published_date" class="block text-sm font-medium text-gray-700">Published Date</label>

                <input type="date" id="published_date" name="published_date" value="{{ old('published_date', \Carbon\Carbon::parse($book->published_date)->format('Y-m-d')) }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('published_date')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

                

            </div>

            <div class="mb-4">

                <label for="status" class="block text-sm font-medium text-gray-700">Status</label>

                <select id="status" name="status" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                    <option value="available" {{ old('status', $book->status) == 'available' ? 'selected' : '' }}>Available</option>

                    <option value="checked_out" {{ old('status', $book->status) == 'checked_out' ? 'selected' : '' }}>Checked Out</option>

                </select>

                @error('status')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded">Update Book</button>

            <a href="{{ route('books.index') }}" class="ml-4 text-gray-600">Back to list</a>

        </form>

    </div>

</x-app-layout>






books/create.blade.php

<!-- resources/views/books/create.blade.php -->


<x-app-layout>

    <div class="container mx-auto p-4">

        <h1 class="text-2xl font-bold mb-4">Add New Book</h1>


        <form action="{{ route('books.store') }}" method="POST" class="bg-white p-6 border border-gray-200 rounded-lg">

            @csrf

            <div class="mb-4">

                <label for="title" class="block text-sm font-medium text-gray-700">Title</label>

                <input type="text" id="title" name="title" value="{{ old('title') }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('title')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <div class="mb-4">

                <label for="author" class="block text-sm font-medium text-gray-700">Author</label>

                <input type="text" id="author" name="author" value="{{ old('author') }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('author')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <div class="mb-4">

                <label for="isbn" class="block text-sm font-medium text-gray-700">ISBN</label>

                <input type="text" id="isbn" name="isbn" value="{{ old('isbn') }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('isbn')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <div class="mb-4">

                <label for="published_date" class="block text-sm font-medium text-gray-700">Published Date</label>

                <input type="date" id="published_date" name="published_date" value="{{ old('published_date') }}" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                @error('published_date')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <div class="mb-4">

                <label for="status" class="block text-sm font-medium text-gray-700">Status</label>

                <select id="status" name="status" class="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm" required>

                    <option value="available" {{ old('status') == 'available' ? 'selected' : '' }}>Available</option>

                    <option value="checked_out" {{ old('status') == 'checked_out' ? 'selected' : '' }}>Checked Out</option>

                </select>

                @error('status')

                    <p class="text-red-500 text-sm">{{ $message }}</p>

                @enderror

            </div>

            <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded">Add Book</button>

            <a href="{{ route('books.index') }}" class="ml-4 text-gray-600">Back to list</a>

        </form>

    </div>

</x-app-layout>






Web.php

<?php


use App\Http\Controllers\ProfileController;

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\BookController;


/*

|--------------------------------------------------------------------------

| Web Routes

|--------------------------------------------------------------------------

|

| Here is where you can register web routes for your application. These

| routes are loaded by the RouteServiceProvider and all of them will

| be assigned to the "web" middleware group. Make something great!

|

*/


Route::get('/', function () {

    return view('welcome');

});


Route::middleware(['auth' , 'verified'])->group(function () {

    Route::get('/dashboard', function () {

            return view('dashboard');

        })->name('dashboard');

        

    // Book management routes

    Route::resource('books', BookController::class);


    // Additional routes that require authentication

    // For example, checking out and returning books

    Route::post('books/{id}/checkout', [BookController::class, 'checkout'])->name('books.checkout');

    Route::post('books/{id}/return', [BookController::class, 'return'])->name('books.return');


});


// Route::get('/dashboard', function () {

//     return view('dashboard');

// })->middleware(['auth', 'verified'])->name('dashboard');


Route::middleware('auth')->group(function () {

    Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');

    Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');

    Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');

});


require __DIR__.'/auth.php';







BookController.php

<?php


namespace App\Http\Controllers;


use Illuminate\Http\Request;

use App\Models\Book;

use Illuminate\Support\Facades\DB;

use Illuminate\Support\Facades\Log;


class BookController extends Controller

{

     // GET /books

     public function index(Request $request)

     {

        $query = $request->input('search');

        

        // Filter books by title or author if search query is present

        $books = Book::when($query, function($queryBuilder) use ($query) {

            return $queryBuilder->where('title', 'like', "%{$query}%")

                                ->orWhere('author', 'like', "%{$query}%");

        })->get();

        

        return view('books.index', compact('books'));

     }

 

     // GET /books/create

     public function create()

     {

         return view('books.create');

     }

 

     // POST /books

     public function store(Request $request)

     {

         $validatedData = $request->validate([

             'title' => 'required|string|max:255',

             'author' => 'required|string|max:255',

             'isbn' => 'required|string|unique:books,isbn|max:13',

             'published_date' => 'nullable|date',

             'status' => 'required|in:available,checked_out',

         ]);

 

         Book::create($validatedData);

 

         return redirect()->route('books.index')->with('success', 'Book added successfully.');

     }

 

     // GET /books/{id}

     public function show(Book $book)

     {

         return view('books.show', compact('book'));

     }

 

     // GET /books/{id}/edit

     public function edit(Book $book)

     {

         return view('books.edit', compact('book'));

     }

 

     // PUT/PATCH /books/{id}

     public function update(Request $request, Book $book)

     {

         $validatedData = $request->validate([

             'title' => 'required|string|max:255',

             'author' => 'required|string|max:255',

             'isbn' => 'required|string|unique:books,isbn,' . $book->id . '|max:13',

             'published_date' => 'nullable|date',

             'status' => 'required|in:available,checked_out',

         ]);

 

         $book->update($validatedData);

 

         return redirect()->route('books.index')->with('success', 'Book updated successfully.');

     }

 

     // DELETE /books/{id}

     public function destroy(Book $book)

     {

         $book->delete();

 

         return redirect()->route('books.index')->with('success', 'Book deleted successfully.');

     }

 

     // POST /books/{id}/checkout

     public function checkout($id)

     {

        // Find the book by ID

        $book = Book::findOrFail($id);

        $book->status = 'checked_out';

        $book->update();

 

         return redirect()->route('books.index')->with('success', 'Book checked out successfully.');

     }

 

     // POST /books/{id}/return

     public function return($id)

     {

        // Find the book by ID

        $book = Book::findOrFail($id);

        $book->status = 'available';

        $book->update();


        return redirect()->route('books.index')->with('success', 'Book returned successfully.');


     }

}




Models/Book.php

<?php


namespace App\Models;


use Illuminate\Database\Eloquent\Factories\HasFactory;

use Illuminate\Database\Eloquent\Model;


class Book extends Model

{

    use HasFactory;


    protected $fillable = [

        'title',

        'author',

        'description',

        'published_date',

        'pages',

        'isbn',

        'status'

    ];


    // If you have relationships, define them here

    // e.g., public function user() { return $this->belongsTo(User::class); }

}




database/migration/bookmigration.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('books', function (Blueprint $table) {
            $table->id();
            $table->string('title')->nullable(false);
            $table->string('author')->nullable(false);
            $table->string('isbn')->unique();
            $table->date('published_date')->nullable();
            $table->enum('status', ['available', 'checked_out'])->default('available');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('books');
    }
};




Comments

Popular posts from this blog

AUTOMATA DEFINITIONS

DMA IN MP

MAKING POWERPOINT SLIDES

Java Interview Questions

TONGUE TWISTER ENGLISH

Image upload code in laravel

how to use vim editor in gitbash

Test Node js ( API Creating and Test in Postman )

Template of Survey papers