/// <summary> /// 修改密码 /// </summary> /// <param name="newPassword">经过加密的新密码</param> /// <returns></returns> public async Task <Resp> ChangePasswordAsync(Models.ChangePassword model) { (bool isValid, string msg) = model.IsValid(); if (!isValid) { return(Resp.Fault(Resp.NONE, msg)); } using var db = new YGBContext(); DB.Tables.User user = await db.Users.FirstOrDefaultAsync(u => u.Id == Id); if (user is null) { return(Resp.NeedLogin(Resp.NONE, "请重新登录")); } if (!user.Password.Equals(model.OldPassword, StringComparison.OrdinalIgnoreCase)) { return(Resp.Fault(Resp.NONE, "旧密码有误")); } if (user.Password.Equals(model.NewPassword, StringComparison.OrdinalIgnoreCase)) { return(Resp.Fault(Resp.NONE, "新密码不能和旧密码相同")); } user.Password = model.NewPassword; int changeCount = await db.SaveChangesAsync(); if (changeCount == 1) { return(Resp.Success(Resp.NONE)); } return(Resp.Fault(Resp.NONE, "修改失败")); }
private async Task <string> ModifyState(UserState userState) { using var db = new YGBContext(); DB.Tables.User user = await db.Users.FirstOrDefaultAsync(u => u.Id == Id); if (user is null) { return(USER_NOT_EXIST); } int value = (int)userState; string description = userState.GetDescription(); if (user.State == value) { return($"用户已是{description}的状态,不能重复{description}"); } user.State = value; int count = await db.SaveChangesAsync(); if (count == 1) { return(""); } return("启用失败"); }
/// <summary> /// 注册 /// </summary> public async Task <Resp> RegisterAsync(Models.RegisterInfo register) { (bool isValid, string msg) = register.IsValid(); if (!isValid) { return(Resp.Fault(Resp.NONE, msg)); } using var db = new YGBContext(); if (await db.Users.AnyAsync(u => u.Email.ToLower() == register.Email.ToLower())) { return(Resp.Fault(Resp.NONE, "该邮箱已被注册")); } DB.Tables.User newUser = new DB.Tables.User { Name = Guid.NewGuid().ToString(), Email = register.Email, Password = register.Password, AvatarId = File.DEFAULT_IMG_ID, Token = System.Guid.NewGuid(), State = (int)User.UserState.Enabled }; db.Users.Add(newUser); if (await db.SaveChangesAsync() == 1) { newUser.Name = $"未命名_{newUser.Id}"; await db.SaveChangesAsync(); return(Resp.Success(Resp.NONE)); } return(Resp.Fault(Resp.NONE, "注册失败,请重试")); }
/// <summary> /// modify the user email /// </summary> /// <returns></returns> public virtual async Task <(bool, string)> ModifyPasswordAsync(Models.ChangePassword model) { await using var db = new LOPDbContext(); DB.Tables.User user = await db.Users.AsNoTracking().FirstOrDefaultAsync(user => user.Id == Id && user.Password.Equals(model.OldPassword, StringComparison.OrdinalIgnoreCase)); if (user is null) { return(false, "旧密码错误"); } if (string.IsNullOrWhiteSpace(model.NewPassword)) { return(false, "密码不能为空"); } if (user.Password == model.NewPassword) { return(true, ""); } user.Password = model.NewPassword; db.Update(user); int changeCount = await db.SaveChangesAsync(); if (changeCount == 1) { UserCache.SetUserModel(user); return(true, ""); } throw new Exception("修改密码失败"); }
/// <summary> /// cache user model with cache time span /// </summary> /// <param name="userModel"></param> internal static void SetUserModel(DB.Tables.User userModel, TimeSpan cacheTime) { if (userModel is null) { throw new ArgumentNullException("cache user model should not null"); } Cache.Set(USER_CACHE_KEY + userModel.Account, userModel, cacheTime); }
public static SignInResult Success(DB.Tables.User user) { return(new SignInResult { Succeed = true, _email = user.NormalizedEmail, _role = user.Role }); }
/// <summary> /// 转换成客户对象, /// 管理员同样可以转换成可以对象 /// </summary> /// <param name="userModel"></param> /// <returns></returns> private Client ParseClient(DB.Tables.User userModel) { return((User.RoleCategories)userModel.Roles switch { // 如果是管理员 // 如果是客户 var r when(r& User.RoleCategories.Client) != 0 || (r & User.RoleCategories.Administrator) != 0 => new Client(userModel), _ => throw new Exception($"不是客户") });
/// <summary> /// modify the user avatar /// </summary> /// <returns>(bool: isSuccessfully, string: message when fault or avatar request path when successfully)</returns> public virtual async Task <(bool, string)> ModifyAvatarAsync(int avatarId) { await using var db = new LOPDbContext(); DB.Tables.User user = await db.Users.AsNoTracking().Include(user => user.Avatar).FirstOrDefaultAsync(user => user.Id == Id); if (user is null) { return(false, "该用户不存在"); } if (user.AvatarId == avatarId) { return(true, ""); } DB.Tables.File SOURCE_AVATAR = user.Avatar; int shouldChangeCount = 2; // 删除原头像 if (user.AvatarId != AVATAR_DEFAULT_ID && user.Avatar != null) { db.Files.Remove(SOURCE_AVATAR); shouldChangeCount++; } // user.AvatarId = avatarId; var avatarModel = await db.Files.AsNoTracking().FirstOrDefaultAsync(file => file.Id == avatarId); if (avatarModel == null) { return(false, "该头像不存在"); } user.Avatar = avatarModel; db.Users.Update(user); int changeCount = await db.SaveChangesAsync(); if (changeCount == shouldChangeCount) { if (SOURCE_AVATAR.Id != AVATAR_DEFAULT_ID) { // 删除原头像文件 Files.File.Delete(SOURCE_AVATAR.SaveName); // 删除缩略图 Files.File.DeleteThumbnail(SOURCE_AVATAR.Thumbnail); } // 缓存用户更新后的数据 UserCache.SetUserModel(user); // 返回新头像的访问路径 string saveWebPath = Config.GetValue("File:SaveWebPath"); saveWebPath = Path.Combine(saveWebPath, avatarModel.SaveName); return(true, saveWebPath); } throw new Exception("修改头像失败"); }
protected User(DB.Tables.User userModel) { if (userModel is null) { throw new ArgumentNullException("user model not found"); } Id = userModel.Id; Account = userModel.Account; Name = userModel.Name; Role = (RoleCategories)userModel.Roles; UserCache.SetUserModel(userModel); }
public static User GetUserByUserName(string userName) { using var db = new YGBContext(); DB.Tables.User user = db.Users.AsNoTracking() .Where(u => u.Name.Equals(userName, StringComparison.OrdinalIgnoreCase)) .FirstOrDefault(); if (user is null) { return(User.GetEmpty()); } return(new User(user.Id)); }
/// <summary> /// 获取用户 /// </summary> public static User GetUser(string token) { using var db = new YGBContext(); DB.Tables.User user = db.Users.AsNoTracking() .Where(u => u.Token.ToString() == token) .FirstOrDefault(); if (user is null) { return(User.GetEmpty()); } return(new User(user.Id)); }
/// <summary> /// 获取客户首页的个人信息 /// </summary> /// <returns></returns> public async virtual Task <Results.ClientHomePageProfile> GetProfileAsync() { DB.Tables.User user = await UserCache.GetUserModelAsync(Account, true); if (user is null) { return(null); } Results.ClientHomePageProfile result = new Results.ClientHomePageProfile { UserName = Name, Email = user.Email, Avatar = Path.Combine(Config.GetValue("File:SaveWebPath"), user.Avatar.SaveName) }; return(result); }
/// <summary> /// 登出 /// </summary> public async Task <Resp> LogoutAsync() { using var db = new YGBContext(); DB.Tables.User account = await db.Users.FirstOrDefaultAsync(a => a.Id == Id); if (account is null) { return(Resp.Success(Resp.NONE)); } account.Token = Guid.NewGuid(); if (await db.SaveChangesAsync() == 1) { return(Resp.Success(Resp.NONE)); } return(Resp.Fault(Resp.NONE, "退出登录失败")); }
/// <summary> /// 登录 /// </summary> public static async Task <Resp> LoginAsync(Models.LoginInfo loginInfo) { /* * 检查登录参数 */ (bool isValid, string msg) = loginInfo.IsValid(); if (!isValid) { return(Resp.Fault(Resp.NONE, msg)); } /* * 检查登录账号密码 */ using var db = new YGBContext(); DB.Tables.User user = await db.Users.Include(u => u.Avatar) .FirstOrDefaultAsync(a => (a.Name.Equals(loginInfo.Account, StringComparison.OrdinalIgnoreCase) || a.Email.Equals(loginInfo.Account, StringComparison.OrdinalIgnoreCase)) && a.Password == loginInfo.Password); if (user is null) { return(Resp.Fault(Resp.NONE, "用户名或邮箱不存在或密码错误")); } user.Token = Guid.NewGuid(); int suc = await db.SaveChangesAsync(); if (suc != 1) { return(Resp.Fault(Resp.NONE, "登录失败, 请重试")); } Results.LoggedInInfo result = new Results.LoggedInInfo { Avatar = user.Avatar.Thumbnail, Id = user.Id, Token = user.Token, Name = user.Name }; return(Resp.Success(result)); }
/// <summary> /// 修改用户名 /// </summary> public async Task <Resp> ChangeUserInfoAsync(Models.UserModify model) { (bool isValid, string msg) = model.IsValid(); if (!isValid) { return(Resp.Fault(Resp.NONE, msg)); } using var db = new YGBContext(); DB.Tables.User user = await db.Users.FirstOrDefaultAsync(u => u.Id == Id); if (user is null) { return(Resp.Fault(Resp.NONE, USER_NOT_EXIST)); } if (user.Name.Equals(model.UserName, StringComparison.OrdinalIgnoreCase)) { return(Resp.Fault(Resp.NONE, "不能和原来的用户相同")); } if (await db.Users.AnyAsync(u => u.Name.Equals(model.UserName, StringComparison.OrdinalIgnoreCase) && u.Id != Id)) { return(Resp.Fault(Resp.NONE, "已经被使用的用户名")); } if (await db.Users.AnyAsync(u => u.Email.Equals(model.Email, StringComparison.OrdinalIgnoreCase) && u.Id != Id)) { return(Resp.Fault(Resp.NONE, "已经被使用的邮箱")); } user.Name = model.UserName; user.Email = model.Email; int changeCount = await db.SaveChangesAsync(); if (changeCount == 1) { return(Resp.Success(Resp.NONE)); } return(Resp.Fault(Resp.NONE, "修改失败")); }
public virtual async Task <(bool, string)> ModifyUser(Models.ModifyUser model) { Validation validation = new Validation(); if (!validation.ValidateUserName(model.Name)) { return(false, $"用户名必须大于{NAME_MIN_LENGTH}位小于{NAME_MAX_LENGTH}位,却不能带有 {NAME_NOT_ALLOW_CHAR}"); } if (!validation.ValidateEmail(model.Email)) { return(false, "邮箱格式不正确"); } await using var db = new LOPDbContext(); DB.Tables.User user = await db.Users.AsNoTracking().FirstOrDefaultAsync(user => user.Id == Id); if (user is null) { return(false, "该用户不存在"); } if (user.Name == model.Name && user.Email == model.Email) { return(true, ""); } user.Name = model.Name; user.Email = model.Email; db.Update(user); int changeCount = await db.SaveChangesAsync(); if (changeCount == 1) { UserCache.SetUserModel(user); Name = model.Name; return(true, ""); } throw new Exception("修改失败"); }
public async Task <Results.ClientDetail> GetUserInfoAsync() { using var db = new YGBContext(); DB.Tables.User user = await db.Users.AsNoTracking() .Include(u => u.Avatar) .FirstOrDefaultAsync(u => u.Id == Id); if (user is null) { throw new NullReferenceException(USER_NOT_EXIST); } Results.ClientDetail detail = new Results.ClientDetail { UserName = user.Name, Email = user.Email, CreateDate = user.CreateDate.ToStandardDateString(), Avatar = user.Avatar.Path, State = Share.KeyValue <int, string> .Create(user.State, user.State.GetDescription <UserState>()) }; return(detail); }
/// <summary> /// 获取用户头像 /// </summary> /// <returns></returns> public string GetAvatar() { CheckEmpty(); if (_avatar != null) { return(_avatar); } string key = $"06ba9d74-dd08-4c0f-acf7-cbdcbb56bf40_{Id}"; _avatar = Cache.Get <string>(key); if (_avatar is null) { using var db = new YGBContext(); DB.Tables.User account = db.Users.AsNoTracking() .Include(u => u.Avatar) .FirstOrDefault(a => a.Id == Id); _name = account?.Name ?? ""; _avatar = account.Avatar.Thumbnail; Cache.Set(key, _avatar); } return(_avatar); }
/// <summary> /// 获取这个用户的名字 /// </summary> /// <returns></returns> public string GetName() { CheckEmpty(); if (_name != null) { return(_name); } string key = $"e2522d10-c5ad-4811-87c3-503efe1a5858_{Id}"; _name = Cache.Get <string>(key); if (_name is null) { using var db = new YGBContext(); DB.Tables.User account = db.Users.AsNoTracking() .Include(u => u.Avatar) .FirstOrDefault(a => a.Id == Id); _name = account?.Name ?? ""; _avatar = account.Avatar.Thumbnail; Cache.Set(key, _name); } return(_name); }
internal Administrator(DB.Tables.User userModel) : base(userModel) { }
internal Client(DB.Tables.User userModel) : base(userModel) { }
/// <summary> /// cache user model with default cache time span /// </summary> /// <param name="userModel"></param> internal static void SetUserModel(DB.Tables.User userModel) { SetUserModel(userModel, Default_Cache_Time); }