Tambah User
+User baru akan menjadi user biasa secara default. Pilih role admin jika perlu.
+ + @if ($errors->any()) +diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php
new file mode 100644
index 0000000..5e7bbf0
--- /dev/null
+++ b/app/Http/Controllers/Admin/UserController.php
@@ -0,0 +1,49 @@
+ User::orderBy('name')->get(),
+ ]);
+ }
+
+ public function create(): View
+ {
+ return view('admin.users.create');
+ }
+
+ public function store(Request $request): RedirectResponse
+ {
+ $validated = $request->validate([
+ 'name' => ['required', 'string', 'max:255'],
+ 'username' => ['required', 'string', 'max:255', 'alpha_dash', Rule::unique('users', 'username')],
+ 'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')],
+ 'password' => ['required', 'string', 'min:8', 'confirmed'],
+ 'role' => ['nullable', Rule::in(['user', 'admin'])],
+ ]);
+
+ User::create([
+ 'name' => $validated['name'],
+ 'username' => $validated['username'],
+ 'email' => $validated['email'],
+ 'password' => Hash::make($validated['password']),
+ 'role' => $validated['role'] ?? 'user',
+ ]);
+
+ return redirect()
+ ->route('admin.users.index')
+ ->with('status', 'User baru berjaya ditambah.');
+ }
+}
diff --git a/app/Http/Controllers/PasswordResetController.php b/app/Http/Controllers/PasswordResetController.php
new file mode 100644
index 0000000..754c431
--- /dev/null
+++ b/app/Http/Controllers/PasswordResetController.php
@@ -0,0 +1,95 @@
+validate([
+ 'email' => ['required', 'email'],
+ ]);
+
+ $user = User::where('email', $validated['email'])->first();
+
+ if ($user) {
+ $token = Str::random(64);
+
+ DB::table('password_reset_tokens')->updateOrInsert([
+ 'email' => $user->email,
+ ], [
+ 'token' => Hash::make($token),
+ 'created_at' => now(),
+ ]);
+
+ $url = route('password.reset', [
+ 'token' => $token,
+ 'email' => $user->email,
+ ]);
+
+ Mail::raw("Klik pautan ini untuk reset kata laluan:\n\n{$url}\n\nPautan sah selama 60 minit.", function ($message) use ($user): void {
+ $message->to($user->email)
+ ->subject('Reset Kata Laluan RateMas');
+ });
+ }
+
+ return back()->with('status', 'Jika emel wujud, pautan reset kata laluan telah dihantar.');
+ }
+
+ public function edit(Request $request, string $token): View
+ {
+ return view('auth.reset-password', [
+ 'token' => $token,
+ 'email' => $request->query('email'),
+ ]);
+ }
+
+ public function update(Request $request): RedirectResponse
+ {
+ $validated = $request->validate([
+ 'token' => ['required', 'string'],
+ 'email' => ['required', 'email'],
+ 'password' => ['required', 'string', 'min:8', 'confirmed'],
+ ]);
+
+ $record = DB::table('password_reset_tokens')
+ ->where('email', $validated['email'])
+ ->first();
+
+ if (! $record || ! Hash::check($validated['token'], $record->token) || Carbon::parse($record->created_at)->lt(now()->subMinutes(60))) {
+ return back()
+ ->withErrors(['email' => 'Token reset tidak sah atau telah tamat tempoh.'])
+ ->withInput($request->only('email'));
+ }
+
+ $user = User::where('email', $validated['email'])->first();
+ if (! $user) {
+ return back()
+ ->withErrors(['email' => 'Emel tidak dijumpai.'])
+ ->withInput($request->only('email'));
+ }
+
+ $user->forceFill([
+ 'password' => Hash::make($validated['password']),
+ ])->save();
+
+ DB::table('password_reset_tokens')->where('email', $validated['email'])->delete();
+
+ return redirect()->route('login')->with('status', 'Password berjaya ditukar. Sila login semula.');
+ }
+}
diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php
new file mode 100644
index 0000000..18906ea
--- /dev/null
+++ b/app/Http/Controllers/ProfileController.php
@@ -0,0 +1,48 @@
+ $request->user(),
+ ]);
+ }
+
+ public function updateEmail(Request $request): RedirectResponse
+ {
+ $user = $request->user();
+
+ $validated = $request->validate([
+ 'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')->ignore($user->id)],
+ ]);
+
+ $user->forceFill([
+ 'email' => $validated['email'],
+ ])->save();
+
+ return back()->with('status', 'Emel berjaya dikemaskini.');
+ }
+
+ public function updatePassword(Request $request): RedirectResponse
+ {
+ $validated = $request->validate([
+ 'current_password' => ['required', 'current_password'],
+ 'password' => ['required', 'string', 'min:8', 'confirmed'],
+ ]);
+
+ $request->user()->forceFill([
+ 'password' => Hash::make($validated['password']),
+ ])->save();
+
+ return back()->with('status', 'Password berjaya dikemaskini.');
+ }
+}
diff --git a/resources/views/admin/users/create.blade.php b/resources/views/admin/users/create.blade.php
new file mode 100644
index 0000000..969592e
--- /dev/null
+++ b/resources/views/admin/users/create.blade.php
@@ -0,0 +1,42 @@
+@extends('layouts.app')
+
+@section('content')
+ User baru akan menjadi user biasa secara default. Pilih role admin jika perlu. Senarai akaun pengguna sistem. Masukkan emel akaun untuk menerima pautan reset kata laluan. Masukkan password baru untuk akaun anda.Tambah User
+ Users
+
+
+
+
+
+
+
+ @foreach ($users as $user)
+ Nama
+ Username
+ Emel
+ Role
+
+
+ @endforeach
+
+ {{ $user->name }}
+ {{ $user->username }}
+ {{ $user->email }}
+ {{ $user->role }}
+ Lupa Kata Laluan
+ LOGIN
+ @if (session('status'))
+ Reset Kata Laluan
+