From 65b37f49bf36eb5cfa2c12b234f8d61649e154e3 Mon Sep 17 00:00:00 2001 From: dinhtuandev Date: Mon, 25 Aug 2025 19:45:08 +0700 Subject: [PATCH 1/3] =?UTF-8?q?Add=20Th=C3=AAm=20ViewModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thêm Viewmodel cho reset mk,quên mk, tạo user, chỉnh sửa user, thêm serviceresult --- .../ViewModels/ForgotPasswordViewModel.cs | 12 +++++++ .../ViewModels/ResetPasswordViewModel.cs | 26 +++++++++++++++ .../ViewModels/ServiceResult.cs | 28 ++++++++++++++++ .../ViewModels/User/CreateUserViewModel.cs | 25 +++++++++++++++ .../ViewModels/User/EditUserViewModel.cs | 32 +++++++++++++++++++ 5 files changed, 123 insertions(+) create mode 100644 ParkingReservationSystem/ParkingReservationSystem/ViewModels/ForgotPasswordViewModel.cs create mode 100644 ParkingReservationSystem/ParkingReservationSystem/ViewModels/ResetPasswordViewModel.cs create mode 100644 ParkingReservationSystem/ParkingReservationSystem/ViewModels/ServiceResult.cs create mode 100644 ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/CreateUserViewModel.cs create mode 100644 ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/EditUserViewModel.cs diff --git a/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ForgotPasswordViewModel.cs b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ForgotPasswordViewModel.cs new file mode 100644 index 0000000..11ae2aa --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ForgotPasswordViewModel.cs @@ -0,0 +1,12 @@ +using System.ComponentModel.DataAnnotations; + +namespace ParkingReservationSystem.ViewModels +{ + public class ForgotPasswordViewModel + { + [Required(ErrorMessage = "Email là bắt buộc")] + [EmailAddress(ErrorMessage = "Email không hợp lệ")] + [Display(Name = "Email")] + public string Email { get; set; } + } +} diff --git a/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ResetPasswordViewModel.cs b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ResetPasswordViewModel.cs new file mode 100644 index 0000000..6bb75be --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ResetPasswordViewModel.cs @@ -0,0 +1,26 @@ +using System.ComponentModel.DataAnnotations; + +namespace ParkingReservationSystem.ViewModels +{ + public class ResetPasswordViewModel + { + [Required] + public string Token { get; set; } + + [Required] + [EmailAddress] + public string Email { get; set; } + + [Required(ErrorMessage = "Mật khẩu mới là bắt buộc")] + [StringLength(100, ErrorMessage = "Mật khẩu phải có ít nhất {2} ký tự", MinimumLength = 6)] + [DataType(DataType.Password)] + [Display(Name = "Mật khẩu mới")] + public string NewPassword { get; set; } + + [Required(ErrorMessage = "Xác nhận mật khẩu là bắt buộc")] + [DataType(DataType.Password)] + [Display(Name = "Xác nhận mật khẩu")] + [Compare("NewPassword", ErrorMessage = "Mật khẩu xác nhận không khớp")] + public string ConfirmPassword { get; set; } + } +} diff --git a/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ServiceResult.cs b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ServiceResult.cs new file mode 100644 index 0000000..d76d0e1 --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/ServiceResult.cs @@ -0,0 +1,28 @@ +namespace ParkingReservationSystem.ViewModels +{ + public class ServiceResult + { + public bool Success { get; set; } + public string ErrorMessage { get; set; } + public string SuccessMessage { get; set; } + + public static ServiceResult CreateSuccess(string message = null) + { + return new ServiceResult + { + Success = true, + SuccessMessage = message + }; + } + + public static ServiceResult CreateFailure(string errorMessage) + { + return new ServiceResult + { + Success = false, + ErrorMessage = errorMessage + }; + } + + } +} diff --git a/ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/CreateUserViewModel.cs b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/CreateUserViewModel.cs new file mode 100644 index 0000000..b1e5ca8 --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/CreateUserViewModel.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; + +namespace ParkingReservationSystem.ViewModels.User +{ + public class CreateUserViewModel + { + [Required(ErrorMessage = "Họ tên không được để trống")] + [Display(Name = "Họ và Tên")] + public string Name { get; set; } + + [Required(ErrorMessage = "Email không được để trống")] + [EmailAddress(ErrorMessage = "Email không hợp lệ")] + [Display(Name = "Email")] + public string Email { get; set; } + + [Required(ErrorMessage = "Mật khẩu không được để trống")] + [MinLength(8, ErrorMessage = "Mật khẩu phải có ít nhất 8 ký tự")] + [Display(Name = "Mật khẩu")] + public string Password { get; set; } + + [Required(ErrorMessage = "Vui lòng chọn vai trò")] + [Display(Name = "Vai trò")] + public string Role { get; set; } + } +} diff --git a/ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/EditUserViewModel.cs b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/EditUserViewModel.cs new file mode 100644 index 0000000..d40481e --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/ViewModels/User/EditUserViewModel.cs @@ -0,0 +1,32 @@ +using System.ComponentModel.DataAnnotations; + +namespace ParkingReservationSystem.ViewModels.User +{ + public class EditUserViewModel + { + public int Id { get; set; } + + [Required(ErrorMessage = "Họ tên không được để trống")] + [Display(Name = "Họ và Tên")] + public string Name { get; set; } + + [Required(ErrorMessage = "Email không được để trống")] + [EmailAddress(ErrorMessage = "Email không hợp lệ")] + [Display(Name = "Email")] + public string Email { get; set; } + + [Display(Name = "Mật khẩu mới")] + public string Password { get; set; } // Để trống nếu không đổi + + // Thêm field này để lưu mật khẩu cũ + public string CurrentPasswordHash { get; set; } + + [DataType(DataType.Password)] + [Compare("Password", ErrorMessage = "Mật khẩu xác nhận không khớp")] + public string? ConfirmPassword { get; set; } + + [Required(ErrorMessage = "Vui lòng chọn vai trò")] + [Display(Name = "Vai trò")] + public string Role { get; set; } + } +} From 5279b9e4772aeb05f6a3dc4ea721795c3b22a15c Mon Sep 17 00:00:00 2001 From: dinhtuandev Date: Mon, 25 Aug 2025 20:11:59 +0700 Subject: [PATCH 2/3] =?UTF-8?q?b=E1=BB=95=20sung=20l=E1=BA=A1i=20c=C3=A1c?= =?UTF-8?q?=20view=20c=E1=BB=A7a=20account?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit thêm view account gồm quên mk, reset mk --- .../Views/Account/ForgotPassword.cshtml | 81 ++++++++++++++ .../Views/Account/ResetPassword.cshtml | 100 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml create mode 100644 ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml diff --git a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml new file mode 100644 index 0000000..dfca382 --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml @@ -0,0 +1,81 @@ +@model ParkingReservationSystem.ViewModels.ForgotPasswordViewModel +@{ + ViewData["Title"] = "Quên mật khẩu"; +} + +@section Styles { + + +} + +
+
+ +
+
+ +
+

Quên mật khẩu

+

Nhập email của bạn để nhận liên kết đặt lại mật khẩu

+
+ + + @if (ViewBag.Error != null) + { +
+ + @ViewBag.Error +
+ } + + + @if (ViewBag.Success != null) + { +
+ + @ViewBag.Success +
+ } + + +
+
+ + + +
+ + +
+ + + +
+
+ +@section Scripts { + + @{ + await Html.RenderPartialAsync("_ValidationScriptsPartial"); + } +} \ No newline at end of file diff --git a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml new file mode 100644 index 0000000..77a69a0 --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml @@ -0,0 +1,100 @@ +@model ParkingReservationSystem.ViewModels.ResetPasswordViewModel +@{ + ViewData["Title"] = "Đặt lại mật khẩu"; +} + +@section Styles { + + +} + +
+
+ +
+
+ +
+

Đặt lại mật khẩu

+

Tạo mật khẩu mới cho tài khoản của bạn

+
+ + + @if (ViewBag.Error != null) + { +
+ + @ViewBag.Error +
+ } + + + @if (ViewBag.Success != null) + { +
+ + @ViewBag.Success +
+ } + + +
+ + + +
+ + + +
+ +
+ + + +
+ + +
+ + + +
+
+ +@section Scripts { + + @{ + await Html.RenderPartialAsync("_ValidationScriptsPartial"); + } +} \ No newline at end of file From 6ad94052246eef23b17a12374f5a9f9f7c0cddad Mon Sep 17 00:00:00 2001 From: dinhtuandev Date: Wed, 27 Aug 2025 12:28:19 +0700 Subject: [PATCH 3/3] =?UTF-8?q?update=20c=C3=A1c=20view?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bổ sung các view thiếu bên account --- .../Views/Account/ForgotPassword.cshtml | 4 +++- .../Views/Account/ResetPassword.cshtml | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml index dfca382..d82b6ff 100644 --- a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml +++ b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml @@ -78,4 +78,6 @@ @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } -} \ No newline at end of file + +} + diff --git a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml index 77a69a0..5e0494a 100644 --- a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml +++ b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml @@ -97,4 +97,6 @@ @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } -} \ No newline at end of file + +} + \ No newline at end of file