diff --git a/README.md b/README.md
index 81717fd..0cb1dab 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
# Laravel 12 - Content Management Project (Dockerized)
-This project is a content management system (CMS) built with **Laravel 12**, running in a development environment powered by **Docker + Docker Compose**.
+This project is a content management system (CMS) built with **Laravel 12**, running in a development environment powered by **Docker + Docker Compose** It integrates modern Laravel tools including:
+- **Livewire** – For building reactive components using Blade.
+- **Passport** – Provides API authentication using OAuth2.
+- **Vite** – Bundles and hot-reloads frontend assets efficiently.
---
---
diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php
new file mode 100644
index 0000000..fd753d1
--- /dev/null
+++ b/app/Http/Controllers/Auth/LoginController.php
@@ -0,0 +1,40 @@
+validate([
+ 'email' => ['required','email'],
+ 'password' => ['required','string'],
+ ]);
+
+ if (Auth::attempt($data, $request->boolean('remember'))) {
+ $request->session()->regenerate();
+ return redirect()->intended(route('dashboard'));
+ }
+
+ return back()
+ ->withErrors(['email' => 'Email hoặc mật khẩu không đúng.'])
+ ->withInput(['email' => $request->email]);
+ }
+
+ public function logout(Request $request)
+ {
+ Auth::logout();
+ $request->session()->invalidate();
+ $request->session()->regenerateToken();
+ return redirect()->route('login');
+ }
+}
diff --git a/app/Livewire/Auth/Login.php b/app/Livewire/Auth/Login.php
index f908532..ee35bc3 100644
--- a/app/Livewire/Auth/Login.php
+++ b/app/Livewire/Auth/Login.php
@@ -30,6 +30,6 @@ class Login extends Component
public function render()
{
- return view('livewire.auth.login')->layout('layouts.app');
+ return view('auth.login')->layout('layouts.auth');
}
}
diff --git a/app/Livewire/Dashboard.php b/app/Livewire/Dashboard.php
new file mode 100644
index 0000000..993c603
--- /dev/null
+++ b/app/Livewire/Dashboard.php
@@ -0,0 +1,13 @@
+layout('layouts.app', ['title' => 'Dashboard']);
+ }
+}
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
new file mode 100644
index 0000000..6f76d5d
--- /dev/null
+++ b/resources/views/auth/login.blade.php
@@ -0,0 +1,58 @@
+@extends('layouts.auth')
+
+@section('title','Đăng nhập hệ thống')
+
+@section('content')
+
+@endsection
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php
index b2c6f4e..ee36add 100644
--- a/resources/views/layouts/app.blade.php
+++ b/resources/views/layouts/app.blade.php
@@ -1,21 +1,51 @@
+{{-- resources/views/layouts/soft-ui.blade.php --}}
-
+
-
-
- Đăng nhập hệ thống
-
- @vite('resources/css/app.css')
+
+
+
+ @yield('title', 'Dashboard')
+
+ {{-- 1. Soft UI CSS --}}
+
+
+ {{-- 2. Google fonts / Icons (nếu cần) --}}
+
+
+ {{-- 3. Livewire --}}
@livewireStyles
+
+ {{-- 4. CSS bổ sung --}}
+ @stack('css')
-
-
- {{ $slot }}
-
+
+ {{-- Ảnh nền header (tùy chọn) --}}
+
+ {{-- Sidebar --}}
+ @include('layouts.partials.sidebar')
+
+
+ {{-- Navbar --}}
+ @include('layouts.partials.navbar')
+
+ {{-- Nội dung chính --}}
+
+ @yield('content')
+
+
+
+ {{-- 5. Core JS bundle (đã gồm Popper & Bootstrap) --}}
+
+
+ {{-- 6. Livewire --}}
@livewireScripts
+
+ {{-- 7. JS bổ sung --}}
+ @stack('js')
diff --git a/resources/views/layouts/auth.blade.php b/resources/views/layouts/auth.blade.php
new file mode 100644
index 0000000..477bbf7
--- /dev/null
+++ b/resources/views/layouts/auth.blade.php
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+ @yield('title','Auth')
+
+ {{-- Soft UI CSS --}}
+
+
+ {{-- Livewire Styles --}}
+ @livewireStyles
+
+ {{-- CSS bổ sung --}}
+ @stack('css')
+
+
+
+
+ @yield('content')
+
+
+
+ {{-- Core JS --}}
+
+
+
+
+
+
+ {{-- Livewire Scripts --}}
+ @livewireScripts
+
+ {{-- JS bổ sung --}}
+ @stack('js')
+
+
diff --git a/resources/views/layouts/partials/navbar.blade.php b/resources/views/layouts/partials/navbar.blade.php
new file mode 100644
index 0000000..6c3f7ba
--- /dev/null
+++ b/resources/views/layouts/partials/navbar.blade.php
@@ -0,0 +1,22 @@
+{{-- resources/views/layouts/partials/navbar-soft-ui.blade.php --}}
+
diff --git a/resources/views/layouts/partials/sidebar.blade.php b/resources/views/layouts/partials/sidebar.blade.php
new file mode 100644
index 0000000..962d162
--- /dev/null
+++ b/resources/views/layouts/partials/sidebar.blade.php
@@ -0,0 +1,20 @@
+{{-- resources/views/layouts/partials/sidebar-soft-ui.blade.php --}}
+
diff --git a/resources/views/livewire/auth/login.blade.php b/resources/views/livewire/auth/login.blade.php
deleted file mode 100644
index bb01f7e..0000000
--- a/resources/views/livewire/auth/login.blade.php
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
 }})
-
-
-
Đăng nhập hệ thống
-
-
-
diff --git a/resources/views/livewire/dashboard.blade.php b/resources/views/livewire/dashboard.blade.php
new file mode 100644
index 0000000..bfb69de
--- /dev/null
+++ b/resources/views/livewire/dashboard.blade.php
@@ -0,0 +1,5 @@
+
+
+
Xin chào, {{ auth()->user()->name }}!
+
+
diff --git a/routes/web.php b/routes/web.php
index b273fcb..ffbb6a3 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -1,9 +1,19 @@
name('login')->middleware('guest');
+// Form đăng nhập, chỉ cho guest
+Route::get('login', [LoginController::class, 'showLoginForm'])
+ ->middleware('guest')
+ ->name('login');
+Route::post('login', [LoginController::class, 'login'])
+ ->middleware('guest');
+Route::post('logout', [LoginController::class, 'logout'])
+ ->middleware('auth')
+ ->name('logout');
+
+Route::get('dashboard', Dashboard::class)
+ ->name('dashboard')
+ ->middleware(['auth']);
diff --git a/vite.config.js b/vite.config.js
index 29fbfe9..ebc6889 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,13 +1,18 @@
-import { defineConfig } from 'vite';
-import laravel from 'laravel-vite-plugin';
-import tailwindcss from '@tailwindcss/vite';
+import { defineConfig } from "vite";
+import laravel from "laravel-vite-plugin";
+import tailwindcss from "@tailwindcss/vite";
export default defineConfig({
plugins: [
laravel({
- input: ['resources/css/app.css', 'resources/js/app.js'],
+ input: ["resources/css/app.css", "resources/js/app.js"],
refresh: true,
}),
tailwindcss(),
],
+ server: {
+ fs: {
+ allow: [".", "public/soft-ui/assets"],
+ },
+ },
});