前端需要了解的数据库基础与身份认证

news2024/11/20 23:22:14

目录

    • 数据库与身份认证
      • 数据库的基本概念
        • 常见数据库和分类
        • 传统型数据库的数据组织结构
        • 安装并配置MySQL
      • MySQL的基本使用
        • 使用SQL管理数据库
        • SQL中的SELECT语句
        • SQL中的INSERT INTO语句
        • SQL中的UPDATE语句
        • SQL中的DELETE语句
        • SQL中的WHERE子句
        • SQL中的AND和OR运算符
        • SQL中的ORDER BY子句
        • SQL中的COUNT(*)函数
      • 在项目中操作数据库
        • 安装步骤:
        • 使用mysql模块操作数据库
      • 前后端的身份认证
        • Web开发模式
        • 身份认证
        • Session认证机制
        • 在Express中使用Session认证
        • JWT认证机制

数据库与身份认证

数据库的基本概念

数据库是用来组织存储和** **数据的仓库

常见数据库和分类
  1. MySQL数据库(最广泛、流行度最高)
  2. Oracle数据库(收费)
  3. SQLserver数据库(收费)
  4. Mongodb数据库
    其中前三种属于传统型数据库(也叫关系型数据库、SQL数据库),Mongodb属于新型数据库(也叫非关系型数据库、NoSQL数据库),一定程度上弥补了传统型数据库的缺陷
传统型数据库的数据组织结构
  1. Excel的数据组织结构
    在这里插入图片描述

  2. 传统型数据库的数据组织结构
    从大到小分为数据库、数据表、数据行、字段
    数据库类似Excel工作簿,数据表类似Excel工作表,数据行类似Excel每一行数据,字段类似Excel的列

  3. 实际开发中库、表、行、字段的关系
    ① 实际开发中,一般每个项目对应独立的数据库
    ② 不同数据要存储到数据库的不同表中
    ③ 每个表中存哪些信息由字段决定,eg:为user表设计id、username、password字段
    ④ 表中的行代表每一条具体的数据

安装并配置MySQL
  1. MySQL Server:专门用来提供数据存储和服务的软件
  2. MySQL Workbench:可视化的MySQL管理工具,方便操作存储在MySQL Server中的数据
    在windows环境下运行nysql-installer-community-8.0.19.msi就能依次安装两个软件

MySQL的基本使用

数据类型:① INT 整数 ② VARCHAR(len) 字符串 ③ TINYINT(1) 布尔值
字段的特殊标识:① PK 主键、唯一标识 ② NN 值不允许为空 ③ UQ 值唯一 ④ AI 值自动增长

使用SQL管理数据库

① SQL是一门数据库编程语言 ② 使用SQL语言编写出的代码,叫SQL语句 ③ SQL只能在关系型数据库中使用

SQL中的SELECT语句

SELECT语句用于从表中查询数据,执行的结果被存储在一个结果表中(称为结果集)
语法:

-- 这是注释
-- 从FROM指定的【表中】,查询出【所有的】数据,*表示【所有列】
SELECT * FROM 表名称

-- 从FROM指定的【表中】,查询出【指定列】名称(字段)的数据,多个列之间【用逗号隔开】
SELECT 列名称 FROM 表名称

【注意】:SQL语句的关键字不区分大小写,select等效SELECT

SQL中的INSERT INTO语句

INSERT INTO语句用于向数据表中插入新的数据行
语法:

-- 语法解读:向指定的表中,插入如下几列数据,列的值通过values指定
-- 注意:列和只要一一对应,多个列和多个值之间用逗号隔开
INSERT INTO table_name (列1,列2...) VALUES (值1,值2...)
SQL中的UPDATE语句

UPDATE语句用于修改表中的数据,注意:不加where则会修改所有数据
语法:

-- 1. 用UPDATE指定要更新哪个表中的数据
-- 2. 用SET指定列对应的新值
-- 3. 用WHERE指定更新的条件
UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
SQL中的DELETE语句

DELETE语句用于删除表中数据行,注意:不加where则会删除所有数据
语法:

-- 从指定的表中根据WHERE条件,删除对应的数据行
DELETE FROM 表名称 WHERE 列名称=值
SQL中的WHERE子句

