Express學習筆記(六)——前后端的身份認證

目錄

1. Web 開發模式

1.1?服務端渲染的 Web 開發模式

1.2?服務端渲染的優缺點

1.3?前后端分離的 Web 開發模式

1.4?前后端分離的優缺點

1.5?如何選擇 Web 開發模式

2. 身份認證

2.1 什么是身份認證

2.2 為什么需要身份認證

2.3?不同開發模式下的身份認證

3. Session 認證機制

3.1?HTTP 協議的無狀態性

3.2?如何突破 HTTP 無狀態的限制

3.3 什么是 Cookie

3.4?Cookie 在身份認證中的作用

3.5?Cookie 不具有安全性

3.6?提高身份認證的安全性

3.7?Session 的工作原理

4. 在 Express 中使用 Session 認證

4.1?安裝 express-session 中間件

4.2?配置 express-session 中間件

4.3 向 session 中存數據

4.4 從 session 中取數據

4.5 清空 session

5. JWT 認證機制(重點)

5.1 了解 Session 認證的局限性

5.2?什么是 JWT

5.3 JWT 的工作原理

5.4 JWT 的組成部分

5.6 JWT 的三個部分各自代表的含義

5.7 JWT 的使用方式

5.7.1?安裝 JWT 相關的包

5.7.2?導入 JWT 相關的包

5.7.3?定義 secret 密鑰

5.7.4?在登錄成功后生成 JWT 字符串

5.7.5 將 JWT 字符串還原為 JSON 對象

5.7.6 使用 req.auth 獲取用戶信息

5.7.7 捕獲解析 JWT 失敗后產生的錯誤


1. Web 開發模式

目前主流的 Web 開發模式有兩種,分別是:
  • ① 基于服務端渲染的傳統 Web 開發模式
  • ② 基于前后端分離的新型 Web 開發模式

1.1?服務端渲染的 Web 開發模式

服務端渲染的概念
  • 服務器發送給客戶端的 HTML 頁面,是在服務器通過字符串的拼接,動態生成的。因此,客戶端不需要使用 Ajax 這樣的技術額外請求頁面的數據。
  • 代碼示例如下:

1.2?服務端渲染的優缺點

優點:
  • 前端耗時少。因為服務器端負責動態生成 HTML 內容,瀏覽器只需要直接渲染頁面即可。尤其是移動端,更省電。
  • 有利于SEO。因為服務器端響應的是完整的 HTML 頁面內容,所以爬蟲更容易爬取獲得信息,更有利于 SEO。
缺點:
  • 占用服務器端資源。即服務器端完成 HTML 頁面內容的拼接,如果請求較多,會對服務器造成一定的訪問壓力。
  • 不利于前后端分離,開發效率低。使用服務器端渲染,則無法進行分工合作,尤其對于前端復雜度高的項目,不利于項目高效開發。

1.3?前后端分離的 Web 開發模式

前后端分離的概念:
  • 前后端分離的開發模式,依賴于 Ajax 技術的廣泛應用。簡而言之,前后端分離的 Web 開發模式,就是后端只負責提供 API 接口,前端使用 Ajax 調用接口的開發模式。

1.4?前后端分離的優缺點

優點:
  • 開發體驗好。前端專注于 UI 頁面的開發,后端專注于api 的開發,且前端有更多的選擇性。
  • 用戶體驗好。Ajax 技術的廣泛應用,極大的提高了用戶的體驗,可以輕松實現頁面的局部刷新。
  • 減輕了服務器端的渲染壓力。因為頁面最終是在每個用戶的瀏覽器中生成的。
缺點:
  • 不利于 SEO。因為完整的 HTML 頁面需要在客戶端動態拼接完成,所以爬蟲對無法爬取頁面的有效信息。(解決方案:利用 Vue、React 等前端框架的 SSR (server side render)技術能夠很好的解決 SEO 問題!)

1.5?如何選擇 Web 開發模式

不談業務場景而盲目選擇使用何種開發模式都是耍流氓。
  • 比如企業級網站,主要功能是展示而沒有復雜的交互,并且需要良好的 SEO,則這時我們就需要使用服務器端渲染;
  • 而類似后臺管理項目,交互性比較強,不需要考慮 SEO,那么就可以使用前后端分離的開發模式。
