From fb8c926033765ba0768950e695354c3b92621bb4 Mon Sep 17 00:00:00 2001 From: Alfiansyahp2 Date: Tue, 13 May 2025 16:54:42 +0700 Subject: [PATCH] projek besar --- app/Http/Controllers/AdminController.php | 85 +-- app/Http/Controllers/AlternatifController.php | 196 ++++++ .../Controllers/Auth/RegisterController.php | 59 -- .../Controllers/LandingPageController.php | 17 + app/Http/Controllers/LoginController.php | 39 ++ app/Http/Controllers/MakananController.php | 84 ++- .../PerbandinganKriteriaController.php | 44 ++ app/Http/Controllers/ProsesController.php | 145 +++++ app/Http/Controllers/RegisterController.php | 47 ++ .../Controllers/RekomendasiController.php | 88 +++ app/Http/Controllers/UserController.php | 67 ++- app/Http/Kernel.php | 1 + app/Http/Middleware/CekRole.php | 34 ++ app/Http/Requests/JenisMakananRequest.php | 29 + app/Http/Requests/KriteriaRequest.php | 1 + app/Http/Requests/MakananRequest.php | 13 +- .../Requests/UpdateJenisMakananRequest.php | 29 + app/Http/Requests/UpdateKriteriaRequest.php | 1 + app/Http/Requests/UpdateMakananRequest.php | 15 +- app/Models/Alternatif.php | 2 - app/Models/BobotKriteria.php | 7 + app/Models/JenisMakanan.php | 28 + app/Models/Kriteria.php | 21 +- app/Models/Makanan.php | 35 +- app/Models/PerbandinganAlternatif.php | 18 + app/Models/PerbandinganKriteria.php | 23 + app/Models/Rekomendasi.php | 23 + app/Models/SkorMakanan.php | 23 + ...05_072732_create_bobot_kriterias_table.php | 33 -- ..._04_07_063541_create_alternatifs_table.php | 29 - ..._14_210704_create_jenis_makanans_table.php | 28 + ...5_04_14_214752_create_kriterias_table.php} | 7 +- ...25_04_14_215323_create_makanans_table.php} | 21 +- ...02_create_perbandingan_kriterias_table.php | 32 + ...14_215658_create_bobot_kriterias_table.php | 30 + ...4_14_215759_create_skor_makanans_table.php | 32 + ...04_14_215856_create_rekomendasis_table.php | 33 ++ ..._create_perbandingan_alternatifs_table.php | 35 ++ public/assets/css/style.css | 56 +- resources/views/admin/admindash.blade.php | 558 +++++++----------- .../admin/alternatif/normalisasi.blade.php | 93 +++ .../admin/alternatif/perbandingan.blade.php | 80 +++ .../views/admin/alternatif/pilih.blade.php | 137 +++++ .../views/admin/datauser/datauser.blade.php | 2 +- .../editjenismakanan.blade.php} | 16 +- .../jenismakanan.blade.php} | 18 +- .../tambahjenismakanan.blade.php} | 17 +- .../admin/kategori/editkategori.blade.php | 2 +- .../admin/kriteria/editkriteria.blade.php | 6 + .../views/admin/kriteria/kriteria.blade.php | 2 + .../admin/kriteria/tambahkriteria.blade.php | 7 + .../views/admin/makanan/editmakanan.blade.php | 43 +- .../views/admin/makanan/makanan.blade.php | 18 +- .../admin/makanan/tambahmakanan.blade.php | 59 +- .../views/admin/proses/normalisasi.blade.php | 88 +++ .../views/admin/proses/perbandingan.blade.php | 131 ++++ resources/views/admin/rekomendasi.blade.php | 72 +++ resources/views/auth/register.blade.php | 138 ----- resources/views/landingpage.blade.php | 141 +++++ resources/views/layout/app.blade.php | 5 + resources/views/layout/header.blade.php | 109 ++-- resources/views/layout/sidebar.blade.php | 116 ++-- resources/views/layoutlp/app.blade.php | 119 ++++ resources/views/layoutlp/footer.blade.php | 55 ++ resources/views/layoutlp/header.blade.php | 27 + resources/views/layoutuser/app.blade.php | 20 +- resources/views/layoutuser/footer.blade.php | 10 +- resources/views/layoutuser/header.blade.php | 66 ++- resources/views/login.blade.php | 210 ++++--- resources/views/register.blade.php | 189 ++++++ resources/views/user/about.blade.php | 171 ------ resources/views/user/feature.blade.php | 69 --- resources/views/user/service.blade.php | 189 ------ resources/views/user/userabout.blade.php | 171 ++++++ resources/views/user/userdash.blade.php | 336 +++-------- resources/views/user/userdata.blade.php | 88 +++ resources/views/user/userfeature.blade.php | 133 +++++ resources/views/user/userresult.blade.php | 83 +++ routes/web.php | 163 +++-- 79 files changed, 3653 insertions(+), 1814 deletions(-) create mode 100644 app/Http/Controllers/AlternatifController.php delete mode 100644 app/Http/Controllers/Auth/RegisterController.php create mode 100644 app/Http/Controllers/LandingPageController.php create mode 100644 app/Http/Controllers/PerbandinganKriteriaController.php create mode 100644 app/Http/Controllers/ProsesController.php create mode 100644 app/Http/Controllers/RegisterController.php create mode 100644 app/Http/Controllers/RekomendasiController.php create mode 100644 app/Http/Middleware/CekRole.php create mode 100644 app/Http/Requests/JenisMakananRequest.php create mode 100644 app/Http/Requests/UpdateJenisMakananRequest.php create mode 100644 app/Models/JenisMakanan.php create mode 100644 app/Models/PerbandinganAlternatif.php create mode 100644 app/Models/PerbandinganKriteria.php create mode 100644 app/Models/Rekomendasi.php create mode 100644 app/Models/SkorMakanan.php delete mode 100644 database/migrations/2024_12_05_072732_create_bobot_kriterias_table.php delete mode 100644 database/migrations/2025_04_07_063541_create_alternatifs_table.php create mode 100644 database/migrations/2025_04_14_210704_create_jenis_makanans_table.php rename database/migrations/{2024_12_05_072244_create_kriterias_table.php => 2025_04_14_214752_create_kriterias_table.php} (69%) rename database/migrations/{2024_12_04_083510_create_makanans_table.php => 2025_04_14_215323_create_makanans_table.php} (50%) create mode 100644 database/migrations/2025_04_14_215502_create_perbandingan_kriterias_table.php create mode 100644 database/migrations/2025_04_14_215658_create_bobot_kriterias_table.php create mode 100644 database/migrations/2025_04_14_215759_create_skor_makanans_table.php create mode 100644 database/migrations/2025_04_14_215856_create_rekomendasis_table.php create mode 100644 database/migrations/2025_04_30_055826_create_perbandingan_alternatifs_table.php create mode 100644 resources/views/admin/alternatif/normalisasi.blade.php create mode 100644 resources/views/admin/alternatif/perbandingan.blade.php create mode 100644 resources/views/admin/alternatif/pilih.blade.php rename resources/views/admin/{alternatif/editalternatif.blade.php => jenismakanan/editjenismakanan.blade.php} (87%) rename resources/views/admin/{alternatif/alternatif.blade.php => jenismakanan/jenismakanan.blade.php} (71%) rename resources/views/admin/{alternatif/tambahalternatif.blade.php => jenismakanan/tambahjenismakanan.blade.php} (79%) create mode 100644 resources/views/admin/proses/normalisasi.blade.php create mode 100644 resources/views/admin/proses/perbandingan.blade.php create mode 100644 resources/views/admin/rekomendasi.blade.php delete mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/landingpage.blade.php create mode 100644 resources/views/layoutlp/app.blade.php create mode 100644 resources/views/layoutlp/footer.blade.php create mode 100644 resources/views/layoutlp/header.blade.php create mode 100644 resources/views/register.blade.php delete mode 100644 resources/views/user/about.blade.php delete mode 100644 resources/views/user/feature.blade.php delete mode 100644 resources/views/user/service.blade.php create mode 100644 resources/views/user/userabout.blade.php create mode 100644 resources/views/user/userdata.blade.php create mode 100644 resources/views/user/userfeature.blade.php create mode 100644 resources/views/user/userresult.blade.php diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 5143fcc..f039034 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -9,6 +9,8 @@ use App\Models\Kriteria; use App\Models\Alternatif; use App\Models\Role; +use App\Models\Makanan; +use App\Models\Rekomendasi; use App\Http\Requests\UserRequest; use App\Http\Requests\KriteriaRequest; use App\Http\Requests\AlternatifRequest; @@ -17,18 +19,35 @@ use App\Http\Requests\UpdateKriteriaRequest; use App\Http\Requests\UpdateAlternatifRequest; use App\Http\Requests\UpdateRoleRequest; +use Illuminate\Support\Facades\DB; class AdminController extends Controller { // - public function admindash(){ - return view('admin.admindash'); - } - + public function admindash() +{ + $userCount = User::count(); + $makananCount = Makanan::count(); + + // Ambil 5 rekomendasi tertinggi dengan relasi makanan + $chartData = Rekomendasi::with('makanan') + ->orderByDesc('nilai_akhir') + ->take(5) + ->get() + ->map(function ($item) { + return [ + 'name' => $item->makanan->nama, + 'value' => $item->nilai_akhir + ]; + }); + + return view('admin.admindash', compact('userCount', 'makananCount', 'chartData')); +} + // USER public function datauser(){ $users = User::with('role')->get(); // Eager load the role relationship return view('admin.datauser.datauser', compact('users')); @@ -90,7 +109,7 @@ public function deleteuser(User $user) { - + // role public function role(){ $roles = Role::all(); return view('admin.role.role', compact('roles')); @@ -115,61 +134,5 @@ public function deleterole(Role $role) { $role->delete(); return redirect()->route('role')->with('success', 'user deleted successfully'); } - - - - - public function kriteria(){ - $kriterias = Kriteria::all(); - return view('admin.kriteria.kriteria', compact('kriterias')); - } - public function editkriteria(Kriteria $kriteria){ - return view('admin.kriteria.editkriteria', compact('kriteria')); - } - public function tambahkriteria(){ - return view('admin.kriteria.tambahkriteria'); - } - public function storekriteria(KriteriaRequest $request){ - $validatedData = $request->validated(); - Kriteria::create($validatedData); - return redirect()->route('kriteria'); - } - public function updatekriteria(UpdateKriteriaRequest $request, Kriteria $kriteria){ - $validatedData = $request->validated(); - $kriteria->update($validatedData); - return redirect()->route('kriteria'); - } - public function deletekriteria(Kriteria $kriteria) { - $kriteria->delete(); - return redirect()->route('kriteria')->with('success', 'user deleted successfully'); - } - - - - - - public function alternatif(){ - return view('admin.alternatif.alternatif'); - } - public function editalternatif(Alternatif $alternatif){ - return view('admin.alternatif.editalternatif', compact('alternatif')); - } - public function tambahalternatif(){ - return view('admin.alternatif.tambahalternatif'); - } - public function storealternatif(AlternatifRequest $request){ - $validatedData = $request->validated(); - Alternatif::create($validatedData); - return redirect()->route('alternatif'); - } - public function updatealternatif(UpdateAlternatifRequest $request, Alternatif $alternatif){ - $validatedData = $request->validated(); - $alternatif->update($validatedData); - return redirect()->route('alternatif'); - } - public function deletealternatif(Alternatif $alternatif) { - $alternatif->delete(); - return redirect()->route('alternatif')->with('success', 'user deleted successfully'); - } } diff --git a/app/Http/Controllers/AlternatifController.php b/app/Http/Controllers/AlternatifController.php new file mode 100644 index 0000000..e210d1b --- /dev/null +++ b/app/Http/Controllers/AlternatifController.php @@ -0,0 +1,196 @@ +query('sort'); + + if (in_array($sort, ['lemak', 'natrium', 'energi', 'karbohidrat'])) { + $makanans = Makanan::orderBy($sort, 'desc')->get(); // urut dari tinggi ke rendah + } else { + $makanans = Makanan::all(); + } + + return view('admin.alternatif.pilih', compact('makanans')); +} + + // 2. Simpan pilihan alternatif ke session + public function pilihAlternatif(Request $request) + { + $request->validate([ + 'alternatifs' => 'required|array|min:2', + ]); + + session(['alternatifs_dipilih' => $request->alternatifs]); + + return redirect()->route('alternatif.perbandingan'); + } + + // 3. Tampilkan form perbandingan alternatif per kriteria + public function tampilPerbandingan() + { + $idAlternatif = session('alternatifs_dipilih'); + + if (!$idAlternatif || count($idAlternatif) < 2) { + return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.'); + } + + $alternatifs = Makanan::whereIn('id', $idAlternatif)->get(); + $kriterias = Kriteria::all(); + + return view('admin.alternatif.perbandingan', compact('kriterias', 'alternatifs')); + } + + // 4. Simpan hasil perbandingan ke database + public function simpanPerbandingan(Request $request) +{ + $data = $request->input('nilai'); + + foreach ($data as $kriteria_id => $baris) { + foreach ($baris as $alt1 => $kolom) { + foreach ($kolom as $alt2 => $nilai) { + if ($alt1 != $alt2 && $nilai != null) { + // Simpan nilai asli + PerbandinganAlternatif::updateOrCreate( + [ + 'kriteria_id' => $kriteria_id, + 'alternatif_id_1' => $alt1, + 'alternatif_id_2' => $alt2, + ], + ['nilai' => $nilai] + ); + + // Simpan nilai kebalikannya + PerbandinganAlternatif::updateOrCreate( + [ + 'kriteria_id' => $kriteria_id, + 'alternatif_id_1' => $alt2, + 'alternatif_id_2' => $alt1, + ], + ['nilai' => 1 / $nilai] + ); + } + } + } + } + + if ($request->input('action') == 'lanjut') { + return redirect()->route('alternatif.normalisasi')->with('success', 'Data berhasil disimpan, lanjut ke tahap normalisasi.'); + } + + return redirect()->back()->with('success', 'Perbandingan alternatif berhasil disimpan.'); +} + + + public function tampilNormalisasi() +{ + $idAlternatif = session('alternatifs_dipilih'); + + if (!$idAlternatif || count($idAlternatif) < 2) { + return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.'); + } + + $alternatifs = Makanan::whereIn('id', $idAlternatif)->get(); + $kriterias = Kriteria::all(); + $matriks = []; + + foreach ($kriterias as $kriteria) { + $matriks[$kriteria->id] = []; + + foreach ($alternatifs as $alt1) { + $matriks[$kriteria->id][$alt1->id] = []; + + foreach ($alternatifs as $alt2) { + if ($alt1->id == $alt2->id) { + $matriks[$kriteria->id][$alt1->id][$alt2->id] = 1; + } else { + $nilai = DB::table('perbandingan_alternatifs') + ->where('kriteria_id', $kriteria->id) + ->where('alternatif_id_1', $alt1->id) + ->where('alternatif_id_2', $alt2->id) + ->value('nilai'); + + $matriks[$kriteria->id][$alt1->id][$alt2->id] = $nilai ?? 1; // default 1 + } + } + } + } + + return view('admin.alternatif.normalisasi', compact('alternatifs', 'kriterias', 'matriks')); +} + +public function simpanNormalisasi() +{ + $idAlternatif = session('alternatifs_dipilih'); + + if (!$idAlternatif || count($idAlternatif) < 2) { + return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.'); + } + + $alternatifs = Makanan::whereIn('id', $idAlternatif)->get(); + $kriterias = Kriteria::all(); + + foreach ($kriterias as $kriteria) { + $jumlahKolom = []; + foreach ($alternatifs as $colAlt) { + $jumlahKolom[$colAlt->id] = 0; + } + + // Hitung jumlah kolom + foreach ($alternatifs as $rowAlt) { + foreach ($alternatifs as $colAlt) { + $nilai = DB::table('perbandingan_alternatifs') + ->where('kriteria_id', $kriteria->id) + ->where('alternatif_id_1', $rowAlt->id) + ->where('alternatif_id_2', $colAlt->id) + ->value('nilai') ?? 1; + $jumlahKolom[$colAlt->id] += $nilai; + } + } + + // Hitung bobot (normalisasi + rata-rata baris) + foreach ($alternatifs as $rowAlt) { + $jumlahBaris = 0; + + foreach ($alternatifs as $colAlt) { + $nilai = DB::table('perbandingan_alternatifs') + ->where('kriteria_id', $kriteria->id) + ->where('alternatif_id_1', $rowAlt->id) + ->where('alternatif_id_2', $colAlt->id) + ->value('nilai') ?? 1; + + $normalized = $nilai / $jumlahKolom[$colAlt->id]; + $jumlahBaris += $normalized; + } + + $bobot = $jumlahBaris / count($alternatifs); + + // Simpan ke skor_makanan + SkorMakanan::updateOrCreate( + [ + 'kriteria_id' => $kriteria->id, + 'makanan_id' => $rowAlt->id + ], + [ + 'nilai' => $bobot + ] + ); + } + } + + return redirect()->route('rekomendasi.proses')->with('success', 'Bobot alternatif berhasil disimpan ke skor_makanan.'); +} +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php deleted file mode 100644 index bf1ad7e..0000000 --- a/app/Http/Controllers/Auth/RegisterController.php +++ /dev/null @@ -1,59 +0,0 @@ -all(), [ - 'name' => 'required|string|max:255', - 'email' => 'required|email|unique:users,email', - 'no_telp' => 'required|string|max:20', // Example: Indonesian phone numbers starting with 08 - 'password' => 'required|min:6|confirmed', // Ensure password confirmation is required - ]); - - if ($validator->fails()) { - return redirect()->route('register') - ->withErrors($validator) - ->withInput(); - } - - // Find the 'user' role ID (assuming the role name is 'user') - $role = Role::where('name', 'user')->first(); // Adjust if your roles table is structured differently - $roleId = $role ? $role->id : 2; // Default to 2 (user role) if not found - - // Create the new user (without hashing the password) - $user = User::create([ - 'name' => $request->name, - 'email' => $request->email, - 'no_telp' => $request->no_telp, - 'password' => $request->password, // Store the password as plain text - 'role_id' => $roleId, // Assign the user role by default - ]); - - // Redirect to the login page after successful registration - return redirect()->route('login')->with('success', 'Account created successfully. Please login.'); -} - - -} diff --git a/app/Http/Controllers/LandingPageController.php b/app/Http/Controllers/LandingPageController.php new file mode 100644 index 0000000..efa5f59 --- /dev/null +++ b/app/Http/Controllers/LandingPageController.php @@ -0,0 +1,17 @@ +count(); // atau model: DataMakanan::count() + $totalKriteria = DB::table('kriterias')->count(); + $totalUser = DB::table('users')->count(); + return view('landingpage', compact('totalData', 'totalKriteria', 'totalUser')); + } +} diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/LoginController.php index e724f49..febdef7 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/LoginController.php @@ -3,6 +3,9 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; +use App\Models\User; + class LoginController extends Controller { @@ -10,4 +13,40 @@ class LoginController extends Controller public function login(){ return view('login'); } + + public function loginPost(Request $request) +{ + // Validasi input + $credentials = $request->only('email', 'password'); + + // Ambil user berdasarkan email + $user = User::where('email', $credentials['email'])->first(); + + // Cek apakah user ada dan password cocok (tanpa hash) + if ($user && $user->password === $credentials['password']) { + // Login manual + Auth::login($user); + + $role = $user->role->name; // Pastikan relasi role-nya benar + + if ($role === 'admin') { + return redirect()->route('admindash'); + } elseif ($role === 'user') { + return redirect()->route('userdash'); + } else { + Auth::logout(); + return redirect()->route('login')->with('error', 'Role tidak dikenali.'); + } + } + + return redirect()->route('login')->with('error', 'Email atau password salah.'); +} + + + // Logout + public function logout() + { + Auth::logout(); + return redirect()->route('lp'); + } } diff --git a/app/Http/Controllers/MakananController.php b/app/Http/Controllers/MakananController.php index c7c63d4..8f079c0 100644 --- a/app/Http/Controllers/MakananController.php +++ b/app/Http/Controllers/MakananController.php @@ -9,27 +9,32 @@ use App\Models\Kategori; use App\Http\Requests\KategoriRequest; use App\Http\Requests\UpdateKategoriRequest; +use App\Models\JenisMakanan; +use App\Http\Requests\JenisMakananRequest; +use App\Http\Requests\UpdateJenisMakananRequest; class MakananController extends Controller { // public function makanan(){ - $makanans = Makanan::with('kategori')->get(); // Ambil semua data makanan dengan relasi kategori + $makanans = Makanan::with('kategori', 'jenis')->get(); // Ambil semua data makanan dengan relasi kategori return view('admin.makanan.makanan', compact('makanans')); } public function editmakanan(Makanan $makanan){ - // Ambil semua kategori untuk dropdown + // Ambil semua kategori untuk dropdown $kategoris = Kategori::pluck('kategori', 'id'); // Ambil nama dan ID kategori - return view('admin.makanan.editmakanan', compact('makanan', 'kategoris')); + $jenis_makanans = JenisMakanan::pluck('name', 'id'); // Ambil nama dan ID kategori + return view('admin.makanan.editmakanan', compact('makanan', 'kategoris', 'jenis_makanans')); } public function tambahMakanan(){ // Mengambil semua data kategori $kategoris = Kategori::all(); // Pastikan ini adalah koleksi Eloquent + $jenis_makanans = JenisMakanan::all(); // Pastikan ini adalah koleksi Eloquent // Mengirim data ke view - return view('admin.makanan.tambahmakanan', compact('kategoris')); + return view('admin.makanan.tambahmakanan', compact('kategoris', 'jenis_makanans')); } @@ -39,13 +44,16 @@ public function storemakanan(MakananRequest $request) // dd($validatedData); // Ganti koma dengan titik untuk input desimal - $validatedData['lemak_jenuh'] = str_replace(',', '.', $validatedData['lemak_jenuh']); + $validatedData['lemak'] = str_replace(',', '.', $validatedData['lemak']); $validatedData['natrium'] = str_replace(',', '.', $validatedData['natrium']); - $validatedData['kolesterol'] = str_replace(',', '.', $validatedData['kolesterol']); - $validatedData['kalori'] = str_replace(',', '.', $validatedData['kalori']); + $validatedData['energi'] = str_replace(',', '.', $validatedData['energi']); + $validatedData['karbohidrat'] = str_replace(',', '.', $validatedData['karbohidrat']); + // Simpan relasi kategori_id ke database $validatedData['kategori_id'] = $request->input('kategori_id'); + $validatedData['jenis_id'] = $request->input('jenis_id'); + // Simpan data makanan ke database @@ -56,21 +64,24 @@ public function storemakanan(MakananRequest $request) public function updatemakanan(UpdateMakananRequest $request, Makanan $makanan) { + $validatedData = $request->validated(); - - // Ganti koma dengan titik untuk input desimal - $validatedData['lemak_jenuh'] = str_replace(',', '.', $validatedData['lemak_jenuh']); - $validatedData['natrium'] = str_replace(',', '.', $validatedData['natrium']); - $validatedData['kolesterol'] = str_replace(',', '.', $validatedData['kolesterol']); - $validatedData['kalori'] = str_replace(',', '.', $validatedData['kalori']); - + // Simpan relasi kategori_id ke database $validatedData['kategori_id'] = $request->input('kategori_id'); + $validatedData['jenis_id'] = $request->input('jenis_id'); + // Ganti koma dengan titik untuk input desimal + $validatedData['lemak'] = str_replace(',', '.', $validatedData['lemak']); + $validatedData['natrium'] = str_replace(',', '.', $validatedData['natrium']); + $validatedData['energi'] = str_replace(',', '.', $validatedData['energi']); + $validatedData['karbohidrat'] = str_replace(',', '.', $validatedData['karbohidrat']); + // Update data makanan di database $makanan->update($validatedData); + - return redirect()->route('makanan')->with('success', 'Makanan berhasil diperbarui!'); + return redirect()->route('makanan')->with('success', 'Makanan berhasil diperbarui!'); } public function deletemakanan(Makanan $makanan) { @@ -113,4 +124,47 @@ public function deletekategori(Kategori $kategori) { $kategori->delete(); return redirect()->route('kategori')->with('success', 'user deleted successfully'); } + + + + + + + + + public function jenismakanan() +{ + $jenis_makanans = JenisMakanan::all(); + return view('admin.jenismakanan.jenismakanan', compact('jenis_makanans')); +} + +public function editjenismakanan(JenisMakanan $jenis) +{ + return view('admin.jenismakanan.editjenismakanan', compact('jenis')); +} + +public function tambahjenismakanan() +{ + return view('admin.jenismakanan.tambahjenismakanan'); +} + +public function storejenismakanan(JenisMakananRequest $request) +{ + $validatedData = $request->validated(); + JenisMakanan::create($validatedData); + return redirect()->route('jenismakanan'); +} + +public function updatejenismakanan(UpdateJenisMakananRequest $request, JenisMakanan $jenis) +{ + $validatedData = $request->validated(); + $jenis->update($validatedData); + return redirect()->route('jenismakanan'); +} + +public function deletejenismakanan(JenisMakanan $jenis) +{ + $jenis->delete(); + return redirect()->route('jenismakanan')->with('success', 'Jenis makanan berhasil dihapus'); +} } diff --git a/app/Http/Controllers/PerbandinganKriteriaController.php b/app/Http/Controllers/PerbandinganKriteriaController.php new file mode 100644 index 0000000..f09a410 --- /dev/null +++ b/app/Http/Controllers/PerbandinganKriteriaController.php @@ -0,0 +1,44 @@ +validated(); + Kriteria::create($validatedData); + return redirect()->route('kriteria'); + } + public function updatekriteria(UpdateKriteriaRequest $request, Kriteria $kriteria){ + $validatedData = $request->validated(); + $kriteria->update($validatedData); + return redirect()->route('kriteria'); + } + public function deletekriteria(Kriteria $kriteria) { + $kriteria->delete(); + return redirect()->route('kriteria')->with('success', 'user deleted successfully'); + } + + + + + + +} diff --git a/app/Http/Controllers/ProsesController.php b/app/Http/Controllers/ProsesController.php new file mode 100644 index 0000000..b351707 --- /dev/null +++ b/app/Http/Controllers/ProsesController.php @@ -0,0 +1,145 @@ +validate([ + 'nilai' => 'required|array', + ]); + + $kriterias = Kriteria::all(); + $nilai = []; + + // Hapus data lama (opsional, jika ingin reset) + foreach ($kriterias as $baris) { + foreach ($kriterias as $kolom) { + if ($baris->id != $kolom->id) { + PerbandinganKriteria::where([ + ['kriteria_id_1', $baris->id], + ['kriteria_id_2', $kolom->id] + ])->delete(); + } + } + } + + // Membuat matriks perbandingan dan menyimpannya ke session dan DB + foreach ($kriterias as $baris) { + foreach ($kriterias as $kolom) { + if ($baris->id == $kolom->id) { + $nilai[$baris->id][$kolom->id] = 1; + } elseif (isset($request->nilai[$baris->id][$kolom->id])) { + $val = floatval($request->nilai[$baris->id][$kolom->id]); + $nilai[$baris->id][$kolom->id] = $val; + $nilai[$kolom->id][$baris->id] = 1 / $val; + + PerbandinganKriteria::updateOrCreate( + [ + 'kriteria_id_1' => $baris->id, + 'kriteria_id_2' => $kolom->id + ], + [ + 'nilai' => $val + ] + ); + } + } + } + + Session::put('matriks', $nilai); + return redirect()->route('perbandingan'); + } + + public function simpanPerbandingan() + { + $matriks = Session::get('matriks'); + + if (!$matriks) { + return redirect()->route('perbandingan')->with('error', 'Belum ada data untuk disimpan.'); + } + + Session::put('matriks_perbandingan', $matriks); + return redirect()->route('hasil.normalisasi')->with('success', 'Data berhasil disimpan!'); + } + + public function hasilNormalisasi() + { + $kriterias = Kriteria::all(); + $matriks = Session::get('matriks_perbandingan'); + + if (!$matriks) { + return redirect()->route('perbandingan')->with('error', 'Data perbandingan belum tersedia.'); + } + + // Hitung jumlah per kolom + $jumlahKolom = []; + foreach ($kriterias as $kriteria) { + $id = $kriteria->id; + $jumlahKolom[$id] = 0; + foreach ($matriks as $baris) { + $jumlahKolom[$id] += $baris[$id]; + } + } + + // Normalisasi + $normalisasi = []; + foreach ($kriterias as $baris) { + $row = []; + foreach ($kriterias as $kolom) { + $row[] = $matriks[$baris->id][$kolom->id] / $jumlahKolom[$kolom->id]; + } + $normalisasi[] = $row; + } + + // Hitung bobot + $bobot = []; + foreach ($normalisasi as $baris) { + $bobot[] = array_sum($baris) / count($baris); + } + + // Simpan bobot ke database dan session + foreach ($bobot as $index => $value) { + BobotKriteria::updateOrCreate( + ['kriteria_id' => $kriterias[$index]->id], + ['bobot' => $value] + ); + } + + Session::put('bobot_kriteria', $bobot); + + return view('admin.proses.normalisasi', [ + 'kriterias' => $kriterias, + 'normalisasi' => $normalisasi, + 'bobot' => $bobot + ]); + } + + public function perbandinganAlternatif() + { + $kriterias = Kriteria::all(); + $alternatifs = Makanan::all(); + $bobot = Session::get('bobot_kriteria'); + + if (!$bobot) { + return redirect()->route('hasil.normalisasi')->with('error', 'Bobot kriteria belum tersedia.'); + } + + return view('admin.alternatif.perbandingan', compact('kriterias', 'alternatifs', 'bobot')); + } +} diff --git a/app/Http/Controllers/RegisterController.php b/app/Http/Controllers/RegisterController.php new file mode 100644 index 0000000..ea7c23b --- /dev/null +++ b/app/Http/Controllers/RegisterController.php @@ -0,0 +1,47 @@ +validate([ + 'name' => 'required|string|max:255', + 'email' => 'required|email|unique:users,email', + 'no_telp' => 'required|string|max:20', + 'password' => 'required|min:4', + ]); + + // Cari role 'user' dari tabel roles + $userRole = Role::where('name', 'user')->first(); + + if (!$userRole) { + return redirect()->back()->with('error', 'Role user belum dibuat di database.'); + } + + // Buat user (password tidak di-hash) + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'no_telp' => $request->no_telp, + 'password' => $request->password, // TANPA Hash::make() + 'role_id' => $userRole->id, + ]); + + // // Login otomatis + // Auth::login($user); + + return redirect()->route('login')->with('success', 'Registrasi berhasil!'); + } +} diff --git a/app/Http/Controllers/RekomendasiController.php b/app/Http/Controllers/RekomendasiController.php new file mode 100644 index 0000000..2f7c025 --- /dev/null +++ b/app/Http/Controllers/RekomendasiController.php @@ -0,0 +1,88 @@ +id] ?? 0; + $bobotAlternatif = SkorMakanan::where('kriteria_id', $kriteria->id) + ->where('makanan_id', $alternatif->id) + ->value('nilai') ?? 0; + + $nilaiAkhir += $bobotKriteria * $bobotAlternatif; + } + + // Simpan ke tabel rekomendasi + Rekomendasi::updateOrCreate( + ['makanan_id' => $alternatif->id, 'user_id' => Auth::id()], + [ + 'nilai_akhir' => $nilaiAkhir, + 'tanggal_rekomendasi' => Carbon::now()->toDateString() + ] + ); + } + + return redirect()->route('rekomendasi.hasil')->with('success', 'Rekomendasi berhasil dihitung dan disimpan.'); + } + + // 2. Tampilkan hasil rekomendasi + public function tampil() +{ + // Hanya mengambil data rekomendasi dengan nilai_akhir lebih besar dari 0 + $rekomendasi = Rekomendasi::with('makanan') + ->where('nilai_akhir', '>', 0) + ->orderByDesc('nilai_akhir') + ->get(); + + return view('admin.rekomendasi', compact('rekomendasi')); +} + + + + public function kirimKeUser($userId) +{ + $adminId = Auth::id(); + + $dataAdmin = Rekomendasi::where('user_id', $adminId)->get(); + + foreach ($dataAdmin as $item) { + Rekomendasi::updateOrCreate( + ['user_id' => $userId, 'makanan_id' => $item->makanan_id], + [ + 'nilai_akhir' => $item->nilai_akhir, + 'tanggal_rekomendasi' => now(), + ] + ); + } + + return redirect()->back()->with('success', 'Hasil rekomendasi berhasil dikirim ke user.'); +} + +public function hapusSemua() +{ + Rekomendasi::truncate(); // Menghapus semua data + return redirect()->back()->with('success', 'Semua data rekomendasi berhasil dihapus.'); +} + + +} diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 4f69711..a20e493 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -3,20 +3,73 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use App\Models\Rekomendasi; +use App\Models\Makanan; // pastikan model di-import +use App\Models\JenisMakanan; +use App\Models\Kategori; +use Illuminate\Support\Facades\Auth; // pastikan ini ada di atas class UserController extends Controller { // public function userdash(){ - return view('user.userdash'); + + $totalData = DB::table('makanans')->count(); // atau model: DataMakanan::count() + $totalKriteria = DB::table('kriterias')->count(); + $totalUser = DB::table('users')->count(); + return view('user.userdash', compact('totalData', 'totalKriteria', 'totalUser')); } - public function about(){ - return view('user.about'); + public function userabout(){ + return view('user.userabout'); } - public function service(){ - return view('user.service'); + + public function userfeature(){ + return view('user.userfeature'); } - public function feature(){ - return view('user.feature'); + + public function userdata(Request $request) +{ + $jenisMakananList = JenisMakanan::all(); + $kategoriList = Kategori::all(); + + $makanans = Makanan::query(); + + if ($request->has('jenis_id') && $request->jenis_id != '') { + $makanans->where('jenis_id', $request->jenis_id); } + + if ($request->has('kategori_id') && $request->kategori_id != '') { + $makanans->where('kategori_id', $request->kategori_id); + } + + $makanans = $makanans->get(); + + return view('user.userdata', compact('makanans', 'jenisMakananList', 'kategoriList')); +} + + + + +public function userresult() +{ + $rekomendasi = Rekomendasi::with('makanan') + ->where('nilai_akhir', '>', 0) + ->orderByDesc('nilai_akhir') + ->get(); + + // Hitung total nilai akhir + $totalNilaiAkhir = $rekomendasi->sum('nilai_akhir'); + + return view('user.userresult', compact('rekomendasi', 'totalNilaiAkhir')); +} + + +public function show($id) +{ + // ambil data berdasarkan $id atau bisa juga switch/case + return view('user.userfeature', compact('id')); +} + + } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index c34cdcf..9519d81 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -63,5 +63,6 @@ class Kernel extends HttpKernel 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'cekrole' => \App\Http\Middleware\CekRole::class, ]; } diff --git a/app/Http/Middleware/CekRole.php b/app/Http/Middleware/CekRole.php new file mode 100644 index 0000000..22a9fb3 --- /dev/null +++ b/app/Http/Middleware/CekRole.php @@ -0,0 +1,34 @@ +with('error', 'Silakan login dulu.'); + } + + $user = Auth::user(); + + // Ambil nama role dari relasi role + $userRoleName = $user->role->name ?? null; + + if (!in_array($userRoleName, $roles)) { + return abort(403, 'Kamu tidak punya akses ke halaman ini.'); + } + + return $next($request); +} +} diff --git a/app/Http/Requests/JenisMakananRequest.php b/app/Http/Requests/JenisMakananRequest.php new file mode 100644 index 0000000..fdb69a4 --- /dev/null +++ b/app/Http/Requests/JenisMakananRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + // + 'name' => 'required|string|max:100', + ]; + } +} diff --git a/app/Http/Requests/KriteriaRequest.php b/app/Http/Requests/KriteriaRequest.php index ef00650..59e7cc9 100644 --- a/app/Http/Requests/KriteriaRequest.php +++ b/app/Http/Requests/KriteriaRequest.php @@ -24,6 +24,7 @@ public function rules(): array return [ // 'nama' => 'required|string|max:255', + 'satuan' => 'required|string|max:50', ]; } } diff --git a/app/Http/Requests/MakananRequest.php b/app/Http/Requests/MakananRequest.php index 62674c2..57b5273 100644 --- a/app/Http/Requests/MakananRequest.php +++ b/app/Http/Requests/MakananRequest.php @@ -22,20 +22,21 @@ public function rules(): array return [ 'nama' => 'required|string|max:100', 'kategori_id' => 'required|exists:kategoris,id', // Ensures role_id exists in the 'roles' table - 'lemak_jenuh' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma + 'jenis_id' => 'required|exists:jenis_makanans,id', + 'lemak' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma 'natrium' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma - 'kolesterol' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma - 'kalori' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma + 'energi' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma + 'karbohidrat' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma ]; } public function messages() { return [ - 'lemak_jenuh.regex' => 'Lemak jenuh harus berupa angka atau desimal dengan koma (contoh: 1,5).', + 'lemak.regex' => 'Lemak jenuh harus berupa angka atau desimal dengan koma (contoh: 1,5).', 'natrium.regex' => 'Natrium harus berupa angka atau desimal dengan koma (contoh: 1,5).', - 'kolesterol.regex' => 'kolesterol harus berupa angka atau desimal dengan koma (contoh: 1,5).', - 'kalori.regex' => 'Kalori harus berupa angka atau desimal dengan koma (contoh: 1,5).', + 'energi.regex' => 'energi harus berupa angka atau desimal dengan koma (contoh: 1,5).', + 'karbohidrat.regex' => 'karbohidrat harus berupa angka atau desimal dengan koma (contoh: 1,5).', ]; } diff --git a/app/Http/Requests/UpdateJenisMakananRequest.php b/app/Http/Requests/UpdateJenisMakananRequest.php new file mode 100644 index 0000000..a7669de --- /dev/null +++ b/app/Http/Requests/UpdateJenisMakananRequest.php @@ -0,0 +1,29 @@ +|string> + */ + public function rules(): array + { + return [ + // + 'name' => 'required|string|max:100', + ]; + } +} diff --git a/app/Http/Requests/UpdateKriteriaRequest.php b/app/Http/Requests/UpdateKriteriaRequest.php index ec9f3fd..ef9176a 100644 --- a/app/Http/Requests/UpdateKriteriaRequest.php +++ b/app/Http/Requests/UpdateKriteriaRequest.php @@ -24,6 +24,7 @@ public function rules(): array return [ // 'nama' => 'required|string|max:255', + 'satuan' => 'required|string|max:50', ]; } } diff --git a/app/Http/Requests/UpdateMakananRequest.php b/app/Http/Requests/UpdateMakananRequest.php index 2371890..d404f21 100644 --- a/app/Http/Requests/UpdateMakananRequest.php +++ b/app/Http/Requests/UpdateMakananRequest.php @@ -22,20 +22,21 @@ public function rules(): array return [ 'nama' => 'required|string|max:100', 'kategori_id' => 'required|exists:kategoris,id', // Ensures role_id exists in the 'roles' table - 'lemak_jenuh' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma + 'jenis_id' => 'required|exists:jenis_makanans,id', + 'lemak' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma 'natrium' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma - 'kolesterol' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma - 'kalori' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma + 'energi' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma + 'karbohidrat' => 'required|regex:/^\d+(\,\d{1,2})?$/', // Mendukung desimal dengan koma ]; } public function messages() { return [ - 'lemak_jenuh.regex' => 'lemak jenuh harus berupa angka atau desimal dengan koma (contoh: 1,5).', - 'natrium.regex' => 'natrium harus berupa angka atau desimal dengan koma (contoh: 1,5).', - 'kolesterol.regex' => 'kolesterol harus berupa angka atau desimal dengan koma (contoh: 1,5).', - 'kalori.regex' => 'kalori harus berupa angka atau desimal dengan koma (contoh: 1,5).', + 'lemak.regex' => 'Lemak jenuh harus berupa angka atau desimal dengan koma (contoh: 1,5).', + 'natrium.regex' => 'Natrium harus berupa angka atau desimal dengan koma (contoh: 1,5).', + 'energi.regex' => 'energi harus berupa angka atau desimal dengan koma (contoh: 1,5).', + 'karbohidrat.regex' => 'karbohidrat harus berupa angka atau desimal dengan koma (contoh: 1,5).', ]; } diff --git a/app/Models/Alternatif.php b/app/Models/Alternatif.php index f483fe9..f6d14d3 100644 --- a/app/Models/Alternatif.php +++ b/app/Models/Alternatif.php @@ -8,6 +8,4 @@ class Alternatif extends Model { use HasFactory; - - protected $fillable = ['name', 'nilai']; // ganti dengan kolom yang sesuai dengan tabelmu } diff --git a/app/Models/BobotKriteria.php b/app/Models/BobotKriteria.php index 3ee318a..b7088f9 100644 --- a/app/Models/BobotKriteria.php +++ b/app/Models/BobotKriteria.php @@ -8,4 +8,11 @@ class BobotKriteria extends Model { use HasFactory; + public $timestamps = false; + protected $fillable = ['kriteria_id', 'bobot']; + + public function kriteria() + { + return $this->belongsTo(Kriteria::class); + } } diff --git a/app/Models/JenisMakanan.php b/app/Models/JenisMakanan.php new file mode 100644 index 0000000..5fe6668 --- /dev/null +++ b/app/Models/JenisMakanan.php @@ -0,0 +1,28 @@ +hasMany(Makanan::class, 'jenis_id'); + } +} diff --git a/app/Models/Kriteria.php b/app/Models/Kriteria.php index 057cfa5..632a089 100644 --- a/app/Models/Kriteria.php +++ b/app/Models/Kriteria.php @@ -8,6 +8,25 @@ class Kriteria extends Model { use HasFactory; + protected $fillable = ['nama', 'satuan']; - protected $fillable = ['nama']; + public function pairwise1() + { + return $this->hasMany(PerbandinganKriteria::class, 'kriteria_id_1'); + } + + public function pairwise2() + { + return $this->hasMany(PerbandinganKriteria::class, 'kriteria_id_2'); + } + + public function bobot() + { + return $this->hasOne(BobotKriteria::class); + } + + public function skorMakanan() + { + return $this->hasMany(SkorMakanan::class); + } } diff --git a/app/Models/Makanan.php b/app/Models/Makanan.php index 7742efe..ae25a2b 100644 --- a/app/Models/Makanan.php +++ b/app/Models/Makanan.php @@ -8,32 +8,39 @@ class Makanan extends Model { use HasFactory; - - // Menentukan nama tabel yang digunakan (jika nama tabel tidak mengikuti konvensi) protected $table = 'makanans'; - // Menentukan kolom yang dapat diisi massal protected $fillable = [ 'nama', - 'kategori_id', // Tambahkan kategori_id untuk relasi - 'lemak_jenuh', + 'kategori_id', + 'jenis_id', + 'lemak', 'natrium', - 'kolesterol', - 'kalori', + 'energi', + 'karbohidrat' ]; - // Menentukan kolom yang tidak boleh diisi massal (jika ada) protected $guarded = []; - // Jika kamu ingin menggunakan timestamp, pastikan sudah disetel di migration - public $timestamps = true; + public $timestamps = true; - /** - * Relasi ke model Kategori. - * Satu makanan memiliki satu kategori. - */ public function kategori() { return $this->belongsTo(Kategori::class, 'kategori_id'); } + + public function jenis() + { + return $this->belongsTo(JenisMakanan::class, 'jenis_id'); + } + + public function skor() + { + return $this->hasMany(SkorMakanan::class); + } + + public function rekomendasi() + { + return $this->hasMany(Rekomendasi::class); + } } diff --git a/app/Models/PerbandinganAlternatif.php b/app/Models/PerbandinganAlternatif.php new file mode 100644 index 0000000..d52f64f --- /dev/null +++ b/app/Models/PerbandinganAlternatif.php @@ -0,0 +1,18 @@ +belongsTo(Kriteria::class, 'kriteria_id_1'); + } + + public function kriteria2() + { + return $this->belongsTo(Kriteria::class, 'kriteria_id_2'); + } +} diff --git a/app/Models/Rekomendasi.php b/app/Models/Rekomendasi.php new file mode 100644 index 0000000..aa1d55b --- /dev/null +++ b/app/Models/Rekomendasi.php @@ -0,0 +1,23 @@ +belongsTo(User::class); + } + + public function makanan() + { + return $this->belongsTo(Makanan::class); + } +} diff --git a/app/Models/SkorMakanan.php b/app/Models/SkorMakanan.php new file mode 100644 index 0000000..3923713 --- /dev/null +++ b/app/Models/SkorMakanan.php @@ -0,0 +1,23 @@ +belongsTo(Makanan::class); + } + + public function kriteria() + { + return $this->belongsTo(Kriteria::class); + } +} diff --git a/database/migrations/2024_12_05_072732_create_bobot_kriterias_table.php b/database/migrations/2024_12_05_072732_create_bobot_kriterias_table.php deleted file mode 100644 index d8dcb2e..0000000 --- a/database/migrations/2024_12_05_072732_create_bobot_kriterias_table.php +++ /dev/null @@ -1,33 +0,0 @@ -id(); // id sebagai primary key - $table->unsignedBigInteger('criteria_id'); // Foreign key ke tabel kriterias - $table->float('bobot'); // Kolom bobot - $table->timestamps(); - - // Menambahkan foreign key constraint - $table->foreign('criteria_id')->references('id')->on('kriterias')->onDelete('cascade')->onUpdate('cascade'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('bobot_kriterias'); - } -}; diff --git a/database/migrations/2025_04_07_063541_create_alternatifs_table.php b/database/migrations/2025_04_07_063541_create_alternatifs_table.php deleted file mode 100644 index ae913ca..0000000 --- a/database/migrations/2025_04_07_063541_create_alternatifs_table.php +++ /dev/null @@ -1,29 +0,0 @@ -id(); // Kolom id BIGINT Primary Key - $table->string('nama', 100); // Kolom nama VARCHAR(100) - $table->text('deskripsi'); // Kolom deskripsi TEXT - $table->timestamps(); // Kolom created_at dan updated_at TIMESTAMP - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::dropIfExists('alternatifs'); - } -}; diff --git a/database/migrations/2025_04_14_210704_create_jenis_makanans_table.php b/database/migrations/2025_04_14_210704_create_jenis_makanans_table.php new file mode 100644 index 0000000..516d54e --- /dev/null +++ b/database/migrations/2025_04_14_210704_create_jenis_makanans_table.php @@ -0,0 +1,28 @@ +id(); + $table->string('name')->unique(); // Nama kategori, misalnya 'makanan berat', 'cemilan' + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jenis_makanans'); + } +}; diff --git a/database/migrations/2024_12_05_072244_create_kriterias_table.php b/database/migrations/2025_04_14_214752_create_kriterias_table.php similarity index 69% rename from database/migrations/2024_12_05_072244_create_kriterias_table.php rename to database/migrations/2025_04_14_214752_create_kriterias_table.php index 7e81e62..8b3e3c0 100644 --- a/database/migrations/2024_12_05_072244_create_kriterias_table.php +++ b/database/migrations/2025_04_14_214752_create_kriterias_table.php @@ -12,9 +12,10 @@ public function up(): void { Schema::create('kriterias', function (Blueprint $table) { - $table->id(); // Kolom id BIGINT Primary Key - $table->string('nama', 100); // Kolom nama VARCHAR(100) - $table->timestamps(); // Kolom created_at dan updated_at TIMESTAMP + $table->id(); + $table->string('nama', 100); + $table->string('satuan', 50); + $table->timestamps(); }); } diff --git a/database/migrations/2024_12_04_083510_create_makanans_table.php b/database/migrations/2025_04_14_215323_create_makanans_table.php similarity index 50% rename from database/migrations/2024_12_04_083510_create_makanans_table.php rename to database/migrations/2025_04_14_215323_create_makanans_table.php index abb18d1..0c3daf8 100644 --- a/database/migrations/2024_12_04_083510_create_makanans_table.php +++ b/database/migrations/2025_04_14_215323_create_makanans_table.php @@ -7,23 +7,24 @@ return new class extends Migration { /** - * Jalankan migrasi. + * Run the migrations. */ public function up(): void { - // Membuat tabel makanans dengan relasi ke kategori Schema::create('makanans', function (Blueprint $table) { - $table->id(); // id sebagai primary key - $table->string('nama', 100); // Kolom nama dengan panjang 100 - $table->unsignedBigInteger('kategori_id'); // Foreign key - $table->float('lemak_jenuh'); // Kolom kalori - $table->float('natrium'); // Kolom protein - $table->float('kolesterol'); // Kolom lemak - $table->float('kalori'); // Kolom karbohidrat + $table->id(); + $table->string('nama', 100); + $table->unsignedBigInteger('kategori_id'); + $table->unsignedBigInteger('jenis_id'); + $table->float('lemak'); + $table->float('natrium'); + $table->float('energi'); + $table->float('karbohidrat'); $table->timestamps(); - // Menambahkan foreign key constraint $table->foreign('kategori_id')->references('id')->on('kategoris')->onDelete('cascade'); + $table->foreign('jenis_id')->references('id')->on('jenis_makanans')->onDelete('cascade'); + }); } diff --git a/database/migrations/2025_04_14_215502_create_perbandingan_kriterias_table.php b/database/migrations/2025_04_14_215502_create_perbandingan_kriterias_table.php new file mode 100644 index 0000000..0c9b6dd --- /dev/null +++ b/database/migrations/2025_04_14_215502_create_perbandingan_kriterias_table.php @@ -0,0 +1,32 @@ +id(); + $table->unsignedBigInteger('kriteria_id_1'); + $table->unsignedBigInteger('kriteria_id_2'); + $table->float('nilai'); + + $table->foreign('kriteria_id_1')->references('id')->on('kriterias')->onDelete('cascade'); + $table->foreign('kriteria_id_2')->references('id')->on('kriterias')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('perbandingan_kriterias'); + } +}; diff --git a/database/migrations/2025_04_14_215658_create_bobot_kriterias_table.php b/database/migrations/2025_04_14_215658_create_bobot_kriterias_table.php new file mode 100644 index 0000000..3cf3bfd --- /dev/null +++ b/database/migrations/2025_04_14_215658_create_bobot_kriterias_table.php @@ -0,0 +1,30 @@ +id(); + $table->unsignedBigInteger('kriteria_id'); + $table->float('bobot'); + + $table->foreign('kriteria_id')->references('id')->on('kriterias')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('bobot_kriterias'); + } +}; diff --git a/database/migrations/2025_04_14_215759_create_skor_makanans_table.php b/database/migrations/2025_04_14_215759_create_skor_makanans_table.php new file mode 100644 index 0000000..a2f5e1d --- /dev/null +++ b/database/migrations/2025_04_14_215759_create_skor_makanans_table.php @@ -0,0 +1,32 @@ +id(); + $table->unsignedBigInteger('makanan_id'); + $table->unsignedBigInteger('kriteria_id'); + $table->float('nilai'); + + $table->foreign('makanan_id')->references('id')->on('makanans')->onDelete('cascade'); + $table->foreign('kriteria_id')->references('id')->on('kriterias')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('skor_makanans'); + } +}; diff --git a/database/migrations/2025_04_14_215856_create_rekomendasis_table.php b/database/migrations/2025_04_14_215856_create_rekomendasis_table.php new file mode 100644 index 0000000..c2f6a1e --- /dev/null +++ b/database/migrations/2025_04_14_215856_create_rekomendasis_table.php @@ -0,0 +1,33 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->unsignedBigInteger('makanan_id'); + $table->float('nilai_akhir'); + $table->date('tanggal_rekomendasi'); + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('makanan_id')->references('id')->on('makanans')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('rekomendasis'); + } +}; diff --git a/database/migrations/2025_04_30_055826_create_perbandingan_alternatifs_table.php b/database/migrations/2025_04_30_055826_create_perbandingan_alternatifs_table.php new file mode 100644 index 0000000..a1ad352 --- /dev/null +++ b/database/migrations/2025_04_30_055826_create_perbandingan_alternatifs_table.php @@ -0,0 +1,35 @@ +id(); + $table->unsignedBigInteger('kriteria_id'); + $table->unsignedBigInteger('alternatif_id_1'); + $table->unsignedBigInteger('alternatif_id_2'); + $table->float('nilai'); + $table->timestamps(); + + $table->foreign('kriteria_id')->references('id')->on('kriterias')->onDelete('cascade'); + $table->foreign('alternatif_id_1')->references('id')->on('makanans')->onDelete('cascade'); + $table->foreign('alternatif_id_2')->references('id')->on('makanans')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('perbandingan_alternatifs'); + } +}; diff --git a/public/assets/css/style.css b/public/assets/css/style.css index 69ff1c2..43dbe89 100644 --- a/public/assets/css/style.css +++ b/public/assets/css/style.css @@ -1230,4 +1230,58 @@ .footer .credits { text-align: center; font-size: 13px; color: #012970; -} \ No newline at end of file +} + + +/* Agar elemen header di-home tampil optimal */ +#home .col-lg-6 { + height: 100vh; /* Membuat kolom ini memenuhi layar */ + display: flex; + justify-content: center; + align-items: center; +} + +#home h1 { + font-size: 2.5rem; /* Ukuran font besar untuk header */ + text-align: center; + color: white; +} + +/* Agar gambar carousel menyesuaikan dengan layar */ +.owl-carousel-item img { + width: 100%; + height: 100%; /* Gambar menyesuaikan ukuran kontainer */ + object-fit: cover; /* Menjaga rasio gambar agar tidak terdistorsi */ +} + +#home { + height: 100vh; /* Menentukan tinggi 100% dari layar */ + background-size: cover; /* Memastikan gambar background menutupi layar */ + background-position: center center; /* Menjaga agar gambar tetap terpusat */ +} + +.header .row { + min-height: 100vh; /* Mengatur row agar setinggi layar */ + align-items: center; /* Menjaga agar konten di tengah */ +} + +.container-fluid.header { + padding: 0; /* Menghapus padding untuk membuat konten pas di layar */ +} + + +#features { + padding-top: 0; /* Menghilangkan padding top agar langsung pas ke atas */ +} + +#features .container { + padding-left: 0; /* Mengurangi margin padding kiri dan kanan */ + padding-right: 0; +} + +/* Responsive pada grid fitur */ +@media (max-width: 768px) { + #features .row-cols-2 { + grid-template-columns: 1fr; /* 1 kolom pada layar kecil */ + } +} diff --git a/resources/views/admin/admindash.blade.php b/resources/views/admin/admindash.blade.php index 42e54fe..f8b054e 100644 --- a/resources/views/admin/admindash.blade.php +++ b/resources/views/admin/admindash.blade.php @@ -17,197 +17,218 @@
- -
-
- -
- - -
- -
-
Sales | Today
- -
-
- -
-
-
145
- 12% increase - -
-
-
- -
-
- - -
-
- -
- - -
- -
-
Revenue | This Month
- -
-
- -
-
-
$3,264
- 8% increase - -
-
-
- -
-
- -
+ +
+
+
+
+
Users | Total
+ + + Selengkapnya + + +
-
+
+
+ +
+
+
{{ $userCount }} Users
+
+
+
+
+
-
- - -
+
+
+ +
+
+
{{ $makananCount }} Data
+
+
+
+
+
-
-
Users | This Year
-
-
- -
-
-
1244
- 12% decrease + -
+ +
+
+
+ 📌 Aturan Penilaian | AHP + +
+ +
+

Sebelum melakukan perbandingan, pahami skala penilaian berikut. Skala ini digunakan untuk menilai tingkat kepentingan antar kriteria maupun alternatif.

+ +
+
+
+ 1 +
+ Equal Importance
+ Kedua elemen sama pentingnya +
- -
-
- - {{-- -
-
- -
- - -
- -
-
Reports /Today
- - -
- - - - -
- +
+
+ 3 +
+ Moderate Importance
+ Salah satu elemen sedikit lebih penting +
+
-
--}} + +
+
+ 5 +
+ Strong Importance
+ Salah satu elemen lebih penting secara kuat +
+
+
+ +
+
+ 7 +
+ Very Strong Importance
+ Salah satu elemen sangat penting +
+
+
+ +
+
+ 9 +
+ Extreme Importance
+ Salah satu elemen mutlak lebih penting +
+
+
+ +
+
+ 2, 4, 6, 8 +
+ Intermediate Values
+ Nilai antara dua pertimbangan yang berdekatan +
+
+
+
+
+
+
+ +
+
+
+ 📋 Langkah-langkah Mengisi Data | Aplikasi + +
+ +
+

Berikut adalah langkah-langkah yang harus diikuti untuk mengisi data dalam aplikasi ini. Pastikan Anda mengikuti setiap langkah untuk mendapatkan hasil yang tepat.

+ +
+
+
+ 1 +
+ Masukkan Data Makanan
+ Pilih kategori makanan dan masukkan informasi seperti lemak, natrium, energi, dan karbohidrat. +
+
+
+ +
+
+ 2 +
+ Input Kriteria
+ Tentukan kriteria yang relevan untuk perbandingan antar makanan, seperti kandungan gizi dan kecocokan dengan kebutuhan diet. +
+
+
+ +
+
+ 3 +
+ Perbandingan Berpasangan
+ Bandingkan alternatif makanan menggunakan skala penilaian untuk menentukan prioritas berdasarkan kriteria. +
+
+
+ +
+
+ 4 +
+ Normalisasi Data
+ Lakukan normalisasi terhadap data yang telah dimasukkan untuk memastikan konsistensi perbandingan antar makanan. +
+
+
+ +
+
+ 5 +
+ Simpan dan Hasilkan Rekomendasi
+ Setelah data selesai diinput dan dinormalisasi, simpan perubahan dan hasilkan rekomendasi menu makanan berdasarkan analisis AHP. +
+
+
+ +
+
+ 6 +
+ Evaluasi dan Sesuaikan
+ Evaluasi rekomendasi yang diberikan dan sesuaikan jika diperlukan berdasarkan kebutuhan diet atau preferensi pengguna. +
+
+
+
+
+
+
+ -
+ {{--
@@ -278,7 +299,7 @@
-
+
--}}
@@ -286,102 +307,23 @@
-
-
- - -
- -
-
Recent Activity | Today
- -
- -
-
32 min
- -
- Quia quae rerum explicabo officiis beatae -
-
- -
-
56 min
- -
- Voluptatem blanditiis blanditiis eveniet -
-
- -
-
2 hrs
- -
- Voluptates corrupti molestias voluptatem -
-
- -
-
1 day
- -
- Tempore autem saepe occaecati voluptatem tempore -
-
- -
-
2 days
- -
- Est sit eum reiciendis exercitationem -
-
- -
-
4 weeks
- -
- Dicta dolorem harum nulla eius. Ut quidem quidem sit quas -
-
- -
- -
-
+ - {{-- +
-
- - -
-
-
Website Traffic | Today
- +
Rekomendasi Tertinggi
- + -
-
--}} +
+ + + - {{-- -
-
- - -
- -
-
News & Updates | Today
- -
-
- -

Nihil blanditiis at in nihil autem

-

Sit recusandae non aspernatur laboriosam. Quia enim eligendi sed ut harum...

-
- -
- -

Quidem autem et impedit

-

Illo nemo neque maiores vitae officiis cum eum turos elan dries werona nande...

-
- -
- -

Id quia et et ut maxime similique occaecati ut

-

Fugiat voluptas vero eaque accusantium eos. Consequuntur sed ipsam et totam...

-
- -
- -

Laborum corporis quo dara net para

-

Qui enim quia optio. Eligendi aut asperiores enim repellendusvel rerum cuder...

-
- -
- -

Et dolores corrupti quae illo quod dolor

-

Odit ut eveniet modi reiciendis. Atque cupiditate libero beatae dignissimos eius...

-
- -
- -
-
--}} diff --git a/resources/views/admin/alternatif/normalisasi.blade.php b/resources/views/admin/alternatif/normalisasi.blade.php new file mode 100644 index 0000000..77f1f8a --- /dev/null +++ b/resources/views/admin/alternatif/normalisasi.blade.php @@ -0,0 +1,93 @@ +@extends('layout.app') + +@section('content') + +
+

Normalisasi Alternatif

+ +
+ +
+
+
+ + @if(session('success')) +
+ {{ session('success') }} +
+ @endif + + @foreach ($kriterias as $kriteria) +
+
+
{{ $kriteria->nama }}
+ +
+ + + + + @foreach ($alternatifs as $alt) + + @endforeach + + + + + @php + $jumlahKolom = []; + foreach ($alternatifs as $colAlt) { + $jumlahKolom[$colAlt->id] = 0; + } + + // hitung jumlah kolom + foreach ($alternatifs as $rowAlt) { + foreach ($alternatifs as $colAlt) { + $jumlahKolom[$colAlt->id] += $matriks[$kriteria->id][$rowAlt->id][$colAlt->id]; + } + } + @endphp + + @foreach ($alternatifs as $rowAlt) + + + @php $jumlahBaris = 0; @endphp + @foreach ($alternatifs as $colAlt) + @php + $val = $matriks[$kriteria->id][$rowAlt->id][$colAlt->id]; + $normalized = $val / $jumlahKolom[$colAlt->id]; + $jumlahBaris += $normalized; + @endphp + + @endforeach + + + @endforeach + +
Alternatif{{ $alt->nama }}Jumlah
{{ $rowAlt->nama }}{{ number_format($normalized, 4) }}{{ number_format($jumlahBaris, 4) }}
+
+ +
+
+ @endforeach + + +
+ @csrf +
+ +
+
+ +
+
+
+ +@endsection diff --git a/resources/views/admin/alternatif/perbandingan.blade.php b/resources/views/admin/alternatif/perbandingan.blade.php new file mode 100644 index 0000000..74a2a15 --- /dev/null +++ b/resources/views/admin/alternatif/perbandingan.blade.php @@ -0,0 +1,80 @@ +@extends('layout.app') + +@section('content') + +
+

Perbandingan Alternatif

+ +
+ +
+
+
+ + @if(session('success')) +
{{ session('success') }}
+ @endif + +
+
+
Matriks Perbandingan Alternatif
+ +
+ @csrf + + @foreach ($kriterias as $kriteria) +
{{ $kriteria->nama }}
+
+ + + + + @foreach ($alternatifs as $alt) + + @endforeach + + + + @foreach ($alternatifs as $alt1) + + + @foreach ($alternatifs as $alt2) + + @endforeach + + @endforeach + +
Alternatif{{ $alt->nama }}
{{ $alt1->nama }} + @if ($alt1->id == $alt2->id) + 1 + @elseif ($alt1->id < $alt2->id) + + @else + - + @endif +
+
+ @endforeach + +
+ + +
+
+ +
+
+ +
+
+
+ +@endsection diff --git a/resources/views/admin/alternatif/pilih.blade.php b/resources/views/admin/alternatif/pilih.blade.php new file mode 100644 index 0000000..f87d07b --- /dev/null +++ b/resources/views/admin/alternatif/pilih.blade.php @@ -0,0 +1,137 @@ +@extends('layout.app') + +@section('content') + +
+

Perbandingan Alternatif

+ +
+ +
+
+
+ + @if(session('success')) +
{{ session('success') }}
+ @endif + +
+
+
Pemilihan Alternatif
+ +
+ @csrf +
+ @foreach ($makanans as $makanan) +
+
+ + +
+
+ @endforeach +
+
+ +
+
+ +
+ +
Data Semua Alternatif
+ +
+
+ {{-- Tabel --}} +
+ + + + + + + + + + + + + @foreach ($makanans as $index => $makanan) + + + + + + + + + @endforeach + +
NoNama MakananLemakNatriumEnergiKarbohidrat
{{ $index + 1 }}{{ $makanan->nama }}{{ $makanan->lemak }} g{{ $makanan->natrium }} mg{{ $makanan->energi }} kal{{ $makanan->karbohidrat }} g
+
+
+ +
+ {{-- Filter Kriteria --}} +
+
+
+ + +
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +@endsection + +@push('scripts') + +@endpush diff --git a/resources/views/admin/datauser/datauser.blade.php b/resources/views/admin/datauser/datauser.blade.php index 1d17308..3f920e6 100644 --- a/resources/views/admin/datauser/datauser.blade.php +++ b/resources/views/admin/datauser/datauser.blade.php @@ -42,7 +42,7 @@ {{ $usr->name }} {{ $usr->email }} {{ $usr->no_telp }} - {{ $usr->password }} + **** {{ $usr->role->name }} Edit diff --git a/resources/views/admin/alternatif/editalternatif.blade.php b/resources/views/admin/jenismakanan/editjenismakanan.blade.php similarity index 87% rename from resources/views/admin/alternatif/editalternatif.blade.php rename to resources/views/admin/jenismakanan/editjenismakanan.blade.php index e4ab825..69b3546 100644 --- a/resources/views/admin/alternatif/editalternatif.blade.php +++ b/resources/views/admin/jenismakanan/editjenismakanan.blade.php @@ -2,34 +2,32 @@ @section('content')
-

Edit Data User

+

Edit Data Jenis Makanan

-
Edit User
- +
Edit Jenis Makanan
-
id}") }}"> + id}") }}"> @method('PUT') @csrf -
- +
- Back + Back diff --git a/resources/views/admin/alternatif/alternatif.blade.php b/resources/views/admin/jenismakanan/jenismakanan.blade.php similarity index 71% rename from resources/views/admin/alternatif/alternatif.blade.php rename to resources/views/admin/jenismakanan/jenismakanan.blade.php index 4778e49..0d11231 100644 --- a/resources/views/admin/alternatif/alternatif.blade.php +++ b/resources/views/admin/jenismakanan/jenismakanan.blade.php @@ -2,11 +2,11 @@ @section('content')
-

