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

首先,我们的用户密码修改最好的位置应该就是在头像下面的下拉菜单里,所以我们在那里的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

从零开始Blazor Server(14)--修改密码的更多相关文章

  1. 从零开始Blazor Server(9)--修改Layout

    目前我们的MainLayout还是默认的,这里我们需要修改为BootstrapBlazor的Layout,并且处理一下菜单. 修改MainLayout BootstrapBlazor已经自带了一个La ...

  2. 从零开始Blazor Server(15)--总结

    我们用了14篇文章,基本上把一个后台管理系统需要的UI部分都说的差不多了.所以这套文章也该到了结束的时候了. 这里面有很多问题,比如我们直接使用UI来拉数据库信息而没有使用service,再比如我们大 ...

  3. 从零开始Blazor Server(1)--项目搭建

    项目介绍 本次项目准备搭建一个使用Furion框架,Blazor的UI使用BootstrapBlazor.数据库ORM使用Freesql的后台管理系统. 目前的规划是实现简单的注册,登录.增加管理员跟 ...

  4. 从零开始Blazor Server(3)--添加cookie授权

    认证方式简述 Blazor Server微软官方还是推荐直接使用Cookie授权,因为本来Blazor Server就是前后端不分离的.不存在Cookie跨域等一系列问题. 只要不是使用SSO之类的统 ...

  5. 从零开始Blazor Server(11)--编辑用户

    用户编辑和角色编辑几乎一模一样,这里先直接贴代码. @page "/user" @using BlazorLearn.Entity @using Furion.DataEncryp ...

  6. 从零开始Blazor Server(4)--登录系统

    说明 上一篇文章中我们添加了Cookie授权,可以跳转到登录页了.但是并没有完成登录,今天我们来完成它. 我们添加Cookie授权的时候也说了,这套跟MVC一模一样,所以我们登录也是跟MVC一模一样. ...

  7. 从零开始Blazor Server(6)--基于策略的权限验证

    写这个的原因 现在BootstrapBlazor处于大更新时期,Menu组件要改为泛型模式. 本来我们的这一篇应该是把Layout改了,但是改Layout肯定要涉及到菜单,如果现在写了呢,就进入一个发 ...

  8. 从零开始Blazor Server(2)--整合数据库

    开篇 上一篇文章我们留了个尾巴,没有把freesql整合进去,这篇文章我们来整合. 目前的思路呢,是做一个简单的四不像的RABC,也有用户.角色. 权限三部分. 但是其中每个用户只有一个角色,即用户和 ...

  9. 从零开始Blazor Server(5)--权限验证

    序 之前我们一直使用的是微软自带的身份验证方式,即使用[Authorize]标签来做. 但是这种方式十分不灵活,微软推荐的方式是加Policy,但是这种方式对我们来说还是不够灵活. 所以本节我们用完全 ...

随机推荐

  1. Linux静默安装Oracle21C

    Linux静默安装Oracle21C 1.修改主机名及配置hosts [root@localhost ~]# hostname # 查看主机名 [root@localhost ~]# hostname ...

  2. 【Openxml】颜色变化属性计算

    Openxml的颜色变化属性 目前Openxml存在颜色变化属性如下: 参数 说明 Hue 色调(色相) HueModulate 色调调制,百分比 HueOffset 色调偏移量,角度值 Satura ...

  3. go-zero微服务实战系列(五、缓存代码怎么写)

    缓存是高并发服务的基础,毫不夸张的说没有缓存高并发服务就无从谈起.本项目缓存使用Redis,Redis是目前主流的缓存数据库,支持丰富的数据类型,其中集合类型的底层主要依赖:整数数组.双向链表.哈希表 ...

  4. 引入gitlab仓库代码到npm包的教程

    背景介绍 随着人类地发展,社会地进步,计算机技术地更新迭代,每一片码海里都有它宝贵的财富,每一座码山里都有着各自的秘密.怎么守住财富,隐藏一些秘密,成了一些开发人员所关心的事情. 需求分析 简单地说, ...

  5. 【黑马pink老师的H5/CSS课程】(一)基本介绍

    视频P4~P6 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动 1.网页 1.1 什么是网页 网站是网页的集合,网页是构成网站的基本元素,常用html格式文件 1. ...

  6. Unsupported major.minor version 52.0 (unable to load class org.apache.kafka.clients.producer.Produce异常解决方法

    在控制台输入java -version,查看自己的版本是多少,我的查出来是1.8的.随后将服务器上的改为1.8的就可以了.

  7. 抓包整理外篇fiddler———— 会话栏与过滤器[二]

    前言 简单介绍一下会话栏和过滤器 正文 在抓包的时候这两个可以说是必用吧. 会话栏: 会话栏我这里介绍根据左边部分和右边部分. 左边部分是一些图标,有些人发现有个习惯,不习惯看图标. 其实说白了,我们 ...

  8. Spring框架系列(14) - SpringMVC实现原理之DispatcherServlet处理请求的过程

    前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet ...

  9. JDBCToolsV2:利用ThreadLocal保证当前线程操作同一个数据库连接对象。

    JDBCToolsV2:     利用ThreadLocal保证当前线程操作同一个数据库连接对象. package com.dgd.test; import com.alibaba.druid.poo ...

  10. 攻防世界MISC进阶区 61-63

    61.肥宅快乐题 得到swf文件,但是用PotPlayer打不开,用浏览器应该可以打开,打开后可以在npc的对话中看到一段base64 解密后就可以得到flag 62.warmup 得到一张png和一 ...