另外,具體使用何種開發模式并不是絕對的,為了 同時兼顧 首頁的渲染速度 前后端分離的開發效率 ,一些網站采用了首屏服務器端渲染 + 其他頁面前后端分離的開發模式。

2. 身份認證

2.1 什么是身份認證

身份認證 (Authentication)又稱“身份驗證”、“鑒權”,是指 通過一定的手段,完成對用戶身份的確認
  • 日常生活中的身份認證隨處可見,例如:高鐵的驗票乘車,手機的密碼或指紋解鎖,支付寶或微信的支付密碼等。
  • 在 Web 開發中,也涉及到用戶身份的認證,例如:各大網站的手機驗證碼登錄郵箱密碼登錄二維碼登錄等。

2.2 為什么需要身份認證

身份認證的目的,是為了 確認當前所聲稱為某種身份的用戶,確實是所聲稱的用戶 。例如,你去找快遞員取快遞,你要怎么證明這份快遞是你的。
在互聯網項目開發中,如何對用戶的身份進行認證,是一個值得深入探討的問題。例如,如何才能保證網站不會錯誤的將“馬云的存款數額”顯示到“馬化騰的賬戶”上。

2.3?不同開發模式下的身份認證

對于 服務端渲染 前后端分離 這兩種開發模式來說,分別有著不同的身份認證方案:
  • 服務端渲染推薦使用 Session 認證機制
  • 前后端分離推薦使用 JWT 認證機制

3. Session 認證機制

3.1?HTTP 協議的無狀態性

了解 HTTP 協議的無狀態性是進一步學習 Session 認證機制的必要前提。
HTTP 協議的無狀態性,指的是客戶端 的每次 HTTP 請求都是獨立的 ,連續多個請求之間沒有直接的關系, 服務器不會 主動保留每次 HTTP 請求的狀態

3.2?如何突破 HTTP 無狀態的限制

對于超市來說,為了方便收銀員在進行結算時給 VIP 用戶打折,超市可以為每個 VIP 用戶發放會員卡。
注意:
  • 現實生活中的會員卡身份認證方式,在 Web 開發中的專業術語叫做 Cookie

3.3 什么是 Cookie

Cookie 是 存儲在用戶瀏覽器中的一段不超過 4 KB 的字符串 。它由一個 名稱 (Name)、一個 (Value)和其它幾個用于控制 Cookie 有效期 安全性 使用范圍 可選屬性 組成。
不同域名下的 Cookie 各自獨立,每當客戶端發起請求時,會 自動 當前域名下 所有 未過期的 Cookie 一同發送到服務器。
Cookie的幾大特性:
  • ① 自動發送
  • ② 域名獨立
  • ③ 過期時限
  • ④ 4KB 限制

3.4?Cookie 在身份認證中的作用

  • 客戶端第一次請求服務器的時候,服務器通過響應頭的形式,向客戶端發送一個身份認證的 Cookie,客戶端會自動將 Cookie 保存在瀏覽器中。
  • 隨后,當客戶端瀏覽器每次請求服務器的時候,瀏覽器會自動將身份認證相關的 Cookie,通過請求頭的形式發送給服務器,服務器即可驗明客戶端的身份。

3.5?Cookie 不具有安全性

由于 Cookie 是存儲在瀏覽器中的,而且 瀏覽器也提供了讀寫 Cookie 的 API ,因此 Cookie 很容易被偽造 ,不具有安全性。因此不建議服務器將重要的隱私數據,通過 Cookie 的形式發送給瀏覽器。
注意:
  • 千萬不要使用 Cookie 存儲重要且隱私的數據!比如用戶的身份信息、密碼等。

3.6?提高身份認證的安全性

為了防止客戶偽造會員卡,收銀員在拿到客戶出示的會員卡之后,可以 在收銀機上進行刷卡認證 。只有收銀機確認存在的會員卡,才能被正常使用。
這種“ 會員卡 + 刷卡認證 ”的設計理念,就是 Session 認證機制的精髓。

3.7?Session 工作原理

4. 在 Express 中使用 Session 認證

4.1?安裝 express-session 中間件

在 Express 項目中,只需要安裝 express-session 中間件,即可在項目中使用 Session 認證:
npm install express-session

4.2?配置 express-session 中間件

