From a46f042ea3bf8173043debbf402e3f9b189ca59a Mon Sep 17 00:00:00 2001 From: Alfiansyahp2 Date: Sat, 17 May 2025 23:46:29 +0700 Subject: [PATCH] propil wuser --- app/Http/Controllers/AdminController.php | 6 - app/Http/Controllers/ProfileController.php | 96 +++++++++ .../Controllers/RekomendasiController.php | 73 ++++--- app/Http/Controllers/UserController.php | 27 ++- app/Http/Requests/ProfileRequest.php | 37 ++++ app/Http/Requests/UpdateUserRequest.php | 3 +- resources/views/admin/admindash.blade.php | 4 +- resources/views/admin/profile.blade.php | 160 +++++++++++++++ .../views/admin/proses/perbandingan.blade.php | 79 ++++++++ resources/views/admin/rekomendasi.blade.php | 20 +- resources/views/layout/header.blade.php | 8 +- resources/views/layoutuser/header.blade.php | 6 + resources/views/user/profileuser.blade.php | 140 +++++++++++++ resources/views/user/userdata.blade.php | 27 ++- resources/views/user/userregister.blade.php | 189 ++++++++++++++++++ resources/views/user/userresult.blade.php | 18 ++ routes/web.php | 32 ++- 17 files changed, 874 insertions(+), 51 deletions(-) create mode 100644 app/Http/Controllers/ProfileController.php create mode 100644 app/Http/Requests/ProfileRequest.php create mode 100644 resources/views/admin/profile.blade.php create mode 100644 resources/views/user/profileuser.blade.php create mode 100644 resources/views/user/userregister.blade.php diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index f039034..ddaf43f 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -6,18 +6,12 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use App\Models\User; -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; use App\Http\Requests\RoleRequest; use App\Http\Requests\UpdateUserRequest; -use App\Http\Requests\UpdateKriteriaRequest; -use App\Http\Requests\UpdateAlternatifRequest; use App\Http\Requests\UpdateRoleRequest; use Illuminate\Support\Facades\DB; diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php new file mode 100644 index 0000000..06afc35 --- /dev/null +++ b/app/Http/Controllers/ProfileController.php @@ -0,0 +1,96 @@ +load('role'); + return view('admin.profile', compact('user')); + } + + // Update profil (nama, email, no_telp, password jika diisi) + public function update(UpdateUserRequest $request) + { + $data = $request->validated(); + + // Jika password tidak diisi, hapus dari array + if (empty($data['password'])) { + unset($data['password']); + } + + Auth::user()->update($data); + + return back()->with('success', 'Profil berhasil diperbarui tanpa hash password!'); + } + + // Ganti password secara langsung tanpa hash + public function password(Request $request) + { + $request->validate([ + 'current_password' => ['required'], + 'password' => ['required', 'min:6', 'confirmed'], + ]); + + // Verifikasi password lama (plain comparison, bukan hash) + if ($request->current_password !== Auth::user()->password) { + return back()->withErrors(['current_password' => 'Password lama salah.']); + } + + // Simpan password baru langsung tanpa hash + Auth::user()->update([ + 'password' => $request->password, + ]); + + return back()->with('success', 'Password berhasil diubah tanpa hash!'); + } + + + public function userprofile() + { + $user = Auth::user(); + return view('user.profileuser', compact('user')); + } + + // Update data profil (termasuk password tanpa hash) + public function userupdate(ProfileRequest $request) +{ + $data = $request->validated(); // sudah berisi role_id = 2 + // jika password kosong, hapus + if (empty($data['password'])) unset($data['password']); + + Auth::user()->update($data); + + return back()->with('success', 'Profile updated!'); +} + + + // Update password terpisah tanpa hash, dan validasi password lama juga tanpa hash + public function userpassword(Request $request) + { + $user = Auth::user(); + + $request->validate([ + 'current_password' => ['required'], + 'password' => ['required', 'string', 'min:6', 'confirmed'], + ]); + + // Cek password lama sesuai input tanpa hash + if ($request->current_password !== $user->password) { + return back()->withErrors(['current_password' => 'Current password is incorrect']); + } + + // Simpan password baru tanpa hash + $user->password = $request->password; + $user->save(); + + return redirect()->route('user.profile')->with('success', 'Password updated successfully.'); + } +} diff --git a/app/Http/Controllers/RekomendasiController.php b/app/Http/Controllers/RekomendasiController.php index 2f7c025..246a7dd 100644 --- a/app/Http/Controllers/RekomendasiController.php +++ b/app/Http/Controllers/RekomendasiController.php @@ -15,36 +15,42 @@ class RekomendasiController extends Controller { // public function hitungDanSimpan() - { - $alternatifs = Makanan::all(); - $kriterias = Kriteria::all(); - $bobotKriterias = BobotKriteria::pluck('bobot', 'kriteria_id'); +{ + $idAlternatif = session('alternatifs_dipilih'); - foreach ($alternatifs as $alternatif) { - $nilaiAkhir = 0; + if (!$idAlternatif || count($idAlternatif) < 2) { + return redirect()->route('alternatif.pilih')->with('error', 'Alternatif belum dipilih atau kurang dari dua.'); + } - foreach ($kriterias as $kriteria) { - $bobotKriteria = $bobotKriterias[$kriteria->id] ?? 0; - $bobotAlternatif = SkorMakanan::where('kriteria_id', $kriteria->id) - ->where('makanan_id', $alternatif->id) - ->value('nilai') ?? 0; + $alternatifs = Makanan::whereIn('id', $idAlternatif)->get(); + $kriterias = Kriteria::all(); + $bobotKriterias = BobotKriteria::pluck('bobot', 'kriteria_id'); - $nilaiAkhir += $bobotKriteria * $bobotAlternatif; - } + foreach ($alternatifs as $alternatif) { + $nilaiAkhir = 0; - // Simpan ke tabel rekomendasi - Rekomendasi::updateOrCreate( - ['makanan_id' => $alternatif->id, 'user_id' => Auth::id()], - [ - 'nilai_akhir' => $nilaiAkhir, - 'tanggal_rekomendasi' => Carbon::now()->toDateString() - ] - ); + foreach ($kriterias as $kriteria) { + $bobotKriteria = $bobotKriterias[$kriteria->id] ?? 0; + $bobotAlternatif = SkorMakanan::where('kriteria_id', $kriteria->id) + ->where('makanan_id', $alternatif->id) + ->value('nilai') ?? 0; + + $nilaiAkhir += $bobotKriteria * $bobotAlternatif; } - return redirect()->route('rekomendasi.hasil')->with('success', 'Rekomendasi berhasil dihitung dan disimpan.'); + Rekomendasi::updateOrCreate( + ['makanan_id' => $alternatif->id, 'user_id' => Auth::id()], + [ + 'nilai_akhir' => $nilaiAkhir, + 'tanggal_rekomendasi' => now()->toDateString() + ] + ); } + return redirect()->route('rekomendasi.hasil')->with('success', 'Rekomendasi berhasil dihitung dan disimpan.'); +} + + // 2. Tampilkan hasil rekomendasi public function tampil() { @@ -54,7 +60,13 @@ public function tampil() ->orderByDesc('nilai_akhir') ->get(); - return view('admin.rekomendasi', compact('rekomendasi')); + + $tanggalList = Rekomendasi::select('tanggal_rekomendasi') + ->distinct() + ->orderBy('tanggal_rekomendasi', 'desc') + ->pluck('tanggal_rekomendasi'); + + return view('admin.rekomendasi', compact('rekomendasi', 'tanggalList')); } @@ -78,11 +90,20 @@ public function kirimKeUser($userId) return redirect()->back()->with('success', 'Hasil rekomendasi berhasil dikirim ke user.'); } -public function hapusSemua() +public function hapusSemua(Request $request) { - Rekomendasi::truncate(); // Menghapus semua data - return redirect()->back()->with('success', 'Semua data rekomendasi berhasil dihapus.'); + $tanggal = $request->input('tanggal_rekomendasi'); + + if (!$tanggal) { + return redirect()->back()->with('error', 'Tanggal rekomendasi harus dipilih.'); + } + + // Hapus data berdasarkan tanggal_rekomendasi + Rekomendasi::where('tanggal_rekomendasi', $tanggal)->delete(); + + return redirect()->back()->with('success', 'Data rekomendasi untuk tanggal ' . $tanggal . ' berhasil dihapus.'); } + } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 74712b1..6e1e4f8 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -55,7 +55,7 @@ public function userdata(Request $request) // Menentukan jumlah data per halaman $perPage = $request->per_page === 'all' ? $makananQuery->count() // tampilkan semua jika 'all' - : ($request->per_page ?? 25); // default 25 + : ($request->per_page ?? 10); // default 25 // Ambil data dengan paginasi dan simpan parameter pencarian/filter $makanans = $makananQuery->paginate($perPage)->appends($request->except('page')); @@ -69,20 +69,32 @@ public function userdata(Request $request) -public function userresult() +public function userresult(Request $request) { + $tanggal = $request->input('tanggal'); + $rekomendasi = Rekomendasi::with('makanan') + ->when($tanggal, function ($query) use ($tanggal) { + $query->whereDate('tanggal_rekomendasi', $tanggal); + }) ->where('nilai_akhir', '>', 0) ->orderByDesc('nilai_akhir') ->get(); - // Hitung total nilai akhir $totalNilaiAkhir = $rekomendasi->sum('nilai_akhir'); - return view('user.userresult', compact('rekomendasi', 'totalNilaiAkhir')); + // Ambil daftar tanggal unik dari database + $listTanggal = Rekomendasi::select('tanggal_rekomendasi') + ->distinct() + ->orderBy('tanggal_rekomendasi', 'desc') + ->pluck('tanggal_rekomendasi'); + + return view('user.userresult', compact('rekomendasi', 'totalNilaiAkhir', 'tanggal', 'listTanggal')); } + + public function show($id) { // ambil data berdasarkan $id atau bisa juga switch/case @@ -90,4 +102,11 @@ public function show($id) } +public function register() +{ + // ambil data berdasarkan $id atau bisa juga switch/case + return view('user.userregister', compact('id')); +} + + } diff --git a/app/Http/Requests/ProfileRequest.php b/app/Http/Requests/ProfileRequest.php new file mode 100644 index 0000000..3b4a55a --- /dev/null +++ b/app/Http/Requests/ProfileRequest.php @@ -0,0 +1,37 @@ +merge([ + 'role_id' => 2, // 2 = role "user" + ]); + } + + /** Aturan validasi */ + public function rules(): array + { + return [ + 'name' => 'required|string|max:100', + 'email' => 'required|email|unique:users,email,' . Auth::id(), + 'no_telp' => 'required|string|max:20', + 'password' => 'nullable|string|min:6', + 'role_id' => 'in:2', // pastikan nilai akhirnya memang 2 + ]; + } +} diff --git a/app/Http/Requests/UpdateUserRequest.php b/app/Http/Requests/UpdateUserRequest.php index 1d64308..637312f 100644 --- a/app/Http/Requests/UpdateUserRequest.php +++ b/app/Http/Requests/UpdateUserRequest.php @@ -1,6 +1,7 @@ 'required|string|max:100', - 'email' => 'required|email|unique:users,email,' . $this->route('user')->id, // Ensure the user ID is passed correctly + 'email' => 'required|email|unique:users,email,' . Auth::id(), // Ensure the user ID is passed correctly 'no_telp' => 'required|string|max:20', 'password' => 'nullable|string|min:6', // Password is optional, only validated if present 'role_id' => 'required|exists:roles,id', // Ensures 'role_id' exists in the 'roles' table diff --git a/resources/views/admin/admindash.blade.php b/resources/views/admin/admindash.blade.php index f8b054e..da891aa 100644 --- a/resources/views/admin/admindash.blade.php +++ b/resources/views/admin/admindash.blade.php @@ -228,7 +228,7 @@ - {{--
+
@@ -299,7 +299,7 @@
-
--}} +
diff --git a/resources/views/admin/profile.blade.php b/resources/views/admin/profile.blade.php new file mode 100644 index 0000000..e6a9c41 --- /dev/null +++ b/resources/views/admin/profile.blade.php @@ -0,0 +1,160 @@ +@extends('layout.app') + +@section('content') +
+