WHERE子句用于限定选择的标准,在SELECT、UPDATE、DELETE语句中均可使用
WHERE 列 运算符 值
运算符:在这里插入图片描述

SQL中的AND和OR运算符

AND和OR可以在WHERE子句中把多个条件结合起来
AND表示必须同时满足多个条件,相当于&&
OR表示任意满足一个条件,相当于||

SQL中的ORDER BY子句

用于根据指定列对结果集进行排序
默认升序排序,ASC表示升序,降序可使用DESC关键字
eg:select * from users order by status desc
多重排序:

-- 先按照status降序排序,再按照username字母顺序升序排序
select * from users order by status desc, username asc
SQL中的COUNT(*)函数
  1. 用于返回查询结果的总数据条数
    语法:SELECT COUNT(*) FROM 表名称
  2. 使用AS关键字为列设置别名
    语法:SELECT COUNT(*) AS 别名 FROM 表名称
    select username as name,password from users

在项目中操作数据库

安装步骤:
  1. 安装操作MySQL数据库的第三方模块(mysql)
  2. 通过mysql模块连接到数据库
  3. 通过mtsql模块执行sql语句
    配置mysql模块:在这里插入图片描述

测试mysql模块能否正常工作:在这里插入图片描述

使用mysql模块操作数据库
  1. 查询数据
// 查询users表中所有数据
const sqlStr = 'select * from users'
db.query(sqlStr, (err, result) => {
    if (err) {
        // 查询失败
        console.log(err.message);
        return
    } else {
        // 查询成功
        console.log(result);
    }
})

【注意】:如果执行的是select语句,则输出结果为数组
2. 插入数据

// 向users表中新增一条数据,username:Spider-man,password:pcc123
const user = { username: 'Spider-man', password: 'pcc123' }
// 定义待执行的sql语句
const sqlStr = 'insert into users (username,password) values (?,?)'
// 执行sql语句
db.query(sqlStr, [user.username, user.password], (err, result) => {
    if (err) {
        return console.log(err.message);
    }
    if(result.affectedRows === 1){
        console.log('插入数据成功!');
    }
})

如果数据对象的每一个属性和数据表中的字段一一对应,则有以下简便方式

const user = { username: 'Spider-woman', password: 'pcc345' }
const sqlStr = 'insert into users set ?'
db.query(sqlStr, user, (err, result) => {
    if (err) {
        return console.log(err.message);
    }
    if (result.affectedRows === 1) {
        console.log('插入数据成功!');
    }
})

【注意】:① 如果执行的是insert语句,则result是一个对象,可以通过affectRows属性来判断是否插入数据成功 ② ?表示占位符,当有多个占位符时,用数组形式插入具体数据,如果只有一个占位符,则不需要用数组
3. 更新数据

// 要更新的数据对象
const user = { id: 8, username: 'aaa', password: '00000' }
// 定义sql语句
const sqlStr = 'update users set username=?, password=? where id=?'
// 执行sql语句
db.query(sqlStr, [user.username, user.password, user.id], (err, result) => {
    if (err) {
        return console.log(err.message);
    }
    if (result.affectedRows === 1) {
        console.log('更新数据成功!');
    }
})

如果数据对象的每一个属性和数据表中的字段一一对应,则有以下简便方式

const user = { id: 6, username: 'bbb', password: '00000' }
// 定义sql语句
const sqlStr = 'update users set ? where id=?'
// 执行sql语句
db.query(sqlStr, [user, user.id], (err, result) => {
    if (err) {
        return console.log(err.message);
    }
    if (result.affectedRows === 1) {
        console.log('更新数据成功!');
    }
})

【注意】:如果执行的是updatet语句,则result是一个对象,可以通过affectRows属性来判断是否更新数据成功
4. 删除数据
推荐使用id删除

// 要执行的sql语句
const sqlStr = 'delete from users where id=?'
db.query(sqlStr, 8, (err, result) => {
    if (err) {
        return console.log(err.message);
    }
    if (result.affectedRows === 1) {
        console.log('删除数据成功!');
    }
})

