【个人博客搭建】(14)仓储模式用户注册登录案例

1、准备工作:

        1.1、新建Users的控制器、接口、服务层文件;

        1.2、注入接口与服务层关系


builder.Services.AddTransient<IUsersService, UsersService>();

        1.3、添加MD5加密规则

 public static string GetMd5Hash(string input){//using System.Security.Cryptography;using (MD5 md5 = MD5.Create()){byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(input));StringBuilder sb = new StringBuilder();for (int i = 0; i < data.Length; i++){sb.Append(data[i].ToString("x2"));}return sb.ToString();}}

2、代码:

        2.1、控制器层:

/// <summary>
/// 用户管理
/// </summary>
[ApiVersionCustomRoute(SwaggerDocSettings.ApiVersions.v1)]
[ApiController]
public class UsersController : ControllerBase
{private readonly ILogger<UsersController> _logger;private readonly IUsersService _usersService;/// <summary>/// 构造函数/// </summary>/// <param name="logger"></param>public UsersController(ILogger<UsersController> logger, IUsersService usersService){_logger = logger;_usersService = usersService;}/// <summary>/// 登录/// </summary>/// <param name="para">入参</param>/// <returns></returns>[ApiVersionCustomRoute("Login", SwaggerDocSettings.ApiVersions.v1)][HttpPost]public async Task<ApiResult> GetUser(LoginUserParameters para){//验证if (string.IsNullOrWhiteSpace(para.UserName) || string.IsNullOrWhiteSpace(para.PassWord)){return ApiResultHelper.Error("请输入账号或密码!");}var result = await _usersService.GetUser(para);return result;}/// <summary>/// 注册/// </summary>/// <param name="para">入参</param>/// <returns></returns>[ApiVersionCustomRoute("Register", SwaggerDocSettings.ApiVersions.v1)][HttpPost]public async Task<ApiResult> AddUser(RegisterUserParameters para){//验证(ps:邮箱验证码先搁置)if (string.IsNullOrWhiteSpace(para.UserName) || string.IsNullOrWhiteSpace(para.PassWord)){return ApiResultHelper.Error("请输入账号或密码!");}var result = await _usersService.AddUser(para);return result;}
}

        2.2、接口层:

public interface IUsersService
{Task<ApiResult> GetUser(LoginUserParameters login);Task<ApiResult> AddUser(RegisterUserParameters register);
}

         2.3、服务层:

        public async Task<ApiResult> AddUser(RegisterUserParameters para){//1、查询数据var entity = await _usersRep.Context.Queryable<Users>().Where(t => t.UserName == para.UserName).FirstAsync();if (entity != null){return ApiResultHelper.Error("用户名已被占用!");}//2、构建实体var md5Pwd = MD5Helper.GetMd5Hash(para.PassWord);Users user = new Users(){UserName = para.UserName,PassWord = md5Pwd,PhoneNumber = "",Email = para.Email,UserStatus = UsersEnum_UserStatus.ok,Gender = UsersEnum_Gender.secrecy,OpenId = "",Avatar = "",//后添加个头像库Admire = "",SubScribe ="",Introduction = "",UserType = UsersEnum_UserType.other,CreateBy = 0,CreateTime = DateTime.Now,UpdateBy = 0,UpdateTime = null,};//3、执行新增var bl = await _usersRep.InsertAsync(user);//4、返回结果if (!bl){return ApiResultHelper.Error("注册失败!请联系博主");}return ApiResultHelper.Success(bl);}public async Task<ApiResult> GetUser(LoginUserParameters para){var md5Pwd = MD5Helper.GetMd5Hash(para.PassWord);//1、查询数据var entity = await _usersRep.Context.Queryable<Users>().Where(t => t.UserName == para.UserName && t.PassWord == md5Pwd).FirstAsync();if (entity == null){return ApiResultHelper.Error("账号或密码错误!");}//2、生成tokenJwtClaim jwtClaim = new JwtClaim(){Id = entity.Id.ToString(),Name = entity.UserName,NickName = entity.UserName,UserType = ((int)entity.UserType).ToString(),Roles = "",Menus = ""};var token = JwtHelper.GenerateToken(jwtClaim);return ApiResultHelper.Success(token);}

3、测试:

        这里不再赘述了,(已测试通过)

4、拓展:

        4.1、添加相关日志记录

        4.1、登录接口限流(后续新建文章补充)

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

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

相关文章

探索RadSystems:低代码开发的新选择(三)

系列文章目录 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;一&#xff09;&#x1f6aa; 探索RadSystems&#xff1a;低代码开发的新选择&#xff08;二&#xff09;&#x1f6aa; 文章目录 系列文章目录前言一、RadSystems Studio是什么&#xff1f;二、操作日…

【北京迅为】《iTOP龙芯2K1000开发指南》-第一部分 龙芯CPU的前世今生

龙芯2K1000处理器集成2个64位GS264处理器核&#xff0c;主频1GHz&#xff0c;以及各种系统IO接口&#xff0c;集高性能与高配置于一身。支持4G模块、GPS模块、千兆以太网、16GB固态硬盘、双路UART、四路USB、WIFI蓝牙二合一模块、MiniPCIE等接口、双路CAN总线、RS485总线&#…

机器学习理论基础—神经网络算法公式学习

机器学习理论基础—神经网络公式学习 M-P神经元 M-P神经元&#xff08;一个用来模拟生物行为的数学模型&#xff09;&#xff1a;接收n个输入(通常是来自其他神经 元)&#xff0c;并给各个输入赋予权重计算加权和&#xff0c;然后和自身特有的阈值进行比较 (作减法&#xff0…

​「Python绘图」绘制小猪佩奇

python 绘制小猪佩奇 一、预期结果 二、核心代码 import turtle print("开始绘制小猪佩奇") pen turtle.Turtle() pen.pensize(4) #pen.hideturtle()pen.speed(1000)pen.color("#ff9bc0","pink") pen.setheading(-30) pen.pu() pen.goto(-100,…

LLM学习笔记-2

在未标记数据上进行预训练 本章概要 在上节的笔记中&#xff0c;因为训练出的效果&#xff0c;并不是特别理想&#xff0c;在本节中&#xff0c;会用数据进行训练&#xff0c;使得模型更加的好&#xff1b; 计算文本生成损失 inputs torch.tensor([[16833, 3626, 6100],…

ARP 攻击神器:ARP Spoof 保姆级教程

一、介绍 arpspoof是一种网络工具&#xff0c;用于进行ARP欺骗攻击。它允许攻击者伪造网络设备的MAC地址&#xff0c;以欺骗其他设备&#xff0c;并截获其通信。arpspoof工具通常用于网络渗透测试和安全评估&#xff0c;以测试网络的安全性和漏洞。 以下是arpspoof工具的一些…

TensorRT plugins and ONNX parser编译

https://github.com/NVIDIA/TensorRT是TensorRT plugins and ONNX parser&#xff0c;并不包含TensorRT的nvinfer库&#xff08;libinfer.so、nvinfer.dll&#xff09;&#xff0c;此部分并未开源&#xff0c;只能使用官方支持的平台、环境https://developer.nvidia.com/tensor…

科技改变视听4K 120HZ高刷新率的投影、电视、电影终有用武之地

早在1888年&#xff0c;法国生理学家埃蒂安朱尔马莱就发明了一套盒式摄像机&#xff0c;能以120帧/s的速度在一条纸膜上曝光照片&#xff0c;但是当时没有相匹配的放映设备。而马莱的另一套拍摄设备是60帧/s的规格&#xff0c;并且图像质量非常好。 受此启发&#xff0c;雷诺的…

【软件测试基础】黑盒测试(知识点 + 习题 + 答案)

《 软件测试基础持续更新中》 对于黑盒测试这一章&#xff0c;等价类划分、边界值测试、决策表、场景法&#xff0c;这四种是最容易出大题的&#xff0c;其他几种考察频率很低。下述的一些例题只是经典例题&#xff0c;掌握方法后&#xff0c;还要多加练习&#xff01; 目录 3…

极快!宝藏EI,2-4周录用,接受范围广!

本周投稿推荐 SSCI • 2/4区经管类&#xff0c;2.5-3.0&#xff08;录用率99%&#xff09; SCIE&#xff08;CCF推荐&#xff09; • 计算机类&#xff0c;2.0-3.0&#xff08;最快18天录用&#xff09; SCIE&#xff08;CCF-C类&#xff09; • IEEE旗下&#xff0c;1/2…

短信视频提取批量工具,免COOKIE,博主视频下载抓取,爬虫

痛点&#xff1a;关于看了好多市面的软件&#xff0c;必须要先登录自己的Dy号才能 然后找到自己的COOKIE 放入软件才可以继续搜索&#xff0c;并且无法避免长时间使用 会导致无法正常显示页面的问题。 有没有一种方法 直接可以使用软件&#xff0c;不用设置的COOKIE的方法呢 …

文献速递:肺癌早期诊断---利用低剂量CT扫描的三维概率深度学习系统用于肺癌的检测与诊

Title 题目 A 3D Probabilistic Deep Learning System forDetection and Diagnosis of Lung Cancer Using Low-Dose CT Scans 利用低剂量CT扫描的三维概率深度学习系统用于肺癌的检测与诊 01文献速递介绍 肺癌既是最常见的癌症之一&#xff0c;也是导致癌症死亡的主要原因之…

【GNS3 GraduProj】交换机Ansible配置脚本(文件备份)

为交换机S1、S2、S3分别创建VLAN、并进行Access接口的配置&#xff0c;同时对所有交换机进行Trunk接口的全局自动配置。 所有Switches的脚本合并&#xff1a;SwitchesConfig.yml --- - name: Switches Global Configurationhosts: Switchesgather_facts: falseconnection: ne…

关于yolov8-class Pose(Detect)

下面看一下代码&#xff1a; class Pose(Detect):"""YOLOv8 Pose head for keypoints models."""def __init__(self, nc80, kpt_shape(17, 3), ch()):"""Initialize YOLO network with default parameters and Convolutional La…

【笔记】应对Chrome更新导致Chromedriver失效的解决方案:Chrome For Test

随着网络应用和网站的不断发展&#xff0c;自动化测试变得越来越重要&#xff0c;而Selenium成为了许多开发者和测试人员的首选工具之一。然而&#xff0c;对于使用Selenium来进行网站测试的人来说&#xff0c;Chrome浏览器的频繁更新可能会成为一个头疼的问题。每当Chrome更新…

Docker容器:镜像与容器管理命令

目录 一、镜像管理命令 1、搜索镜像 2、获取镜像 3、镜像加速下载 4、查看下载的镜像文件信息 5、查看下载到本地的所有镜像 6、获取指定镜像的详细信息 7、为本地的镜像添加新的标签 8、删除镜像 8.1 删除指定的镜像 8.2 批量删除多个镜像 9、导出镜像与导入镜像 …

Day 32 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

买卖股票的最佳时期Ⅱ 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你…

[Android]使用CompositionLocal隐式传值

1.相关概念 CompositionLocal 是定义数据的方式&#xff0c;而 CompositionLocalProvider 是在 Compose UI 树中传递这些数据的工具。二者合作&#xff0c;为 Compose 应用提供了一个强大的状态和数据流管理机制&#xff0c;使得数据可以在组件间按需传递&#xff0c;而无需通…

使用Python实现批量删除MYSQL数据库的全部外键

我先说下场景&#xff0c;昨天因为我们使用了Java工作流框架flowable&#xff0c;它自动生成了许多工作流相关的表&#xff0c;但是这些表都有外键关联&#xff0c;如果单纯的使用sql语句去一个一个的删除外键&#xff0c;那会非常麻烦&#xff0c;所以我写了一个Python脚本来进…

云上如何实现 Autoscaling: AutoMQ 的实战经验与教训

01 背景 弹性是云原生、Serverless 的基础。AutoMQ 从软件设计之初即考虑将弹性作为产品的核心特质。对于 Apache Kafka 而言&#xff0c;由于其存储架构诞生于 IDC 时代&#xff0c;针对物理硬件设计&#xff0c;存储层强依赖本地存储&#xff0c;已不能很好地适应现在云的时…