Alternatif

+

Jenis Makanan

@@ -18,9 +18,9 @@
-
Alternatif
+
Jenis Makanan
@@ -29,18 +29,18 @@ No - Nama + Jenis Makanan Action - @foreach ($alternatifs as $alter) + @foreach ($jenis_makanans as $jm) {{ $loop->iteration }} - {{ $alter->name }} + {{ $jm->name }} - Edit - + Edit + @csrf @method('DELETE') diff --git a/resources/views/admin/alternatif/tambahalternatif.blade.php b/resources/views/admin/jenismakanan/tambahjenismakanan.blade.php similarity index 79% rename from resources/views/admin/alternatif/tambahalternatif.blade.php rename to resources/views/admin/jenismakanan/tambahjenismakanan.blade.php index b7b5e2b..ea348ee 100644 --- a/resources/views/admin/alternatif/tambahalternatif.blade.php +++ b/resources/views/admin/jenismakanan/tambahjenismakanan.blade.php @@ -2,12 +2,12 @@ @section('content')
-

Tambah Data User

+

Tambah Data Jenis Makanan

@@ -15,22 +15,23 @@
-
Tambah alternatif
+
Tambah Jenis Makanan
- + @csrf +
- +
-
- Back + Back
diff --git a/resources/views/admin/kategori/editkategori.blade.php b/resources/views/admin/kategori/editkategori.blade.php index 7e37399..94ffc83 100644 --- a/resources/views/admin/kategori/editkategori.blade.php +++ b/resources/views/admin/kategori/editkategori.blade.php @@ -30,7 +30,7 @@
Back - + diff --git a/resources/views/admin/kriteria/editkriteria.blade.php b/resources/views/admin/kriteria/editkriteria.blade.php index 7c7f3db..9955cff 100644 --- a/resources/views/admin/kriteria/editkriteria.blade.php +++ b/resources/views/admin/kriteria/editkriteria.blade.php @@ -27,6 +27,12 @@
+
+ +
+ +
+
Back diff --git a/resources/views/admin/kriteria/kriteria.blade.php b/resources/views/admin/kriteria/kriteria.blade.php index 67bd1e0..fedd39e 100644 --- a/resources/views/admin/kriteria/kriteria.blade.php +++ b/resources/views/admin/kriteria/kriteria.blade.php @@ -30,6 +30,7 @@ No Nama + Satuan Action @@ -38,6 +39,7 @@ {{ $loop->iteration }} {{ $krt->nama }} + {{ $krt->satuan }} Edit diff --git a/resources/views/admin/kriteria/tambahkriteria.blade.php b/resources/views/admin/kriteria/tambahkriteria.blade.php index a6f9aa8..b673ab4 100644 --- a/resources/views/admin/kriteria/tambahkriteria.blade.php +++ b/resources/views/admin/kriteria/tambahkriteria.blade.php @@ -28,6 +28,13 @@ aria-describedby="basic-addon1" name="nama">
+
+ +
+ +
+
diff --git a/resources/views/admin/makanan/editmakanan.blade.php b/resources/views/admin/makanan/editmakanan.blade.php index d4e1a29..62bcd93 100644 --- a/resources/views/admin/makanan/editmakanan.blade.php +++ b/resources/views/admin/makanan/editmakanan.blade.php @@ -6,8 +6,8 @@
@@ -36,35 +36,46 @@ @endforeach
+
+
+ +
+ +
-
- -
- -
-
-
- -
- -
-
- + +
+
+
+ +
+ +
+
+
+ +
+
- +
Back + {{-- --}}
diff --git a/resources/views/admin/makanan/makanan.blade.php b/resources/views/admin/makanan/makanan.blade.php index dd8adad..6402654 100644 --- a/resources/views/admin/makanan/makanan.blade.php +++ b/resources/views/admin/makanan/makanan.blade.php @@ -38,7 +38,7 @@
-
Satuan yang ada pada dalam satuan 100 gram
+
Komposisi gizi pangan dihitung per 100 gram, dengan Berat Dapat Dimakan (BDD) 100 %
@@ -49,10 +49,11 @@ No Name Kategori - Lemak Jenuh - Natrium - Kolesterol - Kalori + Jenis Makanan + Lemak (g) + Natrium (mg) + Energi (Kal) + Karbohidrat (g) Action @@ -62,10 +63,11 @@ {{ $loop->iteration }} {{ $mknn->nama }} {{ $mknn->kategori->kategori }} - {{ $mknn->lemak_jenuh }} + {{ $mknn->jenis->name }} + {{ $mknn->lemak }} {{ $mknn->natrium }} - {{ $mknn->kolesterol }} - {{ $mknn->kalori }} + {{ $mknn->energi }} + {{ $mknn->karbohidrat }} Edit diff --git a/resources/views/admin/makanan/tambahmakanan.blade.php b/resources/views/admin/makanan/tambahmakanan.blade.php index cf90de2..59c0a21 100644 --- a/resources/views/admin/makanan/tambahmakanan.blade.php +++ b/resources/views/admin/makanan/tambahmakanan.blade.php @@ -38,35 +38,46 @@ @endforeach
+
+
+ +
+ +
- +
- +
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
diff --git a/resources/views/admin/proses/normalisasi.blade.php b/resources/views/admin/proses/normalisasi.blade.php new file mode 100644 index 0000000..b2639fc --- /dev/null +++ b/resources/views/admin/proses/normalisasi.blade.php @@ -0,0 +1,88 @@ +@extends('layout.app') + +@section('content') + +
+

