项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面

一、User

1、使用数据注解设置主键和外键

  1. 设置主键:在User类的U_uid属性上使用[Key]注解。

  2. 设置外键:在Order类中,创建一个表示外键的属性(例如UserU_uid),并使用[ForeignKey]注解指定它引用User类的哪个属性。同时,在导航属性上使用[Required](如果外键不允许为空)和[InverseProperty](用于指定反向导航属性,可选)注解。

但是,通常我们会将外键属性的名称设置为与它所引用的主键属性名称相同(或遵循某种命名约定),这样EF可以自动推断出外键关系,而无需显式使用[ForeignKey]注解。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;namespace WebServerTest.Models
{public class User{[Key]public int U_uid { get; set; }public string U_name { get; set; }public string U_password { get; set; }public string U_email { get; set; }public string U_identity { get; set; }// 导航属性public ICollection<Order> Orders { get; set; }}public class Order{[Key]public int OrderId { get; set; }public string OrderDetails { get; set; }// 外键属性(通常与所引用的主键属性名称相同或遵循命名约定)public int U_uid { get; set; }// 导航属性[ForeignKey("U_uid")] // 实际上,如果属性名称与User类中的主键名称相同,这个注解可以省略public User User { get; set; }}
}

2、连接Mysql数据库

1>安装必要的 NuGet 包

  • Pomelo.EntityFrameworkCore.MySql:这是一个流行的 Entity Framework Core 提供程序,用于与 MySQL 数据库交互。
  • Microsoft.EntityFrameworkCore.Tools(可选):这个包提供了一些有用的工具,比如迁移工具。

2>ServerVersion 参数

        这个参数的缺失可能会导致问题,特别是当 MySql 提供程序需要知道服务器的确切版本来正确处理某些数据库特性或行为时。

        通常,如果你不确定服务器的版本,或者想要避免在多个地方硬编码版本信息,使用 ServerVersion.AutoDetect(connectionString) 是一个好方法。它会尝试根据提供的连接字符串自动检测服务器的版本。

3>每一次添加新表、修改现有表的结构或进行其他数据库架构更改时,都要迁移使用:Add-Migration MyMigration -Context和 更新数据库使用:update-database

  1. 查看现有迁移
    首先,通过“程序包管理器控制台”(Package Manager Console)运行以下命令来查看当前项目中的所有迁移:

    Get-Migration

    这个命令会列出所有已生成的迁移文件及其顺序。

  2. 删除迁移文件
    找到你想要删除的迁移文件(通常是上一次生成的迁移文件),并手动从项目的“Migrations”文件夹中删除它。

  3. 回退数据库
    由于迁移文件已经被删除,你需要将数据库架构回退到上一次迁移之前的状态。这可以通过在“程序包管理器控制台”中运行以下命令来实现:

    Update-Database -TargetMigration [PreviousMigrationName]

    其中 [PreviousMigrationName] 是上一次迁移之前的迁移名称。如果这是你的第一个迁移并且你想要完全重置数据库,你可能需要使用 -TargetMigration:0(这取决于你的具体迁移配置,有时可能是其他值,比如一个特殊的起始迁移名称)。

    请注意,回退数据库可能会导致数据丢失,特别是如果删除的迁移包含了破坏性更改(如删除表或列)。因此,在执行此操作之前,请确保你已经备份了数据库。

  4. 清理迁移历史记录(可选)
    如果你想要完全清理迁移历史记录(即删除 __EFMigrationsHistory 表中的记录),你需要手动执行 SQL 脚本来删除这些记录。但是,这通常是不推荐的,因为它可能会导致数据库与迁移记录不一致。更好的做法是让迁移历史记录保持原样,以便将来可以轻松地跟踪和回退迁移。

4>全局取消跟踪机制

二、User的增删改查

1、[HttpGet("{id}")]

1>使用 .FindAsync 查找用户:使用主键索引,异步地从数据库中查找一个实体。

注意:它只查找主键列,而不是表中的所有列。

如果 FindAsync 方法返回 null,这意味着在数据库中没有找到具有指定 id 的用户实体。在这种情况下,您的代码返回 NotFound(),这是一个HTTP 404状态码,表示请求的资源不存在。

2>加上通过邮箱查询

  • ToList

    • 是一个同步方法,会立即执行并将结果加载到内存中。
    • 如果处理的集合非常大,可能会阻塞当前线程并影响应用程序的响应性。
  • ToListAsync

    • 是一个异步方法,会返回一个Task<List<T>>对象,表示异步操作的任务。
    • 使用await关键字可以等待异步操作完成并获取结果。
    • 在等待期间,当前线程不会被阻塞,可以继续执行其他任务。

2、[HttpPut("{id}")]

1>_context.Entry(user).State = EntityState.Modified;

        //设置实体状态为修改,意味着打算更新该实体的某些属性

Entry 提供了对实体跟踪信息的访问,包括实体的当前状态、哪些属性已被修改等。

2>.FirstOrDefault()

  • .First() 方法用于获取序列中的第一个元素。如果序列为空,则会抛出异常。
  • .FirstOrDefault() 方法也用于获取第一个元素,但如果序列为空,则返回默认值(对于引用类型,默认值为null;对于值类型,默认值为0false等)。

3、[HttpPost]

1>DbUpdateException数据库更新异常

通常发生在尝试执行数据库操作时,由于某些原因(如违反唯一性约束)操作失败。

2>Conflict(),表示请求由于冲突而失败。

这通常用于HTTP请求中,表示客户端请求的资源状态与服务器当前状态冲突。

3>else { throw; }:重新抛出捕获的异常

如果UserExists方法返回false(即不存在具有相同U_uid的用户),则重新抛出捕获的异常。这意味着异常将被传递给调用者,可能需要进一步的处理或记录。

4、[HttpDelete("{id}")]

三、User相关的后端接口对应的前端界面

1、后端只有UsersController.cs、OnlineUsersController.cs、LoginController.cs

UsersController.cs:获取所有用户信息,对用户进行增删改查。更新到日志Logger中(数据库中的OperationLogs表格)。

LoginController.cs:对应登录界面,验证用户账号和密码是否相同。然后再生成相应的Token值。

OnlineUsersController:利用WebSocket获取在线的ID。

2、前端对应的

1>用户管理——在线

2>用户管理——管理

有四个地方调用了"/api/users",

 3>用户管理——注册界面:这里注册成功会出现Token

前端调用的是UsersController.cs和LoginController.cs,没有写另外的控制器

4>登录Login界面

Token:前端用的是会话保存方式。这样只要用户不关闭这个界面,就能保存token信息。

如果前端使用cookie,那么点开这个界面,会弹出提示框:是否接受所有的cookie,得去点。

三、LoginUser:判断登录账号密码是否相同,创建token(即JWT)【理解见项目代码第1讲二、】

1、什么是token?——一种安全令牌,用于在客户端和服务器之间传递认证和授权信息。它可以包含用户的身份信息、权限等。

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

2、实现Token:常见方式是JWT(JSON Web Token)

JWT是一种基于JSON的开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT通常用于身份验证和信息交换,因为它包含三个部分:Header(头部)、Payload(负载)、Signature(签名),分别用于指定使用的算法、存储实际传输的数据以及确保数据完整性。

3、 学习JWT的token身份认证方案

从下图中我们可以看出它是基于Token的身份认证。

具体流程:客户端携带用户名和密码请求访问 - 服务器校验用户凭据 - 应用提供一个token给客户端 - 客户端存储token,并且在随后的每一次请求中都带着它 -服务器校验token并返回数据。

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

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

相关文章

使用mtools搭建MongoDB复制集和分片集群

mtools介绍 mtools是一套基于Python实现的MongoDB工具集&#xff0c;其包括MongoDB日志分析、报表生成及简易的数据库安装等功能。它由MongoDB原生的工程师单独发起并做开源维护&#xff0c;目前已经有大量的使用者。 mtools所包含的一些常用组件如下&#xff1a; mlaunch支…

nginx不允许静态文件被post请求显示405 not allowed

在单独站点的配置文件中 添加error_page 405 200 $request_uri; 即可&#xff01;

MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了&#xff0c;这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…

MFC工控项目实例三十五读取数据库数据

点击按钮打开文件夹中的数据文件生成曲线 相关代码 void CSEAL_PRESSUREDlg::OnTesReport() {CFileDialog dlgOpen(TRUE/*TRUE打开&#xff0c;FALSE保存*/,0,0,OFN_NOCHANGEDIR|OFN_FILEMUSTEXIST,"All Files(mdb.*)|*.*||",//文件过滤器NULL);CString mdb_1, m…

反向传播算法中的误差项

背景 在反向传播算法中&#xff0c;我们需要计算每个神经元的误差项&#xff0c;以便更新网络中的权重。对于输出层的神经元&#xff0c;误差项的计算公式如下&#xff1a; 其中&#xff1a; E是损失函数&#xff08;例如均方误差&#xff09;。 zk 是输出层神经元的加权输入&a…

数学建模之RSR秩和比综合评价法(详细)

RSR秩和比综合评价法 一、概述 秩和比法(Rank-sum ratio&#xff0c;简称RSR法)是我国学者田凤调于1988年提出的&#xff0c;田教授是我国杰出的卫生统计学家&#xff0c;该方法最初提出时用于解决医学卫生领域的综合评价问题&#xff0c;后经各领域学者的补充和完善&#xf…

android WebRtc 无法推流以及拉流有视频无声音问题

最近在开发使用WebRtc进行视频通话和语音通话&#xff0c;我使用的设备是MTK的手机&#xff0c;期间后台的技术人员几乎没法提供任何帮助&#xff0c;只有接口和测试的web端&#xff0c;有遇到不能推流。推流成功网页端有画面有声音&#xff0c;但是安卓端有画面&#xff0c;没…

RNACOS:用Rust实现的Nacos服务

RNACOS是一个使用Rust语言开发的Nacos服务实现&#xff0c;它继承了Nacos的所有核心功能&#xff0c;并在此基础上进行了优化和改进。作为一个轻量级、快速、稳定且高性能的服务&#xff0c;RNACOS不仅包含了注册中心、配置中心和Web管理控制台的功能&#xff0c;还支持单机和集…

OpenTK为SkiaSharp在.NET 环境下提供OpenGL支持,使其进行高效的2D渲染

前言 在 .NET 环境下&#xff0c;OpenTK 为 SkiaSharp 提供了 OpenGL 支持&#xff0c;使得 SkiaSharp 能够利用 OpenGL 进行高效的 2D 渲染。这种结合能够充分发挥 GPU 的加速能力&#xff0c;从而提升渲染性能&#xff0c;尤其是在需要进行复杂图形处理或频繁更新的应用中&a…

Linux-FrameBuffer设备(LCD)应用编程

本章学习 Linux 下的 Framebuffer 应用编程&#xff0c;通过对本章内容的学习&#xff0c;大家将会了解到 Framebuffer 设备究竟是什么&#xff1f;以及如何编写应用程序来操控 FrameBuffer 设备。 本章将会讨论如下主题。 ⚫ 什么是 Framebuffer 设备&#xff1f; ⚫ LCD 显示…

IDEA中MAVEN的一些设置问题

关于IDEA中MAVEN的一些设置问题 这三个配置的作业分别是什么呢&#xff1f; 在这张截图中&#xff0c;Maven的三个设置分别是&#xff1a; Maven home path (Maven主目录路径)&#xff1a; 这是Maven的安装路径&#xff0c;指向Maven的主目录。通常包含 bin、conf 等文件夹。用…

HBU深度学习实验14.5-循环神经网络(1.5)

梯度爆炸实验 造成简单循环网络较难建模长程依赖问题的原因有两个&#xff1a;梯度爆炸和梯度消失。一般来讲&#xff0c;循环网络的梯度爆炸问题比较容易解决&#xff0c;一般通过权重衰减或梯度截断可以较好地来避免&#xff1b;对于梯度消失问题&#xff0c;更加有效的方式…

Leetcode经典题4--查找数组中的多数元素+Boyer-Moore 投票算法

题目描述&#xff1a; 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 输入输出示例 输入&#xff1a;nums [2,2,1,1,1,2,2] 输出…

android studio 读写文件操作(应用场景二)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;readtextviewIDsaveandread 本例程是个过渡例程&#xff0c;如果单是实现下图的目的有更简单的方法&#xff0c;但这个方法是下一步工作的基础&#xff0c;所以一定要做。 例程功能&#xff1a;将两个textvi…

【NLP 9、实践 ① 五维随机向量交叉熵多分类】

目录 五维向量交叉熵多分类 规律&#xff1a; 实现&#xff1a; 1.设计模型 2.生成数据集 3.模型测试 4.模型训练 5.对训练的模型进行验证 调用模型 你的平静&#xff0c;是你最强的力量 —— 24.12.6 五维向量交叉熵多分类 规律&#xff1a; x是一个五维(索引)向量&#xff…

windows文件下换行, linux上不换行 解决CR换行符替换为LF notepad++

html文件是用回车换行的&#xff0c;在windows电脑上&#xff0c;显示正常。 文件上传到linux服务器后&#xff0c;文件不换行了。只有一行。而且相关js插件也没法正常运行。 用notepad查看&#xff0c;显示尾部换行符&#xff0c;是CR&#xff0c;这就是原因。CR是不被识别的。…

Unity 模拟百度地图,使用鼠标控制图片在固定区域内放大、缩小、鼠标左键拖拽移动图片

效果展示&#xff1a; 步骤流程&#xff1a; 1.使用的是UGUI&#xff0c;将下面的脚本拖拽到图片上即可。 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;public class CheckImage : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragH…

游戏引擎学习第30天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 在这段讨论中&#xff0c;重点是对开发过程中出现的游戏代码进行梳理和进一步优化的过程。 工作回顾&#xff1a;在第30天&#xff0c;回顾了前一天的工作&#xff0c;并提到今天的任务是继续从第29天的代码开始&#xff0c…

基于MFC绘制门电路

MFC绘制门电路 1. 设计内容、方法与难点 本课题设计的内容包括了基本门电路中与门和非门的绘制、选中以及它们之间的连接。具体采用的方法是在OnDraw函数里面进行绘制&#xff0c;并设计元器件基类&#xff0c;派生出与门和非门&#xff0c;并组合了一个引脚类&#xff0c;在…

【text2sql】低资源场景下Text2SQL方法

SFT使模型能够遵循输入指令并根据预定义模板进行思考和响应。如上图&#xff0c;、 和 是用于通知模型在推理过程中响应角色的角色标签。 后面的内容表示模型需要遵循的指令&#xff0c;而 后面的内容传达了当前用户对模型的需求。 后面的内容代表模型的预期输出&#xff0c;也…