Wpf 使用 Prism 实战开发Day15

用户登录和注册接口


一.创建用户登录注册控制器(LoginController)

    /// <summary>/// 用户登录注册控制器/// </summary>[ApiController][Route("api/[controller]/[action]")]public class LoginController: ControllerBase{}

二.创建用户登录注册数据传输层(UserDto)并继承基类(BaseDto)

所有的Dto类都要实现通知绑定的原因是:客户端项目是WPF,WPF在进行属性值绑定要通知前端更新的时候,需要用到这个功能。即属性通知绑定。这一章节有介绍!

 public class UserDto:BaseDto{private string userName;public string UserName{
get { return userName; }
set { userName = value;OnPropertyChanged(); }}private string account;public string Account{
get { return account; }
set { account = value;OnPropertyChanged(); }}private string passWord;public string PassWord{
get { return passWord; }
set { passWord = value; OnPropertyChanged(); }}}

三.把实体类(Entity)和数据传输类(Dto)进行配置 AutoMapper 关系映射

    public class AutoMapperProFile:MapperConfigurationExpression{public AutoMapperProFile(){/// 实体类和数据传输类进行映射CreateMap<ToDo, ToDoDto>().ReverseMap();CreateMap<Memo, MemoDto>().ReverseMap();CreateMap<User, UserDto>().ReverseMap();}}

四.创建和实现用户登录和注册服务接口

接口定义和接口实现命名规范,这章节也有介绍。后续所有章节不再带入了。

1.创建用户登录注册接口(ILoginService),该接口提供2个方法:用户登录和用户注册。

    public interface ILoginService{/// <summary>/// 用户登录/// </summary>/// <param name="account">账户名</param>/// <param name="password">密码</param>/// <returns></returns>Task<ApiResponse> LoginAsync(string account,string password);/// <summary>/// 用户注册/// </summary>/// <param name="user">用户数据实体</param>/// <returns></returns>Task<ApiResponse> ResgiterAsync(UserDto user);}

2.实现用户登录和注册接口服务(LoginService),需要继承自(ILoginService)

 public class LoginService : ILoginService{private readonly IUnitOfWork work;private readonly IMapper mapper;public LoginService(IUnitOfWork work,IMapper mapper){this.work = work;this.mapper = mapper;}public async Task<ApiResponse> LoginAsync(string account, string password){try{var model= await work.GetRepository<User>().GetFirstOrDefaultAsync(predicate:i=>(i.Account.Equals(account)) && (i.PassWord.Equals(password)));if (model == null) return new ApiResponse("账号或密码错误,请重试!");return new ApiResponse(true,model);//成功则返回该账户的所有数据实体}catch (Exception ex){return new ApiResponse(false,$"登录失败,{ex.Message}");}}public async Task<ApiResponse> ResgiterAsync(UserDto user){try{var model=mapper.Map<User>(user);//把数据传输类转换成实体类var repository= work.GetRepository<User>();var userModel=await repository.GetFirstOrDefaultAsync(predicate:x=>x.Account.Equals(model.Account)); //根据账户查,该账户是否已存在if(userModel != null) return new ApiResponse($"当前账户{model.Account}已存在,请重新注册!");model.CreateDate = DateTime.Now;await repository.InsertAsync(model);if(await work.SaveChangesAsync() > 0){return new ApiResponse(true,model);//成功则返回新用户所有数据实体}return new ApiResponse($"账户{model.Account}注册失败!");}catch (Exception ex){return new ApiResponse($"注册账户失败!{ex.Message}");}}}
  • predicate 是一个参数,用于指定查询的条件。它是一个匿名函数或Lambda表达式,用于筛选集合中的元素,返回一个布尔值来指示元素是否满足条件。
  • 新用户进行注册的时候,可以把密码进行MD5加密或其他方式加密后再存储到数据库,这里就不再进行实现了。

五.进行用户登录注册控制器(LoginController)服务注入,实现服务逻辑调用。

    /// <summary>/// 用户登录注册控制器/// </summary>[ApiController][Route("api/[controller]/[action]")]public class LoginController: ControllerBase{private readonly ILoginService service;public LoginController(ILoginService service){this.service = service;}[HttpGet]public async Task<ApiResponse> Login(string account, string password) => await service.LoginAsync(account, password);[HttpPost]public async Task<ApiResponse> Resgiter([FromBody] UserDto user) => await service.ResgiterAsync(user);}

六.最后在 Program.cs 中进行LoginService 服务依赖注入

builder.Services.AddTransient<ILoginService, LoginService>();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

houdini fft 使用三层for each结构 以及for 问题

for each 中 使用 attrib wrangle detail时&#xff0c;不连接foreach_count1&#xff0c;只运行一次 for each 问题 merge eachiteration 对结构进行合并 transform 位置的移动针对的是原位置对原点的距离&#xff0c;而非移动后置0后再移

【C++】list容器功能模拟实现

介绍 上一次介绍了list队容器的迭代器模拟&#xff0c;这次模拟实现list的简单功能&#xff0c;尤其要注意构造函数、析构函数、以及赋值运算符重载的实现。 list容器需要接纳所有类型的数据&#xff0c;因此&#xff0c;结构设置与迭代器设置同理&#xff0c;需要引入结点&…

Python中的open与JSON的使用

目录 1 使用 open 函数进行文件操作 2 使用 json 模块进行 JSON 数据处理&#xff1a; 2.1 写入JSON 文件 2.2 读取JSON 文件 在 Python 中&#xff0c;open 函数和 json 模块常用于文件的读写和 JSON 数据的处理。 1 使用 open 函数进行文件操作 open 函数用于打开文件…

“智汇语言·驭领未来”——系列特辑:LLM大模型信息获取与企业应用变革

“智汇语言驭领未来”——系列特辑&#xff1a;LLM大模型信息获取与企业应用变革 原创 认真的飞速小软 飞速创软 2024-01-16 09:30 发表于新加坡 本期引言 LLM&#xff08;Large Language Model&#xff09;大型语言模型以其自然语言理解和生成能力&#xff0c;正以前所未有的…

libtorch学习第六

构建卷积网络 #include<torch/torch.h> #include<torch/script.h> #include<iostream>using std::cout; using std::endl;class LinearBnReluImpl : public torch::nn::Module { private:torch::nn::Linear ln{ nullptr };torch::nn::BatchNorm1d bn{ nullp…

开源的测试平台快2千星了,能带来多少收益呢

最近看了下自己去年初开源的测试平台&#xff0c;star一起算的话也到1.7k了&#xff1a; 做开源的初心一方面是想把自己的理解和思想展示出来&#xff0c;另一方面是想进一步打造个人IP&#xff0c;提升影响力&#xff08;其实这个想法很早之前就有了&#xff0c;计划过无数次但…

Day 28 | 回溯 93.复原IP地址 、78.子集 、 90.子集II

93.复原IP地址 题目 文章讲解 视频讲解 思路&#xff1a;每轮开始的位置需要变化就需要设置start class Solution {List<String> result new ArrayList<>();public List<String> restoreIpAddresses(String s) {if (s.length() < 4 ||s.length() >…

服务器数据恢复—服务器进水导致阵列中磁盘同时掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 数台服务器数台存储阵列柜&#xff0c;共上百块硬盘&#xff0c;划分了数十组lun。 服务器故障&检测&#xff1a; 外部因素导致服务器进水&#xff0c;进水服务器中一组阵列内的所有硬盘同时掉线。 北亚数据恢复工程师到达现场后发现机房内…

Shopee夏季选品策略:吸引消费者,提高销售的10个有效方法

在Shopee平台上进行夏季选品时&#xff0c;卖家需要采取一些策略来吸引消费者并提高销售。本文将介绍十个有效的方法&#xff0c;帮助卖家在夏季市场做好准备&#xff0c;提供符合季节需求的产品&#xff0c;从而提高销售业绩。 先给大家推荐一款shopee知虾数据运营工具知虾免…

System.Data.SqlClient.SqlException:“在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

目录 背景: 过程: SQL Express的认识: 背景: 正在运行程序的时候&#xff0c;我遇到一个错误提示&#xff0c;错误信息如下&#xff0c;当我将错误信息仔细阅读了一番&#xff0c;信息提示的很明显&#xff0c;错误出现的来源就是连接数据库代码这块string connStr "s…

【Linux工具篇】编辑器vim

目录 vim的基本操作 进入vim(正常模式&#xff09; 正常模式->插入模式 插入模式->正常模式 正常模式->底行模式 底行模式->正常模式 底行模式->退出vim vim正常模式命令集 vim插入模式命令集 vim末行模式命令集 vim操作总结 vim配置 Linux编译器…

服务器的异步通信——RabbitMQ

目录 一、同步通信 VS 异步通信 二、MQ——消息队列 RabbitMQ RabbitMQ安装 RabbitMQ的整体架构 常见消息模型 基本消息队列&#xff08;BasicQueue&#xff09; 工作消息队列&#xff08;WorkQueue&#xff09; 发布、订阅&#xff08;Publish、Subscribe&#xff0…

CSS文本外观属性内容(知识点1)

知识引入 使用HTML可以对文本外观进行简单的控制&#xff0c;但是效果并不理想&#xff0c;为此CSS提供了一系列的文本外观样式属性&#xff0c;具体如下。 color:文本颜色 color属性用于定义文本的颜色&#xff0c;其取值方式有以下三种。 &#xff08;1&#xff09;预定义…

爬取的数据可以入表吗?怎样入表?

合规是数据入表的前提。当前爬虫数据是非常敏感的&#xff0c;因为爬虫极容易造成两大不合规的问题&#xff1a;一是没有经过个人同意获取数据&#xff0c;二是爬取的数据里可能含有个人敏感信息也是一个问题。现在法律对于这部分非常严苛&#xff0c;如果企业里有50条未获得授…

前端基础(三十八):iframe通信、浏览器跨窗口通信

iframe通信 - MessageChannel <!-- index.html --> <h3>MessageChannel</h3> <input id"input" type"text" oninput"handleInput(this.value)" /> <hr /> <iframe src"./demo.html"></iframe&…

HCIA——25FTP 的工作原理、功能、TFTP、控制连接、数据连接的选择、解答

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

第2章-OSI参考模型与TCP/IP模型

目录 1. 引入 2. OSI参考模型 2.1. 物理层 2.2. 数据链路层 2.3. 网络层 2.4. 传输层 2.5. 会话层 2.6. 表示层 2.7. 应用层 3. 数据的封装与解封装 4. TCP/IP模型 4.1. 背景引入 4.2. TCP/IP模型&#xff08;4层&#xff09; 4.3. 拓展 1. 引入 1&#xff09;产…

char const char* 类型的实参与LPCWSTR 类型的形参类型不兼容

点击项目->项目属性 在高级中点击字符集->选择使用多字节字符集 ———————————————————————— 如果还是显示报错&#xff0c;关闭项目&#xff0c;重新进一下项目&#xff0c; 我的当时就是找了好久&#xff0c;都是以上方法&#xff0c;然后重新…

业务连续性演练在软件中的重要性

随着现代社会对信息技术的依赖程度不断增加&#xff0c;软件系统的业务连续性变得至关重要。业务连续性演练成为保障软件系统在各种不可预测情况下能够持续运行的关键措施。本文将探讨业务连续性演练在软件中的重要性以及它为组织提供的价值。 1. 灾难恢复能力的验证 业务连续性…

5G+物联网:连接万物,重塑智慧社区,开启未来生活新纪元,助力智慧社区的革新与发展

一、5G与物联网&#xff1a;技术概述与基础 随着科技的飞速发展&#xff0c;第五代移动通信技术&#xff08;5G&#xff09;和物联网&#xff08;IoT&#xff09;已经成为当今社会的热门话题。这两项技术作为现代信息社会的核心基础设施&#xff0c;正深刻地改变着人们的生活和…