Normalisasi Matriks Perbandingan

+ +
+ +
+
+
+ + +
+
+
Normalisasi Matriks
+
+ + + + + @foreach ($kriterias as $k) + + @endforeach + + + + @foreach ($kriterias as $i => $baris) + + + @foreach ($kriterias as $j => $kolom) + + @endforeach + + @endforeach + +
Kriteria{{ $k->nama }}
{{ $baris->nama }} + {{ number_format($normalisasi[$i][$j], 4) }} +
+
+
+
+ + +
+
+
Bobot Kriteria
+
+ + + + + + + + + @foreach ($kriterias as $index => $kriteria) + + + + + @endforeach + +
KriteriaBobot
{{ $kriteria->nama }}{{ number_format($bobot[$index], 4) }}
+
+
+
+ + +
+ + @csrf + + +
+ +
+
+
+ +@endsection diff --git a/resources/views/admin/proses/perbandingan.blade.php b/resources/views/admin/proses/perbandingan.blade.php new file mode 100644 index 0000000..1797a32 --- /dev/null +++ b/resources/views/admin/proses/perbandingan.blade.php @@ -0,0 +1,131 @@ +@extends('layout.app') +@section('content') + +
+

Matriks Perbandingan

+ +
+ +
+
+
+ + +
+
+
Input Perbandingan Kriteria
+
+ @csrf +
+ + + + + @foreach ($kriterias as $k) + + @endforeach + + + + @foreach ($kriterias as $i => $k1) + + + @foreach ($kriterias as $j => $k2) + + @endforeach + + @endforeach + +
Kriteria{{ $k->nama }}
{{ $k1->nama }} + @if ($i == $j) + + @elseif ($i < $j) + + @else + + @endif +
+
+
+ +
+
+
+
+ + + @if(session('matriks')) +
+
+
Matriks Perbandingan Sementara
+
+ + + + + @foreach ($kriterias as $k) + + @endforeach + + + + @foreach ($kriterias as $baris) + + + @foreach ($kriterias as $kolom) + + @endforeach + + @endforeach + +
Kriteria{{ $k->nama }}
{{ $baris->nama }}{{ number_format(session('matriks')[$baris->id][$kolom->id], 4) }}
+
+ + +
+ +
+ + + + + +
+
+ @endif + +
+
+
+ +@endsection diff --git a/resources/views/admin/rekomendasi.blade.php b/resources/views/admin/rekomendasi.blade.php new file mode 100644 index 0000000..5211845 --- /dev/null +++ b/resources/views/admin/rekomendasi.blade.php @@ -0,0 +1,72 @@ +@extends('layout.app') + +@section('content') +
+
+

