506 lines
20 KiB
PHP
506 lines
20 KiB
PHP
@extends('layouts.main')
|
|
|
|
@section('title', 'Klasifikasi Penyakit Daun Padi - Rice Leaf AI')
|
|
|
|
@push('styles')
|
|
<style>
|
|
/* CSS murni untuk memastikan animasi berjalan lancar tanpa bentrok config global */
|
|
@keyframes fadeInUp {
|
|
0% { opacity: 0; transform: translateY(20px); }
|
|
100% { opacity: 1; transform: translateY(0); }
|
|
}
|
|
.animate-fade-in-up {
|
|
animation: fadeInUp 0.8s ease-out forwards;
|
|
}
|
|
@keyframes pulseSlow {
|
|
0%, 100% { opacity: 0.2; transform: scale(1); }
|
|
50% { opacity: 0.3; transform: scale(1.05); }
|
|
}
|
|
.animate-pulse-slow {
|
|
animation: pulseSlow 3s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
}
|
|
</style>
|
|
@endpush
|
|
|
|
@section('content')
|
|
<div class="bg-gradient-to-br from-green-100 via-white to-green-50 min-h-screen transition-all duration-500">
|
|
|
|
<section class="max-w-7xl mx-auto px-6 py-20 grid md:grid-cols-2 gap-12 items-center min-h-[80vh]">
|
|
<div class="animate-fade-in-up">
|
|
<div class="inline-block bg-green-100 text-green-700 px-4 py-1.5 rounded-full text-sm font-semibold mb-6 shadow-sm border border-green-200">
|
|
✨ Deep Learning Technology
|
|
</div>
|
|
|
|
<h1 class="text-5xl lg:text-6xl font-extrabold text-transparent bg-clip-text bg-gradient-to-r from-green-900 to-green-600 leading-tight mb-6">
|
|
Sistem Klasifikasi<br>Penyakit Daun Padi<br>Berbasis AI
|
|
</h1>
|
|
|
|
<p class="text-lg text-gray-600 mb-10 leading-relaxed max-w-lg">
|
|
Deteksi penyakit daun padi secara otomatis dan akurat menggunakan teknologi <strong>Deep Learning</strong> berbasis website. Cukup unggah foto, biarkan AI yang menganalisis.
|
|
</p>
|
|
|
|
<div class="flex flex-wrap gap-4">
|
|
<a href="#upload"
|
|
class="bg-gradient-to-r from-green-600 to-green-500 hover:from-green-700 hover:to-green-600 text-white px-8 py-4 rounded-2xl text-lg font-semibold shadow-xl hover:shadow-2xl transition-all duration-300 hover:-translate-y-1 flex items-center gap-2">
|
|
🎯 Mulai Prediksi
|
|
</a>
|
|
|
|
<a href="/dashboard"
|
|
class="bg-white border-2 border-green-500 text-green-600 hover:bg-green-50 px-8 py-4 rounded-2xl text-lg font-semibold transition-all duration-300 hover:-translate-y-1 flex items-center gap-2">
|
|
📊 Lihat Dashboard
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="relative animate-fade-in-up" style="animation-delay: 0.2s;">
|
|
<div class="absolute inset-0 bg-green-400 rounded-3xl blur-3xl opacity-20 animate-pulse-slow"></div>
|
|
<img src="https://images.unsplash.com/photo-1625246333195-78d9c38ad449?q=80&w=1200&auto=format&fit=crop"
|
|
class="relative rounded-3xl shadow-2xl border-4 border-white transform hover:scale-[1.02] transition-transform duration-500 w-full object-cover h-[500px]">
|
|
</div>
|
|
</section>
|
|
|
|
<section id="upload" class="max-w-4xl mx-auto px-6 pb-24 pt-10">
|
|
<div class="bg-white/90 backdrop-blur-xl rounded-[2.5rem] shadow-2xl p-8 md:p-14 border border-white/50 relative overflow-hidden">
|
|
<div class="absolute top-0 right-0 w-40 h-40 bg-green-100 rounded-full blur-3xl opacity-50 -mr-20 -mt-20"></div>
|
|
<div class="absolute bottom-0 left-0 w-40 h-40 bg-blue-100 rounded-full blur-3xl opacity-50 -ml-20 -mb-20"></div>
|
|
|
|
<div class="relative z-10">
|
|
<div class="text-center mb-10">
|
|
<h2 class="text-4xl font-extrabold text-gray-800 mb-3">Upload Gambar Daun</h2>
|
|
<p class="text-gray-500">Pilih gambar daun padi yang ingin dianalisis dengan jelas</p>
|
|
</div>
|
|
|
|
@if(session('success'))
|
|
<div class="bg-green-50 border-l-4 border-green-500 text-green-800 p-4 rounded-r-xl mb-8 shadow-sm flex items-center gap-3">
|
|
<span>✅</span> {{ session('success') }}
|
|
</div>
|
|
@endif
|
|
|
|
@if(session('error'))
|
|
<div class="bg-red-50 border-l-4 border-red-500 text-red-800 p-4 rounded-r-xl mb-8 shadow-sm flex items-center gap-3">
|
|
<span>⚠️</span> {{ session('error') }}
|
|
</div>
|
|
@endif
|
|
|
|
@auth
|
|
<form id="formPrediksi" action="/prediksi" method="POST" enctype="multipart/form-data">
|
|
@csrf
|
|
@else
|
|
<form action="/login" method="GET">
|
|
@endauth
|
|
|
|
<div class="group border-3 border-dashed border-green-300 hover:border-green-500 hover:bg-green-50/50 bg-gray-50 rounded-3xl p-10 text-center transition-all duration-300 relative cursor-pointer">
|
|
|
|
<div class="absolute inset-0 w-full h-full cursor-pointer z-20 opacity-0">
|
|
<input type="file" name="gambar" id="gambar" accept="image/*" onchange="previewImage(event)" class="w-full h-full cursor-pointer" {{ Auth::check() ? '' : 'disabled' }}>
|
|
</div>
|
|
|
|
<div id="upload-placeholder" class="pointer-events-none">
|
|
<div class="bg-white w-20 h-20 rounded-full shadow-md flex items-center justify-center mx-auto mb-4 group-hover:scale-110 transition-transform duration-300">
|
|
@auth
|
|
<svg class="w-8 h-8 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12"></path></svg>
|
|
@else
|
|
<svg class="w-8 h-8 text-yellow-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"></path></svg>
|
|
@endauth
|
|
</div>
|
|
<h3 class="text-xl font-semibold text-gray-700">Drag & Drop atau Klik Disini</h3>
|
|
<p class="text-gray-400 mt-2 text-sm">Mendukung format JPG, PNG, JPEG</p>
|
|
</div>
|
|
|
|
<div class="mt-6 text-center pointer-events-none z-10 relative">
|
|
<img id="preview" class="hidden mx-auto rounded-2xl shadow-xl w-64 h-64 object-cover border-4 border-white">
|
|
</div>
|
|
</div>
|
|
|
|
<button type="submit" id="{{ Auth::check() ? 'btnPrediksi' : '' }}" class="w-full mt-8 bg-gradient-to-r from-green-600 to-green-500 hover:from-green-700 hover:to-green-600 text-white py-4 rounded-2xl text-xl font-bold shadow-lg hover:shadow-xl hover:-translate-y-1 transition-all duration-300 flex justify-center items-center gap-2 group">
|
|
@auth
|
|
<span>Prediksi Sekarang</span>
|
|
<svg class="w-6 h-6 group-hover:translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
|
|
@else
|
|
<span>Login untuk Memulai Prediksi</span>
|
|
<svg class="w-6 h-6 group-hover:translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 5l7 7m0 0l-7 7m7-7H3"></path></svg>
|
|
@endauth
|
|
</button>
|
|
</form>
|
|
@if(session('hasil'))
|
|
<div class="mt-12 bg-white/50 border border-green-100 rounded-[2rem] p-8 shadow-inner relative overflow-hidden">
|
|
<div class="absolute top-0 left-0 w-2 h-full bg-green-500"></div>
|
|
|
|
<h2 class="text-3xl font-extrabold text-gray-800 mb-8 text-center">
|
|
Hasil Analisis
|
|
</h2>
|
|
|
|
<img src="{{ asset('uploads/' . session('gambar')) }}" class="w-72 rounded-2xl shadow-xl mb-10 mx-auto border-4 border-white transform hover:scale-105 transition-transform duration-500">
|
|
|
|
<div class="grid md:grid-cols-2 gap-6">
|
|
<div class="bg-white p-6 rounded-2xl shadow-sm border border-gray-100 hover:shadow-md transition-shadow">
|
|
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-1">Diagnosis Penyakit</h3>
|
|
<p class="text-3xl font-extrabold text-red-600 bg-red-50 inline-block px-4 py-1 rounded-lg mt-2">
|
|
{{ session('hasil') }}
|
|
</p>
|
|
</div>
|
|
|
|
<div class="bg-white p-6 rounded-2xl shadow-sm border border-gray-100 hover:shadow-md transition-shadow">
|
|
<h3 class="text-sm font-semibold text-gray-400 uppercase tracking-wider mb-1">Tingkat Kepercayaan (Confidence)</h3>
|
|
<p class="text-3xl font-extrabold text-green-600 mt-2 flex items-center gap-2">
|
|
{{ session('confidence') }}
|
|
<svg class="w-8 h-8 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
@if(session('allPredictions'))
|
|
<div class="bg-white p-8 rounded-2xl shadow-sm border border-gray-100 mt-6">
|
|
<h3 class="text-xl font-bold text-gray-800 mb-6 flex items-center gap-2">
|
|
<svg class="w-6 h-6 text-blue-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"></path></svg>
|
|
Probabilitas Semua Kelas
|
|
</h3>
|
|
|
|
@foreach(session('allPredictions') as $kelas => $nilai)
|
|
<div class="mb-5 group">
|
|
<div class="flex justify-between mb-2">
|
|
<span class="font-semibold text-gray-700 group-hover:text-green-600 transition-colors">{{ $kelas }}</span>
|
|
<span class="font-bold text-gray-900">{{ number_format($nilai, 2) }}%</span>
|
|
</div>
|
|
<div class="w-full bg-gray-100 rounded-full h-3 overflow-hidden shadow-inner">
|
|
<div class="bg-gradient-to-r from-green-500 to-green-400 h-3 rounded-full relative transition-all duration-1000 ease-out" style="width: {{ $nilai }}%">
|
|
<div class="absolute top-0 right-0 bottom-0 left-0 bg-[url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiPgo8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI4IiBmaWxsPSIjZmZmIiBmaWxsLW9wYWNpdHk9IjAuMSIvPgo8L3N2Zz4=')] opacity-50"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
@endif
|
|
|
|
@if(session('deskripsi'))
|
|
<div class="bg-white p-8 rounded-2xl shadow-sm border border-gray-100 mt-6">
|
|
<h3 class="text-xl font-bold text-gray-800 mb-6 flex items-center gap-2">
|
|
<svg class="w-6 h-6 text-yellow-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg>
|
|
Informasi Detail
|
|
</h3>
|
|
|
|
<div class="space-y-6">
|
|
<div class="bg-blue-50/50 p-5 rounded-xl border border-blue-100">
|
|
<h4 class="font-bold text-blue-800 mb-2">Deskripsi Penyakit:</h4>
|
|
<p class="text-gray-700 leading-relaxed">{{ session('deskripsi') }}</p>
|
|
</div>
|
|
|
|
<div class="bg-green-50/50 p-5 rounded-xl border border-green-100">
|
|
<h4 class="font-bold text-green-800 mb-2">Saran & Solusi:</h4>
|
|
<p class="text-gray-700 leading-relaxed">{{ session('solusi') }}</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- ================= GALERI PENYAKIT ================= -->
|
|
|
|
<section class="max-w-7xl mx-auto px-6 pb-24">
|
|
|
|
<div class="text-center mb-16">
|
|
|
|
<h2 class="text-4xl font-extrabold text-gray-800 mb-4">
|
|
Galeri Penyakit Padi
|
|
</h2>
|
|
|
|
<p class="text-gray-500 max-w-2xl mx-auto">
|
|
Kenali berbagai jenis penyakit yang sering menyerang daun padi beserta gejalanya secara visual.
|
|
</p>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
|
|
|
|
|
|
|
<!-- BLAST -->
|
|
|
|
<div class="group bg-white rounded-3xl shadow-lg hover:shadow-2xl hover:-translate-y-2 transition-all duration-300 overflow-hidden border">
|
|
|
|
|
|
<div class="relative overflow-hidden">
|
|
|
|
|
|
<img
|
|
src="{{ asset('images/blast.jpg') }}"
|
|
class="h-56 w-full object-cover group-hover:scale-110 transition-transform duration-700"
|
|
>
|
|
|
|
|
|
<div class="absolute top-4 right-4 bg-white/90 px-3 py-1 rounded-full text-xs font-bold text-red-600">
|
|
|
|
Bahaya
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="p-6">
|
|
|
|
|
|
<h3 class="text-2xl font-bold text-gray-800 mb-3">
|
|
|
|
Blast
|
|
|
|
</h3>
|
|
|
|
|
|
|
|
<p class="text-gray-500 text-sm leading-relaxed">
|
|
|
|
Penyakit daun padi yang disebabkan oleh jamur
|
|
<b>Pyricularia oryzae</b> dengan gejala bercak berbentuk belah ketupat.
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- BLIGHT -->
|
|
|
|
|
|
<div class="group bg-white rounded-3xl shadow-lg hover:shadow-2xl hover:-translate-y-2 transition-all duration-300 overflow-hidden border">
|
|
|
|
|
|
<div class="relative overflow-hidden">
|
|
|
|
|
|
<img
|
|
src="{{ asset('images/blight.jpg') }}"
|
|
class="h-56 w-full object-cover group-hover:scale-110 transition-transform duration-700"
|
|
>
|
|
|
|
|
|
|
|
<div class="absolute top-4 right-4 bg-white/90 px-3 py-1 rounded-full text-xs font-bold text-yellow-600">
|
|
|
|
Waspada
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="p-6">
|
|
|
|
|
|
<h3 class="text-2xl font-bold text-gray-800 mb-3">
|
|
|
|
Blight
|
|
|
|
</h3>
|
|
|
|
|
|
|
|
<p class="text-gray-500 text-sm leading-relaxed">
|
|
|
|
Penyakit hawar daun bakteri yang menyebabkan daun padi
|
|
menguning, layu, dan mengalami kerusakan.
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- TUNGRO -->
|
|
|
|
|
|
<div class="group bg-white rounded-3xl shadow-lg hover:shadow-2xl hover:-translate-y-2 transition-all duration-300 overflow-hidden border">
|
|
|
|
|
|
<div class="relative overflow-hidden">
|
|
|
|
|
|
<img
|
|
src="{{ asset('images/tungro.jpg') }}"
|
|
class="h-56 w-full object-cover group-hover:scale-110 transition-transform duration-700"
|
|
>
|
|
|
|
|
|
|
|
<div class="absolute top-4 right-4 bg-white/90 px-3 py-1 rounded-full text-xs font-bold text-orange-500">
|
|
|
|
Virus
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="p-6">
|
|
|
|
|
|
<h3 class="text-2xl font-bold text-gray-800 mb-3">
|
|
|
|
Tungro
|
|
|
|
</h3>
|
|
|
|
|
|
|
|
|
|
<p class="text-gray-500 text-sm leading-relaxed">
|
|
|
|
Penyakit yang disebabkan oleh virus dan ditularkan oleh wereng hijau.
|
|
Gejalanya berupa daun menguning dan pertumbuhan tanaman terhambat.
|
|
|
|
</p>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- HEALTHY -->
|
|
|
|
|
|
<div class="group bg-white rounded-3xl shadow-lg hover:shadow-2xl hover:-translate-y-2 transition-all duration-300 overflow-hidden border">
|
|
|
|
|
|
|
|
<div class="relative overflow-hidden">
|
|
|
|
|
|
<img
|
|
src="{{ asset('images/healthy.jpg') }}"
|
|
class="h-56 w-full object-cover group-hover:scale-110 transition-transform duration-700"
|
|
>
|
|
|
|
|
|
|
|
<div class="absolute top-4 right-4 bg-white/90 px-3 py-1 rounded-full text-xs font-bold text-green-600">
|
|
|
|
Aman
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="p-6">
|
|
|
|
|
|
<h3 class="text-2xl font-bold text-gray-800 mb-3">
|
|
|
|
Healthy
|
|
|
|
</h3>
|
|
|
|
|
|
|
|
|
|
<p class="text-gray-500 text-sm leading-relaxed">
|
|
|
|
Kondisi daun padi sehat dengan warna hijau normal,
|
|
tidak ditemukan tanda penyakit.
|
|
|
|
</p>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</section>
|
|
|
|
</div>
|
|
|
|
<div id="loading" class="hidden fixed inset-0 bg-gray-900/80 backdrop-blur-sm flex items-center justify-center z-50 transition-opacity">
|
|
<div class="bg-white p-12 rounded-[2rem] shadow-2xl text-center max-w-sm w-full mx-4 border border-gray-100 transform scale-100 animate-[fadeInUp_0.3s_ease-out]">
|
|
<div class="relative w-24 h-24 mx-auto mb-8">
|
|
<div class="absolute inset-0 rounded-full border-t-4 border-green-500 animate-spin"></div>
|
|
<div class="absolute inset-2 rounded-full border-r-4 border-blue-500 animate-[spin_1.5s_linear_infinite_reverse]"></div>
|
|
<div class="absolute inset-4 rounded-full border-b-4 border-yellow-400 animate-spin"></div>
|
|
</div>
|
|
<h2 class="text-2xl font-extrabold text-gray-800 mb-2">Menganalisis...</h2>
|
|
<p class="text-gray-500 font-medium">sedang memproses gambar Anda.</p>
|
|
</div>
|
|
</div>
|
|
@endsection
|
|
|
|
@push('scripts')
|
|
<script>
|
|
function previewImage(event) {
|
|
const preview = document.getElementById('preview');
|
|
const placeholder = document.getElementById('upload-placeholder');
|
|
|
|
if(event.target.files.length > 0){
|
|
preview.src = URL.createObjectURL(event.target.files[0]);
|
|
preview.classList.remove('hidden');
|
|
if(placeholder) placeholder.classList.add('hidden');
|
|
}
|
|
}
|
|
|
|
const form = document.getElementById('formPrediksi');
|
|
if(form){
|
|
form.addEventListener('submit', function() {
|
|
document.getElementById('loading').classList.remove('hidden');
|
|
});
|
|
}
|
|
|
|
function toggleDarkMode() {
|
|
const body = document.getElementById('body');
|
|
if(body) {
|
|
body.classList.toggle('bg-gray-900');
|
|
body.classList.toggle('text-white');
|
|
body.classList.toggle('from-green-100');
|
|
body.classList.toggle('to-green-50');
|
|
body.classList.toggle('text-gray-800');
|
|
}
|
|
}
|
|
</script>
|
|
@endpush |