Cakeshop

WEB QUẢN LÝ TIỆM BÁNH NGỌT- CAKE SHOP

Sinh viên thực hiện

Mô Tả Dự Án

Ứ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:

Công nghệ sử dụng

Chức năng chính

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,…

Sơ đồ hệ thống Website

Sơ đồ chức năng

image

Sơ đồ thuật toán

Đăng nhập

Screenshot 2025-06-19 111155

Đăng ký

Screenshot 2025-06-19 113019

Người dùng truy cập web khi đã đăng nhập

image

Admin truy cập hệ thống sau khi đăng nhập

image

Sơ đồ khối

gen-h-z6739914805235_5fa9cb3881d6eedb44a8993527471a5f

Sơ đồ cấu trúc (Class Diagram)

Screenshot 2025-06-26 102851


Code minh hoạ Project

Model

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';

}

Controller

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!');
    }
}

View

Cấu trúc chính của view

🔒 Security Setup

Auth

Authorization

CSRF


Một Số Hình Ảnh Chức Năng Chính

Trang Chủ

Screenshot 2025-06-19 033333


Xác thực người dùng (Breeze)

Trang Admin

image

Trang khách hàng(User)

Cài đặt

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

Liên kết