📊 Hasil Rekomendasi Makanan

+

Berikut adalah peringkat makanan berdasarkan hasil perhitungan AHP.

+
+ + @if(session('success')) + + @endif + +
+
+ +
+
+
Daftar Rekomendasi
+
+ +
+ + + + + + + + + + @forelse($rekomendasi as $index => $item) + + + + + + @empty + + + + @endforelse + +
🏅 Peringkat🍽️ Nama Makanan📈 Nilai Akhir
{{ $index + 1 }}{{ $item->makanan->nama }}{{ number_format($item->nilai_akhir, 4) }}
Tidak ada data rekomendasi.
+
+
+ +
+
+ @csrf + +
+
+ +
+
+ @csrf + @method('DELETE') + +
+
+ + +
+
+
+@endsection diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php deleted file mode 100644 index 2915580..0000000 --- a/resources/views/auth/register.blade.php +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - Pages Register - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- -
-
-
-
- - {{-- --}} - -
- -
- -
-
Create an Account
-

Enter your personal details to create account

-
- -
- @csrf -
- - -
Please, enter your name!
-
- -
- - -
Please enter a valid Email address!
-
- -
- -
- -
Please enter a valid phone number.
-
-
- -
- - -
Please enter your password!
-
- -
- - -
Please confirm your password!
-
- -
- -
- -
-

