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 -->
@endsection
resources/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>
@endsection
resources/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 -->
@endsection
resources/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 -->
@endsection
resources/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>
@endsection
Routes 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
