private void AddOrDeleteRoles(UserCreateParam model, User user)
        {
            var roleArray = (int[])Enum.GetValues(typeof(RoleWithId));

            foreach (var roleId in model.RoleIds)
            {
                if (user.Roles.Any(x => x.RoleId == roleId))
                {
                    continue;
                }
                if (!roleArray.Contains(roleId))
                {
                    throw new Exception("角色不存在");
                }
                var userRole = new UserRole
                {
                    RoleId = roleId,
                    User   = user
                };
                user.Roles.Add(userRole);
            }
            var deletedUserRoles =
                user.Roles.Where(userRole => !model.RoleIds.Contains(userRole.RoleId))
                .ToList();

            foreach (var deletedUserRole in deletedUserRoles)
            {
                deletedUserRole.User = null;
                user.Roles.Remove(deletedUserRole);
            }
        }
        public async Task <Result> Post([FromBody] UserCreateParam model)
        {
            if (string.IsNullOrWhiteSpace(model.Password))
            {
                throw new Exception("密码不能为空");
            }

            var any = _userRepository.Query().Any(c => c.UserName == model.UserName);

            if (any)
            {
                return(Result.Fail("用户名已存在"));
            }

            var user = new User
            {
                UserName    = model.UserName,
                Email       = model.Email,
                FullName    = model.FullName,
                PhoneNumber = model.PhoneNumber,
                IsActive    = model.IsActive,
                AdminRemark = model.AdminRemark
            };
            var roleIds   = model.RoleIds.Distinct();
            var roleArray = (int[])Enum.GetValues(typeof(RoleWithId));

            foreach (var roleId in roleIds)
            {
                if (!roleArray.Contains(roleId))
                {
                    throw new Exception("角色不存在");
                }
                var userRole = new UserRole
                {
                    RoleId = roleId
                };
                user.Roles.Add(userRole);
                userRole.User = user;
            }

            model.Password = model.Password.Trim();
            if (model.Password.Length < 6 || model.Password.Length > 32)
            {
                throw new Exception("密码长度6-32字符");
            }

            var result = await _userManager.CreateAsync(user, model.Password);

            if (!result.Succeeded)
            {
                return(Result.Fail(result.Errors.FirstOrDefault()?.Description));
            }
            return(Result.Ok());
        }
        public async Task <Result> Put(int id, [FromBody] UserCreateParam model)
        {
            var user = await _userRepository.Query()
                       .Include(x => x.Roles)
                       .FirstOrDefaultAsync(x => x.Id == id);

            if (user == null)
            {
                throw new Exception("用户不存在");
            }

            user.Email       = model.Email;
            user.UserName    = model.UserName;
            user.FullName    = model.FullName;
            user.PhoneNumber = model.PhoneNumber;
            user.IsActive    = model.IsActive;
            user.UpdatedOn   = DateTime.Now;
            user.AdminRemark = model.AdminRemark;

            AddOrDeleteRoles(model, user);

            var result = await _userManager.UpdateAsync(user);

            if (!result.Succeeded)
            {
                return(Result.Fail(result.Errors.FirstOrDefault()?.Description));
            }
            if (!string.IsNullOrWhiteSpace(model.Password))
            {
                model.Password = model.Password.Trim();
                if (model.Password.Length < 6 || model.Password.Length > 32)
                {
                    throw new Exception("密码长度6-32字符");
                }

                var code = await _userManager.GeneratePasswordResetTokenAsync(user);

                result = await _userManager.ResetPasswordAsync(user, code, model.Password.Trim());
            }
            if (!result.Succeeded)
            {
                return(Result.Fail(result.Errors.FirstOrDefault()?.Description));
            }

            _tokenService.RemoveUserToken(user.Id);
            return(Result.Ok());
        }