From 63accde5618b61b96780191fd5b2c0e9ef100079 Mon Sep 17 00:00:00 2001 From: ramzdhani11 <158116439+ramzdhani11@users.noreply.github.com> Date: Sun, 23 Nov 2025 14:37:08 +0700 Subject: [PATCH] Initial commit Laravel project --- .editorconfig | 18 + .env.example | 65 + .gitattributes | 11 + .gitignore | 24 + README.md | 59 + app/Http/Controllers/Controller.php | 8 + app/Http/Controllers/UploadController.php | 231 + app/Models/User.php | 48 + app/Providers/AppServiceProvider.php | 24 + artisan | 18 + bootstrap/app.php | 18 + bootstrap/cache/.gitignore | 2 + bootstrap/providers.php | 5 + composer.json | 86 + composer.lock | 8366 +++++++++++++++++ config/app.php | 126 + config/auth.php | 115 + config/cache.php | 117 + config/database.php | 183 + config/filesystems.php | 80 + config/logging.php | 132 + config/mail.php | 118 + config/queue.php | 129 + config/services.php | 38 + config/session.php | 217 + database/.gitignore | 1 + database/factories/UserFactory.php | 44 + .../0001_01_01_000000_create_users_table.php | 49 + .../0001_01_01_000001_create_cache_table.php | 35 + .../0001_01_01_000002_create_jobs_table.php | 57 + ...025_11_23_060713_create_datasets_table.php | 23 + ...2025_11_23_060921_create_uploads_table.php | 22 + ..._11_23_061024_create_predictions_table.php | 25 + database/seeders/DatabaseSeeder.php | 25 + package-lock.json | 2376 +++++ package.json | 17 + phpunit.xml | 35 + public/.htaccess | 25 + public/favicon.ico | 0 public/index.php | 20 + public/robots.txt | 2 + resources/css/app.css | 11 + resources/js/app.js | 1 + resources/js/bootstrap.js | 4 + .../Admin/classification-history.blade.php | 293 + resources/views/Admin/index.blade.php | 181 + resources/views/Admin/layouts/app.blade.php | 156 + resources/views/Admin/manage-admin.blade.php | 226 + .../views/Admin/partials/sidebar.blade.php | 70 + .../views/Admin/system-statistics.blade.php | 261 + resources/views/landing_page/about.blade.php | 249 + resources/views/landing_page/result.blade.php | 125 + resources/views/landing_page/upload.blade.php | 244 + resources/views/login.blade.php | 229 + resources/views/welcome.blade.php | 228 + routes/console.php | 8 + routes/web.php | 40 + storage/app/.gitignore | 4 + storage/app/private/.gitignore | 2 + storage/app/public/.gitignore | 2 + storage/framework/.gitignore | 9 + storage/framework/cache/.gitignore | 3 + storage/framework/cache/data/.gitignore | 2 + storage/framework/sessions/.gitignore | 2 + storage/framework/testing/.gitignore | 2 + storage/framework/views/.gitignore | 2 + storage/logs/.gitignore | 2 + tests/Feature/ExampleTest.php | 19 + tests/TestCase.php | 10 + tests/Unit/ExampleTest.php | 16 + vite.config.js | 13 + 71 files changed, 15408 insertions(+) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/Http/Controllers/Controller.php create mode 100644 app/Http/Controllers/UploadController.php create mode 100644 app/Models/User.php create mode 100644 app/Providers/AppServiceProvider.php create mode 100644 artisan create mode 100644 bootstrap/app.php create mode 100644 bootstrap/cache/.gitignore create mode 100644 bootstrap/providers.php create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/app.php create mode 100644 config/auth.php create mode 100644 config/cache.php create mode 100644 config/database.php create mode 100644 config/filesystems.php create mode 100644 config/logging.php create mode 100644 config/mail.php create mode 100644 config/queue.php create mode 100644 config/services.php create mode 100644 config/session.php create mode 100644 database/.gitignore create mode 100644 database/factories/UserFactory.php create mode 100644 database/migrations/0001_01_01_000000_create_users_table.php create mode 100644 database/migrations/0001_01_01_000001_create_cache_table.php create mode 100644 database/migrations/0001_01_01_000002_create_jobs_table.php create mode 100644 database/migrations/2025_11_23_060713_create_datasets_table.php create mode 100644 database/migrations/2025_11_23_060921_create_uploads_table.php create mode 100644 database/migrations/2025_11_23_061024_create_predictions_table.php create mode 100644 database/seeders/DatabaseSeeder.php create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml create mode 100644 public/.htaccess create mode 100644 public/favicon.ico create mode 100644 public/index.php create mode 100644 public/robots.txt create mode 100644 resources/css/app.css create mode 100644 resources/js/app.js create mode 100644 resources/js/bootstrap.js create mode 100644 resources/views/Admin/classification-history.blade.php create mode 100644 resources/views/Admin/index.blade.php create mode 100644 resources/views/Admin/layouts/app.blade.php create mode 100644 resources/views/Admin/manage-admin.blade.php create mode 100644 resources/views/Admin/partials/sidebar.blade.php create mode 100644 resources/views/Admin/system-statistics.blade.php create mode 100644 resources/views/landing_page/about.blade.php create mode 100644 resources/views/landing_page/result.blade.php create mode 100644 resources/views/landing_page/upload.blade.php create mode 100644 resources/views/login.blade.php create mode 100644 resources/views/welcome.blade.php create mode 100644 routes/console.php create mode 100644 routes/web.php create mode 100644 storage/app/.gitignore create mode 100644 storage/app/private/.gitignore create mode 100644 storage/app/public/.gitignore create mode 100644 storage/framework/.gitignore create mode 100644 storage/framework/cache/.gitignore create mode 100644 storage/framework/cache/data/.gitignore create mode 100644 storage/framework/sessions/.gitignore create mode 100644 storage/framework/testing/.gitignore create mode 100644 storage/framework/views/.gitignore create mode 100644 storage/logs/.gitignore create mode 100644 tests/Feature/ExampleTest.php create mode 100644 tests/TestCase.php create mode 100644 tests/Unit/ExampleTest.php create mode 100644 vite.config.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..a186cd2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[compose.yaml] +indent_size = 4 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..c0660ea --- /dev/null +++ b/.env.example @@ -0,0 +1,65 @@ +APP_NAME=Laravel +APP_ENV=local +APP_KEY= +APP_DEBUG=true +APP_URL=http://localhost + +APP_LOCALE=en +APP_FALLBACK_LOCALE=en +APP_FAKER_LOCALE=en_US + +APP_MAINTENANCE_DRIVER=file +# APP_MAINTENANCE_STORE=database + +# PHP_CLI_SERVER_WORKERS=4 + +BCRYPT_ROUNDS=12 + +LOG_CHANNEL=stack +LOG_STACK=single +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=sqlite +# DB_HOST=127.0.0.1 +# DB_PORT=3306 +# DB_DATABASE=laravel +# DB_USERNAME=root +# DB_PASSWORD= + +SESSION_DRIVER=database +SESSION_LIFETIME=120 +SESSION_ENCRYPT=false +SESSION_PATH=/ +SESSION_DOMAIN=null + +BROADCAST_CONNECTION=log +FILESYSTEM_DISK=local +QUEUE_CONNECTION=database + +CACHE_STORE=database +# CACHE_PREFIX= + +MEMCACHED_HOST=127.0.0.1 + +REDIS_CLIENT=phpredis +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=log +MAIL_SCHEME=null +MAIL_HOST=127.0.0.1 +MAIL_PORT=2525 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +VITE_APP_NAME="${APP_NAME}" diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b71b1ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +*.log +.DS_Store +.env +.env.backup +.env.production +.phpactor.json +.phpunit.result.cache +/.fleet +/.idea +/.nova +/.phpunit.cache +/.vscode +/.zed +/auth.json +/node_modules +/public/build +/public/hot +/public/storage +/storage/*.key +/storage/pail +/vendor +Homestead.json +Homestead.yaml +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..0165a77 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +
+ + + +## About Laravel + +Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as: + +- [Simple, fast routing engine](https://laravel.com/docs/routing). +- [Powerful dependency injection container](https://laravel.com/docs/container). +- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage. +- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent). +- Database agnostic [schema migrations](https://laravel.com/docs/migrations). +- [Robust background job processing](https://laravel.com/docs/queues). +- [Real-time event broadcasting](https://laravel.com/docs/broadcasting). + +Laravel is accessible, powerful, and provides tools required for large, robust applications. + +## Learning Laravel + +Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework. You can also check out [Laravel Learn](https://laravel.com/learn), where you will be guided through building a modern Laravel application. + +If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library. + +## Laravel Sponsors + +We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com). + +### Premium Partners + +- **[Vehikl](https://vehikl.com)** +- **[Tighten Co.](https://tighten.co)** +- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)** +- **[64 Robots](https://64robots.com)** +- **[Curotec](https://www.curotec.com/services/technologies/laravel)** +- **[DevSquad](https://devsquad.com/hire-laravel-developers)** +- **[Redberry](https://redberry.international/laravel-development)** +- **[Active Logic](https://activelogic.com)** + +## Contributing + +Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions). + +## Code of Conduct + +In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct). + +## Security Vulnerabilities + +If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed. + +## License + +The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..8677cd5 --- /dev/null +++ b/app/Http/Controllers/Controller.php @@ -0,0 +1,8 @@ +all(), [ + 'tomato_image' => [ + 'required', + 'file', + 'image', + 'mimes:jpeg,jpg,png', + 'max:5120', // 5MB max + ], + ], [ + 'tomato_image.required' => 'Gambar tomat harus diunggah.', + 'tomato_image.file' => 'File harus berupa gambar.', + 'tomato_image.image' => 'File harus berupa gambar.', + 'tomato_image.mimes' => 'Format file yang diizinkan: JPG, JPEG, PNG.', + 'tomato_image.max' => 'Ukuran file maksimal 5MB.', + ]); + + if ($validator->fails()) { + return redirect() + ->route('upload.index') + ->withErrors($validator) + ->withInput(); + } + + try { + $file = $request->file('tomato_image'); + + // Generate unique filename + $filename = Str::uuid() . '.' . $file->getClientOriginalExtension(); + + // Create directory if it doesn't exist + $uploadPath = 'uploads/tomatoes'; + if (!Storage::disk('public')->exists($uploadPath)) { + Storage::disk('public')->makeDirectory($uploadPath); + } + + // Store the file + $path = $file->storeAs($uploadPath, $filename, 'public'); + + // Simulate AI classification (replace with actual AI logic) + $classification = $this->classifyTomato($path); + + // Redirect to result page with classification data + return redirect()->route('upload.result', [ + 'image' => $path, + 'category' => $classification['category'], + 'probability' => $classification['probability'] + ]); + + } catch (\Exception $e) { + return redirect() + ->route('upload.index') + ->withErrors(['upload' => 'Terjadi kesalahan saat mengunggah file: ' . $e->getMessage()]) + ->withInput(); + } + } + + /** + * Display the classification result. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\View\View + */ + public function result(Request $request) + { + // Get parameters from query string + $imagePath = $request->get('image'); + $category = $request->get('category', 'matang'); + $probability = (int) $request->get('probability', 85); + + // Validate inputs + if (!$imagePath) { + return redirect()->route('upload.index')->withErrors(['error' => 'Tidak ada gambar yang dianalisis.']); + } + + // Get color classes based on category + $colors = $this->getCategoryColors($category); + + // Get description based on category + $description = $this->getCategoryDescription($category, $probability); + + return view('result', [ + 'imagePath' => $imagePath, + 'category' => $category, + 'probability' => $probability, + 'maturityColor' => $colors['badge'], + 'progressColor' => $colors['progress'], + 'description' => $description + ]); + } + + /** + * Simulate tomato classification (replace with actual AI implementation). + * + * @param string $imagePath + * @return array + */ + private function classifyTomato($imagePath) + { + // Simulate AI classification with random results + // In real implementation, this would call your AI model + $categories = ['mentah', 'setengah matang', 'matang']; + $category = $categories[array_rand($categories)]; + $probability = rand(75, 98); // Random probability between 75-98% + + return [ + 'category' => $category, + 'probability' => $probability + ]; + } + + /** + * Get color classes based on maturity category. + * + * @param string $category + * @return array + */ + private function getCategoryColors($category) + { + $colors = [ + 'mentah' => [ + 'badge' => 'bg-green-500', + 'progress' => 'bg-green-500' + ], + 'setengah matang' => [ + 'badge' => 'bg-yellow-500', + 'progress' => 'bg-yellow-500' + ], + 'matang' => [ + 'badge' => 'bg-red-500', + 'progress' => 'bg-red-500' + ] + ]; + + return $colors[$category] ?? $colors['matang']; + } + + /** + * Get description based on maturity category and probability. + * + * @param string $category + * @param int $probability + * @return string + */ + private function getCategoryDescription($category, $probability) + { + $descriptions = [ + 'mentah' => "Tomat ini masih dalam tahap pertumbuhan awal dengan tingkat kematangan {$probability}%. Warna hijau menunjukkan bahwa tomat belum matang sempurna dan teksturnya masih keras. Direkomendasikan untuk menunggu beberapa hari agar tomat mencapai kematangan optimal.", + 'setengah matang' => "Tomat ini dalam proses pematangan dengan tingkat kematangan {$probability}%. Perpaduan warna hijau dan merah menunjukkan tomat sedang transisi. Tekstur mulai melunak dan rasa mulai terasa. Ideal untuk penggunaan dalam salad atau masakan yang membutuhkan tomat sedikit masak.", + 'matang' => "Tomat ini telah mencapai kematangan optimal dengan tingkat keyakinan {$probability}%. Warna merah cerah dan tekstur lembut menunjukkan tomat siap dikonsumsi. Kandungan nutrisi dan rasa manis alami telah mencapai puncaknya. Sempurna untuk dimakan langsung atau diolah dalam berbagai masakan." + ]; + + return $descriptions[$category] ?? $descriptions['matang']; + } + + /** + * Handle admin login. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\RedirectResponse + */ + public function adminLogin(Request $request) + { + // Validate the request + $validator = Validator::make($request->all(), [ + 'username' => 'required|string|max:255', + 'password' => 'required|string|min:6', + ], [ + 'username.required' => 'Nama pengguna harus diisi.', + 'username.string' => 'Nama pengguna harus berupa string.', + 'username.max' => 'Nama pengguna maksimal 255 karakter.', + 'password.required' => 'Kata sandi harus diisi.', + 'password.string' => 'Kata sandi harus berupa string.', + 'password.min' => 'Kata sandi minimal 6 karakter.', + ]); + + if ($validator->fails()) { + return redirect() + ->route('admin.login') + ->withErrors($validator) + ->withInput(); + } + + // Simple authentication (replace with proper authentication in production) + $username = $request->input('username'); + $password = $request->input('password'); + + // Demo credentials - replace with proper authentication + if ($username === 'admin.tomat' && $password === 'admin123') { + // Store session + session(['admin_logged_in' => true, 'admin_username' => $username]); + + return redirect()->route('admin.dashboard')->with('success', 'Login berhasil! Selamat datang, ' . $username); + } + + // Failed login + return redirect() + ->route('admin.login') + ->withErrors(['login' => 'Nama pengguna atau kata sandi salah.']) + ->withInput($request->except('password')); + } +} diff --git a/app/Models/User.php b/app/Models/User.php new file mode 100644 index 0000000..749c7b7 --- /dev/null +++ b/app/Models/User.php @@ -0,0 +1,48 @@ + */ + use HasFactory, Notifiable; + + /** + * The attributes that are mass assignable. + * + * @var listLihat semua riwayat klasifikasi tomat yang telah dilakukan
+| + Gambar + | ++ Tanggal Unggah + | ++ Klasifikasi + | ++ Skor Keyakinan + | +
|---|---|---|---|
+
+ |
+ + 23 Nov 2024, 14:30 + | ++ + Matang + + | +
+
+ 95.2%
+
+
+
+
+ |
+
+
+ |
+ + 23 Nov 2024, 13:45 + | ++ + Setengah Matang + + | +
+
+ 87.8%
+
+
+
+
+ |
+
+
+ |
+ + 23 Nov 2024, 12:20 + | ++ + Mentah + + | +
+
+ 92.1%
+
+
+
+
+ |
+
+
+ |
+ + 23 Nov 2024, 11:15 + | ++ + Matang + + | +
+
+ 89.5%
+
+
+
+
+ |
+
+
+ |
+ + 23 Nov 2024, 10:30 + | ++ + Setengah Matang + + | +
+
+ 91.3%
+
+
+
+
+ |
+
Selamat datang di dashboard sistem klasifikasi tomat
+Total Klasifikasi
+Akurasi Sistem
+Admin Aktif
+Data Hari Ini
+Jumlah klasifikasi per hari dalam seminggu terakhir
+Persentase kategori kematangan tomat
+Kelola admin yang memiliki akses ke sistem klasifikasi tomat
+| + Foto + | ++ Nama + | ++ Email + | ++ Role + | ++ Action + | +
|---|---|---|---|---|
+
+ |
+
+ Ahmad Wijaya
+ Active
+ |
+ + ahmad.wijaya@example.com + | ++ + Super Admin + + | ++ + + | +
+
+ |
+
+ Siti Nurhaliza
+ Active
+ |
+ + siti.nurhaliza@example.com + | ++ + Admin + + | ++ + + | +
+
+ |
+
+ Budi Santoso
+ Active
+ |
+ + budi.santoso@example.com + | ++ + Admin + + | ++ + + | +
+
+ |
+
+ Dewi Lestari
+ Inactive
+ |
+ + dewi.lestari@example.com + | ++ + Admin + + | ++ + + | +
+
+ |
+
+ Rizki Pratama
+ Active
+ |
+ + rizki.pratama@example.com + | ++ + Moderator + + | ++ + + | +
Pantau performa dan statistik sistem klasifikasi tomat
+Total Klasifikasi
+Klasifikasi Hari Ini
+Akurasi Rata-rata
+Pengguna Aktif Admin
+Statistik klasifikasi per hari dalam 7 hari terakhir
+Perkembangan klasifikasi per bulan
+Persentase hasil klasifikasi berdasarkan kategori kematangan
++ Platform berbasis AI yang dirancang khusus untuk membantu petani dan distributor dalam menentukan tingkat kematangan tomat secara akurat dan efisien. +
++ Kami berkomitmen untuk menyediakan solusi teknologi yang dapat meningkatkan efisiensi dan kualitas dalam industri pertanian tomat. +
++ MaturityScan Tomat dikembangkan dengan tujuan utama untuk mengatasi tantangan dalam klasifikasi kematangan tomat yang selama ini dilakukan secara manual dan subjektif. Sistem kami memanfaatkan kekuatan kecerdasan buatan dan computer vision untuk memberikan hasil yang konsisten, akurat, dan dapat diandalkan. +
++ Dengan menggunakan algoritma pembelajaran mendalam yang telah dilatih dengan ribuan gambar tomat dari berbagai tingkat kematangan, sistem kami mampu mengenali pola-pola visual yang sulit dibedakan oleh mata manusia. Ini memungkinkan klasifikasi yang lebih presisi berdasarkan karakteristik warna, tekstur, dan bentuk tomat. +
++ Kami percaya bahwa teknologi ini tidak hanya akan membantu meningkatkan kualitas produk tomat yang mencapai pasar, tetapi juga akan mengurangi pemborosan akibat klasifikasi yang tidak akurat. Petani dapat memanen tomat pada waktu yang optimal, distributor dapat mengelola inventaris dengan lebih baik, dan konsumen akhir akan mendapatkan produk dengan kualitas yang konsisten. +
++ Kombinasi algoritma canggih dan arsitektur modern yang menjamin performa optimal. +
++ Sistem kami menggunakan Convolutional Neural Network (CNN) yang telah dioptimalkan khusus untuk klasifikasi gambar tomat. Algoritma ini mampu: +
++ Arsitektur aplikasi kami dibangun dengan teknologi modern untuk memastikan performa dan skalabilitas: +
++ Empat langkah mudah untuk mendapatkan hasil klasifikasi yang akurat. +
++ Upload foto tomat melalui interface yang user-friendly. Support format JPG dan PNG. +
++ AI kami menganalisis gambar secara mendalam untuk menentukan tingkat kematangan. +
++ Lihat hasil klasifikasi dengan probabilitas dan rekomendasi penggunaan. +
++ Sistem terus belajar dari setiap klasifikasi untuk meningkatkan akurasi. +
++ Membangun ekosistem pertanian digital yang lebih cerdas dan berkelanjutan. +
++ Visi kami adalah menjadi pemimpin dalam teknologi klasifikasi pertanian di Asia Tenggara pada tahun 2030. Kami tidak berhenti hanya pada klasifikasi tomat, tetapi berencana untuk mengembangkan sistem yang dapat mengklasifikasikan berbagai jenis produk pertanian lainnya seperti buah-buahan, sayuran, dan biji-bijian. +
++ Kami sedang mengembangkan fitur-fitur canggih seperti prediksi waktu panen berdasarkan data historis, rekomendasi harga pasar berdasarkan kualitas produk, dan sistem integrasi dengan marketplace pertanian. Ini akan menciptakan ekosistem lengkap dari hulu hingga hilir yang memberikan nilai tambah bagi semua pemangku kepentingan. +
++ Dalam jangka panjang, kami berharap teknologi kami dapat berkontribusi pada ketahanan pangan global dengan mengurangi pemborosan makanan hingga 30% melalui klasifikasi yang lebih akurat dan manajemen rantai pasok yang lebih efisien. Kami juga berkomitmen untuk membuat teknologi ini mudah diakses oleh petani skala kecil melalui model harga yang terjangkau dan program pelatihan berkelanjutan. +
++ Kolaborasi dengan institusi penelitian, pemerintah, dan komunitas pertanian menjadi kunci dalam mewujudkan visi ini. Bersama, kita dapat membangun masa depan pertanian yang lebih cerdas, berkelanjutan, dan menguntungkan bagi semua pihak. +
++ {{ $description }} +
++ Seret dan lepas gambar tomat Anda atau klik untuk memilih file. +
+Silakan masukkan kredensial Anda untuk melanjutkan.
++ Belum punya akun? + + Hubungi administrator + +
++ 🔒 Login aman dengan enkripsi SSL +
++ MaturityScan Tomat adalah aplikasi web modern yang dirancang untuk mengklasifikasikan kematangan tomat menggunakan analisis gambar berbasis AI. +
+ +Sistem kami mengklasifikasikan tomat menjadi tiga tingkat kematangan
+Tomat yang belum matang sempurna, berwarna hijau dan tekstur masih keras.
+Tomat dalam proses pematangan, perpaduan warna hijau dan merah.
+Tomat matang sempurna, berwarna merah cerah dan tekstur lembut.
+Tiga langkah mudah untuk mengklasifikasikan kematangan tomat Anda
+Ambil foto tomat atau unggah gambar dari galeri perangkat Anda.
+Sistem AI kami menganalisis warna, tekstur, dan bentuk tomat secara otomatis.
+Lihat hasil klasifikasi kematangan tomat dengan akurasi tinggi.
+