Already have an account? Log in

-
-
- -
-
-
-
-
- -
- -
-
- - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/resources/views/landingpage.blade.php b/resources/views/landingpage.blade.php new file mode 100644 index 0000000..d62c43e --- /dev/null +++ b/resources/views/landingpage.blade.php @@ -0,0 +1,141 @@ +@extends('layoutlp.app') +@section('content') + +{{--
+
+ Loading... +
+
--}} + +
+
+
+

HeartChoice

+
+
+
+

{{ $totalData }}

+

Data Yang Diperoleh

+
+
+
+
+

{{ $totalKriteria }}

+

Kriteria

+
+
+
+
+

{{ $totalUser }}

+

Total User

+
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + +
+
+
+

About Us

+

Mengapa Anda Harus Mempercayai Sistem Kami

+

HeartChoice ini merupakan sebuah Sistem Pendukung Keputusan untuk membantu penderita penyakit jantung dalam memilih menu makanan yang sesuai dengan kriteria kesehatan mereka. Dengan menggunakan metode AHP (Analytic Hierarchy Process), kami memberikan rekomendasi yang tepat berdasarkan berbagai kriteria gizi yang penting.

+

Aplikasi ini menggunakan pendekatan berbasis web yang mudah diakses oleh siapa saja, memberikan pemahaman yang jelas mengenai perbandingan kriteria seperti lemak, natrium, energi, dan karbohidrat dalam menu makanan. Dengan sistem ini, penderita penyakit jantung dapat membuat keputusan yang lebih sehat dan aman dalam memilih makanan mereka.

