项目代码第2讲:从0实现LoginController.cs,UsersController.cs、User相关的后端接口对应的前端界面
一、User
1、使用数据注解设置主键和外键
-
设置主键:在
User
类的U_uid
属性上使用[Key]
注解。 -
设置外键:在
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
-
查看现有迁移:
首先,通过“程序包管理器控制台”(Package Manager Console)运行以下命令来查看当前项目中的所有迁移:Get-Migration
这个命令会列出所有已生成的迁移文件及其顺序。
-
删除迁移文件:
找到你想要删除的迁移文件(通常是上一次生成的迁移文件),并手动从项目的“Migrations”文件夹中删除它。 -
回退数据库:
由于迁移文件已经被删除,你需要将数据库架构回退到上一次迁移之前的状态。这可以通过在“程序包管理器控制台”中运行以下命令来实现:Update-Database -TargetMigration [PreviousMigrationName]
其中
[PreviousMigrationName]
是上一次迁移之前的迁移名称。如果这是你的第一个迁移并且你想要完全重置数据库,你可能需要使用-TargetMigration:0
(这取决于你的具体迁移配置,有时可能是其他值,比如一个特殊的起始迁移名称)。请注意,回退数据库可能会导致数据丢失,特别是如果删除的迁移包含了破坏性更改(如删除表或列)。因此,在执行此操作之前,请确保你已经备份了数据库。
-
清理迁移历史记录(可选):
如果你想要完全清理迁移历史记录(即删除__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
;对于值类型,默认值为0
、false
等)。
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、使用数据注解设置主键和外键 设置主键:在User类的U_uid属性上使用[Key]注解。 设置外键:在Order类中,创建一个表示外键的属性(例如UserU_uid),并使用[ForeignKey]注解指定它引用User类的哪个…...
电子商务人工智能指南 3/6 - 聊天机器人和客户服务
介绍 81% 的零售业高管表示, AI 至少在其组织中发挥了中等至完全的作用。然而,78% 的受访零售业高管表示,很难跟上不断发展的 AI 格局。 近年来,电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…...
vue.js组件开发的所有流程
1. 设计组件架构 首先,你需要考虑应用的结构,决定哪些部分应该成为独立的组件。这包括: 提取重复的UI元素:如按钮、输入框、卡片等。 功能模块:例如登录框、导航栏、数据表格等。 2. 设置开发环境 安装Node.js…...
从零开始学TiDB(1) 核心组件架构概述
首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译:首先一条SQL语句最先到达的地方是TiDB Server集群,TiDB Server是无状态的,不存储数据,SQL 发过来之后TiDB Server 负责 解析,优化,编译 这…...
VsCode运行Ts文件
1. 生成package.json文件 npm init 2. 生成tsconfig.json文件 tsc --init 3. Vscode运行ts文件 在ts文件点击右键执行Run Code,执行ts文件...
初始化webpack应用示例
1、初始化npm mkdir webpack_test cd webpack_test npm init 2、安装webpack依赖 npm install webpack webpack-cli -D 3、添加文件夹,入口文件 mkdir src touch index.js touch add-content.js 文件夹结构 index.js import addContent from "./add-cont…...
liunx docker 部署 nacos seata sentinel
部署nacos 1.按要求创建好数据库 2.创建docker 容器 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone -e SPRING_DATASOURCE_PLATFORMmysql -e MYSQL_SERVICE_HOST172.17.251.166 -e MYSQL_SERVICE_DB_NAMEry-config -e MYSQL_SERVICE_PORT3306 -e MYSQL…...
MySQL面试
文章目录 事务隔离级别需要解决的问题事务隔离级别 MySQL 中是如何实现事务隔离的实现可重复读 什么是存储引擎如何定位慢查询分析慢查询原因MySQL超大分页怎么处理索引失效什么时候建立唯一索引、前缀索引、联合索引?redolog与binlog是如何保证一致的redolog刷盘时…...
linux运维之shell编程
Shell 编程在系统运维中及其重要 1. Shell 编程概述 Shell 是一种命令行解释器,能够执行操作系统的命令。Shell 脚本是一个包含一系列 Shell 命令的文件,它可以被执行,以自动化和批量处理任务。常用的 Shell 类型包括 bash、sh、zsh 等。Shel…...
ssm 多数据源 注解版本
application.xml 配置如下 <!-- 使用 DruidDataSource 数据源 --><bean id"primaryDataSource" class"com.alibaba.druid.pool.DruidDataSource" init-method"init" destroy-method"close"></bean> <!-- 使用 数…...
Nginx核心配置详解
一、配置文件说明 nginx官方帮助文档:nginx documentation nginx的配置文件的组成部分: 主配置文件:nginx.conf子配置文件: include conf.d/*.conffastcgi, uwsgi,scgi 等协议相关的配置文件mime.types:…...
十六(AJAX3)、XMLHttpRequest、Promise、简易axios封装、案例天气预报、lodash-debounce防抖
1. XMLHttpRequest 1.1 XMLHttpRequest-基本使用 /* 定义:XMLHttpRequest(XHR)对象用于与服务器交互。通过 XMLHttpRequest 可以在不刷新页面的情况下请求特定 URL,获取数据。这允许网页在不影响用户操作的情况下,更…...
12.06 深度学习-预训练
# 使用更深的神经网络 经典神经网络 import torch import cv2 from torchvision.models import resnet18,ResNet18_Weights from torch import optim,nn from torch.utils.data import DataLoader from torchvision.datasets import CIFAR10 from torchvision import tr…...
【计算机网络】期末速成(2)
部分内容来源于网络,侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信,靠**套接字Socket(主机IP地址,端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…...
Python学习笔记10-作用域
作用域 定义:Python程序程序可以直接访问命名空间的正文区域 作用:决定了哪一部分区域可以访问哪个特定的名称 分类: 局部作用域(Local)闭包函数外的函数中(Enclosing)全局作用域࿰…...
Sui 主网升级至 V1.38.3
Sui 主网现已升级至 V1.38.3 版本,同时协议升级至 69 版本。请开发者及时关注并调整! 其他升级要点如下所示: 协议 #20199 在共识快速路径投票中设置允许的轮次数量。 节点(验证节点与全节点) #20238 为验证节点…...
linux的vdagent框架设计
1、vdagent Linux 的 spice 客户代理由两部分组成,一个系统范围的守护进程 spice-vdagentd 和一个 X11 会话代理 spice-vdagent,每个 X11 会话有一个。spice-vdagentd 通过 Sys-V initscript 或 systemd 单元启动。 如下图:spice-vdagent&a…...
vue3+elementPlus封装的一体表格
目录结构 源码 exportOptions.js export default reactive([{label: 导出本页,key: 1,},{label: 导出全部,key: 2,}, ])index.vue <template><div class"flex flex-justify-between flex-items-end"><div><el-button-group><slot name…...
判断是否 AGP7+ 的方法
如何判断? /*** 是否是AGP7.0.0及以上* param project* return*/static boolean isAGP7_0_0(Project project) {def androidComponents project.extensions.findByName("androidComponents")if (androidComponents && androidComponents.hasProp…...
使用 Streamlit +gpt-4o实现有界面的图片内容分析
在上一篇利用gpt-4o分析图像的基础上,进一步将基于 Python 的 Streamlit 库,结合 OpenAI 的 API,构建一个简洁易用的有界面图片内容分析应用。通过该应用,用户可以轻松浏览本地图片,并获取图片的详细描述。 调用gpt-4o…...
树莓集团是如何链接政、产、企、校四个板块的?
树莓集团作为数字影像行业的积极探索者与推动者,我们通过多维度、深层次的战略举措,将政、产、企、校四个关键板块紧密链接在一起,实现了资源的高效整合与协同发展,共同为数字影像产业的繁荣贡献力量。 与政府的深度合作政府在产业…...
Fyne ( go跨平台GUI )中文文档-Fyne总览(二)
本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16及更高版本,ide为goland2021.2??????? ?这是一个系列文章: Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne…...
MySQL数据库(3)-SQL基础语言学习
1. DDL数据定义语言 1.1 什么是DDL DDL(Data Definition Language,数据定义语言)是SQL语言的一部分,用于定义和修改数据库结构。DDL主要包括以下三类语句: 1.CREATE:用于创建数据库对象,如数…...
下拉框根据sql数据回显
vue <a-form-item label"XXXX" :labelCol"labelCol" :wrapperCol"wrapperCol" required><a-select v-decorator"[disputeType, validatorRules.disputeType]" style"width: 200px" placeholder"请选择XXXX&q…...
电池销售系统
文末获取源码和万字论文,制作不易,感谢点赞支持。 摘 要 在当今信息爆炸的大时代,由于信息管理系统能够更有效便捷的完成信息的管理,越来越多的人及机构都已经引入和发展以信息管理系统为基础的信息化管理模式,随之信…...
四、镜像构建
四、镜像构建 从镜像大小上来说,一个比较小的镜像只有十几MB,而内核文件需要一百多MB,因此镜像里面是没有内核的,镜像是在被启动为容器后直接使用宿主机的内核,而镜像本身则只提供相应的rootfs,即系统正常…...
FastAPI 响应状态码:管理和自定义 HTTP Status Code
FastAPI 响应状态码:管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码,涵盖了常见的 HTTP 状态码分类,如信息响应(1xx)、成功状态(2xx)、客户端错误&a…...
C#设计模式--原型模式(Prototype Pattern)
原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过构造函数。这种方式可以提高性能,特别是在创建复杂对象时。C# 中可以通过实现 ICloneable 接口或自定义克隆方法来实现原型模式。 案例 1:文档编辑器…...
使用Goland对6.5840项目进行go build出现异常
使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…...
使用kibana实现es索引的数据映射和索引模版/组件模版
1 数据映射 数据映射官方链接 1.1 日期映射案例 1.创建一条索引。把索引中的字段生日映射为日期,并制定映射后的格式为年月日 PUT http://10.0.0.91:9200/zhiyong18-luckyboy-date {"mappings": {"properties": {"birthday": {&q…...
基于elementui的远程搜索下拉选择分页组件
在开发一个练手项目的时候,需要一个远程搜索的下拉选择组件; elementui自带的el-select支持远程搜索;但如果一次性查询的数据过多;会导致卡顿。故自己实现一个可分页的远程下拉选择组件 效果: 代码: <…...
每日一题 LCR 074. 合并区间
LCR 074. 合并区间 对遍历顺序注意一下就可以 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {int n intervals.size();sort(intervals.begin(),intervals.end());int idx 0;vector<vector<int&g…...
Flink SQL
Overview | Apache Flink FlinkSQL开发步骤 Concepts & Common API | Apache Flink 添加依赖: <dependency><groupId>org.apache.flink</groupId><artifactId>flink-table-api-java-bridge_2.11</artifactId><version>…...
[免费]SpringBoot+Vue企业OA自动化办公管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue企业OA自动化办公管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue企业OA自动化办公管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术在管理上越来越深入…...
Linux下编译安装METIS
本文记录Linux下编译安装METIS的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1 一、安装依赖 1.1 下载GKlib sudo apt-get install build-essential sudo apt-get install cmake 2.2 编译安装GKlib 下载GKlib代码, …...
LLM学习路径 - 渐进式构建知识体系
LLM学习路径 - 渐进式构建知识体系 文章目录 LLM学习路径 - 渐进式构建知识体系一、模型算法基础二、机器学习三、深度学习四、自然语言处理 (NLP)五、大规模语言模型 (LLM) References 一、模型算法基础 编程基础 Web 框架 深入学习 Gradio 与 Streamlit,理解其构…...
使用Unity脚本模拟绳索、布料(碰撞)
效果演示: 脚本如下: using System.Collections; using System.Collections.Generic; using UnityEngine;namespace PhysicsLab {public class RopeSolver : MonoBehaviour {public Transform ParticlePrefab;public int Count 3;public int Space 1;…...
Qt Chart 模块化封装曲线图
一 版本说明 二 完成示例 此文章包含:曲线轴设置,曲线切换,单条曲线显示,坐标轴。。。 三 曲线图UI创建 在UI界面拖放一个QWidget,然后在 Widget里面放一个 graphicsView 四 代码介绍 1 头文件 #include <QString> #in…...
【Linux】深入理解进程管理与fork系统调用的实现原理
【Linux】深入理解进程管理与fork系统调用的实现原理 进程基本概念描述进程-PCBtask_struct-PCB的一种task_ struct内容分类组织进程 查看进程通过系统调用获取进程标示符Fork 之后的代码共享1. **代码共享**2. **数据段不共享**总结 🌏个人博客主页:个人…...
C语言程序设计P5-2【应用函数进行程序设计 | 第二节】——知识要点:函数的参数及返回值和函数的调用及声明
知识要点:函数的参数及返回值和函数的调用及声明 视频: 目录 一、任务分析 二、必备知识与理论 三、任务实施 一、任务分析 1.求x的n次方的值也就是求n个x的乘积,可把x和n作为函数的形参,定义一个函数power来完成这个功能&am…...
【LeetCode】169.多数元素
题目连接: https://leetcode.cn/problems/majority-element/solutions/2362000/169-duo-shu-yuan-su-mo-er-tou-piao-qing-ledrh/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述: 思路一: 使用哈希表unordered_map记录每个元…...
0x0118消息 WM_SYSTIMER
0x0118消息就是WM_SYSTIMER 编辑框出现输入光标时,产生的消息. 0x0118 would be the undocumented WM_SYSTIMER, which appears to be used for caret blinks. 0x0118是一个undocument 消息, 微软没有记录。 但在一些库的源码中可以看到,比如ATL的库文…...
【Linux内核】Hello word程序
创建测试目录 mkdir -p ~/develop/kernel/hello-1 cd ~/develop/kernel/hello-1 创建MakeFile文件和内核.c文件 nano Makefile nano hello-1.c 编写内容 /* * hello-1.c - The simplest kernel module. */ #include <linux/module.h> /* Needed by all modules */…...
黑马redis
Redis的多IO线程只是用来处理网络请求的,对于读写操作命令Redis仍然使用单线程来处理 Redisson分布式锁实现15问 文章目录 主线程和IO线程是如何协作的Unix网络编程中的五种IO模型Linux世界一切皆文件生产上限制keys *、flushdb、flushall等危险命令keys * 遍历查询100W数据花…...
Robust Depth Enhancement via Polarization Prompt Fusion Tuning
paper:论文地址 code:github项目地址 今天给大家分享一篇2024CVPR上的文章,文章是用偏振做提示学习,做深度估计的。模型架构图如下 这篇博客不是讲这篇论文的内容,感兴趣的自己去看paper,主要是分享环境&…...
集合框架(3)Map
Map接口 现实生活与开发中,我们常会看到这样的一类集合:用户ID与账户信息、学生姓名与考试成绩、IP地址与主机名等,这种一一对应的关系,就称作映射。Java提供了专门的集合框架用来存储这种映射关系的对象,即java.util…...
Java反射机制—Class
Java反射机制是指在运行时动态地获取类的信息以及操作类的成员变量、方法和构造方法的能力。反射机制通过使用Class类来实现,Class类是Java中表示类的类。 通过反射机制,我们可以在运行时动态地创建对象、调用方法、访问属性等。反射机制提供了一种强大…...
C# 新语法中的字符串内插$和{}符号用法详解
自C#6.0开始提供一个新的语法糖,即"$" 符号,配合“{}”使用,它的作用除了是对String.format的简化,还可设置其格式模板,实现了对字符串的拼接优化。 语法格式: $"string {变量表达式}” 语…...
WordPress 独立站是否需要 CDN:深度解析及必要性分析
WordPress 是目前全球最流行的开源内容管理系统(CMS),其易用性和丰富的插件生态使得它成为搭建独立站的首选。然而,随着流量的增加以及用户体验的需求,网站的速度和可靠性变得至关重要。在这种情况下,CDN&a…...
dell电脑开不了机怎么回事?戴尔电脑无法开机解决方法
dell戴尔电脑开不了机,这是很多使用dell电脑用户常遇到的问题。这种故障情况是由多种原因引起,包括硬件故障、软件问题或电源问题等等。dell电脑开不了机怎么办呢?下面便为大家介绍一下相关解决修复方法,帮助用户解决戴尔电脑无法…...