Profile

+ +
+ +
+
+ +
+
+
+

{{ $user->name }}

+
{{ $user->role->name ?? '-' }}
+
+
+
+ + +
+
+
+ + +
+ + +
+
Profile Details
+ +
+
Name
+
{{ $user->name }}
+
+ +
+
Email
+
{{ $user->email }}
+
+ +
+
Phone
+
{{ $user->no_telp }}
+
+ + +
+
Role
+
{{ $user->role->name ?? '-' }}
+
+
+ + +
+
+ @csrf @method('PATCH') + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+
+
+ + +
+
+ @csrf @method('PUT') + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+
+
+ +
+
+
+
+
+
+@endsection diff --git a/resources/views/admin/proses/perbandingan.blade.php b/resources/views/admin/proses/perbandingan.blade.php index 1797a32..7cb90c6 100644 --- a/resources/views/admin/proses/perbandingan.blade.php +++ b/resources/views/admin/proses/perbandingan.blade.php @@ -11,10 +11,89 @@ +
+
+
+ 📌 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 +
+
+
+ +
+
+ 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 +
+
+
+
+
+
+
+
+ +
diff --git a/resources/views/admin/rekomendasi.blade.php b/resources/views/admin/rekomendasi.blade.php index 5211845..88cdf22 100644 --- a/resources/views/admin/rekomendasi.blade.php +++ b/resources/views/admin/rekomendasi.blade.php @@ -56,12 +56,20 @@
-
- @csrf - @method('DELETE') - -
-
+
+ @csrf + + + +
+
+ +
🔙 Kembali ke Pemilihan Alternatif diff --git a/resources/views/layout/header.blade.php b/resources/views/layout/header.blade.php index e9e36eb..0a5ced0 100644 --- a/resources/views/layout/header.blade.php +++ b/resources/views/layout/header.blade.php @@ -25,12 +25,18 @@
  • +
  • + + My Profile + +
  • +
  • @csrf diff --git a/resources/views/layoutuser/header.blade.php b/resources/views/layoutuser/header.blade.php index 87277bf..791df00 100644 --- a/resources/views/layoutuser/header.blade.php +++ b/resources/views/layoutuser/header.blade.php @@ -20,6 +20,7 @@ +
  • +{{--
    +
    + +
    + + +
    +
    + +
    + +
    +
    --}} +
    @@ -86,8 +109,8 @@ +
    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/userresult.blade.php b/resources/views/user/userresult.blade.php index 10bf917..aa3f97c 100644 --- a/resources/views/user/userresult.blade.php +++ b/resources/views/user/userresult.blade.php @@ -7,6 +7,24 @@

    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.

    + +
    +
    + +
    +
    + Reset +
    +
    + +
    diff --git a/routes/web.php b/routes/web.php index bd56aca..1294a9a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -11,6 +11,7 @@ use App\Http\Controllers\LandingPageController; use App\Http\Controllers\RegisterController; use App\Http\Controllers\RekomendasiController; +use App\Http\Controllers\ProfileController; /* |-------------------------------------------------------------------------- @@ -28,11 +29,17 @@ // }); - +// User Routes (Hanya bisa diakses oleh Admin) Route::middleware(['cekrole:admin'])->group(function () { Route::get('/admindash', [AdminController::class, 'admindash'])->name('admindash'); + + Route::get('/admin/profile', [ProfileController::class, 'adminprofile'])->name('admin.profile'); + Route::patch('/admin/profile', [ProfileController::class, 'update'])->name('profile.update'); + Route::patch('/admin/password', [ProfileController::class, 'password'])->name('profile.password'); + + // Routes untuk user 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'); @@ -40,6 +47,8 @@ Route::get('/tambahuser', [AdminController::class, 'tambahuser'])->name('tambahuser'); Route::post('/datauser/storeuser', [AdminController::class, 'storeuser'])->name('storeuser'); + + // Routes untuk role 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'); @@ -50,6 +59,8 @@ // Routes untuk kategori, jenis makanan, dan makanan Route::middleware(['cekrole:admin'])->group(function () { + + // Routes untuk kategori 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'); @@ -57,6 +68,8 @@ Route::get('/tambahkategori', [MakananController::class, 'tambahkategori'])->name('tambahkategori'); Route::post('/kategori/storekategori', [MakananController::class, 'storekategori'])->name('storekategori'); + + // Routes untuk jenis makanan 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'); @@ -64,6 +77,8 @@ Route::get('/tambahjenismakanan', [MakananController::class, 'tambahjenismakanan'])->name('tambahjenismakanan'); Route::post('/jenismakanan/storejenismakanan', [MakananController::class, 'storejenismakanan'])->name('storejenismakanan'); + + // Routes untuk makanan 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'); @@ -72,6 +87,7 @@ Route::post('/makanan/storemakanan', [MakananController::class, 'storemakanan'])->name('makanan.storemakanan'); }); +// Routes untuk kriteria Route::middleware(['cekrole:admin'])->group(function () { Route::get('/kriteria', [PerbandinganKriteriaController::class, 'kriteria'])->name('kriteria'); Route::get('/editkriteria/{kriteria}/editkriteria', [PerbandinganKriteriaController::class, 'editkriteria'])->name('editkriteria'); @@ -83,6 +99,8 @@ // Routes untuk proses Route::middleware(['cekrole:admin'])->group(function () { + + // Routes untuk perbandingan 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'); @@ -98,8 +116,7 @@ Route::get('/alternatif/normalisasi', [AlternatifController::class, 'tampilNormalisasi'])->name('alternatif.normalisasi'); Route::post('/alternatif/simpan-normalisasi', [AlternatifController::class, 'simpanNormalisasi'])->name('alternatif.simpanNormalisasi'); - - + // Routes untuk rekomendasi 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'); @@ -108,6 +125,10 @@ }); + + + + // User Routes (Hanya bisa diakses oleh User) Route::middleware(['cekrole:user'])->group(function () { Route::get('/userdash', [UserController::class, 'userdash'])->name('userdash'); @@ -117,8 +138,13 @@ 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('/userregister', [UserController::class, 'userregister'])->name('userregister'); + + Route::get('/user/profile', [ProfileController::class, 'userprofile'])->name('user.profile'); + Route::patch('/user/profile', [ProfileController::class, 'userupdate'])->name('user.update'); + Route::patch('/user/password', [ProfileController::class, 'userpassword'])->name('user.password'); }); // Landing Page Routes