+

Mempermudah Pemilihan Makanan yang Sehat

+

Memanfaatkan Metode AHP untuk Keputusan yang Lebih Tepat

+

Aplikasi yang Mudah Digunakan dan Aksesible

+ Read More + + +
+
+
+
+ + + + + +
+
+
+

Fitur Unggulan

+

Kenali Fitur-fitur Utama Kami

+

+ Sistem ini dirancang khusus untuk membantu penderita penyakit jantung memilih menu makanan terbaik dengan pendekatan ilmiah dan teknologi yang mudah digunakan. +

+
+ + +
+ @php + $features = [ + ['id' => 'feature1', 'icon' => 'fas fa-heartbeat', 'label' => 'Rekomendasi Sehat'], + ['id' => 'feature2', 'icon' => 'fas fa-brain', 'label' => 'Pendekatan Ilmiah'], + ['id' => 'feature3', 'icon' => 'fas fa-desktop', 'label' => 'Tampilan Responsif'], + ['id' => 'feature4', 'icon' => 'fas fa-database', 'label' => 'Keamanan Data'], + ['id' => 'feature5', 'icon' => 'fas fa-hands-helping', 'label' => 'Dukungan Penuh'], + ]; + @endphp + @foreach ($features as $feature) + + @endforeach + +
+
+
+ + + + + +@endsection \ No newline at end of file diff --git a/resources/views/layout/app.blade.php b/resources/views/layout/app.blade.php index d31d619..1295a22 100644 --- a/resources/views/layout/app.blade.php +++ b/resources/views/layout/app.blade.php @@ -83,6 +83,11 @@ class="bi bi-arrow-up-short"> + {{-- --}} + + + @stack('scripts') + diff --git a/resources/views/layout/header.blade.php b/resources/views/layout/header.blade.php index e09e34b..e9e36eb 100644 --- a/resources/views/layout/header.blade.php +++ b/resources/views/layout/header.blade.php @@ -7,82 +7,63 @@
- -{{-- --}} - + + + + + + diff --git a/resources/views/layout/sidebar.blade.php b/resources/views/layout/sidebar.blade.php index 333eb88..8e37470 100644 --- a/resources/views/layout/sidebar.blade.php +++ b/resources/views/layout/sidebar.blade.php @@ -9,34 +9,6 @@ - {{-- --}} - - - {{-- --}} - +
  • + + + Jenis Makanan + +
  • @@ -77,36 +55,64 @@
  • - + + Kriteria + + + + + Alternatif + + + + + diff --git a/resources/views/layoutlp/app.blade.php b/resources/views/layoutlp/app.blade.php new file mode 100644 index 0000000..f75f345 --- /dev/null +++ b/resources/views/layoutlp/app.blade.php @@ -0,0 +1,119 @@ + + + + + + HeartChoice + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{--
    +
    + Loading... +
    +
    + --}} + + + {{-- +
    +
    +
    +
    + + 123 Street, New York, USA +
    +
    + + Mon - Fri : 09.00 AM - 09.00 PM +
    +
    +
    +
    + + +012 345 6789 +
    +
    + + + + +
    +
    +
    +
    + --}} + + + + + + + + + + + + + + @yield('content') + + + + + {{-- + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/views/layoutlp/footer.blade.php b/resources/views/layoutlp/footer.blade.php new file mode 100644 index 0000000..c5d081b --- /dev/null +++ b/resources/views/layoutlp/footer.blade.php @@ -0,0 +1,55 @@ +{{--
    +
    +
    +
    Address
    +

    123 Street, New York, USA

    +

    +012 345 67890

    +

    info@example.com

    +
    + + + + +
    +
    + + +
    +
    Newsletter
    +

    Dolor amet sit justo amet elitr clita ipsum elitr est.

    +
    + + +
    +
    +
    +
    +{{--
    + +
    --}} \ No newline at end of file diff --git a/resources/views/layoutlp/header.blade.php b/resources/views/layoutlp/header.blade.php new file mode 100644 index 0000000..c3bf711 --- /dev/null +++ b/resources/views/layoutlp/header.blade.php @@ -0,0 +1,27 @@ + +

    + Hospital Icon + HeartChoice +

    +
    + + + + diff --git a/resources/views/layoutuser/app.blade.php b/resources/views/layoutuser/app.blade.php index e46f026..f858e27 100644 --- a/resources/views/layoutuser/app.blade.php +++ b/resources/views/layoutuser/app.blade.php @@ -3,7 +3,7 @@ - Klinik - Clinic Website Template + HeartChoice @@ -34,16 +34,16 @@ - {{--
    +
    Loading...
    - --}} + - {{-- -
    + + {{--
    @@ -68,8 +68,8 @@
    -
    - --}} +
    --}} + @@ -90,9 +90,9 @@ - --}} @@ -114,6 +114,8 @@ + + \ No newline at end of file diff --git a/resources/views/layoutuser/footer.blade.php b/resources/views/layoutuser/footer.blade.php index c5d081b..09d1ccb 100644 --- a/resources/views/layoutuser/footer.blade.php +++ b/resources/views/layoutuser/footer.blade.php @@ -37,11 +37,11 @@
    -
    -{{--
    +
    --}} +
    -
    --}} \ No newline at end of file +
    \ No newline at end of file diff --git a/resources/views/layoutuser/header.blade.php b/resources/views/layoutuser/header.blade.php index 66e9399..87277bf 100644 --- a/resources/views/layoutuser/header.blade.php +++ b/resources/views/layoutuser/header.blade.php @@ -3,28 +3,62 @@ Hospital Icon HeartChoice - + + + + + + + + diff --git a/resources/views/login.blade.php b/resources/views/login.blade.php index 599890d..dbec7d4 100644 --- a/resources/views/login.blade.php +++ b/resources/views/login.blade.php @@ -2,134 +2,126 @@ - - + + Login - - - - {{-- - - --}} - - + + - - - - - - - - + + + + - - +
    -
    + -
    + - + + + + - - + - - - - - - - - - - + - \ No newline at end of file + diff --git a/resources/views/register.blade.php b/resources/views/register.blade.php new file mode 100644 index 0000000..74905ce --- /dev/null +++ b/resources/views/register.blade.php @@ -0,0 +1,189 @@ + + + + + + + + Register + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    +
    +
    + +
    + +
    + +
    +
    Create an Account
    +

    Enter your personal details to create an account

    +
    + +
    + @csrf +
    + + +
    Please, enter your name!
    +
    + +
    + + +
    Please enter a valid Email address!
    +
    + +
    + +
    + +
    Please enter a valid phone number.
    +
    +
    + +
    + + +
    Please enter your password!
    +
    + +
    + + +
    Please confirm your password!
    +
    + +
    + +
    + +
    +

    Already have an account? Log in

    +
    +
    + +
    +
    +
    +
    + +
    + +
    +
    + + + + + + + + + + + + + diff --git a/resources/views/user/about.blade.php b/resources/views/user/about.blade.php deleted file mode 100644 index 7f0a776..0000000 --- a/resources/views/user/about.blade.php +++ /dev/null @@ -1,171 +0,0 @@ -@extends('layoutuser.app') -@section('content') -
    -
    -
    -
    -
    - - -
    -
    -
    -

    About Us

    -

    Why You Should Trust Us? Get Know About Us!

    -

    Tempor erat elitr rebum at clita. Diam dolor diam ipsum sit. Aliqu diam amet diam et eos. Clita erat ipsum et lorem et sit, sed stet lorem sit clita duo justo magna dolore erat amet

    -

    Stet no et lorem dolor et diam, amet duo ut dolore vero eos. No stet est diam rebum amet diam ipsum. Clita clita labore, dolor duo nonumy clita sit at, sed sit sanctus dolor eos.

    -

    Quality health care

    -

    Only Qualified Doctors

    -

    Medical Research Professionals

    - Read More -
    -
    -
    -
    - - - - -
    -
    -
    -
    -
    -

    Features

    -

    Why Choose Us

    -

    Tempor erat elitr rebum at clita. Diam dolor diam ipsum sit. Aliqu diam amet diam et eos. Clita erat ipsum et lorem et sit, sed stet lorem sit clita duo justo erat amet

    -
    -
    -
    -
    - -
    -
    -

    Experience

    -
    Doctors
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Quality

    -
    Services
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Positive

    -
    Consultation
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    24 Hours

    -
    Support
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - - - -
    -
    -
    -

    Doctors

    -

    Our Experience Doctors

    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    -@endsection \ No newline at end of file diff --git a/resources/views/user/feature.blade.php b/resources/views/user/feature.blade.php deleted file mode 100644 index b6b6f05..0000000 --- a/resources/views/user/feature.blade.php +++ /dev/null @@ -1,69 +0,0 @@ -@extends('layoutuser.app') -@section('content') - -
    -
    -
    -
    -
    -

    Features

    -

    Why Choose Us

    -

    Tempor erat elitr rebum at clita. Diam dolor diam ipsum sit. Aliqu diam amet diam et eos. Clita erat ipsum et lorem et sit, sed stet lorem sit clita duo justo erat amet

    -
    -
    -
    -
    - -
    -
    -

    Experience

    -
    Doctors
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Quality

    -
    Services
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Positive

    -
    Consultation
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    24 Hours

    -
    Support
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - -@endsection \ No newline at end of file diff --git a/resources/views/user/service.blade.php b/resources/views/user/service.blade.php deleted file mode 100644 index db50b85..0000000 --- a/resources/views/user/service.blade.php +++ /dev/null @@ -1,189 +0,0 @@ -@extends('layoutuser.app') -@section('content') -
    -
    -
    -

    Services

    -

    Health Care Solutions

    -
    -
    -
    -
    -
    - -
    -

    Cardiology

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Pulmonary

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Neurology

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Orthopedics

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Dental Surgery

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Laboratory

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - - - - -
    -
    -
    -
    -

    Appointment

    -

    Make An Appointment To Visit Our Doctor

    -

    Tempor erat elitr rebum at clita. Diam dolor diam ipsum sit. Aliqu diam amet diam et eos. Clita erat ipsum et lorem et sit, sed stet lorem sit clita duo justo magna dolore erat amet

    -
    -
    - -
    -
    -

    Call Us Now

    -
    +012 345 6789
    -
    -
    -
    -
    - -
    -
    -

    Mail Us Now

    -
    info@example.com
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - - - - -
    -
    -
    -

    Testimonial

    -

    What Say Our Patients!

    -
    - -
    -
    -@endsection \ No newline at end of file diff --git a/resources/views/user/userabout.blade.php b/resources/views/user/userabout.blade.php new file mode 100644 index 0000000..f2c162d --- /dev/null +++ b/resources/views/user/userabout.blade.php @@ -0,0 +1,171 @@ +@extends('layoutuser.app') +@section('content') +
    +
    +
    +
    +
    + + +
    +
    +
    +

    About Us

    +

    Mengapa Anda Harus Mempercayai Sistem Kami

    +

    HeartChoice ini merupakan sebuah Sistem Pendukung Keputusan untuk membantu penderita penyakit jantung dalam memilih menu makanan yang sesuai dengan kriteria kesehatan mereka. Dengan menggunakan metode AHP (Analytic Hierarchy Process), kami memberikan rekomendasi yang tepat berdasarkan berbagai kriteria gizi yang penting.

    +

    Aplikasi ini menggunakan pendekatan berbasis web yang mudah diakses oleh siapa saja, memberikan pemahaman yang jelas mengenai perbandingan kriteria seperti lemak, natrium, energi, dan karbohidrat dalam menu makanan. Dengan sistem ini, penderita penyakit jantung dapat membuat keputusan yang lebih sehat dan aman dalam memilih makanan mereka.

    +

    Mempermudah Pemilihan Makanan yang Sehat

    +

    Memanfaatkan Metode AHP untuk Keputusan yang Lebih Tepat

    +

    Aplikasi yang Mudah Digunakan dan Aksesible

    + {{-- Read More --}} +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    +

    Tentang Sistem

    +

    Latar Belakang dan Tujuan

    +

    + Penyakit jantung merupakan salah satu penyebab kematian tertinggi di dunia. Salah satu faktor penting dalam pengelolaan penyakit ini adalah pengaturan pola makan yang tepat. Namun, banyak penderita kesulitan menentukan menu yang sesuai dengan kondisi kesehatannya. +

    + Sistem ini dikembangkan sebagai solusi untuk membantu penderita penyakit jantung dalam memilih menu makanan sehat berdasarkan kriteria medis seperti kadar lemak, natrium, energi, dan karbohidrat. Dengan menggunakan metode Analytic Hierarchy Process (AHP), sistem ini dapat memberikan rekomendasi yang akurat dan sesuai kebutuhan. +

    +
    +
    +
    +
    + +
    +
    +

    Metode AHP

    +
    Pengambilan Keputusan Terstruktur
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Normalisasi Data

    +
    Perbandingan yang Objektif
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Antarmuka Sederhana

    +
    Mudah Digunakan
    +
    +
    +
    +
    +
    +
    + +
    +
    +

    Perhitungan Otomatis

    +
    Rekomendasi Berdasarkan Data
    +
    +
    +
    +
    +
    +
    +
    +
    + Feature Image +
    +
    +
    +
    +
    + + + + +
    +
    +
    +
    +
    + + +
    +
    +
    +

    Tentang Metode

    +

    Mengapa Memilih Metode AHP?

    +

    + Dalam pengambilan keputusan multi-kriteria seperti pemilihan menu makanan bagi penderita penyakit jantung, metode Analytic Hierarchy Process (AHP) menjadi pilihan utama karena kemampuannya dalam mengolah data kualitatif dan kuantitatif secara terstruktur. + AHP memungkinkan proses perbandingan berpasangan antar kriteria seperti lemak, natrium, energi, dan karbohidrat untuk menghasilkan bobot prioritas yang akurat. +

    +

    + Dibandingkan dengan metode lain seperti Simple Additive Weighting (SAW) atau Weighted Product (WP), AHP lebih unggul karena memperhatikan konsistensi logika dalam pengambilan keputusan dan memberikan fleksibilitas dalam membandingkan tingkat kepentingan antar kriteria. +

    +

    Mampu menangani perbandingan kriteria secara logis dan bertingkat

    +

    Menghasilkan bobot yang akurat berdasarkan perbandingan berpasangan

    +

    Memastikan konsistensi dalam pengambilan keputusan

    + {{-- Read More --}} +
    +
    +
    +
    + + +
    +
    +
    +

    Kriteria

    +

    Kriteria Pemilihan Menu Makanan

    +

    Aplikasi ini menggunakan empat kriteria utama yang penting bagi penderita penyakit jantung untuk menentukan makanan yang aman dan sehat.

    +
    +
    +
    +
    + +
    Lemak
    +

    Kadar lemak yang tinggi dapat meningkatkan risiko komplikasi jantung, sehingga perlu dikontrol dengan cermat.

    +
    +
    +
    +
    + +
    Natrium
    +

    Asupan natrium yang berlebihan dapat memicu tekanan darah tinggi, salah satu faktor risiko utama penyakit jantung.

    +
    +
    +
    +
    + +
    Energi
    +

    Keseimbangan energi penting untuk menjaga berat badan ideal dan mencegah beban berlebih pada jantung.

    +
    +
    +
    +
    + +
    Karbohidrat
    +

    Pemilihan jenis dan jumlah karbohidrat yang tepat dapat membantu mengatur kadar gula darah dan energi.

    +
    +
    +
    +
    +
    + + +@endsection diff --git a/resources/views/user/userdash.blade.php b/resources/views/user/userdash.blade.php index 114d158..95dae8d 100644 --- a/resources/views/user/userdash.blade.php +++ b/resources/views/user/userdash.blade.php @@ -10,27 +10,27 @@
    -

    Sistem Pendukung Keputusan

    +

    HeartChoice

    -

    123

    +

    {{ $totalData }}

    Data Yang Diperoleh

    -

    4

    -

    Parameter

    +

    {{ $totalKriteria }}

    +

    Kriteria

    -

    9

    +

    {{ $totalUser }}

    Total User

    -
    +

    About Us

    -

    Why You Should Trust Us? Get Know About Us!

    -

    Tempor erat elitr rebum at clita. Diam dolor diam ipsum sit. Aliqu diam amet diam et eos. Clita erat ipsum et lorem et sit, sed stet lorem sit clita duo justo magna dolore erat amet

    -

    Stet no et lorem dolor et diam, amet duo ut dolore vero eos. No stet est diam rebum amet diam ipsum. Clita clita labore, dolor duo nonumy clita sit at, sed sit sanctus dolor eos.

    -

    Quality health care

    -

    Only Qualified Doctors

    -

    Medical Research Professionals

    - Read More +

    Mengapa Anda Harus Mempercayai Sistem Kami

    +

    HeartChoice ini merupakan sebuah Sistem Pendukung Keputusan untuk membantu penderita penyakit jantung dalam memilih menu makanan yang sesuai dengan kriteria kesehatan mereka. Dengan menggunakan metode AHP (Analytic Hierarchy Process), kami memberikan rekomendasi yang tepat berdasarkan berbagai kriteria gizi yang penting.

    +

    Aplikasi ini menggunakan pendekatan berbasis web yang mudah diakses oleh siapa saja, memberikan pemahaman yang jelas mengenai perbandingan kriteria seperti lemak, natrium, energi, dan karbohidrat dalam menu makanan. Dengan sistem ini, penderita penyakit jantung dapat membuat keputusan yang lebih sehat dan aman dalam memilih makanan mereka.

    +

    Mempermudah Pemilihan Makanan yang Sehat

    +

    Memanfaatkan Metode AHP untuk Keputusan yang Lebih Tepat

    +

    Aplikasi yang Mudah Digunakan dan Aksesible

    + Lihat Selengkapnya +
    @@ -82,258 +83,77 @@ - + + +
    +
    +
    +

    Fitur Unggulan

    +

    Kenali Fitur-fitur Utama Kami

    +

    + Sistem ini dirancang khusus untuk membantu penderita penyakit jantung memilih menu makanan terbaik dengan pendekatan ilmiah dan teknologi yang mudah digunakan. +

    +
    + + +
    + @php + $features = [ + ['id' => 'feature1', 'icon' => 'fas fa-heartbeat', 'label' => 'Rekomendasi Sehat'], + ['id' => 'feature2', 'icon' => 'fas fa-brain', 'label' => 'Pendekatan Ilmiah'], + ['id' => 'feature3', 'icon' => 'fas fa-desktop', 'label' => 'Tampilan Responsif'], + ['id' => 'feature4', 'icon' => 'fas fa-database', 'label' => 'Keamanan Data'], + ['id' => 'feature5', 'icon' => 'fas fa-hands-helping', 'label' => 'Dukungan Penuh'], + ]; + @endphp + @foreach ($features as $feature) + + @endforeach +
    +
    +
    + + + + + + +
    -
    -

    Services

    -

    Health Care Solutions

    -
    -
    -
    -
    -
    - -
    -

    Cardiology

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More +
    +
    +
    + +
    -
    -
    -
    - -
    -

    Pulmonary

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Neurology

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Orthopedics

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Dental Surgery

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    -
    -
    -
    -
    - -
    -

    Laboratory

    -

    Erat ipsum justo amet duo et elitr dolor, est duo duo eos lorem sed diam stet diam sed stet.

    - Read More -
    +
    +

    Menu Makanan

    +

    Eksplorasi pilihan menu makanan yang sehat dan bergizi, lengkap dengan informasi tentang kandungan gizi yang dapat membantu Anda membuat pilihan terbaik untuk diet dan kesehatan.

    + Lihat Selengkapnya
    - - - -
    -
    -
    -
    -
    -

    Features

    -

    Why Choose Us

    -

    Tempor erat elitr rebum at clita. Diam dolor diam ipsum sit. Aliqu diam amet diam et eos. Clita erat ipsum et lorem et sit, sed stet lorem sit clita duo justo erat amet

    -
    -
    -
    -
    - -
    -
    -

    Experience

    -
    Doctors
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Quality

    -
    Services
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    Positive

    -
    Consultation
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    24 Hours

    -
    Support
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - - - -
    -
    -
    -

    Doctors

    -

    Our Experience Doctors

    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    Doctor Name
    -

    Department

    - -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    -

    Testimonial

    -

    What Say Our Patients!

    -
    - -
    -
    @endsection \ No newline at end of file diff --git a/resources/views/user/userdata.blade.php b/resources/views/user/userdata.blade.php new file mode 100644 index 0000000..ff59898 --- /dev/null +++ b/resources/views/user/userdata.blade.php @@ -0,0 +1,88 @@ +@extends('layoutuser.app') +@section('content') + + +
    +
    + +
    +

    Data Aplikasi

    +

    Daftar Menu Makanan Sehat

    +

    + Informasi kandungan gizi makanan yang tersedia dalam sistem untuk membantu Anda memilih menu yang tepat bagi penderita penyakit jantung. +

    +
    + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + + + +
    + +
    +
    + + + + +
    + + + + + + + + + + + + + + @foreach ($makanans as $index => $makanan) + + + + + + + + + @endforeach + +
    #🍽️ Nama Makanan🥑 Lemak (g)🧂 Natrium (mg)🔥 Energi (kkal)🍞 Karbohidrat (g)
    {{ $index + 1 }}{{ $makanan->nama }}{{ number_format($makanan->lemak, 1) }}{{ number_format($makanan->natrium) }}{{ number_format($makanan->energi) }}{{ number_format($makanan->karbohidrat, 1) }}
    +
    + + + +@endsection diff --git a/resources/views/user/userfeature.blade.php b/resources/views/user/userfeature.blade.php new file mode 100644 index 0000000..d41386f --- /dev/null +++ b/resources/views/user/userfeature.blade.php @@ -0,0 +1,133 @@ +@extends('layoutuser.app') +@section('content') + + +
    +
    +
    +

    Fitur Unggulan

    +

    Kenali Fitur-fitur Utama Kami

    +

    + Sistem ini dirancang khusus untuk membantu penderita penyakit jantung memilih menu makanan terbaik dengan pendekatan ilmiah dan teknologi yang mudah digunakan. +

    + +
    + + +
    + @php + $features = [ + ['id' => 'feature1', 'icon' => 'fas fa-heartbeat', 'label' => 'Rekomendasi Sehat'], + ['id' => 'feature2', 'icon' => 'fas fa-brain', 'label' => 'Pendekatan Ilmiah'], + ['id' => 'feature3', 'icon' => 'fas fa-desktop', 'label' => 'Tampilan Responsif'], + ['id' => 'feature4', 'icon' => 'fas fa-database', 'label' => 'Keamanan Data'], + ['id' => 'feature5', 'icon' => 'fas fa-hands-helping', 'label' => 'Dukungan Penuh'], + ]; + @endphp + + @foreach ($features as $feature) +
    +
    + +
    {{ $feature['label'] }}
    +
    +
    + @endforeach +
    + + +
    +
    + + +
    +
    + +

    + Sistem ini memberikan rekomendasi makanan khusus untuk penderita penyakit jantung berdasarkan nutrisi seperti lemak, natrium, energi, dan karbohidrat. + Data makanan bersumber dari Panganku.org, sehingga akurat dan terpercaya. +

    +
    +
    + + +
    +
    + +

    + Metode AHP (Analytical Hierarchy Process) digunakan untuk menilai dan membandingkan makanan berdasarkan berbagai kriteria gizi. +

    +

    + AHP memecah masalah menjadi hierarki dan memungkinkan perbandingan berpasangan secara sistematis. Ini menghasilkan bobot dan peringkat akhir yang objektif. +

    +
      +
    • Memperhatikan konsistensi penilaian pengguna.
    • +
    • Cocok untuk keputusan berbasis preferensi manusia.
    • +
    • Dapat menangani data kuantitatif dan kualitatif.
    • +
    +

    + 🔗 Referensi lebih lanjut: +

    +

    +

    + Anda tidak perlu memahami rumusnya — sistem kami melakukan perhitungannya secara otomatis untuk membantu keputusan yang tepat dan sehat. +

    +
    +
    + + +
    +
    + +

    + Tampilan antarmuka dirancang sederhana dan responsif. Siapa pun dapat menggunakannya dengan mudah, termasuk pasien, keluarga, dan tenaga medis. +

    +
    +
    + + +
    +
    + +

    + Data hasil rekomendasi disimpan otomatis, sehingga bisa diakses kembali dan digunakan dalam diskusi dengan ahli gizi untuk evaluasi lanjutan. +

    +
    +
    + + +
    +
    + +

    + Fitur ini dikembangkan untuk mendampingi Anda menjalani gaya hidup lebih sehat. Kami percaya bahwa informasi yang baik menghasilkan keputusan yang baik pula. +

    +
    +
    + +
    +
    +
    +
    + + + + +@endsection diff --git a/resources/views/user/userresult.blade.php b/resources/views/user/userresult.blade.php new file mode 100644 index 0000000..10bf917 --- /dev/null +++ b/resources/views/user/userresult.blade.php @@ -0,0 +1,83 @@ +@extends('layoutuser.app') + +@section('content') +
    +
    +
    +

    Hasil Rekomendasi AHP

    +

    Rekomendasi Menu Makanan Terbaik untuk Anda

    +

    Berikut adalah hasil akhir dari perhitungan berdasarkan metode AHP. Nilai akhir menunjukkan tingkat kesesuaian berdasarkan kriteria yang telah di pilih.

    +
    + +
    + + + + + + + + + + + + @foreach ($rekomendasi->sortByDesc('nilai_akhir')->values() as $index => $rekom) + + + + + + + + @endforeach + +
    PeringkatNama MakananNilai AkhirPersentaseAksi
    + {{ $index + 1 }} + {{ $rekom->makanan->nama }}{{ number_format($rekom->nilai_akhir, 4) }} + @php + $persentase = ($totalNilaiAkhir > 0) ? ($rekom->nilai_akhir / $totalNilaiAkhir) * 100 : 0; + @endphp +
    +
    +
    +
    +
    + {{ number_format($persentase, 2) }}% +
    +
    + + Detail + +
    +
    +
    +
    + +@foreach ($rekomendasi as $index => $rekom) + + +@endforeach + +@endsection diff --git a/routes/web.php b/routes/web.php index 8e0cf7b..bd56aca 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,7 +5,12 @@ use App\Http\Controllers\AdminController; use App\Http\Controllers\UserController; use App\Http\Controllers\MakananController; -use App\Http\Controllers\Auth\RegisterController; +use App\Http\Controllers\PerbandinganKriteriaController; +use App\Http\Controllers\ProsesController; +use App\Http\Controllers\AlternatifController; +use App\Http\Controllers\LandingPageController; +use App\Http\Controllers\RegisterController; +use App\Http\Controllers\RekomendasiController; /* |-------------------------------------------------------------------------- @@ -24,77 +29,107 @@ -Route::get('/admindash',[AdminController::class,'admindash'])->name('admindash'); +Route::middleware(['cekrole:admin'])->group(function () { + + Route::get('/admindash', [AdminController::class, 'admindash'])->name('admindash'); + + Route::get('/datauser', [AdminController::class, 'datauser'])->name('datauser'); + Route::get('/edituser/{user}/edituser', [AdminController::class, 'edituser'])->name('edituser'); + Route::put('/datauser/{user}', [AdminController::class, 'updateuser'])->name('updateuser'); + Route::delete('/datauser/{user}', [AdminController::class, 'deleteuser'])->name('deleteuser'); + Route::get('/tambahuser', [AdminController::class, 'tambahuser'])->name('tambahuser'); + Route::post('/datauser/storeuser', [AdminController::class, 'storeuser'])->name('storeuser'); + + Route::get('/role', [AdminController::class, 'role'])->name('role'); + Route::get('/editrole/{role}/editrole', [AdminController::class, 'editrole'])->name('editrole'); + Route::put('/role/{role}', [AdminController::class, 'updaterole'])->name('updaterole'); + Route::delete('/role/{role}', [AdminController::class, 'deleterole'])->name('deleterole'); + Route::get('/tambahrole', [AdminController::class, 'tambahrole'])->name('tambahrole'); + Route::post('/role/storerole', [AdminController::class, 'storerole'])->name('storerole'); +}); + +// Routes untuk kategori, jenis makanan, dan makanan +Route::middleware(['cekrole:admin'])->group(function () { + Route::get('/kategori', [MakananController::class, 'kategori'])->name('kategori'); + Route::get('/editkategori/{kategori}/editkategori', [MakananController::class, 'editkategori'])->name('editkategori'); + Route::put('/kategori/{kategori}', [MakananController::class, 'updatekategori'])->name('updatekategori'); + Route::delete('/kategori/{kategori}', [MakananController::class, 'deletekategori'])->name('deletekategori'); + Route::get('/tambahkategori', [MakananController::class, 'tambahkategori'])->name('tambahkategori'); + Route::post('/kategori/storekategori', [MakananController::class, 'storekategori'])->name('storekategori'); + + Route::get('/jenismakanan', [MakananController::class, 'jenismakanan'])->name('jenismakanan'); + Route::get('/editjenismakanan/{jenis}/editjenismakanan', [MakananController::class, 'editjenismakanan'])->name('editjenismakanan'); + Route::put('/jenismakanan/{jenis}', [MakananController::class, 'updatejenismakanan'])->name('updatejenismakanan'); + Route::delete('/jenismakanan/{jenis}', [MakananController::class, 'deletejenismakanan'])->name('deletejenismakanan'); + Route::get('/tambahjenismakanan', [MakananController::class, 'tambahjenismakanan'])->name('tambahjenismakanan'); + Route::post('/jenismakanan/storejenismakanan', [MakananController::class, 'storejenismakanan'])->name('storejenismakanan'); + + Route::get('/makanan', [MakananController::class, 'makanan'])->name('makanan'); + Route::get('/editmakanan/{makanan}/editmakanan', [MakananController::class, 'editmakanan'])->name('editmakanan'); + Route::put('/makanan/{makanan}', [MakananController::class, 'updatemakanan'])->name('updatemakanan'); + Route::delete('/makanan/{makanan}', [MakananController::class, 'deletemakanan'])->name('deletemakanan'); + Route::get('/tambahmakanan', [MakananController::class, 'tambahmakanan'])->name('tambahmakanan'); + Route::post('/makanan/storemakanan', [MakananController::class, 'storemakanan'])->name('makanan.storemakanan'); +}); + +Route::middleware(['cekrole:admin'])->group(function () { + Route::get('/kriteria', [PerbandinganKriteriaController::class, 'kriteria'])->name('kriteria'); + Route::get('/editkriteria/{kriteria}/editkriteria', [PerbandinganKriteriaController::class, 'editkriteria'])->name('editkriteria'); + Route::put('/kriteria/{kriteria}', [PerbandinganKriteriaController::class, 'updatekriteria'])->name('updatekriteria'); + Route::delete('/kriteria/{kriteria}', [PerbandinganKriteriaController::class, 'deletekriteria'])->name('deletekriteria'); + Route::get('/tambahkriteria', [PerbandinganKriteriaController::class, 'tambahkriteria'])->name('tambahkriteria'); + Route::post('/kriteria/storekriteria', [PerbandinganKriteriaController::class, 'storekriteria'])->name('storekriteria'); +}); + +// Routes untuk proses +Route::middleware(['cekrole:admin'])->group(function () { + Route::get('/perbandingan', [ProsesController::class, 'showPerbandingan'])->name('perbandingan'); + Route::post('/perbandingan/proses', [ProsesController::class, 'prosesSementara'])->name('sementara'); + Route::post('/simpan-perbandingan', [ProsesController::class, 'simpanPerbandingan'])->name('simpan.perbandingan'); + Route::get('/perbandingan/normalisasi', [ProsesController::class, 'hasilNormalisasi'])->name('hasil.normalisasi'); + Route::get('perbandingan-alternatif', [ProsesController::class, 'perbandinganAlternatif'])->name('perbandingan.alternatif'); + + + // Alternatif + Route::get('/alternatif/pilih', [AlternatifController::class, 'formPilihAlternatif'])->name('alternatif.pilih'); + Route::post('/alternatif/pilih', [AlternatifController::class, 'pilihAlternatif'])->name('alternatif.pilih.simpan'); + Route::get('/alternatif/perbandingan', [AlternatifController::class, 'tampilPerbandingan'])->name('alternatif.perbandingan'); + Route::post('/alternatif/perbandingan', [AlternatifController::class, 'simpanPerbandingan'])->name('alternatif.simpan'); + Route::get('/alternatif/normalisasi', [AlternatifController::class, 'tampilNormalisasi'])->name('alternatif.normalisasi'); + Route::post('/alternatif/simpan-normalisasi', [AlternatifController::class, 'simpanNormalisasi'])->name('alternatif.simpanNormalisasi'); + Route::get('/rekomendasi/proses', [RekomendasiController::class, 'hitungDanSimpan'])->name('rekomendasi.proses'); + Route::get('/rekomendasi/hasil', [RekomendasiController::class, 'tampil'])->name('rekomendasi.hasil'); + Route::post('/rekomendasi/kirim/{user}', [RekomendasiController::class, 'kirimKeUser'])->name('rekomendasi.kirim'); + Route::delete('/rekomendasi/hapus', [RekomendasiController::class, 'hapusSemua'])->name('rekomendasi.hapusSemua'); -Route::get('/datauser', [AdminController::class, 'datauser'])->name('datauser'); -Route::get('/edituser/{user}/edituser', [AdminController::class, 'edituser'])->name('edituser'); -Route::put('/datauser/{user}', [AdminController::class, 'updateuser'])->name('updateuser'); -Route::delete('/datauser/{user}', [AdminController::class, 'deleteuser'])->name('deleteuser'); -Route::get('/tambahuser', [AdminController::class, 'tambahuser'])->name('tambahuser'); -Route::post('/datauser/storeuser', [AdminController::class, 'storeuser'])->name('storeuser'); +}); + +// User Routes (Hanya bisa diakses oleh User) +Route::middleware(['cekrole:user'])->group(function () { + Route::get('/userdash', [UserController::class, 'userdash'])->name('userdash'); + Route::get('/userabout', [UserController::class, 'userabout'])->name('userabout'); + Route::get('/userresult', [UserController::class, 'userresult'])->name('userresult'); + Route::get('/userfeature', [UserController::class, 'userfeature'])->name('userfeature'); + Route::get('/userdata', [UserController::class, 'userdata'])->name('userdata'); + Route::get('/userfeatures/{id}', [UserController::class, 'show'])->name('userfeatures.show'); + Route::get('/user/makanan', [UserController::class, 'userdata'])->name('user.makanan'); +}); -Route::get('/role',[AdminController::class,'role'])->name('role'); -Route::get('/editrole/{role}/editrole', [AdminController::class, 'editrole'])->name('editrole'); -Route::put('/role/{role}', [AdminController::class, 'updaterole'])->name('updaterole'); -Route::delete('/role/{role}', [AdminController::class, 'deleterole'])->name('deleterole'); -Route::get('/tambahrole', [AdminController::class, 'tambahrole'])->name('tambahrole'); -Route::post('/role/storerole', [AdminController::class, 'storerole'])->name('storerole'); +// Landing Page Routes +Route::get('/', [LandingPageController::class, 'lp'])->name('lp'); +// Auth Routes +Route::get('/login', [LoginController::class, 'login'])->name('login'); +Route::post('/login', [LoginController::class, 'loginPost'])->name('login.post'); +Route::post('/logout', [LoginController::class, 'logout'])->name('logout'); - -Route::get('/kategori', [MakananController::class, 'kategori'])->name('kategori'); -Route::get('/editkategori/{kategori}/editkategori', [MakananController::class, 'editkategori'])->name('editkategori'); -Route::put('/kategori/{kategori}', [MakananController::class, 'updatekategori'])->name('updatekategori'); -Route::delete('/kategori/{kategori}', [MakananController::class, 'deletekategori'])->name('deletekategori'); -Route::get('/tambahkategori', [MakananController::class, 'tambahkategori'])->name('tambahkategori'); -Route::post('/kategori/storekategori', [MakananController::class, 'storekategori'])->name('storekategori'); - - - - -Route::get('/makanan',[MakananController::class,'makanan'])->name('makanan'); -Route::get('/editmakanan/{makanan}/editmakanan', [MakananController::class, 'editmakanan'])->name('editmakanan'); -Route::put('/makanan/{makanan}', [MakananController::class, 'updatemakanan'])->name('updatemakanan'); -Route::delete('/makanan/{makanan}', [MakananController::class, 'deletemakanan'])->name('deletemakanan'); -Route::get('/tambahmakanan', [MakananController::class, 'tambahmakanan'])->name('tambahmakanan'); -Route::post('/makanan/storemakanan', [MakananController::class, 'storemakanan'])->name('makanan.storemakanan'); - - - - - -Route::get('/kriteria',[AdminController::class,'kriteria'])->name('kriteria'); -Route::get('/editkriteria/{kriteria}/editkriteria', [AdminController::class, 'editkriteria'])->name('editkriteria'); -Route::put('/kriteria/{kriteria}', [AdminController::class, 'updatekriteria'])->name('updatekriteria'); -Route::delete('/kriteria/{kriteria}', [AdminController::class, 'deletekriteria'])->name('deletekriteria'); -Route::get('/tambahkriteria', [AdminController::class, 'tambahkriteria'])->name('tambahkriteria'); -Route::post('/kriteria/storekriteria', [AdminController::class, 'storekriteria'])->name('storekriteria'); - - - -Route::get('/alternatif',[AdminController::class,'alternatif'])->name('alternatif'); -Route::get('/editalternatif/{alternatif}/editalternatif', [AdminController::class, 'editalternatif'])->name('editalternatif'); -Route::put('/alternatif/{alternatif}', [AdminController::class, 'updatealternatif'])->name('updatealternatif'); -Route::delete('/alternatif/{alternatif}', [AdminController::class, 'deletealternatif'])->name('deletealternatif'); -Route::get('/tambahalternatif', [AdminController::class, 'tambahalternatif'])->name('tambahalternatif'); -Route::post('/alternatif/storealternatif', [AdminController::class, 'storealternatif'])->name('storealternatif'); - - - -Route::get('/',[UserController::class,'userdash'])->name('userdash'); -Route::get('/about',[UserController::class,'about'])->name('about'); -Route::get('/service',[UserController::class,'service'])->name('service'); -Route::get('/feature',[UserController::class,'feature'])->name('feature'); - - -Route::get('/login',[LoginController::class,'login'])->name('login'); - -Route::get('/register', [RegisterController::class, 'showForm'])->name('register'); -Route::post('/register', [RegisterController::class, 'register'])->name('register.submit'); +// Register Routes +Route::get('/register', [ RegisterController::class, 'register'])->name('register'); +Route::post('/register', [RegisterController::class, 'registerPost'])->name('register.post');