express-session 中間件安裝成功后,需要通過 app.use() 注冊 session 中間件 ,示例代碼如下:
// 導入 session 中間件
const session = require('express-session')// TODO_01:請配置 Session 中間件
app.use(session({secret: 'itheima', // secret 屬性值可以為任意字符串resave: false, // 固定寫法saveUninitialized: true // 固定寫法
}))

4.3 向 session 中存數據

當 express-session 中間件配置成功后,即可通過 req.session 來訪問和使用 session 對象,從而存儲用戶的關鍵信息:
// 登錄的 API 接口
app.post('/api/login', (req, res) => {// 判斷用戶提交的登錄信息是否正確if (req.body.username !== 'admin' || req.body.password !== '000000') {return res.send({ status: 1, msg: '登錄失敗' })}// TODO_02:請將登錄成功后的用戶信息,保存到 Session 中req.session.user = req.body // 用戶的信息req.session.islogin = true // 用戶的登錄狀態res.send({ status: 0, msg: '登錄成功' })
})

4.4 從 session 中取數據

可以直接從 req.session 對象上獲取之前存儲的數據,示例代碼如下:
// 獲取用戶姓名的接口
app.get('/api/username', (req, res) => {// TODO_03:請從 Session 中獲取用戶的名稱,響應給客戶端if (!req.session.islogin) {return res.send({status: 1,msg: 'fail'})}res.send({status: 0,msg: 'success',username: req.session.user.username})
})

4.5 清空 session

調用 req.session.destroy() 函數,即可清空服務器保存的 session 信息。
// 退出登錄的接口
app.post('/api/logout', (req, res) => {// TODO_04:清空 Session 信息req.session.destroy()res.send({status: 0,msg: '退出登錄成功'})
})

完整代碼:

// 導入 express 模塊
const express = require('express')
const session = require('express-session')
// 創建 express 的服務器實例
const app = express()// TODO_01:請配置 Session 中間件
app.use(session({secret: 'itheima', // secret 屬性值可以為任意字符串resave: false, // 固定寫法saveUninitialized: true // 固定寫法
}))// 托管靜態頁面
app.use(express.static('./pages'))
// 解析 POST 提交過來的表單數據
app.use(express.urlencoded({ extended: false }))// 登錄的 API 接口
app.post('/api/login', (req, res) => {// 判斷用戶提交的登錄信息是否正確if (req.body.username !== 'admin' || req.body.password !== '000000') {return res.send({ status: 1, msg: '登錄失敗' })}// TODO_02:請將登錄成功后的用戶信息,保存到 Session 中req.session.user = req.body // 用戶的信息req.session.islogin = true // 用戶的登錄狀態res.send({ status: 0, msg: '登錄成功' })
})// 獲取用戶姓名的接口
app.get('/api/username', (req, res) => {// TODO_03:請從 Session 中獲取用戶的名稱,響應給客戶端if (!req.session.islogin) {return res.send({status: 1,msg: 'fail'})}res.send({status: 0,msg: 'success',username: req.session.user.username})
})// 退出登錄的接口
app.post('/api/logout', (req, res) => {// TODO_04:清空 Session 信息req.session.destroy()res.send({status: 0,msg: '退出登錄成功'})
})// 調用 app.listen 方法,指定端口號并啟動web服務器
app.listen(80, function () {console.log('Express server running at http://127.0.0.1:80')
})

5. JWT 認證機制(重點)

5.1 了解 Session 認證的局限性

Session 認證機制 需要配合 Cookie 才能實現 。由于 Cookie 默認不支持跨域訪問,所以,當涉及到 前端跨域請求后端接口 的時候, 需要做很多額外的配置 ,才能實現跨域 Session 認證。
注意:
  • 當前端請求后端接口不存在跨域問題的時候,推薦使用 Session 身份認證機制。
  • 當前端需要跨域請求后端接口的時候,不推薦使用 Session 身份認證機制,推薦使用 JWT 認證機制。

5.2?什么是 JWT

JWT(英文全稱:JSON Web Token)是目前 最流行 跨域認證解決方案

5.3 JWT 的工作原理

總結:
  • 用戶的信息通過 Token 字符串的形式,保存在客戶端瀏覽器中。服務器通過還原 Token 字符串的形式來認證用戶的身份。

5.4 JWT 的組成部分

