免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

Spring Boot + Vue 3全棧項目實戰(zhàn):前后端分離開發(fā)與部署指南

Spring Boot + Vue 3全棧項目實戰(zhàn):前后端分離開發(fā)與部署指南 1. 項目概述1.1 核心需求解析做全棧開發(fā)這幾年我見過太多半路出家的開發(fā)者在 Spring Boot 和 Vue 的邊界線上反復(fù)橫跳——后端能寫接口但前端拿著 JSON 不知道往哪兒塞前端能把頁面畫出來但遇到跨域、鑒權(quán)、打包部署就抓瞎。這個實戰(zhàn)指南解決的就是這個問題把一條完整的前后端分離開發(fā)鏈路串起來從零開始搭建一個可直接運行的全棧項目。注意這里的關(guān)鍵詞是“全?!辈皇恰扒昂蠖烁鲗懸话搿?。項目會包含一個完整的業(yè)務(wù)閉環(huán)前端 Vue 負(fù)責(zé)頁面交互和數(shù)據(jù)展示后端 Spring Boot 負(fù)責(zé)接口服務(wù)和數(shù)據(jù)持久化中間通過 RESTful API 通信最終打包部署到同一臺服務(wù)器上跑通整個流程。這個過程中涉及的技術(shù)點非常密集——Vue 的生命周期、Axios 的請求攔截、Spring Boot 的分層架構(gòu)、MyBatis 的數(shù)據(jù)映射、JWT 的登錄態(tài)管理、Nginx 的反向代理——任何一個環(huán)節(jié)掉鏈子整個項目就跑不起來。這個項目的受眾其實很廣。剛?cè)胄械某跫夐_發(fā)者可以通過它建立全棧思維知道前端發(fā)起的請求在后端到底經(jīng)歷了什么寫了好幾年接口的后端開發(fā)可以補上前端技能獨立負(fù)責(zé)完整模塊做畢設(shè)或小團隊項目的同學(xué)可以直接拿這套骨架改業(yè)務(wù)邏輯就能上線。我的建議是無論你偏向前端還是后端都完整地把項目過一遍收獲最大的恰恰是你知識短板那部分的內(nèi)容。1.2 技術(shù)棧全景與選型理由Spring Boot 3.x 搭配 Vue 3.x 是當(dāng)前主流選擇我用的版本組合是 Spring Boot 3.2.5 Vue 3.4.21 Vite 5.2.0。這套組合的好處是生態(tài)成熟遇到問題搜一下基本都是現(xiàn)成的答案。Spring Boot 3.x 相比 2.x 最大的變化是底層基于 Spring Framework 6支持 Jakarta EE 規(guī)范默認(rèn)使用 Java 17 及以上版本開發(fā)體驗和性能都有明顯提升。Vue 3 的組合式 API 寫起來比 Options API 更符合直覺配合 Vite 的開發(fā)服務(wù)器熱更新速度能縮短到一兩秒。數(shù)據(jù)庫我用 MySQL 8.0持久層框架選了 MyBatis Plus 而不是純 MyBatis原因很簡單——單表操作完全不需要手寫 SQL自帶的方法夠用復(fù)雜查詢再看情況寫 XML。鑒權(quán)方案采用 JWT Spring Security但做了簡化處理只用了 Spring Security 的加密工具類沒有引入完整的安全過濾鏈。很多全棧項目的通病是過度設(shè)計明明是個小項目卻把微服務(wù)、分布式那套全上了結(jié)果光搭建環(huán)境就花了大半時間。這次的實戰(zhàn)特意保持克制讓你能專注于理解核心鏈路。提示如果你的環(huán)境是 JDK 8暫時不想升級建議使用 Spring Boot 2.7.x 配合 Vue 2但同樣建議盡早升級。JDK 17 的垃圾回收性能和容器支持都比 8 好很多IntelliJ IDEA 2023 版本對 JDK 17 的支持也更順手。2. 整體設(shè)計與架構(gòu)拆解2.1 前后端分離架構(gòu)的邊界劃分全棧項目最容易犯的錯誤是職責(zé)混亂。前端代碼里塞后端邏輯后端代碼里混頁面模板時間一長代碼就成漿糊了。這次項目采用嚴(yán)格的前后端分離模式前端是純靜態(tài)資源通過 Axios 異步調(diào)用后端接口后端只負(fù)責(zé)提供 JSON 數(shù)據(jù)不做頁面渲染。簡單來說你可以把整套系統(tǒng)想象成一家餐廳前端是服務(wù)員負(fù)責(zé)記錄顧客需求、展示菜品渲染數(shù)據(jù)后端是后廚負(fù)責(zé)準(zhǔn)備菜品處理業(yè)務(wù)數(shù)據(jù)庫就是儲藏室。服務(wù)員不需要知道菜怎么做后廚也不需要直接和顧客溝通兩者之間的點菜單就是 API 接口。拿一個具體的業(yè)務(wù)場景來說用戶在前端頁面上登錄填完表單點擊提交按鈕Vue 組件把表單數(shù)據(jù)通過 POST 請求發(fā)送到后端的/api/login接口后端 Controller 接收請求調(diào) Service 層校驗用戶名密碼再調(diào) Mapper 層查數(shù)據(jù)庫校驗通過后生成一個 JWT token 返回給前端。前端收到 token 后存在 localStorage 里之后每次請求都在請求頭帶上這個 token后端用攔截器驗證 token 是否有效。整個鏈路中前端和后端各自獨立開發(fā)、獨立測試、獨立部署契約就是接口文檔。2.2 后端分層設(shè)計的職責(zé)劃分后端項目的包結(jié)構(gòu)按照經(jīng)典的三層架構(gòu)來組織Controller 層負(fù)責(zé)接收請求和參數(shù)校驗Service 層負(fù)責(zé)業(yè)務(wù)邏輯Mapper 層負(fù)責(zé)數(shù)據(jù)庫操作。在這個之上再加一個 Entity 包放實體類一個 DTO 包放數(shù)據(jù)傳輸對象一個 Config 包放配置類一個 Common 包放統(tǒng)一返回結(jié)果和異常處理。每個層之間通過接口和類來協(xié)作。Controller 不直接操作數(shù)據(jù)庫Service 不寫 SQLMapper 只做數(shù)據(jù)映射。剛?cè)腴T的開發(fā)者容易把業(yè)務(wù)代碼全堆在 Controller 里一個方法寫上百行看起來很“高效”實際上后面需求一變更就得重寫。我曾經(jīng)接手過一個項目登錄接口里直接拼 SQL 查數(shù)據(jù)庫后來要加驗證碼功能那叫一個費勁。打個比方三層架構(gòu)就像公司的三級審批——Controller 是前臺接待負(fù)責(zé)接需求和判斷訴求是否合理Service 是部門主管負(fù)責(zé)制定處理方案并協(xié)調(diào)資源Mapper 是具體執(zhí)行人負(fù)責(zé)落實細(xì)節(jié)。每一層只做自己該做的事出問題時能快速定位是哪個環(huán)節(jié)的鍋。2.3 前端組件化設(shè)計的模塊劃分前端項目按功能模塊劃分目錄結(jié)構(gòu)api目錄放接口請求封裝router目錄放路由配置stores目錄放 Pinia 狀態(tài)管理views目錄放頁面組件components目錄放公共組件。組件化設(shè)計的關(guān)鍵是找到合適的拆分粒度。舉個具體的例子后臺管理系統(tǒng)里常見的“用戶管理”頁面可以拆成搜索欄、表格、彈窗表單三個部分。搜索欄接收用戶輸入的查詢條件通過事件把條件拋給父組件父組件拿到條件后更新列表數(shù)據(jù)表格展示數(shù)據(jù)并監(jiān)聽行點擊彈窗表單負(fù)責(zé)新增和編輯。組件拆分有個度阿里推出的前端規(guī)范里提到一個原則如果一個組件太長超過合理范圍還沒法拆分出可復(fù)用的子組件可能就是職能不單一。反過來把組件拆得太碎也有問題——有一次我把一個簡單的列表頁拆成了十多個組件每個組件只有幾十行代碼結(jié)果傳參傳得頭暈調(diào)試一個 bug 得在文件間跳來跳去。一般的原則是只在組件被兩個以上地方復(fù)用或者單個組件的復(fù)雜度已經(jīng)明顯影響可讀性時才需要拆分。3. 環(huán)境準(zhǔn)備與項目初始化3.1 開發(fā)環(huán)境的版本選型與安裝清單先過一遍環(huán)境清單。后端需要 JDK 17、Maven 3.9、MySQL 8.0前端需要 Node.js 18我用的 20.12.0、npm或 pnpm/yarn這里用 npm、Vite 作為構(gòu)建工具。IDE 方面我推薦后端用 IntelliJ IDEA前端用 VS Code兩個都裝也沒問題。幾個需要注意的坑先提前說JDK 版本必須和環(huán)境變量匹配。裝了多個 JDK 的機器上IDEA 里配置的 Project SDK 和系統(tǒng)環(huán)境變量最好統(tǒng)一否則 Maven 編譯時可能用錯版本。Node.js 盡量用偶數(shù)版本。Node 官方對奇數(shù)次版本的支持時間較短有些依賴可能不兼容。當(dāng)年 Node 15 時代裝 Vite 就是各種問題后來學(xué)聰明了直接固定用最新 LTS 版本。MySQL 8.0 的認(rèn)證插件。默認(rèn)的caching_sha2_password在舊版連接驅(qū)動下會報錯Spring Boot 3.x 自帶的 MySQL Connector/J 8.x 沒問題但如果你的其他老項目還在用 5.x 驅(qū)動連接 MySQL 8 會失敗。安裝順序沒有硬性要求但建議先裝后端環(huán)境再裝前端環(huán)境。因為后端跑起來之后你可以先用 Postman 測試接口確認(rèn)沒問題再寫前端頁面這樣排查問題時范圍更清晰。3.2 后端項目初始化三步走先用 IntelliJ IDEA 創(chuàng)建 Spring Boot 項目。如果你用的是 IDEA 2023 版本可以直接在 New Project 里選 Spring InitializrGroup 填com.exampleArtifact 填fullstackJava 版本選 17依賴勾選 Spring Web、Spring Security可選也可以后面手動加、MySQL Driver、Lombok、Validation。需要補充說明的是Spring Initializr 生成的項目默認(rèn)帶一個mvnwMaven Wrapper它允許你在沒有全局安裝 Maven 的機器上直接執(zhí)行./mvnw命令來構(gòu)建項目這對保證構(gòu)建環(huán)境一致性很有幫助。如果你的機器沒有 Maven可以用它來代替mvn命令。項目生成后先別急著寫代碼把目錄補齊?;A(chǔ)結(jié)構(gòu)大概是src/main/java/com/example/fullstack ├── controller ├── service │ ├── impl ├── mapper ├── entity ├── dto ├── config └── common然后在pom.xml里加入 MyBatis Plus 的依賴。有個地方容易踩坑MyBatis Plus 在 Spring Boot 3.x 下需要引入mybatis-plus-spring-boot3-starter而不是mybatis-plus-boot-starter那是給 Spring Boot 2.x 用的。如果你用錯版本啟動時大概率會報Invalid value type for attribute factoryBeanObjectType之類的錯誤。配置文件application.yml按以下內(nèi)容配置server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/fullstack_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: your_password jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto這里有個細(xì)節(jié)Jackson 的日期格式設(shè)置很重要。如果前端傳來的日期字符串是2024-05-20 10:30:00格式后端 LocalDateTime 字段不加JsonFormat注解或全局配置默認(rèn)是 ISO 格式反序列化時就會報錯。全局配好省得每個字段都寫注解。3.3 前端項目初始化與依賴配置前端我用 Vite 創(chuàng)建項目命令如下npm create vitelatest frontend -- --template vue cd frontend npm install然后安裝項目需要的依賴npm install vue-router4 pinia axios element-plus選 Element Plus 做 UI 組件庫是國內(nèi)全棧項目的常見選擇它對中文場景支持好表格、表單、分頁這些后臺管理常用的組件都有現(xiàn)成的。同時安裝它的圖標(biāo)庫element-plus/icons-vue可以在全局注冊方便在菜單和按鈕里直接用圖標(biāo)。依賴裝完之后先配置 Vite 的代理和構(gòu)建選項。開發(fā)階段前端和后端分離運行需要把請求代理到后端服務(wù)生產(chǎn)階段前端構(gòu)建后的靜態(tài)文件由 Nginx 托管也需要配置轉(zhuǎn)發(fā)規(guī)則。在開發(fā)環(huán)境vite.config.js里加代理import { defineConfig } from vite import vue from vitejs/plugin-vue export default defineConfig({ plugins: [vue()], server: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } })這樣前端代碼里請求/api/login時Vite 會把請求轉(zhuǎn)發(fā)到http://localhost:8080/api/login繞過了開發(fā)環(huán)境下的跨域限制。生產(chǎn)環(huán)境則交給 Nginx 配置 location 塊做反向代理。提示配置代理解決的是開發(fā)階段的跨域問題。如果你的前后端部署在同一臺服務(wù)器、同一個域名下生產(chǎn)環(huán)境一般不需要跨域處理但如果部署在不同域名或端口下則要在后端加 CORS 配置。這個細(xì)節(jié)等到部署章節(jié)詳細(xì)講。4. 核心功能開發(fā)實操4.1 用戶認(rèn)證模塊的完整實現(xiàn)方案用戶認(rèn)證是幾乎所有全棧系統(tǒng)的剛性需求。我用 JWT 實現(xiàn)了這套認(rèn)證流程核心思路是用戶登錄成功后后端簽發(fā)一個有效期為一定時間的 token前端存儲這個 token在每次請求的 Authorization 請求頭里帶上來后端通過攔截器統(tǒng)一校驗。先說數(shù)據(jù)表結(jié)構(gòu)用戶表設(shè)計為CREATE TABLE sys_user ( id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 用戶名, password varchar(100) NOT NULL COMMENT 加密后的密碼, nickname varchar(50) DEFAULT NULL COMMENT 昵稱, email varchar(100) DEFAULT NULL COMMENT 郵箱, status tinyint(4) DEFAULT 1 COMMENT 狀態(tài)1啟用 0禁用, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4;密碼存儲用的是 BCrypt 加密算法這是 Spring Security 里自帶的工具類不需要額外引依賴// 加密 String encodedPassword BCryptPasswordEncoder().encode(rawPassword); // 校驗 boolean matches encoder.matches(rawPassword, encodedPassword);這里有一個很容易被忽略的安全細(xì)節(jié)matches方法第一個參數(shù)是明文密碼第二個是數(shù)據(jù)庫里取出來的密文。我第一次寫的時候參數(shù)順序搞反了調(diào)試了半小時才發(fā)現(xiàn)是參數(shù)順序問題。另外注意 BCrypt 的加密結(jié)果是隨機的同一個明文每次加密出來的密文都不一樣所以不能用常規(guī)字符串比較必須用matches方法校驗。登錄接口的邏輯不復(fù)雜偽代碼是這樣的Controller 接收LoginRequest用戶名密碼Service 層根據(jù)用戶名查用戶如果用戶不存在直接拋異常提示“用戶名或密碼錯誤”注意這里的提示不能太具體否則會暴露用戶是否存在存在則用 BCrypt 校驗密碼失敗同樣提示“用戶名或密碼錯誤”成功后用用戶 ID、用戶名和當(dāng)前時間戳生成 JWT返回 token 用戶信息。4.2 JWT 攔截器的實現(xiàn)與請求鏈路JWT 攔截器是一個關(guān)鍵的“橫切關(guān)注點”。我用 Spring 的HandlerInterceptor實現(xiàn)配合 WebMvcConfigurer 注冊讓所有/api/**下的接口都經(jīng)過校驗登錄接口本身要放行。核心邏輯如下Component public class JwtInterceptor implements HandlerInterceptor { Autowired private JwtUtils jwtUtils; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 放行預(yù)檢請求 if (request.getMethod().equals(OPTIONS)) { return true; } // 前端約定 token 放在請求頭的 Authorization 字段中 String token request.getHeader(Authorization); if (token null || token.isEmpty()) { return this.unauthorized(response, 未登錄或登錄已過期); } // 校驗 token 合法性 try { String userId jwtUtils.getUserIdFromToken(token); request.setAttribute(userId, userId); return true; } catch (Exception e) { return this.unauthorized(response, token 無效或已過期); } } private boolean unauthorized(HttpServletResponse response, String msg) throws IOException { response.setStatus(401); response.setContentType(application/json;charsetutf-8); response.getWriter().write(JSON.toJSONString(Result.error(401, msg))); return false; } }注意一個細(xì)節(jié)預(yù)檢請求OPTIONS一定要放行。瀏覽器在跨域 POST 請求前會自動發(fā)送一個 OPTIONS 預(yù)檢請求如果你的攔截器把它攔下來了前端會報 CORS 錯誤而且這個錯誤在瀏覽器控制臺看起來像是后端 CORS 配置有問題實際上卻是攔截器沒放行 OPTIONS。攔截器只是一個粗粒度的路由守衛(wèi)對于不同接口的細(xì)粒度權(quán)限比如只有管理員能調(diào)用的接口可以在 Controller 方法上加自定義注解再在攔截器里讀取注解做二次判斷這個屬于權(quán)限系統(tǒng)的進(jìn)階內(nèi)容本次項目不做展開。4.3 用戶管理模塊的 CRUD 與分頁查詢用戶管理模塊雖然簡單但把前后端交互的典型模式都覆蓋了查詢列表、新增、編輯、刪除。我用 MyBatis Plus 的IService和BaseMapper框架代碼量比傳統(tǒng) MyBatis 少很多。Controller 層代碼示例RestController RequestMapping(/api/user) public class UserController { Autowired private UserService userService; GetMapping(/list) public ResultIPageUserVO list(RequestParam(defaultValue 1) Integer pageNum, RequestParam(defaultValue 10) Integer pageSize, String keyword) { PageUser page new Page(pageNum, pageSize); LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); if (StringUtils.hasText(keyword)) { wrapper.like(User::getUsername, keyword).or().like(User::getNickname, keyword); } wrapper.orderByDesc(User::getCreateTime); IPageUser userPage userService.page(page, wrapper); // 轉(zhuǎn) VO 返回不直接暴露實體 return Result.success(PageUtil.convert(userPage, UserVO.class)); } // 新增、編輯、刪除邏輯省略遵循同樣的模式 }細(xì)節(jié)問題來了新增用戶密碼需要加密存儲編輯用戶如果密碼為空說明不修改密碼。這些分情況討論的業(yè)務(wù)邏輯都放在 Service 層。Controller 里寫太多 if-else后面維護起來就想罵人。前端對應(yīng)這個接口的調(diào)用也是固定套路封裝在api/user.js模塊里import request from ../utils/request export function getUserList(data) { return request({ url: /user/list, method: get, params: data }) } export function addUser(data) { return request({ url: /user/add, method: post, data }) } // ...4.4 Axios 請求封裝的幾個關(guān)鍵決策點Axios 封裝的好壞直接決定整個前端項目請求代碼的整潔程度。我的做法是單獨建一個utils/request.js文件生成一個配置了基礎(chǔ) URL、超時時間和攔截器的 Axios 實例。核心代碼import axios from axios import { ElMessage } from element-plus import router from ../router const request axios.create({ baseURL: /api, timeout: 10000 }) // 請求攔截器自動附加 token request.interceptors.request.use( config { const token localStorage.getItem(token) if (token) { config.headers.Authorization token } return config }, error Promise.reject(error) ) // 響應(yīng)攔截器統(tǒng)一處理錯誤碼 request.interceptors.response.use( response { const res response.data // 如果后端返回了業(yè)務(wù)錯誤碼 if (res.code ! 200) { ElMessage.error(res.message || 請求失敗) if (res.code 401) { // token 過期跳轉(zhuǎn)登錄頁 localStorage.removeItem(token) router.push(/login) } return Promise.reject(new Error(res.message)) } return res.data }, error { ElMessage.error(error.message || 網(wǎng)絡(luò)錯誤) return Promise.reject(error) } ) export default request幾個決策點說一下。baseURL 設(shè)為/api配合 Vite 代理或 Nginx 反向代理前端代碼里就不用寫死后端地址環(huán)境切換時只需要改代理配置就行。響應(yīng)攔截器里把后端的code/message/data統(tǒng)一解開前端調(diào)用接口時直接拿到業(yè)務(wù)數(shù)據(jù)不需要每個調(diào)用處都寫.then(res res.data)。還有一個細(xì)節(jié)上的選擇token 存 localStorage 還是 sessionStorage。有人建議存 sessionStorage因為關(guān)閉瀏覽器就自動清掉安全一些但用戶希望刷新頁面后保持登錄狀態(tài)所以我用 localStorage。另外邏輯上要區(qū)分業(yè)務(wù)錯誤碼比如 500和 HTTP 狀態(tài)碼比如 404上述封裝里對這兩類錯誤都做了處理。5. 前端關(guān)鍵頁面與交互實現(xiàn)5.1 登錄頁的實現(xiàn)與表單校驗登錄頁是系統(tǒng)的“門面”雖然邏輯簡單但涉及的交互細(xì)節(jié)并不少。我用 Element Plus 的el-form組件實現(xiàn)配合它的表單校驗規(guī)則用戶名必填格式校驗長度 3-20 個字符。密碼必填長度 6-32 個字符。點擊登錄時先校驗表單通過后才發(fā)請求。登錄成功后跳轉(zhuǎn)到首頁并提示“歡迎回來xxx”。登錄頁有一個容易被忽視的用戶體驗問題請求失敗時表單要保留用戶輸入不能整個頁面刷新重置。Vue 的單頁應(yīng)用優(yōu)勢在這里體現(xiàn)得比較明顯。另外登錄按鈕在請求期間要處于 loading 狀態(tài)防止用戶重復(fù)提交。這些都是小細(xì)節(jié)但拿捏好才是專業(yè)的表現(xiàn)。關(guān)于“記住密碼”功能嚴(yán)謹(jǐn)?shù)拈_發(fā)不會把密碼存在前端通常只記住用戶名。這個項目我沒有做這個功能因為涉及敏感信息不做比做更安全。5.2 布局與路由守衛(wèi)后臺管理系統(tǒng)的典型布局是左側(cè)菜單欄 右側(cè)內(nèi)容區(qū)。我用 Element Plus 的el-container組件實現(xiàn)菜單數(shù)據(jù)直接寫死在路由配置里通過v-for循環(huán)渲染。路由配置的要點是嵌套路由const routes [ { path: /login, component: Login }, { path: /, component: Layout, redirect: /dashboard, children: [ { path: dashboard, name: Dashboard, component: Dashboard, meta: { title: 首頁, icon: HomeFilled } }, { path: user, name: User, component: UserManagement, meta: { title: 用戶管理, icon: User } } ] } ]路由守衛(wèi)是前端鑒權(quán)的另一道防線。在router.beforeEach里檢查是否登錄未登錄則重定向到登錄頁router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.path /login) { next() } else { if (!token) { next({ path: /login }) } else { next() } } })提醒一句前端路由守衛(wèi)只是提升用戶體驗的手段不是安全措施。真正校驗 token 的有效性還得靠后端的攔截器因為用戶可以直接改前端代碼繞過路由守衛(wèi)。一切前端校驗都是“防君子不防小人”。5.3 表格、分頁與表單的聯(lián)動模式用戶管理頁面的核心交互是搜索欄輸入條件 → 點擊查詢 → 表格展示數(shù)據(jù) → 點擊編輯彈出表單 → 保存后刷新列表。這是后臺管理系統(tǒng)最高頻的交互模式。頁面數(shù)據(jù)結(jié)構(gòu)大概是searchForm搜索條件的響應(yīng)式數(shù)據(jù)tableData當(dāng)前頁的數(shù)據(jù)列表pageInfo頁碼、每頁條數(shù)、總條數(shù)dialogVisible彈窗顯隱formModel表單數(shù)據(jù)formRules表單校驗規(guī)則交互邏輯是點擊搜索時把頁碼重置為 1然后調(diào)用列表接口把返回的數(shù)據(jù)和總條數(shù)賦值給響應(yīng)式變量。前端代碼里分頁組件和表格的狀態(tài)同步是需要注意的地方el-pagination v-model:current-pagepageInfo.pageNum v-model:page-sizepageInfo.pageSize :totalpageInfo.total layouttotal, prev, pager, next, sizes changeloadData /需要注意el-pagination在 Element Plus 3.x 里事件名已經(jīng)改成了change舊版是current-change和size-change兩個事件分別處理。如果團隊里有老手用新版時還寫舊事件表格點擊分頁沒反應(yīng)排查老半天最后發(fā)現(xiàn)是事件名不對。彈出表單的編輯功能有一個常見坑編輯用戶時打開彈窗要把當(dāng)前行的數(shù)據(jù)深拷貝到表單模型里避免直接修改表格數(shù)據(jù)源。如果不做深拷貝彈窗里改字段時表格數(shù)據(jù)也會跟著變因為引用的是同一個對象。用JSON.parse(JSON.stringify(...))做深拷貝最簡單或者用展開運算符新建對象。5.4 狀態(tài)管理與跨組件通信的方案選擇Vue 3 中狀態(tài)管理的選擇比 Vue 2 時代豐富多了。Pinia 是官方推薦方案用它替代 Vuex 寫起來舒服得多沒有 mutations、actions 那套冗余的流程store 里定義的 state 直接用actions 就是一個普通函數(shù)。這個項目用到 Pinia 的場景用戶登錄后存基本信息和 token。在登錄成功時調(diào)用userStore.setLoginInfo(...)然后在多個組件里通過userStore.username展示當(dāng)前登錄用戶。示例代碼import { defineStore } from pinia export const useUserStore defineStore(user, { state: () ({ token: localStorage.getItem(token) || , userId: null, username: , nickname: }), actions: { setLoginInfo(data) { this.token data.token this.userId data.userId this.username data.username this.nickname data.nickname localStorage.setItem(token, data.token) }, logout() { this.token this.userId null this.username this.nickname localStorage.removeItem(token) } } })在這個系統(tǒng)里用戶信息需要全局共享但很多業(yè)務(wù)組件之間的通信其實用 props 和 emit 就夠。過度引入全局狀態(tài)管理會讓代碼難追蹤——某個字段不知道被誰修改了找起來很費勁。我的原則是跨頁面、跨層級深組件才考慮 Pinia父子組件之間能用 props/emit 就用 props/emit。6. 前后端聯(lián)調(diào)與常見問題排查6.1 聯(lián)調(diào)前的接口約定與準(zhǔn)備前后端分離開發(fā)模式下聯(lián)調(diào)階段往往是問題集中爆發(fā)的時期。前端認(rèn)為接口該這么返回后端認(rèn)為前端該那么傳參經(jīng)常對不上。經(jīng)驗是先定接口文檔再動代碼哪怕是簡單的表格約定、字段類型、命名風(fēng)格、錯誤碼都提前對齊。接口文檔我用 YApi 或者 Apifox 維護簡單項目也可以在項目根目錄放一個 Markdown 格式的接口說明文檔。文檔要約定如下內(nèi)容請求方式GET/POST/PUT/DELETE請求路徑和參數(shù)路徑參數(shù)、查詢參數(shù)、請求體參數(shù)參數(shù)類型string/number/boolean/object/array返回格式code/message/data 的結(jié)構(gòu)鑒權(quán)方式token 放在哪里怎么傳錯誤碼語義200 成功、401 未授權(quán)、500 服務(wù)器錯誤、業(yè)務(wù)錯誤從 400 開始聯(lián)調(diào)前先用 Postman 把后端接口全部測一遍。實測下來后端寫接口時引入一個全局性的統(tǒng)一返回結(jié)構(gòu)ResultT聯(lián)調(diào)效率能提升不少。前端看到code/message/data就知道怎么處理省去了解析各種怪異結(jié)構(gòu)的時間。我在項目里定義了一個通用返回體Data public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(操作成功); result.setData(data); return result; } public static T ResultT error(Integer code, String message) { ResultT result new Result(); result.setCode(code); result.setMessage(message); return result; } }任何接口都返回Result包裝后的對象異常處理用全局RestControllerAdvice捕獲并統(tǒng)一轉(zhuǎn)成這個格式前端就永遠(yuǎn)只需要處理一種結(jié)構(gòu)代碼邏輯非常簡單。6.2 跨域問題的三種表現(xiàn)與對應(yīng)解法跨域是全棧聯(lián)調(diào)最常遇到的問題但它有不同層次的原因癥狀相同解法不同。第一種開發(fā)環(huán)境跨域。前端在http://localhost:3000后端在http://localhost:8080。瀏覽器攔截了跨域請求。通用的解法是后端加 CORS 配置讓后端允許前端來源訪問。Configuration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOrigins(http://localhost:3000) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }但更推薦用 Vite 代理解決前端配置代理后前端請求的地址看起來是同源的。代理方式更好是因為它把跨域問題的處理留在了構(gòu)建層后端不需要關(guān)心前端運行在哪個端口而且開發(fā)環(huán)境和生產(chǎn)環(huán)境的代理配置方式保持一致生產(chǎn)環(huán)境用 Nginx。第二種后端接口報 CORS 錯誤但后端沒有 CORS 配置。這種情況多半是瀏覽器請求直接打到了后端地址而請求方式是非簡單請求比如 PUT/DELETE或者帶了自定義請求頭比如 Authorization。這時候瀏覽器會先發(fā) OPTIONS 預(yù)檢請求如果后端攔截器沒放行 OPTIONS就會報 CORS 錯。解決辦法是攔截器放行 OPTIONS。第三種生產(chǎn)環(huán)境跨域。前端和后端部署在不同域名。這種情況下最穩(wěn)妥的做法是用 Nginx 做反向代理讓前后端在同一個域名下前端請求/api路徑時 Nginx 轉(zhuǎn)發(fā)給后端服務(wù)。6.3 開發(fā)過程中遇到的高頻報錯速查表下面整理一份聯(lián)調(diào)階段的常見報錯和解決建議都是實操中反復(fù)出現(xiàn)的問題報錯現(xiàn)象可能原因解決方法前端請求掛起很久后報 timeout后端服務(wù)未啟動或接口路徑不對檢查后端日志確認(rèn)服務(wù)啟動檢查請求的路徑和 Controller 映射是否一致404 Not FoundURL 路徑寫錯或 Controller 方法沒有映射核對前端 api 模塊中的 URL 和后端RequestMapping是否有出入401 Unauthorizedtoken 缺失或無效確認(rèn)登錄是否成功、token 是否在請求頭中被正確攜帶500 后端報 NullPointerException后端代碼對 null 值沒有處理看異常堆棧定位到具體行號檢查參數(shù)是否為空數(shù)據(jù)庫中文亂碼數(shù)據(jù)庫連接串沒有指定字符集或者表默認(rèn)字符集錯誤在 JDBC URL 后加characterEncodingutf8建表時指定DEFAULT CHARSETutf8mb4MySQL 連接失敗 Public Key Retrieval is not allowed連接串缺少 allowPublicKeyRetrieval 參數(shù)JDBC URL 中加入allowPublicKeyRetrievaltrue打包前端后訪問頁面空白路由模式或靜態(tài)資源路徑配置問題如果使用 history 模式Nginx 要配置 try_files 重寫規(guī)則跨域報 Access-Control-Allow-OriginCORS 配置不當(dāng)按照上文跨域問題的三種表現(xiàn)依次排查6.4 前后端聯(lián)調(diào)中的時間同步與數(shù)據(jù)格式問題還有一種不報錯但結(jié)果不對的坑最典型的是時間字段。后端 LocalDateTime 序列化后得到的是2024-05-20T10:30:00而前端希望顯示的是2024-05-20 10:30:00。我見過不少項目因為時間格式對不上前端硬生生寫了個字符串替換函數(shù)來轉(zhuǎn)格式相當(dāng)丑陋。正確做法是在后端做好全局配置讓所有時間字段統(tǒng)一輸出為固定格式前端直接拿到標(biāo)準(zhǔn)字符串后展示或傳給后端。JSON 序列化這里再提一次在application.yml里加 Jackson 的時間格式配置代碼里不需要再給每個LocalDateTime字段加JsonFormat注解。不過要注意的是如果分頁返回的數(shù)據(jù)里包含時間排序序列化后的字符串格式影響不大只要保證比較的邏輯放在數(shù)據(jù)庫層面做就行。另一個常見問題是前端傳日期字符串給后端時后端用DateTimeFormat注解或全局配置 Jackson 的LocalDateTime反序列化格式來接收。我遇到過前端傳2024-05-20 10:30:00后端接收后解析失敗報 400 錯誤。這是因為 Fastjson 和 Jackson 對 LocalDateTime 支持有差異解決方式是統(tǒng)一用 Jackson并在全局配置里聲明日期格式。7. 項目打包與生產(chǎn)環(huán)境部署7.1 前端構(gòu)建與單頁應(yīng)用路由配置生產(chǎn)部署的第一步是前端構(gòu)建。執(zhí)行npm run buildVite 會生成dist目錄里面是壓縮后的靜態(tài)資源文件。這里要特別關(guān)注兩個點。第一構(gòu)建產(chǎn)物的路徑問題。如果你把前端部署在域名根路徑/下那baseURL保持/api沒問題但如果部署在子路徑比如https://example.com/admin下Vite 構(gòu)建時要在vite.config.js里配置base: /admin/否則靜態(tài)資源的引用路徑全部 404。第二前端路由的 history 模式需要服務(wù)端配合。Vue Router 的 history 模式URL 中不帶#刷新在子路由頁面比如/user時如果不配置服務(wù)端重寫規(guī)則Nginx 只會看文件系統(tǒng)里有沒有對應(yīng)的user目錄結(jié)果就是 404。Nginx 配置如下location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; }try_files的$uri先看請求路徑對應(yīng)的文件是否存在如果不存在就回退到/index.html由前端路由接管。7.2 后端打包與啟動腳本后端用 Maven 打包mvn clean package -DskipTests命令執(zhí)行完會在target目錄下生成fullstack-0.0.1-SNAPSHOT.jar。如果你用的是 Java 17 和 Spring Boot 3.x還有一個可執(zhí)行 jar 的特性Spring Boot 的 Maven 插件會自動配置 Main-Class你不需要額外配置直接java -jar就能運行。啟動命令java -jar fullstack-0.0.1-SNAPSHOT.jar --spring.profiles.activeprod生產(chǎn)環(huán)境的配置建議單獨建一個application-prod.yml里面配置生產(chǎn)環(huán)境用的數(shù)據(jù)庫地址、端口、日志級別等和開發(fā)環(huán)境區(qū)分開。日志輸出也建議配置到文件中不要只輸出到控制臺服務(wù)重啟后日志就丟了。一個典型的日志配置logging: level: com.example.fullstack: info file: name: logs/fullstack.log線上環(huán)境有個小建議用nohup啟動服務(wù)避免終端斷開時進(jìn)程被殺掉?;蛘吒?guī)范的寫法是注冊為 systemd 服務(wù)讓操作系統(tǒng)管理進(jìn)程生命周期開機自啟、崩潰重啟都能自動處理。7.3 Nginx 反向代理與服務(wù)部署細(xì)節(jié)Nginx 在這套系統(tǒng)中的角色是托管前端靜態(tài)文件 反向代理后端 API。完整配置參考如下server { listen 80; server_name your-domain.com; # 前端靜態(tài)資源 location / { root /var/www/frontend/dist; index index.html; try_files $uri $uri/ /index.html; } # 后端 API 反向代理 location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }這里有個細(xì)節(jié)location /api/加尾斜杠proxy_pass http://127.0.0.1:8080;不帶尾斜杠那 請求/api/user/list會轉(zhuǎn)發(fā)到http://127.0.0.1:8080/api/user/list路徑和原來保持一致。如果把proxy_pass寫成http://127.0.0.1:8080/請求會被轉(zhuǎn)發(fā)到http://127.0.0.1:8080/user/list/api前綴會被吞掉。這個細(xì)節(jié)容易踩坑務(wù)必確認(rèn)后端 Controller 的映射上有/api前綴否則會報 404。HTTPS 配置線上環(huán)境一般用 Certbot 自動申請證書并配置到 Nginx這里先不展開但強調(diào)一句生產(chǎn)環(huán)境不要裸奔 HTTP涉及登錄和 token 的接口不上 HTTPS 相當(dāng)于把門鎖掛在門外面。7.4 數(shù)據(jù)庫初始化與遷移策略生產(chǎn)環(huán)境數(shù)據(jù)庫初始化不能靠手動一條條執(zhí)行 SQL。我用 Flyway 做數(shù)據(jù)庫版本管理每次 SQL 變更寫一個帶版本號的文件放到resources/db/migration目錄應(yīng)用啟動時會自動執(zhí)行未執(zhí)行過的腳本。打比方說明一下Flyway 就像數(shù)據(jù)庫的 Git每次變更都是一個 commit版本號遞增它會在數(shù)據(jù)庫中建一張flyway_schema_history表來記錄已經(jīng)執(zhí)行過的版本下次啟動時自動跳過已執(zhí)行的只執(zhí)行新增的遷移腳本。示例遷移文件-- V1__create_user_table.sql CREATE TABLE sys_user ( id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 用戶名, password varchar(100) NOT NULL COMMENT 加密后的密碼, nickname varchar(50) DEFAULT NULL COMMENT 昵稱, email varchar(100) DEFAULT NULL COMMENT 郵箱, status tinyint(4) DEFAULT 1 COMMENT 狀態(tài)1啟用 0禁用, create_time datetime DEFAULT NULL, update_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1 DEFAULT CHARSETutf8mb4;使用 Flyway 有兩點要非常謹(jǐn)慎已經(jīng)提交給團隊的遷移腳本不要修改哪怕里面 SQL 寫錯了也要靠新的遷移腳本來修正否則團隊的數(shù)據(jù)庫版本就對不上了。另外生產(chǎn)庫不要輕易執(zhí)行flyway clean它會重建整個數(shù)據(jù)庫操作前就算寫滿警告也不為過。8. 常用工具與效率提升清單8.1 接口調(diào)試工具的選擇聯(lián)調(diào)階段接口測試工具的作用很大。Postman 是最經(jīng)典的選擇優(yōu)勢是功能齊全、支持 Collection 管理、環(huán)境變量設(shè)置。Apifox 是國內(nèi)團隊常用的方案優(yōu)勢是集成了接口文檔管理、Mock 數(shù)據(jù)、自動化測試。如果項目中后端還沒有完全開發(fā)完Apifox 可以直接在接口文檔上生成 Mock 數(shù)據(jù)給前端先行開發(fā)這種前后端并行開發(fā)的模式能省不少時間。實際使用建議如果你是一個人做全棧直接用 IDEA 的 HTTP Client 就行不需要額外裝軟件。IDEA 里新建.http文件寫請求可以配合{{var}}使用環(huán)境變量還可以在后端代碼左側(cè)直接 Run 生成對應(yīng)的測試請求效率很高。8.2 數(shù)據(jù)庫連接與查詢工具數(shù)據(jù)庫客戶端方面Navicat 和 DataGrip 都常用。Navicat 功能全面、界面友好DataGrip 更適合寫復(fù)雜 SQL它提供的智能提示和格式化功能非常好用。個人項目簡單查詢用 VS Code 的 MySQL 插件也可以湊合。我的建議是對于持久層查詢用 MyBatis Plus 的LambdaQueryWrapper寫條件查詢已經(jīng)非常直觀大多數(shù)場景不需要打開數(shù)據(jù)庫客戶端。只有在排查數(shù)據(jù)問題時才需要連數(shù)據(jù)庫。遇到數(shù)據(jù)庫連接不上的情況先檢查服務(wù)是否啟動、端口是否被占用、認(rèn)證插件版本是否匹配這三個點大多數(shù)問題都能解決。8.3 聯(lián)調(diào)排查常用的瀏覽器開發(fā)者工具前端調(diào)試離不開瀏覽器開發(fā)者工具。Network 面板能看到每個請求的狀態(tài)碼、耗時、請求頭和響應(yīng)體Console 面板直接報錯信息Vue 專門有 Vue DevTools 插件可以查看組件樹、Pinia 狀態(tài)和路由信息。排查問題建議按照這個順序來看先在 Network 里確認(rèn)請求發(fā)出去了沒有、狀態(tài)碼是多少再看請求頭里的 Content-Type 和 Authorization 對不對然后看響應(yīng)體里的具體數(shù)據(jù)最后結(jié)合 Console 的報錯信息定位問題。有的開發(fā)者一上來就在代碼里打斷點其實大多數(shù)聯(lián)調(diào)問題在網(wǎng)絡(luò)請求這一層就能定位。8.4 代碼生成器的合理使用到了項目后期增刪改查的代碼寫多了會產(chǎn)生明顯的機械重復(fù)感。手動復(fù)制粘貼再改字段名容易出錯我保留了一條規(guī)則多表關(guān)聯(lián)、復(fù)雜業(yè)務(wù)邏輯的代碼必須手寫但單表 CRUD 的代碼交給生成器生成生成完再人工審查和微調(diào)。MyBatis Plus 官方提供了一個代碼生成器mybatis-plus-generator可以根據(jù)數(shù)據(jù)庫表自動生成 Entity、Mapper、Service、Controller 代碼。用它的時機設(shè)置在項目初始化階段把表結(jié)構(gòu)設(shè)計好一鍵生成基礎(chǔ)代碼后面再在 Service 中補充業(yè)務(wù)邏輯。這能省去大量重復(fù)勞動但你一定要會改生成的代碼不然會陷入“低級錯誤看不出來”的局面。9. 項目擴展方向與進(jìn)階建議9.1 從單體應(yīng)用到模塊化演進(jìn)當(dāng)前項目的結(jié)構(gòu)是單體應(yīng)用這個結(jié)構(gòu)適合大多數(shù)中小型項目。隨著業(yè)務(wù)量增長你可以按模塊拆分比如用戶模塊、訂單模塊、商品模塊每個模塊獨立成一個 Maven 模塊甚至獨立成一個 Spring Boot 服務(wù)。拆分的關(guān)鍵依據(jù)是團隊規(guī)模和部署復(fù)雜度不要因為趨勢而盲目拆分。如果項目超過 10 個接口、3 個以上開發(fā)人員合理的模塊化拆分能明顯減少合并沖突和協(xié)作成本。反過來如果就是一個人的項目拆成微服務(wù)純屬自找麻煩。9.2 引入 Redis 緩存與接口性能優(yōu)化項目中如果有熱點數(shù)據(jù)比如用戶信息、系統(tǒng)配置可以引入 Redis 做緩存層。實現(xiàn)方式是在原有的 Service 邏輯包一層先查緩存緩存未命中再查數(shù)據(jù)庫同時把結(jié)果寫入緩存并設(shè)置過期時間。用 Redis 的StringRedisTemplate就夠不需要引入復(fù)雜的緩存框架。這個實踐我建議放到項目穩(wěn)定之后再做第二個版本迭代。先保證功能正確再考慮性能。接口響應(yīng)時間慢先看是不是數(shù)據(jù)庫查詢的問題有沒有索引、有沒有 N1 查詢再決定要不要加緩存。過早引入緩存會讓 bug 排查多一層維度代價不小。9.3 安全加固與權(quán)限模型的進(jìn)階方向做全棧項目時很多人忽略了權(quán)限設(shè)計。目前項目只有“登錄/未登錄”兩層。如果你的系統(tǒng)需要不同角色管理員、普通用戶、訪客可以引入 RBAC 權(quán)限模型用戶-角色-權(quán)限三層結(jié)構(gòu)。表設(shè)計上新建sys_role、sys_menu、sys_user_role、sys_role_menu四張表后端在攔截器或注解層面校驗是否有指定權(quán)限。前端對應(yīng)地可以做動態(tài)路由用戶登錄后根據(jù)后端返回的權(quán)限列表動態(tài)生成可訪問的路由配置。這個是很多全棧項目的進(jìn)階難點會接觸到更深的前后端正交互。建議把當(dāng)前項目跑通后再往這個方向升級每一步都是新的技術(shù)內(nèi)容。9.4 前端工程化的進(jìn)一步打磨前端部分可以繼續(xù)打磨的點很多代碼規(guī)范ESLint Prettier、提交規(guī)范Commitlint husky、單元測試Vitest、自動化部署GitHub Actions。這些屬于前端工程化范疇。舉一個很實用的例子在項目里加 ESLint 和 Prettier 配置團隊協(xié)作時代碼風(fēng)格統(tǒng)一少了無謂的爭吵。不建議一開始就上全量工程化配置先把項目跑通再逐步加上這些工具學(xué)習(xí)曲線更平滑。10. 完整的實操流程對照表下表整理了這個項目從零到上線的完整操作清單按順序執(zhí)行每完成一步打一個勾階段關(guān)鍵操作產(chǎn)出物耗時預(yù)估環(huán)境準(zhǔn)備JDK 17、Maven、Node.js 20、MySQL 8開發(fā)環(huán)境跑通0.5 天數(shù)據(jù)庫設(shè)計創(chuàng)建數(shù)據(jù)庫和表、初始化測試數(shù)據(jù)SQL 腳本0.5 天后端骨架創(chuàng)建 Spring Boot 項目、MyBatis Plus 配置可啟動空項目0.5 天后端核心接口登錄、CRUD、攔截器、全局異常處理可測試的 REST API2-3 天前端骨架Vite 創(chuàng)建項目、配置路由、Pinia、Axios可運行前端基礎(chǔ)工程1 天前端頁面開發(fā)登錄頁、布局頁、用戶管理頁可交互的完整頁面2-3 天前后端聯(lián)調(diào)測試登錄流程、CRUD 流程、異常流程完整的業(yè)務(wù)閉環(huán)1 天打包部署前端 build、后端 jar、Nginx 配置生產(chǎn)環(huán)境可訪問系統(tǒng)1 天上線檢查安全、日志、備份、監(jiān)控穩(wěn)定運行的系統(tǒng)0.5 天這是一個典型的個人全棧項目的工期預(yù)估。如果你是第一次做時間會翻倍正常現(xiàn)象。如果遇到卡殼超過半天的問題建議跳過去先把主流程跑通再回頭看卡住的部分。我個人的經(jīng)驗是全棧開發(fā)能力的提升不是線性的而是靠一個個完整的項目串起來的。這個項目雖然從技術(shù)角度看每個環(huán)節(jié)都是“常用技術(shù)”但當(dāng)它們組合在一起形成完整閉環(huán)時你對前端和后端協(xié)作模式的理解會上一個臺階。當(dāng)你遇到任何業(yè)務(wù)需求時腦子里能浮現(xiàn)出完整的請求鏈路和數(shù)據(jù)流轉(zhuǎn)圖而不是只盯著自己熟悉的那一層這就算真正入門了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
深爱激情久久| 国内外色色色色色成人视频| 色综合天堂| 天天插天天爽| 青青日韩| 综合色图婷婷| 午夜天堂一区人妻| 开心激情网在线| 99热日本| 丁香六月婷月91婷月| 久久五月丁香综合| 超碰婷婷色| 亚欧州精品视频| 一區四區歐美日韓| 色情·com| 一本狠婷婷综合| 99热在线观看免费精品| 婷婷午夜| 婷婷伊人綜合中文字幕| 久久婷婷婷| 六月丁香综合网| 色色五月天激情| 九九九九中文字幕| 任你爽在线视频| 四色99久久| 26uuu日韩| 99亚洲大片精品永久在线观看| 丁香六月狠狠干| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品 | 狠狠人妻色综合| 99热国品| 办公室少妇激情呻吟A片在线观看| 激情五月天综合| 激情综合五月激情| 久久aaa| 五月天狠狠网站| 久操人| 九九丁香社区欧美激情| 丁香六月婷婷缴情欧美| 色情网综合| 中文字幕在线免费看线人| 九九色热| 中字幕视频在线永久在线观看免费| 丁香婷婷五月综合色情| 狠狠做深爱婷婷久久综合一区| 五月婷婷丁香五月婷婷丁香| AV在线免费网站| 天天日天天干天天操| 婷婷深爱五月丁香网| 99色这里| 五月婷婷免费视频| 激情婷婷色五月| 狠狠干综合网| 婷婷黄色| 九九热视频在线观看| 久久综合婷婷| 欧美精品中文字幕亚洲专区| 色婷婷91激情小说| 99热销国产这里有精品| 99精品自拍| 超碰在线人妻| 国产淫熟妇| 任你弄在线视频免费| 五月天婷婷基地| av九九| 啊V视频在线观看| 色热久| 色综合激情| www99热| 99热国产这里只有精品| 五月丁香婷婷欧美色图视频五月丁香777电影| XX色综合| 99精品网| 精品热九九| 久久婷婷大香蕉| 大香蕉娱乐| 操人久久| 丁香五月综合在线播放 | 一区二区三区XXXXXX| 九九热99精品| 99久久a线观| 久久人妻情侣| 欧洲不卡视频| av一区免费看| 激情六月五月婷婷综合网| 79色色免费| 五月天啪啪啪| 午夜天天精品视频| 伊人干综合| 天堂五月婷婷| 色色五月天丁香| 99热这里只有精品99| 综合色、色综合| 4399高清无码视频| 色插人人| 婷婷五月成年人| 久久这里99| 丁香五月综合在线视频| 亚洲中文字幕av| 草榴视频黄色网| 久久伊人9| 丁香香五月激情免费视频| 激情五月天色婷婷综合| 亚洲无码99| 婷婷色一二三区波多野结衣| 五月色婷婷综合丁香精品无遮挡| www.色婷婷.com| 亚洲亚洲人成综合网络| 婷婷天堂综合| 99色干| 91九色超碰| 超碰人人艹| 操你av| 久热大香蕉| 日本综合九九| 开心四月婷婷在线色播播| 丁香六月激情综合| 国产在线视频1234| 婷婷五月天日本无码| 五月婷婷六月丁香在线| 久久婷丁香五月| 这里只有精品视频一区| 秋霞AV吧| 99性感视频| 国产精品成人在线| 99操中文视频| av久热| 色色丁香婷婷五月天| 亚洲成人网站在线观看| 120分钟婬片免费看| 五月天色欧美| 骚。com| 免费无码毛片一区二区A片| 91久久综合亚洲噜噜成人在线| anquye五月| 五月丁香综合| wwxx日本| 天天干在线播放| 五月丁香六月欧美综合| 丰满少妇猛烈A片免费看观看| 久久婷婷啪啪视频| 婷婷基地爱| 丁香五月婷婷综合精品素人| 五月 成人 婷婷| 激情婷婷22月间| 亚州AV超碰人人操| 密视AV综合在线| 女力报到正好爱上你| 免费无码毛片一区二区A片| 中文字幕AV在线| 色99在线| 综合婷婷久久| 五月激情综合网| 九九热a| 亚洲中文乱字字幕在线永久| www.狠狠操.co m| 成人片在线播放| 996er在线观看| 99热色精品| 99久久精彩视频。| 51精品国自产在线| 丁香六月婷婷综合欧美| 99热青青草| 婷婷99热| 精品一区二区三区四区五区六区介绍 | 激情五月丁香婷婷夜夜操| 丁香九月综合| 中文字幕丁香五月| 激情五月天色色色| 99热这里只有精品3| 丁香五月婷婷黑人妻黄色电影院| 99色热| 婷婷五月综合欧美在线播放| 99ri精品在线观看| 亚洲不卡欧洲| 九九视频网| 免费观看的av| 九九色热| 99热6这里只有精品6| 思思久久99热只有频精品66| 色婷婷国产精品综合在线观看| 久久9精品视频| 丁香六月狠狠干| site:wpjngj.com| 亚洲无码影片| 日本色婷婷| 只有精品视频在线观看| 北条麻妃伊人| 婷婷金品综合视频| 夜夜撸天天操| 亚洲看av的网站| 99情色五月天| 性一交一乱一交A片久久四色| 国产va在线视频| 九九久久偷拍| 亚洲五月天婷婷| 99er视频在线| 人妻系列久久久久久久久久久| 操操操B| 99热这里| 深爱激情六月| www.国产亚洲69ty.久久久久久久久久久久| 91九九九九| 激情综合啪啪| 欧美日韩国产一二区| 夜夜久久综合网| wuyuedingxiang99| 亚洲、欧美、国产另类笫二区| 色婷婷丁香五月| 这里精品| 婷婷色成人| 亚洲五月天色| 婷婷免费无马| 日本久热| 六月丁香综合| av人人操| 天天碰天天插天天操| 熟女激情网| 9999热在线| 99热精品无码| 4399亚洲视频| 日本色视| 狠狠色噜噜色狠狠狠综合久久成人波 | 狠狠操狠狠操AV| 六月伊人婷婷| 婷婷五月丁香高清无码| 久久五月天激情美女| 99人人看| 极品五月天| 成人看片网站| 欧洲色色| 午夜天堂一区人妻| 森林影视大全,最好看的2019年视频 | 中文字幕人妻熟女在线| 欧美激情综合色综合啪啪五月| www激情| 激情丁香五月激情婷婷| 婷婷六月中文字幕| 五月天激情日色在线| 成人 在线 日韩| 婷婷射图| 色玖玖导航| 影音先锋777xfplay色资源网站| 青草性爱视频| 99视频久久免费视频| 国产在线黄色| 啪啪综合网| 亚洲综合一区二区| 久久久久久9| 成人国产综合| 色婷婷四虎| 欧美大肥婆大肥BBBBB| 9久久婷婷国产综合精品性色| www激情com| 狠狠999| 五月婷婷视频啪啪美女| 成人色情五月天婷婷丁香| 亚洲五月天综合色| 丁香六月欧美| 999热这里只有美国精品| 99热日韩| 内射激情在线| 九九精品视频在线6| 天干干夜夜操| 严洲天天插| 互月天综合| 日本成人小说婷婷六月| 色五月中文网| 性爱AV天堂| 久久香蕉影院| 五月丁香天堂网婷婷| 丁香五月综合福利视频导航| 丁香五月激情无码视频| 99啪啪网| 男女啪啪做爰高潮无遮挡| 五月天婷婷综合网| 97人人操人人操人人操人人| 久久六月天| 91性高潮久久久久久久久| www.激情| 天天射天天射一道本日本社区| 婷婷五月偷拍| 五月婷婷影院| 五月丁香影院| 久久久久视剧HD| 婷婷五月色情| WWW色五月天| 激情五月天啪啪| 色婷婷五月天天天干天天操天天爽| www.亚洲激情| 久久婷婷热| 26UUU精品一区二区| 国产激情综合| 人人97操| 日本精品。999| 亚洲经典小视频| 少妇性按摩无码中文A片| 久久99网站| 99热自拍| 九九热免费| 色综合色五月| 嫩模草| 日韩AV在线免费观看| 玖玖视频福利| 激情伊人五月天| 99在线69| 色婷大香蕉| 欧美熟女99| 天天日人人爽| 九九这里只这里只有精品| 五月社区丁香| 淫视馆aV二区一区| 五月天久草| 香蕉久久国产AV一区二区| 97久久香草精品视频| www天天色天天射| 深爱五月婷婷| 色婷婷19| 亚洲热热视频| 久月久在线视频| 久久东京热婷婷五月| 日韩av干| 人妻久久久久久久| 国产三级片91| 五月激情婷婷在线| 婷婷的五月天另类视频| 色必久悠悠影院| 九九精品热播| AV在线收看| 高清激情av在线观看| 99热免费| 亚洲黄色av网站| 成人色情五月天婷婷丁香| 99只有精品| 久久婷婷超碰| 婷婷永久在线| 风流少妇A片一区二区蜜桃| 九九99九九99偷拍视频免费看| 五月丁香啪啪啪啪| 色婷婷成人做爰A片免费看网站| 亚洲色图45p| 极品九九九九九九| 婷婷六月久久综合导航| 伊人九九68| 婷婷五月亚洲激情| 激情网五月| 丁香婷婷色| 天天狠狠干| 2025超碰| 激情网婷婷婷| 九月婷婷综合在线| 丁香六月成人| 国内久久久精品99| 婷婷五月精品中文字幕| 九月激情综合| www九九热| 五月激情六月综合| 五月色婷婷亚洲 | 五月婷婷基地| 久久精品噜噜噜成人A∨色欲| 五月综合婷婷久久在线| 99久久人人| 日本成人小说婷婷六月| 九九九AAA热视频| 婷婷久久五月天中文字幕在线观看| 激情影院免费视频婷婷五月天| 五月开心网| 91久久久久久| 国产美女无遮挡裸体毛片A片| www.99热国产| 婷婷五月天久草在线| 天天干夜夜欢| 一区三区视频有限公司| 五月天综合久久| 婷婷色情网| 亚洲综合网 665566| 色九月| 久九色| 亚洲操b| 色五月xxx| AA丁香综合激情| 五月天婷婷在线啪啪视频| 九月丁香婷婷| 操操操AV| 99re热在线视频| 亚洲五月婷婷| 五月婷婷婷自由综合| 五月丁香A片| 综合成人小说婷婷| 久久久精品视频79| 日韩AV在线影片| 九九热精品6| 九色地址91视频| 九九99精品视频| 青青热视频| 成 人片 黄 色 大 片| 五月天激情.com| 五月丁香人妻| 北京熟妇搡BBBB搡BBBB| 五月天婷婷影院影院观看| 婷婷五月激情的图片| 色欲婷婷五月天| 99re思思在线视频| 七七色色综合| 深情五月天| 久久9久久| 久久性爱视频| 色婷婷色99国产综合精品| 91色久| 乱乱av| 亚洲无码99| 色狠狠激情五月| 亚洲黄网在线| 可以免费观看的AV| 日本狠狠干| 激情五月综合免费| 久久久精品AV| 国产人人操| 色色色色色色网站| 五月丁香五月综合欧美| 五月丁香六月婷婷色| 婷婷综合在线播放| 久久综合站| 日日干天天爽| 综合视频久久| 久久婷婷综合五月天| 丁香五月天激情网址| 激情五月天福利| 六月婷婷激情| 久99久在线| 久久在线人妻| 色六月丁香婷婷狠狠干| 色五月婷婷中文字幕| 26uuu精品一区二区| 天天色天天爱天天舔| 99丁香五月婷| 丁香五月综合久久| 色综合网页| 国产成人精品一区二三区熟女在线| 激情丁香五月婷婷| 久机视频这只有精品| 狠狠色性| 思思99精品视频在线观看| 色婷婷AV在线| 亚洲一级AV在线免费播放| 亚洲欧洲中文日韩久久AV乱码| 超碰人人操在线| 这里只有精品免费视频| 色色五月婷婷丁香| 日韩欧美骚货| 九九婷婷五月天影视| 日本va欧美va欧美va精品| sewuyuetingtingiii| 日韩欧美成人一区二区三区| 2025超碰| 操操综合网婷婷| 婷婷深爱五月丁香网| 亚洲综合在线伊人婷| 九九九九大香蕉| 五月丁香久久婷| 色涩视频久久| 久9热插入| 婷婷丁香18| 日本欧美成人片AAAA| 大香蕉av在线| 欧美丰满熟妇BBB久久久| 五月丁香六月婷综合成人综合| 91色婷婷综合久久中文字幕二区| 国产 亚洲 在线| 99日本黄站| 婷综合| av在线观看免费| 欧美久久婷婷| 丁香婷婷大香蕉| 人妻少妇色综合| www色色com| 91中文在线| 丁香五月婷久久| www.激情| 色婷婷丁香女女| 日日夜夜九九| 久久久久久久8| 色天使色婷婷| 狠狠色丁香久久久婷| 五月丁香婷婷无码中文| 五月丁小婷婷激情四射| 1024欧美日韩精品久久久| 久久sp免费视频| 99热综合色图| 在线观看五月婷婷网| 丁香五月天信号| 黄涩毛片| 丁香六月激情| 97在线精品| 国产在线激情视频| 69综合在线| 色婷婷色99国产综合精品| 婷婷激情小说网| 五月丁香综合啪啪対白| 五月丁香啪啪| 五月婷婷六月天| 2018夜夜草| 丁香五月天.com| www,8050,午夜三级| 青草视频在线蜜臀| 久久婷婷五月综合啪| 夜夜干夜夜操| 超碰五月婷婷五月天| 综合久久高清| 欧美日本一区二区三区| AV在线免费播放| 精品国产乱码久久久久夜深人妻 | 国产操逼视频网站| 8区视频在线| 五月天亚洲最大成人| 色99热| 国产激情久久久| 六月丁花香啪啪激情欧美| 新激情综合| 深情六月婷婷综合久久| 天天爱综合网| 大色鬼综合| 亚洲性爱电影| 五月婷婷啪啪啪啪| 99热免费| 自拍偷窥99热| 五月丁香五月综合欧美| 天天色综网| 97色久| 99小视频网站| 成人视频网| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 欧美色综合天天久久综合精品| 五月综合丁| 情欲综合网| 激情综合网五月| H亚洲| 久久久久久xxxxx| 色婷婷色情| 成人狠狠成人狠狠成人狠狠成人狠狠| 91日本在线观看| 97碰 在线视频观看| 99综合视频在线| 九九无码| 亚洲色五月婷婷| 99精品在| 八戒青柠影视剧在线观看| 久99久在线观看| 人人妻久久妻| 五月刺激丁香月综合| 婷婷四月 成人 狠狠干| 亚洲操b| 日本色色网站| 天天澡天天狠天天天做| 大香人妻| 天天摸色吧天天摸色吧| 丁香五月影| 久久久久综合激动五月天| 欧美日朝成人| 色综合com| 91久久九久久九久久九久久九久久| 五月丁香激情综合网官网| 国产日日夜夜操| 五月婷色| 这里只有精品99视频| 五月丁香啪| 色哟哟精品| 婷久久| 五月丁香网站| 亚洲色激情| 亚洲丁香五月天视频| 另类图片五月天激情| 五月综合色播播丁香婷婷| 狠狠婷婷色| 中出内射的人妻视频| 亚洲欧洲另类图片| 69色色视频| 久久电影五月天丁香电影| 欧美激情2025| 9 9热这里有精品| 丁香六月在线| 久热超碰91| 色五月激情| 超碰人人艹| 婷婷五月天福利| 26UUU成人网| 欧美性生交A片免费看| WWW、日本色丁香、co m| 少妇水多A片太爽了| 婷婷狠狠五月综合| 亚洲色区17| 婷婷丁香六月天| w婷婷五月婷婷w| 淫视馆aV二区一区| 深爱丁香激情| 亚洲无码你懂的| 99热主页日本| 五月天亚洲最大成人| 久久机热思思热| www.久久9| 丁香激情网| 思思热思在线精品视频| 影音先锋男人AV资源站| 激情综合色婷婷啪啪六月天| 狠狠艹狠狠艹| 4399精品一区二区| 色九月婷婷| 九月婷婷丁香| 91九色无码日韩| 色色色欧美| 日日夜夜小色哥| 人人插9| AV九九| 日韩无码色色| 亚洲色色在线| 五月婷婷六月丁香玖玖玫瑰91| 三级黄网站| 国产精品国产VA片国产| 六月丁香av| 中文字幕网伦射乱中文| 日本三级中国三级99| 五月天六月天| 五月婷婷久久大香蕉| 免费看欧美成人A片无码| 国产午夜精品久久久观看| 中文字幕av在线| 色婷婷很很丝袜| 91丨九色丨白浆秘| 婷婷丁香激情五月天色色| 91久久婷婷| 97色伦另类图片小说视频| 色玖玖玖| 国产特黄色精品一区二区三区精品无广告| 97综合在线| 女人天堂 AV| 人人爽在线视频综合网| 百度4399有码精品V在线观看| 久久亚洲婷婷| 91玖玖| 久狠日av| 五月丁香综合久久| 九九九这里只有精品| 91碰碰碰久久久久| 成人精品视频99在线观看免费| 综合网啪| 欧美婷婷五月丁香| 开心五月激情五月丁香五月婷婷| site:hcxsz888.com| 2013AV天堂| 五月天婷婷色播综合在线| 99热这里只有精品中文字幕| 亚洲情色一区| 丁香五月天激情综合| 欧美日本一区二区三区| 五月香蕉婷婷| 成人久久天天x资源站| 丁香五月91| 国内久久久精品99| 久久青青日本视频| 七七色综合| 99久久九九视频| 99在线精品视频| 九九视频在线观看| 欧美精品99久久久| 色婷婷99| 啪啪啪大香蕉| 五月丁香亚洲综合| 中文字幕永久在线| 五月天大香蕉| 亚洲欧洲另类| av狠狠操| 五月天婷婷激情| 婷婷操逼| 最近免费中文字幕大全高清大全1| 婷婷六月综合激情| 婷婷五月天激情小说| 99久久性爱| 思思热视频在线观看| 99久视频| 这里只有精品视频免费在线观看| 色综合激情| 丁香五月婷婷影院| 99热91| 青青草国产亚洲精品久久| 99热| 色婷婷色综合久久精品V| 国产精品91抖高| 色婷婷av综合网| 婷婷五月在线| www.婷婷五月天.com| 9久久网| 99激情视频| www超碰| 乱岳熟女50岁| 大香久久综合网| 久久婷婷五月激情综合| 九九自拍网| 激情综合五月| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 伊人婷婷大香蕉| 九月激情网| 大香蕉手机视频| 人人色人人弄人人操| 久久综合55| 狠狠爱五月婷婷| 国产婷婷色五月| 狠狠色狠狠鲁| 五月激情婷婷丁香| 六月激情婷婷| 亚洲熟妇AV乱码在线观看| 99久久欧美| 干一干xxxx| 中海油常州环保涂料有限公司| 狠狠擼综合| 99乱视频| 人妻人人操| 色婷婷影视99| 丁香六月婷婷久久综合| 五月综合婷婷久久在线| 婷婷色五月激情强奸四射| 婷婷天堂站| 七七色综合| 成人丁香五月| 丁香婷婷六月在线资源观看| PORNY九色9l自拍视频成人| 亚洲日韩一页精品发布| 99热99| 天天舔夜夜操www com| 亚洲AV色婷婷人禽五月天| 婷婷激情综合网| 日本三级99人妇网站| 欧美激情综合色综合啪啪五月| 99热视| 操日视频| 色色色九九九五月婷婷| 91丨九色丨东北熟女| 五月丁香六月婷婷的女人| 国产成人网址| 怡红院91a√| 五月丁香 久久久| 丁香五月综合激情性爱| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 综合综合网| 丁香六月情| 91oumei| 我要色综合五月婷婷| 亚洲激情综| 色爱爱综合网| 狠狠色婷婷丁香六月| 亚洲第一成人无码A片| 久草九一| 色婷丨日丨天丨综合久久| 久久网日本| 日本在线视频看se99| 色五月aV| 天天爽夜爽| 啪啪黄页网| 99久久激情视频| 日本一级淫| 亚洲激情丁香五月天色| 大香蕉婷婷色| 九九热在线99| 六月丁香激情| 97久操| 五月婷婷之美女图片| 99精品成人无码A片观看金桔| 婷婷亚洲影院| 五月婷精品| 久久大香蕉视频| 成人丁香五月天| 久综合4| 99re这里有精品手机在线| 香蕉久久国产AV一区二区| 激情丁香婷婷| 色婷婷婷婷| 国产精品色婷婷99久久精品| 在线观看亚洲AV| 久久婷婷五月激情综合| 午夜色丁香| 亚洲成人av在线观看| 天天干天天射综合网| 91久久精品国产91性色TV| 一區四區歐美日韓| 图片区 小说区 区 亚洲五月| 婷婷,五月天,丁香,第一| 天天天天天天操| AV伊人青草丁香六月| 色五月在线播放| 最新日本A片| 色婷婷综合网| 六月丁香深深爱| 午夜不卡久久精品无码免费| 色色色色色色色色色999| 激情小说色五月| 情涩婷婷五月天| 99热黄| 精品人妻一区二区| 亚洲一级色电影| 99色视频在线| 综合色天天| 五月停停大香蕉| 激情综合网五月激情网| 影音先锋91| 99操99| 五月丁香婷婷无码A∨| 9国产在线视频| 99久久大片| 一区三区视频有限公司| 日本三级韩三级99久久| 婷婷丁香五月天色播网站| 无码日本精品XXXXXXXXX | 嫩草AV久久伊人妇女超级a| 九热视频免费观看| 婷婷无码视频| 亚洲综合网激情五月天| 97成人在线视频| 在线观看免费狠狠色丁香香综合| 色亚洲无码| 成人超碰网| 亚洲国产99| www久| 人妻第九页| 99性爱| 丁香六月 婷婷六月| 精品热青草| 激情九月综合| 婷婷五月天com| 免费看成人747474九号视频在线观看| 激情小说在线视频| 这里只有免费精品| 中文字幕在线观看视频www| 精品夜夜澡人妻无码AV| 丁香五月婷婷影院| www.五月天婷婷.com| 欧美三级韩国三级日本三斤| 色情丁香五月婷婷精品| 五月色丁香婷婷中文字幕| 七七色色综合| 国产亚洲精品久久久久苍井松| 五月丁香六月婷婷激情视频在线观看免费| 日韩成人精品中文字幕| 99久久婷婷国产综合亚洲| 99热网站| 终合激情网| 人人爱干人人爱草| 五月婷免费视频| 99精品国产在热久久| 综合XX网| 国产精品国产VA片国产| 婷婷视频网| 色婷婷成人久久| 婷婷色综合| 97五月久久丁香婷婷| 26uuu91| 婷婷综合在线| 日本视频欧美观看免费| 综合色五月亭亭| 五月天婷婷激情在线色图| 婷婷综合精品视频97| Av性爱网站| 噜噜噜狠狠色综| 婷婷丁香五月天操逼| 亚洲精品一区中文字幕乱码| 超碰在线免费| 岛国av网站| 久色网五月| 天天日综合网射| 亚洲成人AV在线播放| 99热欲| 一级AV片| 婷婷区日本| 婷婷色丁香五月| 五月天婷婷激情在线色图| 九九婷婷激情综合网| 久久怡红院| 久久丁香五月天| 超碰在线观看9| 久久99热在线观看| 婷婷丁香五月高清| 激情婷婷丁香色五月| 五月停停直播| 思思热久久阴99| 五月婷婷综合激情网| 国产午夜精品一区二区| 欧美色色色色色色色色| 狠狠爱丁香婷| www.com久久久久久久久久久久久久久久久| 丁香五月天之婷婷影院| 五月婷精品| 色情丁香五月婷婷精品| 99热日| 无码动漫av| 亚洲激情另类| 九九热免费视频| 噜噜狠狠色| 天天日天天干天天操| 五月天激情丁香| 五月性色| www.9797国产| 丁香五月婷婷啪啪啪| 色婷婷www| 久九色| 99热6这里只有精品| 日日夜夜天天综合| 激情网五月天| 五月婷在线| 中国丰满熟女A片免费观| 第四色在线观看| www.9操| 91狼友视频在线观看| 日韩久久日| 日韩xx在线| 五月综合丁香婷婷| 丁香九月激情| 综合亚洲五月天| 中文字幕日韩无码制服诱或| 欧美Va在线| AV性爱在线| 日韩久热| 开心五月激情网| 久久大香蕉丁香| 五月色激情综合网| 日韩在线视频网站| 天天弄天天爽| 久色网五月| 丁香成人五月天| 色一情一乱一乱一区91Av| 久久久久久久久久8888| 日本操天堂| 亚洲色婷婷久久99精品91| 成人电影AV在线观看| 六月婷婷天天操夜夜爽视频| 国产寻花在线| 亚洲色优| 日韩九九| 婷婷的五月天另类视频| 九月久久婷婷| 成人天天爽| 在热视频精品| 五月婷婷亚洲| 色婷婷成人做爰A片免费看网站| 婷婷六月香| 精品人人操| 天天综合天天玩夜夜玩天天玩夜夜玩| 五月婷婷免费在线观看视频| 色五月大香蕉| 蒲京久久无码视频| 久9久9热久热| 热久久视频99| 丁香九月婷婷综合| 久久久久久五月天| 丁香激情四射| 丁香五月婷婷欧美成人色图| 日本啪啪网| 91se精品国产| www超碰| 丁香五月综合网亚洲综合欧美狠狠| 五月久久婷婷丁香| 99热每日| 婷婷五月69| 高清无码视频网址| 国产人妻777人伦精品HD| 婷婷激情五月视频| 色播丁香五月婷婷操:屄| 狠狠狠色激情综合适合| 荡乳尤物3HP1V5| 色色色色色色色色色色色色色97| 色999五月色| 欧美婷婷日本| 啪啪视频99| 久色视频首页| 日韩狠狠色| 99热99日天天干| 婷婷爱综合| 九九九九国产| 五月天丁香看婷婷| 色五月视频无码播放| 色色五月丁香| 91色干| 天天夜夜六月丁香五月婷婷老师| 日本一道久久| 色99www.| 五月丁香基地| 96精品成人无码A片观看金桔| 97人凄人人操人人爽| 色欲一区二区三区精品A片| 免费观看全黄做爰的视频| 在线中文字幕视频| 操九色| 在线91日韩| 色婷婷九月| 欧美婷婷色| 国产Va视频| 国产成人亚洲综合A∨婷婷| 丁香狠狠色婷婷| 夜夜爽天天爽| 日日操夜夜操中国无码| 蜜乳av一级av| 六月婷婷狠狠| 色一情一乱一乱一区91Av| 91狠狠综合久久| 九色91国产| 激情综合99| 停停五月色宗合| 96色婷婷| 开心五月婷婷婷美女| 狠狠爱婷婷五月天| 九色色| 亚洲欧洲美女在线观| 色婷婷五月婷婷五月婷婷五月| 久热99| 5月婷婷综合| 美日韩成人| 侠女刀之记忆电影在线看免费| 操骚货在线| 99热免费网站| 无码人妻少妇色欲AV一区二区| 久久草人妻| 成人精品在线| 丁香五月天人体| 夜精品无码A片一区二区蜜桃| 日韩一本操| 色 五月婷婷基地| 九九婷婷激情综合网| WWW.桔色成人.COM| 婷婷94s| 丁香五月婷婷AV在线| 97极品在线| 丁香色六月婷婷| 草综合网| 成人美女网| 97色色色视频| 99热精品网| 在线另类视频| 色很很96| 亚洲精品第一色色色色色色| 色色丁香激情五月| 伊人久久综合| 欧美成人A片AAA片在线播放| 免费视频舔| 无码一区精品一区视频| 欧美色爱五月天| 永久免费一区二区三区| AV电影在线播放| 亚洲综合色网站| 激情六月婷婷啪啪| 婷婷五月天网址| 婷婷在线播放av| 国产真实乱了老女人视频| 天天日天天干天天天| 色婷婷偷拍| 九九色色| 开心婷婷五月天激情网| 色噜噜夜夜夜综合网| 五月天开心网| 丁香六月婷婷激情| 色五月天激情| 538在线精品| 欧洲色| 99视频地址| 丁香婷婷婷婷十二月在线观看视频| 综合网啪| 天天色天天干天天插| 1024在线观看免费视频| 色色婷| 日撸夜撸日操| 五月天激情图片| 美女久久婷婷| 99九九99九九九视频精彩| 五月丁香婷婷久久| 色婷婷狠狠久久YY| 狠狠操狠狠| 99热| 精品人妻久久久| 26UUU欧美激情一区二区| 中文幕无线码中文字蜜桃| 婷婷成人视频| 26uu| 丁香婷婷黄网站| 丁香五月瑟瑟| 99视频久久| 婷婷婷婷色| 这里只有精品99视频| 97五月婷婷| 538在线精品| 影音先锋一区二区三区| 天天日天天做天天操| 色99在线| www,色综合| 亚洲五月六月婷婷| 婷婷婷婷婷婷婷五月丁香| 天天做天天爱天天要| se色99| 丁香蜜臀黄色婷婷五月天| 婷婷色狠狠| 无码少妇高潮喷水A片免费| www,色婷婷| 五月婷婷激情久久| 狠狠色婷婷丁香六月| 五月丁香婷婷啪啪| 五月天激情综合网| 伊人婷婷福利网| 亚洲成人免费电影| 激情五月综合网最新| 欧美xx激情视频在线观看| 亚洲婷婷六月天| 国产99美少妇| 五月婷婷色色色| 青996青| 成人精品网站在线观看| 亚洲V国产V欧美V久久久久久| 五月丁香| 亚洲在线操| 婷婷五月天激情网| 天天碰夜夜爽| 九九热视频思思| 日韩六十路91性交电影| 开心 五月 综合| 337p大胆噜噜噜噜噜91Av| 黑人无码一区| 色婷亚洲五月丁香| 丁香9月婷婷| 婷婷天堂综合网| 色婷婷呢狠禁久禁| 99精品视频在线观看| 9+1视频网址| www.久热| 亚洲六月婷婷| 五月丁香婷婷基地| 色欲色香综合网| 成人在线日韩| 天天干天天干天天干天天干天| 五月丁香婷婷色色色| 婷婷五月天天aV| 成人 AV播放| 九九色插| 九九中文色色| av人人操| 免费在线a| 婷婷丁香综合| 欧美性久| 国产精品操| 久久久99久久| 99在线精品观看99| 99色综合网| site:wpjngj.com| 人人舔人人色人人高潮| 99人这里只有精品| 六月丁香婷婷网| 五月婷婷深爱六月| 五月丁香六月婷婷亚洲| 伊人久久五月天综合| 无月播播激情在线观看视频| 日本色色色| 丁香五月天狠狠| 成人五月天丁香婷| 欧美日韩999| 大香网伊人久久综合| 江苏少妇性BBB搡BBB爽爽爽| 91午夜婷婷狠狠久久综合9色| 婷婷五月成人社区| 五月丁香六月婷婷久久| 色色色综合色| 丁香五月天激情婷婷丁香六月| 婷婷五月天激情在线观看 | 天天天天天操| 色狠狠色噜噜AV天堂五区消防| 26uuu成人网| 99国产在线| 中文字幕丰满孑伦无码专区| 天堂呦 呦百度搜索-百度搜索| 色久一| 日韩ac不卡无码| 五月熟妇婷婷久久| 日日爽日日爽| 婷婷五月天综合网| 中文字幕按摩做爰| 9色小视频在线观看| 欧美日本黄色| 亚洲欧洲色色| 91人人爽久久涩噜噜噜| 99热人人| 超碰97在线操| 色欧美影院| 做爱夜夜干天天操| 久久久久久久久人妻| 天天操无码| 中文字幕1区2区。| 大香av| 天天激情夜夜干| 激情丁香五月天图片| 国产亚洲在线观看| 五月天丁香婷婷久久九| 在线你懂的亚洲欧| 国产综合激情五月久久| 天天做天天爽| 少妇高潮A片无套内谢麻豆传| 日韩天堂久久| 成人操呦av| 51国精产品自偷自偷综合| 色欲久久综合| 九九久久高清| 五月婷婷co.m| 色综合天堂| 伊人婷婷99热精品| 婷婷色网| 天天爽,夜夜爽| 五月丁香网站| 9l视频自拍9l视频自拍九色学生| 婷婷开心青青草| 97人人做| 五月天婷婷网站| 久久亚洲婷婷综合色五月| 色丁香五月婷婷| 国产,欧美,学生妹,视频| 精品婷婷| 婷婷成年人免费视频| 天天插天天插| 99久.| 色色色综合色| 成人做爰A片免费看视频| 大香蕉婷婷色| 人人干av| 天天干天天av天天射| 丁香婷婷五月天网站| 色婷婷综合亚洲| 色色热日| 久久99热精品a片在线观看| 草草视频91| 成人免费在线电影| 久热视频这里只有精品| 国产精品人成A片一区二区| 婷婷激情九月| 少妇人妻人伦A片| 婷婷日韩| 色噜噜在线| 伊人91| 丁香五月天在线观看视频| 丁香婷婷色情| 日本少妇AA一级特黄大片| 五月综合影院| 中国丰满熟女A片免费观| 99国产er热视频| 婷婷五月av| 激情久久肏屄视频| 久久9热| www.9797国产| 97 A I色色| 婷色综合| 色色色国产| 亚洲一级 片内射网站在线观看| 女人天堂av| 九九色色| 99在线视频免费| 久久婷婷亚洲| 九九视频免费| 天天干,天天日| 激情丁香久久| 婷婷综合激情| 热久久思思热思思| 91丨九色丨东北熟女| 九九热这里都是精品6| AV九九| 中文字幕丁香五月| 五月丁香婷婷色啪| 五月婷婷丁香在线视频|