【注意】:① 如果执行的是delete语句,则result是一个对象,可以通过affectRows属性来判断是否插入数据成功
5. 标记删除
使用delete语句,会把真正的数据从表中删除,无法找回,那么可以使用标记删除的形式,模拟删除的动作
例如通过设置status状态字段,来标记这条数据是否被删除

const sqlStr = 'update users set status=? where id=?'
db.query(sqlStr, [1, 6], (err, result) => {
    if (err) {
        return console.log(err.message);
    }
    if(result.affectedRows === 1){
        console.log('更新状态成功');
    }
})

前后端的身份认证

Web开发模式

主流有两种

  1. 基于服务器端渲染的传统web开发模式
    服务器发送给客户端的html页面是服务器通过字符串拼接动态生成的,因此客户端不需要使用Ajax这样的技术额外请求页面的数据
    优点:① 前端耗时少 ② 有利于SEO,爬虫更易获取信息
    缺点:① 占用服务器端资源 ② 不利于前后端分离,开发效率低
  2. 基于前后端分离的新型web开发模式
    依赖Ajax技术,后端只负责提供api接口,前端使用Ajax调用接口
    优点:① 开发体验好 ② 用户体验好 ③ 减轻服务器端的渲染压力
    缺点:不利于SEO
  3. 如何选择开发模式
    例如企业级网站,主要功能是展示而没有复杂的交互,则用服务器端渲染
    类似后台管理项目,交互性比较强,不需要考虑seo,则用前后端分离
身份认证

身份认证指通过一定手段完成对用户身份的确认,例如手机验证码,二维码登录
服务端渲染使用Session认证机制前后端分离使用JWT认证机制

Session认证机制
  1. http协议的无状态性,客户端每次HTTP请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留HTTP请求状态

  2. 如何突破http无状态的限制在这里插入图片描述

    【注意】:现实生活中会员卡身份认证方式在web开发中称为Cookie

  3. 什么是Cookie
    Cookie是存储在用户浏览器中的一段不超过4kb的字符串,由一个名称、一个、和其他几个Cookie有效期安全性适用范围可选属性组
    不同域名下的Cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie一同发送到服务器
    Cookie的特性:① 自动发送 ② 域名独立 ③ 过期时限 ④ 4kb限制

  4. Cookie在身份认证中的作用
    客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的Cookie,客户端会自动将Cookie保存在浏览器中
    随后,当客户端每次请求服务器的时候,浏览器会自动将身份认证相关的Cookie,通过请求头的形式发送给服务器,服务器即可验明客户端的身份
    在这里插入图片描述

  5. Cookie不具有安全性
    Cookie存储在浏览器中,浏览器也提供了读写Cookie的API,因此Cookie容易被伪造,不能用Cookie存储用户隐私数据

  6. 提高身份认证的安全性
    类似会员卡在收音机上刷卡认证
    会员卡+刷卡认证是Session认证机制的精髓

  7. Session工作原理
    在这里插入图片描述

在Express中使用Session认证
  1. 安装express-session中间件npm i express-session

  2. 配置express-session中间件,通过app.use()注册中间件
    在这里插入图片描述

  3. 向session中存数据
    配置成功书,通过req.session访问和使用session对象
    在这里插入图片描述

  4. 从session中取数据
    在这里插入图片描述

  5. 清空session
    调用req.session.destroy在这里插入图片描述

JWT认证机制

Session认证机制需要配合Cookie才能实现,Cookie不支持跨域访问
【注意】:① 当前端请求后端接口不存在跨域问题时,推荐使用Session ② 当前端需要跨域请求接口时,推荐JWT

  1. 什么是JWT
    目前最流行的跨域认证解决机制
  2. JWT工作原理
    在这里插入图片描述

【总结】:用户的信息通过token字符串的形式保存在客户端浏览器,服务器通过还原Token字符串的形式来认证用户身份
3. JWT组成部分
Header头部、Payload有效荷载、Signature签名,这三部分之间使用英文的.分割
格式:Header.Payload.Signature
其中,Payload部分是真正的用户信息,是用户信息加密之后生成的字符串,Header和Signature是安全性相关的部分
4. JWT使用方式
客户端收到服务器返回的JWT之后,通常会将它储存在localStorage或sessionStorage中,此后,客户端每次与服务器通信,都要带上这个JWT的字符串,从而进行身份认证。推荐的做法是把JWT放在HTTP请求头的Authorization字段
语法:Authorization: Bearer <token>

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

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

