【綜合項目】api系統——基于Node.js、express、mysql等技術

目錄

0 前言?

1 初始化

2 注冊登錄?

2.1 注冊

2.1.1 功能:密碼加密(2.3.3)

2.1.1.1 操作?

2.1.1.2 bcryptjs詳解

2.1.2 插入新用戶(2.3.4)?

?2.1.3?優化:表單數據驗證(2.5)

2.1.3.1 過時代碼修正

2.1.3.2 關鍵操作

2.2 登錄?

2.2.1 判斷密碼是否正確(2.6.3)

2.2.2 生成 JWT 的 Token 字符串的注意點(2.6.4)

3 個人中心

3.1 更新用戶基本信息

3.1.1?驗證表單數據(3.2.2)

3.2 重置密碼

3.2.1 驗證表單數據(3.3.2)

3.3 更新頭像

3.3.1 驗證表單數據(3.4.2)

4 文章分類管理

4.1?根據Id更新文章分類數據

4.1.1?查詢分類名稱與別名是否被占用(4.5.4)

5 文章管理

5.1 發布新文章

5.1.1?使用 multer 解析表單數據(5.2.3)

?5.1.2 驗證表單數據(5.2.4)

5.1.3 新建數據對象(5.2.5)


0 前言?

本章僅記錄部分功能代碼(以前文章中未涉及的新內容)以及所遇到的問題

詳細內容見??項目首頁 - api系統 - GitCode??中的指導文檔

???最終完整代碼也會上傳至GitCode中,收藏方便查找

注:部分標題后面跟了原文檔中的序號,方便查看


1 初始化

此部分暫無內容


2 注冊登錄?

2.1 注冊

2.1.1 功能:密碼加密(2.3.3)

2.1.1.1 操作?

使用 bcryptjs 對用戶密碼進行加密?

安裝指定版本的?bcryptjs :

npm i bcryptjs@2.4.3

導入 bcryptjs :

const bcrypt = require('bcryptjs')

在注冊用戶的處理函數中,確認用戶名可用之后,調用 bcrypt.hashSync(明文密碼, 隨機鹽的長度) 方法,對用戶的密碼進行加密處理:

// 對用戶的密碼,進行 bcrype 加密,返回值是加密之后的密碼字符串
userinfo.password = bcrypt.hashSync(userinfo.password, 10)

2.1.1.2 bcryptjs詳解

bcrypt.hashSync?是 `bcrypt` 庫中用于同步生成哈希值的函數,在 Node.js 中經常使用該庫來對密碼等敏感信息進行哈希處理。以下詳細介紹 bcrypt.hashSync?函數的參數:

函數

bcrypt.hashSync(data, saltOrRounds);

參數說明

1. data
類型:string
描述:需要進行哈希處理的數據,通常是用戶的密碼。這是一個必需的參數,代表你要加密的原始文本。

2. saltOrRounds
類型:string 或 number
描述:該參數可以是一個鹽值(string 類型),也可以是生成鹽的輪數(number 類型)。

當 saltOrRounds 為 number 類型時
它代表生成鹽的輪數,也稱為成本因子(cost factor)。這個值越大,生成鹽和哈希值所花費的時間就越長,安全性也相對更高。推薦的值通常在 10 - 12 之間。
bcrypt 會根據這個輪數自動生成一個隨機的鹽值,然后使用這個鹽值對 data 進行哈希處理。

當 saltOrRounds 為 string 類型時
它代表一個預先定義好的鹽值。使用自定義鹽值時,每次使用相同的鹽和數據進行哈希處理,會得到相同的哈希結果。
一般情況下,不建議手動指定鹽值,因為 bcrypt 自動生成的隨機鹽值可以更好地保證安全性。

返回值

bcrypt.hashSync 函數會返回一個包含鹽值和哈希值的字符串,這個字符串可以安全地存儲在數據庫中,用于后續的密碼驗證。


