Member.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. using System.ComponentModel.DataAnnotations.Schema;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.ComponentModel;
  4. using Microsoft.EntityFrameworkCore;
  5. using bitforum.Constants;
  6. using bitforum.Models.Log;
  7. /// <summary>
  8. /// 사용자단 일반 회원 정보
  9. /// </summary>
  10. namespace bitforum.Models.Account
  11. {
  12. [Table("Member")]
  13. [Comment("회원 정보")]
  14. [Index(nameof(SID), Name = "IX_Member_SID", IsUnique = true)]
  15. [Index(nameof(Email), Name = "IX_Member_Email", IsUnique = true)]
  16. [Index(nameof(Name), Name = "IX_Member_Name", IsUnique = true)]
  17. [Index(nameof(FullName), Name = "IX_Member_FullName")]
  18. [Index(nameof(Gender), Name = "IX_Member_Gender")]
  19. [Index(nameof(Phone), Name = "IX_Member_Phone")]
  20. [Index(nameof(IsEmailVerified), Name = "IX_Member_IsEmailVerified")]
  21. [Index(nameof(IsAuthCertified), Name = "IX_Member_IsAuthCertified")]
  22. [Index(nameof(IsDenied), Name = "IX_Member_IsDenied")]
  23. [Index(nameof(IsAdmin), Name = "IX_Member_IsAdmin")]
  24. [Index(nameof(IsWithdraw), Name = "IX_Member_IsWithdraw")]
  25. [Index(nameof(CreatedAt), Name = "IX_Member_CreatedAt")]
  26. [Index(nameof(DeletedAt), Name = "IX_Member_DeletedAt")]
  27. public class Member
  28. {
  29. [Key]
  30. [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  31. [Comment("PK")]
  32. public int ID { get; set; }
  33. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. // 1:1 관계
  35. [ForeignKey("GradeID")]
  36. public virtual MemberGrade? MemberGrade { get; set; } // 회원 등급 정보
  37. public virtual MemberApprove? MemberApprove { get; set; } // 알림/약관 동의 여부
  38. // 1:N 관계
  39. public virtual ICollection<LoginLog>? LoginLog { get; set; } // 로그인 기록
  40. public virtual ICollection<EmailLog>? EmailLog { get; set; } // 이메일 발송 기록
  41. public virtual ICollection<NameChangeLog>? NameChangeLog { get; set; } // 별명 변경 기록
  42. public virtual ICollection<EmailChangeLog>? EmailChangeLog { get; set; } // 이메일 변경 기록
  43. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. [DisplayName("회원등급 ID")]
  45. [Comment("회원등급 ID")]
  46. public int? GradeID { get; set; } = null;
  47. [Required]
  48. [DisplayName("SID")]
  49. [Comment("SID")]
  50. [StringLength(20)]
  51. public string SID { get; set; } = Guid.NewGuid().ToString().Substring(0, 20); // 무작위 문자열
  52. [Required]
  53. [DisplayName("이메일")]
  54. [Comment("이메일")]
  55. [DataType(DataType.EmailAddress)]
  56. [StringLength(60)]
  57. public string Email { get; set; } = null!;
  58. [DisplayName("별명")]
  59. [Comment("별명")]
  60. [StringLength(20)]
  61. public string? Name { get; set; } = null;
  62. [DisplayName("본명")]
  63. [Comment("본명")]
  64. [StringLength(40)]
  65. public string? FullName { get; set; } = null;
  66. [DisplayName("본명(성)")]
  67. [Comment("본명(성)")]
  68. [StringLength(20)]
  69. public string? FirstName { get; set; } = null;
  70. [DisplayName("본명(이름)")]
  71. [Comment("본명(이름)")]
  72. [StringLength(40)]
  73. public string? LastName { get; set; } = null;
  74. [DisplayName("비밀번호")]
  75. [Comment("비밀번호")]
  76. [StringLength(255)]
  77. [DataType(DataType.Password)]
  78. public string? Password { get; set; } = string.Empty; // 관리자 수정 시 필요
  79. [DisplayName("자기소개")]
  80. [Comment("자기소개")]
  81. [StringLength(1000)]
  82. public string? Intro { get; set; } = null;
  83. [DisplayName("한마디")]
  84. [Comment("한마디")]
  85. [StringLength(50)]
  86. public string? Summary { get; set; } = null;
  87. [DisplayName("코인")]
  88. [Comment("코인")]
  89. public long Coin { get; set; } = 0;
  90. [DisplayName("경험치")]
  91. [Comment("경험치")]
  92. public int Exp { get; set; } = 0;
  93. [DisplayName("연락처")]
  94. [Comment("연락처")]
  95. [StringLength(15)]
  96. [RegularExpression(@"^010-\d{4}-\d{4}$", ErrorMessage = "전화번호 형식은 010-0000-0000 이어야 합니다.")]
  97. public string? Phone { get; set; } = null;
  98. [DisplayName("생년월일")]
  99. [Comment("생년월일")]
  100. public DateOnly? Birthday { get; set; } = null;
  101. [DisplayName("성별")]
  102. [Comment("성별")]
  103. [EnumDataType(typeof(Gender))]
  104. public Gender? Gender { get; set; } = null;
  105. [DisplayName("사진")]
  106. [Comment("사진")]
  107. [StringLength(255)]
  108. public string? Photo { get; set; } = null;
  109. [DisplayName("아이콘")]
  110. [Comment("아이콘")]
  111. [StringLength(255)]
  112. public string? Icon { get; set; } = null;
  113. [DisplayName("이메일 인증 여부")]
  114. [Comment("이메일 인증 여부")]
  115. public bool IsEmailVerified { get; set; } = false;
  116. [DisplayName("본인 인증 여부")]
  117. [Comment("본인 인증 여부")]
  118. public bool IsAuthCertified { get; set; } = false;
  119. [DisplayName("차단 여부")]
  120. [Comment("차단 여부")]
  121. public bool IsDenied { get; set; } = false;
  122. [DisplayName("운영진 여부")]
  123. [Comment("운영진 여부")]
  124. public bool IsAdmin { get; set; } = false;
  125. [DisplayName("탈퇴 여부")]
  126. [Comment("탈퇴 여부")]
  127. public bool IsWithdraw { get; set; } = false;
  128. [DisplayName("구독 중")]
  129. [Comment("구독 중")]
  130. public int Following { get; set; } = 0;
  131. [DisplayName("구독자")]
  132. [Comment("구독자")]
  133. public int Followed { get; set; } = 0;
  134. [DisplayName("로그인 단말기 정보")]
  135. [Comment("로그인 단말기 정보")]
  136. [StringLength(400)]
  137. public string? DeviceInfo { get; set; } = null;
  138. [DisplayName("회원가입 시 IP")]
  139. [Comment("회원가입 시 IP")]
  140. [StringLength(15)]
  141. public string SignupIP { get; set; } = string.Empty;
  142. [DisplayName("마지막 로그인 IP")]
  143. [Comment("마지막 로그인 IP")]
  144. [StringLength(15)]
  145. public string? LastLoginIp { get; set; } = null;
  146. [DisplayName("마지막 로그인 일시")]
  147. [Comment("마지막 로그인 일시")]
  148. public DateTime? LastLoginAt { get; set; } = null;
  149. [DisplayName("마지막 이메일 변경 일시")]
  150. [Comment("마지막 이메일 변경 일시")]
  151. public DateTime? LastEmailChangedAt { get; set; } = null;
  152. [DisplayName("마지막 별명 변경 일시")]
  153. [Comment("마지막 별명 변경 일시")]
  154. public DateTime? LastNameChangedAt { get; set; } = null;
  155. [DisplayName("이메일 인증 일시")]
  156. [Comment("이메일 인증 일시")]
  157. public DateTime? EmailVerifiedAt { get; set; } = null;
  158. [DisplayName("본인인증 일시")]
  159. [Comment("본인인증 일시")]
  160. public DateTime? AuthCertifiedAt { get; set; } = null;
  161. [DisplayName("비밀번호 변경 일시")]
  162. [Comment("비밀번호 변경 일시")]
  163. public DateTime PasswordUpdatedAt { get; set; }
  164. [DisplayName("가입 일시")]
  165. [Comment("가입 일시")]
  166. public DateTime CreatedAt { get; set; }
  167. [DisplayName("수정 일시")]
  168. [Comment("수정 일시")]
  169. public DateTime? UpdatedAt { get; set; } = null;
  170. [DisplayName("탈퇴 일시")]
  171. [Comment("탈퇴 일시")]
  172. public DateTime? DeletedAt { get; set; } = null;
  173. }
  174. }