From 44e69d13c5e54d37e083a6be5b74797d88bd8814 Mon Sep 17 00:00:00 2001 From: kizadl Date: Tue, 28 Apr 2026 00:49:19 +0700 Subject: [PATCH] Add classification status, metrics, and UI updates --- .../Controllers/Admin/DashboardController.php | 9 ++++++ .../Public/ClassificationController.php | 6 +++- app/Models/Classification.php | 3 +- ...55_add_status_to_classifications_table.php | 28 ++++++++++++++++++ resources/js/components/public/Scanner.vue | 29 ++++++++++++++++--- resources/js/pages/admin/Dashboard.vue | 27 +++++++++++++++-- .../classification/ClassificationIndex.vue | 12 +++++++- 7 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 database/migrations/2026_04_27_173555_add_status_to_classifications_table.php diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php index e79dae3..1bd9ece 100644 --- a/app/Http/Controllers/Admin/DashboardController.php +++ b/app/Http/Controllers/Admin/DashboardController.php @@ -34,11 +34,20 @@ public function index() // Hitung Total Scan (sudah terfilter role) $totalScan = (clone $query)->count(); + // Rata-rata akurasi dari yang berhasil + $avgAccuracy = (clone $query)->where('status', 'Berhasil')->avg('confidence') ?? 0; + + // Tingkat keberhasilan (Total Berhasil / Total Scan) + $totalBerhasil = (clone $query)->where('status', 'Berhasil')->count(); + $successRate = $totalScan > 0 ? ($totalBerhasil / $totalScan) * 100 : 0; + return inertia('admin/Dashboard', [ 'user' => $user, 'chartData' => $chartData, 'recentHistory' => $recentHistory, 'totalScan' => $totalScan, + 'avgAccuracy' => round($avgAccuracy, 2), + 'successRate' => round($successRate, 2), ]); } } \ No newline at end of file diff --git a/app/Http/Controllers/Public/ClassificationController.php b/app/Http/Controllers/Public/ClassificationController.php index 320a0cd..c956c67 100644 --- a/app/Http/Controllers/Public/ClassificationController.php +++ b/app/Http/Controllers/Public/ClassificationController.php @@ -44,11 +44,15 @@ public function predict(Request $request) // 2. Jika sukses, simpan gambar dan hasil ke database $path = $image->store('classifications', 'public'); + $confidence = (float) filter_var($data['confidence'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); + $status = $confidence >= 90 ? 'Berhasil' : 'Gagal'; + Classification::create([ 'user_id' => auth()->id() ?? null, 'image_path' => $path, 'result' => $data['label'], - 'confidence' => (float) filter_var($data['confidence'], FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION), + 'confidence' => $confidence, + 'status' => $status, ]); return response()->json([ diff --git a/app/Models/Classification.php b/app/Models/Classification.php index f4577fa..c25efcd 100644 --- a/app/Models/Classification.php +++ b/app/Models/Classification.php @@ -11,7 +11,8 @@ class Classification extends Model 'user_id', 'image_path', 'result', - 'confidence' + 'confidence', + 'status' ]; // Relasi ke User (Satu klasifikasi dimiliki satu User) diff --git a/database/migrations/2026_04_27_173555_add_status_to_classifications_table.php b/database/migrations/2026_04_27_173555_add_status_to_classifications_table.php new file mode 100644 index 0000000..18a88bb --- /dev/null +++ b/database/migrations/2026_04_27_173555_add_status_to_classifications_table.php @@ -0,0 +1,28 @@ +string('status')->after('confidence')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('classifications', function (Blueprint $table) { + $table->dropColumn('status'); + }); + } +}; diff --git a/resources/js/components/public/Scanner.vue b/resources/js/components/public/Scanner.vue index 0995ed1..179f822 100644 --- a/resources/js/components/public/Scanner.vue +++ b/resources/js/components/public/Scanner.vue @@ -79,12 +79,33 @@ -
+

Hasil Klasifikasi AI

-

{{ predictionResult.label }}

-
- Confidence: {{ predictionResult.confidence }} +

{{ predictionResult.label }}

+ +
+
+ Confidence: {{ predictionResult.confidence }} +
+ +
+
+ + {{ parseFloat(predictionResult.confidence.replace('%', '')) >= 90 ? 'Berhasil' : 'Gagal' }} + +
diff --git a/resources/js/pages/admin/Dashboard.vue b/resources/js/pages/admin/Dashboard.vue index 51d8109..007b242 100644 --- a/resources/js/pages/admin/Dashboard.vue +++ b/resources/js/pages/admin/Dashboard.vue @@ -27,7 +27,9 @@ const props = defineProps<{ user: User, chartData: Array<{ result: string, total: number }>, recentHistory: Array, - totalScan: number + totalScan: number, + avgAccuracy: number, + successRate: number }>(); // Konfigurasi Warna & Data untuk Pie Chart @@ -49,6 +51,7 @@ const chartOptions = { } } }; +