From 9f1df18c4324edfbe000f1cbf31d334ae784a432 Mon Sep 17 00:00:00 2001 From: destudenislam Date: Tue, 7 Jul 2026 18:54:17 +0700 Subject: [PATCH] new --- app/Http/Controllers/AdminController.php | 74 +++++++++++++++++++ app/Http/Kernel.php | 1 + app/Http/Middleware/AdminMiddleware.php | 19 +++++ app/Models/User.php | 15 +++- ...6_06_30_000001_add_role_to_users_table.php | 22 ++++++ resources/views/admin/dashboard.blade.php | 40 ++++++++++ resources/views/admin/users.blade.php | 59 +++++++++++++++ resources/views/layouts/app.blade.php | 32 ++++---- routes/web.php | 8 ++ 9 files changed, 253 insertions(+), 17 deletions(-) create mode 100644 app/Http/Controllers/AdminController.php create mode 100644 app/Http/Middleware/AdminMiddleware.php create mode 100644 database/migrations/2026_06_30_000001_add_role_to_users_table.php create mode 100644 resources/views/admin/dashboard.blade.php create mode 100644 resources/views/admin/users.blade.php diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php new file mode 100644 index 0000000..62bdde1 --- /dev/null +++ b/app/Http/Controllers/AdminController.php @@ -0,0 +1,74 @@ +count(); + $totalClassifications = Classification::count(); + + $statistikKelas = Classification::select('label', DB::raw('count(*) as total')) + ->groupBy('label') + ->get(); + + return view('admin.dashboard', compact('totalUsers', 'totalClassifications', 'statistikKelas')); + } + + public function users() + { + $users = User::where('role', 'user')->latest()->get(); + return view('admin.users', compact('users')); + } + + public function destroyUser($id) + { + $user = User::findOrFail($id); + + if ($user->role === 'admin') { + return back()->withErrors(['error' => 'Akun admin tidak dapat dihapus.']); + } + + $user->delete(); + + return back()->with('success', 'Pengguna berhasil dihapus.'); + } + + public function exportCsv() + { + $classifications = Classification::all(); + + $filename = "laporan_klasifikasi_kopi.csv"; + $handle = fopen('php://memory', 'w'); + + // Membuat Baris Header CSV + fputcsv($handle, ['ID', 'User ID', 'Hasil Klasifikasi', 'Akurasi (%)', 'Tanggal Pemindaian']); + + // Mengisi Baris Data + foreach ($classifications as $row) { + fputcsv($handle, [ + $row->id, + $row->user_id, + $row->label, + $row->confidence, + $row->created_at + ]); + } + + fseek($handle, 0); + $headers = [ + 'Content-Type' => 'text/csv', + 'Content-Disposition' => 'attachment; filename="' . $filename . '"', + ]; + + return response()->stream(function () use ($handle) { + fpassthru($handle); + }, 200, $headers); + } +} \ No newline at end of file diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 494c050..6757117 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -64,5 +64,6 @@ class Kernel extends HttpKernel 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'admin' => \App\Http\Middleware\AdminMiddleware::class, ]; } diff --git a/app/Http/Middleware/AdminMiddleware.php b/app/Http/Middleware/AdminMiddleware.php new file mode 100644 index 0000000..7c10fa3 --- /dev/null +++ b/app/Http/Middleware/AdminMiddleware.php @@ -0,0 +1,19 @@ +check() || auth()->user()->role !== 'admin') { + abort(403, 'Akses ditolak. Halaman ini khusus untuk Admin.'); + } + + return $next($request); + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index 4d7f70f..af2dd3a 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -18,10 +18,13 @@ class User extends Authenticatable * @var array */ protected $fillable = [ - 'name', - 'email', - 'password', - ]; + 'name', + 'email', + 'password', + 'role', +]; + + /** * The attributes that should be hidden for serialization. @@ -42,4 +45,8 @@ class User extends Authenticatable 'email_verified_at' => 'datetime', 'password' => 'hashed', ]; + public function isAdmin(): bool +{ + return $this->role === 'admin'; +} } diff --git a/database/migrations/2026_06_30_000001_add_role_to_users_table.php b/database/migrations/2026_06_30_000001_add_role_to_users_table.php new file mode 100644 index 0000000..56f398c --- /dev/null +++ b/database/migrations/2026_06_30_000001_add_role_to_users_table.php @@ -0,0 +1,22 @@ +enum('role', ['user', 'admin'])->default('user')->after('password'); + }); + } + + public function down(): void + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('role'); + }); + } +}; \ No newline at end of file diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php new file mode 100644 index 0000000..8f9c7f3 --- /dev/null +++ b/resources/views/admin/dashboard.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.app') + +@section('content') +
+

Dashboard Admin

+ +
+
+

Total Pengguna Terdaftar

+

{{ $totalUsers }}

+
+ +
+

Total Klasifikasi Dilakukan

+

{{ $totalClassifications }}

+
+
+ +
+

Statistik Klasifikasi per Kelas

+
+ @forelse ($statistikKelas as $item) +
+ {{ $item->label }} + {{ $item->total }} kali +
+ @empty +

Belum ada data klasifikasi.

+ @endforelse +
+
+ + + Kelola Data Pengguna + + + Export Data CSV + +
+@endsection \ No newline at end of file diff --git a/resources/views/admin/users.blade.php b/resources/views/admin/users.blade.php new file mode 100644 index 0000000..3b8101b --- /dev/null +++ b/resources/views/admin/users.blade.php @@ -0,0 +1,59 @@ +@extends('layouts.app') + +@section('content') +
+

Kelola Data Pengguna

+ + @if (session('success')) +
+ {{ session('success') }} +
+ @endif + + @if ($errors->any()) +
+ {{ $errors->first() }} +
+ @endif + +
+ + + + + + + + + + + @forelse ($users as $user) + + + + + + + @empty + + + + @endforelse + +
NamaEmailTerdaftarAksi
{{ $user->name }}{{ $user->email }}{{ $user->created_at->format('d-m-Y') }} +
+ @csrf + @method('DELETE') + +
+
Belum ada pengguna terdaftar.
+
+ + + ← Kembali ke Dashboard + +
+@endsection \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index b6d30d6..ad67a24 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -32,20 +32,26 @@ @endguest @auth -
-
- Logged in as - {{ Auth::user()->name }} -
+
+ @if(Auth::user()->role === 'admin') + + Admin Panel + + @endif -
- @csrf - -
-
- @endauth +
+ Logged in as + {{ Auth::user()->name }} +
+ +
+ @csrf + +
+
+@endauth diff --git a/routes/web.php b/routes/web.php index a66b947..52044d2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,6 +5,7 @@ use Illuminate\Support\Facades\Hash; use App\Http\Controllers\AuthController; use App\Http\Controllers\ClassificationController; +use App\Http\Controllers\AdminController; /* |-------------------------------------------------------------------------- @@ -73,5 +74,12 @@ Route::post('/logout', [AuthController::class, 'logout'])->name('logout'); }); +Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () { + Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('dashboard'); + Route::get('/users', [AdminController::class, 'users'])->name('users'); + Route::delete('/users/{id}', [AdminController::class, 'destroyUser'])->name('users.destroy'); + Route::get('/export', [AdminController::class, 'exportCsv'])->name('export'); +}); + Route::post('/api/classify', [ClassificationController::class, 'process'])->name('api.classify'); Route::post('/api/save-result', [ClassificationController::class, 'store'])->name('api.save'); \ No newline at end of file