99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Node.js+Express+MySQL寵物用品購物網(wǎng)站開發(fā)實(shí)戰(zhàn):畢業(yè)設(shè)計(jì)完整指南

Node.js+Express+MySQL寵物用品購物網(wǎng)站開發(fā)實(shí)戰(zhàn):畢業(yè)設(shè)計(jì)完整指南 簡介這是基于Node.js、Express與MySQL構(gòu)建的前后端分離寵物用品購物網(wǎng)站畢業(yè)設(shè)計(jì)源碼面向計(jì)算機(jī)專業(yè)畢業(yè)生、課程設(shè)計(jì)學(xué)生以及全棧開發(fā)入門者可完整學(xué)習(xí)后端服務(wù)搭建、數(shù)據(jù)庫設(shè)計(jì)、接口開發(fā)及前端交互的電商項(xiàng)目實(shí)踐。壓縮包共669個(gè)文件總大小12.02MB包含193個(gè)js邏輯文件路由、中間件、業(yè)務(wù)處理、39個(gè)vue頁面組件、51個(gè)css樣式、28個(gè)html頁面、1個(gè)sql數(shù)據(jù)庫腳本以及5個(gè)bat輔助啟動(dòng)腳本并配有svg、gif、jpg、png等圖片素材、字體文件及Markdown說明文檔目錄結(jié)構(gòu)完整解壓后可直接部署運(yùn)行。目前已有95人學(xué)習(xí)下載適合作為畢業(yè)設(shè)計(jì)答辯、課程作業(yè)或商城項(xiàng)目原型參考。項(xiàng)目覆蓋商品瀏覽、購物車、訂單管理、用戶注冊(cè)登錄等核心業(yè)務(wù)模塊同時(shí)涉及Node.js異步編程、Express路由與中間件、MySQL數(shù)據(jù)持久化、RESTful API設(shè)計(jì)、JWT用戶認(rèn)證、模板引擎渲染、JSON數(shù)據(jù)交互、支付接口預(yù)留以及測試部署思路等關(guān)鍵技術(shù)點(diǎn)并附帶啟動(dòng)腳本和數(shù)據(jù)庫初始化文件幫助讀者系統(tǒng)掌握全棧開發(fā)流程便于快速上手和二次擴(kuò)展。1. 畢業(yè)設(shè)計(jì)選「寵物用品購物網(wǎng)站」最怕的不是做不完而是做完講不清畢業(yè)設(shè)計(jì)選「寵物用品購物網(wǎng)站」這個(gè)題目最怕的不是功能做不完而是做完之后講不清楚里面的技術(shù)點(diǎn)?;?Node.js Express MySQL 的前后端分離實(shí)現(xiàn)恰好壓在一個(gè)很舒服的位置功能上有商品瀏覽、搜索、購物車、下單、訂單管理足夠支撐起一份完整的畢業(yè)設(shè)計(jì)或課程設(shè)計(jì)技術(shù)上沒有引入 Redis、消息隊(duì)列這類難講清楚的東西前后端之間的每一次數(shù)據(jù)交換都能畫出明確的流程圖。這套源碼不追求炫技它的價(jià)值在于讓你在兩周內(nèi)復(fù)現(xiàn)出一個(gè)能跑、能截圖、能在答辯時(shí)講明白的電商閉環(huán)。正在找設(shè)計(jì)題目的同學(xué)或者想用 Node.js 棧做項(xiàng)目實(shí)踐的開發(fā)者都可以用它作為起點(diǎn)。2. 動(dòng)手之前Node.js 版本、MySQL 8.0 初始化和建庫的完整細(xì)節(jié)2.1 為什么是 Node.js Express MySQL而不是 Spring Boot 或 PHP選擇技術(shù)棧的底層邏輯不是「哪個(gè)火選哪個(gè)」而是「答辯被追問時(shí)你有多大的把握解釋清楚」。Java Spring Boot 在畢業(yè)設(shè)計(jì)里確實(shí)主流但很多同學(xué)在答辯時(shí)會(huì)被問到「Spring 的 Bean 生命周期」「自動(dòng)配置原理」這些問題對(duì)于只做了 CRUD 的人來說很難答好。PHP 寫起來快但簡歷和項(xiàng)目呈現(xiàn)上都顯得不夠新。Node.js Express 的優(yōu)勢(shì)是語言單一前端 Vue 用的是 JavaScript后端 Express 也是 JavaScript你只需要熟練一種語法就能打通前后端。從架構(gòu)上講這套組合的請(qǐng)求鏈路非常板書友好Vue 頁面通過 axios 發(fā)起 HTTP 請(qǐng)求 → Express 路由層接收 → Controller 處理業(yè)務(wù)邏輯 → 通過 mysql2 查詢數(shù)據(jù)庫 → 返回 JSON 給前端渲染。每一步都有一個(gè)明確的「層」每一層都有對(duì)應(yīng)的目錄和文件這在答辯畫架構(gòu)圖時(shí)是天然分層的。而且 Express 的中間件機(jī)制是必考點(diǎn)——app.use(cors())、app.use(bodyParser.json())、app.use(/api/user, require(./routes/user))這三行代碼擺在黑板上就能把「洋蔥模型」「中間件執(zhí)行順序」這些概念串起來老師在這一點(diǎn)上通常愿意給高分。2.2 環(huán)境搭建Node.js 版本選擇以及 MySQL 免安裝版的血淚經(jīng)歷先說版本結(jié)論。Node.js 裝 16 或 18 的 LTS 版本不要追新裝 20 以上的奇數(shù)版本。原因很現(xiàn)實(shí)源碼包里用到的某個(gè)依賴可能在最新版 Node 上有棄用警告雖然不影響運(yùn)行但答辯演示時(shí)控制臺(tái)飄一堆警告也不太好看。MySQL 裝 8.0 系列別下載 5.7因?yàn)?8.0 對(duì) utf8mb4 字符集、JSON 函數(shù)、窗口函數(shù)的支持更完整而且現(xiàn)在的教程、踩坑記錄基本都是針對(duì) 8.0 寫的遇到問題更容易搜到答案。Windows 上安裝 Node.js 沒什么好說的官網(wǎng)下載 LTS 版本一路 Next 即可。MySQL 才是重頭戲。如果你下載的是 zip 免安裝版會(huì)踩到整個(gè)項(xiàng)目里最麻煩的一個(gè)坑——沒有data目錄。第一次啟動(dòng)net start mysql會(huì)直接失敗錯(cuò)誤日志里寫Data Dictionary initialization failed。原因是免安裝版不會(huì)自動(dòng)初始化數(shù)據(jù)目錄。我一般這樣處理# 以管理員身份打開命令行進(jìn)入解壓后的 MySQL 目錄 # 初始化數(shù)據(jù)目錄這一步會(huì)在輸出日志里生成一個(gè)臨時(shí) root 密碼 mysqld --initialize --console # 初始化完成后把 MySQL 注冊(cè)成 Windows 服務(wù) mysqld --install MySQL # 啟動(dòng)服務(wù) net start MySQLmysqld --initialize --console這條命令會(huì)把初始化過程打印到控制臺(tái)其中有一行temporary password is generated后面跟著臨時(shí)密碼第一次登錄必須用它登錄后馬上改密碼。注意如果你執(zhí)行了mysqld --initialize卻沒記下臨時(shí)密碼那只能刪掉 data 目錄重新初始化沒有后悔藥。我從那以后每次初始化都把控制臺(tái)輸出截圖保存。驗(yàn)證環(huán)境是否就緒node -v npm -v mysql -u root -p輸入密碼后能進(jìn)入mysql提示符說明 Node 和 MySQL 兩個(gè)基礎(chǔ)環(huán)境都通了。這里有一個(gè)容易被忽略的細(xì)節(jié)mysql -u root -p后面千萬不要直接跟密碼比如-p123456命令行會(huì)提示 warning說密碼暴露在命令行里不安全。2.3 建庫建表字符集選 utf8mb4 而不是 utf8以及商品表結(jié)構(gòu)設(shè)計(jì)登錄 MySQL 后建庫。建庫時(shí)字符集的選擇是第一個(gè)會(huì)實(shí)際踩到的坑CREATE DATABASE pet_shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE pet_shop; -- 用戶表 CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL COMMENT 存的是 bcrypt 哈希不是明文, phone VARCHAR(20), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 商品表 CREATE TABLE product ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, category VARCHAR(50) NOT NULL COMMENT 貓糧、狗糧、玩具、日用品, price DECIMAL(10,2) NOT NULL, stock INT DEFAULT 0, image VARCHAR(255) COMMENT 商品主圖路徑, description TEXT COMMENT 詳情描述支持中文和表情符號(hào) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;為什么用 utf8mb4 而不是 utf8因?yàn)?MySQL 的 utf8 實(shí)際最多存 3 字節(jié)字符而寵物用品詳情的文案里經(jīng)常有 這類 emoji它們是 4 字節(jié)的。用 utf8 建表插入 emoji 會(huì)直接報(bào)錯(cuò)Incorrect string value。這個(gè)坑早期我栽過一次后來建庫第一條命令就定死 utf8mb4。表結(jié)構(gòu)設(shè)計(jì)上有一個(gè)值得在答辯時(shí)講的點(diǎn)price為什么用DECIMAL(10,2)而不是FLOAT。因?yàn)楦↑c(diǎn)數(shù)在 MySQL 里存儲(chǔ)會(huì)丟失精度比如 19.99 在 FLOAT 存儲(chǔ)后查出來可能是 19.989999。DECIMAL 是定點(diǎn)數(shù)按字符串存儲(chǔ)不會(huì)丟精度。購物網(wǎng)站的金額計(jì)算涉及錢精度問題在答辯時(shí)是必考加分項(xiàng)。提示源碼包自帶的pet_shop.sql里已經(jīng)建好了全部表包括購物車表cart、訂單表orders、訂單明細(xì)表order_items。用mysql -u root -p pet_shop pet_shop.sql導(dǎo)入之前先確認(rèn)數(shù)據(jù)庫字符集是 utf8mb4否則導(dǎo)入后表的中文會(huì)變成亂碼。3. Express 后端實(shí)現(xiàn)路由分層、JWT 登錄和商品分頁的邊界坑3.1 入口文件與目錄分層中間件注冊(cè)順序?yàn)槭裁床荒軄y拿到源碼包后先把后端目錄結(jié)構(gòu)看清楚。這個(gè)項(xiàng)目的后端分層思路是標(biāo)準(zhǔn)的 Express 工程結(jié)構(gòu)pet-shop-server/ ├─ app.js # Express 入口 ├─ config/ │ └─ db.js # MySQL 連接配置mysql2 ├─ routes/ │ ├─ user.js # 注冊(cè)、登錄路由 │ ├─ product.js # 商品列表、搜索、詳情路由 │ └─ order.js # 下單、訂單列表路由 ├─ controllers/ │ ├─ userController.js # 業(yè)務(wù)邏輯查庫、加密、簽發(fā) token │ ├─ productController.js │ └─ orderController.js ├─ middleware/ │ └─ auth.js # JWT 鑒權(quán)中間件 └─ package.jsonroutes 只負(fù)責(zé)定義 URL 路徑真正的邏輯在 controllers 里。這個(gè)分層習(xí)慣極其重要——如果所有代碼都寫在 app.js 里前期開發(fā)快但后期調(diào)試會(huì)非常痛苦。入口文件app.js的中間件注冊(cè)順序有一點(diǎn)講究const express require(express); const cors require(cors); const bodyParser require(body-parser); const app express(); // 中間件注冊(cè)順序CORS → bodyParser → 路由 → 404 兜底 app.use(cors()); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.use(/api/user, require(./routes/user)); app.use(/api/product, require(./routes/product)); app.use(/api/order, require(./routes/order)); // 404 兜底必須放在所有路由之后 app.use((req, res) { res.status(404).json({ message: 接口不存在 }); }); app.listen(3000, () { console.log(server running at http://localhost:3000); });這段代碼里有三個(gè)細(xì)節(jié)要在答辯時(shí)能解釋。第一cors()必須放在最前面因?yàn)榭缬蛐r?yàn)發(fā)生在請(qǐng)求進(jìn)入業(yè)務(wù)處理之前如果寫成app.use(cors())之前還有別的中間件瀏覽器可能已經(jīng)攔截了響應(yīng)。第二bodyParser.urlencoded({ extended: true })不能省有些表單提交的 Content-Type 是application/x-www-form-urlencoded只配了json()解析器時(shí)請(qǐng)求體會(huì)變成空對(duì)象{}這是新手排查半天都找不到原因的經(jīng)典問題。第三404 兜底路由必須在所有業(yè)務(wù)路由注冊(cè)之后否則它會(huì)先捕獲所有請(qǐng)求。3.2 用 JWT 做登錄鑒權(quán)token 里該放什么、過期時(shí)間該設(shè)多長前后端分離架構(gòu)下登錄狀態(tài)不依賴 session因?yàn)榍岸撕秃蠖丝赡懿辉谕慌_(tái)服務(wù)器上session 存在服務(wù)端內(nèi)存里無法共享。標(biāo)準(zhǔn)做法是 JWT用戶登錄成功后后端用密鑰對(duì)用戶 id 簽名生成一個(gè) token 返回給前端前端存到 localStorage每次請(qǐng)求在 Header 里帶Authorization: Bearer token。// middleware/auth.js const jwt require(jsonwebtoken); const SECRET pet-shop-secret-key; // 實(shí)際項(xiàng)目放 .env module.exports function auth(req, res, next) { const header req.headers.authorization; if (!header) { return res.status(401).json({ message: 未登錄請(qǐng)先登錄 }); } // 格式約定Bearer tokensplit 后取第二部分 const token header.split( )[1]; try { const payload jwt.verify(token, SECRET); req.userId payload.id; // 最關(guān)鍵把用戶 id 掛到 req 對(duì)象上后面的路由直接用 next(); } catch (err) { return res.status(401).json({ message: token 無效或已過期 }); } };這段代碼是鑒權(quán)中間件的標(biāo)準(zhǔn)模板。jwt.verify會(huì)同時(shí)校驗(yàn)簽名和過期時(shí)間token 被篡改或過期都只會(huì)走到 catch 分支返回 401。登錄接口里簽發(fā) token 的邏輯// controllers/userController.js節(jié)選 const bcrypt require(bcryptjs); const jwt require(jsonwebtoken); const db require(../config/db); exports.login (req, res) { const { username, password } req.body; // 參數(shù)校驗(yàn)空值直接返回 400不要在 SQL 層面兜 if (!username || !password) { return res.status(400).json({ message: 用戶名和密碼不能為空 }); } // 參數(shù)占位符 ? 防止 SQL 注入 db.query(SELECT * FROM user WHERE username ?, [username], (err, results) { if (err) return res.status(500).json({ message: 服務(wù)器內(nèi)部錯(cuò)誤 }); if (results.length 0) { return res.status(400).json({ message: 用戶不存在 }); } const user results[0]; // bcrypt.compareSync 返回布爾值 const isMatch bcrypt.compareSync(password, user.password); if (!isMatch) { return res.status(400).json({ message: 密碼錯(cuò)誤 }); } // 簽發(fā) token有效期 7 天 const token jwt.sign( { id: user.id, username: user.username }, SECRET, { expiresIn: 7d } ); res.json({ token, username: user.username, message: 登錄成功 }); }); };JWT 的過期時(shí)間設(shè) 7 天這個(gè)選擇值得在答辯時(shí)解釋。管理后臺(tái)系統(tǒng)通常設(shè) 30 分鐘因?yàn)椴僮髅舾须娚糖岸擞脩舨豢赡苊堪胄r(shí)重新登錄一次7 天是「安全性和用戶體驗(yàn)的折中」。你能說出這個(gè)理由老師會(huì)覺得你不是隨便選了一個(gè)數(shù)字。另外注意bcrypt.compareSync是同步方法在真實(shí)高并發(fā)項(xiàng)目里應(yīng)該用異步的bcrypt.compare但畢業(yè)設(shè)計(jì)里同步方法足夠而且答辯時(shí)可以主動(dòng)提起「我知道有異步版本在高并發(fā)下性能更好」這是一個(gè)主動(dòng)展示知識(shí)邊界的好機(jī)會(huì)。3.3 商品分頁接口total 計(jì)數(shù)、offset 計(jì)算、LIMIT 綁定商品列表是所有用戶都能訪問的接口不需要 token。分頁接口有兩個(gè)容易踩的坑源碼里已經(jīng)處理好了但你需要知道原因。第一個(gè)坑是分頁偏移量的計(jì)算。前端傳page和pageSize后端算offset (page - 1) * pageSize。很多新手直接把page當(dāng) offset 用首頁能出數(shù)據(jù)翻到第二頁就重復(fù)了。第二個(gè)坑是 total 字段。分頁組件要算總頁數(shù)就必須知道總記錄數(shù)。所以接口返回里必須帶total否則前端只能靠「這頁是否還有數(shù)據(jù)」來猜測有沒有下一頁。源碼里的實(shí)現(xiàn)// controllers/productController.js節(jié)選 exports.list (req, res) { const page parseInt(req.query.page) || 1; const pageSize parseInt(req.query.pageSize) || 10; const category req.query.category || ; // 動(dòng)態(tài)拼接 WHERE 條件前提是 category 不是用戶可隨意構(gòu)造的復(fù)雜條件 let where ; const params []; if (category) { where WHERE category ?; params.push(category); } // 第一步查總數(shù) db.query(SELECT COUNT(*) AS total FROM product ${where}, params, (err, countResult) { if (err) return res.status(500).json({ message: 查詢失敗 }); const total countResult[0].total; const offset (page - 1) * pageSize; // 注意mysql2 舊版本在 LIMIT 子句里用 ? 占位可能會(huì)有問題 // 所以這里直接拼接數(shù)字offset 和 pageSize 都已經(jīng)通過 parseInt 轉(zhuǎn)成了整數(shù) const sql SELECT * FROM product ${where} ORDER BY id DESC LIMIT ${offset}, ${pageSize}; db.query(sql, params, (err, rows) { if (err) return res.status(500).json({ message: 查詢失敗 }); res.json({ list: rows, total: total, page: page, pageSize: pageSize }); }); }); };關(guān)于 LIMIT 子句的占位符問題補(bǔ)充一句mysql2 驅(qū)動(dòng)在 2.x 版本之后已經(jīng)支持LIMIT ?, ?綁定如果你用的驅(qū)動(dòng)版本較新可以寫成db.query(sql, [...params, offset, pageSize], cb)的形式。老驅(qū)動(dòng)在 LIMIT 里用占位符可能直接報(bào)語法錯(cuò)誤所以源碼里選擇直接拼接整數(shù)。這個(gè)細(xì)節(jié)在答辯時(shí)被問到時(shí)你可以回答「為了兼容 mysql2 舊版本的驅(qū)動(dòng)行為offset 和 pageSize 經(jīng)過 parseInt 后確認(rèn)是整數(shù)再直接拼進(jìn) SQL不存在注入風(fēng)險(xiǎn)如果驅(qū)動(dòng)版本支持占位符我會(huì)改成全綁定寫法?!?. 前端 Vue 對(duì)接axios 攔截器、購物車狀態(tài)和下單流程的先后順序4.1 前端目錄與 axios 封裝請(qǐng)求攔截器里自動(dòng)帶 token前端部分源碼用的是 Vue 2 Element UI這套組合在畢業(yè)設(shè)計(jì)里極其常見。目錄結(jié)構(gòu)如下pet-shop-web/ ├─ src/ │ ├─ api/ │ │ ├─ request.js # axios 實(shí)例 攔截器 │ │ ├─ product.js # 商品接口封裝 │ │ ├─ user.js # 登錄注冊(cè)封裝 │ │ └─ order.js # 訂單接口封裝 │ ├─ views/ │ │ ├─ Home.vue # 商品列表 │ │ ├─ Cart.vue # 購物車 │ │ ├─ Order.vue # 訂單確認(rèn) │ │ ├─ OrderList.vue # 訂單列表 │ │ └─ Login.vue # 登錄注冊(cè) │ ├─ router/index.js │ └─ App.vue └─ package.jsonaxios 封裝是整個(gè)前端最值得寫的一段代碼。新手最容易犯的錯(cuò)是在每個(gè)頁面里手動(dòng)寫請(qǐng)求頭token 字段在十幾個(gè)文件里重復(fù)出現(xiàn)項(xiàng)目一大就失控。正確做法是在請(qǐng)求攔截器里統(tǒng)一注入// src/api/request.js import axios from axios; import router from ../router; // 創(chuàng)建 axios 實(shí)例 const request axios.create({ baseURL: http://localhost:3000/api, // 后端接口前綴 timeout: 10000 // 10 秒超時(shí) }); // 請(qǐng)求攔截器在每次發(fā)請(qǐng)求前自動(dòng)帶上 token request.interceptors.request.use(config { const token localStorage.getItem(token); if (token) { // 與后端 auth.js 里的約定一致Bearer token config.headers.Authorization Bearer ${token}; } return config; }); // 響應(yīng)攔截器統(tǒng)一處理后端返回 request.interceptors.response.use( response response.data, // 直接拿到后端 JSON 的 data 部分 error { if (error.response error.response.status 401) { // token 失效清掉本地登錄態(tài)跳登錄頁 localStorage.removeItem(token); router.push(/login); } return Promise.reject(error); } ); export default request;封裝完成之后每個(gè)接口文件就非常薄。以api/product.js為例import request from ./request; // 商品列表page、pageSize、category 都是可選參數(shù) export function getProductList(params) { return request.get(/product/list, { params }); } // 商品詳情 export function getProductDetail(id) { return request.get(/product/detail/${id}); }response response.data這一行作用是省去每個(gè)組件里都寫一層res.data.data的麻煩。封裝不好的項(xiàng)目里往往會(huì)出現(xiàn)res.data.data.data這種三層嵌套就是因?yàn)?axios 默認(rèn)返回的 response 對(duì)象包了一層{ status, headers, data }。這里直接剝到業(yè)務(wù)數(shù)據(jù)層。4.2 購物車邏輯未登錄存 localStorage登錄后走后端接口購物車的設(shè)計(jì)是這個(gè)項(xiàng)目里一個(gè)很有區(qū)分度的點(diǎn)。它的設(shè)計(jì)是未登錄時(shí)購物車數(shù)據(jù)存在前端localStorage用戶登錄后購物車數(shù)據(jù)存 MySQL 的cart表。為什么要這么做因?yàn)橛脩艨赡苓€沒登錄就開始逛加了幾件商品到購物車然后去登錄登錄完成后購物車?yán)锏纳唐凡荒軄G。這個(gè)「合并購物車」的邏輯一定是在登錄接口成功的回調(diào)里執(zhí)行的。偽代碼如下// views/Login.vue 登錄成功的回調(diào)節(jié)選 async function handleLoginSuccess(token, username) { localStorage.setItem(token, token); // 1. 取出 localStorage 里未登錄時(shí)存的本地購物車 const localCart JSON.parse(localStorage.getItem(cart) || []); // 2. 本地的商品逐條加入后端購物車 for (const item of localCart) { await addToCart({ productId: item.productId, quantity: item.quantity }); } // 3. 合并完成后清空本地購物車 localStorage.removeItem(cart); // 4. 跳轉(zhuǎn)首頁 router.push(/); }這個(gè)流程的先后順序不能亂。如果先清空localStorage再合并后端購物車刷新頁面后購物車數(shù)據(jù)就丟了。如果你在答辯時(shí)把這個(gè)「先合并、后清空」的順序主動(dòng)講出來老師會(huì)覺得你處理過真實(shí)場景的邊界問題。商品列表頁的加載邏輯相對(duì)簡單核心是在onMounted里調(diào)接口// views/Home.vue import { onMounted, ref } from vue; import { getProductList } from ../api/product; const list ref([]); const total ref(0); const page ref(1); const pageSize ref(8); async function loadData() { const res await getProductList({ page: page.value, pageSize: pageSize.value }); list.value res.list; total.value res.total; } onMounted(() { loadData(); });4.3 下單流程創(chuàng)建訂單主表、扣庫存、生成明細(xì)、清空購物車的順序提交訂單這一節(jié)值得多說兩句因?yàn)檫@里的坑非常典型。前端下單邏輯如果只調(diào)一個(gè)「createOrder」接口看起來簡單但擴(kuò)展性差如果拆成四步又要面對(duì)「中間某一步失敗怎么回滾」的問題。源碼的做法是后端用 MySQL 事務(wù)把四個(gè)步驟包起來前端只調(diào)一個(gè)接口。但為了理解業(yè)務(wù)語義這里把四步拆開說明// controllers/orderController.js簡化示意真實(shí)代碼用事務(wù)包裹 exports.createOrder (req, res) { const { userId, address, items } req.body; db.beginTransaction(err { if (err) return res.status(500).json({ message: 事務(wù)開啟失敗 }); // 第一步創(chuàng)建訂單主表拿到訂單 id db.query(INSERT INTO orders (user_id, address, total_amount, status) VALUES (?, ?, ?, 0), [userId, address, items.reduce((sum, i) sum i.price * i.quantity, 0)], (err, result) { if (err) return db.rollback(() res.status(500).json({ message: 創(chuàng)建訂單失敗 })); const orderId result.insertId; // 第二步逐條扣庫存扣減前必須先查庫存是否充足 const updateStockPromises items.map(item { return new Promise((resolve, reject) { db.query( UPDATE product SET stock stock - ? WHERE id ? AND stock ?, [item.quantity, item.productId, item.quantity], (err, updateResult) { // affectedRows 0 說明庫存不足UPDATE 條件不滿足 if (updateResult.affectedRows 0) { reject(new Error(商品 ${item.productId} 庫存不足)); } else { resolve(); } } ); }); }); Promise.all(updateStockPromises).then(() { // 第三步批量插入訂單明細(xì) const detailValues items.map(i [orderId, i.productId, i.quantity, i.price]); db.query(INSERT INTO order_items (order_id, product_id, quantity, price) VALUES ?, [detailValues], (err) { if (err) return db.rollback(() res.status(500).json({ message: 訂單明細(xì)寫入失敗 })); // 第四步清空用戶購物車 db.query(DELETE FROM cart WHERE user_id ?, [userId], (err) { if (err) return db.rollback(() res.status(500).json({ message: 清空購物車失敗 })); db.commit(err { if (err) return db.rollback(() res.status(500).json({ message: 事務(wù)提交失敗 })); res.json({ orderId, message: 訂單創(chuàng)建成功 }); }); }); }); }).catch(err { db.rollback(() res.status(500).json({ message: err.message })); }); }); }); };這段代碼的核心設(shè)計(jì)點(diǎn)是UPDATE product SET stock stock - ? WHERE id ? AND stock ?這條 SQL 自帶庫存檢查。如果在業(yè)務(wù)代碼里先查庫存再更新中間有并發(fā)請(qǐng)求插進(jìn)來就會(huì)超賣把檢查放進(jìn) UPDATE 的 WHERE 條件里就是所謂「原子操作」數(shù)據(jù)庫引擎保證同一時(shí)間只有一條 SQL 在執(zhí)行。這是電商項(xiàng)目里防超賣的標(biāo)準(zhǔn)做法也是答辯時(shí)最亮眼的一個(gè)技術(shù)點(diǎn)。另外一個(gè)細(xì)節(jié)事務(wù)里任何一個(gè)步驟出錯(cuò)前面所有已執(zhí)行的操作都要回滾否則會(huì)出現(xiàn)「訂單表有記錄但商品庫存沒減」的數(shù)據(jù)不一致。所以代碼里每個(gè)出錯(cuò)分支都要調(diào)用db.rollback()。這個(gè)「要么全部成功要么全部失敗」的思想在答辯時(shí)是絕對(duì)的高頻考點(diǎn)。5. 避坑與常見問題排查環(huán)境權(quán)限、MySQL 啟動(dòng)、跨域與亂碼5.1 npm 無法加載文件PowerShell 執(zhí)行策略限制的官方解法現(xiàn)象在 Windows PowerShell 里運(yùn)行npm start報(bào)錯(cuò)npm : 無法加載文件 C:\Program Files\nodejs\npm.ps1因?yàn)樵诖讼到y(tǒng)上禁止運(yùn)行腳本。原因Windows PowerShell 的默認(rèn)執(zhí)行策略是 Restricted禁止運(yùn)行任何 .ps1 腳本而 npm 在 PowerShell 里的包裝命令恰好是npm.ps1。不是 npm 安裝壞了是系統(tǒng)安全策略攔住了。解決以管理員身份打開 PowerShell執(zhí)行# RemoteSigned允許本地腳本運(yùn)行遠(yuǎn)程下載的腳本必須帶簽名 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned輸出問詢時(shí)輸入Y確認(rèn)。改完后退出 PowerShell 重新打開再執(zhí)行npm -v能返回版本號(hào)就說明問題解決了。這里要提示一句不要為了省事設(shè)成Unrestricted它會(huì)允許所有腳本運(yùn)行有安全風(fēng)險(xiǎn)。5.2 MySQL 服務(wù)啟動(dòng)失敗net start mysql 報(bào)錯(cuò)或自動(dòng)停止現(xiàn)象net start mysql提示服務(wù)正在啟動(dòng)幾秒后報(bào)「服務(wù)無法啟動(dòng)」或者服務(wù)列表里顯示運(yùn)行中但端口沒監(jiān)聽。原因最常見的是免安裝版 MySQL 沒有初始化data目錄或者my.ini配置文件里的basedir和datadir路徑寫錯(cuò)。服務(wù)啟動(dòng)時(shí)找不到數(shù)據(jù)目錄直接退出。解決按照第 2.2 節(jié)提到的方法先刪除或確認(rèn)data目錄不存在然后執(zhí)行# 重新初始化數(shù)據(jù)目錄 mysqld --initialize --console初始化完成后確認(rèn)my.ini里datadir指向的是剛生成的 data 目錄路徑。路徑里如果有中文可能會(huì)出問題建議把 MySQL 放到純英文路徑下。還有一種情況是端口被占用——用netstat -ano | findstr 3306查看 3306 端口是否被其他進(jìn)程占據(jù)常見沖突是之前在電腦上裝過 MariaDB 或者另一個(gè) MySQL 服務(wù)。5.3 前端請(qǐng)求被 CORS 攔截Network 里能看到響應(yīng)但 axios 拿不到數(shù)據(jù)現(xiàn)象前端跑在http://localhost:8080后端跑在http://localhost:3000瀏覽器控制臺(tái)報(bào)CORS policy錯(cuò)誤Network 面板里看這次請(qǐng)求其實(shí)已經(jīng)發(fā)出去了響應(yīng)也回來了但 axios 的then里拿不到數(shù)據(jù)。原因跨域是瀏覽器的安全限制兩個(gè)地址「協(xié)議 域名 端口」三者有一個(gè)不同就是跨域。瀏覽器默認(rèn)不允許頁面讀取跨域響應(yīng)。解決在app.js里用了cors()中間件后響應(yīng)頭里會(huì)加上Access-Control-Allow-Origin: *瀏覽器就不會(huì)攔截了。這里的關(guān)鍵是注冊(cè)順序app.use(cors())必須在掛載路由之前。如果你的后端沒引入 cors 包可以手動(dòng)加響應(yīng)頭app.use((req, res, next) { res.setHeader(Access-Control-Allow-Origin, *); res.setHeader(Access-Control-Allow-Headers, Content-Type, Authorization); res.setHeader(Access-Control-Allow-Methods, GET, POST, PUT, DELETE); if (req.method OPTIONS) { return res.sendStatus(204); } next(); });OPTIONS請(qǐng)求是瀏覽器在正式請(qǐng)求之前發(fā)送的「預(yù)檢」請(qǐng)求后端必須正確處理否則正式請(qǐng)求根本不會(huì)發(fā)出。前端如果使用了Authorization頭Access-Control-Allow-Headers里必須包含Authorization否則登錄后的接口全部失效。5.4 數(shù)據(jù)庫中文亂碼顯示問號(hào)或顯示成不認(rèn)識(shí)的符號(hào)現(xiàn)象商品名稱、用戶昵稱在頁面和 MySQL Workbench 里都顯示為???或亂碼。原因字符集鏈路里任何一環(huán)斷了都會(huì)亂碼。建庫用了 latin1、連接參數(shù)沒指定 charset、或者 SQL 文件導(dǎo)入時(shí)被轉(zhuǎn)碼這三者都可能。真正的問題往往出在連接串上——就算庫和表都是 utf8mb4如果 Node.js 連接 MySQL 時(shí)沒有指定字符集驅(qū)動(dòng)默認(rèn)可能用 latin1 和你通信。解決檢查config/db.js里的連接配置const mysql require(mysql2); const connection mysql.createConnection({ host: localhost, port: 3306, user: root, password: 你的密碼, database: pet_shop, charset: utf8mb4 // 必須顯式指定 }); module.exports connection;同時(shí)確認(rèn)建庫語句里字符集是 utf8mb4。如果數(shù)據(jù)已經(jīng)在數(shù)據(jù)庫里顯示亂碼改了配置也沒用因?yàn)槟鞘且呀?jīng)存在的壞數(shù)據(jù)需要?jiǎng)h掉重插。所以我寫這篇筆記時(shí)強(qiáng)調(diào)第一步建庫就要把字符集固定后面的連接參數(shù)和創(chuàng)建表語句都統(tǒng)一用 utf8mb4亂碼問題根本不會(huì)出現(xiàn)。5.5 接口報(bào) 404 但路由看起來沒問題路徑拼寫和基礎(chǔ)前綴最容易出錯(cuò)現(xiàn)象前端調(diào)http://localhost:3000/api/user/login返回 404但代碼里app.use(/api/user, require(./routes/user))和router.post(/login)都寫得沒錯(cuò)。原因這類 404 幾乎都是路徑拼接問題——前端 baseURL 寫成了http://localhost:3000但后端路由掛了/api前綴最終請(qǐng)求拼成了http://localhost:3000/user/login。或者反過來baseURL 寫成了/api但后端沒有掛/api前綴。解決把 baseURL 和后端掛載路徑拼起來驗(yàn)證一遍前端baseURL: http://localhost:3000/api后端app.use(/api/user)router.post(/login)最終請(qǐng)求路徑是/api/user/login。另外檢查路由文件里有沒有寫錯(cuò)router.post(/login/)這種情況——Express 會(huì)忽略末尾斜杠但最好統(tǒng)一風(fēng)格。排查路徑問題時(shí)打開瀏覽器的 Network 面板看實(shí)際發(fā)出的 URL 是哪一個(gè)對(duì)照后端路由表逐段核對(duì)。6. 上線前驗(yàn)證一條完整業(yè)務(wù)鏈路走通以及一個(gè)值得試的進(jìn)階部署項(xiàng)目跑通的標(biāo)準(zhǔn)不是頁面打開沒報(bào)錯(cuò)而是「從注冊(cè)到下單」這條完整鏈路能走通。我建議你在自己電腦上嚴(yán)格執(zhí)行下面這份檢查清單每過一條畫一個(gè)勾全部通過再去考慮截圖和答辯材料。先用 Postman 或 Apifox 按順序測后端接口順序操作預(yù)期結(jié)果1POST/api/user/register提交用戶名和密碼user 表新增一條記錄密碼字段是一長串 bcrypt 哈希2POST/api/user/login提交相同密碼返回token字段登錄成功3GET/api/product/list不帶 token正常返回商品列表和 total4POST/api/order/create不帶 token返回 401提示未登錄5POST/api/order/create帶Authorization: Bearer token返回 orderIdproduct 表對(duì)應(yīng)商品庫存減少第 3 步和第 4 步是對(duì)照組用來驗(yàn)證「瀏覽商品不需要登錄、下單必須登錄」的權(quán)限設(shè)計(jì)。如果第 4 步?jīng)]有攔下來說明auth中間件沒掛到訂單路由上回去檢查routes/order.js里router.use(auth)的位置。再走前端驗(yàn)證流程注冊(cè)賬號(hào) → 登錄確認(rèn) token 寫入 localStorage→ 瀏覽商品 → 切換分類篩選 → 加入購物車 → 購物車頁改數(shù)量 → 提交訂單 → 在訂單列表頁看到剛下的單。這八步全部走通項(xiàng)目功能層面就算驗(yàn)收合格。如果你有多余時(shí)間我建議試一個(gè)進(jìn)階玩法把后端部署到一臺(tái)云服務(wù)器前端打包后丟到 Nginx 里用proxy_pass把/api路徑轉(zhuǎn)發(fā)到 3000 端口的 Node 服務(wù)。這一步如果做成了簡歷上「獨(dú)立完成項(xiàng)目部署」這一欄就能理直氣壯地打鉤。核心配置只有一段server { listen 80; server_name your-domain.com; # 前端靜態(tài)文件 root /var/www/pet-shop-web/dist; location / { try_files $uri $uri/ /index.html; } # 把 /api 開頭的請(qǐng)求轉(zhuǎn)發(fā)給 Node.js location /api { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }這段配置解決了「前后端分離部署」的核心問題瀏覽器訪問 Nginx 拿到靜態(tài)頁面頁面里的請(qǐng)求指向同源的/api路徑Nginx 再轉(zhuǎn)發(fā)給 Node 服務(wù)。這樣前端和后端的地址統(tǒng)一了也順手解決了跨域問題。我自己每次拿到一份源碼包第一件事永遠(yuǎn)不是讀代碼而是先跑通。跑通之后再拆結(jié)構(gòu)拆完結(jié)構(gòu)再改一個(gè)功能點(diǎn)驗(yàn)證自己是否真的理解了。從那以后我每次接到項(xiàng)目都強(qiáng)制自己先「跑一遍完整鏈路再做任何修改」。因?yàn)槟阌肋h(yuǎn)不知道這個(gè)源碼包在你的電腦上會(huì)栽在哪個(gè)版本的坑里——PowerShell 執(zhí)行策略、MySQL 臨時(shí)密碼、CORS 預(yù)檢請(qǐng)求每個(gè)人翻車的位置都不一樣。希望這篇筆記能幫你在答辯前少走幾個(gè)彎路把時(shí)間花在真正值得講清楚的技術(shù)點(diǎn)上。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
综合久久人妻| 激情涩播| 91无码高清| 色婷婷婷av| 色护士综合| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 可以看的av| 亚洲五月天激情| 狠狠干2007| www.五月天婷婷| 五月婷婷激情在线| 思思热99er| 亚洲激情网| 五月天 另类图片| 婷婷九月激情| 六月色色综合| 激情网 五月天| 日韩超碰在线| 婷婷激情人妻| 五月丁香色婷婷久久| 日本综合99| 99激情视频| 人妻视频在线| 欧美精品99| 五月婷婷六月丁香综合在线| 亚洲第一精品成人999久久精品| eeuss人妻| 9久国产精品| 久久婷婷六月综合综合| 丁香花成人区| www.久久爱.com| 在线91日韩| 日本WwW色偷偷丁香花久久久京东热| 五月婷婷中文字幕| 丁香五月天社区| 伊人久久大香网| 亭亭玉月丁香| 婷婷99狠狠躁天天躁| 综合XX网| 狠狠综合网| 26uuu精品一区二区| 色爱99| 久热精品视频| 丁香五月婷婷在线| 曰曰久久| 丁香五月激情网| 天天操人人干| 成人做爰A片免费看视频| 精品无码久久久久久久久| 婷婷五月天影院| 色婷婷综合网| 丁香六月丁香婷婷激情| 综合久久伊人| 国产在线黄色| 综合网激情五月天| 五月丁香成人视频| 99热伊人| 九九丁香社区欧美激情| 2021日韩无码| 噜噜噜噜婷婷五月天| 五月婷婷色| 大香蕉AV在线| 色情一区二区播放| 丁香五月欧美激情| 成人无码精品1区2区3区免费看| 老师的粉嫩小又紧水又多A片视频| 第九色区av天堂| 中文字幕无码人妻少妇免费视频| 激情九九九九| 99久久99久久综合| 中文不卡一二区| 淑女丝袜bi操逼123| 婷婷五月天福利| 97综合在线| 九九视频这里只有精品| 久久色大香蕉| ww久久| 色丁香五月婷婷婷| 天天爽天天摸天天爱| 噜啊噜在线| 九九AV在线| 亚洲免费婷婷| 九九久久免费视频44| 91视频一起草| 天天干天天色天天干| 六月丁香婷婷五月| 深爱激情丁香| 色婷久| 色五月婷婷丁香凹凸| 91黄色五月天视频| 日本一级一级一级一级| 夜夜干天天干| 香蕉综合网| 九九色插| 丁香香五月激情免费视频| 久久这里只有精品网| 五月丁香六月婷婷综合| 国产成人亚洲综合A∨婷婷| 狠狠操狠狠| 五月综合人妻| 久久激情五月| 区区欧美你爱| 96丁香六月婷婷蜜桃综合久久| 人妻熟人中文字幕一区二区| 久艹大香蕉| 激情综合五月激情17| 五月丁香六月合| 六月婷婷久久| 国产成人精品一区二三区熟女在线| 伊人爱爱日本| 婷婷五月四狠狠| 午夜电影网VA内射| 天天操天天插| 99久在线精品99re5热视频| 亚洲成人网在线观看| 99热6这里之有精品| 一本道综合网| 五月婷婷性爱| 久久婷婷夜| 伊人影音无码一区二区三区 | 91色在线| 婷婷久久亚洲| 国产古装妇女野外A片| 久久婷婷五月综合色天| sewuyue第四色| 玖玖在线视| 99原创自拍视频在线观看| 久久九精品| 亚洲色情免费网| 99热九九热| 天天肏夜夜肏| 五月丁香色色网| 色色色色色色色色网站| 无码视频国内精品久久久| 丁香婷婷色色| 久草性爱| 亚洲成人无码网站| 可以看的av网站| 荫道BBWBBB高潮潮喷| 丁香激情四射| 五月天成人在线视频网站| 九九热AV| 婷婷六月激情小说网| 天天骑天天操| 五月丁香最新| 五月天婷婷综合免费| 欧美色五月| 99自拍视频网站| 另类综合激情| 国产精品久久久久久久久久免费| 精品国产乱码久久久久久免费| 伊人大香蕉在线视频| 五丁香激情综合| 久操人妻| 亚洲思思热久| 99久久这里只有精品| h亚洲| 五月天激情婷婷小说| av中文在线| 丁香五月综合婷婷| 国产99热| 色色色综合网| 色播播五月天| 久久久思思热| 国产成人精品一区二三区熟女在线| www久| 99九九精品视频| 伊人五月综合网| 夜夜做夜夜愛| 热久久这里只有三级视频| 婷婷成人丁香色情基地30 | 激情久久 婷婷| www夜夜操wwwcon| 狠狠干五月| 小视频aaa久久久| www五月| 五月婷婷啪啪啪| 日韩超碰在线| 91chinese在线| 伊人激情| 四虎婷婷五月天| 九九在线精品| 99热这里只有精品50| 午夜不卡久久精品无码免费| 密桃激情五月天综合网| 卡视频1区2区| 99色在线观看视频| 色五月丁香五月激情五月激情| 激情视频网址| 六月综和久久| 丁香花综合永久入口| www,av好吊操| 玖玖婷婷色五月| 色情五月天丁香社区| www.五月婷婷.com| 色9999日韩国产| 综合激情五月综合激情五月激情1| 亚洲激情网| 天天插天天很| 五月天婷婷狂暴白浆| 噜噜噜精品欧美成人在线观看| 九九丁香社区欧美激情| 五月婷视频在线| av久热| 人人草人人舔| 最新丁香六月婷婷| 久热伊人| 另类亚洲电影| 久热这里只有精品性色AV| 综合激情五月天| 五月丁香网站在线播放| 骚逼视频一区2区| 欧美激情综合五月色丁香| 性爱激情小说AV五月丁香花| 丁香六月欧美| 99热这里只有精品22| 99精品久久久久久久| 色五月婷婷久久| 99热r| 日韩人妻白浆视频系列| 色综合综合色| 国色天香伊人狠狠色| 欧美激情久| 91性高潮久久久久久久久| www.婷婷五月天| 国产成人精品一区二三区熟女在线| 精品少妇蜜臀91| 五月狠狠| 97色五月婷婷在线| www久| 亚洲综合激情五月久久| 久久久久久久五月| 国产精品美女久久久久AV超清 | 韩日AV片| 五月丁香网站| www.夜夜| 狠狠狠狠狠操| 久久最新色色色| 男人的天堂在线婷婷| 亚洲视频操| 色五月 激情婷婷 综合五月天| 日本少妇AA一级特黄大片| 中文字幕永久在线| 月婷婷婷婷五月| 婷婷五月天视| 亚洲中文字幕网| 老师高潮流白浆喷水的A片| 久99视频在线观看| 婷婷五月天网| 色五月色五天色情网| 开心五月综合激情网| AV成人在线网站| 97人人操| 野战毛片三一3| 青青夜夜狠狠夜夜狠狠| 婷婷五月天六点丁香五月| 国产干逼片| 五月婷婷色五月| 久久这里只有精品热在99| 久久五月天综合视频网站| 丁香五月天狠狠操| 久色88| 天天婬色综合| 99热传媒| www,奇米影视| 亚洲午夜成人av电影网| 日本不卡一区二区三区| 婷婷久久综合| 精品婷婷| 日本三级中国三级99人妇网站| 夜夜爽天天爽| 开心激情网在线| 丁香5月综合啪啪| 五月天久久久| AV伊人青草丁香六月| 综合九九中文字幕| 91久久电影| 丁香五月伊人| 免费观看日韩成人av| 欧美大片免费观看| 五月丁香六月片| 99视频35精品视频在线观看| 五月婷婷综合久久| 91丨九色丨白浆秘| 操操国产| 久久亚洲激情五码| 色色色热| 婷婷五月天社区| 丁香五月激情婷婷| 夜夜爽天天爽| 五月开心网| 五月天色区| 六月丁香啪啪啪| 婷婷色播婷婷| 婷婷中文字幕| 免费看欧美成人A片无码| 综合久| 久久精品人妻| 三男玩一女三A片| 色五月激情综合网| 国产精品日本一区二区在线播放| 亚洲日韩一页精品发布| 五月激情综合网婷婷| 欧美日韩成卜| 日韩一区二区A片免费观看| 午夜天堂一区人妻| 热99视频精品在线| 色九综合| 激情伊人| 99热这里只有在线播放| 五月丁香色婷婷综合| 99精品无码网站| 伊人色欲五月天| 中文字幕色色色| 婷婷久久亚洲| 夜夜 操无码| 五月天亭亭俺也| 色婷婷色99国产综合精品| 午夜色婷婷| 精品国产AV色一区二区深夜久久| 狠狠操狠狠色| 99热丁香五月| 狠狠88综合久久久久噜噜噜| 九九免费精品| 91久久1118| 婷婷激情六月| 色吧网综合| 激情综合五月丁香六月婷婷| 97色片| 五月天激日本色情在线| 久久A V无码视频| 成人va视频| 99碰碰视频| 激情五月天婷婷五月天| 久久您您综合网| 手机在线视频观看9| 亚洲综合另类| 婷婷丁香六月影视| www.夜夜騎夜夜狠| 日本久久精品| 九九精品免费视频99| 字母不卡码人逼| 久久hd| 人人爽天天莫| 色在线视频网2025| 色色99| 丁香五月很很肏| 亚洲激情四射| 亚洲欧美国产高清vA在线播放| 96五月丁香熟女| 五月天婷婷在线观看| 久久久国产精品黄毛片| 无码啪啪| www.99情趣网| 少妇AB又爽又紧无码网站| 爆乳熟女-区二区三区| 9久久婷婷国产综合精品性色| 干亚洲天堂| 深情五月天| 欧美日综合| 色欲五月丁香| 久9热视频在线观看| 99热日| 五月婷婷六月激情| 国产AV成人精品| 91超级碰碰| 五月婷婷激情综合视频| 99热在线播放| 久久综合激情| 99热在线播放| 99热有精品在线观看| 高清国产AV| 一根材五月婷成人| www99热| 97自拍视频网| 9999色色色色| 亚洲亚洲人成综合网络| 五月激情婷婷图片基地| 九九精品自拍| 99热99| 美女激情婷婷| 嫩草AV久久伊人妇女超级A| 色玖玖玖| 日日撸夜夜操| 色综合久久88色综合天天| sS丁香五月婷婷| 五月婷婷丁香五月 | 日本色色色| 日本色色影院| 99er精品视频| 九九艹女| 婷婷九月丁香久久| 香蕉97碰碰碰欧美| 丁香婷婷六月激情| 丁香五月影院| aaaaaa片| 丁香六月啪| 91色噜噜狠狠狠狠色综合| 26UUU欧美| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 91九色精品熟女内射| 手机在线日韩视频中文字幕| 亚洲婷婷丁香| 九九 激情 网| 操日本三片99| 婷婷九九| 九九五月天| 婷婷五月丁香色综合| 一区无码| 中文资源在线a | 五月停停99| 色婷婷五月网| 天堂在线伊久| 丁香六月激情综合啪啪| 欧美日韩国产一二区| 天堂婷婷丁香六月网| 国产av天堂| 五月天天丁香婷婷在线中| 五月丁香婷婷中文| 亚洲性受XXXX五月丁香| 五月丁香色婷婷| 99热在线爱| 免费视频99| 久热视频A.| 99色视频在线| 第四色婷婷色五月| 亚洲图片 丁香婷婷| 久久久久人妻中文| 五月丁香趴趴| 成人一级片| 日本色99| 五月婷婷六月丁香| 人妻videos人妻高清| 亚洲成av人影院| 色情五月天首页| 99精品视频在线观看| 婷婷五月天激情综合| 日本人妻伦在线中文字幕| 中文aV网| 日本久久极品| 超碰av在线| 激情综合婷婷五月| 日韩啪啪视品| 日本3级片一区2区| 久热精品视频在线观| 99视频在线精品免费观看2| 1024AV视频| 99色热视频在线| 色玖玖导航| 色欲一区二区三区精品A片| 五月天天天综合| 尤物一区二区| 亚洲激情综| 久久久婷| 色婷婷在线视频观看| 色域五月婷婷丁香| 五月伊人视频在线看| 色黄啪啪| 日本天天操| 五月婷婷综合色啪首页| 激情五月色综合网| 天天干天天拍| www五月| xxxx五月| 五月婷婷日| AV人人操| 色婷婷成人五月| 99干日本| 色婷婷呢狠禁久禁| 亚洲不卡欧洲| 99精品久久久久久久婷婷久久| 综合网啪| 99精品在线| 丁香六月五月天| 亭亭色色五月天| 国产五月视频| 四色永久成人网站| 这里精品| 密臀久久| 综合久久97| 五月激情在线| 香蕉婷婷色五月| 狠狠色综合久久久久| 五月激情网站| 日本 @ va 免费| 欧美激情综合| 婷婷久久图片| 午夜伊人大香蕉| 欧美在线操| 久久开心五月婷婷| 色色色视频免费无码 | 九九五月天| 亚洲视频在线网| 六月婷婷五月天| 婷婷六月久久综合导航| 婷婷成人网五月天| 91精品国产日韩91久久久久久国模| 国产精品久久久久久久久久久久 | 亚洲情欲久久| 亚洲亚洲人成综合网络| 99免费| 殴美综合激情五月天免费视频| 五月停停直播| 日日爱678| www91久久| 99操视频| 久久婷婷91| dingxiangtingtingliuyue| 九九这里只有精品在线视频| 九九色之九九色88| 激情综合在线播放| 99色热综合| 丁香在线视频| 激情五月婷婷丁香| 天天天干夜夜夜操| 超碰99在线观看| 99热6精品| 91xxxx九色| 国产精产国品一二三在观看| 日本天天色| 久久婷婷五月综合色奶水99啪| 思思精品热在线| 五月婷婷伊人网| 天天干,天天舔| 色色色综合色| 久久久99视频| 五月丁香啪啪综合| 91婷婷色五月| 九热电影av| 99热这里只有精品3| 黄网在线观看免费| 女人天堂久久| 色五月五月婷婷| 99久视频| 婷婷综合一二三| 五月婷婷六月丁香激情综合网| 精品一二三区视频立| 中文字幕在线播放视频| 久热91| 久热 91| 欧美色色色色色色色色色色| 91色噜噜狠狠狠狠色综合| 丁香五月最新网址| 亚洲视频码| 超碰在线资源| 9精品视频在线| 草榴视频网| 婷婷成人AV| 夜夜躁婷婷AV| 狠狠香蕉| 天天AV导航网| 天天操五月天| 婷婷五月丁香花综合| 99热碰碰| 九九国产视频| 伍月激情天| 综合色五月天| 天天摸色吧天天摸色吧| 婷婷欧美| 色噜噜狠狠色综无码久久合欧美| 色丁香婷婷| 九九色影视| 色色国产| 日韩AV无码影片| 精品五月花| 婷婷色情五月| 色九区| 99热这里只有精品亚洲| 爱婷婷久久视频| 六月丁香六月婷婷欧美| 9久国产精品| 丁香五月性| 艹B高清无码| 久9草在线观看视频| 99视频在线观看视频| 91精品无码| 日本三级韩三级99久久| 五月天五月色| www.夜夜操| 九九热免费视频| 丰满少妇猛烈A片免费看观看| 亚洲欧洲美女在线观| 免费97碰碰| 色婷婷综合网| 另类视频丁香五月| 亚洲天堂大香蕉| 五月色综合| 九色视频九色九色91jiuseshipin| 欧美三级级99久久| 色婷婷内射| 天天爽人人爽| 五月天社区婷婷丁香社区| 天天噜噜| 五月婷婷9| 狠狠舔| 99热这里只有免费| 五月丁香黄色视频| 影音先锋91| 天天爽天天干| 色97啪啪| 色宗合,宗合网| 九九色99| 很很干天天干| 色欧美日| 五月丁香婷婷六月天| 天天爱天天操| 狠狠色噜噜狠| 婷婷激情伍月网| 五月天伊人综合| www,天天干| 99久久終合| 开心久久五月天| 五月婷婷婷婷网| 激情开心五月天| caopeng97人人| 激情综合网亚洲色图| 丁香五月网址| 激情丁香五月| 艹| 五月亭亭六月天| 强奸幻女毛片| 亚洲bt丁香五月天婷婷激情小说| 天天爱天天操| 日本高清久| 五月丁香龟婷婷| 任你艹| 99资源在线视频| 永久AⅤ1| 五月天婷婷成人网| 丁香五月区| 欧美色爱五月天| 最近中文字幕大全免费版在线| 婷婷久久性爱| 色婷婷丁香五月天在线观看| 欧美成人精品A片免费一区99| 欧美、日韩、中文、制服、人妻| WWW.夜夜| 99ree6| 久久这里在精品视频| 久久多色| 色七七九九| 成人免费va| 五月婷婷成人| 久久久久视剧HD| 天天摸.天天mo| 99碰超| www.99日本| 色婷婷小说网| www,婷婷,com| 思思综合热| 欧美黑人巨大性生话| 丁香五月天堂网| 五月天丁香网站| 九九色区| 日操夜撸| 99人人操| 五月丁香色婷婷久久| 1234操逼网| rr天天操| 国产免费av在线| 这里只有精品视频| 人妻激情在线| 日本久久婷| 狠狠综合网| 亚洲成人免费在线| 亚洲色情久久| 99热自拍| 天天草婷婷五月| 亚洲国产精品VA在线看黑人| 婷婷玉月丁香五月在线视频| 国产婷婷婷| 婷婷五月中文字幕国产| 激情性爱五月天网页| 九九久久综合网站| 丁香婷婷五月人体| 99热网址| 激情五月婷婷| 五月丁香六月婷| 五月丁香综合伦理片| 色婷婷久久| 五月婷人妻| 丁香五月激情图片婷婷| 婷婷王月天影院| 五月天停婷基地| 秋霞成人毛片一级A片| 五月丁香色综合| 色色色国产| 五月天婷婷六月激情网| 男人操女人高潮91视频| 亚洲五月色| 丁香五月综合激情性爱| www.婷婷五月| 99五月丁香丁| 婷婷色色综合| 深爱五月天| 91日韩在线| 欧美性猛交99久久久久99按摩| 天天天操天天天日| 97色色色| 99ER热精品视频| 五月天色社区| 99热在线观看精品| 国产av天堂| 五月婷婷影| 在线中文av| 激情内射人妻1区2区3区| 思思 热 99| 五月婷婷av| 欧美性生交XXXXX无码小说| 色五月婷婷色五月| 996热| Www.sesese丁香| 成人综合视频在线| 精品无码人妻一区| 激情婷婷九月| 色99色| 天天日夜夜曹| 蜜臀A∨在线水帘洞| 天天综合网~91| 五月丁香综合| 亚艹艹| 丁香无月在线观看| 色婷婷丁香AV综合| 亚洲天天操| 九九草热在线观看| 亚洲午夜视频| 日本三级日本黄色| 99热欧美| 停停五月色宗合| 玖玖99福利| 97干在线播放| 超碰熟女农村在线69| 日本啪啪天堂| 天天操天天操天天操天天操天天操天天操 | 大香蕉综合网| www.minyis.com【JT】实力收量可预付QQ2101460746 | 66色在线日韩| 九九热99精品| 丁香婷婷五月六月久久| 99久久极情精品一区| 91操碰| 99免费青青蜜臀| 亚洲精品国产熟女久久久| 丁香五月色网| 色五XX| 99热这只有| 91免费看片| 色色三级视频| 激情第四色| 综合一区二区三区| 草逼大片| 五月婷婷免费视频| 婷婷六月丁香在线| 丁香色综合| 91趴趴| 操逼五月婷婷| 99色色| 亚洲99综合| 色婷婷久久综合中文久久一本| www.五月婷婷久久.com| 色欲Av五月天| 婷婷五月大| 中文字幕高清av| 丁香五月激情综合| 午夜激情综合| 久久99热网| 99爱在线| 六月婷婷综合| 久碰久操| 大香蕉AV在线| 色欲色香综合网| 色久天| 激情综合六月| 26uuu亚洲欧美| 婷婷玉月丁香五月在线视频| 五月六月激情婷婷| 色六月天天激情综合网| 五月婷婷在线丁香| 色婷婷电影网| 丁香五月第九色| 综合婷婷久久| 色综合久久综合中文综合网| 亚洲99在线| 日韩高清久久| 999久久久国产精品| 久久一伦| 综合在线色婷婷| 9999综合99综合人| 婷香五月激情视频| www.com任你艹| 婷婷五月天激情开心网| 4438国产免费看| a久久| 丁香五月综合激情性爱| 丁香婷婷六月天| 九九热视频99| 人人爱操| 婷婷爱综合| 99噜噜噜在线播放| 久久久er热| 狠狠色噜噜狠狠狠777奇米| 操射国产日本| 大天天伊人| 五月天色综合| 婷婷五月欧美综合| 久热99中文字幕| 亚洲五月综合色播| 色婷婷久久9.com| 情涩婷婷五月天| 99免费在线视频| 久婷| 99er免费在线观看| 亚洲传媒在线观看| 日韩AV片| 99热久久这里只有精品| 婷五月天影院| 99性爱视频| 色婷婷丁香五月| 国产毛片精品一区二区色欲黄A片| 天天操夜夜肏| 九九人人精品| 亚洲成人免费电影| 亚洲高清在线| 日韩av手机在线观看| 五月婷婷色激情| 91碰超| 久久久97| 色色网站免费| 玖玖综合色| 99免费| 热久久国产视频| 精品人妻在线| 大地资源色婷婷视频在线 | 丁香六月激情网C0W| 六月久久婷婷| 99热这里只有精品9| 婷婷五月中文字幕国产| 国产性爱一级| 欧美槡BBBB槡BBB少妇| 丁香婷婷色五月激情综合| 国产1区2区3区在线观| 久久婷婷青青| 五月在线| 久一这里有精品国产| 丁香六月欧美| 婷婷伊人| 色色激情五月| 久久深爱激情网| 91狠狠色| 99欧美三级视频| 成人电影一区| 天天肏高清在线| 天天综合天天玩夜夜玩天天玩夜夜玩 | 天花AV无码| 这里只有精品久久| 色婷婷五月综合在线| 天天爽爽日日做做| 久草丁香婷婷五月天婷| 中文字幕乱码亚洲精品一区| 五月天激情图片| 99日这里只有精品| 婷婷五六月丁香| 欧美日比视频| 五月日韩中文字幕| 深爱五月激情| 日日夜夜天天| 欧美成人精品老美女噜噜噜| 狠狠香婷婷五月| 成人电影在线免费试看| 秋霞网在线免费基地五月婷婷丁香| 五月婷婷大香蕉| 99ri在线观看视频| 激情五月综合| 丁香激情婷婷网| 日本在线视频手机播放五月婷| 久久久宗合| 日韩野外 无套| 成人无码精品1区2区3区免费看| 色婷婷视频| 色色色地址| 色小说五月天| 色色色9| 婷婷伊人久久综合| 5月丁香六月情| 欧洲亚洲免费视频9| xxxx五月激情| 99色这里| 99re热视频这里只有综合亚洲| 91热视频色网站| 1024婷婷综合久久五月天| 99热精品网| 人人综合色| 亚洲av另类在线观看| 天天色凹凸| 色婷婷av综合网| 182tv992tv人之初午夜免费观看| AV片一区在线观看| 综合另类激情| 五月色亭丁香| 9 9热这里有精品| 五月丁香A片| 丁香久月| 激情五月色综合网| 久久久久8888| 色欲丁香| 久久亚洲婷婷综合色五月| 色婷婷丁香社综合| 综合网狠狠| 丁香婷婷老司机久操| 成人精品视频99在线观看免费| 99热在线观看精品| 综合色播| 欧美精品XXXXBBBB| 国产亚洲99久久精品| 成人做爰A片免费看视频| 俺去也五月| 中日韩美欧成人一区二区精品在线| 国产暴力强伦轩1区二区小说| 人妻少妇色综合| 无码激情AAAAA片-区区| 99欧美精品99日本精品| 精品爱欲五| 9色小视频在线观看| 五月丁香偷拍| 8区视频在线| 99色6爱9热| 亚洲天堂AAA| 天天综合影院| 香蕉婷婷色五月| 激情久久久| 天堂无码人妻精品AV一区| 极骚大香蕉伊人| 大香蕉75线| 人人操97| 伊人成人宗合网| 91精品久久久久久综合五月天| 色综合色| 99成人在线观看| 亚洲成人AV电影在线| 熟女人妻一区二区三区免费看| 激情网 久久| 久久99久久99精品免观看粉嫩| 成人丁香五月| 亚洲色vA| 人妻久久久久久| 六月激情网| 国产第99页| 狠狠做五月| 激情网综合| 久色网址| 久月久在线视频| 婷婷久久久久| 色婷婷色久综| 综合99视频| 午夜免费试看| 色吧综合网| 六月婷婷色色色| 五月婷免费视频久久久| 丁香五月偷拍| 国产成人AV| av国产精品偷| 丁香五月婷婷六月婷婷| 丁香五月五月婷婷五月天激情四射| 婷婷丁香五月高清| 欧美色色色色色| 国产三级在线播放| 伊久久婷婷| 色噜噜狠狠狠综合曰曰曰| 色情丁香五月婷婷精品| 狠狠ri| 成人在线网站| 五月婷婷六月激情网| 天天爱天天做天天操| 大学生高潮无套内谢视频| 大香av| 久久婷婷五月天激情唯美| 久久丁香五月婷婷| 国产午夜精品一区二区三区四区| 大香蕉婷婷久久| 激情网婷婷婷| 九九色色| 国产婷婷五月天| AV五月婷婷露脸| 成人国产欧美大片一区| 五月婷中文字幕| 天天狠狠干| 热99这就是精品视频| 五月丁香婷婷啪啪网| 亚州日本欧州韩美高青高潮一| 深夜男女福利刺激影院一区| 超爽内射| 中文字幕性爱丰满| 国产精品电影| 九九色播五月丁香| 天天插AV丝袜中| 亚洲亚洲人成综合网络| 综合xx网| 91性高潮久久久久久久久| 91人人操人人爱| 亚洲精品五月| 成人做爰A片免费看视频| 色综合久久久久| 97影院一级片| 久久婷婷色综合| 五月天婷婷在线视频| 色在线免费观看| 开心深爱五月天| 亚州操人在线视频| 久久五月网| 五月天狠狠色| 欧美三级黄色片久久| 免费不卡狠操美女视频网| 久久婷婷午夜| 丁香婷婷色| 秋霞性爱AV| 色色操| 狠狠丁香| 综合久久婷婷| 成人五月天色天堂| 99精品综合| www.99久| 99热啪啪| 精a品a视a频| WWW99热| 五月丁香激情四射综合| 91seav| 91热在线| 五月丁香色综合| 五月婷伊人| 无码一区精品一区视频| 韩国婷婷丁香五月| 色色综合网www| 丁香五月欧美色综合| 亚洲第二AV| 丁香五月婷婷亚洲色图| 久热中文字幕| 婷婷五月色天| 婷婷五月天激情在线观看| 中国女人内射6XXXXX| 人人操人人干AV| 中文字幕av在线| 日本色色网| 欧美搡BBBBB摔BBBBB| 人妻VideOssS人妻高清| 91啪啪啪啪| 综合色99| 婷婷五月婷婷五月天| 日本97在线看片| 五月天停婷基地| 婷婷五月激情四月综合| 国外亚洲成AV人片在线观看| 人人草人人爱手机视频看看| 日韩AV免费电影在线播放| 性日本精品| 成人版视频在线观看| 婷婷五月丁香91| 99热免费网站| 三级黄色大片视频| 日日日日日| 婷婷色播色五月五色五月天色妇| 少妇被下春药玩弄A片| 五月婷婷六月丁香激情| 亚洲操操| 色综合久久久综合久久网| 人人操av| 天天在线久久综合| 欧洲区自拍| 色综合色色| 九九99视频| 超碰在线99| 亚洲综合色成丁香五月色| 五月天久久综合婷婷| 99热情这里只有精品在线播放| 婷婷香蕉精品| 香蕉狠狠爱视频| 婷婷六月中文字幕| 色婷婷色九月| 五月婷婷操操| 久久大香蕉同僚| 婷婷丁香五月激情图片| 97精品在线| 色综合综合综合| 亚洲第一成人无码A片| 五月天玖玖狠狠色色| 久热欧美| 婷婷九九色| 开心五月婷婷| 大香蕉久久久| 丁香色情五月综合网站| 成人视频一区| 9精品国产在热久久| 日本va欧美va国产激情| 无人精品在线视频| 五月天婷婷丁香蜜桃91| 欧美五月停| 99久久综合网| 五月婷婷六月天| 亚洲色综合性| 婷婷深爱色五月| 99色网站| 人五月天婷婷喷水| 欧美激情综合色综合啪啪五月| 五月婷婷啪啪| 五月天伊人综合| 丁香开心深爱| 久久久人妻久久久| 激情五月婷| 五月深情久久| 97caop| 亚洲人妻av伦理| 偷拍五月丁香| 一级二级香港秋霞欧美欧美秋霞| 五月丁香六月欧美综合| 亚洲一级色电影| 青青久在线视频免费观看| 五月天婷婷激情| 久久久久婷婷| 久婷婷| 亚洲丁香五月| 精品色色网| 2025天天爽天天摸| 五月天六月丁香| 婷婷九月色| 性韩日色婷婷五月天激情啪啪XXX| 丁香六月婷| 9月色婷婷| 色色色色色五月| 91伦| 久久大香蕉伊人| 婷色影院| 中文字幕婷婷9月天| 福利视频在线播放| 婷婷中文字幕| 五月色综合| www99精品| 婷婷久久99| 五月天操逼网| 日本啪啪天堂| 欧美丁香五月97色| 五月色婷婷综合| 另类综合色| 亚洲va成人va成人va在线观看| 色婷婷电影网| 亚洲激情精品| 久久丁香久久| 欧美激情综合色综合啪啪五月| 亚洲热视频在线| 五月欧美色色五月| 久久人妻伊人| 丁香五月六月综合激情| 97九色视频| 97人人看| 99热在线播放| 日本人妻伦在线中文字幕| 黑人巨粗进入警花疼哭A片| 亚洲成人AV高清字幕| 久久久久久久久月丁| 嫩草视频| 久婷久婷激情肉| 亚洲AV网站| 五月天开心成人网| 亚洲成人电影aaaa| 99热官网精品在线| 激情五月综合网最新| 欧美25p| AV中文网| 激情六月婷婷| 五月天开心色情网| 色五月天成人| 91 欧美| 伍月婷丁香婷| AV操操操| 丁香久久综合| 久久这里有精品| 丁香五月 激情文学| 丁香五月人妻熟女| 久草婷婷| 丁香无月在线观看| 久久婷婷五月综合激情国产| 婷婷色五月天在线观看| 9l视频自拍9l九色9l成人| 久色网五月| 青草视频在线观看视频| 丁香五月婷婷六月婷婷| 色色色欧美| 久久婷婷色色| 人人澡玖玖一| 激情综合五| 久热91| 色六月 婷婷| av在线播放网址| 亚洲色婷婷婷婷人人爽| 五月婷婷片| 欧美大肥婆大肥BBBBB| 在线免费观看激情视频| 99色五月| 五月天婷婷久色| 九九99久久| 91精品在线看| 超碰碰碰碰| 99啪在线视频| 青青夜夜狠狠夜夜狠狠| 六月婷婷天天操夜夜爽视频| 五月天激情综合首页| 五月色天情| 激情五月久久| 国产探花一片区| 久一这里有精品国产| 亚洲精品永久久久久久| 欧美在线视频99| WWW色色色COm| 五月丁香另类网| 色综合久久88色综合天天99| 69凹凸成人综合网| 久久视这里只有精品| 欧美色色色色色| 99久热| 欧美图片丁香五月天| 五月丁香综合久久| 婷婷丁香激情综合色情| 亚洲AV日韩在线观看| 五月丁香好婷婷姑娘综合网| 婷婷五月天av| 国产色色小草视频| site:picc-up.com| 俺去也在线视频| 亚洲第一综合| 色九亚洲| 色色A| 99久久婷婷精品视频| 天天综合天天做天天综合| 九九99精品| 综合亚洲色色| 这里只有精品免费视频在线观看| 东京热免费视频| 最新日韩AV中文字幕| 婷婷丁香高潮了| 五月激情偷拍| 超碰成人在线观看| 97 A I色色| 久碰久| 九九九九九九九热| 欧美婷婷| 影音先锋四区| 青青草原精品久久| 性爱激情五月| 丁香五月婷婷色综合基地| 久久这里只有精品热在99| 九九精品综合| 在线视频激情网站| 日本色色影院| jiZZdr| 久久久久久18| 十月丁香九月婷婷综合| 日韩AV无码影片| 五月天婷婷综合久久| 亚洲综合激情五月久久| www.婷婷激情网.com| 97婷婷五月| 香蕉人妻AV久久久久天天| 丁香色情五月天| 五月丁香综合激情| 国产婷婷综合| 成人无码精品1区2区3区免费看| 激情网 五月天| 三人荫蒂添的好舒服A片|