久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

基于Node.js與Vue的個(gè)人健康菜譜生成系統(tǒng)全棧源碼解析

基于Node.js與Vue的個(gè)人健康菜譜生成系統(tǒng)全棧源碼解析 1. 項(xiàng)目概述個(gè)人健康菜譜生成系統(tǒng)到底在解決什么問(wèn)題做這個(gè)個(gè)人健康菜譜生成系統(tǒng)其實(shí)一開(kāi)始只是想解決我自己每天吃飯的糾結(jié)。上班族做飯最煩的不是不會(huì)做而是打開(kāi)冰箱不知道今天能做什么查菜譜網(wǎng)站又一堆反人類的廣告和“適量鹽”描述。所以我干脆用 Node.js 和 Vue 寫(xiě)了這個(gè)全棧項(xiàng)目前端負(fù)責(zé)點(diǎn)菜、收藏、看詳情后端負(fù)責(zé)按用戶熱量目標(biāo)、口味偏好和忌口條件去生成每日菜譜整套源碼放在一個(gè)倉(cāng)庫(kù)里clone 下來(lái)就能跑。項(xiàng)目本身不復(fù)雜但麻雀雖小五臟俱全涉及 Vue 組件通信、動(dòng)態(tài)路由、Node 接口設(shè)計(jì)、數(shù)據(jù)庫(kù)建模、推薦邏輯和常見(jiàn)部署問(wèn)題。想練全棧的初學(xué)者、需要做課程設(shè)計(jì)的同學(xué)甚至只是想把家里食材利用起來(lái)的朋友都能從這套源碼里找到能直接用的東西。這個(gè)項(xiàng)目我一直放在本地方便自己改后來(lái)整理干凈之后把源碼拎了出來(lái)。標(biāo)題里寫(xiě)“項(xiàng)目源碼”說(shuō)明重心不只是講概念而是給你一套能跑通的結(jié)構(gòu)。你拿到手之后前端是標(biāo)準(zhǔn)的 Vue 3 Vite 工程后端是 Express SQLite沒(méi)有復(fù)雜的中間件和云服務(wù)依賴Windows、macOS、Ubuntu 都試過(guò)能跑。我會(huì)把從環(huán)境配置、目錄結(jié)構(gòu)、核心接口到前端交互的完整鏈路拆開(kāi)講重點(diǎn)講那些文檔里不會(huì)寫(xiě)、但實(shí)際開(kāi)發(fā)一定會(huì)踩的坑。必須強(qiáng)調(diào)一點(diǎn)系統(tǒng)里的熱量和營(yíng)養(yǎng)建議只是根據(jù)通用食物成分表估算的用來(lái)做日常參考沒(méi)問(wèn)題但不要當(dāng)作醫(yī)療建議。尤其是有慢性病或者孕期飲食需求的朋友拿這套系統(tǒng)當(dāng)工具可以重要決策請(qǐng)咨詢專業(yè)人士。1.1 這個(gè)項(xiàng)目適合誰(shuí)能學(xué)到什么我先說(shuō)句實(shí)話這個(gè)項(xiàng)目沒(méi)有上微服務(wù)也不搞高并發(fā)。它就是一個(gè)典型的中小型全棧項(xiàng)目適合一兩個(gè)人維護(hù)。選這個(gè)規(guī)模是有意的太復(fù)雜了勸退太簡(jiǎn)單了沒(méi)干貨。如果你正在學(xué) Vue背了路由、插槽、組件通信的面試題但沒(méi)實(shí)際項(xiàng)目經(jīng)驗(yàn)這套源碼能讓你看到這些概念是怎么串起來(lái)的如果你剛接觸 Node 后端能學(xué)到如何用 Express 把接口拆得清晰怎么連 SQLite怎么做登錄鑒權(quán)怎么處理菜譜封面圖上傳如果你純粹想解決每天吃什么把示例食材換掉導(dǎo)入自己常買(mǎi)的菜這套系統(tǒng)一樣能服務(wù)你。從學(xué)習(xí)角度看這個(gè)項(xiàng)目最大的價(jià)值在于“完整”。市面上的教程代碼大多是片段級(jí)一個(gè)登錄頁(yè)講三小時(shí)但沒(méi)有人告訴你登錄之后怎么跳轉(zhuǎn)、數(shù)據(jù)存在哪里、刷新頁(yè)面后 token 怎么恢復(fù)、前端調(diào)接口跨域怎么處理。這些恰恰是源碼項(xiàng)目最值錢(qián)的部分。我在整理代碼時(shí)特意保留了合理的 TODO 注釋和單元測(cè)試目錄就是為了讓后來(lái)者能順著思路繼續(xù)擴(kuò)展。1.2 技術(shù)選型為什么是 Node.js Vue 的全棧組合選擇 Node.js 和 Vue不是因?yàn)樗鼈z最先進(jìn)而是因?yàn)樗鼈冏钸m合這類項(xiàng)目的開(kāi)發(fā)狀態(tài)。后端用 Node.js意味著前后端都是 JavaScript/TypeScript一個(gè)開(kāi)發(fā)者不用頻繁切換語(yǔ)言心智。尤其是做菜譜推薦這種邏輯數(shù)據(jù)結(jié)構(gòu)是典型的對(duì)象數(shù)組操作JS 處理起來(lái)比 Java 短得多。前端用 Vue是因?yàn)?Vue 的響應(yīng)式系統(tǒng)和單文件組件設(shè)計(jì)對(duì)中小型項(xiàng)目非常友好模板寫(xiě)法接近原生 HTML新手拿起來(lái)不會(huì)像看某些框架那樣一頭霧水。有人會(huì)問(wèn)為什么不直接 Spring Boot Vue不是說(shuō)不行如果你要交一個(gè)“基于 Spring Boot 的商品管理系統(tǒng)”那一套也完全能跑。但在我這個(gè)場(chǎng)景里Node.js 的啟動(dòng)速度、輕量級(jí)內(nèi)存占用和 npm 生態(tài)讓我改代碼更爽。Express 路由寫(xiě)起來(lái)幾乎沒(méi)有儀式感SQLite 則是零配置的文件數(shù)據(jù)庫(kù)整個(gè)后端部署起來(lái)就是node server.js一條命令。等你把這套邏輯吃透了再用 Spring Boot 重寫(xiě)也只是換個(gè)殼核心推薦和建模思路完全一樣。2. 功能拆解與核心模塊設(shè)計(jì)菜譜不是瞎生成的2.1 用戶場(chǎng)景與功能清單這個(gè)系統(tǒng)的核心使用場(chǎng)景是這樣的晚上七點(diǎn)到家冰箱里有雞胸肉、西蘭花、豆腐、雞蛋你今天晚餐目標(biāo)熱量是 500 大卡不吃香菜但想吃點(diǎn)辣。系統(tǒng)會(huì)從菜譜庫(kù)里篩選出所有不包含香菜、主要食材能匹配上的菜再按熱量范圍過(guò)濾最后結(jié)合你過(guò)去一周點(diǎn)過(guò)什么挑出三道熱量合適、口味不重樣的菜推給你每道菜都標(biāo)注食材清單、大致做法和營(yíng)養(yǎng)素估算。整個(gè)功能清單我拆成了兩大塊。用戶側(cè)包括注冊(cè)登錄、個(gè)人資料維護(hù)、每日熱量目標(biāo)設(shè)置、口味偏好與忌口管理、菜譜瀏覽、菜譜收藏、菜譜詳情查看、菜譜生成歷史。管理側(cè)則簡(jiǎn)單一點(diǎn)包含食材庫(kù)管理、菜譜維護(hù)、封面圖上傳和生成日志查看。之所以把管理端也塞進(jìn)去是為了讓菜譜數(shù)據(jù)不是寫(xiě)死在代碼里而是可以從界面維護(hù)這樣對(duì)做課程設(shè)計(jì)和真實(shí)使用都更方便。功能設(shè)計(jì)的取舍也值得說(shuō)。我沒(méi)有做社區(qū)評(píng)論、點(diǎn)贊、分享這些社交功能不是不會(huì)做而是它們會(huì)顯著拉長(zhǎng)開(kāi)發(fā)周期。個(gè)人健康菜譜系統(tǒng)的重點(diǎn)應(yīng)該放在“生成”和“篩選”上如果生成質(zhì)量不行評(píng)論做出來(lái)也是空殼。所以我建議你拿到源碼后先把核心鏈路跑通再考慮加不加社交模塊。2.2 數(shù)據(jù)表設(shè)計(jì)與菜譜 JSON 結(jié)構(gòu)數(shù)據(jù)庫(kù)我用的是 SQLite文件就放在后端目錄的data/health.db里。表結(jié)構(gòu)設(shè)計(jì)的核心是食材和菜譜的多對(duì)多關(guān)系。一張菜譜由多個(gè)食材組成一個(gè)食材也可以出現(xiàn)在多道菜里所以不能簡(jiǎn)單在菜譜表里塞一個(gè)ingredients字段而是要拆三張表recipes、ingredients、recipe_ingredients。下面是簡(jiǎn)化后的建表 SQL你可以直接拿去用CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, target_calories INTEGER DEFAULT 1800, taste_tags TEXT DEFAULT , excluded_ingredients TEXT DEFAULT , created_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE ingredients ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, category TEXT, calory_per_100g REAL DEFAULT 0, unit TEXT DEFAULT g ); CREATE TABLE recipes ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, description TEXT, steps TEXT, cover_url TEXT, meal_type TEXT, created_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE recipe_ingredients ( id INTEGER PRIMARY KEY AUTOINCREMENT, recipe_id INTEGER NOT NULL, ingredient_id INTEGER NOT NULL, amount_g REAL DEFAULT 100, FOREIGN KEY(recipe_id) REFERENCES recipes(id), FOREIGN KEY(ingredient_id) REFERENCES ingredients(id) ); CREATE TABLE favorites ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, recipe_id INTEGER NOT NULL, created_at TEXT DEFAULT CURRENT_TIMESTAMP );拆表的直接好處是篩選和統(tǒng)計(jì)方便。比如要算出某道菜的熱量只需要把這道菜關(guān)聯(lián)的食材用量乘以對(duì)應(yīng)食材的每百克熱量再累加一個(gè)JOIN就能搞定。如果不拆表把食材名和用量塞成一個(gè) JSON 字符串那將來(lái)做“按食材查詢菜譜”和“熱量估算”會(huì)痛苦到懷疑人生。菜譜里的步驟我本來(lái)想用富文本編輯后來(lái)為了降低復(fù)雜度直接存成Text。前端詳情頁(yè)用\n分隔展示效果完全夠用。菜譜的示例數(shù)據(jù)在server/src/data/seed.js里包含了二十多道家常菜和一百個(gè)常見(jiàn)食材。你打開(kāi)這個(gè)文件就能看到一道菜的完整 JSON 結(jié)構(gòu){ title: 香煎雞胸肉配西蘭花, description: 高蛋白低脂肪適合減脂期晚餐, mealType: dinner, steps: 1. 雞胸肉用鹽和黑胡椒腌制15分鐘\n2. 平底鍋少油中火每面煎4分鐘\n3. 西蘭花焯水后一起裝盤(pán), ingredients: [ { name: 雞胸肉, amount: 150, unit: g }, { name: 西蘭花, amount: 200, unit: g }, { name: 橄欖油, amount: 5, unit: g } ] }2.3 推薦邏輯的關(guān)鍵標(biāo)簽匹配、排除條件與熱量估算菜譜推薦是這套系統(tǒng)的靈魂我做得很克制沒(méi)有用協(xié)同過(guò)濾或深度學(xué)習(xí)。原因很簡(jiǎn)單個(gè)人系統(tǒng)里用戶行為數(shù)據(jù)太少協(xié)同過(guò)濾在冷啟動(dòng)階段基本失效而且算出來(lái)的結(jié)果用戶看不懂“為什么推薦這道菜”。我選的是規(guī)則加隨機(jī)權(quán)重的方案推理過(guò)程透明代碼量少也容易調(diào)試。整個(gè)推薦流程分四步。第一步收集用戶當(dāng)前選擇的食材 ID 列表沒(méi)有選擇食材時(shí)就默認(rèn)全庫(kù)食材可用。第二步根據(jù)用戶資料里的excluded_ingredients排除包含忌口食材的菜譜比如用戶明確寫(xiě)了“不吃香菜”那所有關(guān)聯(lián)了香菜的菜譜直接過(guò)濾掉。第三步計(jì)算每道菜的熱量估算值篩掉超出目標(biāo)熱量范圍太多的菜。第四步對(duì)候選菜譜按口味偏好標(biāo)簽做加權(quán)隨機(jī)再確保同一道菜一周內(nèi)不重復(fù)推薦。熱量估算的代碼我是單獨(dú)抽成函數(shù)的因?yàn)檫@個(gè)函數(shù)既會(huì)被推薦接口用到也會(huì)在菜譜詳情頁(yè)展示營(yíng)養(yǎng)素時(shí)用到function estimateCalories(recipeId) { const rows db.prepare( SELECT i.calory_per_100g, ri.amount_g FROM recipe_ingredients ri JOIN ingredients i ON i.id ri.ingredient_id WHERE ri.recipe_id ? ).all(recipeId); const total rows.reduce((sum, row) { return sum (row.calory_per_100g * row.amount_g / 100); }, 0); return Math.round(total); }隨機(jī)加權(quán)的實(shí)現(xiàn)不復(fù)雜重點(diǎn)在于不要每次都隨機(jī)得完全一樣。我給每道菜維護(hù)了一個(gè)“最近被推薦次數(shù)”字段推薦次數(shù)越少的菜權(quán)重越高這樣用戶不會(huì)連續(xù)三天看到同樣的菜。另外口味標(biāo)簽我用的是逗號(hào)分隔的簡(jiǎn)單字符串比如“辣”“清淡”“高蛋白”匹配時(shí)只要做數(shù)組交集判斷即可。這套規(guī)則一開(kāi)始看著簡(jiǎn)陋但實(shí)際用下來(lái)生成結(jié)果很穩(wěn)定比那些號(hào)稱智能但結(jié)果隨機(jī)的方案靠譜得多。3. 后端實(shí)現(xiàn)Node.js 接口、數(shù)據(jù)庫(kù)與菜譜推薦邏輯3.1 源碼目錄結(jié)構(gòu)先認(rèn)識(shí)一下你的項(xiàng)目拿到源碼之后別急著npm install先把目錄結(jié)構(gòu)看清楚。我采用的是前后端分離但放在同一個(gè)倉(cāng)庫(kù)里的結(jié)構(gòu)避免了維護(hù)兩個(gè) Git 倉(cāng)庫(kù)的麻煩health-recipe-system/ ├── server/ │ ├── src/ │ │ ├── routes/ # 接口路由 │ │ │ ├── auth.js │ │ │ ├── recipes.js │ │ │ ├── ingredients.js │ │ │ └── favorites.js │ │ ├── middlewares/ │ │ │ └── authMiddleware.js │ │ ├── db/ │ │ │ ├── index.js │ │ │ └── seed.js │ │ ├── utils/ │ │ │ └── calorie.js │ │ └── app.js │ ├── data/ # SQLite 數(shù)據(jù)庫(kù)文件目錄 │ ├── uploads/ # 菜譜封面圖上傳目錄 │ ├── .env # 環(huán)境變量 │ └── package.json ├── web/ │ ├── src/ │ │ ├── views/ # 頁(yè)面組件 │ │ ├── components/ # 業(yè)務(wù)組件 │ │ ├── stores/ # Pinia 狀態(tài) │ │ ├── router/ # 路由配置 │ │ ├── api/ # axios 封裝 │ │ └── App.vue │ └── package.json └── README.mdserver/src/app.js是后端入口web/src/main.js是前端入口。把數(shù)據(jù)和代碼分離的好處是備份數(shù)據(jù)庫(kù)只需要拷一個(gè)data目錄。uploads目錄記得要在.gitignore里忽略掉不然傳幾張菜譜圖倉(cāng)庫(kù)就變得很臃腫。3.2 Node.js 環(huán)境準(zhǔn)備與 npm 配置這一步看著簡(jiǎn)單但我見(jiàn)過(guò)太多人卡在這里。先說(shuō) Node.js 版本項(xiàng)目建議用 LTS 版本目前推薦 18 以上20 也行不要用那種還在奇數(shù)版本號(hào)的嘗鮮版。Vite 在舊版 Node 上會(huì)直接報(bào)錯(cuò)而且報(bào)錯(cuò)信息很迷惑你排查半天發(fā)現(xiàn)是 Node 版本太老。安裝完成后務(wù)必在命令行里執(zhí)行兩個(gè)命令驗(yàn)證node -v npm -v如果提示找不到命令不是沒(méi)裝好就是安裝時(shí)沒(méi)有勾選“Add to PATH”。Windows 下最穩(wěn)妥的方式是重新運(yùn)行安裝包選擇修改安裝并勾選 PATH 選項(xiàng)。macOS 用戶我建議用 Homebrew 安裝Ubuntu 用戶可以apt install nodejs npm但裝完記得檢查版本有些發(fā)行版自帶版本偏舊。npm 裝依賴慢是國(guó)內(nèi)老生常談的問(wèn)題我習(xí)慣先配鏡像源npm config set registry https://registry.npmmirror.com這行命令改的是 npm 全局配置之后所有項(xiàng)目的依賴下載都會(huì)走鏡像。如果你在公司網(wǎng)絡(luò)環(huán)境可能還需要額外設(shè)置代理。我另外建議不要全局安裝一堆工具用npx跑腳手架命令更干凈比如后面創(chuàng)建 Vue 項(xiàng)目直接npm create vuelatest就不會(huì)污染全局包。3.3 后端核心代碼服務(wù)入口和健康檢查接口后端入口文件app.js本身不長(zhǎng)核心就是初始化 Express、掛載中間件、注冊(cè)路由const express require(express); const cors require(cors); const path require(path); const { initDB } require(./db); const authRoutes require(./routes/auth); const recipeRoutes require(./routes/recipes); const ingredientRoutes require(./routes/ingredients); const favoriteRoutes require(./routes/favorites); const app express(); app.use(cors()); app.use(express.json()); app.use(/uploads, express.static(path.join(__dirname, ../uploads))); app.use(/api/auth, authRoutes); app.use(/api/recipes, recipeRoutes); app.use(/api/ingredients, ingredientRoutes); app.use(/api/favorites, favoriteRoutes); app.get(/api/health, (req, res) { res.json({ code: 0, data: { uptime: process.uptime(), time: new Date() } }); }); const PORT process.env.PORT || 3000; initDB().then(() { app.listen(PORT, () { console.log([server] running at http://localhost:${PORT}); }); });注意express.json()這個(gè)中間件不能少否則后端收不到前端傳過(guò)來(lái)的 JSON 請(qǐng)求體。cors()在本地開(kāi)發(fā)時(shí)必須掛否則前端在localhost:5173調(diào)localhost:3000接口會(huì)被瀏覽器攔截。接口返回格式我統(tǒng)一用{ code, data, message }前端 axios 攔截器只要統(tǒng)一解析一次就行。這個(gè)習(xí)慣看起來(lái)不起眼但能讓前端錯(cuò)誤處理代碼減少一大半。項(xiàng)目里的數(shù)據(jù)庫(kù)操作我用了better-sqlite3這個(gè)庫(kù)它是同步 API寫(xiě)起來(lái)比sqlite3的異步回調(diào)舒服很多。初始化數(shù)據(jù)庫(kù)時(shí)如果表不存在就自動(dòng)建表如果食材表是空的就執(zhí)行種子數(shù)據(jù)導(dǎo)入這樣任何機(jī)器上 clone 下來(lái)運(yùn)行都是即跑即用。3.4 菜譜生成接口的實(shí)現(xiàn)細(xì)節(jié)菜譜生成是核心接口路徑是POST /api/recipes/generate。請(qǐng)求體會(huì)接收用戶這次選擇的食材 ID 數(shù)組、餐次類型、目標(biāo)熱量等參數(shù)。我簡(jiǎn)化后的核心邏輯如下router.post(/generate, authMiddleware, (req, res) { const { ingredientIds [], mealType, targetCalories } req.body; const user req.user; // 查詢所有菜譜并關(guān)聯(lián)出食材列表和熱量 const recipes db.prepare( SELECT r.*, GROUP_CONCAT(i.name) as ingredient_names FROM recipes r LEFT JOIN recipe_ingredients ri ON ri.recipe_id r.id LEFT JOIN ingredients i ON i.id ri.ingredient_id GROUP BY r.id ).all(); const excluded parseList(user.excluded_ingredients); // 第一步排除忌口 let candidates recipes.filter(recipe { const names recipe.ingredient_names ? recipe.ingredient_names.split(,) : []; return !excluded.some(item names.includes(item)); }); // 第二步如果指定了食材要求菜譜必須包含其中至少一個(gè) if (ingredientIds.length 0) { candidates candidates.filter(recipe { return recipe.ingredient_names ingredientIds.some(id recipe.ingredient_names.includes(id)); }); } // 第三步熱量過(guò)濾 const range targetCalories || user.target_calories || 1800; candidates candidates.filter(recipe { const cal estimateCalories(recipe.id); return cal range * 0.6 cal range * 1.2; }); // 第四步加權(quán)隨機(jī)選三道一周內(nèi)推薦過(guò)的權(quán)重減半 const weighted candidates.map(recipe { const recentCount getRecentRecommendCount(recipe.id, user.id); return { recipe, weight: Math.max(0.2, 1 - recentCount * 0.3) }; }); // 簡(jiǎn)單加權(quán)隨機(jī) const selected weighted .sort(() Math.random() - 0.5) .slice(0, Math.min(3, weighted.length)) .map(item item.recipe); res.json({ code: 0, data: selected }); });這段代碼我特意寫(xiě)得偏教學(xué)化實(shí)際源碼里會(huì)再封裝幾個(gè)函數(shù)。你可能會(huì)問(wèn)為什么先查出所有菜譜再在內(nèi)存里過(guò)濾因?yàn)槭纠龜?shù)據(jù)量只有幾十條這樣做最簡(jiǎn)單且容易理解。如果以后菜譜庫(kù)上萬(wàn)條就改成在 SQL 里做排除和篩選按食材表JOIN后加WHERE條件。個(gè)人項(xiàng)目?jī)?yōu)先保證可讀性性能問(wèn)題等真遇到了再優(yōu)化這是我一直堅(jiān)持的原則。還有個(gè)細(xì)節(jié)必須返回給前端熱量估算值否則前端卡片上沒(méi)數(shù)字可顯示。我在返回前給每道菜補(bǔ)充了calorie、protein、fat字段計(jì)算方式基于recipe_ingredients的用量和食材營(yíng)養(yǎng)素表。這些營(yíng)養(yǎng)字段即便不準(zhǔn)確也比沒(méi)有強(qiáng)因?yàn)樗芙o用戶一種“被認(rèn)真對(duì)待”的感覺(jué)。接口里還寫(xiě)了生成記錄記錄誰(shuí)在什么時(shí)間請(qǐng)求了哪些菜譜方便后續(xù)做“最近推薦不重復(fù)”的判斷。4. 前端實(shí)現(xiàn)Vue 頁(yè)面、路由與交互細(xì)節(jié)4.1 用 Vite 創(chuàng)建 Vue 3 項(xiàng)目并安裝依賴前端我選擇 Vue 3 Vite 的組合。Vite 開(kāi)發(fā)服務(wù)器啟動(dòng)非??煨薷拇a后熱更新幾乎是秒級(jí)比老牌的 vue-cli 體驗(yàn)好太多。創(chuàng)建項(xiàng)目的命令很簡(jiǎn)單但要注意npm create vuelatest運(yùn)行后會(huì)交互式問(wèn)你要不要 TypeScript、Router、Pinia 等我建議全部選是尤其是 Router 和 Pinia后面會(huì)用到。如果不想交互可以加--default參數(shù)。創(chuàng)建完成后進(jìn)入前端目錄安裝基礎(chǔ)依賴cd web npm install npm install axios vue-router4 pinia npm run dev這里有個(gè)容易踩的坑Vue 3 對(duì)應(yīng)的是vue-router4不是老項(xiàng)目的vue-router3。如果安裝時(shí)沒(méi)寫(xiě)版本號(hào)npm 默認(rèn)給你裝最新的4一般沒(méi)問(wèn)題但如果你之前項(xiàng)目里殘留老版本會(huì)出現(xiàn)路由組件渲染不出來(lái)的怪問(wèn)題。我遇到過(guò)一次最后是清掉node_modules和package-lock.json重新安裝才解決。裝依賴的時(shí)候如果控制臺(tái)刷出大量npm WARN先別慌只要npm run dev能跑起來(lái)就說(shuō)明依賴關(guān)系沒(méi)問(wèn)題。4.2 頁(yè)面路由與整體布局這個(gè)項(xiàng)目的頁(yè)面不多我按業(yè)務(wù)劃分了五個(gè)主要視圖首頁(yè)、菜譜生成頁(yè)、菜譜詳情頁(yè)、收藏頁(yè)、登錄注冊(cè)頁(yè)。路由配置放在src/router/index.js核心代碼如下import { createRouter, createWebHistory } from vue-router; const router createRouter({ history: createWebHistory(), routes: [ { path: /, name: home, component: () import(/views/HomePage.vue) }, { path: /generate, name: generate, component: () import(/views/GeneratePage.vue) }, { path: /recipes/:id, name: recipe-detail, component: () import(/views/RecipeDetailPage.vue) }, { path: /favorites, name: favorites, component: () import(/views/FavoritesPage.vue) }, { path: /login, name: login, component: () import(/views/LoginPage.vue) }, ] }); router.beforeEach((to, from, next) { const token localStorage.getItem(token); if (to.meta.requiresAuth !token) { next(/login); } else { next(); } }); export default router;我用了createWebHistory而不是createWebHashHistory地址欄看起來(lái)干凈。但代價(jià)是部署到 Nginx 時(shí)要做 try_files 重寫(xiě)這個(gè)后面講部署會(huì)提到。路由懶加載也是從這版才加上的之前用靜態(tài) import 把整個(gè)頁(yè)面都打到一個(gè)包里首屏加載很慢。改成() import()之后每個(gè)頁(yè)面單獨(dú)分包體驗(yàn)提升明顯。beforeEach路由守衛(wèi)里做了簡(jiǎn)單的登錄攔截收藏頁(yè)和生成歷史頁(yè)需要登錄才能訪問(wèn)這個(gè)對(duì)真實(shí)項(xiàng)目是剛需。整體布局我放在App.vue里頂部一個(gè)導(dǎo)航欄下面放router-view /。導(dǎo)航欄根據(jù)登錄狀態(tài)顯示“登錄/注冊(cè)”還是“退出登錄”用 Pinia 里的用戶狀態(tài)控制。這種全局布局方式簡(jiǎn)單改一個(gè)文件就能控制所有頁(yè)面的公共殼子。4.3 菜譜生成頁(yè)表單校驗(yàn)、請(qǐng)求狀態(tài)和卡片展示菜譜生成頁(yè)是這個(gè)項(xiàng)目里交互最復(fù)雜的一頁(yè)。左半部分是篩選表單右半部分是生成結(jié)果卡片列表。頁(yè)面模板骨架大致是這樣template div classgenerate-page form submit.preventhandleGenerate h3告訴我你的條件/h3 label餐次類型/label select v-modelform.mealType option valuebreakfast早餐/option option valuelunch午餐/option option valuedinner晚餐/option /select label目標(biāo)熱量大卡/label input typenumber v-model.numberform.targetCalories min300 max3000 / label可選食材/label IngredientSelector v-modelform.ingredientIds / button typesubmit :disabledloading {{ loading ? 生成中... : 生成菜譜 }} /button /form div classresult-area RecipeCard v-forrecipe in recipes :keyrecipe.id :reciperecipe collecthandleCollect / /div /div /template這里有兩個(gè)可以展開(kāi)說(shuō)的點(diǎn)。第一個(gè)是v-model.number修飾符它能把輸入框里的字符串轉(zhuǎn)成數(shù)字避免你在判斷targetCalories 0時(shí)踩“空字符串參與比較”的坑。第二個(gè)是IngredientSelector組件用v-model雙向綁定選中食材 ID 數(shù)組這涉及到子組件里如何觸發(fā)更新。我在這個(gè)組件里封裝了一個(gè)多選網(wǎng)格點(diǎn)擊食材卡片時(shí)切換選中狀態(tài)再通過(guò)emit(update:modelValue, newValue)把值傳回父組件。把這套機(jī)制搞清楚Vue 的組件通信基本就入門(mén)了。請(qǐng)求狀態(tài)處理也很重要。點(diǎn)擊生成后按鈕要置灰并顯示“生成中”防止用戶重復(fù)提交。請(qǐng)求失敗要區(qū)分超時(shí)和接口報(bào)錯(cuò)我在 axios 攔截器里統(tǒng)一處理了錯(cuò)誤提示。拿到結(jié)果后不要直接覆蓋整個(gè)列表先用 loading 遮罩擋住舊內(nèi)容等新結(jié)果回來(lái)再替換避免界面閃動(dòng)。這個(gè)小細(xì)節(jié)對(duì)體驗(yàn)影響非常大我最初沒(méi)做結(jié)果每次生成時(shí)頁(yè)面瘋狂跳動(dòng)觀感很差。4.4 收藏功能與組件復(fù)用技巧收藏功能我用了兩個(gè)端配合后端favorites表記錄用戶和菜譜的關(guān)聯(lián)關(guān)系前端 Pinia store 管理當(dāng)前頁(yè)面的收藏狀態(tài)。點(diǎn)擊收藏按鈕時(shí)先判斷是否登錄沒(méi)登錄就跳轉(zhuǎn)登錄頁(yè)登錄了就調(diào)接口。收藏成功后把按鈕狀態(tài)切換成實(shí)心再次點(diǎn)擊則取消收藏。這套交互在整個(gè)系統(tǒng)里會(huì)出現(xiàn)在菜譜卡片、詳情頁(yè)和收藏頁(yè)三處所以我把收藏按鈕抽成了獨(dú)立組件CollectButton避免在三個(gè)頁(yè)面里復(fù)制粘貼三份一樣的邏輯。CollectButton組件只接收recipeId和initialCollected兩個(gè) props內(nèi)部維護(hù)自己的collected狀態(tài)。但真實(shí)場(chǎng)景里詳情頁(yè)收藏后返回列表頁(yè)希望收藏狀態(tài)同步更新這就要用到 Pinia store 來(lái)共享狀態(tài)。我把收藏的菜譜 ID 集合放在 store 里任何組件提交收藏操作都會(huì)修改這個(gè)集合其他組件自然響應(yīng)更新。這個(gè)方法比事件總線干凈也比 localStorage 手動(dòng)同步靠譜。關(guān)于插槽我在RecipeCard組件里用了一個(gè)技巧。菜譜卡片在不同頁(yè)面展示的重點(diǎn)不一樣生成頁(yè)要顯示熱量和收藏按鈕首頁(yè)要顯示推薦理由收藏頁(yè)要顯示收藏時(shí)間。如果這些差異全用 props 塞進(jìn)去組件會(huì)變得很臃腫。我讓RecipeCard只負(fù)責(zé)渲染標(biāo)題、封面和描述然后把可替換區(qū)域開(kāi)放成插槽div classrecipe-card img :srcrecipe.coverUrl / div classcard-body h4{{ recipe.title }}/h4 p{{ recipe.description }}/p slot namefooter :reciperecipe span默認(rèn)底部?jī)?nèi)容/span /slot /div /div父組件使用的時(shí)候向具名插槽footer里塞不同的按鈕和時(shí)間信息不用改RecipeCard本身的代碼。很多初學(xué)者會(huì)覺(jué)得插槽是面試題里的抽象概念看到這里應(yīng)該能明白它就是給組件留的“自定義區(qū)域占位符”讓同一張卡片在不同上下文里呈現(xiàn)出不同細(xì)節(jié)。這套源碼里插槽用得不多但RecipeCard這一個(gè)案例已經(jīng)足夠看懂。5. 部署運(yùn)行與高頻問(wèn)題排查讓源碼在你的電腦上跑起來(lái)5.1 本地啟動(dòng)和打包部署流程本地跑起來(lái)只需要兩個(gè)終端窗口。第一個(gè)窗口啟動(dòng)后端cd server npm install npm run dev第二個(gè)窗口啟動(dòng)前端cd web npm install npm run dev前端默認(rèn)跑在5173端口后端跑在3000。我在 Vite 配置文件里加了開(kāi)發(fā)代理把所有/api請(qǐng)求轉(zhuǎn)發(fā)到http://localhost:3000這樣前端頁(yè)面里請(qǐng)求地址不用寫(xiě)完整的后端地址也繞開(kāi)了開(kāi)發(fā)環(huán)境跨域問(wèn)題。配置片段如下// vite.config.js export default defineConfig({ server: { port: 5173, proxy: { /api: { target: http://localhost:3000, changeOrigin: true } } } });如果你想把項(xiàng)目部署到服務(wù)器我比較推薦的做法是前端先npm run build打包出dist目錄然后讓 Express 托管靜態(tài)文件。具體說(shuō)在后端app.js里加幾行代碼當(dāng)路由匹配不到/api接口時(shí)直接讀取前端dist下的文件返回。這樣整個(gè)應(yīng)用只需要啟動(dòng)一個(gè) Node 進(jìn)程不太需要單獨(dú)配 Nginx。對(duì)于個(gè)人項(xiàng)目演示場(chǎng)景這是最省事的方式。如果你更喜歡標(biāo)準(zhǔn)的 Nginx 部署那就讓前端靜態(tài)文件交給 Nginx后端接口仍然由 Node 承擔(dān)。需要注意兩個(gè)點(diǎn)一是 Nginx 里要配置將/api轉(zhuǎn)發(fā)到后端端口二是前端使用的createWebHistory模式要求所有未知路徑都重寫(xiě)到index.html否則刷新詳情頁(yè)會(huì) 404。我也見(jiàn)過(guò)有人把這個(gè) Vue 項(xiàng)目打包后直接丟進(jìn) Spring Boot 的static目錄思路一樣只要處理好接口地址和跨域就行。5.2 高頻報(bào)錯(cuò)速查表這部分內(nèi)容是我自己踩坑和幫朋友調(diào)項(xiàng)目時(shí)總結(jié)出來(lái)的包含幾個(gè)高頻問(wèn)題按現(xiàn)象、原因和解決方式整理成了表格錯(cuò)誤現(xiàn)象原因解決方式npm : 無(wú)法加載文件 ... npm.ps1因?yàn)樵诖讼到y(tǒng)上禁止運(yùn)行腳本PowerShell 默認(rèn)執(zhí)行策略限制腳本運(yùn)行以管理員身份打開(kāi) PowerShell執(zhí)行Set-ExecutionPolicy RemoteSigned不想改系統(tǒng)策略就直接用 CMD 運(yùn)行 npmnode: not found或node 不是內(nèi)部或外部命令Node.js 未安裝成功或沒(méi)有加入 PATH重新安裝 Node.js 并勾選 Add to PATH安裝完成后重啟終端前端啟動(dòng)后頁(yè)面能開(kāi)但接口報(bào) 404開(kāi)發(fā)代理沒(méi)生效或后端沒(méi)啟動(dòng)確認(rèn)后端日志有輸出檢查vite.config.js的 proxy 配置請(qǐng)求路徑必須帶/api前綴請(qǐng)求提示 CORS 錯(cuò)誤后端沒(méi)開(kāi)跨域或代理配置沒(méi)覆蓋當(dāng)前請(qǐng)求后端掛載cors()中間件若用了代理請(qǐng)求地址不要寫(xiě)http://localhost:3000直連SQLite 報(bào) database is locked多個(gè)進(jìn)程同時(shí)寫(xiě)數(shù)據(jù)庫(kù)文件開(kāi)發(fā)時(shí)不要同時(shí)開(kāi)兩個(gè)后端進(jìn)程生產(chǎn)環(huán)境可切換 PostgreSQL/MySQLCannot find module better-sqlite3原生模塊編譯失敗或沒(méi)正確安裝先刪除node_modules再執(zhí)行npm install還是不行就檢查 Node 版本是否過(guò)新退回 LTS菜譜封面圖片上傳后訪問(wèn) 404圖片沒(méi)有放在uploads目錄或路徑缺少/uploads靜態(tài)服務(wù)檢查app.js里express.static配置上傳目錄必須存在并有寫(xiě)入權(quán)限中文亂碼數(shù)據(jù)庫(kù)文件編碼或返回頭缺少 charsetSQLite 本身是 UTF-8亂碼一般發(fā)生在 Windows 老終端建議用 VS Code 終端運(yùn)行這些報(bào)錯(cuò)里最顯眼的就是 npm.ps1 禁止運(yùn)行腳本。說(shuō)實(shí)話我第一次遇到也懵好不容易裝好 Node運(yùn)行npm -v卻報(bào)錯(cuò)。后來(lái)查清楚這是 Windows PowerShell 為了保護(hù)系統(tǒng)默認(rèn)不讓執(zhí)行.ps1腳本。我自己的處理方式是只在當(dāng)前用戶范圍放寬執(zhí)行策略不去改系統(tǒng)級(jí)策略Set-ExecutionPolicy -Scope CurrentUser RemoteSigned執(zhí)行后重新打開(kāi)終端就好。如果你在公司電腦上受組策略限制改不了就老老實(shí)實(shí)用 CMD 或 Git Bash一樣能跑 npm這也是完全合規(guī)的方案。5.3 關(guān)于這套源碼我的后續(xù)規(guī)劃和個(gè)人建議源碼我還會(huì)繼續(xù)迭代但方向不是加更多炫酷功能而是把推薦質(zhì)量做得更細(xì)。比如現(xiàn)在熱量估算是基于靜態(tài)食材表以后我想接入更完整的營(yíng)養(yǎng)成分?jǐn)?shù)據(jù)庫(kù)把鹽、油、糖的用量也納入計(jì)算。另一個(gè)方向是記錄用戶對(duì)生成結(jié)果的反饋點(diǎn)了“喜歡”還是“換一道”這些反饋數(shù)據(jù)積累起來(lái)后規(guī)則系統(tǒng)能做得更智能。對(duì)于想拿這套源碼做課程設(shè)計(jì)或者畢業(yè)設(shè)計(jì)的同學(xué)我強(qiáng)烈建議你在“生成歷史”和“用戶反饋”上多下功夫這兩塊最容易做出差異化和工作量證明。最后分享一個(gè)我實(shí)際改代碼時(shí)的小技巧先把所有菜譜數(shù)據(jù)導(dǎo)出來(lái)把你自己日常會(huì)做的十道菜加進(jìn)去然后生成一次看看推薦結(jié)果。這一步能讓你迅速理解推薦規(guī)則對(duì)結(jié)果的真實(shí)影響也會(huì)發(fā)現(xiàn)一些數(shù)據(jù)問(wèn)題比如某道菜熱量算出來(lái)不合理。數(shù)據(jù)是這類系統(tǒng)的地基算法再花哨食材用量錄入不準(zhǔn)也沒(méi)用。你把它當(dāng)成一個(gè)“幫自己做飯的助手”來(lái)打磨就能真正用好這套代碼。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
乱伦图一区| 亚洲综合一| 日韩无码服务区| 在线岛| 九九九九九九九精品视频| 东北女人| 欧美激情视频在线一区| 丁香五月激情综合| 久久黄黄黄| 中文字幕精品日韩中文字幕| 97色欧州| 欧美18老人禁| 18精品一区| 在线岛国新天堂8| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 色哟哟AV| 久久一级无码精品毛片6| 在线观看十八禁| 少妇天堂| 涩涩五月天| 91 亚欧| 久久亚洲AV成人精品无码| 色欲人妻一区二区在线| 久久人人爽爽人人爽人人片αV| 狠狠躁AV| 欧美中文字幕日韩在线| 91久久久视| 三级日本一区二区三区| 亚洲综合影片| 无码av永久免费专区网站| 美女AV一区二区| 亚洲无码偷拍| 午夜精品久久999热蜜桃介男人用| 岛国黄片网站| 中文字幕AV片| aaa一级黄片| 中文字幕欧洲有码| 日韩在线视频1234| 日韩欧美亚欧在线视频| 亚洲情色图片区| 国产无码高清操逼视频| 久肏视频字幕| 97亚洲综合电影| 精品久久无码午夜福利| 久久久96精品| 极品色社| 激情五月天社区| 久草老司机| 欧美激情中文字幕另类小说| 麻豆一区二区AV天美| 黑操B| 亚洲色婷婷久久久综合日本| 婷婷丁香一区二区三区| 天天干天天操天天干天天操| 国产蜜臀精品一区二区尤物| 国产欧美精品日韩区二区麻豆天美| 男啪女色黄无遮挡免费观看| 日韩精品操少妇| 在线观看AV片| 青青11操操操操操操操操| 超碰九区| 欲色啪| 蜜桃久久一区二区三区| 欧美性爱无码一区二区三区| 欧美92| 综合网欧| 后X久久| 十八禁视频一区二区| 97精品97久久| 99热综合在线| 怡红院一区二区熟女人妻| 91色亚洲| 热的中文 热的有码 热的国产| 91精品丝袜久久久久久| 欧美性爱91| 国产精品久久久亚洲第一牛牛_在线观看 | 在线天堂资源亚洲| 日韩少妇在线视频| 中文字幕天天天天天| 欧美强奸乱能| 久久在线观看免费视频| 精品人妻一二三| 中文字幕乱偷人妻久久艾草网| 99自拍视频在线观看| 亚洲欧美日韩制服另类| …中文字幕亚洲乱,97人妻无码费视…| 大香蕉碰碰| 艹少妇网站| 国产 码在线成人网站| 日韩欧美亚洲自拍偷拍| 超碰美女97| 91成人久久| 亚洲中文字幕妇伦久久| 色综合91| 免费视频在线观看啊啊啊啊啊| 婷婷深爱五月| 最新中文字幕在线亚洲| 韩国手机不卡无码三级视频| 丰满少妇一区二区三区免费看| 少妇内射www在线观看视频| 亚洲欧洲偷拍一区| 一区二区三区在线资源| 日本无码1| 综合五月天| 亚洲高清男人天堂| 欧美 亚洲 另类 综合| 久久久久久久久久久97| 蜜臀少妇一区二区| 操少妇很爽av| 麻豆天美国美国产AV| 欧美综合区| 国产精品视频麻豆入口| 91av一区二区在线观看| 亚洲男人天堂av| 熟女熟妇一区二区三四区| 日韩97视频| 熟妇精品juliaannAV| 国产精品久久久蜜臀| 啊啊啊慢点| 久久大陆| 大香蕉中文| 亚洲成人ab| 欧美色乱| 乱伦a片视频| 国产高清精品一区二区三区毛片| 国产黄色在线播放观看| 成人av影院在线观看| 日日噜噜夜夜狠狠视频无| 高清无码久操视频| 久久久久亚洲Av无码专区老牛影视| 综合欧美亚洲| 亚洲国产丝袜熟女av| 三上悠亚在线毛片91| 免费a v| 一个色导综合| 性在久久久久久| 国产亚洲精品av一区| aaa亚无码专区| 热久久国产| 日本性爰一道本| 亚洲国产成人精品无码专区| 激情专区综合| 99久久这里只有精品| 日本99久久| 97操97色| 欧美日韩人妻婷婷一区| 青青草国产欧美非洲黑人| 久久久精品电影| 亚洲青色欧美| 久久大香蕉97| 国产精品一区二区三区四区五区| 亚洲欧洲综合av在线| 日韩成人性爱AV| 久久久久久国产精品| 四虎AV无码| 熟妇国产免费一区| 日韩9区| 久久透逼视频| 日本污ww视频网站| 青娱乐av在线| 91高清日| 国产美女口爆吞精视频| 99久久久久| 亚洲AV免费在线观看| 日韩啪啪啪视频| 欧美淫乱视频| 欧美强奸乱能| 婷婷色网| 91熟女视频| 99re国产精品视频| 九色视频91| 国产人伦精品一区二区三区| 欧美视频一区二区三区| 久操网址| 欧美最婬乱婬爆婬性视频| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 日本久久99| 四虎视频在线观看| 免费在线看黄片av| 久操凹凸视频| 嫩草 人人网精品| 九九九网站| 性爱精品一区| 少妇内射视频| 第四色奇米影视777| 天天日天天插| 日曰骚久久精品| 国产精品无码久久久久2028| 中文字幕在线观看网页| 亚洲资源站| 亚洲成A∨人影院在线欢看| 九九成人精品| 日本精品一级二级三级| 97爱欧美| 欧美狠狠| 亚洲人精品久久久喷水| 国产精品69久久久久久久| 69XX一中文字幕人妻91| 99久久久无码| 亚洲一区操| 久久综合久久综合人久久夜精品| 999999精品| 欧美日韩性爱精品| 亚洲欧美国产精品久久久久久久| 久久99人妖视频国产| 欧美日韩亚洲五月天婷婷| 青娱乐二区免费| 人人妻人人操人人乐| 亚洲AV人人澡人人爱| 四虎国产精品永久地址入口| 91中文精品日韩欧美在线| 黑操B| 久久久久久精| 日本裸体久久色噜噜| 欧美色图20P| www狠狠| 九九操久久国产免费视频| 国产偷拍自拍在线视频| 欧美啪啪啪91| 99这里有精品视频| 91视频精品| 91人妻丝袜无码| 一级做a爰片性色毛片久久| 情色av电影| 久久久99免费| 午夜操操操| 久/久精品99看9| 色97干| 99国产精品人妻人伦| 97超碰碰| 2019亚洲男人天堂| 玖玖综合.com| 激情小说日韩无码| 97欧美色综合| 婷婷五月天基地| 欧美第一页| 91色黑人少妇| 久久性爱大全| 久久超碰97| 国产精品色哟哟| 二男一女成人A片| 欧美色图99| 日韩pv中文| 综合久久久久久久久91| 蜜桃臀一区二区aV| 欧美制服另类丝袜| 爆操无码| 青青操国产夫妻| 欧美制服网站美腿丝袜| 男男H黄动漫啪啪无遮挡网站| 91制服丝袜中文字幕| 97硬碰| 级品肉射| 99热超碰| 一区二区三区 日韩欧美| 天天干人人乐| 伊人久久亚洲中文字幕不卡| 99热久| 欧美一区二区男人天堂| 秋霞福利网| 天综合网| 97人人超| 噜噜噜噜天天狠狠| 久久区| 婷婷av在线中文字幕| 综合欧美日韩在线| 夜夜嗨一区二区| 摸奶性爱视频网站在线免费播放| 久久亚洲天堂| 99re只有精品| 91亚洲黑人| 在线看片国产精品每日更新| 免费a v| 精品国产乱码久久久影院| 婷婷色网| 一区二区日韩欧美久久| 亚洲精品一区二区三区在线播放| 国产精品视频91久久| 很很很很操| 青娱乐 成人娱乐在线| 日本一区二区不卡精品| 亚洲AV秘无码一区..| 91欧美少妇| 欧美韩国你懂得在线| 亚洲色吧网| 国产欧美一区激情交| 淫荡熟女乱伦网| 亚洲人成网站7777| 欧美日韩在线视频网站| 亚欧美综合网| 久久东京热成人| 亚洲精品 欧美精品| 国精综合一二三区影视| av操操不卡| 日本久操视频| 中文一区二区婷婷视频| av天天在线观看| 亚洲成人免费电影| 青青操视频在线| 一区| 做爱福利视频一区二区| 青娱乐大香蕉| 色偷偷色偷偷欧美日韩| 天天舔天天日天天射| 97视频620| 九一精品牛牛一区二区| 天美传媒在线一区| 天综合网欧美| 亚洲人妻色图| 国产精品色约约| 91国内外在线| 天堂av最新电影网| 麻豆尤物视频网| 中国91AV| 免费av高清无码| 黄色AV免费| 大香蕉免费3| 大香蕉一区二区在线观看.| 在线观看一级α片刺激高潮视频| 午夜激情成人在线观看| 国产精品宅男免费| 99综合网| 欧美老熟另类| 亚洲九九爱| 二三四区精品| 久久久性少妇| 日韩精品亚洲一二三| 日韩欧美~中文字| 欧美性高潮在线| 国产熟女精品一区二区| 欧美午夜视频免费观看| **一级毛片国产| 精品久久一区二区三区四区五区| 冬京热男人的天堂| 色五月69夫妻| 中文字幕一二三av| 另类亚洲一区二区三区| 久久久九九九九| 人妻天天爽| 97美日韩视频| 亚洲欧洲综合av在线| 大香蕉久操| 少妇与黑人高潮在线| 国产丝袜高跟美女av免费观看| 国产精品乱码久久久| 午夜超爽| 18岁禁 茉莉成人久久| 亚洲色欧| 黄色av片三级三级三级免费看| 97AV爱| 日韩成人人妻网站| 九月丁香婷婷色| 一道本久久棕合爱| 青青操在线视频| 为用户提供免费看黄网址在线观看| 国产精品成人无码av| 狠狠热这里都是精品| 日韩本不卡视频在线观看| 国内精品久久人妻性色av| 97人人干人人操| 中国小夫妻勾搭露脸淫荡对白| 亚洲成成熟女人综合一区二区| 成人七区| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 丝袜美腿91| 国产精品人妻熟女aⅴ| 91美女视屏| 精品国产乱码久久久| 日韩国产在线观看av| 91网亚洲| 黄色无码高清黄色无码网站| 精品一区二区三区蜜桃臀赵总 | 91 综合 色| 天天上日日上日韩精品| 99热精品在线| 国产视频第二页| 久久婷婷一区| 色yeye成人免费视频| 伊人丝袜美腿高跟在线观看高清| 家庭乱伦麻豆| 丝袜综合| 被男人添B超爽视频| 熟女在线视频| 欧美不卡五十路| 免费的av网| 亚洲无码视频免费在线观看网址! J?P?NESEHD熟女熟妇伦 | 久久精品操| 伊人女女资源在线观看| 欧洲性人爱视频| 91久久精品中文字幕| 青青草成人视频在线观看二区| 亚洲欧洲中文日韩女优乱码| 97久久久精品| 中文字幕精品区先锋资源| 狠狠做深爱婷婷久久二区| 18禁精品网站在线看| 粉嫩小泬久久久一区二区| 日本性爱欧美性爱| 欧美综合传媒| www.久久99| 青娱乐91| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 天天影视91看看| 亚洲高清在线| 蜜臀无码视频在线观看| 欧美熟妇操操视频| α√在线| 青青草好吊色| 91国产大片| 一级aaaaa欧美中文字幕录像片| 色阁阁AV综合网| 不卡啪啪视频| 乱伦熟妇一区二区| AV色五月| 日韩精品.久久精品.AV女优.天美传媒| 精品九九九九九九| 色偷偷色偷偷欧美日韩| 丁香五月婷婷啪啪| 日韩极品无码B| 欧美在线视频观看一二三四区高清| 综合自拍| 亚洲春色一区二区三区| 欧美超碰人妻97| 91九色精品熟女内射| 97天天摸天天碰| 婷婷伊人五月| 久久久久久免费电影| a久久| 亚洲无线码欧洲精品区别| 97超碰色中文字幕| 国产suv精品一区二区四区999 | 欧美狠狠干| 91久久久久久久| 久久99操天天日| 久久久久人妻二区精品叶可怜| www久久精品| 一区二区三区国产精产| 综合久久欧美| 国产Av超碰| 人妻夜爽夜夜爽| 91亚洲影院综合| 亚洲超碰在线| 国产精品一区午夜福利| 国产精品视屏| 2020天天色综合| 91嫩草欧美| 久操操| 人人操人人插人www| 欧美92| 伊人亚洲综合| 久久九七| 一区二区三区日韩欧美| 人成午夜免费大片| 免费人成在线观看网站品爱网| 日韩有码中文字幕女同性恋 | www老逼91| aaa一级黄片| 精品国产人成在线| 收看日本人日bb| 在线不欧美| 日韩BBN| 九九av| 麻豆一区二区三区精品| 日本一区二区三区欧美日韩中文字幕| 九九色精品| 丝袜剧情| 国产性久久久| 日韩人妻一二三区视频| 91午夜无码| 青娱乐福利99| 久久伊人最新网址视频| 夫妻天天操岛国视频| 中出91视频| 天美麻豆黄色录像| 亚洲极品| 蜜桃香蕉久草精品在线| 视频在线中文字幕| 日韩97视频| 九九九精品色乱九九九| 丝袜狂射91| 呦女网站| 亚洲在线观看| 亚州高清AV| 67914在线兔费成人视频| 九九人妻| 大香蕉日韩| 九九热精品| v91av| 欧美一级在线观看成人 | AV久日| 操死我了啊啊啊| 欧美日韩97在线| 俺去啦自拍| 极品美女嘿咻| 夜夜欢天天干| 欧美不卡五十路| 51国产午夜精品视频| 欧美中文字幕日韩在线| 国产成年免费大片黄在线观看| 一类无码操逼视频| 久久久久久AⅤ无码免费肉站 | 免费一级性爱久久| 天堂中文资源在线bt| 嫖老熟女A片一二三区| 第一高清av中文字幕| 久久99精品视频| 伊人亚洲国产一成人久久精品,久久| 密桃99999| 校园春色亚洲欧洲| 超碰97在线色男人??| 熟女露脸激情自拍视频| 国产丝袜啪啪| 日本韩国国产精品一区| 日本精品第一视频在'| 亚洲宅男天堂| 夜夜操中文字幕| 欧美操逼录像国产黄色国产| 国产肏逼网站| 日韩中文字幕在线视频观看| 欧美 亚洲 综合 制服| 久久天天躁日日躁狠狠躁 | 蜜区区视频79 | 天天草夜夜草高潮片| 日韩性爱播放| 校园春色综合色| 久久人妻一区二区三区高清| 99999精品| 国产91精品福利在线| 久久99操天天日| 久久久久密臀一区二区| 免费视频观看60秒| 男人的天堂午夜av| 婷婷五月丁香五月| 久久精品国产久精国产| 九九AV| 免费黄色A片| 青青草吊丝| 蜜臀99久久精品久久久久久| 在线无码视频| 91爽啪| 伊人久久亚洲色欲综合网站| 秋霞网无码| 亚洲日韩精品在线播放| 美女大乳久久久久久久女人18| 97色欧洲| 亚洲一级特黄大片在线播放91| 日韩素人无码一区二区三区三州| 高清不卡 中文 人妻| 日产操逼| 96精品在线| 另类老少妇| A级毛片在线看免费| 夜夜操2028| 超碰色美女| 一区二区三区探花在线观看| 91在线限制级| 国产色产精品在线观看| 丁香六月婷| 女人18精品一区二区三区| 又大又长又粗又爽又黄| 亚洲综合影视| 亚洲天堂久久久久久粉红视频| 久久婷色| 玖玖无码超碰| 丰满人妻大屁一区二区| 夜夜免费视频| 国产AV精久久| 91高潮喷水美女| 色操逼网| 成人十八禁日韩欧美一二三| 国产v片在线免费观看| 久久一区无码| 亚洲色婷婷久久91| 神马视频久久久久久| 野狼福利社区| 久无码| 84YTCOM性无码| 青青11操操操操操操操操| 美女网站91| 97中文天堂| 成人国产视频在线观看| 99啪啪视频| 美女操逼A A| 日本啊啊啊啊啊视频| 国产AAAAAABBBBB| 夜夜狠狠躁日日躁色视频| 国产最新小视频在线播放下载 | 国产天天看| 亚洲综合另类小说色区亚洲成av人片在www| 超碰在线974| 国产精品福利视频播放| 欧美熟女丝袜| 中文字幕在线高清男人的天堂 | 99re超碰| 天天弄欧美| 丰满人妻一区二区三区四区| 一区二三区四区视频大全套| 欧美视频在线视频免费va| 欧美中日韩XXXX| 日韩亚洲美州欧洲综三区一品在线| 久久精品一区二区三区四区五区| 欧美色图偷拍另类| 日韩午夜精品一区二区三区电影| 亚洲综合色在线| 狠狠色丁香| 国内偷拍精品一区二区| 操逼999| 久久美女福利是上海美女| 亚洲欧美日韩不卡人妻| 蜜臀久久99精品久久久久免费观| 国产高清免费不卡av| 久久精品人妻一区二区三区| 亚洲天堂,男人| 久久亚洲中文字幕视频| 粉嫩av一区二区三区四季| 欧美做爰无码A片视频| 97超碰超碰| 日韩无码AB| 综合五月天| 久久伊人亚洲AV无码网站| 国产精品电| 荡小穴在线观看| 亚洲 一区二区 自拍| 青青操国产夫妻| 久超超碰| 人妻少妇久久久| 国产对白刺激视频| 久久久久白虎| 十八禁一区二区无码观看| 亚洲丝袜色| 乳欲人妻办公室奶水| 欧美色图亚洲色| 麻豆精品三区视频| 亚洲91av| 九月色婷婷| 久久五十路熟女人妻| 欧美精品庄| 青青草久草AV| 人人操天天爽| 天天操夜夜操| 欧美性爱十八禁| 国产精品白丝在线播放| 蜜臀久久99精品久久久久久成人小说| 污污污8888| 久久天天性久久伊人| 操逼网免费无码视频| 内射小黄片| 日本一区二区三区四区五区六区七区八区九区| 欧美综合 站| 歐美一級亂黃99在綫精品| 色区久久| 日本在线播放不卡一区| 美国一区二区三区视频| 台湾一区国产高清在线| 91久久久久久久久18| 婷婷九月丁香| 任我爽在线视频免费观看| 97中文字幕色| 啊啊啊好湿久久| 91蜜臀熟女| 防屏蔽在线视频| 天天色播| 99久久久久| 精品成人av一区二区三区在线| 思思热在线cao| 一级@啪啪视频| 中国操逼无码| 26uuu久久| 最新亚洲黄色免费电影 | 久久视频,这里只有精品| 欧美白嫩女HD| 无码视频一区二区| 夜夜国产一区| 小骚逼被操的爽不爽| 北京美女一区二区| 午夜精品久久久久| 97碰碰日本乱偷人妻中文的| 亚洲美女30b| 91久久18禁| 综合天天网| 欧美 亚洲 另类 综合| 黄日韩| 99热18这里只有精品| 久久亚洲天堂| 色网亚洲人| 久久香蕉国产线看观看亚洲女人 | 丁香婷婷九月| 深爱激情五月天| 日韩av女优在线免费一区| 欧美一区91大爱| 啊啊啊啊啊在线观看网址| 免费看污网站| 狠狠躁天天躁日日躁| 91艹| www欧美91| 久久久久少妇| 亚洲激情综合另类男同| 在线无码操| 亚洲九九夜夜| 骚乳在线| 伊人色综合欧美| 国产精品另类| 最新亚洲黄色免费电影| 无码人妻精品一区二区中文| 色噜噜人妻丝袜a∨先锋影 | 亚洲成人在线播放| 亚洲天堂色图| 亚洲图片 激情小说| 欧美亚洲韩国视频十五区 | 噜噜噜噜天天狠狠| 国产一国产一级毛片古装| 国产精品点击进入在线影院| 欧美性天天影院| 色与欲影视天天看综合网| 九九九九久久久久| 精品日韩中文在线| 欧美很很操视频| 最新一二三区视频| 色拍偷亚洲| 91美女在线| 人人妻人人爽 97人人看碰人免费公开视频| 日韩A优精品在线观看| 大香蕉人妻| 97综合国产精品高潮久久| 无码精品啪啪啪一区二区三区三州| 中国特猛少妇色xxx| 免费1级a做爰片观看| 欧美性爱另类综合| 久久av网| 加勒比色99999| 国产亚洲精品久久久久小| 极品色www影院| 夜夜操av亚洲一区二区| 91天美免费| 国产成年精品高清在线观看91| 婷婷五月激情综合| 久久精品夜色国产亚洲AV| 亚洲人妻久久| 日本黄 R色 成 人网站| 啊啊啊啊啊在线视频| 青草一区二区| 婷婷中文网| 婷婷另类小说| 91色综合| 五月天综合| 破处bbq| 无码人妻一区二区三区色欲aⅴ | 国产操操日韩三级黄| 爱射综合| 国产精品另类| 亚洲第一无码播放立川理惠| 欧美另类自拍| 性色AV蜜色av色欲av| 天天爱天天操| 国产亚洲禁久一区二区| 男人 天堂 日 亚洲| 91天天综合| 99热精品在线在线| 国产日韩中文字幕欧美| 国产日韩欧美亚洲精品95| 天天综合网久久ww| 国产成人久久精品蜜臀| 人人操AV| 男女啊啊啊啊啊| 一个人免费HD91视频| 日韩 欧美 国产 麻豆| 久久透逼视频| AV丝袜少妇| 俺去啦俺来也久久综合| 久久9亚洲| 国产一国产一级毛片古装| 天天干天天干天天| 欧美日韩亚洲天堂| 天天日天天操心| 精品人妻一区二区三区视频在线| 日本片日本片祼观看网站在线看中文版网页在线看 | 96精品久久久久中文字幕| 超碰色综合| 亚洲日韩肥臀视频在线观看| 国产99999| 日本人体九九九九九九| 啊啊啊好多水| 手机不卡视频不卡在线一二三区| 秋霞午夜成人福利片片| 91人妻丝袜无码| 国产精品久久久吖| 丰满搜索结果 -第18页- 久久高清无码| 测评在线观看AV| 嗯……啊…嗯嗯…啊…好舒服| 久久久久久久强迫| 青青草五月天| 强奸乱伦Av网| 久肏视频字幕| 92福利社视频| 在线综合网| 美女干逼2| 精品人妻一区二区视频| 国产乱伦性爱AV| yazhououmeizongya| 久久亚洲婷婷| 97综合国产| 欧美精品丝袜久久久中文字幕| 青草伊人网| 九九这里只有精品| 校园春色亚洲| 欧美激情亚洲| 亚洲综合有码| 欧美少妇色图| 大香蕉乱级| 操逼www.| 深田咏美亚洲精品福利社| 99热伊人| 91在线综合网| 亚洲欧美日产国产91毛片| 亭亭在线资源| 国产日本顶级一区二区三区| 天天影视亚洲| 亚洲国产成人7777| 亚洲欧美在线观看免费| 国产免费永久精品无码| 性色一线| 欧美日韩大陆黑人少妇99| 丰满丝袜少妇AV| 日韩人妻无码不卡网站| 亚州熟女乱伦| 亚洲色 国产 欧美 日韩| 99视频精品| av操操不卡| 色偷偷超碰亚洲| 欧美性性性| 麻豆综合一区av| 日韩一区二区三区四区五区| 亚洲少妇色| 欧美成人色| 欧美96在线|欧| A级片日韩欧美国产欧美视频精选观看| 95自拍视频在线观看| 午夜男人一级A片7777| 伊人久久亚洲中文字幕| 亚洲 欧美 综合 91| 青草成人免费视频一COm| 午夜精品久久久久久久久久蜜桃| www.av在线观看| 青青草在线视频人人想人人上| 美熟女逼导航AV操逼| 丁香九月婷婷| 特级毛片特黄久久免费看| 人妻啊啊人妻啊啊| 九九九精品一区二区无码| 极品色综合| 天堂俺去俺来也www久久婷婷| 99视频内射三四| 国产精品suv一区| 五月天伊人网| 乱伦图一区| 成人影 天天操 亚洲| 欧美高清在线| 狠狠色伊人亚洲综合网站色| 日本九九九九| 97精品久久久久中文字幕| 97干97色| 国产精品久久久鸭无码的功能| 少妇与黑人高潮在线| 91第一页| 激情啪啪拍91| 日韩 成人 有码| 丁香七月婷婷| 久草五月| 国产后入内射| 精品国产Av无码久久久亚洲| 婷婷色色五月| 国产成人精品一区| 国产精品爱欲| 国产自产91区13区| 亚洲美女精品九九视频| 大色综合网| 亚洲www91| 20cm女自慰在线日韩欧美| 久操大香蕉| 人妻素股| 精品视频免费在线一区| 91色黑人少妇| 色99999| www.狠狠操| 亚春色色| 日本中文字幕在线视频| 亚洲天堂美臀在线| 嫩草在线视频| 欧美 日韩 国产传媒| 亚洲加勒比久久日本道| www五月| 欧美精品系列| 久精品无码av一区二免费国产在线观看 | 中文字幕乱偷人妻久久艾草网| 26uuu国产亚洲综合| 91人妻丝袜无码| 丁香九月婷婷| 亚码激情| 亚洲欧美不卡线| 日韩精品一二三四| 美欧色综合| 日本三级中国三级99人妇网站| av2014 日韩在线中文字幕| 国产一区二区欧美日本| 午夜久久久| 看日韩操逼| 人妻美腿丝袜日韩| 一区二区三区激情在线观看| 天天综合网亚洲综合网| 婷婷中文网| 草B在线| 婷婷五月天成人| 久久久青青草| 亚洲 综合 欧美| 久久超碰网| 日韩三级网址| 国产成人拍国产亚洲精品| 9超碰免费| 日本狂喷奶水在线播放212| 嗯嗯啊好大| 干干干天天| 日本国产二线女色| 日韩成人电影AV| 男人天堂新在线| 久久久工口| 久久日韩精品一区二区| 夜草欧美| 国内毛片国产专区二| 亚洲情色 无码专区| 丁香婷婷久久| 人人操人人色网| av午夜玫瑰| 日韩精品中文字幕一| 91精品操美女| 五月花婷婷| 亚洲无码 国产无码| 久久久久久九九九九-美女久久久久久久-成人AV | 欧美72网页| 91三级理论片播放器| 久久精品国产97欧美精品亚洲 | 毛片17S| 欧美黄片免费在线观看视频| 另类欧美| 日本高清电影欧美色图| 99久久久久久亚洲精品不卡| 激情小说亚洲图片| 五月婷婷色色| 国产黄色视频久久| 亚洲国产亚洲天堂| 开心激情站| 天堂69亚洲精品中文字| 亚洲图片 激情小说| 女人高潮大叫一级毛片| 国产女大学生AV| 欧美亚洲高清不卡| 99热超碰在线| 被男人吃奶很爽的毛片| 青青草一区二区三区四| 国产乱码久久| 免费αⅴ在线观看| 少妇精品| 国产精品欧美激在线| 亚洲欧美精品福利在线| 97色碰| 日韩久草| 国产四虎在线| 国产精品无码在线| 精品亚洲| 一摸二插三插| 欧美亚洲第1页| www网站黄| 亚洲中文字幕在线视频一区二区| 啊啊啊啊啊啊啊啊啊在线观看| 东北熟女91| 欧美999999| 黑操B| 中国东北熟女老太婆内谢| 97超碰久久| 台湾佬中文娱乐网久久久久久久久久com| 欧美亚性天堂| 自拍偷拍 日韩无码| 91欧洲国产成人久久精品网站| 加勒比综合a∨| 午夜福利久久久噜久噜久久综合 | 日日骚一区二区三区| 人人妻人人色| 电影69乱码96| 秋霞一级视频在线观看免费| 在线观看不卡一区二区三区| 日韩大香蕉AV影片| 啊灬啊灬啊灬啊灬高潮奶出了免费视| 看看小穴| 婷婷亚洲天堂| 一级特级aaaa毛片免费观看| 日韩性爱小视频| 亚洲图片欧美偷拍| 风骚少妇视频中文字幕| 成年男人的天堂| 免费观看欧美日韩操逼视频| 综合欧美日韩在线观看| 天天躁日日躁成人字幕aⅴ| 日韩精品-原创伙伴| 久久女女| 蜜臀一二三| 欧美精品91| 偷窥自拍亚洲色图| 久操操| 国产一区二区视频在线播放| 午夜福利av电影在线| 精品人妻视频入口| 欧美综合网在线| 97色操| 91在线国产后入风骚翘臀美女素人| 中文字幕日韩精品一区二区三区| 欧美久久九九| 能看的AV| 亚洲黄色影视| 国产女人91精品嗷嗷嗷嗷| 伊人久久综合精品欧美| 国产美女自拍AV| 国产精品高潮呻吟av久久4虎| 天天做天天爱| 97天天操| 亚洲熟女av中文字幕| 一二三区精品视频| 国产嫩草精品A88AV| 中文字幕午夜精品久久久| 嗯嗯啊啊啊啊轻点视频| 国产精品天干天干综合网麻豆| 爱爱动态试试看6 0秒| 91丝袜美女| 国产精品久久发布| 精精夜夜| 特级大荫道BBwBBwBBW| 91色碰| 九九九九九九亚洲| 亚洲天堂女优在线| 精品国产网站| 欧美有码亚洲中文字幕一区二区三区四区| 午夜天堂精品久久久久91| 开心婷婷五月| 国产精品交换一区二区| 中文字幕在线观看丝袜| 欧美激情五月天| 亚洲欧美精品一区天堂久久| 日本 欧美 亚中文字幕| 国产91美女高潮| 天美AV片| 亚洲天堂另类小说男人| 亚州色站 日韩电影| 精品久久久久黄少妇| 啊啊啊啊啊啊啊好爽不要| 欧美熟女妇同| 校园春色宗合网| 999九九九九国产动| 91成人亚洲色图| 天天干人人乐| 天天色图| 亚洲男人久久综合天堂| 日本无码1| 黄片在线免费在线观看| 69精品人人人人| 91精品电影18| 在线视频五十市| 青青草久草AV| 风间由美日韩欧美久久| 欧美少妇色图| 国产精品久久久久久久电影渣男| 狠日操| 综合色色网| 又黑又大又粗 | av毛片aaaaa免费看| 性爱乱伦视频免费| 黄片直播三级黄片两女一男| 国产超碰在线| 色婷婷综合久久久久中文一区二区| 国产精品色哟哟| 加勒比久久av| 999999精品| 亚洲熟久久| 日日骚av| 污色区网站| 凹凸视频在线观看伊人| 97人人射| 欧州激情视频在线一区二区| 成人精品水蜜桃久久久久久久| 一本色道人妻久久| 操逼视频国产无套| 久久99人妖视频国产| 另类综合另类| 精品中文日韩字幕视频| 国产97色在线| 一本大道不卡一二三区| 婷婷色在线| 久久久熟妇熟女国产| 精品丰满熟妇人妻一区| 日语五十路和六十路亚洲国产精品 | 黄色片G G G| 久久久久久九九九| 日韩精品中文字幕一| 国产亚洲人妻综合日韩 久久| 97久久免费| 国产精品久久久久久久久久久久久久| 色黄污美女啪啪啪免费网站| 色欲天天综合网| 99精品伊人| 亚洲人妻久久| 思思在线免费视频| 欧中日成人免费影视| 亚洲美女高潮喷水视频| av一区二区三区四区| 92福利社视频| 亚洲AV在线资源| 男人女人18禁片免费看网站| 狠狠激情综合狠狠操中文字幕| 97国伦国色| 91狠狠综合久久| 亚洲系列第一页| 好爽,再快点啊哈嗯嗯嗯嗯| 91精品国产91久久久久久久久久久久| 欧美性生活男人的天堂| 亚洲久热| 亚洲中亚日激情视频| 粉嫩av平台| 日韩久久三区| 97在线欧| 日日夜夜精品| 97色插| 欧美丝袜中文字幕07在线| 久久精品中文字幕观看| 污到发麻的视频 国产| 清纯唯美综合| 久久精品国产亚洲AV无码电影| 久久国产视频专区一二三| 伊色久人大在线| www黄片免费看com| 午夜福利区| 精品国模无码| 国色天香av| 国产激情在线| 久操视频资源站公开| 怡红院成人av| 欧美大波激情xxxx| 色穴精品| 色欧洲| 99热这里是精品| 999久久久久久久久| 亚洲精品亚洲人成在线麻豆| 97超碰免费人人性爱| 中国农村熟妇毛片视频| 中文字暮97| 91少妇人妻| 国产 码在线成人网站| 久久久久96| 网页导航五月天免费一二三区| 青青草男人天堂| 2017人人操,人人摸| 精久久久91| 欧美日韩啪啪电影| 91天天综合网,天天综合网|