2.1.2 插入新用戶(2.3.4)?

判斷插入是否成功

if (results.affectedRows !== 1) {
return res.send({ status: 1, message: '注冊用戶失敗,請稍后再試!' })
}

即判斷影響數據行數是否為1


?2.1.3?優化:表單數據驗證(2.5)

2.1.3.1 過時代碼修正

const joi = require('@hapi/joi') 的寫法現在已經失效,

應該這樣導入:const joi = require('joi')


2.1.3.2 關鍵操作

安裝 @hapi/joi 包,為表單中攜帶的每個數據項,定義驗證規則:

npm install @hapi/joi@17.1.0

安裝 @escook/express-joi 中間件,來實現自動對表單數據進行驗證的功能:

 npm i @escook/express-joi

常用驗證規則:

除此之外,本文下方的驗證表單數據中還包含一些其他常用規則

 /*** string() 值必須是字符串* alphanum() 值只能是包含 a-zA-Z0-9 的字符串* min(length) 最小長度* max(length) 最大長度* required() 值是必填項,不能為 undefined* pattern(正則表達式) 值必須符合正則表達式的規則*/

注意:一定要先指定一種數據類型string()或者其他(包括any()),然后才能執行后續操作


導出規則

// 注冊和登錄表單的驗證規則對象
exports.reg_login_schema = {
// 表示需要對 req.body 中的數據進行驗證body: {username,password,},}

使用規則

 // 1. 導入驗證表單數據的中間件
const expressJoi = require('@escook/express-joi')// 2. 導入需要的驗證規則對象
const { reg_login_schema } = require('../schema/user')//...router.post('/reguser', expressJoi(reg_login_schema), userHandler.regUser)

2.2 登錄?

2.2.1 判斷密碼是否正確(2.6.3)

使用加密密碼的包bcrypt

返回值是布爾值(true 一致、false 不一致)

bcrypt.compareSync(用戶提交的密碼, 數據庫中的密碼)

?示例:

// 拿著用戶輸入的密碼,和數據庫中存儲的密碼進行對比
const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
// 如果對比的結果等于 false, 則證明用戶輸入的密碼錯誤
if (!compareResult) {return res.cc('登錄失敗!')
}
// TODO:登錄成功,生成 Token 字符串

2.2.2 生成 JWT 的 Token 字符串的注意點(2.6.4)

核心注意點:在生成 Token 字符串的時候,一定要剔除 密碼 和 頭像 的值?

通過 ES6 的高級語法,快速剔除 密碼 和 頭像 的值:?

// 剔除完畢之后,user 中只保留了用戶的 id, username, nickname, email 這四個屬性的值
const user = { ...results[0], password: '', user_pic: '' }

3 個人中心

3.1 更新用戶基本信息

3.1.1?驗證表單數據(3.2.2)

記錄新屬性

 const id = joi.number().integer().min(1).required()const nickname = joi.string().required()const email = joi.string().email().required()

integer() 方法用于驗證一個值是否為整數?


3.2 重置密碼

3.2.1 驗證表單數據(3.3.2)

body: {// 使用 password 這個規則,驗證 req.body.oldPwd 的值oldPwd: password,newPwd: joi.not(joi.ref('oldPwd')).concat(password),},

? 使用 joi.not(joi.ref('oldPwd')).concat(password) 規則,驗證 req.body.newPwd 的值

? 解讀:

? ? 1. joi.ref('oldPwd') 表示 newPwd 的值必須和 oldPwd 的值保持一致

? ? 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值

? ? 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 這兩條驗證規則


3.3 更新頭像

3.3.1 驗證表單數據(3.4.2)

// dataUri() 指的是如下格式的字符串數據:
// data:image/png;base64,VE9PTUFOWVNFQ1JFVFM=const avatar = joi.string().dataUri().required()

dataUrl() 方法用于驗證一個字符串是否符合數據 URL 的格式


4 文章分類管理

4.1?根據Id更新文章分類數據

4.1.1?查詢分類名稱與別名是否被占用(4.5.4)

SELECT * FROM ev_article_cate WHERE Id <> ? AND (name = ? or alias = ?)

注意:已有數據的情況下進行更新內容,需要排除當前數據的內容,否做無法做到部分內容修改!


5 文章管理

5.1 發布新文章

5.1.1?使用 multer 解析表單數據(5.2.3)

URL-encoded:適用于傳輸簡單的文本數據,例如表單中的文本字段

multipart/form-data:適用于上傳文件或包含二進制數據的表單

注意:使用 express.urlencoded() 中間件無法解析 multipart/form-data 格式的請求體數據

當前項目,推薦使用 multer 來解析 multipart/form-data 格式的表單數據

安裝:

 npm i multer@1.4.2

創建與使用:

// 導入解析 formdata 格式表單數據的包
const multer = require('multer')// 導入處理路徑的核心模塊
const path = require('path')
// 創建 multer 的實例對象,通過 dest 屬性指定文件的存放路徑
const upload = multer({ dest: path.join(__dirname, '../uploads') })// 發布新文章的路由
// upload.single() 是一個局部生效的中間件,用來解析 FormData 格式的表單數據
// 將文件類型的數據,解析并掛載到 req.file 屬性中
// 將文本類型的數據,解析并掛載到 req.body 屬性中
router.post('/add', upload.single('cover_img'), article_handler.addArticle)

之后文本類型的數據,即字段會通過joi來進行規則驗證,但是文件類型的數據不行,得額外用if判斷?


?5.1.2 驗證表單數據(5.2.4)

注意:先后順序一定不能變,因為multer會將其他字段掛載到req.body上,如果在joi之后,會導致部分字段不會被joi檢測

// 導入驗證數據的中間件
const expressJoi = require('@escook/express-joi')// 導入文章的驗證模塊
const { add_article_schema } = require('../schema/article')// 發布新文章的路由
// 注意:在當前的路由中,先后使用了兩個中間件:
//       先使用 multer 解析表單數據
//       再使用 expressJoi 對解析的表單數據進行驗證
router.post('/add', upload.single('cover_img'), expressJoi(add_article_schema), 
article_handler.addArticle)

驗證文件類型:

 // 發布新文章的處理函數
exports.addArticle = (req, res) => {// 手動判斷是否上傳了文章封面if (!req.file || req.file.fieldname !== 'cover_img') return res.cc('文章封面是必選
參數!')// TODO:表單數據合法,繼續后面的處理流程...})

5.1.3 新建數據對象(5.2.5)

 const articleInfo = {// 標題、內容、狀態、所屬的分類Id...req.body,// 文章封面在服務器端的存放路徑cover_img: path.join('/uploads', req.file.filename),// 文章發布時間pub_date: new Date(),// 文章作者的Idauthor_id: req.user.id,}

斷更...

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

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

相關文章

tableau之標靶圖、甘特圖和瀑布圖

一、標靶圖 概念 標靶圖&#xff08;Bullet Chart&#xff09;是一種用于顯示數據與目標之間關系的可視化圖表&#xff0c;常用于業務和管理報告中。其設計旨在用來比較實際值與目標值&#xff0c;同時展示額外的上下文信息&#xff08;如趨勢&#xff09;。 作用 可視化目標…

Linux下的網絡通信編程

在不同主機之間&#xff0c;進行進程間的通信。 1解決主機之間硬件的互通 2.解決主機之間軟件的互通. 3.IP地址&#xff1a;來區分不同的主機&#xff08;軟件地址&#xff09; 4.MAC地址&#xff1a;硬件地址 5.端口號&#xff1a;區分同一主機上的不同應用進程 網絡協議…

網絡七層模型—OSI參考模型詳解

網絡七層模型&#xff1a;OSI參考模型詳解 引言 在網絡通信的世界中&#xff0c;OSI&#xff08;Open Systems Interconnection&#xff09;參考模型是一個基礎且核心的概念。它由國際標準化組織&#xff08;ISO&#xff09;于1984年提出&#xff0c;旨在為不同廠商的設備和應…

530 Login fail. A secure connection is requiered(such as ssl)-java發送QQ郵箱(簡單配置)

由于cs的csdN許多文章關于這方面的都是vip文章&#xff0c;而本文是免費的&#xff0c;希望廣大網友覺得有幫助的可以多點贊和關注&#xff01; QQ郵箱授權碼到這里去開啟 授權碼是16位的字母&#xff0c;填入下面的mail.setting里面的pass里面 # 郵件服務器的SMTP地址 host…

Sqlserver安全篇之_TLS的證書概念

證書的理解 參考Sqlserver的官方文檔https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/certificate-overview?viewsql-server-ver16 TLS(Transport Layer Security)傳輸層安全和SSL(Secure Sockets Layer)安全套接字層協議位于應用程序協議層和TCP/…

【SQL】掌握SQL查詢技巧:數據分組與排序

目錄 1. GROUP BY 1.1 定義與用途1.2 示例說明1.3 注意事項1.4 可視化示例 2. ORDER BY 2.1 定義與用途2.2 升序說明&#xff08;默認&#xff09;2.3 降序排序2.4 多列排序2.5 可視化示例 3. GROUP BY 與 ORDER BY 的結合使用4. 可視化示例總結 在數據庫管理中&#xff0c;S…

SOME/IP-SD -- 協議英文原文講解6

前言 SOME/IP協議越來越多的用于汽車電子行業中&#xff0c;關于協議詳細完全的中文資料卻沒有&#xff0c;所以我將結合工作經驗并對照英文原版協議做一系列的文章。基本分三大塊&#xff1a; 1. SOME/IP協議講解 2. SOME/IP-SD協議講解 3. python/C舉例調試講解 5.1.3.1 E…

NameError: name ‘libpaddle‘ is not defined

問題場景&#xff1a; Error: Can not import paddle core while this file exists: C:\Users\Admin\AppData\Roaming\Python\Python38\site-packages\paddle\fluid\libpaddle.pyd Traceback (most recent call last): File "C:\Users\Admin\AppData\Roaming\Python\Pyth…

青少年編程與數學 02-010 C++程序設計基礎 11課題、程序結構

青少年編程與數學 02-010 C程序設計基礎 11課題、程序結構 一、C程序結構二、main函數1. main 函數的基本形式1.1 無參數形式1.2 帶參數形式 2. 參數解釋3. 示例3.1 無參數形式3.2 帶參數形式 4. 編譯和運行4.1 編譯4.2 運行 5. main 函數的返回值6. 總結 三、預處理指令1. #in…

【Linux】learning notes(3)make、copy、move、remove

文章目錄 1、mkdir &#xff08;make directory&#xff09;2、rmdir &#xff08;remove directory&#xff09;3、rm&#xff08;remove&#xff09;4、>5、touch 新建文件6、mv&#xff08;move&#xff09;7、cp&#xff08;copy&#xff09; 1、mkdir &#xff08;make…

智能AI替代專家系統(ES)、決策支持系統(DSS)?

文章目錄 前言一、專家系統&#xff08;ES&#xff09;是什么&#xff1f;二、決策支持系統&#xff08;DSS&#xff09;是什么&#xff1f;1.決策支持系統定義2.決策系統的功能與特點3.決策支持系統的組成 三、專家系統&#xff08;ES&#xff09;與決策支持系統&#xff08;D…

實現Python+Django+Transformers庫中的BertTokenizer和BertModel來進行BERT預訓練,并將其應用于商品推薦功能

一、環境安裝準備 #git拉取 bert-base-chinese 文件#創建 虛擬運行環境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安裝 Djangopip3 install Django5.1#安裝 pymysql settings.py 里面需要 # 強制…

Qt Creator + CMake 構建教程

此教程基于: Qt 6.7.4Qt Creator 15.0.1CMake 3.26.4 Qt 6 以下的版本使用 CMake 構建可能會存在一些問題. 目錄 新建窗體工程更新翻譯添加資源軟件部署(Deploy) 此教程描述了如何一步步在 Qt Creator 中使用 CMake 構建應用程序工程. 涉及 新建窗體工程, 更新翻譯, 添加資源, …

5個GitHub熱點開源項目!!

1.自托管 Moonlight 游戲串流服務&#xff1a;Sunshine 主語言&#xff1a;C&#xff0c;Star&#xff1a;14.4k&#xff0c;周增長&#xff1a;500 這是一個自托管的 Moonlight 游戲串流服務器端項目&#xff0c;支持所有 Moonlight 客戶端。用戶可以在自己電腦上搭建一個游戲…

【Mark】記錄用寶塔+Nginx+worldpress+域名遇到的跨域,301,127.0.0.1,CSS加載失敗問題

背景 想要用寶塔搭建worldpress&#xff0c;然后用域名直接轉https&#xff0c;隱藏掉ipport。 結果被折磨了1天&#xff0c;一直在死活在301&#xff0c;127.0.0.1打轉 還有css加載不了的情況 因為worldpress很多是301重定向的&#xff0c;所以改到最后我都不知道改了什么&am…

認知動力學視角下的生命優化系統:多模態機器學習框架的哲學重構

認知動力學視角下的生命優化系統&#xff1a;多模態機器學習框架的哲學重構 一、信息熵與生命系統的耗散結構 在熱力學第二定律框架下&#xff0c;生命系統可視為負熵流的耗散結構&#xff1a; d S d i S d e S dS d_iS d_eS dSdi?Sde?S 其中 d i S d_iS di?S為內部熵…

考慮復雜遭遇場景下的COLREG,基于模型預測人工勢場的船舶運動規劃方法附Matlab代碼

考慮復雜遭遇場景下的COLREG&#xff0c;基于模型預測人工勢場的船舶運動規劃方法附Matlab代碼 一、引言 1.1、研究背景和意義 隨著全球航運業的迅猛發展&#xff0c;船舶交通密度不斷增大&#xff0c;海上交通事故頻發&#xff0c;嚴重威脅到海上航行的安全。國際海上避碰規…

基于Kerberos認證對接華為云Elasticsearch

可以通過華為官方提供的Elasticsearch Java客戶端&#xff08;基于Elasticsearch官方版本改造&#xff09;&#xff0c;實現基于Kerberos認證訪問和操作華為云Elasticsearch&#xff1b;亦可以使用更加通用的開源Elasticsearch Java客戶端bboss&#xff0c;實現基于Kerberos認證…

【湖北省計算機信息系統集成協會主辦,多高校支持 | ACM出版,EI檢索,往屆已見刊檢索】第二屆邊緣計算與并行、分布式計算國際學術會議(ECPDC 2025)

第二屆邊緣計算與并行、分布式計算國際學術會議&#xff08;ECPDC 2025&#xff09;將于2025年4月11日至13日在中國武漢盛大召開。本次會議旨在為邊緣計算、并行計算及分布式計算領域的研究人員、學者和行業專家提供一個高水平的學術交流平臺。 隨著物聯網、云計算和大數據技術…

CSS—背景屬性與盒子模型(border、padding、margin)

目錄 一.背景屬性 二.盒子模型 1.邊框border a. 圓角屬性border-radius b. 圖像屬性border-image 2. 內邊距padding 3. 外邊距margin 3. 寬度width與高度height 一.背景屬性 瀏覽器背景圖默認是平鋪效果&#xff08;復制圖片直至填滿設置的區域大小&#xff09; 背景…