从零开始Blazor Server(14)--修改密码

目前,我们只做了在用户管理里强行修改密码,而没有做用户自行修改密码的功能,今天我们来实现它。


首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的LinkTemplate增加一个LinkButton

        <Logout ImageUrl="images/argo-c.png" DisplayName="@_user.Name" UserName="@_user.UserName">
            <LinkTemplate>
                <LinkButton Icon="fa fa-gear" Text="修改密码" Color="Color.None" OnClick="ChangePassword"></LinkButton>
                <LogoutLink Url="/api/account/logout"></LogoutLink>
            </LinkTemplate>
        </Logout>

然后我们需要创建一个ChangePasswordVO

public class ChangePassword
{
    [Display(Name = "原密码")]
    [Required(ErrorMessage = "原密码不能为空")]
    [AutoGenerateColumn(ComponentType = typeof(BootstrapPassword))]
    public string? OldPassword { get; set; }

    [Display(Name = "新密码")]
    [Required(ErrorMessage = "新密码不能为空")]
    [AutoGenerateColumn(ComponentType = typeof(BootstrapPassword))]
    public string? NewPassword { get; set; }
    
    [Display(Name = "重复新密码")]
    [Compare(nameof(NewPassword), ErrorMessage = "两次密码不一致")]
    [AutoGenerateColumn(ComponentType = typeof(BootstrapPassword))]
    public string? RePassword { get; set; }
}

这里面我们让旧密码不能为空,新密码不能为空,然后确认密码要与新密码内容一致。

这里我们还可以加比如位数的验证之类的,甚至可以自己写校验规则。我这里就不写了。

然后我们使用[AutoGenerateColumn(ComponentType = typeof(BootstrapPassword))]指定我们的输入框是BootstrapPassword,以密码方式显示,不然默认显示为Input它不好看。


最后就是我们使用EditDialog把内容显示出来。

    private void ChangePassword()
    {
        var option = new EditDialogOption<ChangePassword>()
        {
            Title = "修改密码",
            Size = Size.Medium,
            Model = new ChangePassword(),
            ItemsPerRow = 1,
            RowType = RowType.Normal,
            OnEditAsync = async context =>
            {
                if (context.Model is not ChangePassword changePassword)
                {
                    await ToastService.Show(new ToastOption()
                    {
                        Category = ToastCategory.Error,
                        Title = "保存出错",
                        Content = "类型转换错误"
                    });
                    return false;
                }
                var oldPassword = changePassword.OldPassword.ToMD5Encrypt();
                if (!await UserEntity.Select.Where(x => x.Id == _user.Id && x.Password == oldPassword).AnyAsync())
                {
                    await ToastService.Show(new ToastOption()
                    {
                        Category = ToastCategory.Error,
                        Title = "保存出错",
                        Content = "原密码不正确,请检查原密码"
                    });
                    return false;
                }
                var newPassword = changePassword.NewPassword.ToMD5Encrypt();
                _user.Password = newPassword;
                await _user.SaveAsync();
                return true;
            }
        };
        DialogService.ShowEditDialog(option);
    }

这里我们解释一下,OnEditAsync就是我们点击保存按钮以后的回调,返回true则会关闭弹窗,false不会。

所以我们就判断一下当前用户密码是否正确,如果不正确则报错。

否则我们保存新密码。


这样,我们的修改密码功能就完成了。


代码在代码在https://github.com/j4587698/BlazorLearn,分支lesson14

posted @ 2022-08-24 15:45  jvx  阅读(1508)  评论(0编辑  收藏  举报