欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,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
返回資訊列表
欧美激情综合色综合啪啪五月| 天天做天天爱天天玩| 婷婷五月天影院| 色五月婷婷激情基地| 99在线精品免费视频| 狠狠操狠狠色| 亚洲婷婷欧美婷婷| 色~性~乱~伦~噜| 99re热视频这里只精品5| 97五月婷| 九九热最新| 婷婷色基地在线看| 97碰碰视频在线观看| 五月天久久www| 91狠狠综合久久| 久久久久9999| 天天做天天摸| 激情综合五月天| 噜噜噜狠狠色综合| 婷婷永久在线| 99少妇精品| 人妻久久久久久久久妻久久久久| 92久操视频| 激情五月六月| 久久久思思热| 99久久人人| 五月婷婷综合色拍| 操久久精| 极品少妇XXXX精品少妇偷拍| 五月情婷婷| 超碰伊人碰婷婷五月| 婷婷婷婷婷婷婷婷| 九九人妻福利| 久热婷婷综合| 操操人人| 天天日人人爽| 另类专区在线| 成人看片网站| www.久热| 五月激情视频网| 婷婷色色色| 99热在线观看| 五月天婷婷丁香视频| 久久婷鲁| 日本熟女内射| 色欲av伊人久久大香线蕉影院| 久久激情综合| 五月丁香婷婷爱| 色呦呦免费观看| 日本狠狠干| 激情九九这里只有精品| 日韩狠狠色| 日日夜夜狠狠| 色婷婷五月天成人网| 日韩成人免费电影| Av免费网站在线| 99精品免费视频| 五月丁香久人妻中文| 久久婷婷五月天大香蕉| 这里只有精彩视频| xxx日本东京热| 中文字幕不卡视频| 亚洲精品久久久久久久久久吃药| 成人五月天丁香婷| 激情婷婷五月黑人| 成人噜噜网| 日韩在线观看网址| 天天噜噜| 婷婷丁香77777| 天天干天天干天天| 日韩成人无码人妻| 欧美黄色韩日网| 99色在线视频观看| 色色色区| 精品一区久热| 午夜天堂一区人妻| 青草五月天| 中文在线视频久1| 婷婷综合激情| 色婷婷a v| 天天综合天综合久久网| 久久这里都是精品| 欧美乱码国产一级A片| 六月丁香啪啪| 欧美大香蕉视频| 色级停停| 五月婷婷激情网| 韩国三级五月天婷婷。| 天天情色五月天| 91啪啪视频| 日本不卡高字幕在线2019| av久热| 九色99视频| www.色婷婷| 五月婷婷激情综合网 | 91日综合欧美| 五月丁香综合色婷婷| 开心深爱激情网| 色色色综合色| 亚洲欧美国产高清vA在线播放| 狠狠五月天婷婷| 99日本黄站| 99在线一区| 日本天天操| 超碰在线国产| 99这里都是精品| 色爱终和网| 午夜理论片最新午夜理论剧| 97人人做| 伊人婷婷91| 激情五月天久久| 99色在线| 国产精品久久久久久久久久免费 | 无码激情| 久久婷婷五月天蜜桃| 高清免费在线视频| 人人操婷婷| 国产熟妇的荡欲午夜视频| 丁香九月激情| 开心激情网五月天| 亚洲色综合| 色婷婷综合视频| 超级碰碰碰97免费| 五月婷精品| 天天做天天爱天天高潮| 99热99精品| 我要色综合五月婷婷| 综合网色| 激情 五月 婷婷 丁香| 99在线播放视频| 丁香五月激情网| 狠狠综合色网| 一逼色综合| 99热播放| 伊人大香五月天| 亚州第一A片| 色激情网| 色五月色五天色情网| 精品五月天| 日日婷婷不卡| 99免费热视频| 激情综合网激情五月天| 亚洲九区| 国产精品久久久久久久久久免费| 99热这里只有精| 国产激情久久久| 午夜丁香| 午夜AV网| 91网站黄| 午夜理论片最新午夜理论剧| 久久综合天天综合| 99爱视频免费| www.日韩国产| 天天插天天干| 99久久婷婷国产综合精品| 五月婷婷影视| 激情五月综合久久| 久久永久网址| 五月天激情美女久久| 播五月丁香六月| 婷婷色丁香六月| 噜噜狠狠| 国产精品蜜臀99| 五月丁香综合伦理片| 精品色色网| 久久久.COM| 九色91视频| 亚洲人人艹| 丁香五月手机在线| 亚洲另类视频| www.99.色| 久久婷.com| 色色网站免费观看| 色射7856五月天激情四射| 色色色.COM| 极品少妇婷婷五月| 久久99网| 中文无码婷婷| 精品二区| 玖玖色综合网| 特级片神马电影| 淑女丝袜bi操逼123| 久久久天天啊| 538在线精品| 五月丁香久久综合91| 婷婷干六月综合旧址| 激情综合在线观看| 91久久综合亚洲鲁鲁五月天| 手机AVAV天堂看网| www.狠狠| 日本成人噜噜噜| 97超碰综合| A片试看50分钟做受视频| 97婷婷五月丁香| 丁香花婷婷五月天| 五月婷婷狠天天色综合| 五月丁香六月婷婷成人电影| 国产又爽又猛又粗的视频A片| 欲色人妻| 婷色成人| 久久五月丁香婷婷| 国产原创视频91九色| 91凹凸在线| 五月综合婷婷开心网| 思思re99视频在线观看| 婷婷91| 91a片爽| 婷婷五月天黄色| 热99re| 六月婷婷av| 婷婷中合| 五月婷婷五月天| 丁香五月婷婷欧美成人色图| 4399成人黄A片| 99热九九在线| 久久视频这里99| 狠狠色成人影片| 久久久香港| 色激情综合狠狠婷婷| 亚洲色激情| 在线中文字幕视频| 激情丁香五月AV| 天天粽合合合合| 天天摸天天舔天天天天爽| 婷婷久久五月| 九九aV| 五月色婷婷AV| 99热9| 五月天色色婷婷| 五月草影视| 久久久久久久久久8888| 色999五月色| 六月婷婷五月天| 免费无码毛片一区二区A片 | 激情综合网,婷婷五月天| 日本3级片一区2区| 色婷婷综合在线| 亚洲色欲欧美一区二区三区| 色婷婷久久综合中文久久一本| 99热99| 婷婷丁香五月六月激情| 嫩BBB槡BBBB搡BBBB| 超碰高清在线| 这里只有精彩视频| 99偷拍视频在线日本| 天堂婷婷丁香六月网| 狠狠穞A片一區二區三區| 在线91日韩| WWW·天天操·视频?| 五月天丁香网站| 婷婷丁香五月天熟女丝袜| 丁香五月天婷婷久久综合| 思思热精品在线视频| 狠狠干狠狠操狠狠爱| 婷婷五月开心中文字幕在线| 久草热8精品视频在线观看 | 沈娜娜av| 五月天婷婷在线AN| 成人 AV播放| 五月丁香激情深爱婷婷| 五月四色激情| 久播影院免费观看电视剧大全最新网| 婷婷天堂综合网| 丁香五月在线视频黑人| 激情网五月天| 婷婷五月天成人导航| 97在线碰| 久热精品视频在线观| 婷婷天堂综合| 狠色综合网| 中文字幕 中文字幕明步| 色婷婷操逼| 超碰在线国产| 九九热re99re6在线精品| 九九亚洲视频| 婷婷色五月天色| 九九成人视频| 五月丁香色| 色99日韩| 超碰在线观看9| 五月色婷婷中文字幕| 黑人熟妇一区二区三区| 狼人久草| 97色干| 激情五月婷婷丁香| 激情五月丁香色婷婷| 日本色色色| 丁香六月啪| 婷婷99| 99re思思| 婷婷中文字幕网站| 天天做天天爱天天爽| 六月婷婷色色网| 九九视频精品这里只有| 亚洲av另类在线观看| 99色免费视频| 久久婷婷内射| 婷婷中文字幕| 五月丁香无码视频| 黄色片精品| 啪啪啪综合网| 丁香六月婷婷综合激情欧美| 91色呦哟| z色五月播播久久| BT综合在线视频观看| 五月婷婷六月丁香综合在线| 色婷五月| 99热免费精品| 一本道在线电影| 丁香五月天啪啪激情综和网| 91丨九色丨熟女|老版| 91精品久久久久久久久| 99无码免费视频| 丁香六月天婷婷色| 久久大香蕉同僚| 噜综合| 丁香六月婷婷综合| 亭亭五月色男人| 久久99久久99精品免观看粉嫩| 99热这里只有精品免费| 国产色99| 亚洲精品色色| 色播色丁香五月| 亚洲综合视频网| 熟女激情网| 国外亚洲成AV人片在线观看| 婷婷八月丁香激情综合| 开心五月丁香综合久久| 吊色AV男人的天堂| 99re热视频这里只精品| 超碰二区| 激情小说之五月| 婷婷综合网性| 色级停停| 天天天干夜夜夜操| 五月婷婷啪啪| 99热日| 六月婷婷七月丁香| 婷婷99视频在线| 亚洲五月丁香六月婷婷| 甈吧vv| 思思99久久| 免费看欧美成人A片无码| 五月丁香中文| 天天操天天操天天操| 99手机在线精品视频| 久久婷色| 激情丁香五月天| 丁香五月狠狠在线观看| 狠狠色丁香婷婷| 丁香五月婷婷基地| 亚洲成人在线免费| 六月婷婷在线视频| 国产26uuu视频| 91狠狠色丁香| 91九九热| 99热综合| 99热这里只有精品最新网址| AV天堂淫乩| 91九色无码日韩| 婷婷五月天 丁香五月天 裸体| 99爽视频| 婷婷五月天电影网| 五月丁香成人版| 日日噜噜夜夜狠狠久久丁香六月| 97操碰日本女人| 国产毛片精品一区二区色欲黄A片| 99免费热视频在线| 天天成人综合视频| 婷婷五月天激情综合| 五月天婷婷香蕉狠狠超碰综合| 五月丁香婷婷五月色| 婷婷五月天网址| 韩国久久少妇视屏| 色视五月天婷婷| 欧美交换配乱吟粗大25P| 几激情五月婷婷色五月色天堂| 五月天亚洲最大成人| 久久久99婷婷久久久久久| 日韩国产AV播放| 色优久久| 色婷天天| 色婷婷9| 婷婷丁香18| 五月婷婷狠狠干| 亚洲激情高潮| 人人草公开操| 六月色婷婷色| 久久丝丝热| 1024久婷| 成人免费120分钟啪啪| 99亚州综合精品成人网| 婷婷五月丁香欧洲| 日本色色网站| 久久综合影院| 这里只有免费精品| 精品久久66| 少妇2做爰HD韩国电影| 五月婷婷色色| 激情六月婷婷| 日韩久久色| 婷婷五月天av| 九九热免费视频| 五月天网站免费欧美| 91色情播放| 丁香五月中文字幕久色| 久色中文| 2020久久婷婷五月| 婷婷五月天激情综合深爱| 丁香五月色综合色播五月| 五月婷婷干干干| 大香蕉人妻| 亚洲AV成人片无码网站| 超碰免费99| 99玖玖免费视频| 日韩久综合| 色婷亚洲五月丁香| 日本天堂爱爱| 色婷婷五月天成人网| 婷婷激情五月天小说| 久久小说网| 男人的天堂婷婷色五月| 大香蕉网 久久| 91狼友视频网页更新| 精品9久| 久久久久视剧HD| 丁香久久激情俄| 亚洲AV永久无码影院黑人| 久久女人九九| 五月婷婷综合久久| Se.婷婷五月天| 99在线观看视频精品| 伊人天天色| 六月丁香深深爱| 婷婷免费无视频| 99精品视频免费在线播放| 丁香婷婷性爱| 成人色情五月天婷婷丁香| 丁香 婷婷五月| 国内婷婷丁香社区在线播放| 天天舔天天摸天天透| 激情www| WWW.17C亚洲精品| 婷婷成人五月天成人文学| 日本系列_4页_777FP| 欧美激情综合| 久久黄色片| 婷婷五月天首页激情| 91碰超| 好好干Av| 五月色网| 五月丁香婷婷在线| 国产毛片精品一区二区色欲黄A片| 大香蕉220| 婷婷黄色网| 九九干视频| 777色婷婷爱五月| 99re26视频| 五月婷婷激情综合网| 亚洲婷婷免费| 夜夜撸日日操| 96精品国产综合久久久久久| 思思99热这里只有精品| 看国产探花操逼三级片| 91一起操| 黄色国久久| 色婷婷激情四射视频| aⅤ79成人片| 综合97五月| 丁香伊人激情| 久久综合首页| 久久caop| 先锋资源婷婷| 丁香五月激情六月| 亚洲无线视频| 性做爰1一7伦| 啪啪色激情五月天| 99热 在线观看| 99热日韩| 五月婷婷色播| 成年视频免费观看| 欧美va亚洲va| 79精品视频| 色五月在线播放| 色婷婷狠狠久久综合五月| 91视频免费后入强操| 五月天激情综合网站| 五月激情综| 五月婷婷在线视频| 色婷婷69| 丁香色综合| 99在线69| 偷偷操九九| 婷婷五月亚洲激情| 久久久99免费视频| 亚洲亚洲人成综合网络| 婷婷久久五月丁香| 五月丁香六月婷婷操操操| 久久精品婷婷| 99色视| 婷婷丁香一月| 亚洲热热视频| 五月婷婷激情久久| 在线观看中文字幕| 99精品综合| AV在线大香蕉| 色无码| 久久久久久久11111111111| 99精品综合在线| 五月人人丁香婷婷五月人人丁香| 秋霞性爱AV| 超碰自拍天堂| 99热精这里只有精品| 99久久6| 98永久精品| 久久久婷丁香五月| 色综合久| 成人看片网站| 婷婷五月天激情开心网| 大大香蕉综合在线| 狠狠狠五月婷婷六月丁香| www.激情| 伊人狠狠丁香婷婷综合尤物| 成人va在线播放| 婷婷伊人綜合中文字幕| 婷婷香香五月| 99婷婷| 五月婷婷影| 丁香婷婷成人网站| 深爱婷婷网| 婷婷色狠狠| 欧美性丁香色色五月天| 亚洲亚洲人成综合网络| 婷婷丁香色五月天久久88| 色五月大| 色婷婷五月综合色婷婷| 色色婷婷综合网| 成人精品视频99在线观看免费| 99天堂网| 婷婷五月天色播| 六月色色| 天天色视频| 99热伊人| 丁香六月综合| 国产Va视频| 六月丁香五月婷婷| 六月丁香婷婷亚洲中文玖玖| 欧美大片免费播放器| 亚洲免费观看高清完整版AV线| 婷婷五月无码| 伊人九九热| 99精品无码| 99碰视频| 久久性视频| 日本97在线| 国产.亚洲.欧洲视频在线| 色婷婷AV久久| 五月婷婷官网色| 五月婷婷黄网站大全| 婷婷五月丁香网| 色婷婷亚洲综合天堂| 综合激情网激情五月。| 人妻中文字幕网| 婷婷大乡焦噜噜| 日本精品99网站| 婷婷伊人| 五月丁香激情综合网官网| 久久小说网| 99免费视频精品| 4399在线观看免费高清毛片| 婷婷激情六月视频| 九九激情综合| 99在线精品免费视频| 夜夜躁狠狠| 亚洲日韩一页精品发布| 色五月婷婷激情| 99久久久久久久| 五月丁香啪啪婷婷| 五月丁香狠狠爱| 久久xx| 亚洲九九99精品视频在线播放| 超碰婷婷五月| 夜夜大香蕉婷婷丁香| 色丁香五月婷婷| 成 人片 黄 色 大 片| 五月丁香婷婷中文网| 99艹精品在线观看| 亚洲午夜视频| 亚洲激情高潮| 亚洲黄网在线| 婷婷狠狠色| 五月丁香久久久久| 欧美成人精品A片免费一区99| aaa日韩| 亚洲午夜一区二区| 91久久婷婷| 激情丰满熟妇五月| 丁香五月AV| 日本天天色| 另类激情五月天| 婷婷爱爱蜜臀天天操| 婷婷99| 亚洲第79页| 激情九月婷婷| 久久大大香| 婷婷八月丁香激情综合| 色五月婷婷少妇人妻| 大香蕉视频99| 人人干av| 久久人妻伦理| 丁香五月在线人妻| 日韩美一级毛卡片| 激情五月天综合网| 亚洲情欲| 亚洲精品操一操、噜一噜、摸一摸、爽| 日韩五月婷婷久久| 狠狠色噜噜狠狠狠狠综合| 狠狠狠狠狠狠草| 丁香五月综合久久综合| 中文字幕日产A片在线看| 五月天婷婷激情综合| 婷婷五月综激情| 国外亚洲成AV人片在线观看| 无码区婷婷五月花开| 丁香伊人激情| 久久婷婷五月综合色奶水99啪| 无码成人AAAAA毛片AI换脸| 婷婷五月天资源| 婷婷五月天色色| 久久99免费视频网站| 思思热视频| 五月的色婷婷高潮| 五月香蕉婷婷| 九九精品视频免费在线| 啪啪婷婷五月天激情| 99久久婷婷五月天| 久热这里只有精品6官网亚洲| 九九精品少妇| 日本人人超碰| 久久免费精彩视频| 99热精品观看| 国产精品日韩十五区| www.婷婷六月天| 波多婷婷久久| 日本猛少妇色XXXXX猛叫| 热99精品视频五月| 丁香五月婷老师| 播五月婷婷开心| www久久艹| 在线超碰免费| 中文字幕网伦射乱中文| 久久伊人大香蕉| 丁香六月天婷婷开心综合| 久热这里只有精品6官网亚洲| 亚洲无码成人网| 五月婷婷久久爱| 亚洲乱码日产精品BD| 丁香六月婷婷| 婷婷操久久| 久久激情五月婷婷| 五月丁香婷婷激情在线| 五月丁香六月婷婷啪啪综合 | 婷婷五月丁香色情| 久久一伦| 丁香五月婷婷老师网站| 久99视频| 激情深爱五月天| 97碰人人操| 丁香五月成人社区| 婷婷综合色播网| 九九这里只这里只有精品| 丁香色综合| www.91AV.com| 在线亚洲综合| 九九在线91| 免费视频1区| 婷婷在线网| 天天揷综合网| 黄网在线免费观| 少妇性按摩无码中文A片| 五月丁香六月天| 五月婷综合| 丁香五月成人社区| 色色色热热热| 五月丁香综合激情| 亚洲精品成人| 六月丁香五月婷婷| 色偷偷AV亚洲男人的天堂| 五月婷婷激情69| 色色色色色色色综合| 五月伊人综合| 丁香久色| 成人欧美Va| 我爱va亚洲va52| 亚洲激情高潮| 丁香五月天婷婷中文| 天天噪夜夜爽| 天堂草在线观| 99精品小视频| 亚洲欧美婷婷五月色综合| 亚洲丁香婷婷丁香五月天激情| 丁香婷婷基地| 色婷婷五月在线| 丁香六月综合激情| 久久东京热婷婷五月| 性生活视频98791| 欧美三级欧美一级| 久久久精品人妻| 天天操天天插| 激情综合视频| 欧美婷婷精品激| 久9免费视频| 99ri在线视频| 色五月亚洲五月天| 99日韩网站| 激情五月婷婷在线观看| 在线成人网站| 午夜不卡久久精品无码免费| 婷婷丁香五月综合| 亚洲六月综合激情久久下卡| 亚洲无码猫咪| 五月丁香久人妻中文| 99色色爰| 激情五月六月丁香| www.婷婷五月天.com| 97热这里精品在线视频| 久久99视频| 激情五月天。| 婷婷丁香五月激情密臀av| 夜夜 操无码| 色性综合| 狠狠色 综合色区| 天天天天操| 九九婷婷网五月天| 国产肥白大熟妇BBBB视频| 五月成人丁香av91| 婷婷丁香五月91| 99热色无码| 五月天激情.com| 婷婷午夜天| 久婷五月| 伊人热在线大香蕉| 五月天久久综合| 激情六| 美国天天日天天操| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 深爱激情五月网| 九九爱激情| 成人 在线 日韩| 人人摸人人干| 久久精品日| 欧美色婷婷| 五月婷婷精品无在线| 男人的天堂五月丁香| 99热在线中文字幕| 欧美日本韩国亚洲| 91色噜噜狠狠狠狠色综合| 婷婷六月丁香久| 五月婷激情影院| 少妇出轨做爰高潮A片| 在线99色| 婷婷激情综合网| 亚洲色婷婷五月| 26uuu精品一区二区| 123日本不卡在线| 高清无码.com| 另类激情综合| 五月激情综合网| 99热资源在线| Av狠狠色丁香婷| 久草热在线视频| 久久精品一区二区三区四区| 色五月大| 97五月天婷婷| 99热国产| 大香蕉婷婷久久| 中文不卡一二三区| 色五月综合| 艳妇野外情欲放荡HD| 丁香六月综合激情| 99视频在线| 97操碰98| 丁香五月婷婷动漫| 狠狠操狠狠插| 雪千夏麻豆| 色五月婷婷五月天| 天天日夜夜欢| 天天日,天天插| 日本不卡高字幕在线2019| 色婷婷av在线| 综合激情视频| 影音 五月 婷婷 久久| 色婷婷基地在线| 操97免费超级视频| 涩涩激情五月婷婷| 五月丁香婷婷综合在线| 激情综合网五月丁香| 婷婷五月综合免费在线| 五月激情偷拍婷婷| 久久久天天啊| Caoub青青超碰| 日逼免费视频 | 99热97| 婷婷久久色五月婷婷久久久| 天天开心婷婷丁香五月| 丁香九月久久| 九九草草逼| 色色丁香五月婷婷| 激情五月综合网| 99超级碰免费视频| 91大神操美女| 99九九在线视频| 色综合色色| 久久A极片| 情婷婷五月天在线| 我爱大香蕉| 欧美日韩成人在线| 四色永久成人网站| 懂色av蜜臀av粉嫩av永陈冠希| http://www.lingjunshare.com/| 丁香六月婷婷久久综合| 香蕉婷婷| 久久亚洲激情五码| 亚洲精品99| 激情五月婷| 五月丁香色婷基地综合久久| 夜夜骑夜夜撸| 色婷婷综合在线| 五月天激情小说欧美激情| 婷婷天堂伊人| 色丁香五月综合网| 精品热九九| 五月激情综合深爱| 色婷婷在线视频观看| www,五月天激情| 丁香五月天堂婷婷| 99热日韩| 区啪精品| 99色色| 五月天操逼网| 亚洲欧美成人在线| 影音先锋按摩| 婷婷五月天AV| 九九精品99| 激情五月天综合| 亚洲精品网站色视频| 99操视频| 婷婷久久午夜网| 嫩草AV久久伊人妇女超级A| 天天色五月| 色五月 婷婷, 大香蕉| 欧美成人精品一区二区 | 在线日韩视频| 色五月丁香婷婷综合| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品 | 久久久久9999| 五月香婷婷| 亚洲女婷婷五月基地综合久久久| 日韩小视频在线99| 丁香六月婷婷| 日韩另类| 亚洲精品色| 天天色天天爱天天爽| 在线综合啪| 可以直接看的av| 日良久久| 五月婷婷色| 天天摸天天日天天舔| 9久久精品视频| 久热这里| 婷婷五月色亚洲| 欧美超碰人人| 色欲一区二区三区精品A片| 天天综合亚洲综合网天天αⅴ| 国产在线aaa片一区二区99| 日本va网站| 五月丁香六月婷婷激情四射| 日韩AV片| 婷婷区日本| 婷婷丁香无码专区| 久re热视频| 婷婷五月天激情文学小说| 久久97久久99久久综合欧美| 婷香五月激情视频| 另类在线| 婷色天堂| 婷婷99热| 另类丁香五月天区图| 国产色99| 久操热| 操人妻视频91| 激情久久久| 久草婷婷在线| 香蕉综合在线| 婷婷五月天激情偷拍| 在线综合91| 色五月大| 婷婷天天综合| 五月天五月色| 激情五月小说婷婷| 最近中文字幕大全免费版在线| AV79| 99九九视屏| 成人色站,在线视频,看片-SS1AV| 亚洲视频在线观看99| 久久人人人人妻| 最新av在线观看| 亚洲色婷婷| 天天色综网| 天天综合网、天天综合色| 成年人丁香五月| 五月丁查人人| 国产亚洲精品人人| 伊人青涩网| 九九无码| 激情爱爱网站超大免费| 精品色色网| 午夜丁香丁香婷婷| 影音先锋91男人资源在线播放| 天天干,天天日| 26UUU精品一区二区| 狠狠色激情在线| 久久五月激情综合| 射婷婷中文字幕| 色婷婷影视| 午夜色丁香| 五月天激情在线视频| 97久久超碰| 免费看欧美成人A片无码| 99在线看片| 激情丁香五月天综合| 日韩激情网站| 99视频| 午夜成人AV在线| 久久五月天激情视频| 91美女被操| 610018岁成人视频| 丁香五月伊人| 丁香 久久| 久久久精品人妻录| 五月天色婷婷小说| 丁香六月开心| 97色色婷婷五月天| 91啦丨九色丨刺激中文| 级情九色| 五月天伊人久久久久| 色天天综合成人网| 久久99热这里| 玖玖综合色| 女操碰| WWW色五月| www.色五月| 丁香婷婷五月色成人网站| 婷婷五月天高清无码| 狠狠狠狠狠操| 99成人精品六| 亚洲婷婷五月天在线激情综合网| 久久丝袜婷婷| 日韩精品呦呦va| A片试看120分钟做受图片| 激情开心五月天| 丁香五月婷婷五月| 五月婷婷五月天激情网| 蜜臀嫩草| 这里只有国产精品在线| 五月丁香在线国产| 激情五月激情综合网一级丸片| 久操热线| 久久精品4| www999日韩精品| 99ri在线播放| 91丨九色丨白浆| 亚洲乱码w在线观看| 9色免费网| 天天综合色99| 日韩av高清| 永久天堂日本| 激情久久五月天| 婷婷成人五月天成人文学| 色婷婷久久综合丁香五月| 五月天婷a| 天天天天天天天操| 国际国外精品欧洲南美洲专区无码不卡| 婷婷五月天Av| 天天干狠狠操| 久久婷五月综合色| 狠狠狠狠狠狠狠狠草| 六月婷五月丁香| 就爱操www com| 九九色99| 五月天激情网址| 婷婷深爱五月天在线| 99精品热视频只有精品10| 啪啪91| 任你爽视频| 激情四射五月天偷偷看婷婷| 五月丁香啪啪啪免费看| 丁香五月天色综合| www.五月天婷婷姐姐| 夜夜操狠狠操天天操| 婷婷色情小说| 五月好婷婷| 激情五月天电影| 激情 婷婷 插| 色婷婷狠狠18| 亚洲无码yw| 综合色99| 久久激情五月| AA片在线观看视频在线播放| 亚洲精品a成人在线播放| www.玖玖婷婷在线| 久综合九| 色婷婷久久天天性爱| 六月婷婷色综合| www.激情| 久色视频在线| 丁香五月天激情小说| 26uuu亚洲欧美另类| 婷婷深爱五月丁香| 欧美天堂久久| 天天插天天日| A片天天| 丁香五月最新网址| 偷拍九九五月丁香婷婷| 天天射美女| 77799热| 九九热只有这里精品| 色五月婷婷婷婷| 天天插天天爽| 天天操天天干天天日| 99爱爱| 内射 无码 伊人| 久草视频一,二三四| VA五月激情在线| 狠狠色激情综合| 丁香五月婷婷色| 激情视频综合| 狠狠色婷婷777| 久热久69| 97人人操| 色小说婷婷五月天天天| 99久久激情视频| 九热视频| 婷婷综合婷婷| 欧美三级黄色片久久| 丁香五月网络网络| www.深爱激情| 337p大胆噜噜噜噜噜91Av| 五月天激情国产综合婷婷婷| 五月婷婷啪啪啪| 激情综合五| 欧美激情-区二区三区| 玖玖婷婷色| 久久五月天合网| 色五月激情婷婷| 综合色五月| 99热超碰| 亚州色综合| 五月丁香六月婷婷,婷| 婷婷综合色播网| 九九碰九九爱97超碰| 六月五月天婷婷涩播在线| 免费成人中文字幕| 婷婷丁香六月五月天| www.成人婷婷综合| 婷婷五月色激情欧美激情| 大香蕉av在线| 亚洲mm免费| 婷婷五月色| www.五月天激情| 亚洲激情婷婷| 影院久久久| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 日本va视频| 久久婷婷色| 丁香五月婷婷香| AV天堂淫乩| 停停五月丁香| 色九月婷婷| 98永久精品| 99这里只有精品在线| 伊人久久五月天| 大香蕉伊人丁香五月| 久久久五月婷婷| 天天夜夜六月丁香五月婷婷老师| 五月天啪啪| 激情久久婷婷| 99.色| www.五月天| 91婷婷色| 密乳视频| 六月丁香五月婷婷| 91要啪| 九九亚洲视频| 91精品综合久久久久久五月丁香| 一区三区视频有限公司| 日日操,夜夜爽| 日日爽夜夜爽| 九色视频91| 99久久玖玖| 超级碰碰99| 欧美性爱特黄一级aaaassss| 99久热| 91精产品自偷自偷综合| 五月婷婷啪啪啪啪| 99热国品| 任你日视频| 婷婷五月六月| 婷婷五月天免费99| 国产欧美第五十五页| 亚洲色频| 男女av免费看| 69午夜成人影片| www夜夜操| 色综合九九色综合88| 色色射| 精品一二三区久久AAA片| 天天综合网~91综合网| 九九99一区| 日韩成人中文| 色97综合婷婷天天色| 欧洲色色| 免费99色| 色丁香影院| 婷婷丁香激情五月天色色色| 婷婷另类开心| 丁香五月天堂| 99超级碰碰| 五月天播播| 亚洲AV永久无码影院黑人 | 色婷婷五月天天天天天天天天天| 丁香婷婷影院| 五月色色色| 五月天另类小说| 五月婷婷综合色啪首页| 九九久久五月天综合伊人| 激情久久久久久久久| 国产色99| 99re6久热只有精品6在线直播| 婷婷五月天最新网址| 五月天婷婷一起草| www.夜夜操.com| 亚洲精久久| 婷婷五月天综合在线| 综合色播| 久久综合五月天| 九九亚洲综合| 亚洲99在线| 日韩精品超碰在线观看| 97九色视频| 久久五月天 91| 99精品小视频| 久久伊人婷| 欧美黄色韩日网| 狠狠色丁香久久综合婷婷亚洲成人福利| 人人噜天天上| 91亚洲免费片| 99狠狠色| 色九网| 婷婷五月天激情网| 丁香五月 综合| 专区无日本视频高清8| 激情五月无码| 99re思思热久久| 久久五月丁香婷婷| 激情五月丁香五月| 26uu| 日韩av变天就操逼不卡区| 99re在线观看视频| 99人妻碰碰久久久禁片| 国产成人网站在线观看| 色婷婷五月天综合网| 亚洲99激情| 荫道BBWBBB高潮潮喷| 丁香五月狠狠综合欧美| 99免费在线视频| 99精彩视频在线观看| 综合色七七| 色爱亚洲| 色玖玖导航| 中文字幕在线日亚洲9| 好好日激情五月天| 丁香五月婷婷操逼| 婷婷五月天成人网站| 色婷婷最新域名| 国产一级片| 热久久成人| 爱穴久久| 日日夜夜狠狠| 丁香九月激情| 欧美肉大捧一进一出免费视频| 亚洲欧州色情在线观看| 五月婷婷草| 噜噜视频| 5月婷婷综合| 香蕉久久国产AV一区二区| 丁香五月婷综合网| 成人网站免费在线播放| 国外亚洲成AV人片在线观看| 亚洲成人va| 婷婷月综合| www.99热| 99视频只有这里精品| 婷婷久久五月天丁香| 国产AV一区二区三区最新精品| 五月婷婷黄色视频| 久婷久婷| 疯狂做受XXXX高潮A片| 久久人妻伦理| 大香蕉久| 天天影院色| 在热视频精品| a九九热www| 色五月婷婷在线观看第一页舔| 99视频在线观看网址| 五月天色婷伊人| Www.se.久久| 大香网伊人久久综合| 极品人妻videosss人妻| 激情久久久久久久久久| 欧美三级A做爰在线观看| 婷婷深爱五月天| 五月天国产成人| 亚洲中文字幕AV在线| 五月天激情小说网| 丁香五月大片| 五月丁香婷婷色播无码| www.zbzhongsen.com| 丁香激情婷婷网| 九九av| 五月色亭丁香| 亚洲综合婷婷| 日日天天干| 99视频自拍| 婷婷九九色| 色综合久久天天综合网| 欧美性丁香色色五月天| 久久久久98| 国产精品18久久久| 婷婷 丁香 精品| 五月丁香六月婷婷在线小说视频| 久久婷婷激情久久| 婷婷五月花| 日韩人妻无码精品| 这里只有九九精品| 日本99久久| 丁香婷婷五月天成人| 婷婷五月天色色| 天天艹夜夜爽| 97人人操在线| 五月天大香蕉AV| 色综合五月天| 丁香五月在线自慰| 婷婷五月色综合| 乱码操操| 超爽内射| 99国产精品久久久久久久久久久| 97精品在线| www.色五月.com| 亚洲综合在线伊人婷| 97se视频在线| 久久看九九90| 中国丰满熟女A片免费观| 亚洲成人网在线观看| 婷婷无码五月天| 大香蕉院线|