当前位置: 首页 > news >正文

项目代码第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并返回数据。

相关文章:

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

一、User 1、使用数据注解设置主键和外键 设置主键&#xff1a;在User类的U_uid属性上使用[Key]注解。 设置外键&#xff1a;在Order类中&#xff0c;创建一个表示外键的属性&#xff08;例如UserU_uid&#xff09;&#xff0c;并使用[ForeignKey]注解指定它引用User类的哪个…...

【linux 查看网卡设备信息命令记录】

查看设备信息命令 查看网卡芯片相关platform类型网卡(gmac网卡为例)PCI网卡(rtl8125为例) 查看网卡芯片相关 platform类型网卡(gmac网卡为例) gmac 属于CPU资源的一部分&#xff0c;属于平台设备。下面以FT2004 的CPU为例&#xff0c;自带GMAC0和GMAC1。 1、通过平台设备查看…...

springboot事务手动回滚报错

捕捉异常之后手动标记回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 没有嵌套事务&#xff0c;还是报Transaction rolled back because it has been marked as rollback-only异常错误 查看错误堆栈&#xff0c;service调用的方法外层还套…...

SQL 算术运算符:加法、减法、乘法、除法和取模的用法

什么是存储过程&#xff1f; 存储过程是一段预先编写好的 SQL 代码&#xff0c;可以保存在数据库中以供反复使用。它允许将一系列 SQL 语句组合成一个逻辑单元&#xff0c;并为其分配一个名称&#xff0c;以便在需要时调用执行。存储过程可以接受参数&#xff0c;使其更加灵活…...

C#是Unity 3D的默认语言,Unity 3D是一种领先的游戏引擎

C#或C-Sharp是一种比C更现代和灵活的编程语言&#xff0c;它也在游戏开发中广受欢迎。C#是Unity 3D的默认语言&#xff0c;Unity 3D是一种领先的游戏引擎&#xff0c;它为各种游戏提供动力&#xff0c;例如《口袋妖怪围棋》、《超级马里奥跑》和《神庙跑》。 Unity 3D也在虚拟…...

[创业之路-173]:《BLM战略规划》- 战略洞察 (战略能力中最最核心的能力) - 市场洞察 -3- 看竞争对手-要比你的竞争对手跟了解他们自己

目录 一、五看三定 二、看竞争 2.1 概述 1、分析竞争对手 2、进行价值链分析 3、紧盯标杆对手 4、关注新进入者和替代产品 5、制定竞争策略 2.2 看竞争的主要内容&#xff1a;背景信息、战略、价值定位、价值链、价值交付、组织架构、财务绩效 1、背景信息 2、战略 …...

Spark实训

实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…...

Linux之信号集基础

目录 前言一、信号集基础API浅析1.1 sigemptyset1.2 sigfillset1.3 sigaddset1.4 sigdelset1.5 signismember1.6 sigprocmask1.7 sigpending1.8 sigwait 二、demo演练2.1 sigismember检查信号2.2 主线程pthread_sigmask阻塞后无法捕捉到特定信号2.3 主线程pthread_sigmask阻塞后…...

unity3d—demo(实现给出图集名字和图片名字生成对应的图片)

目录 实现给出图集名字和图片名字生成对应的图片&#xff1a; 代码示例&#xff1a; dic: 键 是图集名称 值是一个字典 该字典键是图片名称 值是图片&#xff0c;结构如图&#xff1a; 测试代码&#xff1a; 结果&#xff1a; SpriteRenderer 讲解&#xff1a; Resour…...

烟草行业通过Profinet转EthernetIP网关打通数据壁垒

在工业自动化领域&#xff0c;Profinet转Ethernet/IP是两种广泛应用的工业以太网协议。它们各自具有独特的特点和优势&#xff0c;而在实际应用中&#xff0c;经常需要实现这两种协议之间的互通&#xff0c;这时就需要使用到开疆智能Profinet转Ethernet/IP网关KJ-EIP-108。同时…...

2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模 E题 校园供水系统智能管理 原题再现 校园供水系统是校园公用设施的重要组成部分&#xff0c;学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展&#xff0c;校园内已经普遍使用了智能水表&#xff0c;从而可以…...

ip地址显示本地局域网什么意思?ip地址冲突怎么解决

在日常使用网络的过程中&#xff0c;我们可能会遇到IP地址显示“本地局域网”的情况&#xff0c;同时&#xff0c;局域网内IP地址冲突也是一个常见且令人头疼的问题。本文将首先解释IP地址显示本地局域网的含义&#xff0c;随后详细探讨局域网IP地址冲突的解决方法&#xff0c;…...

[软件工程]八.软件演化

8.1什么是软件演化 由于种种不可避免的原因&#xff0c;系统开发完成后的软件需要进行修改来适应变更的需求&#xff0c;我们对软件的修改就叫软件演化。 8.2为什么软件会演化 由于业务的变更或者为了满足用户期待的改变&#xff0c;使得对已有的系统的新需求浮现出来。由于…...

【大数据学习 | 面经】yarn的资源申请和分配的单位-Container

在yarn中&#xff0c;资源的申请和分配是以container为单位进行的&#xff0c;而不是直接以application和task为单位。 每个提交到yarn上的应用程序&#xff08;application&#xff09;都有一个对应的ApplicationMaster&#xff08;AM&#xff09;。这个AM负责与ResourceMana…...

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…...

【组件封装】uniapp vue3 封装一个完整的Tabs(标签页)组件教程,功能由简到杂实现讲解。

文章目录 前言一、简单版Tabs代码实现&#xff1a; 二、下划线带动画的TabsAPI回顾&#xff1a;代码实现&#xff1a; 三、内容区域滑动切换切换动画代码实现&#xff1a;&#xff08;2&#xff09;禁用手势滑动切换&#xff08;3&#xff09;内容区域换为插槽 四、标签栏可滚动…...

TDesign:Picker 选择器

Picker 选择器 API文档地址 单列选择器用法 /// view onTap:(){TDPicker.showMultiPicker(context,data: [controller.coinList],title: ,rightTextStyle: TextStyle(color: AppColors.ColorMain),onConfirm: (selected) {controller.onTapCoin(selected);Navigator.of(contex…...

【AI赋能心理学论文创作策略】第十二章 AI辅助临床启示撰写指南

AI赋能心理学论文创作策略-系列文章目录 第十二章 AI辅助临床启示撰写指南 文章目录 AI赋能心理学论文创作策略-系列文章目录第十二章 AI辅助临床启示撰写指南 前言基础分析框架第一阶段&#xff1a;核心要素分析第二阶段&#xff1a;应用场景展开 关键环节提示第三阶段&#x…...

Pynsist 打包应用 和 PyWebIO 构建Web 应用

Pynsist&#xff1a;一键打包Python 应用代码为Windows 安装程序。 项目地址&#xff1a; https://github.com/takluyver/pynsist PyWebIO&#xff1a;为Python 开发者提供了一种快速、简洁的方式来创建Web 应用&#xff0c;无需学习前端技术 项目地址&#xff1a;https://g…...

git 使用配置

新拿到机器想配置git 获取代码权限&#xff0c;需要的配置方法 1. git 配置用户名和邮箱 git config --global user.name xxxgit config --global user.email xxemail.com 2. 生成ssh key ssh-keygen -t rsa -C "xxemail.com" 3. 获取ssh key cat ~/.ssh/id_rsa.…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...