From ccdd44927b7f5f01424301db8033eaf9a72630f1 Mon Sep 17 00:00:00 2001 From: WahyuTegarP <158023677+WahyuTegarP@users.noreply.github.com> Date: Sat, 4 Apr 2026 13:00:28 +0700 Subject: [PATCH] Revisi data dan validasi --- app/Http/Controllers/AdminController.php | 69 +++++++++++++++--- app/Http/Controllers/DiagnosisController.php | 2 +- ...26_04_03_133848_add_columns_to_biodata.php | 28 +++++++ public/data/Bissmilah lagi.xlsx | Bin 11086 -> 11049 bytes python_api/app.py | 2 +- python_artifacts/model.joblib | Bin 8337 -> 9009 bytes python_artifacts/modeldt.joblib | Bin 0 -> 9345 bytes python_artifacts/modell.joblib | Bin 8337 -> 0 bytes resources/views/admin/dashboard.blade.php | 47 ++++++++++-- resources/views/gejala.blade.php | 21 +++++- 10 files changed, 145 insertions(+), 24 deletions(-) create mode 100644 database/migrations/2026_04_03_133848_add_columns_to_biodata.php create mode 100644 python_artifacts/modeldt.joblib delete mode 100644 python_artifacts/modell.joblib diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index ec960d6..42a0891 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -5,6 +5,8 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; +use App\Models\Biodata; +use Carbon\Carbon; class AdminController extends Controller { @@ -36,18 +38,63 @@ public function authenticate(Request $request) } public function dashboard() - { - if (!Auth::check()) { - return redirect()->route('admin.login'); - } +{ + // total diagnosis + $totalDiagnosis = Biodata::count(); - // Get statistics - $stats = $this->getStatistics(); - - return view('admin.dashboard', [ - 'stats' => $stats - ]); - } + // hari ini + $todayDiagnosis = Biodata::whereDate('created_at', Carbon::today())->count(); + + // total user + $totalUsers = Biodata::count(); + + // penyakit paling umum + $mostCommon = Biodata::select('hasil_diagnosis') + ->whereNotNull('hasil_diagnosis') + ->groupBy('hasil_diagnosis') + ->orderByRaw('COUNT(*) DESC') + ->value('hasil_diagnosis'); + + // diagnosis terbaru + $recent = Biodata::select('hasil_diagnosis', 'created_at') + ->latest() + ->take(5) + ->get(); + + // format tabel + $recentFormatted = $recent->map(function ($item) { + return [ + 'date' => $item->created_at, + 'disease' => $item->hasil_diagnosis, + 'count' => 1 + ]; + }); + + // 🔥 CHART (HARUS DI LUAR MAP) + $diseaseStats = Biodata::select('hasil_diagnosis') + ->whereNotNull('hasil_diagnosis') + ->get() + ->groupBy('hasil_diagnosis') + ->map(function ($item) { + return count($item); + }); + + $chartLabels = $diseaseStats->keys()->values(); + $chartData = $diseaseStats->values(); + + // kirim ke blade + $stats = [ + 'total_diagnosis' => $totalDiagnosis, + 'today_diagnosis' => $todayDiagnosis, + 'total_users' => $totalUsers, + 'most_common_disease' => $mostCommon, + 'recent_diagnosis' => $recentFormatted, + 'chart_labels' => $chartLabels, + 'chart_data' => $chartData + ]; + + return view('admin.dashboard', compact('stats')); +} public function logout(Request $request) { diff --git a/app/Http/Controllers/DiagnosisController.php b/app/Http/Controllers/DiagnosisController.php index 3b28509..cc8d44f 100644 --- a/app/Http/Controllers/DiagnosisController.php +++ b/app/Http/Controllers/DiagnosisController.php @@ -14,7 +14,7 @@ public function prosesDiagnosis(Request $request) // validasi minimal 3 gejala if (count($input) < 3) { return redirect()->route('gejala') - ->with('error', 'Pilih minimal 3 gejala!'); + ->with('error', 'Pilih minimal 5 dan maksimal 7 gejala!'); } $inputNama = $input; diff --git a/database/migrations/2026_04_03_133848_add_columns_to_biodata.php b/database/migrations/2026_04_03_133848_add_columns_to_biodata.php new file mode 100644 index 0000000..976e939 --- /dev/null +++ b/database/migrations/2026_04_03_133848_add_columns_to_biodata.php @@ -0,0 +1,28 @@ +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
e@l_zJR>YX7YbHr{28L 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 P5S*vq=OJyq_mBQBN*?s- diff --git a/python_api/app.py b/python_api/app.py index 1d60595..948f2a3 100644 --- a/python_api/app.py +++ b/python_api/app.py @@ -8,7 +8,7 @@ app = Flask(__name__) # ========================= # LOAD MODEL # ========================= -model = joblib.load("../python_artifacts/modell.joblib") +model = joblib.load("../python_artifacts/model.joblib") # ========================= # LOAD FEATURE diff --git a/python_artifacts/model.joblib b/python_artifacts/model.joblib index 44bbaa0a2c9b703b7237be9a1c2c8c29b92b699f..8104d1965a6743128cbb781c29ec3e6ee59f4575 100644 GIT binary patch delta 1179 zcmbtSO-NKx6rN`?Gw+S_oOyrq#u>*qYN;)Bgg}JoJ_-CG7;q7|2o3si3Uo>e#ZA*D zT7+p|3v1OXqQDeMaA$6$B2zFoSxkXJMbO4YyY8EJo}>{iI=sVozjMBG&b{~DsgAkM z+1G(c_?9%BKYMQAO#bTdmAfYz@IDX|8s>Kb#|80_&ovbtVq4EaVmhGhSvo9Q6p_&(wFxzd%6eUqZ7mGFTNwJrIw@O%Lho+( z09vIQOiGp*Bt;mlAstyMaINr}S-+S0?AuOzq&4C+$BgPP`@$=Y^O!L*+^4x;3I&|r_?P64Wsr67GWmv(whq70oB2*OOA%bZ1&D*pt4fEssec$izFxiglZJBAW zpoy2FDJ?@ZL+6*u;vrT_Lq)&hep*G?T58S(qdZWRqky==NJXZ9e^S z^?c_2Qg`5RLXo^&Vl}#T3%a%gk2QuaElz?mqGM8PAl?$|_E~*4zjbrm$@8g!wd%X?9R#G`ftR2vmV#X2xd$V zo|qwIOjVeUg2^x^{HKnuO8A$B?S~rM{u>+q1T+8u diff --git a/python_artifacts/modeldt.joblib b/python_artifacts/modeldt.joblib new file mode 100644 index 0000000000000000000000000000000000000000..a1eb1267859e7f889c331509b3d867e1903edc5e GIT binary patch literal 9345 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 a|LaqQzaXH0M+ASm@YvAE(BZ(#4*eG=ZG1BT literal 0 HcmV?d00001 diff --git a/python_artifacts/modell.joblib b/python_artifacts/modell.joblib deleted file mode 100644 index 790c68cc78013cb198e2f174ad661527041449f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8337 zcmdrSTWB2Db!A!4NRA|1mSx4xL@|w$6v=s_l7x{h#g0AFTCrp&eVFmx-K(AJoyT?_ zRs}Ao1v?f@p^vMN1`_C3p{3B!k_Ys|P?A#GK$<|}Hm$p~jYC=o3L!sjX?pI=J>z|N zE6I{l=(6a{J@3~&XJmPC>+;Z+RP+gZy@E-JYY+P_rNesGB%Vh-9`2l=S>`dvo(254 zz_K|;UH%<@_t*GW`B2!Fb(v3H;NaobJhK@OTfL&md_V#wLp`5|Z5H{8o})$I;OVg2 zVz%xPt7uYBk65|3CG0B4f-7@eYY2A<RwlV^}3JNOHqCJm>rcz#9Yj1iV|0 zjq;_7&+y}XNNWrm&hd0Qee@IfL_aju=b5mbn5HwYTNWwurEnnjGqMH&v%GCl+t)J- zJ|t4>3NnjL%g4b*vqg(cWKtKJ>Lzoe&lp*AX@4?A8*L;*t-T1 zkI}d`-RF_K6`!9^NuTJyKB8q)0$>(?Mv`0uPlLYLa5$E0fgDF;~$78+=fP zj*83YJ} z$IenW?>Y|L9B_1s+Gm(ad|}q48Q`(O=Z9v57Dc1rDsYWJn67vLrZbM6FE|Bdl2}B^ zfj!}hGEF=N?b{v4dXUT$1EgJ%s(~3&09`R&7PKHBtCAI#r-PWDJhXQ!I7&5JL*y-Hpi-(%A+t_35)jFXk z72^(L(74OEXUVu%UV!g4$eFpJ7eE-hnG4W#AQKJh)^Q@zE_%Bs?uoQxD>FqZ1~$~X z<#FO#FsXTX@1e;PvlGhDA<_C&nRMo9#nOYWD~6-=5OGM zsxUG5qU+Kl=~);TS$3AW0hDi0A`R+-0}*n>H5klGP;by!vR5({iEYxL;1sFNhypEr zlvsf~avY+WcU+5yyP(_)Q9l$!e~MBUndnd+cEndtbHN>PcW1IB!(dj$P4IJU0;qUW zc|Gswz60BO&gXs<$dksXmb$==;{aO$&H(HJI4epr zS5^|^bCugn6hzwvoF|OangZ}7NDcvf3eNihJ}oo^_f-U3u@55+qZfFfjcE;97wAi} z-z2u?Co=0PMOM8-!Wfj)=PxfkcX{bU_3P#MvD0HHCl_bxc1hn^&X+2weW(22Jl^-A zYM0{|znI83O8j04QEz-KsjvT9e6Fdva{1Kf6Zx$Yzehqmqx@~Z_%eL2sb46UUp$$} zH%WYtgx%$Q;D3C)rsC|4&$EeqbCq0QmHZEXAU=OpAFaTr6Zsa2-zH&u1z$;h_PgTq zfqH)h{zxLS~JH-`9I|m_{H=Ge^j@lKm;F1{4X;d zJ+9UMYUMFcu^WS9F-)aaD_<}ETcx5d33s952$s~Jj+b7$f9O>e^AwXm^Qp&Qc`yGi z@5TD#$GYy2abq6hBi_G~iu4%&;Fx4zb^a^oLRTW+D;43~!Z{G5(f$>+(y#rA{A%lu zb5fd1MOmQex-EXViue`4QH`BmI(kBKo|V*r`6F282jQhwzP;}VeBZ3` z`z7n$7p-@%*5J{zwZiz`zEh(w`e&t68<)3ufBv?{&I8fs&o%h9#)16*Z+0-Q8^g`- z!`SXhc2=U_*!#`HZj?V8r3WKjX|AqBM?LF>8x_|^>8XupS&_IP6L#tHPa!(|MN#~} R0{BzreZ!-}`+1NV{tx5h4L<+? diff --git a/resources/views/admin/dashboard.blade.php b/resources/views/admin/dashboard.blade.php index bb2cb6a..e343b3b 100644 --- a/resources/views/admin/dashboard.blade.php +++ b/resources/views/admin/dashboard.blade.php @@ -141,11 +141,10 @@ } /* ===== STATS GRID ===== */ -.stats-grid{ - display:grid; - grid-template-columns:repeat(auto-fit, minmax(250px, 1fr)); - gap:24px; - margin-bottom:40px; +.stats-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 20px; } .stat-card{ @@ -342,6 +341,14 @@
+
+ +
@@ -350,7 +357,7 @@
📊
-
+12 hari ini
+
+{{ $stats['today_diagnosis'] }} hari ini
@@ -375,7 +382,7 @@
Pengguna aktif
-
+
{{ $stats['most_common_disease'] }}
@@ -436,6 +443,32 @@
@include('components.scroll-top') + + + + diff --git a/resources/views/gejala.blade.php b/resources/views/gejala.blade.php index ee20a74..2b2d19e 100644 --- a/resources/views/gejala.blade.php +++ b/resources/views/gejala.blade.php @@ -780,13 +780,13 @@
-
+ @csrf
💡
-

Pilih semua gejala yang Anda amati pada kucing Anda. Semakin banyak gejala yang dipilih, semakin akurat diagnosis yang akan diberikan.

+

Pilih minimal 4 dan maksimal 7 gejala yang terjadi pada kucing anda

@@ -848,7 +848,6 @@ class="gejala-checkbox" const selectedCount = document.getElementById('selectedCount'); const form = document.getElementById('gejalaForm'); -// Update selected count function updateSelectedCount() { const checked = document.querySelectorAll('.gejala-checkbox:checked').length; selectedCount.textContent = checked + ' dipilih'; @@ -858,7 +857,7 @@ function updateSelectedCount() { setTimeout(() => selectedCount.classList.remove('animate'), 500); // Enable/disable submit button - if (checked > 0) { + if (checked >= 4 && checked <= 7) { submitBtn.disabled = false; submitBtn.style.opacity = '1'; } else { @@ -874,7 +873,21 @@ function updateSelectedCount() { // Form submission +form.addEventListener('submit', function(e) { + const checked = document.querySelectorAll('.gejala-checkbox:checked').length; + if (checked < 5) { + e.preventDefault(); + alert("Minimal pilih 4 gejala!"); + return; + } + + if (checked > 7) { + e.preventDefault(); + alert("Maksimal hanya 7 gejala!"); + return; + } +}); // Search functionality const searchInput = document.getElementById('searchGejala');