コード例 #1
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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, "修改失败"));
        }
コード例 #2
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        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("启用失败");
        }
コード例 #3
0
ファイル: Hub.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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, "注册失败,请重试"));
        }
コード例 #4
0
        /// <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("修改密码失败");
        }
コード例 #5
0
        /// <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);
        }
コード例 #6
0
 public static SignInResult Success(DB.Tables.User user)
 {
     return(new SignInResult
     {
         Succeed = true,
         _email = user.NormalizedEmail,
         _role = user.Role
     });
 }
コード例 #7
0
 /// <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($"不是客户")
     });
コード例 #8
0
        /// <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("修改头像失败");
        }
コード例 #9
0
        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);
        }
コード例 #10
0
ファイル: Hub.cs プロジェクト: ChenDvorak/yougebug-back
        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));
        }
コード例 #11
0
ファイル: Hub.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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));
        }
コード例 #12
0
        /// <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);
        }
コード例 #13
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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, "退出登录失败"));
        }
コード例 #14
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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));
        }
コード例 #15
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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, "修改失败"));
        }
コード例 #16
0
        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("修改失败");
        }
コード例 #17
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        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);
        }
コード例 #18
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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);
        }
コード例 #19
0
ファイル: User.cs プロジェクト: ChenDvorak/yougebug-back
        /// <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);
        }
コード例 #20
0
 internal Administrator(DB.Tables.User userModel) : base(userModel)
 {
 }
コード例 #21
0
 internal Client(DB.Tables.User userModel) : base(userModel)
 {
 }
コード例 #22
0
 /// <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);
 }