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

news2025/1/6 18:09:14

一、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.coloradmin.cn/o/2255227.html

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

相关文章

android 富文本及展示更多组件

模拟微博 #热贴 和 用户 的这种 富文本形式组件&#xff0c;不说了&#xff0c; 直接上代码 package com.tongtong.feat_watch.viewimport android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.LayoutInflater impo…

【踩坑】修复报错libcurl.so.4、LIBFFI_BASE_7.0、libssl.so.3

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ libcurl.so.4&#xff1a; sudo apt install curl -y LIBFFI_BASE_7.0: conda install libffi3.3 -y libssl.so.3: sudo apt install -y openssl li…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…

高效查找秘密武器一:位图

有这样的一个问题&#xff1a; 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数 中。 那么我们一般会想到这样做的 1.遍历&#xff0c;时间复杂度O(n) 2.排序&#xff08;N*logN&#xff09;&#xff0c…

爬虫运行后数据如何存储?

爬虫运行后获取的数据可以存储在多种不同的存储系统中&#xff0c;具体选择取决于数据的规模、查询需求以及应用场景。以下是一些常见的数据存储方法&#xff1a; 1. 文件系统 对于小型项目或临时数据存储&#xff0c;可以直接将数据保存到本地文件中。常见的文件格式包括&…

ultralytics-YOLOv11的目标检测解析

1. Python的调用 from ultralytics import YOLO import os def detect_predict():model YOLO(../weights/yolo11n.pt)print(model)results model(../ultralytics/assets/bus.jpg)if not os.path.exists(results[0].save_dir):os.makedirs(results[0].save_dir)for result in…

PowerShell install 一键部署postgres17

postgres 前言 PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 35 年的积极开发经验 这为其赢得了可靠性、功能稳健性和性能的良好声誉。 通过官方文档可以找到大量描述如何安装和使用 PostgreSQL 的信息。 开源社区提供了许多有用的地方来熟悉PostgreSQL, 了…

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器&#xff08;192.168.xx.xx&#xff09;&#xff0c;数据迁移后的目标服务器&#xff08;10.2.xx.xx&#xff09;。 2台服务器所处环境&#xff1a; centos7操作系统&#xff0c; elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…

学习threejs,使用VideoTexture实现视频Video更新纹理

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️VideoTexture 视频纹理 二、…

Next.js 实战 (二):搭建 Layouts 基础排版布局

前言 等了许久&#xff0c;Next.js 终于迎来了 v15.x 版本&#xff0c;刚好 Github 上面的旧项目重构完&#xff0c;终于可以放心大胆地去研究 Next.js了。 搭建最新项目可以参考官方文档&#xff1a;Installation 最新的 Next.js 版本&#xff0c;使用的是 React19.x 内测版…

小红薯x-s算法最新补环境教程12-06更新(下)

在上一篇文章中已经讲了如何去定位x-s生成的位置&#xff0c;本篇文章就直接开始撸代码吧 如果没看过的话可以看&#xff1a;小红薯最新x-s算法分析12-06&#xff08;x-s 56&#xff09;&#xff08;上&#xff09;-CSDN博客 1、获取加密块代码 首先来到参数生成的位置&…

Microi吾码产品深度测评:轻量级企业管理应用的全方位剖析

开源低代码平台-Microi吾码-平台简介 技术框架&#xff1a;.NET8 Redis MySql/SqlServer/Oracle Vue2/3 Element-UI/Element-Plus 平台始于2014年&#xff08;基于Avalon.js&#xff09;&#xff0c;2018年使用Vue重构&#xff0c;于2024年10月29日开源 Vue3试用地址&am…

unity打包web,发送post请求,获取地址栏参数,解决TypeError:s.replaceAll is not a function

发送post请求 public string url "http://XXXXXXXXX";// 请求数据public string postData "{\"user_id\": 1}";// Start is called before the first frame updatevoid Start(){// Post();StartCoroutine(PostRequestCoroutine(url, postData…

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束&#xff0c;专业819信号系统与信号处理140&#xff0c;总分420&#xff0c;终于梦圆交大&#xff0c;高考时敢都不敢想目标&#xff0c;现在已经成为现实&#xff0c;考研后劲很大&#xff0c;这一年的复习经历&#xff0c;还是历历在目&#xff0c;整理一下&#xff…

mac port 安装redis 并设置为系统服务 自定义配置方法

mac系统中&#xff0c;port 包管理工具比brew的速度快N倍&#xff0c;今天就给大家分享一下在macos系统中如何使用 port安装 redis数据库并配置为服务自动启动和自定义redis.conf配置的方法。 1. 安装redis sudo port install redis 2. 启动redis服务 sudo port load redis …

【多线程-第一天-NSThread-互斥锁和自旋锁的区别-练习-异步下载网络图片 Objective-C语言】

一、互斥锁和自旋锁的区别 1.刚刚我们看过了,互斥锁和自旋锁,下边我们来看,互斥锁和自旋锁的一个区别, 1)互斥锁:如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其他线程时间片到了,打开锁后,线程会被唤醒(执行) 它是被唤醒的,相当于什么呢,…

Ubuntu环境安装RabbitMQ

1.安装Erlang RabbitMq需要Erlang语⾔的⽀持&#xff0c;在安装rabbitMq之前需要安装erlang # 更新软件包 sudo apt-get update # 安装 erlang sudo apt-get install erlang 查看erlang版本 : erl 退出命令:halt(). 2. 安装RabbitMQ # 更新软件包 sudo apt-get update # 安装 …

基于Huffman编码的GPS定位数据无损压缩算法

目录 一、引言 二、霍夫曼编码 三、经典Huffman编码 四、适应性Huffman编码 五、GPS定位数据压缩 提示&#xff1a;文末附定位数据压缩工具和源码 一、引言 车载监控系统中&#xff0c;车载终端需要获取GPS信号&#xff08;经度、纬 度、速度、方向等&#xff09;实时上传…

智慧油客:从初识、再识OceanBase,到全栈上线

今天&#xff0c;我们邀请了智慧油客的研发总监黄普友&#xff0c;为我们讲述智慧油客与 OceanBase 初识、熟悉和结缘的故事。 智慧油客自2016年诞生以来&#xff0c;秉持新零售的思维&#xff0c;成功从过去二十年间以“以销售产品为中心”的传统思维模式&#xff0c;转向“以…

如何查看电脑的屏幕刷新率?

1、按一下键盘的 win i 键&#xff0c;打开如下界面&#xff0c;选择【系统】&#xff1a; 2、选择【屏幕】-【高级显示设置】 如下位置&#xff0c;显示屏幕的刷新率&#xff1a;60Hz 如果可以更改&#xff0c;则选择更高的刷新率&#xff0c;有助于电脑使用起来界面更加流…