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; } + } +} diff --git a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml new file mode 100644 index 0000000..d82b6ff --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ForgotPassword.cshtml @@ -0,0 +1,83 @@ +@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"); + } + +} + diff --git a/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml new file mode 100644 index 0000000..5e0494a --- /dev/null +++ b/ParkingReservationSystem/ParkingReservationSystem/Views/Account/ResetPassword.cshtml @@ -0,0 +1,102 @@ +@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