Download Laravel App
composer create-project --prefer-dist laravel/laravel my-app
C:\xampp\htdocs\laravel10project>composer create-project laravel/laravel laravel10project
Connecting our Database
open .env file root directory.
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=root
DB_PASSWORD=
Create Model and Migration
C:\xampp\htdocs\laravel\laravelproject>php artisan make:model Product -m
A new file named Product.php will be created in the app directory and database/migrations directory to generate the table in our database
app/Models/Product.php
// <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Product extends Model { use HasFactory; protected $fillable = ['name', 'image', 'description', 'price', 'sold', 'user_id']; public function seller(){ return $this->belongsTo(User::class, 'user_id'); } }database\migrations\create_products_table.php
//database\migrations\create_products_table.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('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('image'); $table->text('description'); $table->bigInteger('price'); $table->boolean('sold')->default(false); $table->bigInteger('user_id'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('products'); } };Create ProductSold
C:\xampp\htdocs\laravel\laravelproject>php artisan make:model ProductSold -m
app/Models/ProductSold.php
//app/Models/ProductSold.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class ProductSold extends Model { use HasFactory; protected $table = 'product_solds'; protected $fillable = ['product_id', 'buyer_id']; public function detail(){ return $this->belongsTo(Product::class, 'product_id'); } }database\migrations\create_product_solds_table.php
//database\migrations\create_product_solds_table.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('product_solds', function (Blueprint $table) { $table->id(); $table->bigInteger('product_id'); $table->bigInteger('buyer_id'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('product_solds'); } };Update User Model and table
database\migrations\create_users_table.php
//database\migrations\create_users_table.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('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->string('username'); $table->rememberToken(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('users'); } };app/Models/User.php
//app/Models/User.php <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; /** * The attributes that are mass assignable. * * @var array<int, string> */ protected $fillable = [ 'name', 'email', 'password', 'username', ]; /** * The attributes that should be hidden for serialization. * * @var array<int, string> */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast. * * @var array<string, string> */ protected $casts = [ 'email_verified_at' => 'datetime', ]; public function purchases(){ return $this->hasMany(ProductSold::class, 'buyer_id')->orderBy('created_at', 'DESC'); } }Database Migration
php artisan migrate
C:\xampp\htdocs\laravel\laravel10project>php artisan migrate
Migration table created successfully.
check database table
Create Controller
php artisan make:controller AuthController
C:\xampp\htdocs\laravel\my-app>php artisan make:controller AuthController
app/Http/Controllers/AuthController.php
//app/Http/Controllers/AuthController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; class AuthController extends Controller { public function login(){ if(Auth::check()){ return redirect()->route('product.index'); } return view('auth.login'); } public function post(Request $request){ $credentials = [ 'username' => $request->username, 'password' => $request->password ]; if(Auth::attempt($credentials)){ return redirect()->route('product.index'); } return back()->with('error', 'Incorrect User User Name or Password'); } public function register(){ if(Auth::check()){ return redirect()->route('product.index'); } return view('auth.register'); } public function postRegister(Request $request){ $check_email = User::where('email', $request->email)->first(); if($check_email){ return back()->with('error', 'Email already in use'); } $user = User::create([ 'username' => $request->username, 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password) ]); $credentials = [ 'username' => $user->username, 'password' => $request->password, ]; Auth::attempt($credentials); return redirect()->route('profile.index')->with('success', 'Congratulations, your account can be used! After exiting, Login using User ID and Password'); } public function logout(){ Auth::logout(); return redirect()->route('login'); } }Create Controller
php artisan make:controller ProfileController
C:\xampp\htdocs\laravel\my-app>php artisan make:controller ProfileController
app/Http/Controllers/ProfileController.php
//app/Http/Controllers/ProfileController.php <?php namespace App\Http\Controllers; use App\Models\Product; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class ProfileController extends Controller { public function index(){ return view('pages.profile'); } public function purchase(){ return view('pages.purchase'); } }Create Controller
php artisan make:controller ProductController
C:\xampp\htdocs\laravel\my-app>php artisan make:controller ProductController
app/Http/Controllers/ProductController.php
//app/Http/Controllers/ProductController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\Product; use App\Models\ProductSold; use Illuminate\Support\Facades\Auth; class ProductController extends Controller { public function index(Request $request){ $products = Product::orderBy('sold', 'ASC'); if($request->sort == 'asc'){ $products = $products->orderBy('name', 'ASC')->get(); }else if($request->sort == 'desc'){ $products = $products->orderBy('name', 'DESC')->get(); }else{ $products = $products->orderBy('created_at', 'DESC')->orderBy('updated_at', 'DESC')->get(); } return view('pages.products', compact('products')); } public function create(){ return view('pages.create'); } public function store(Request $request){ if($request->price < 1){ return back()->with('error', 'Minimum price is $. 1'); } $file = $request->file('image'); $fileName = 'product_' . time() . '.' . $file->extension(); $file->move(public_path('assets/img'), $fileName); Product::create([ 'name' => $request->name, 'image' => $fileName, 'description' => $request->description, 'price' => $request->price, 'sold' => "0", 'user_id' => Auth::user()->id, ]); return back()->with('success', 'Congratulations, your product has been successfully created. Wait until your product is sold'); } public function buy($id){ $product = Product::findOrFail($id); if($product->user_id == Auth::user()->id){ return back()->with('error', "Purchase failed, you can't buy your own product"); } ProductSold::create([ 'product_id' => $product->id, 'buyer_id' => Auth::user()->id, ]); $product->update([ 'sold' => true, ]); return back()->with('success', 'Congratulations, the product has been purchased successfully'); } public function my(){ $products = Product::where('user_id', Auth::user()->id)->orderBy('sold', 'asc')->get(); return view('pages.my', compact('products')); } }View Blade
Download Bootstrap AdminLTE
https://github.com/ColorlibHQ/AdminLTE/releases
Create folder layouts and add new file app.blade.php resources/views/layouts/app.blade.php
//resources/views/layouts/app.blade.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>AdminLTE 3 | User Profile</title> <!-- Google Font: Source Sans Pro --> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"> <!-- Font Awesome --> <link rel="stylesheet" href="../assets/fontawesome-free/css/all.min.css"> <!-- Theme style --> <link rel="stylesheet" href="../assets/css/adminlte.min.css"> </head> <body class="hold-transition sidebar-mini"> <div class="wrapper"> <!-- Navbar --> <nav class="main-header navbar navbar-expand navbar-white navbar-light"> <!-- Left navbar links --> <ul class="navbar-nav"> <li class="nav-item"> <a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a> </li> <li class="nav-item d-none d-sm-inline-block"> <a href="../../index3.html" class="nav-link">Home</a> </li> <li class="nav-item d-none d-sm-inline-block"> <a href="{{ route('logout') }}" class="nav-link">Log Out</a> </li> </ul> </nav> <!-- /.navbar --> <!-- Main Sidebar Container --> <aside class="main-sidebar sidebar-dark-primary elevation-4"> <!-- Brand Logo --> <a href="../../index3.html" class="brand-link"> <img src="../assets/img/AdminLTELogo.png" alt="AdminLTE Logo" class="brand-image img-circle elevation-3" style="opacity: .8"> <span class="brand-text font-weight-light">AdminLTE 3</span> </a> <!-- Sidebar --> <div class="sidebar"> <!-- Sidebar user (optional) --> <div class="user-panel mt-3 pb-3 mb-3 d-flex"> <div class="image"> <img src="../assets/img/avatar4.png" class="img-circle elevation-2" alt="User Image"> </div> <div class="info"> <a href="#" class="d-block">{{ Auth::user()->name }}</a> </div> </div> <!-- SidebarSearch Form --> <div class="form-inline"> <div class="input-group" data-widget="sidebar-search"> <input class="form-control form-control-sidebar" type="search" placeholder="Search" aria-label="Search"> <div class="input-group-append"> <button class="btn btn-sidebar"> <i class="fas fa-search fa-fw"></i> </button> </div> </div> </div> <!-- Sidebar Menu --> <nav class="mt-2"> <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false"> <li class="nav-item menu-open"> <a href="#" class="nav-link active"> <i class="nav-icon fas fa-book"></i> <p> Pages <i class="fas fa-angle-left right"></i> </p> </a> <ul class="nav nav-treeview"> <li class="nav-item"> <a href="{{ route('product.index') }}" class="nav-link"> <i class="far fa-circle nav-icon"></i> <p>Product</p> </a> </li> <li class="nav-item"> <a href="{{ route('product.create') }}" class="nav-link"> <i class="far fa-circle nav-icon"></i> <p>Add Product</p> </a> </li> <li class="nav-item"> <a href="{{ route('product.my') }}" class="nav-link"> <i class="far fa-circle nav-icon"></i> <p>My Product</p> </a> </li> <li class="nav-item"> <a href="{{ route('profile.purchase') }}" class="nav-link"> <i class="far fa-circle nav-icon"></i> <p>Purchase</p> </a> </li> <li class="nav-item"> <a href="{{ route('profile.index') }}" class="nav-link"> <i class="far fa-circle nav-icon"></i> <p>Profile</p> </a> </li> <li class="nav-item"> <a href="{{ route('logout') }}" class="nav-link"> <i class="far fa-circle nav-icon"></i> <p>Logout</p> </a> </li> </ul> </li> </ul> </nav> <!-- /.sidebar-menu --> </div> <!-- /.sidebar --> </aside> <!-- Content Wrapper. Contains page content --> <div class="content-wrapper"> @if(session('success')) <div class="alert alert-success" role="alert"> {{ session('success') }} </div> @endif @if(session('error')) <div class="alert alert-danger" role="alert"> {{ session('error') }} </div> @endif @yield('content') </div> <!-- /.content-wrapper --> <footer class="main-footer"> <div class="float-right d-none d-sm-block"> <b>Version</b> 3.2.0 </div> <strong>Copyright © 2014-2021 <a href="https://adminlte.io">AdminLTE.io</a>.</strong> All rights reserved. </footer> <!-- Control Sidebar --> <aside class="control-sidebar control-sidebar-dark"> <!-- Control sidebar content goes here --> </aside> <!-- /.control-sidebar --> </div> <!-- ./wrapper --> <!-- jQuery --> <script src="../assets/jquery/jquery.min.js"></script> <!-- Bootstrap 4 --> <script src="../assets/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- AdminLTE App --> <script src="../assets/js/adminlte.min.js"></script> <!-- AdminLTE for demo purposes --> <script src="../assets/js/demo.js"></script> </body> </html>Create folder assets public\assets
Copy folder bootstrap, css, fontasome-free, icheck-bootstrap,img,jquery and js folder from download AdminLTE add to public\assets
Create folder auth and file resources/views/auth/login.blade.php
//resources/views/auth/login.blade.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>AdminLTE 3 | Log in</title> <!-- Google Font: Source Sans Pro --> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"> <!-- Font Awesome --> <link rel="stylesheet" href="../assets/fontawesome-free/css/all.min.css"> <!-- icheck bootstrap --> <link rel="stylesheet" href="../assets/icheck-bootstrap/icheck-bootstrap.min.css"> <!-- Theme style --> <link rel="stylesheet" href="../assets/css/adminlte.min.css"> </head> <body class="hold-transition login-page"> <div class="login-box"> <div class="login-logo"> <a href="../../index2.html"><b>Admin</b>LTE</a> </div> <!-- /.login-logo --> <div class="card"> <div class="card-body login-card-body"> <p class="login-box-msg">Sign in to start your session</p> @if(session('success')) <div class="alert alert-success" role="alert"> {{ session('success') }} </div> @endif @if(session('error')) <div class="alert alert-danger text-light" role="alert"> {{ session('error') }} </div> @endif <form action="{{ route('login') }}" method="POST"> @csrf <div class="input-group mb-3"> <input type="text" name="username" class="form-control" placeholder="User Name"> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-envelope"></span> </div> </div> </div> <div class="input-group mb-3"> <input type="password" name="password" class="form-control" placeholder="Password"> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-lock"></span> </div> </div> </div> <div class="row"> <div class="col-8"> <div class="icheck-primary"> <input type="checkbox" id="remember"> <label for="remember"> Remember Me </label> </div> </div> <!-- /.col --> <div class="col-4"> <button type="submit" class="btn btn-primary btn-block">Sign In</button> </div> <!-- /.col --> </div> </form> <div class="social-auth-links text-center mb-3"> <p>- OR -</p> <a href="#" class="btn btn-block btn-primary"> <i class="fab fa-facebook mr-2"></i> Sign in using Facebook </a> <a href="#" class="btn btn-block btn-danger"> <i class="fab fa-google-plus mr-2"></i> Sign in using Google+ </a> </div> <!-- /.social-auth-links --> <p class="mb-1"> <a href="forgot-password.html">I forgot my password</a> </p> <p class="mb-0"> <a href="{{ route('register') }}" class="text-center">Register a new membership</a> </p> </div> <!-- /.login-card-body --> </div> </div> <!-- /.login-box --> <!-- jQuery --> <script src="../assets/jquery/jquery.min.js"></script> <!-- Bootstrap 4 --> <script src="../assets/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- AdminLTE App --> <script src="../assets/js/adminlte.min.js"></script> </body> </html>resources/views/auth/register.blade.php
//resources/views/auth/register.blade.php <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>AdminLTE 3 | Registration Page</title> <!-- Google Font: Source Sans Pro --> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback"> <!-- Font Awesome --> <link rel="stylesheet" href="../assets/fontawesome-free/css/all.min.css"> <!-- icheck bootstrap --> <link rel="stylesheet" href="../assets/icheck-bootstrap/icheck-bootstrap.min.css"> <!-- Theme style --> <link rel="stylesheet" href="../assets/css/adminlte.min.css"> </head> <body class="hold-transition register-page"> <div class="register-box"> <div class="register-logo"> <a href="../../index2.html"><b>Admin</b>LTE</a> </div> <div class="card"> <div class="card-body register-card-body"> <p class="login-box-msg">Register a new membership</p> @if(session('error')) <div class="alert alert-danger text-light text-center m-2" role="alert"> {{ session('error') }} </div> @endif <form action="{{ route('register.store') }}" method="POST" role="form text-left"> @csrf <div class="input-group mb-3"> <input type="text" name="name" class="form-control" placeholder="Full name" required> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-user"></span> </div> </div> </div> <div class="input-group mb-3"> <input type="text" name="username" class="form-control" placeholder="User name" required> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-user"></span> </div> </div> </div> <div class="input-group mb-3"> <input type="email" name="email" class="form-control" placeholder="Email" required> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-envelope"></span> </div> </div> </div> <div class="input-group mb-3"> <input type="password" name="password" class="form-control" placeholder="Password" required> <div class="input-group-append"> <div class="input-group-text"> <span class="fas fa-lock"></span> </div> </div> </div> <div class="row"> <div class="col-8"> <div class="icheck-primary"> <input type="checkbox" id="agreeTerms" name="terms" value="agree"> <label for="agreeTerms"> I agree to the <a href="#">terms</a> </label> </div> </div> <!-- /.col --> <div class="col-4"> <button type="submit" class="btn btn-primary btn-block">Register</button> </div> <!-- /.col --> </div> </form> <div class="social-auth-links text-center"> <p>- OR -</p> <a href="#" class="btn btn-block btn-primary"> <i class="fab fa-facebook mr-2"></i> Sign up using Facebook </a> <a href="#" class="btn btn-block btn-danger"> <i class="fab fa-google-plus mr-2"></i> Sign up using Google+ </a> </div> <a href="{{ route('login') }}" class="text-center">I already have a membership</a> </div> <!-- /.form-box --> </div><!-- /.card --> </div> <!-- /.register-box --> <!-- jQuery --> <script src="../assets/jquery/jquery.min.js"></script> <!-- Bootstrap 4 --> <script src="../assets/bootstrap/js/bootstrap.bundle.min.js"></script> <!-- AdminLTE App --> <script src="../assets/js/adminlte.min.js"></script> </body> </html>Create folder pages and add files
resources/views/pages/profile.blade.php
//resources/views/pages/profile.blade.php @extends('layouts.app') @section('content') <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>Profile</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="#">Home</a></li> <li class="breadcrumb-item active">User Profile</li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <!-- Main content --> <section class="content"> <div class="container-fluid"> <div class="row"> <div class="col-md-3"> <!-- Profile Image --> <div class="card card-primary card-outline"> <div class="card-body box-profile"> <div class="text-center"> <img class="profile-user-img img-fluid img-circle" src="../assets/img/avatar4.png" alt="User profile picture"> </div> <h3 class="profile-username text-center">{{ Auth::user()->name }} - {{ Auth::user()->username }}</h3> <p class="text-muted text-center">{{ Auth::user()->email }}</p> <ul class="list-group list-group-unbordered mb-3"> <li class="list-group-item"> <b>Followers</b> <a class="float-right">1,322</a> </li> <li class="list-group-item"> <b>Following</b> <a class="float-right">543</a> </li> <li class="list-group-item"> <b>Friends</b> <a class="float-right">13,287</a> </li> </ul> <a href="#" class="btn btn-primary btn-block"><b>Follow</b></a> </div> <!-- /.card-body --> </div> <!-- /.card --> <!-- About Me Box --> <div class="card card-primary"> <div class="card-header"> <h3 class="card-title">About Me</h3> </div> <!-- /.card-header --> <div class="card-body"> <strong><i class="fas fa-book mr-1"></i> Education</strong> <p class="text-muted"> B.S. in Computer Science from the University of Tennessee at Knoxville </p> <hr> <strong><i class="fas fa-map-marker-alt mr-1"></i> Location</strong> <p class="text-muted">Malibu, California</p> <hr> <strong><i class="fas fa-pencil-alt mr-1"></i> Skills</strong> <p class="text-muted"> <span class="tag tag-danger">UI Design</span> <span class="tag tag-success">Coding</span> <span class="tag tag-info">Javascript</span> <span class="tag tag-warning">PHP</span> <span class="tag tag-primary">Node.js</span> </p> <hr> <strong><i class="far fa-file-alt mr-1"></i> Notes</strong> <p class="text-muted">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam fermentum enim neque.</p> </div> <!-- /.card-body --> </div> <!-- /.card --> </div> <!-- /.col --> <div class="col-md-9"> <div class="card"> <div class="card-header p-2"> <ul class="nav nav-pills"> <li class="nav-item"><a class="nav-link active" href="#activity" data-toggle="tab">Activity</a></li> <li class="nav-item"><a class="nav-link" href="#timeline" data-toggle="tab">Timeline</a></li> <li class="nav-item"><a class="nav-link" href="#settings" data-toggle="tab">Settings</a></li> </ul> </div><!-- /.card-header --> <div class="card-body"> <div class="tab-content"> <div class="active tab-pane" id="activity"> activity </div> <!-- /.tab-pane --> <div class="tab-pane" id="timeline"> timeline </div> <!-- /.tab-pane --> <div class="tab-pane" id="settings"> <form class="form-horizontal"> <div class="form-group row"> <label for="inputName" class="col-sm-2 col-form-label">Name</label> <div class="col-sm-10"> <input type="email" class="form-control" id="inputName" placeholder="Name"> </div> </div> <div class="form-group row"> <label for="inputEmail" class="col-sm-2 col-form-label">Email</label> <div class="col-sm-10"> <input type="email" class="form-control" id="inputEmail" placeholder="Email"> </div> </div> <div class="form-group row"> <label for="inputName2" class="col-sm-2 col-form-label">Name</label> <div class="col-sm-10"> <input type="text" class="form-control" id="inputName2" placeholder="Name"> </div> </div> <div class="form-group row"> <label for="inputExperience" class="col-sm-2 col-form-label">Experience</label> <div class="col-sm-10"> <textarea class="form-control" id="inputExperience" placeholder="Experience"></textarea> </div> </div> <div class="form-group row"> <label for="inputSkills" class="col-sm-2 col-form-label">Skills</label> <div class="col-sm-10"> <input type="text" class="form-control" id="inputSkills" placeholder="Skills"> </div> </div> <div class="form-group row"> <div class="offset-sm-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox"> I agree to the <a href="#">terms and conditions</a> </label> </div> </div> </div> <div class="form-group row"> <div class="offset-sm-2 col-sm-10"> <button type="submit" class="btn btn-danger">Submit</button> </div> </div> </form> </div> <!-- /.tab-pane --> </div> <!-- /.tab-content --> </div><!-- /.card-body --> </div> <!-- /.card --> </div> <!-- /.col --> </div> <!-- /.row --> </div><!-- /.container-fluid --> </section> <!-- /.content --> @endsectionresources/views/pages/create.blade.php
//resources/views/pages/create.blade.php @extends('layouts.app') @section('content') <div class="container-fluid py-4"> <div class="row"> <div class="col-12 col-lg-6"> <div class="card"> <div class="card-body p-3"> <h5>Add Product</h5> <hr> <form action="{{ route('product.store') }}" method="POST" enctype="multipart/form-data"> @csrf <div class="form-group"> <label for="name" class="form-control-label">Name</label> <input type="text" name="name" class="form-control" id="name" required> </div> <div class="form-group"> <label for="image" class="form-control-label">Image</label> <input type="file" name="image" class="form-control form-control-file" id="image" accept=".jpg, .png, .svg" required> </div> <div class="form-group"> <label for="description" class="form-control-label">Description</label> <textarea rows="6" name="description" class="form-control" id="description" required></textarea> </div> <div class="form-group"> <label for="price" class="form-control-label">Price</label> <input type="number" name="price" class="form-control" id="price" required> <small>* Minimal $. 1</small> </div> <div class="form-group"> <button class="btn btn-primary">Add</button> </div> </form> </div> </div> </div> </div> </div> @endsectionresources/views/pages/my.blade.php
//resources/views/pages/my.blade.php @extends('layouts.app') @section('content') <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>My Product</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="#">Home</a></li> <li class="breadcrumb-item active">My Product</li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <!-- Main content --> <section class="content"> <div class="container-fluid"> <div class="row"> @if($products->count() > 0) @foreach($products as $product) <div class="col-xl-3 col-sm-6 mb-4"> <div class="card"> <div class="card-header text-center"> <img src="{{ asset('assets/img') }}/{{ $product->image }}" style="height: 150px; width: 100%; object-fit: contain;"> </div> <div class="card-body p-3"> <div class="row"> <div class="col-8"> <div class="numbers"> <p class="text-sm mb-0 text-capitalize font-weight-bold">{{ $product->name }}</p> <h5 class="font-weight-bolder mb-0"> ${{ number_format($product->price, 0, '.', '.') }} </h5> <small>{{ $product->description }}</small> </div> </div> <div class="col-4 text-end"> @if($product->sold) <span class="btn bg-gradient-danger">Sold</span> @else <span class="btn bg-gradient-success">Active</span> @endif </div> </div> </div> </div> </div> @endforeach @else <div class="col-12"> <div class="card"> <div class="card-body text-center p-3"> <h4>You don't have a product yet</h4> <a href="{{ route('product.create') }}" class="btn bg-gradient-primary">Add Product</a> </div> </div> </div> @endif </div> </div> </section> <!-- /.content --> @endsectionresources/views/pages/products.blade.php
//resources/views/pages/products.blade.php @extends('layouts.app') @section('content') <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>Product</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="#">Home</a></li> <li class="breadcrumb-item active">Product</li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <!-- Main content --> <section class="content"> <div class="container-fluid"> <div class="row"> <div class="col-md-4"> <div class="d-flex align-items-center justify-content-around"> <p class="mb-0">Sort By</p> <select class="form-control w-75" id="sortBy"> <option value="" {{ request()->sort == '' ? 'selected' : '' }}>Latest</option> <option value="asc" {{ request()->sort == 'asc' ? 'selected' : '' }}>Ascending</option> <option value="desc" {{ request()->sort == 'desc' ? 'selected' : '' }}>Descending</option> </select> </div> </div> </div> <div class="row mt-4"> @if($products->count() > 0) @foreach($products as $product) <div class="col-xl-3 col-sm- mb-4"> <div class="card"> <div class="card-header text-center"> <img src="{{ asset('assets/img') }}/{{ $product->image }}" style="height: 150px; width: 100%; object-fit: contain;"> </div> <div class="card-body p-3"> <div class="row"> <div class="col-8"> <div class="numbers"> <small class="d-flex align-items-center text-capitalize"> <i class="ri-store-2-fill me-1"></i> <span>{{ $product->seller->name }}</span> </small> <p class="mb-0 text-capitalize font-weight-bold">{{ $product->name }}</p> <h5 class="font-weight-bolder mb-0"> ${{ number_format($product->price, 0, '.', '.') }} </h5> <small>{{ $product->description }}</small> </div> </div> <div class="col-4 text-end"> @if(!$product->sold) <a href="{{ route('product.buy', $product->id) }}" class="btn bg-gradient-primary">Buy</a> @else <span class="btn bg-gradient-danger">Sold</span> @endif </div> </div> </div> </div> </div> @endforeach @else <div class="col-12"> <div class="card"> <div class="card-body text-center p-3"> <h4>Product Not Available</h4> </div> </div> </div> @endif </div> </div> <script> const sortBy = document.getElementById('sortBy') sortBy.addEventListener('change', function() { const sort = 'sort=' + this.value + '' let url = "{{ route('product.index', ':sort') }}" url = url.replace(':sort', sort) window.location.href = url }) </script> </section> <!-- /.content --> @endsectionresources/views/pages/purchase.blade.php
//resources/views/pages/purchase.blade.php @extends('layouts.app') @section('content') <div class="container-fluid"> <div class="row"> <div class="col-lg-6"> <div class="card"> <div class="card-body p-3"> <h5>Purchase History</h5> <hr> <table class="table align-items-center mb-0"> <thead> <tr> <th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">Product</th> <th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">Seller</th> <th class="text-uppercase text-secondary text-xxs font-weight-bolder opacity-7 ps-2">Date</th> </tr> </thead> <tbody> @foreach(Auth::user()->purchases as $product) <tr> <td> <div class="d-flex align-items-center"> <img src="{{ asset('assets/img') }}/{{ $product->detail->image }}" style="height: 50px; width: 50px; object-fit: contain"/> <div class="ms-2"> <h6 class="mb-0 text-sm text-primary">${{ number_format($product->detail->price, 0, '.', '.') }}</h6> <h6 class="mb-0 text-sm">{{ $product->detail->name }}</h6> </div> </div> </td> <td> <div class="d-flex"> <div class="d-flex flex-column justify-content-center"> <h6 class="mb-0 text-sm">{{ $product->detail->seller->name }}</h6> <p class="text-xs text-secondary mb-0">{{ $product->detail->seller->email }}</p> </div> </div> </td> <td> {{ $product->created_at }} </td> </tr> @endforeach </tbody> </table> </div> </div> </div> </div> </div> @endsectionRoutes
routes/web.php
//routes/web.php <?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\AuthController; use App\Http\Controllers\ProfileController; use App\Http\Controllers\ProductController; Route::get('/', function () { return view('welcome'); }); Route::get('/login', [AuthController::class, 'login'])->name('login'); Route::post('/login', [AuthController::class, 'post'])->name('login'); Route::get('/register', [AuthController::class, 'register'])->name('register'); Route::post('/register', [AuthController::class, 'postRegister'])->name('register.store'); Route::get('/logout', [AuthController::class, 'logout'])->name('logout'); Route::group(['middleware' => 'auth'], function(){ Route::group(['prefix' => 'product', 'as' => 'product.'], function(){ Route::get('/', [ProductController::class, 'index'])->name('index'); Route::get('/create', [ProductController::class, 'create'])->name('create'); Route::post('/create', [ProductController::class, 'store'])->name('store'); Route::get('/buy/{id}', [ProductController::class, 'buy'])->name('buy'); Route::get('/my', [ProductController::class, 'my'])->name('my'); }); Route::group(['prefix' => 'profile', 'as' => 'profile.'], function(){ Route::get('/', [ProfileController::class, 'index'])->name('index'); Route::get('/purchase', [ProfileController::class, 'purchase'])->name('purchase'); }); });Run C:\xampp\htdocs\laravel\my-app>php artisan serve
Starting Laravel development server: http://127.0.0.1:8000