JWT 通常由三部分組成,分別是 Header (頭部)、 Payload (有效荷載)、 Signature (簽名)。
三者之間使用英文的“.”分隔,格式如下:
下面是 JWT 字符串的示例:

5.6 JWT 的三個部分各自代表的含義

JWT 的三個組成部分,從前到后分別是 Header、Payload、Signature。
其中:
  • Payload 部分才是真正的用戶信息,它是用戶信息經過加密之后生成的字符串。
  • Header 和 Signature 是安全性相關的部分,只是為了保證 Token 的安全性。

5.7 JWT 的使用方式

客戶端收到服務器返回的 JWT 之后,通常會將它儲存在 localStorage sessionStorage 中。
此后,客戶端每次與服務器通信,都要帶上這個 JWT 的字符串,從而進行身份認證。推薦的做法是 把 JWT 放在 HTTP 請求頭的 Authorization 字段中 ,格式如下:

5.7.1?安裝 JWT 相關的包

運行如下命令,安裝如下兩個 JWT 相關的包:
npm install jsonwebtoken express-jwt
其中:
  • jsonwebtoken 用于生成 JWT 字符串
  • express-jwt 用于將 JWT 字符串解析還原成 JSON 對象

5.7.2?導入 JWT 相關的包

使用 require() 函數,分別導入 JWT 相關的兩個包:
// TODO_01:安裝并導入 JWT 相關的兩個包,分別是 jsonwebtoken 和 express-jwt
// jsonwebtoken 用于生成 JWT 字符串
const jwt = require('jsonwebtoken')
// express-jwt 用于將 JWT 字符串解析還原成 JSON 對象
const { expressjwt } = require('express-jwt')

5.7.3?定義 secret 密鑰

為了 保證 JWT 字符串的安全性 ,防止 JWT 字符串在網絡傳輸過程中被別人破解,我們需要專門定義一個用于 加密 解密 的 secret 密鑰:
  • ① 當生成 JWT 字符串的時候,需要使用 secret 密鑰對用戶的信息進行加密,最終得到加密好的 JWT 字符串
  • ② 當把 JWT 字符串解析還原成 JSON 對象的時候,需要使用 secret 密鑰進行解密
  • secret 密鑰的本質:就是一個字符串
// TODO_02:定義 secret 密鑰,建議將密鑰命名為 secretKey
const secretKey = 'itheima No1 ^_^'

5.7.4?在登錄成功后生成 JWT 字符串

調用 jsonwebtoken 包提供的 sign() 方法,將用戶的信息加密成 JWT 字符串,響應給客戶端:
// 登錄接口
app.post('/api/login', function (req, res) {// 將 req.body 請求體中的數據,轉存為 userinfo 常量const userinfo = req.body// 登錄失敗if (userinfo.username !== 'admin' || userinfo.password !== '000000') {return res.send({status: 400,message: '登錄失敗!'})}// 登錄成功// TODO_03:在登錄成功之后,調用 jwt.sign() 方法生成 JWT 字符串。并通過 token 屬性發送給客戶端// 參數 1:用戶的信息對象// 參數 2:加密的秘鑰// 參數 3:配置對象,可以配置當前 token 的有效期// 記住:千萬不要把用戶的登錄密碼加密到 token 字符串中const token = jwt.sign({username: userinfo.username,},secretKey,{expiresIn: '60s'})res.send({status: 200,message: '登錄成功!',token: token // 要發送給客戶端的 token 字符串})
})

5.7.5 將 JWT 字符串還原為 JSON 對象

