From 25bb3d961e3875e12238f6cf1cb0c90663aa0c27 Mon Sep 17 00:00:00 2001 From: antv Date: Thu, 9 Jul 2026 09:05:57 +0700 Subject: [PATCH] feature: update avatar --- app/Http/Controllers/User/UserController.php | 33 +++++--- app/Models/User.php | 22 ++++++ resources/views/components/sidebar.blade.php | 2 +- .../views/components/user-form.blade.php | 1 + resources/views/user/edit.blade.php | 78 +++++++++++++++++++ routes/web.php | 3 + 6 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 resources/views/user/edit.blade.php diff --git a/app/Http/Controllers/User/UserController.php b/app/Http/Controllers/User/UserController.php index 052d7c9..984d991 100644 --- a/app/Http/Controllers/User/UserController.php +++ b/app/Http/Controllers/User/UserController.php @@ -71,20 +71,35 @@ class UserController extends Controller return view('user.change_password'); } - public function updatePassword(Request $request) + // Show edit profile page (avatar & password) + public function editProfile() + { + return view('user.edit'); + } + + // Handle avatar upload and optional password change + public function updateProfile(Request $request) { $request->validate([ - 'password' => 'required|min:6|confirmed', - ], [ - 'password.required' => 'Mật khẩu mới không được để trống.', - 'password.min' => 'Mật khẩu mới phải có ít nhất 6 ký tự.', - 'password.confirmed' => 'Mật khẩu xác nhận không trùng khớp.', + 'avatar' => 'nullable|image|max:2048', // 2MB max + 'new_password' => 'nullable|min:6|confirmed', ]); $user = Auth::user(); - $this->userService->updatePassword($user, $request->password); - $route = $user->role == config('constants.ROLE_ADMIN') ? 'admin.dashboard' : 'user.dashboard'; - return redirect()->route($route)->with('success', __('messages.password_change_success')); + // Avatar handling + if ($request->hasFile('avatar')) { + $path = $request->file('avatar')->store('avatars', 'public'); + $user->avatar = 'storage/' . $path; + } + + // Password handling (optional) + if ($request->filled('new_password')) { + $this->userService->updatePassword($user, $request->new_password); + } + + $user->save(); + + return redirect()->route('user.edit')->with('success', 'Cập nhật hồ sơ thành công'); } } diff --git a/app/Models/User.php b/app/Models/User.php index 119acea..1d1728d 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -67,4 +67,26 @@ class User extends Authenticatable { return $this->hasMany(AddCard::class, 'buyer', 'msnv'); } + + /** + * Get the user's avatar URL. + * If the user doesn't have an avatar, returns the default avatar. + * + * @param string|null $value + * @return string + */ + public function getAvatarAttribute($value) + { + if (!$value) { + return asset('images/avatar.png'); + } + + // Return direct URL if it's already an absolute URL (for backward compatibility) + if (filter_var($value, FILTER_VALIDATE_URL)) { + return $value; + } + + return asset($value); + } } + diff --git a/resources/views/components/sidebar.blade.php b/resources/views/components/sidebar.blade.php index 3571483..bc73a70 100644 --- a/resources/views/components/sidebar.blade.php +++ b/resources/views/components/sidebar.blade.php @@ -38,7 +38,7 @@ @endif - + Cài đặt diff --git a/resources/views/components/user-form.blade.php b/resources/views/components/user-form.blade.php index 217521d..64b99b0 100644 --- a/resources/views/components/user-form.blade.php +++ b/resources/views/components/user-form.blade.php @@ -10,6 +10,7 @@ 'create' => route('admin.users.store'), 'edit' => route('admin.users.update', $user?->msnv), 'delete' => route('admin.users.destroy', $user?->msnv), + 'self' => route('user.update_profile'), default => null, }; diff --git a/resources/views/user/edit.blade.php b/resources/views/user/edit.blade.php new file mode 100644 index 0000000..2f02fa5 --- /dev/null +++ b/resources/views/user/edit.blade.php @@ -0,0 +1,78 @@ +@extends('layouts.app') + +@section('title', 'Cài đặt tài khoản') + +@section('content') +
+

Cài đặt tài khoản

+ + @if(session('success')) +
{{ session('success') }}
+ @endif + +
+ @csrf + +
+
+ Avatar +
+
+ + +
+
+ + +
+
+ +
+ + + +
+ @error('new_password') + {{ $message }} + @enderror +
+ +
+ +
+ + + +
+ @error('new_password_confirmation') + {{ $message }} + @enderror +
+
+ +
+ Hủy bỏ + +
+
+
+ + +@endsection diff --git a/routes/web.php b/routes/web.php index 87925da..6b1be88 100644 --- a/routes/web.php +++ b/routes/web.php @@ -55,4 +55,7 @@ Route::middleware('auth')->group(function () { Route::get('/change-password', [UserController::class, 'changePasswordForm'])->name('user.change_password'); Route::post('/change-password', [UserController::class, 'updatePassword'])->name('user.update_password'); + // Edit personal profile (avatar & password) + Route::get('/profile/edit', [UserController::class, 'editProfile'])->name('user.edit'); + Route::post('/profile/edit', [UserController::class, 'updateProfile'])->name('user.update_profile'); });