using FreeSql.DataAnnotations;
using F9WebAiTest.Domain.Events.SYS.RBAC;
namespace F9WebAiTest.Domain.Entities.SYS.RBAC;
/// 用户:可以拥有多个角色。
[Table(Name = "sys_rbac_users")]
public class User : AggregateRoot
{
[Column(Name = "department_id")]
public long DepartmentId { get; private set; }
[Column(Name = "user_name")]
public string UserName { get; private set; }
[Column(Name = "phone_number")]
public string PhoneNumber { get; private set; }
[Column(Name = "login_name")]
public string LoginName { get; private set; }
[Column(Name = "password_hash")]
public string PasswordHash { get; private set; }
[Column(Name = "is_active")]
public bool IsActive { get; private set; }
[Column(Name = "sort_order")]
public int SortOrder { get; private set; }
[Column(Name = "lastlogin_at")]
public DateTime? LastLoginAt { get; private set; }
[Column(Name = "nickname")]
public string Nickname { get; private set; } = "";
[Column(Name = "avatar")]
public string Avatar { get; private set; } = "";
[Column(Name = "email")]
public string Email { get; private set; } = "";
[Column(Name = "gender")]
public string Gender { get; private set; } = "男";
public User() { }
public User(long id, string userName, string phoneNumber, string loginName, long departmentId, int sortOrder)
{
Id = id;
UserName = userName;
PhoneNumber = phoneNumber;
LoginName = loginName;
DepartmentId = departmentId;
IsActive = true;
SortOrder = sortOrder;
}
public void Update(string userName, string phoneNumber, string loginName, long departmentId, int sortOrder)
{
UserName = userName;
PhoneNumber = phoneNumber;
LoginName = loginName;
DepartmentId = departmentId;
IsActive = true;
SortOrder = sortOrder;
}
public void Activate() => IsActive = true;
public void Deactivate() => IsActive = false;
/// 获取默认密码明文
public string GetDefaultPasswordText() => "123456";
/// 设置密码(哈希后的密文)
public void SetPassword(string password) => PasswordHash = password;
/// 更新个人资料(昵称/头像/邮箱/手机号/性别)
public void UpdateProfile(string nickname, string avatar, string email, string phoneNumber, string gender)
{
Nickname = nickname ?? Nickname;
Avatar = avatar ?? Avatar;
Email = email ?? Email;
PhoneNumber = phoneNumber ?? PhoneNumber;
Gender = gender ?? Gender;
}
/// 登录成功,记录登录时间并发布登录事件
public void LoginSuccess(string deviceId, string account, bool success, long userId, string userName)
{
LastLoginAt = DateTime.Now;
AddDomainEvent(new UserLoginDomainEvent(deviceId, account, success, userId, userName));
}
public void AddRole(long roleId) => AddDomainEvent(new UserRole_ChangedDomainEvent(Id));
public void RemoveRole(long roleId) => AddDomainEvent(new UserRole_ChangedDomainEvent(Id));
}