客戶端每次在訪問那些有權限接口的時候,都需要主動通過 請求頭中的 Authorization 字段 ,將 Token 字符串發送到服務器進行身份認證。
此時,服務器可以通過 express-jwt 這個中間件,自動將客戶端發送過來的 Token 解析還原成 JSON 對象:
// TODO_04:注冊將 JWT 字符串解析還原成 JSON 對象的中間件
// expressjwt({ secret: secretKey, algorithms: ['HS256']}) 就是用來解析 token 的中間件
// .unless({ path: [ /^\/api\// ] })) 用來指定那些接口不需要訪問權限
// / ^\/api\/ / 以 /api/ 開頭 ^ 的接口都不需要訪問權限
// \ 表示轉義
// 注意:只要配置成功了 express-jwt 這個中間件,就可以把解析出來的用戶信息,掛載到 req.auth 屬性上
app.use(expressjwt({ secret: secretKey, algorithms: ['HS256'] }).unless({ path: [ /^\/api\// ] }))

5.7.6 使用 req.auth 獲取用戶信息

express-jwt 這個中間件配置成功之后,即可在那些有權限的接口中,使用 req.auth? 對象,來訪問從 JWT 字符串中解析出來的用戶信息了,示例代碼如下:
// 這是一個有權限的 API 接口
app.get('/admin/getinfo', function (req, res) {// TODO_05:使用 req.auth 獲取用戶信息,并使用 data 屬性將用戶信息發送給客戶端console.log(req.auth)res.send({status: 200,message: '獲取用戶信息成功!',data: req.auth // 要發送給客戶端的用戶信息})
})

5.7.7 捕獲解析 JWT 失敗后產生的錯誤

當使用 express-jwt 解析 Token 字符串時,如果客戶端發送過來的 Token 字符串 過期 不合法 ,會產生一個 解析失敗 的錯誤,影響項目的正常運行。我們可以通過 Express 的錯誤中間件 ,捕獲這個錯誤并進行相關的處理,示例代碼如下:
// TODO_06:使用全局錯誤處理中間件,捕獲解析 JWT 失敗后產生的錯誤
app.use((err, req, res, next) => {// 這次錯誤是由 token 解析失敗導致的if (err.name === 'UnauthorizedError') {console.log('token 過期了。')return res.send({status: 401,message: '無效的token'})}res.send({status: 500,message: '未知的錯誤'})
})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76862.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務與Spring Cloud Alibaba簡介

微服務(或微服務架構)是一種云原生架構方法,其中單個應用程序由許多松散耦合且可獨立部署的較小組件或服務組成。本單元主要介紹微服務架構的定義、微服務的特征、微服務架構面臨的挑戰、Spring Cloud 定義、Spring Cloud 核心組件、Spring C…

JPG同步刪除RAW批處理文件

相機挑選JPG照片,同步刪除RAW格式文件,批處理文件bat,放到JPG和NEF文件夾根目錄 – NEF 文件夾 – JPG 文件夾 文件同步刪除.bat echo off:: 要同步的文件夾及文件后綴名(相同),即要刪除文件的目錄 set de…

InnoDB的MVCC實現原理?MVCC如何實現不同事務隔離級別?MVCC優缺點?

概念 InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并發控制,是一種用于處理并發事務的機制。它通過保存數據在不同時間點的多個版本,讓不同事務在同一時刻可以看到不同版本的數據,以此來減少鎖競爭&…

針對 Java從入門到精通 的完整學習路線圖、各階段技術點、CTO進階路徑以及經典書籍推薦。內容分階段展開,兼顧技術深度與職業發展

以下是針對 Java從入門到精通 的完整學習路線圖、各階段技術點、CTO進階路徑以及經典書籍推薦。內容分階段展開,兼顧技術深度與職業發展。 一、學習路線圖分階段詳解 階段1:Java基礎入門(3-6個月) 目標:掌握Java核心…

報錯:Nlopt

報錯:Nlopt CMake Error at TGH-Planner/fast_planner/bspline_opt/CMakeLists.txt:20 (find_package):By not providing "FindNLopt.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "…

鴻蒙公共通用組件封裝實戰指南:從基礎到進階

一、鴻蒙組件封裝核心原則 1.1 高內聚低耦合設計 在鴻蒙應用開發中,高內聚低耦合是組件封裝的關鍵準則,它能極大提升代碼的可維護性與復用性。 從原子化拆分的角度來看,我們要把復雜的 UI 界面拆分為基礎組件和復合組件。像按鈕、輸入框這…

Linux 網絡基礎二 ——應用層HTTP\HTTPS協議

我們程序員寫的一個個解決我們實際問題,滿足我們日常需求的網絡程序,都是在應用層。 前面寫的套接字接口都是傳輸層經過對 UDP 和 TCP 數據發送能力的包裝,以文件的形式呈現給我們,讓我們可以進行應用層編程。換而言之&#xff0c…

Spark-SQL

Spark-SQL 概述 Spark SQL 是 Spark 用于結構化數據(structured data)處理的 Spark 模塊 Shark 是伯克利實驗室 Spark 生態環境的組件之一,是基于 Hive 所開發的工具,它修改了內存管理、物理計劃、執行三個模塊,并使之能運行在 Spark 引擎上…

Java 在人工智能領域的突圍:從企業級架構到邊緣計算的技術革新

一、Java AI 的底層邏輯:從語言特性到生態重構 在 Python 占據 AI 開發主導地位的當下,Java 正通過技術重構實現突圍。作為擁有 30 年企業級開發經驗的編程語言,Java 的核心優勢在于強類型安全、內存管理能力和分布式系統支持,這…

編程實現除法程序時需要注意的細節

使用Python實現除法程序時,需注意以下關鍵細節: 除數為零的處理 必須檢查除數是否為零,否則會觸發ZeroDivisionError異常。可通過try-except結構捕獲異常并處理。 整數除法與浮點數除法的區別 ? 使用/運算符時,無論操作數是否為…

Java萬級并發場景-實戰解決

今天我們來做一個典型的消費力度能達到萬級別的并發場景,老師點名-學生簽到 正常情況 正常情況來說是不同班級下的老師發布不同的點名--然后不同班級下的很多學生同一時間進行簽到,簽到成功就去修改數據庫,簽到失敗就返回,但是這…

openGauss新特性 | 自動參數化執行計劃緩存

目錄 自動化參數執行計劃緩存簡介 SQL參數化及約束條件 一般常量參數化示例 總結 自動化參數執行計劃緩存簡介 執行計劃緩存用于減少執行計劃的生成次數。openGauss數據庫會緩存之前生成的執行計劃,以便在下次執行該SQL時直接使用,可…

計算機操作系統——存儲器管理

系列文章目錄 1.存儲器的層次結構 2.程序的裝入和鏈接 3.連續分配存儲管理方式(內存夠用) 4.對換(Swapping)(內存不夠用) 5.分頁存儲管理方式 6.分段存儲管理方式 文章目錄 系列文章目錄前言一、存儲器的存儲結構寄存器&…

KF V.S. GM-PHD

在計算機視覺的多目標跟蹤(MOT)任務中,卡爾曼濾波(KF)和高斯混合概率假設密度(GM-PHD)濾波器是兩種經典的狀態估計方法,但它們的原理和應用場景存在顯著差異。以下是兩者的核心機制和…

車載通信架構 --- DOIP系統機制初入門

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 周末洗了一個澡,換了一身衣服,出了門卻不知道去哪兒,不知道去找誰,漫無目的走著,大概這就是成年人最深的孤獨吧! 舊人不知我近況,新人不知我過…

C++對象池設計:從高頻`new/delete`到性能飛躍的工業級解決方案

一、new/delete的性能之殤:一個真實的生產事故 2023年某證券交易系統在峰值時段出現請求堆積,事后定位發現:每秒40萬次的訂單對象創建/銷毀,導致: 內存碎片率高達37%(jemalloc統計)malloc調用…

【C/C++】深入理解整型截斷與提升:原理、應用與區別

文章目錄 1. 整形截斷(Integer Truncation)1.1 整形截斷的例子1.2 整形截斷的細節 2. 整形提升(Integer Promotion)2.1 整形提升的規則2.2 整形提升的示例2.3 整形提升的實際應用2.4 整型提升與標準操作符 3. 整型截斷與提升的區別…

python藍橋杯備賽常用算法模板

一、python基礎 (一)集合操作 s1 {1,2,3} s2{3,4,5} print(s1|s2)#求并集 print(s1&s2)#求交集 #結果 #{1, 2, 3, 4, 5} #{3}(二)對多維列表排序 1.新建列表 list1[[1,2,3],[2,3,4],[0,3,2]] #提取每個小列表的下標為2的…

【模塊化拆解與多視角信息3】教育背景:學歷通脹時代的生存法則

教育背景:學歷通脹時代的生存法則 寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算…

uniapp實現H5頁面麥克風權限獲取與錄音功能

1.權限配置 在uni-app開發H5頁面時,需要在manifest.json文件中添加錄音權限的配置。具體如下: {"h5": {"permissions": {"scope.record": {"desc": "請授權使用錄音功能"}}} }這段配置代碼是用于向…