Ứng dụng Laravel giúp quản lý sản phẩm bánh ngọt, danh mục bánh ngọt và ngườ dùng. Hệ thống hỗ trợ đăng nhập, bảo mật, và thao tác CRUD với giao diện đơn giản.Giúp cả quản trị viên và khách hàng dễ dàng sử dụng.
Mục đích:
Quản lý Người dùng (User)
Quản lý Danh mục bánh (Category)
Quản lý bánh ngọt (CRUD)
Bảo mật:CSRF, Validation, Auth, Authorization,…
User Model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\VpProduct;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class VpUser extends Authenticatable implements MustVerifyEmail
{
use HasFactory, HasApiTokens, Notifiable;
protected $table = 'vp_users';
protected $fillable = [
'email',
'password',
'level',
];
protected $hidden = [
'password',
'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
public function favoriteProducts()
{
return $this->belongsToMany(VpProduct::class, 'vp_favourite_products', 'user_id', 'favou_product');
}
}
Product Model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\VpFavouriteProduct;
class VpProduct extends Model
{
use HasFactory;
protected $primaryKey = 'prod_id';
protected $guarded = [];
public function favorite()
{
return $this->hasMany(VpFavouriteProduct::class, 'favou_product', 'prod_id');
}
}
VpCategory Model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class VpCategory extends Model
{
use HasFactory;
protected $primaryKey = 'cate_id';
protected $guarded = [];
}
VpComment Model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class VpComment extends Model
{
use HasFactory;
protected $primaryKey = 'com_id';
}
ProductController
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\AddProductRequest;
use App\Models\VpCategory;
use App\Models\VpProduct;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class ProductController extends Controller
{
public function getProduct()
{
$product_list = DB::table('vp_products')->join('vp_categories','vp_products.prod_cate', '=', 'vp_categories.cate_id')->orderBy('prod_id','desc')->get();
return view('backend.product', compact('product_list'));
}
public function getCreateProduct()
{
$categories = VpCategory::all();
return view('backend.addproduct', compact('categories'));
}
public function postCreateProduct(AddProductRequest $request)
{
$filename = $request->img->getClientOriginalName(); // lay file anh
$product = new VpProduct;
$product->prod_name = $request->product_name;
$product->prod_slug = Str::slug( $request->product_name);
$product->prod_img = $filename;
$product->prod_price = $request->price;
$product->prod_condition = $request->condition;
$product->prod_status = $request->status;
$product->prod_description = $request->description;
$product->prod_cate = $request->cate;
$product->prod_featured = $request->featured;
$request->img->storeAs('avatar',$filename);
$product->save();
return redirect()->intended('admin/product')->with('success', 'Thêm sản phẩm thành công!');;
}
public function getEditProduct($id)
{
$product = VpProduct::find($id);
$categories = VpCategory::all();
return view('backend.editproduct', compact('product', 'categories'));
}
public function putUpdateProduct(AddProductRequest $request, $id)
{
$product = VpProduct::find($id);
$product->prod_name = $request->product_name;
$product->prod_slug = Str::slug($request->product_name);
$product->prod_price = $request->price;
$product->prod_condition = $request->condition;
$product->prod_status = 1;
$product->prod_description = $request->description;
$product->prod_cate = $request->cate;
$product->prod_featured = $request->featured;
if($request->hasFile('img')) {
$img = $request->img->getClientOriginalName();
$product->prod_img = $img;
$request->img->storeAs('avatar',$img);
}
$product->save();
return redirect()->intended('admin/product')->with('success', 'Chỉnh sửa sản phẩm thành công!');;
}
public function getDeleteProduct($id)
{
$product = VpProduct::find($id);
$product->delete();
return redirect()->intended('admin/product')->with('success', 'Xóa sản phẩm thành công!');;
}
}
CategoryController
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\VpCategory;
use Illuminate\Http\Request;
use App\Http\Requests\AddCategoryRequest;
use App\Http\Requests\EditCategoryRequest;
use Illuminate\Support\Str;
class CategoryController extends Controller
{
public function getCategory()
{
$categories = VpCategory::all();
return view('backend.category', compact('categories'));
}
public function postCreateCategory(AddCategoryRequest $request)
{
$category = new VpCategory;
$category->cate_name = $request->category_name;
$category->cate_slug = Str::slug($request->category_name);
$category->save();
return back()->with('success', 'Thêm mới danh mục thành công!');
}
public function getEditCategory($id)
{
$category = VpCategory::find($id);
return view('backend.editcategory', compact('category'));
}
public function putUpdateCategory(EditCategoryRequest $request, $id)
{
$category = VpCategory::find($id);
$category->cate_name = $request->category_name;
$category->cate_slug = Str::slug($request->category_name);
$category->save();
return redirect()->intended('admin/category')->with('success', 'Chỉnh sửa danh mục thành công!');
}
public function getDeleteCategory($id)
{
$category = VpCategory::find($id);
$category->delete();
return redirect()->intended('admin/category')->with('success', 'Xóa danh mục thành công!');
}
}
CommentController
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\VpComment;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function getComment()
{
$comment_not_confirm = VpComment::Where('com_status', 0)->get();
$comment_confirmed = VpComment::Where('com_status', 1)->get();
return view('backend.comment', compact('comment_not_confirm', 'comment_confirmed'));
}
public function getDeleteComment($id)
{
$comment = VpComment::find($id);
$comment->delete();
return redirect()->intended('admin/comment')->with('success', 'Xóa bình luận thành công!');
}
public function confirmComment($id)
{
$comment = VpComment::find($id);
$comment->com_status = 1;
$comment->save();
return redirect()->intended('admin/comment')->with('success', 'Duyệt bình luận thành công!');
}
}
Cấu trúc chính của view
Đăng nhập
Đăng kí
Đổi mật khẩu
Trang quản lí người dùng- Tài khoản khách hàng
Trang danh sách sản phẩm
+Thêm, sửa, xóa sản phẩm
Trang danh mục sản phẩm ( Thêm mới, sửa, xóa )
Tìm kiếm bánh mong muốn
Chức năng cho phép người dùng lọc sản phẩm theo từng loại bánh, giúp dễ dàng tìm kiếm sản phẩm phù hợp.
Người dùng có thể click vào một sản phẩm bất kỳ từ danh sách để chuyển đến trang chi tiết, nơi hiển thị đầy đủ thông tin về sản phẩm.
Chức năng cho phép khách hàng chọn mua sản phẩm, lưu vào giỏ hàng và tiến hành thanh toán.
git clone 'url'
composer install
cp .env.example .env
php artisan key:generate
# Cập nhật thông tin DB trong .env
php artisan migrate --seed
Tài khoản mẫu
//admin
Email: admin@gmail.com
Pass: 123456
//user
Email: user@gmail.com
Pass: 123456