🎂 Sweet Cake Shop - Made with ❤️ using Laravel
Bài tập giữa kỳ - Lập trình Web
🎯 Tên bài tập: Website Bán Bánh Kem với Laravel Framework 🔗 Link Repository: https://github.com/nqthanhhh/Cake_shop.git
Sweet Cake Shop là một ứng dụng web thương mại điện tử chuyên bán bánh kem được xây dựng bằng Laravel Framework. Dự án cung cấp trải nghiệm mua sắm trực tuyến hoàn chỉnh với giao diện thân thiện người dùng, hệ thống bảo mật cao và quản lý đơn hàng hiệu quả.
composer.json
, bootstrap/app.php
routes/web.php
và routes/auth.php
Dự án đã triển khai 9 đối tượng chính:
Model | File Path | Chức năng |
---|---|---|
User | app/Models/User.php |
Quản lý người dùng, authentication |
Admin | app/Models/Admin.php |
Quản lý tài khoản admin |
Product | app/Models/Product.php |
Quản lý sản phẩm bánh kem |
Category | app/Models/Category.php |
Phân loại sản phẩm theo danh mục |
Cart | app/Models/Cart.php |
Giỏ hàng người dùng |
Order | app/Models/Order.php |
Đơn hàng |
OrderItem | app/Models/OrderItem.php |
Chi tiết đơn hàng |
Review | app/Models/Review.php |
Đánh giá sản phẩm |
Contact | app/Models/Contact.php |
Liên hệ từ khách hàng |
Authentication Controllers:
app/Http/Controllers/Auth/RegisteredUserController.php
- Đăng kýapp/Http/Controllers/Auth/AuthenticatedSessionController.php
- Đăng nhập/Đăng xuấtapp/Http/Controllers/Auth/PasswordController.php
- Đổi mật khẩuapp/Http/Controllers/Auth/EmailVerificationController.php
- Xác thực emailTính năng đã triển khai:
// Registration với validation
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
'password' => ['required', 'confirmed', Rules\Password::defaults()],
]);
// Login với session regeneration
$request->authenticate();
$request->session()->regenerate();
return redirect()->route('dashboard');
CRUD hoàn chỉnh cho Cart (Giỏ hàng):
Operation | Method | Route | Controller Method |
---|---|---|---|
Create | POST | /cart/add |
CartController@addToCart |
Read | GET | /cart |
CartController@getCart |
Update | PUT | /cart/update |
CartController@updateCart |
Delete | DELETE | /cart/{id} |
CartController@removeFromCart |
Code example:
// CREATE - Thêm sản phẩm vào giỏ
public function addToCart(Request $request) {
$cart = Cart::updateOrCreate(
['user_id' => auth()->id(), 'product_id' => $productId],
['quantity' => DB::raw("quantity + $quantity")]
);
}
// UPDATE - Cập nhật số lượng
public function updateCart(Request $request) {
$cartItem = Cart::where('user_id', auth()->id())
->where('product_id', $productId)->first();
$cartItem->quantity = $quantity;
$cartItem->save();
}
CRUD cho Order (Đơn hàng):
OrderController@store
- Tạo đơn hàng mớiOrderController@show
- Xem chi tiết đơn hàngCRUD cho Product (Admin):
AdminController@createProduct
- Thêm sản phẩm mớiAdminController@products
- Danh sách sản phẩmAdminController@updateProduct
- Cập nhật sản phẩmAdminController@deleteProduct
- Xóa sản phẩm// Tạo sản phẩm mới
public function storeProduct(Request $request) {
$request->validate([
'name' => 'required|string|max:255',
'description' => 'required|string',
'price' => 'required|numeric|min:1000',
'image' => 'required|image|mimes:jpeg,png,jpg,gif',
'category_id' => 'required|integer|exists:categories,id',
'stock' => 'required|integer|min:0',
]);
$imagePath = $request->file('image')->store('img', 'public');
Product::create([
'name' => $request->name,
'description' => $request->description,
'price' => $request->price,
'image' => 'storage/' . $imagePath,
'category_id' => $request->category_id,
'stock' => $request->stock,
'is_featured' => true
]);
}
CRUD cho Review (Đánh giá):
ReviewController@store
- Thêm đánh giáAdminController@deleteReview
- Admin xóa đánh giá// Thêm đánh giá sản phẩm
public function store(Request $request) {
$request->validate([
'product_id' => 'required|exists:products,id',
'rating' => 'required|integer|min:1|max:5',
'comment' => 'required|string',
]);
Review::create([
'user_id' => auth()->id(),
'product_id' => $request->product_id,
'rating' => $request->rating,
'comment' => $request->comment,
]);
}
<form method="POST" action="">
@csrf
<!-- form fields -->
</form>
// Trong OrderController.php
$request->validate([
'customer_name' => 'required|string|max:255',
'customer_email' => 'required|email|max:255',
'customer_phone' => 'required|string|max:20',
'customer_address' => 'required|string|max:500',
'delivery_date' => 'required|date|after:today',
'notes' => 'nullable|string|max:1000'
]);
// Trong CartController.php
$request->validate([
'product_id' => 'required|integer',
'quantity' => 'required|integer|min:1'
]);
// Middleware protection trong routes/web.php
Route::middleware('auth')->group(function () {
Route::post('/cart/add', [CartController::class, 'addToCart']);
Route::get('/checkout', [OrderController::class, 'checkout']);
Route::get('/dashboard', [UserDashboardController::class, 'index']);
});
// Authorization check trong OrderController
if ($order->user_id !== auth()->id()) {
abort(403, 'Bạn không có quyền xem đơn hàng này.');
}
#### **SQL Injection Prevention:**
```php
// Sử dụng Eloquent ORM thay vì raw SQL
Cart::where('user_id', auth()->id())->with('product')->get();
Order::where('id', $orderId)->where('user_id', Auth::id())->firstOrFail();
// Session management
$request->session()->regenerate(); // Trong login
$request->session()->invalidate(); // Trong logout
$request->session()->regenerateToken(); // CSRF protection
Database Migrations:
database/migrations/
├── 0001_01_01_000000_create_users_table.php
├── 0001_01_01_000001_create_cache_table.php
├── 0001_01_01_000002_create_jobs_table.php
├── 2025_06_12_061855_create_categories_table.php
├── 2025_06_12_061855_create_products_table.php
├── 2025_06_12_061855_create_orders_table.php
├── 2025_06_12_061856_create_cart_table.php
├── 2025_06_12_061856_create_order_items_table.php
├── 2025_06_12_061856_create_reviews_table.php
└── 2025_06_17_093212_add_detailed_description_to_products_table.php
Seeders với dữ liệu mẫu:
database/seeders/
├── DatabaseSeeder.php
├── CategorySeeder.php
└── ProductSeeder.php
Migration example:
// products table
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description');
$table->decimal('price', 10, 2);
$table->string('image');
$table->foreignId('category_id')->constrained()->onDelete('cascade');
$table->integer('stock')->default(0);
$table->boolean('is_featured')->default(false);
$table->boolean('is_active')->default(true);
$table->timestamps();
});
Loại | Công nghệ | Phiên bản | Mô tả |
---|---|---|---|
Backend | Laravel | 12.x | PHP Framework chính |
Authentication | Laravel Breeze | 2.3+ | Hệ thống xác thực |
Database | MySQL/SQLite | 8.0+ | Cơ sở dữ liệu |
Frontend | Blade Templates | - | Template engine |
CSS Framework | TailwindCSS | 3.x | Styling và responsive |
Icons | RemixIcon | 4.6.0 | Bộ icon UI |
JavaScript | Vanilla JS | ES6+ | Frontend interactions |
File Storage | Laravel Storage | - | Upload và quản lý file |
Session | Laravel Session | - | Quản lý phiên |
Validation | Laravel Validation | - | Kiểm tra dữ liệu |
Security | Laravel Security | - | CSRF, XSS protection |
Sơ đồ kiến trúc hệ thống MVC Laravel
Luồng xử lý MVC trong Laravel
Sơ đồ quan hệ cơ sở dữ liệu
Luồng xác thực và phân quyền
Frontend Controllers:
HomeController
- Trang chủ và danh sách sản phẩm nổi bậtProductController
- Chi tiết sản phẩm với reviewsCategoryController
- Danh mục sản phẩm theo slugCartController
- Quản lý giỏ hàng (CRUD) với session/databaseOrderController
- Quản lý đơn hàng (CRUD) với order trackingUserDashboardController
- Dashboard người dùng với order historyReviewController
- Đánh giá sản phẩm với validationContactController
- Liên hệ từ khách hàngAuth/*
- Các controller xác thực (Laravel Breeze)Admin Controllers:
Admin\AdminController
- Quản lý toàn bộ admin panelAdmin\Auth\LoginController
- Đăng nhập admin riêng biệt với guardMiddleware Layer:
AdminMiddleware
- Kiểm tra quyền adminAuthenticate
- Kiểm tra đăng nhậpVerifyCsrfToken
- CSRF ProtectionEncryptCookies
- Cookie encryptionusers (id, name, email, password, phone, address, is_admin, timestamps)
admins (id, name, email, password, timestamps)
categories (id, name, description, image, slug, timestamps)
products (id, name, description, detailed_description, price, image, category_id, stock, is_featured, is_active, timestamps)
carts (id, user_id, product_id, quantity, timestamps)
orders (id, user_id, order_number, total_amount, status, payment_method, payment_status, customer_*, delivery_date, delivery_time, timestamps)
order_items (id, order_id, product_name, product_price, product_image, quantity, total_price, timestamps)
reviews (id, user_id, product_id, rating, comment, timestamps)
contacts (id, name, email, phone, message, timestamps)
Admin Authorization Example:
// Config auth guards
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
],
// Admin middleware protection
Route::middleware('auth:admin')->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard']);
Route::get('/users', [AdminController::class, 'users']);
Route::get('/orders', [AdminController::class, 'orders']);
});
// Admin login controller
public function login(Request $request) {
if (Auth::guard('admin')->attempt($credentials)) {
return redirect('/admin/dashboard');
}
return back()->with('error', 'Sai thông tin đăng nhập admin!');
}
Add commentMore actions
1. Clone repository:
git clone https://github.com/nqthanhhh/Cake_shop.git
cd Cake_Shop
2. Cài đặt dependencies:
# Install PHP dependencies
composer install
# Install Node dependencies
npm install
3. Cấu hình environment:
# Copy file environment
cp .env.example .env
# Generate application key
php artisan key:generate
4. Cấu hình database:
# Chỉnh sửa .env file
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cake_shop
DB_USERNAME=root
DB_PASSWORD=your_password
5. Migration và Seeding:
# Tạo database structure
php artisan migrate
# Seed dữ liệu mẫu
php artisan db:seed
6. Build frontend assets:
# Development
npm run dev
# Production
npm run build
7. Chạy server:
# Start development server
php artisan serve
# Application sẽ chạy tại: http://localhost:8000
Add comment —
GET /login - Trang đăng nhập user
POST /login - Xử lý đăng nhập user
GET /register - Trang đăng ký
POST /register - Xử lý đăng ký
POST /logout - Đăng xuất user
GET /forgot-password - Quên mật khẩu
POST /reset-password - Reset mật khẩu
GET /admin/login - Trang đăng nhập admin
POST /admin/login - Xử lý đăng nhập admin
POST /admin/logout - Đăng xuất admin
GET /admin/dashboard - Dashboard admin
GET /admin/users - Quản lý user
GET /admin/orders - Quản lý đơn hàng
GET /admin/products - Quản lý sản phẩm
GET /admin/contacts - Quản lý liên hệ
POST /cart/add - Thêm sản phẩm vào giỏ
GET /cart - Xem giỏ hàng
PUT /cart/update - Cập nhật số lượng
DELETE /cart/{id} - Xóa sản phẩm
POST /cart/delete-multiple - Xóa nhiều sản phẩm
GET /cart/count - Đếm số sản phẩm
GET /checkout - Trang thanh toán
POST /order - Tạo đơn hàng
GET /order/success/{id} - Trang thành công
GET /order/{id} - Chi tiết đơn hàng
GET /order-tracking - Theo dõi đơn hàng
POST /order/{id}/cancel - Hủy đơn hàng
POST /reviews - Thêm đánh giá sản phẩm
POST /contact - Gửi liên hệ
GET / - Trang chủ
GET /product/{id} - Chi tiết sản phẩm
GET /category/{slug} - Sản phẩm theo danh mục
# Optimize for production
php artisan optimize
php artisan config:cache
php artisan route:cache
php artisan view:cache
# Environment setup
APP_ENV=production
APP_DEBUG=false
Yêu cầu | Trạng thái | Mô tả chi tiết |
---|---|---|
Laravel Framework | ✅ HOÀN THÀNH | Laravel 12.x với cấu trúc MVC hoàn chỉnh |
03+ Objects | ✅ VƯỢT MỨC | 9 Models: User, Admin, Product, Category, Cart, Order, OrderItem, Review, Contact |
Authentication | ✅ HOÀN THÀNH | Laravel Breeze + Admin Guard riêng biệt |
CRUD Operations | ✅ VƯỢT MỨC | Cart, Order, Product, Review với đầy đủ CRUD |
Security Features | ✅ HOÀN THÀNH | CSRF, XSS, Validation, Auth, SQL Injection Prevention |
Eloquent Migration | ✅ HOÀN THÀNH | 12+ migrations với relationships phức tạp |
README Documentation | ✅ HOÀN THÀNH | Chi tiết và comprehensive với code examples |
1. Kiến trúc hệ thống:
2. Tính năng phong phú:
3. Chất lượng code:
4. User Experience:
Thành phần | Số lượng | Mô tả chi tiết |
---|---|---|
Models | 9 | User, Admin, Product, Category, Cart, Order, OrderItem, Review, Contact |
Controllers | 15+ | Frontend + Admin + Auth + Specialized controllers |
Migrations | 15+ | Bao gồm cả core và custom migrations |
Seeders | 4 | DatabaseSeeder, AdminSeeder, CategorySeeder, ProductSeeder |
Routes | 40+ | Public, Auth, Admin routes với middleware protection |
Views | 30+ | Frontend, Admin, Auth templates với layouts |
Middleware | 6+ | Auth, CSRF, Admin, Encrypt, Guest, Verified |
Guards | 2 | Web (users) và Admin (admins) authentication guards |
Validation Rules | 20+ | Custom validation cho forms và API endpoints |
Database Tables | 12+ | Normalized schema với foreign key constraints |
E-commerce Purchase Flow:
Quy trình mua hàng từ browse đến checkout
Admin Management Flow:
Luồng quản lý admin panel
Real-time Cart Count Updates:
// Frontend JavaScript - Real-time cart updates
function updateCartCount() {
fetch("/cart/count")
.then((response) => response.json())
.then((data) => {
document.getElementById("cartCount").textContent = data.count;
});
}
// Auto-update after cart operations
document.addEventListener("cartUpdated", updateCartCount);
Dynamic Address Selection:
// Location API integration
async function loadDistricts(provinceId) {
const response = await fetch(`/api/districts/${provinceId}`);
const districts = await response.json();
updateSelectOptions("district", districts);
}
async function loadWards(districtId) {
const response = await fetch(`/api/wards/${districtId}`);
const wards = await response.json();
updateSelectOptions("ward", wards);
}
Order Status Tracking:
// Order tracking với timeline
public function getOrderTimeline()
{
$timeline = [];
$timeline[] = [
'status' => 'pending',
'label' => 'Đơn hàng đã được tạo',
'timestamp' => $this->created_at,
'completed' => true
];
if ($this->status !== 'pending') {
$timeline[] = [
'status' => 'confirmed',
'label' => 'Đơn hàng đã được xác nhận',
'timestamp' => $this->updated_at,
'completed' => in_array($this->status, ['confirmed', 'preparing', 'ready', 'delivered'])
];
}
// Add more timeline steps...
return $timeline;
}
Tính năng có thể bổ sung:
Thanh navigation với menu danh mục
![]() Danh mục sản phẩm |
![]() Sản phẩm nổi bật |
![]() Thông tin và mô tả sản phẩm |
![]() Form thêm đánh giá |
![]() Giỏ hàng trống |
![]() Danh sách sản phẩm |
![]() Trang checkout với form thông tin giao hàng |
![]() Trang dặt hàng thành công |
![]() Form đăng nhập người dùng |
![]() Form đăng ký tài khoản mới |
Dashboard cá nhân với thông tin tài khoản
![]() Theo dõi đơn hàng |
![]() Cài đặt thông tin cá nhân |
![]() Chi tiết đơn hàng |
Dashboard admin với thống kê tổng quan
Danh sách sản phẩm trong admin panel
![]() Form thêm sản phẩm mới |
![]() Form chỉnh sửa sản phẩm |
![]() Chi tiết đơn hàng trong admin |
![]() Danh sát đơn hàng |
Danh sách người dùng và quản lý tài khoản
Chi tiết user
Liên hệ với form gửi tin nhắn
Tên: Nguyễn Quốc Thành MSSV: 23010038 Lớp: Lập trình Web - Bài tập giữa kỳ 📧 Email: 23010038@st.phenikaa-uni.edu.vn 🔗 GitHub: https://github.com/nqthanhhh 📱 Phone: 0862398217
Nếu bạn gặp vấn đề khi chạy dự án, vui lòng:
.env
đã được cấu hình đúngMade with ❤️ in Vietnam 🇻🇳