相关文章

Pip 使用报错及解决

pip install 是Python 包管理器命令&#xff0c;常用参数&#xff1a; -r&#xff1a;从一个需求文件中安装所有的包。-U 或 --upgrade&#xff1a;升级一个已经安装的包到最新版本。-I 或 --ignore-installed&#xff1a;即使包已经安装&#xff0c;也重新安装。--no-cache-d…

奥运会Ⅴ--具有混合模型的 Transformer 架构

Transformer 架构的变革性影响和混合模型的未来&#xff0c;将 Transformer 与其他架构相结合&#xff0c;突破 AI 能力的界限。 Transformer 架构从根本上重塑了自然语言处理 (NLP) 和机器学习的格局。这种序列建模和传导任务的创新方法不仅超越了之前最先进的模型&#xff0c…

每日OJ_牛客WY15 幸运的袋子

目录 牛客HJ62 查找输入整数二进制中1的个数 解析代码 牛客HJ62 查找输入整数二进制中1的个数 查找输入整数二进制中1的个数_牛客题霸_牛客网 解析代码 本题是计算一个数二进制表示中1的个数&#xff0c;通过&#xff08;n >> i) & 1可以获取第i位的二进制值&…

阿里云文件上传之客户端上传

阿里云文件上传之前一直是使用服务端上传,但一直存在上传不稳定问题,三兆以上的文件上传经常出现上传超时问题.究其原因客户端将文件上传到业务服务器&#xff0c;然后业务服务器将文件上传到OSS。在这个过程中&#xff0c;一份数据需要在网络上传输两次&#xff0c;会造成网络…

Vuforia AR篇(九)— AR塔防下篇

目录 前言一、搭建UI二、创建脚本 前言 在增强现实&#xff08;AR&#xff09;技术快速发展的今天&#xff0c;Vuforia作为一个强大的AR开发平台&#xff0c;为开发者提供了许多便捷的工具和功能。在本篇博客中&#xff0c;我们将介绍如何使用Vuforia在Unity中创建一个简单的塔…

46 class添加与颜色分配47 区域规则介绍与添加48 走线修线介绍49 复制、改变、删除操作

46 class添加与颜色分配&&47 区域规则介绍与添加&&48 走线修线介绍&&49 复制、改变、删除操作 第一部分 46 class添加与颜色分配创建网络类CLS创建网络组net-group NG颜色分配**填充类型设置****高亮关闭****修改颜色面板的颜色**从其它已有PCB设计中导…

用Manim实现——计算和绘制图形下方区域

用Manim实现——计算和绘制图形下方区域 get_area 函数 get_area是一个用于计算和绘制图形下方区域的函数&#xff0c;常用于图形动画库&#xff08;如 Manim&#xff09; get_area(graph, x_rangeNone, color(ManimColor(#58C4DD),ManimColor(#83C167)), opacity0.3, bounde…

市场主流 AI 视频生成技术的迭代路径

AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构&#xff08;TransformerDiffusion&#xff09;等多个阶段&#xff0c;每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…

大载重无人机必备:适航证技术详解

随着无人机技术的飞速发展&#xff0c;大载重无人机在物流运输、农业植保、应急救援等领域展现出巨大潜力。然而&#xff0c;为确保这些无人机在空中运行的安全性与高效性&#xff0c;获取适航证成为不可或缺的关键步骤。本文将深入探讨大载重无人机适航证的必备要素&#xff0…

用phpstudy搭建MySQL数据库

使用环境&#xff1a;win11 使用软件&#xff1a;phpstudy 下载地址&#xff1a;小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; MySQL数据库搭建步骤&#xff1a; 1、在小皮的设置界面检测 3306 端口&#xff0c;保障 3306 端口可用&#xff1b; 2、在小皮…

42 PCB布线叠层与阻抗介绍43 PCB布线过孔添加与设置44 差分对添加与设置45 布线间距规则与介绍

42 PCB布线叠层与阻抗介绍&&43 PCB布线过孔添加与设置&44 差分对添加与设置&&45 布线间距规则与介绍 第一部分 42 PCB布线叠层与阻抗介绍1 板子是怎么来的。2 四层板为例&#xff0c;做叠层和阻抗计算。 第二部分 43 PCB布线过孔添加与设置介绍PCBEdotor中…

STM32F28335实验:蜂鸣器实验

实验三个文档&#xff1a; 蜂鸣器驱动&#xff1a; 1.5KHZ-5KHZ之间&#xff0c;我们取5KHZ 也就是高低点平各100um&#xff0c;周期为200um的方波 LED1还是GPIO68管脚 蜂鸣器管脚GPIO6 蜂鸣器驱动&#xff1a; beep.c /** heep.c** Created on: 2024年8月4日* Au…

Studying-代码随想录训练营day54| 110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长

第53天&#xff0c;图论04&#xff0c;加强广搜和深搜的理解练习&#x1f4aa;(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 110.字符串接龙 105.有向图的完全可达性 106.岛屿的周长 总结 110.字符串接龙 文档讲解&#xff1a;手撕字符串接龙 题目&#xff1a;110…

黑马Java零基础视频教程精华部分_12_面向对象进阶(4)_内部类

《黑马Java零基础视频教程精华部分》系列文章目录 黑马Java零基础视频教程精华部分_1_JDK、JRE、字面量、JAVA运算符 黑马Java零基础视频教程精华部分_2_顺序结构、分支结构、循环结构 黑马Java零基础视频教程精华部分_3_无限循环、跳转控制语句、数组、方法 黑马Java零基础视…

【九】Hadoop3.3.4HA高可用配置

文章目录 1.高可用基本原理1.NameNode 高可用性主备 NameNodeJournalNode 2.Zookeeper 协调3.Quorum Journal Manager (QJM)4.Failover 控制器5.元数据共享6.检查点机制7.切换过程 2.Hadoop高可用配置1.环境背景2.hdfs-site.xml基本配置高可用配置 3.core-site.xml基本配置代理…

【C++】模版:范式编程、函数模板、类模板

目录 一.范式编程 二.函数模板 1.概念与格式 2.原理 3.实例化 4.匹配规则 三.类模板 一.范式编程 在写C函数重载的时候&#xff0c;可能会写很多同一类的函数&#xff0c;例如交换函数&#xff1a; void Swap(int& left, int& right) {int temp left;left r…

推荐 3款电脑上不可或缺的神仙软件,一用就再也离不开

WinForGIFSicle WinForGIFSicle是一款基于GIFSicle的可视化批量GIF压缩工具&#xff0c;具有多种功能和特点。首先&#xff0c;它是一个小巧、免费且开源的软件&#xff0c;能够有效地压缩GIF动画文件。该工具支持按比例压缩和按压缩比压缩两种模式&#xff0c;用户可以根据需要…

MySQL-分库分表

目录 介绍 问题分析 拆分策略 垂直拆分 垂直分库 垂直分表 水平拆分 水平分库 水平分表 实现技术 MyCat 介绍 目录 结构 入门 配置 schema.xml schema标签 datanode标签 datahost标签 rule.xml server.xml system标签 user标签 分片 垂直拆分 水平拆…

【QT】绘图API

目录 绘图API核心类 第一步&#xff1a;重写paintEvent事件函数 第二步&#xff1a;创建QPainter 第三步&#xff1a;设置QPainter绘制的文字类型&#xff08;非必须&#xff09; 第四步&#xff1a;设置画笔属性&#xff08;线条&#xff09; 第五步&#xff1a;设置画…

【复旦微FM33 MCU 外设开发指南】总集篇

各位好&#xff0c;这里是冷凝雨。 本系列旨在为复旦微的MCU提供全面的开发指南 以FM33LC0xx&#xff08;Arm M0&#xff09;为例&#xff0c;与现有的其余MCU型号&#xff0c;如FM33LG0xx、FM33M0xx等有许多相同之处。 本系列将侧重寄存器开发&#xff0c;分享一些各外设使用的…