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

ARTICLE DETAIL

資訊詳情

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

JSP+Servlet早餐外賣系統(tǒng)開發(fā)實戰(zhàn):從數(shù)據(jù)庫到部署全流程解析

JSP+Servlet早餐外賣系統(tǒng)開發(fā)實戰(zhàn):從數(shù)據(jù)庫到部署全流程解析 早餐外賣這個場景特別適合JSPServlet這套老牌技術(shù)棧來練手業(yè)務(wù)鏈路完整從前臺點餐到后臺出餐都有又不至于復(fù)雜到失控。今天把這個基于JavaWeb和MySQL的JSPServlet早餐外賣店管理系統(tǒng)拆開揉碎講一遍從數(shù)據(jù)庫設(shè)計到前端交互從本機部署到常見報錯所有流程都是可以照著重現(xiàn)的不是那種飄在PPT上的概念方案。想把這套系統(tǒng)吃透的人我大概分成兩類一類是剛學(xué)完JavaWeb正在找完整項目做課程設(shè)計或畢業(yè)設(shè)計的同學(xué)另一類是工作里被Spring Boot“慣壞了”想回頭補一補原生Servlet、JSP、會話管理這些底層原理的開發(fā)者。這個項目能解決的核心問題就是讓你完全不用框架純靠Servlet控制請求流轉(zhuǎn)、JSP渲染頁面、JDBC操作MySQL自己手工拼出一套能用的外賣管理系統(tǒng)。這么做最大的價值不是“代碼能跑”而是你能真正看清楚一個Web應(yīng)用在瀏覽器和數(shù)據(jù)庫之間到底干了些什么。項目本身的業(yè)務(wù)不復(fù)雜顧客瀏覽早餐分類和菜品加入購物車提交訂單填寫收貨地址和期望送達(dá)時間管理員在后臺維護(hù)菜品、處理訂單狀態(tài)、查看每日營業(yè)額。技術(shù)點覆蓋了JavaWeb幾乎全部核心內(nèi)容Filter過濾器做登錄攔截、Session維護(hù)登錄態(tài)和購物車、JDBC做增刪改查、事務(wù)保證下單扣庫存的一致性、AJAX局部刷新、JSP標(biāo)簽庫遍歷列表。下面按我的實際開發(fā)順序把每個環(huán)節(jié)的關(guān)鍵細(xì)節(jié)和坑都說清楚。1. 整體架構(gòu)與設(shè)計取舍 —— 為什么堅持用 JSPServlet 做外賣系統(tǒng)1.1 技術(shù)選型背后的真實考量有人會問都2025年了誰還用JSPServlet寫新項目這個質(zhì)疑本身沒錯但得分場景。如果是公司里的正式產(chǎn)品我絕對推薦Spring Boot MyBatis / JPA那一套但如果是用來學(xué)習(xí)JavaWeb、理解HTTP請求如何被處理、Session如何維持狀態(tài)、SQL如何被程序調(diào)用那JSPServlet是最直接的地圖。把所有自動化都去掉之后底層的輪廓才會浮出水面。這個早餐外賣系統(tǒng)的業(yè)務(wù)規(guī)模也不大屬于典型的“高并發(fā)需求低、業(yè)務(wù)邏輯直觀、頁面數(shù)量適中”的項目。早餐店高峰時段就是早上七點到九點單量密集但總量有限用Servlet線程池處理完全夠用。反而如果用Spring Boot起步你會發(fā)現(xiàn)大部分精力耗在理解自動配置上而不是業(yè)務(wù)本身。所以我刻意選擇了“裸奔”方案MVC三層全部手寫連接池用簡單的DBCP或者干脆自己封裝JDBC工具類分頁邏輯自己計算事務(wù)邊界自己在Service層控制。寫完之后再回頭看Spring Boot很多概念都是自然而然的對應(yīng)關(guān)系。1.2 系統(tǒng)模塊劃分與角色權(quán)限我把系統(tǒng)拆成前臺門戶和后臺管理兩大塊對應(yīng)兩種角色普通用戶和管理員。前臺給顧客看菜單、下單、查自己的訂單后臺給店員管理菜品類別、上下架早餐、處理訂單狀態(tài)。權(quán)限控制的核心就一句話Session里有沒有登錄用戶以及這個用戶的role字段是不是1。目錄結(jié)構(gòu)我建議這樣組織注意包名要語義清晰com.food ├── controller // Servlet類處理請求轉(zhuǎn)發(fā)和重定向 ├── service // 業(yè)務(wù)邏輯層事務(wù)控制在這里 ├── dao // JDBC數(shù)據(jù)訪問層 ├── entity // 實體類對應(yīng)數(shù)據(jù)庫表 ├── filter // 編碼過濾器、登錄攔截過濾器 ├── util // DBUtil、MD5工具類等 └── listener // 可選啟動時加載分類緩存JSP頁面放在webapp目錄下前臺頁面和后臺頁面用文件夾區(qū)分webapp/front、webapp/admin。這樣的好處是路徑清晰寫Servlet重定向時不會把前臺后臺弄混。1.3 一個Servlet還是多個Servlet這個點是新手最容易糾結(jié)的地方。我見過不少人圖省事寫一個DishServlet里面用if (list.equals(action))、else if (add.equals(action))分別處理不同請求。項目小的時候這么寫沒問題但早餐外賣系統(tǒng)做到后面至少有十幾個功能動作——菜品增刪改查、分類管理、訂單處理、登錄注冊、購物車操作——全塞一個Servlet會讓代碼膨脹到幾百行排查問題非常痛苦。我采用的方案是“一個業(yè)務(wù)實體一個Servlet”。菜品相關(guān)操作放DishServlet訂單相關(guān)放OrderServlet用戶相關(guān)放UserServlet購物車相關(guān)放CartServlet。每個Servlet里用action參數(shù)通過request.getParameter(action)獲取區(qū)分具體方法。這個模式其實已經(jīng)非常接近Spring MVC的RequestMapping思路了理解這種對應(yīng)關(guān)系之后以后學(xué)框架會輕松很多。2. 數(shù)據(jù)庫設(shè)計與核心建模 —— 一份能應(yīng)付答辯的 MySQL 表結(jié)構(gòu)2.1 分類表與菜品表的設(shè)計早餐外賣店的菜單很有特點品類固定、單品價格不高、常有“豆?jié){油條”這種套餐邏輯。所以我的設(shè)計是“分類表菜品表”的主從結(jié)構(gòu)分類表在前臺渲染成導(dǎo)航欄分類菜品表按分類展示。分類表結(jié)構(gòu)簡單重點是狀態(tài)字段和排序字段CREATE TABLE category ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 分類ID, name VARCHAR(50) NOT NULL COMMENT 分類名稱粥品/煎餅/豆?jié){/套餐, sort_order INT DEFAULT 0 COMMENT 排序權(quán)重值小的靠前, status TINYINT DEFAULT 1 COMMENT 1啟用 0停用, create_time DATETIME DEFAULT CURRENT_TIMESTAMP );菜品表要注意的字段多一些我把關(guān)鍵字段貼出來CREATE TABLE dish ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT NOT NULL COMMENT 所屬分類ID, name VARCHAR(100) NOT NULL COMMENT 菜品名稱, description VARCHAR(500) COMMENT 菜品描述前臺列表展示, price DECIMAL(10,2) NOT NULL COMMENT 現(xiàn)價, original_price DECIMAL(10,2) DEFAULT NULL COMMENT 原價用于劃線價展示, image VARCHAR(200) COMMENT 圖片路徑存相對路徑, stock INT DEFAULT 0 COMMENT 當(dāng)日庫存賣完自動下架, sales_count INT DEFAULT 0 COMMENT 累計銷量用于“熱銷”排序, status TINYINT DEFAULT 1 COMMENT 1在售 0下架, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );兩個細(xì)節(jié)必須強調(diào)第一金額字段統(tǒng)一用DECIMAL(10,2)絕對不要用FLOAT或DOUBLE外賣訂單涉及大量金額累加和單價比較浮點誤差會帶來對不上賬的問題第二圖片存的是webapp/upload下的相對路徑比如/upload/youitao.jpg頁面渲染時用request.getContextPath()拼接成完整路徑。千萬別把完整URL寫死進(jìn)數(shù)據(jù)庫換域名、換端口的時候會瘋掉的。2.2 訂單主表與訂單明細(xì)表建模早餐外賣的訂單和正餐外賣有區(qū)別用戶可能是前一天晚上預(yù)訂第二天早上的餐所以“期望送達(dá)時間”是必須的字段而且前臺下單時要限制只能選明天及以后的時間。訂單設(shè)計成主從兩張表主表存一次訂單的整體信息明細(xì)表存這單里每種餐品的數(shù)量、單價、小計。CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT 訂單號年月日隨機數(shù), user_id INT NOT NULL COMMENT 下單用戶ID, total_amount DECIMAL(10,2) NOT NULL COMMENT 訂單總金額, status TINYINT NOT NULL DEFAULT 0 COMMENT 0待支付 1已支付備餐中 2配送中 3已完成 4已取消, receiver_name VARCHAR(50) NOT NULL COMMENT 收貨人姓名, receiver_phone VARCHAR(20) NOT NULL COMMENT 聯(lián)系電話, delivery_address VARCHAR(200) NOT NULL COMMENT 配送地址, expected_time DATETIME NOT NULL COMMENT 期望送達(dá)時間, remark VARCHAR(200) COMMENT 訂單備注比如“不要香菜”, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_user_id(user_id), INDEX idx_status(status), INDEX idx_expected_time(expected_time) ); CREATE TABLE order_item ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL COMMENT 訂單ID, dish_id INT NOT NULL COMMENT 菜品ID, dish_name VARCHAR(100) NOT NULL COMMENT 下單時的菜品名稱快照, price DECIMAL(10,2) NOT NULL COMMENT 下單時的單價快照, quantity INT NOT NULL COMMENT 數(shù)量, subtotal DECIMAL(10,2) NOT NULL COMMENT 小計金額 );這里有一個菜鳥經(jīng)常忽略的設(shè)計為什么訂單明細(xì)表里要冗余dish_name和price這兩個字段因為早餐店的菜品是會改價、甚至?xí)h除的。如果訂單只存dish_id一個月后店長把豆?jié){從兩塊錢漲到三塊錢你再回去看一個月前的訂單報表金額全變了。這叫“歷史數(shù)據(jù)快照”外賣系統(tǒng)的訂單明細(xì)必須保留下單那一刻的商品信息這是行業(yè)通用做法。2.3 外鍵、索引和命名規(guī)范的實操建議外鍵約束在學(xué)術(shù)上很漂亮但在實際項目里我建議盡量不要加物理外鍵尤其是訂單明細(xì)表關(guān)聯(lián)菜品表、訂單表關(guān)聯(lián)用戶表這種高頻查詢鏈路。理由有兩條一是早餐外賣高峰期密集下單物理外鍵在插入和刪除時會有額外的完整性檢查開銷二是做訂單刪除或菜品歸檔時物理外鍵會擋住操作還得先處理關(guān)聯(lián)數(shù)據(jù)。業(yè)務(wù)上的一致性通過Service層事務(wù)來控制數(shù)據(jù)庫只加普通索引。索引方面訂單表里user_id、status、create_time這三個字段是查詢高頻字段前臺用戶查“我的訂單”、后臺管理員按狀態(tài)篩選訂單、按時間范圍統(tǒng)計營業(yè)額都靠這三個索引。但注意不要無腦加索引——訂單狀態(tài)只有幾個固定值區(qū)分度很低單獨加索引收益不大我更推薦建聯(lián)合索引(status, create_time)這樣既能按狀態(tài)篩也能按時間排一個索引覆蓋兩種場景。命名規(guī)范方面我習(xí)慣表名用單數(shù)字段名全部小寫加下劃線user_id不寫成userIdcreate_time不寫成createTime。Java實體類的駝峰命名和數(shù)據(jù)庫下劃線命名之間在DAO層寫映射時手動轉(zhuǎn)換即可項目不大沒必要引入ORM框架但字段命名統(tǒng)一能讓代碼審查不鬧心。主鍵一律叫id邏輯外鍵直接叫xxx_id一看就能明白關(guān)聯(lián)關(guān)系。3. 核心功能模塊實現(xiàn)細(xì)節(jié) —— 從登錄到結(jié)算的完整閉環(huán)3.1 用戶登錄與會話管理登錄是幾乎所有Web系統(tǒng)的入口早餐外賣系統(tǒng)也不例外。我在UserServlet里寫了個login方法流程就是拿到用戶名和密碼先做非空校驗然后調(diào)Service層的login()方法返回用戶對象或null。密碼存儲那邊用了MD5加鹽的方式注冊時把鹽和密碼哈希一起存庫登錄時用同規(guī)則哈希后比對——雖然是老技術(shù)但配合鹽值仍然能擋住大部分“拖庫撞庫”的低級攻擊。加鹽的核心是一人一鹽讓彩虹表失效。登錄成功后做法是request.getSession().setAttribute(loginUser, user)。退出登錄時不僅要session.invalidate()還要記得把Cookie里的JSESSIONID清理掉不然瀏覽器還會在響應(yīng)頭里帶一個無效的會話ID。Session這塊要提醒一個容易踩的坑不要把整個User對象直接塞在Session里當(dāng)JSON用然后在JSP里取${loginUser.password}這種危險操作。正確做法是把密碼字段設(shè)為null再放入Session或者單獨建一個SafeUser對象只保留id、用戶名、手機號、角色這些安全字段。登錄攔截用Filter來實現(xiàn)最合適。我建了一個LoginFilter在web.xml里配置映射路徑WebFilter(/*) public class LoginFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; String uri request.getRequestURI(); // 放行登錄頁、注冊頁、靜態(tài)資源、前臺瀏覽接口 if (uri.endsWith(login.jsp) || uri.endsWith(register.jsp) || uri.contains(/static/) || uri.contains(/upload/) || uri.contains(userServlet?actionlogin) || uri.contains(userServlet?actionregister) || uri.contains(dishServlet?actionlist)) { chain.doFilter(request, response); return; } // 其余頁面必須登錄 HttpSession session request.getSession(false); if (session ! null session.getAttribute(loginUser) ! null) { chain.doFilter(request, response); } else { response.sendRedirect(request.getContextPath() /front/login.jsp); } } }注意request.getSession(false)里的false——意思是如果沒有Session就返回null而不是新創(chuàng)建一個。這個細(xì)節(jié)很關(guān)鍵未登錄用戶訪問后臺頁面時不應(yīng)該被“強行創(chuàng)建Session”白白浪費服務(wù)器內(nèi)存還讓會話ID有了可乘之機。3.2 菜單展示、分頁搜索與圖片坐標(biāo)定位前臺的菜單頁是整個系統(tǒng)門面也是JSP標(biāo)簽庫用得最密集的地方。我用JSTL的c:forEach遍歷菜品列表加上c:choose實現(xiàn)“有圖顯示圖、無圖顯示占位圖”的邏輯。分類導(dǎo)航欄用c:if判斷當(dāng)前選中分類高亮。分頁必須自己寫清楚頁面?zhèn)鱬ageNum參數(shù)每頁固定6個菜品因為早餐店數(shù)量不大一頁放太少顯得空曠放太多又太長DAO層先用SELECT COUNT(*)算總量再執(zhí)行帶LIMIT的查詢int pageSize 6; int totalCount dishDao.countByCategory(categoryId); int totalPages (int) Math.ceil(totalCount * 1.0 / pageSize); int offset (pageNum - 1) * pageSize; ListDish dishList dishDao.findByCategory(categoryId, offset, pageSize);頁碼導(dǎo)航怎么做我的方案是直接用c:forEach從1循環(huán)到totalPages生成?pageNum${i}categoryId${categoryId}的鏈接。這里有個細(xì)節(jié)翻頁時一定要把categoryId也帶上并且當(dāng)前頁碼要控制在1和totalPages之間防止用戶直接在地址欄輸入pageNum999導(dǎo)致SQL越界。圖片坐標(biāo)定位這個需求在早餐外賣里有實際應(yīng)用場景——比如菜單頁的一張菜品展示圖上標(biāo)注“豆?jié){ 2元 / 油條 3元 / 茶葉蛋 1.5元”點擊不同坐標(biāo)區(qū)域跳到對應(yīng)菜品分類。原生JSP做這個很簡單不算復(fù)雜給圖片設(shè)置usemap屬性用HTML的map和area標(biāo)簽劃定多個圓形或矩形熱區(qū)每個熱區(qū)的href指向不同查詢鏈接img src${ctx}/upload/breakfast_map.png usemap#breakfastMap alt早餐地圖 map namebreakfastMap area shaperect coords10,10,120,120 href${ctx}/dishServlet?actionlistcategoryId1 alt粥品 area shapecircle coords180,80,40 href${ctx}/dishServlet?actionlistcategoryId2 alt煎餅 /mapcoordinates的四個數(shù)字分別代表矩形左上角和右下角的x、y坐標(biāo)值確定區(qū)域時直接對著圖片坐標(biāo)量就行。如果要求更細(xì)致的交互可以嵌入一小段JavaScript監(jiān)聽圖片的click事件用event.offsetX和event.offsetY判斷點擊位置落入哪個區(qū)域范圍再手動跳轉(zhuǎn)。兩種方式對比HTML map標(biāo)簽簡單可靠但不靈活JS判斷可以加高亮提示、彈窗預(yù)覽體驗更好代價是要自己寫邏輯。3.3 購物車實現(xiàn)——為什么用Session而不用數(shù)據(jù)庫表購物車這環(huán)節(jié)錯誤答案最多。有些人習(xí)慣性地建一張cart_item表用戶加一次購物車就寫一次數(shù)據(jù)庫提交訂單時再逐條讀出來、刪除。這個方案在體驗上有個硬傷用戶逛了半天加了一堆菜中途瀏覽器直接關(guān)掉或者Session超時這些購物車數(shù)據(jù)就成了垃圾數(shù)據(jù)你還得定時清理。而且早餐外賣的場景里購物車生命周期極短從加餐到下單往往不超過幾分鐘根本犯不著落到數(shù)據(jù)庫。我在這個項目里把購物車直接放在Session里結(jié)構(gòu)是MapInteger, CartItem——key是菜品idvalue是包含菜品信息、數(shù)量、小計的購物車項。實現(xiàn)思路是MapInteger, CartItem cart (MapInteger, CartItem) session.getAttribute(cart); if (cart null) { cart new HashMapInteger, CartItem(); session.setAttribute(cart, cart); } // 加購時判斷key存在就數(shù)量1不存在就新建一項這個方案的好處和柜臺點餐的體驗一致加購不需要訪問數(shù)據(jù)庫零延遲購物車數(shù)據(jù)隨Session自然銷毀沒有臟數(shù)據(jù)積壓。缺點你也能想到——用戶在手機上逛著逛著把瀏覽器關(guān)了購物車就沒了。但在早餐外賣這種低決策成本、即點即走的場景下這是完全可以接受的取舍。購物車頁面的“數(shù)量加減”按鈕要實現(xiàn)一個細(xì)節(jié)數(shù)量減少到0時這一項自動從Map里移除。營業(yè)額統(tǒng)計和庫存扣減都依賴購物車數(shù)據(jù)的準(zhǔn)確性不要在頁面上顯示數(shù)量為0的餐品后還能提交會讓訂單金額算錯。3.4 訂單提交流程與事務(wù)控制下單是整個系統(tǒng)的核心交易環(huán)節(jié)最容易出數(shù)據(jù)不一致的地方。我按下面的步驟設(shè)計Service層的submitOrder方法從Session里拿購物車校驗非空從Session里拿登錄用戶校驗非空遍歷購物車明細(xì)逐項檢查菜品仍在售、庫存夠數(shù)計算訂單總金額循環(huán)累加每個明細(xì)的subtotal生成訂單號形如20250127093000001純數(shù)字避免和字母混淆插入訂單主表拿到自增id遍歷購物車明細(xì)批量插入訂單明細(xì)表扣減庫存UPDATE dish SET stock stock - ? WHERE id ? AND stock ?清空Session里的購物車返回訂單號跳轉(zhuǎn)到支付模擬頁。這十步里第5、6、7、8四步必須處于同一個事務(wù)里。如果只插了主表、明細(xì)表插入失敗主表訂單就是一條“孤兒訂單”如果下單成功但庫存沒扣商品就可能超賣。早餐店雖然單量不大但邏輯上不能有這種漏洞。我用最樸素的方式管理事務(wù)在DBUtil里封裝getConnection()、beginTransaction()、commit()、rollback()然后在Service層手動控制Connection conn DBUtil.getConnection(); try { conn.setAutoCommit(false); // 插入訂單主表、明細(xì)表、扣庫存 DBUtil.commit(conn); } catch (Exception e) { DBUtil.rollback(conn); throw new RuntimeException(下單失敗, e); } finally { DBUtil.release(conn); }由于DAO層的每個方法內(nèi)部都會獨立拿連接和釋放連接開事務(wù)時必須用一個外部傳入的連接。方法簽名設(shè)計成insertOrder(Connection conn, Order order)或者在DAO內(nèi)部增加一個重載方法透傳連接。新手在這個地方很容易犯的錯是Service層開啟事務(wù)后調(diào)用DAO方法DAO又自己DriverManager.getConnection()新拿了一個連接導(dǎo)致事務(wù)根本沒作用在同一個數(shù)據(jù)庫會話上。務(wù)必保證整個業(yè)務(wù)鏈路用的是同一個Connection。訂單狀態(tài)流轉(zhuǎn)我設(shè)計為0待支付 → 1已支付/備餐中 → 2配送中 → 3已完成或者0待支付 → 4已取消。后臺管理員操作按鈕根據(jù)當(dāng)前狀態(tài)顯示對應(yīng)的下一步操作。這個狀態(tài)機的實現(xiàn)原則是狀態(tài)只能往后走不能回退例如不能從“配送中”改成“待支付”否則財務(wù)數(shù)據(jù)就亂了。3.5 后臺訂單管理與營業(yè)額統(tǒng)計后臺管理員的首頁是一個輕量儀表盤今日訂單數(shù)、今日營業(yè)額、待處理訂單數(shù)、菜品銷量Top5。這些數(shù)據(jù)如果用一條SQL硬拼會很痛苦我的做法是拆成多個SQL聚合查詢分別查COUNT(*)、SUM(total_amount)等。營業(yè)額統(tǒng)計有一個大坑訂單金額的累加時機。如果統(tǒng)計口徑是“訂單創(chuàng)建時間”那就要排除已取消狀態(tài)如果統(tǒng)計口徑是“訂單完成時間”那所有狀態(tài)都得列入“待支付”但未支付的也算異常。我最終采用的口徑是“只統(tǒng)計狀態(tài)為已支付、配送中、已完成的訂單”把待支付和已取消排除掉。SQL寫法類似SELECT DATE_FORMAT(create_time, %Y-%m-%d) AS day, COUNT(*) AS order_count, COALESCE(SUM(total_amount), 0) AS revenue FROM orders WHERE status IN (1, 2, 3) AND create_time DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE_FORMAT(create_time, %Y-%m-%d) ORDER BY day;COALESCE必須加上——某一天沒有任何訂單時SUM返回null頁面直接顯示空白用0填充才合理。統(tǒng)計圖不建議后端生成圖片太重了。我的方案是后臺JSP頁面把統(tǒng)計結(jié)果轉(zhuǎn)換成JSON數(shù)組用原生JavaScript畫簡單的柱狀圖或者引入輕量Chart.js庫。早餐店老板最關(guān)心的是“今天賣了多少單”“哪幾樣賣得好”柱狀圖和排名列表就夠了不需要炫酷的3D圖表。4. 前端交互與JavaScript細(xì)節(jié) —— 讓頁面活起來的小技巧4.1 表單校驗從正則到提交攔截外賣系統(tǒng)的表單主要集中在登錄、注冊、下單這三個場景登錄只需要用戶名密碼非空但注冊和下單必須做格式校驗。我在前端用JavaScript做首道防線在Servlet端做第二道防線絕不信前端的校驗結(jié)果。手機號校驗是最常見的需求我用一個正則function isValidPhone(phone) { var reg /^1[3-9]\d{9}$/; return reg.test(phone); }這個正則代表第一位是1第二位在3到9之間后面跟著9位數(shù)字總計11位。它基本覆蓋了目前國內(nèi)用戶手機號的規(guī)律能在用戶輸入錯誤時立刻提示減少無效請求到達(dá)服務(wù)器。但正則只是“格式校驗”不是“真實驗證”——如果項目需要驗證號碼真的存在那就要接短信驗證碼服務(wù)早餐店系統(tǒng)用不上這個級別。下單表單里的“期望送達(dá)時間”必須用JavaScript校驗不能選過去的日期不能選今天之前的時間。我的做法是用new Date()獲取當(dāng)前時間戳然后和輸入框的值做對比時間早于當(dāng)前時間直接彈框攔截。4.2 AJAX局部刷新消息提示和購物車角標(biāo)JSP頁面默認(rèn)是同步刷新但有幾個場景用AJAX體驗?zāi)芴嵘粋€檔次。最典型的是“加入購物車”用戶點一下“加入購物車”按鈕如果整頁刷新頁面滾動位置會重置用戶要重新找到剛才那個菜很煩。我改成用fetch或XMLHttpRequest異步提交返回JSON前端根據(jù)結(jié)果更新頁面上的“購物車商品數(shù)量”角標(biāo)同時彈一個提示條“已加入購物車”。原生JavaScript里可以用這個方式實現(xiàn)AJAX請求function addToCart(dishId) { fetch(ctx /cartServlet?actionadddishId dishId, { method: GET, credentials: same-origin }) .then(function(resp) { return resp.json(); }) .then(function(data) { if (data.success) { document.getElementById(cartCount).textContent data.cartCount; showMsg(已加入購物車); } else { showMsg(data.message || 加入失敗); } }); }這里有個細(xì)節(jié)要注意AJAX請求同樣會被LoginFilter攔截。如果用戶沒登錄就直接點“加購”返回的不是JSON而是一個重定向到登錄頁的HTML頁面前端解析resp.json()會報錯。我的處理方案是在Filter里對AJAX請求做單獨分支判斷通過X-Requested-With請求頭識別未登錄時返回{success:false,message:請先登錄}前端的提示條會展示這個信息。購物車角標(biāo)更新的本質(zhì)是后端addToCart邏輯執(zhí)行完成后計算cart.size()把數(shù)值放進(jìn)JSON返回。前端拿到后直接textContent賦值這樣不用刷新頁面就能看到角標(biāo)變化。4.3 圖片坐標(biāo)交互和旋轉(zhuǎn)的實用技巧前面提到了HTML map做圖片熱區(qū)這里再補充一種方案用JavaScript監(jiān)聽圖片點擊位置實現(xiàn)更復(fù)雜的交互。比如菜品詳情頁有一張“套餐搭配示意圖”用戶點擊圖上的某個位置系統(tǒng)判斷點擊點落在哪個菜品的圓形區(qū)域內(nèi)然后彈出該菜品的詳情卡片再點一次可以加購。核心代碼是這樣的document.getElementById(dishMap).addEventListener(click, function(e) { var rect e.target.getBoundingClientRect(); var x e.clientX - rect.left; var y e.clientY - rect.top; // 判斷坐標(biāo)是否落在某個圓內(nèi)比如圓心(100,80) 半徑40 var dx x - 100; var dy y - 80; if (dx * dx dy * dy 40 * 40) { window.location.href ctx /dishServlet?actiondetailid3; } });判斷一個圓要計算距離平方這是初中幾何——點到圓心的距離小于半徑就在圓內(nèi)。這套邏輯比HTML map靈活在與后端數(shù)據(jù)聯(lián)動菜品坐標(biāo)可以存在數(shù)據(jù)庫里前端循環(huán)讀取后在canvas或div上動態(tài)繪制熱區(qū)而不需要改HTML代碼。另外提一個小技巧有些早餐店會拍豎版圖片但頁面上想展示橫版的效果。傳統(tǒng)做法是后端處理圖片旋轉(zhuǎn)其實前端一行JavaScript就能搞定旋轉(zhuǎn)例如document.getElementById(menuImg).style.rotate -90deg;CSS的rotate屬性可以直接用角度值注意設(shè)置旋轉(zhuǎn)變換后也要配合transform-origin調(diào)整旋轉(zhuǎn)中心不然圖片會繞著左上角轉(zhuǎn)視覺上偏了。這類前端小技巧在處理一些手機拍攝的早餐實拍圖時特別實用。4.4 跨瀏覽器兼容的幾個注意點現(xiàn)在的瀏覽器都是現(xiàn)代瀏覽器了大部分標(biāo)準(zhǔn)API都能直接用但做JavaWeb課程設(shè)計時要考慮用戶可能用IE或者老內(nèi)核瀏覽器訪問。兼容性風(fēng)險最高的有四個地方fetch、Promise、let/const、Arrow Function。如果項目沒有引入任何框架和庫我建議寫原生JavaScript時采用ES5語法或者用最基礎(chǔ)的XMLHttpRequest封裝。比如上面的addToCart函數(shù)改成原生寫法var xhr new XMLHttpRequest(); xhr.open(GET, ctx /cartServlet?actionadddishId dishId, true); xhr.onreadystatechange function() { if (xhr.readyState 4 xhr.status 200) { var data JSON.parse(xhr.responseText); ... } }; xhr.send();這里不是讓你退回老技術(shù)而是在選型階段就想清楚目標(biāo)用戶是誰。如果這個系統(tǒng)只是校內(nèi)課程設(shè)計運行環(huán)境就是Chrome那用fetch完全沒問題。如果是要交付給某個早餐店實際使用店里的電腦可能是十年前的老機器、瀏覽器從來沒升級過這時候ES5的兼容性優(yōu)勢立刻體現(xiàn)出來。5. 本地環(huán)境部署實操 —— IDEA MySQL 從零跑通項目5.1 MySQL 安裝與版本選擇這個項目用哪個版本的MySQL合適我推薦5.7 LTS版本例如5.7.44原因有三點5.7還是目前大量高校和中小公司的穩(wěn)定主力版本網(wǎng)上教程最多和8.0相比5.7的連接驅(qū)動配置相對簡單不會碰到8.0的caching_sha2_password驗證插件兼容問題早餐外賣項目的SQL語句沒有8.0特有的窗口函數(shù)需求完全不需要硬上8.0。但如果你電腦上已經(jīng)裝了8.0也不用卸掉重裝。只要在JDBC連接串里額外配置兩項useSSLfalse和allowPublicKeyRetrievaltrue。8.0默認(rèn)使用caching_sha2_password認(rèn)證老版本的MySQL驅(qū)動5.1.x系列連接會報“Public Key Retrieval is not allowed”這個錯加上allowPublicKeyRetrievaltrue就能解決。安裝MySQL時有兩個大坑必須提前說。第一個是初始密碼Windows用ZIP壓縮包方式安裝時解壓后執(zhí)行mysqld --initialize-insecure會生成一個root空密碼這樣第一次登錄不用費勁找臨時密碼直接打mysql -uroot就能進(jìn)。第二個是my.ini配置文件里的字符集default-character-set要配合MySQL 5.7的寫法服務(wù)端設(shè)置character-set-serverutf8mb4客戶端連接時在連接串里追加useUnicodetruecharacterEncodingutf8否則JSP頁面顯示中文全是問號。Linux服務(wù)器上部署時RPM包安裝有一個常見問題——MySQL 5.7官方倉庫有時只顯示最新小版本比如搜索“mysql 5.7.44”可能找不到對應(yīng)RPM包。我的建議是直接到MySQL官方下載站挑mysql-community-server-5.7.44-1.el7.x86_64.rpm這種完整包安裝不要依賴yum源自動解析版本。5.2 IDEA 配置 Tomcat 與項目結(jié)構(gòu)在IDEA里跑JSPServlet項目新手被卡住的地方新建項目時選錯了類型。正確姿勢是創(chuàng)建一個普通的“Java Enterprise”項目勾選Web Application模板然后配置Tomcat。如果你手里是已經(jīng)寫好的項目代碼導(dǎo)入時要注意三個地方第一項目必須包含webapp目錄且該目錄被正確標(biāo)記為Web資源目錄。IDEA里右鍵webapp→ “Add Framework Support” → 選擇“Web”是可以補救的。第二WEB-INF/web.xml文件必須存在Servlet全注解開發(fā)時代甚至可以沒有web.xml但I(xiàn)DEA的Artifact打包默認(rèn)依賴這個文件。第三Tomcat的Lib目錄要確認(rèn)IDEA里配置Tomcat的“Server”選項時“Libraries”標(biāo)簽頁如果沒有把servlet-api.jar加進(jìn)來所有Servlet類都會編譯報錯找不到HttpServlet。5.3 JDBC 連接與SSL錯誤處理JDBC連接MySQL的代碼是我見過報錯頻率最高的地方。核心連接串如下以MySQL 5.7為例private static final String URL jdbc:mysql://localhost:3306/food_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD yourpassword; Class.forName(com.mysql.jdbc.Driver); Connection conn DriverManager.getConnection(URL, USER, PASSWORD);useSSLfalse幾乎必寫。如果你裝的是MySQL 8.0卻下載了5.x的驅(qū)動如果不加這個參數(shù)會報“SSL connection error: java.net.SocketException: Connection reset”看起來像網(wǎng)絡(luò)問題實際是SSL握手失敗。serverTimezoneAsia/Shanghai也要寫因為MySQL 5.7之后驅(qū)動要求明確時區(qū)不寫會報The server time zone value ?D1ú±ê×?ê±?? is unrecognized這種亂碼時區(qū)錯誤。驅(qū)動包的jar文件放置位置也是入門常見問題正確的放法是復(fù)制到webapp/WEB-INF/lib目錄下而不是項目根目錄某處。IDEA里雖然可以通過“Add as Library”讓編譯通過但Tomcat部署時如果驅(qū)動只在編譯classpath里、不在WEB-INF/lib運行時就會報ClassNotFoundException: com.mysql.jdbc.Driver。保險起見同時放到外部的Tomcat lib目錄也可以但我更推薦跟隨項目打包這樣換一臺電腦拉代碼不會丟依賴。5.4 部署過程中最常見的幾個404/500問題部署跑起來之后如果頁面出現(xiàn)404或500先別慌按以下列表排查大部分情況是低級配置問題現(xiàn)象可能原因解決方案瀏覽器訪問localhost:8080顯示404 Tomcat首頁項目沒有正確部署到Tomcat的webapps目錄IDEA里檢查Artifact輸出或者直接把項目打成war包放到Tomcat/webapps下Servlet訪問時404注解WebServlet的URL路徑寫錯或web.xml里沒有正確配置映射確認(rèn)注解路徑以/開頭比如WebServlet(/dishServlet)訪問時500 ClassNotFoundExceptionJDBC驅(qū)動jar不在WEB-INF/lib下把jar復(fù)制進(jìn)webapp/WEB-INF/lib后Rebuild Artifact中文亂碼頁面編碼、請求編碼、數(shù)據(jù)庫編碼不一致統(tǒng)一設(shè)置JSP頁面pageEncodingUTF-8Servlet里request.setCharacterEncoding(UTF-8)Filter全局接管訪問jsp頁面直接變成源碼下載Tomcat沒有配置JSP支持檢查是否誤把JSP文件放到了webapp/static或直接用瀏覽器訪問了未編譯的源文件報錯端口被占用Tomcat默認(rèn)8080被其他程序占用用netstat -ano還有一個特別隱蔽的問題IDEA重新部署項目時常常報“Address localhost:8080 is already in use”。這是因為之前部署的Tomcat實例沒有正常關(guān)閉殺進(jìn)程時注意看java.exe進(jìn)程直接全殺容易誤傷IDEA自身我建議用netstat -ano查出監(jiān)聽8080端口的PID再taskkill /PID xxx /F。6. 實操過程實錄 —— 跑一遍核心流程看看每一步做了什么6.1 從建庫建表到后臺發(fā)布菜品的完整流程拿一臺全新的Windows機器舉例整個流程分七個步驟第一步安裝MySQL并啟動服務(wù)。ZIP包解壓后在bin目錄執(zhí)行mysqld --install和net start mysql然后命令行執(zhí)行mysql -uroot -p登錄執(zhí)行建庫語句CREATE DATABASE food_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;。選擇utf8mb4而不是utf8的原因是utf8mb4能存emoji和生僻字早餐店鋪名和菜品里可能出現(xiàn)的特殊符號不會變成亂碼。第二步執(zhí)行表結(jié)構(gòu)SQL建表。依次執(zhí)行分類表、菜品表、用戶表、訂單主表、訂單明細(xì)表的建表語句然后插入測試數(shù)據(jù)。比如INSERT INTO category(name, sort_order) VALUES (粥品, 1), (煎餅, 2), (豆?jié){油條, 3); INSERT INTO dish(category_id, name, price, stock, status) VALUES (1, 皮蛋瘦肉粥, 6.00, 50, 1), (2, 加蛋煎餅, 8.00, 30, 1), (3, 豆?jié){, 2.00, 100, 1);第三步在IDEA里創(chuàng)建JavaWeb項目配置好Tomcat第四步編寫實體類。Dish實體類要包含所有表和前端展示需要的字段注意originalPrice和categoryName這類冗余展示字段可以加上——它對應(yīng)分類表的一對一關(guān)聯(lián)通常用JOIN查詢時在DAO層手動組裝。第五步編寫JDBC工具類和DAO層第六步編寫Servlet層和JSP頁面第七步啟動Tomcat訪問http://localhost:8080/food_web/查看菜單頁。后臺發(fā)布菜品的流程管理員登錄后進(jìn)入/admin/dish_list.jsp點“新增菜品”填寫基本信息。這里圖片上傳是個必做的功能我建議先把圖片文件保存到webapp/upload目錄數(shù)據(jù)庫只存“上傳后返回的文件名”。實際上傳用ServletFileUpload解析multipart表單一個隱藏坑是Tomcat的默認(rèn)post體大小限制——maxPostSize默認(rèn)2MB早餐菜品圖片一般不大但也要注意如果上傳超過2MB的圖片會直接拋異常需要到conf/server.xml的Connector標(biāo)簽里設(shè)置maxPostSize-1-1表示不受限。6.2 顧客端模擬下單流程顧客打開首頁看到分類導(dǎo)航欄和菜品列表點“加入購物車”按鈕。這里需要注意的是未登錄用戶點擊加購時Filter會攔住并跳到登錄頁但URL參數(shù)丟失登錄后不會自動回到加購動作。我的改進(jìn)方案是跳轉(zhuǎn)登錄頁前把原始請求URI存入Session登錄成功后sendRedirect回去session.setAttribute(returnUrl, request.getRequestURI() ? request.getQueryString());這樣用戶登錄一次就能回到剛才瀏覽的位置體驗好不少。登錄后繼續(xù)加購右上角購物車角標(biāo)從0變1再點進(jìn)去看到購物車明細(xì)列表修改數(shù)量后頁面底部實時刷新總金額——這一項我用JS計算因為每個菜的小計和總價都能從前端數(shù)據(jù)拿到不用每次改動都請求后端。然后點擊“去結(jié)算”填寫收貨人、手機號、地址、期望送達(dá)時間。時間組件我用input typedatetime-local好處是瀏覽器自帶原生選擇器后端解析時用SimpleDateFormat按yyyy-MM-ddTHH:mm格式處理。提交訂單后頁面跳轉(zhuǎn)到支付模擬頁顯示訂單號和應(yīng)付金額點擊“模擬支付”按鈕Ajax請求后端把訂單狀態(tài)從0改成1頁面顯示“支付成功店鋪備餐中”。整個流程在后端做了什么提交時事務(wù)里插了主表和明細(xì)表扣了庫存清空購物車支付時只更新訂單狀態(tài)字段一個UPDATE搞定。早餐店場景不需要真實接支付接口這個模擬流程已經(jīng)把業(yè)務(wù)閉環(huán)打通了。6.3 管理員端訂單處理流程管理員登錄后看到待處理訂單列表每個訂單顯示訂單號、用戶、餐品明細(xì)、總金額、期望送達(dá)時間。點擊“確認(rèn)接單”按鈕后端把status 1改成status 2。再點“完成配送”status 2改成status 3。這里有一個實際操作中的體會管理員頁面最好用定時刷新或手動刷新方式更新列表不用做WebSocket實時推送。早餐店高峰時段可能同時來十幾個訂單管理員每接一單刷新一下頁面完全夠用WebSocket的實時性在這個場景里是偽需求還引入一堆復(fù)雜度。如果真想提升體驗可以加一個前端定時器每分鐘自動location.reload()或者用AJAX輪詢刷新訂單數(shù)量角標(biāo)實現(xiàn)簡單效果也尚可。6.4 數(shù)據(jù)統(tǒng)計校驗后臺統(tǒng)計頁要顯示每日營收曲線和熱銷菜品榜。菜品類銷量我依賴訂單明細(xì)表里的quantity字段SELECT dish_name, SUM(quantity) AS total_sales FROM order_item WHERE order_id IN ( SELECT id FROM orders WHERE status IN (1,2,3) ) GROUP BY dish_name ORDER BY total_sales DESC LIMIT 5;這種SQL在數(shù)據(jù)量小的時候性能沒問題。等訂單積累到萬級子查詢的性能瓶頸會出現(xiàn)優(yōu)化方向是把統(tǒng)計邏輯拆到獨立報表表里每天夜里定時匯總。但在課程設(shè)計和創(chuàng)業(yè)初期完全夠用不必過度設(shè)計。7. 常見問題與排查技巧速查表7.1 高頻報錯的一線解決方案列舉一下我實際跑這個項目時遇到、以及幫別人排查過的最典型問題直接按表格查就行癥狀根因處理方式j(luò)ava.sql.SQLException: Access denied for user rootlocalhost密碼錯誤或root賬號授權(quán)問題在命令行用mysql -uroot -p重設(shè)密碼或執(zhí)行ALTER USER rootlocalhost IDENTIFIED BY 新密碼;The server time zone value ... is unrecognized連接串沒指定時區(qū)連接串加serverTimezoneAsia/ShanghaiMySQL 8.0時加useSSLfalseallowPublicKeyRetrievaltrue中文亂碼多層編碼不一致Filter里統(tǒng)一request.setCharacterEncoding(UTF-8)JSP頂部pageEncodingUTF-8MySQL表字段用utf8mb4表單提交后原子性問題沒有開啟事務(wù)Service層包事務(wù)確認(rèn)DAO方法復(fù)用同一個ConnectionTomcat運行后無法訪問項目頁面Artifact配置錯誤IDEA里Project Structure → Artifacts → 確保輸出類型為war explodedDeployment里Application context填/MySQL 8.0連不上報Public Key Retrieval is not allowed8.0默認(rèn)認(rèn)證插件連接串加allowPublicKeyRetrievaltrue或創(chuàng)建MySQL用戶時指定mysql_native_password7.2 SQL層面的隱蔽坑早餐外賣系統(tǒng)的SQL并不復(fù)雜但幾個隱蔽問題非常值得記錄。第一個是DELETE FROM orders WHERE id?這種刪除訂單的SQL一旦訂單有明細(xì)表關(guān)聯(lián)刪除主表會產(chǎn)生孤兒明細(xì)數(shù)據(jù)。項目里我的策略是不做物理刪除用status4已取消標(biāo)記后臺列表默認(rèn)過濾掉但數(shù)據(jù)完整保留。第二個是分頁排序混亂問題如果一個頁面上菜品數(shù)據(jù)多次插入沒有明確的ORDER BY idMySQL返回順序可能隨機且不穩(wěn)定。所以我分頁SQL統(tǒng)一加ORDER BY id ASC避免用戶翻頁時看到菜品順序跳變。第三個是COUNT(*)和COUNT(1)的選擇——在這類小項目里性能差異可忽略但注意COUNT(column)會忽略NULL列統(tǒng)計訂單數(shù)量時如果列有NULL值就容易數(shù)錯直接用COUNT(*)最穩(wěn)妥。7.3 前后端聯(lián)調(diào)時的數(shù)據(jù)格式問題后端Servlet返回數(shù)據(jù)給前端JavaScript時通常用JSON格式。我用的工具是阿里的Fastjson或者Google的Gson在Java里JSON.toJSONString(resultMap)然后通過response.getWriter().write(json)輸出。JSP的script塊里接收時有一個編碼陷阱如果JSP本身contentTypetext/html; charsetUTF-8但Servlet響應(yīng)的Content-Type沒設(shè)置前端JSON.parse可能因為編碼問題解析失敗。穩(wěn)妥做法是Servlet端每次返回JSON都設(shè)置response.setContentType(application/json;charsetUTF-8);前端拿到中文后不用手動轉(zhuǎn)碼JSON標(biāo)準(zhǔn)要求UTF-8。8. 從JSPServlet到框架的思維遷移如果這個系統(tǒng)你已經(jīng)完整寫過一遍我建議你做三個后續(xù)的小實驗用最小的成本感受框架演進(jìn)思路。第一個實驗把DishServlet的一個action方法改成Spring MVC的RequestMapping寫法對比一下URL映射和參數(shù)獲取的異同。你會發(fā)現(xiàn)Spring MVC的RequestParam本質(zhì)就是request.getParameter()的封裝ModelAndView本質(zhì)就是request.setAttribute() forward的封裝。第二個實驗把JDBC手動事務(wù)改成聲明式事務(wù)感受一下Transactional為什么能減少重復(fù)代碼。手寫事務(wù)要每次開連接、提交、回滾聲明式事務(wù)只用加一個注解底層是用AOP動態(tài)代理做的同一件事。第三個實驗把Session購物車改成Redis緩存購物車對比Session方案和獨立緩存方案的差異。Session方案天然綁定單臺服務(wù)器Redis方案可以讓用戶請求打到不同后端節(jié)點而不丟購物車數(shù)據(jù)。這個對比做完后你會對無狀態(tài)設(shè)計和水平擴展有切身理解。每次從老技術(shù)遷移到新技術(shù)時試著在代碼注釋里標(biāo)注“這個注解背后做了哪些事如果不用框架我會怎么寫”——堅持這樣一個習(xí)慣技術(shù)底子會打得很扎實。我見過太多只會在Spring Boot里寫RestController、但連HTTP請求是怎么被Servlet容器接住的人。早餐外賣項目這種“裸寫”機會其實是性價比極高的自我訓(xùn)練。最后分享一點個人看法技術(shù)選型要看場景課程設(shè)計和畢業(yè)設(shè)計寫JSPServlet不是落后而是用最小的復(fù)雜度看清整個Web請求鏈路。你在IDEA里按部就班搭一次這個系統(tǒng)把Session透傳、事務(wù)邊界、Filter攔截這幾塊真正吃透再去學(xué)Spring Boot效率能翻倍。上面這些坑我基本都踩過一遍寫下來算是給后來者省點時間照著做應(yīng)該能少走不少彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月天综合视频| 激情婷婷六月天| 免费看成人747474九号视频在线观看| 色五月av| 丁香六月久久| 婷婷六月综合激情| 思思热在线视频99| 日日日,com| 五月停亭久久电影| 国产肥白大熟妇BBBB视频 | 成人αV视频免费观看| 啪到高潮激情丁香五月| 五月丁香六月婷婷亚洲激情综合| 91美女被操| 久久婷婷五月综合色丁香花| 六月婷婷五月丁香| 狠狠色婷婷777| 欧美色色色色色色色| 五月丁香六月成人| 亚洲性视频| 无码91中文字幕| 五月丁香好婷婷A片网| 日韩无码人妻一区二区三区综合| 国产亚洲色婷婷99精品| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | ri电影在线| 91狠狠色丁香婷婷综合久久狠丁香综合久久精品| 亚洲激情婷婷| 深爱五月婷婷| 99九九玖玖| 五月丁香婷在线| AA丁香综合激情| 激情五月婷色| 婷婷五月六月丁香| www,超碰| 日本成人综合| 五月婷网| 久久狠色噜噜狠狠狠狠97| 婷婷激情九月| 色五月婷婷婷婷婷婷婷婷婷婷| 39视频第二区| 久久99热这里只有精品| 丁香婷婷九月| 久久九九爽| 丁香五月激情婷婷婷婷在线观看| 九九热在线精品| 中文不卡一二区| 婷久看人爽| 天天搽天天射| 国产精品蜜臀99| 丁香五月狠狠在线观看| 日韩精品色| 五月色亭丁香| 5月丁香六月婷婷| 婷婷瑟五月天久久综合| 九九色综合九九色| 超碰人人超碰| 99国产精品久久久久久久久久久 | 99精品久| 婷婷午夜综合| 噜噜色五月| 精品久久人妻热| www。五月天激情| 99色在线观看免费| 天天色综合图片| 丁香五月婷婷激情网| 日本天天操| 婷婷五月色| 五月天婷婷成人网| 久99在线| 在线观看欧美| 99综合婷婷五月| 五月婷婷干| 婷婷久久综合久色| 丁香五月成人社区| 婷婷在线日韩综合| 久久性视频| 久久五月天合网| 激情丰满熟妇五月| 婷婷射综合| 婷婷色综合| 婷婷成人五月天| 激情五月婷婷视频| 91碰碰碰| 丁香久久久| 亚洲色网络| 第四色在线观看| 色色色色色色色五月| www.久久久久久久久久久| 久热九九| 五月丁香六月| 任我干视频在线观看| 欧美日比视频| 婷婷婷婷婷开心无码播放| 五月婷婷色情| 一婬一伦一区二区三区| 五月开心啪啪| 婷婷丁香五月综合| 美女激情综合| 女人天堂AV| 99这里只有精品视频| 婷婷中合| 人妻系列久久久久久久久久久| 久久久久人妻精选| 亚洲乱码日产精品BD| 97超碰色| 色噜综| 婷婷激情图片| 桃色五月婷婷| wWw色五月| www天天色天天射| 色色a| 亚洲色频| 狠狠狠狠狠草| 亚洲精品一区中文字幕乱码| 色婷婷五月天激情| 五月伊人网| 黄色国久久| 五月丁香啪啪啪综合网| 婷婷情色五月天| 欧美成人猛片AAAAAAA| 91精品国产日韩91久久久久久国模| 六月丁香啪啪| 成人VAV视频在线观看| 97操碰碰无码视频| 国产精品国产| 丁香五月停停基地| 狠狠狠狠狠| 一区二区成人电影免费播放| 婷婷五月中文字幕国产| 99视频| 丁香五月大香蕉| 99久久这里只有精品| 无码视频国内精品久久久| 人人操91| 欧美婷婷综合| 99re思思在线视频| 国产肥白大熟妇BBBB视频| 久久久香| 色色色色色色色色综合网| 人妻操日日| 色婷婷五月天小说网| 亚洲欧美婷婷五月色综合| 狠狠色狠狠色综合日日91| 丁香久久五月天视频在线观看| 色久天| 超碰9| 91久久综合亚洲鲁鲁五月天| 国产67194| 日本天堂免费99| 免费V片在线| 艾小青av| 综合网网欲色| 91色在线/日韩| 久久加勒比| 99这里都是精品6| 丁香五月天AV在线 | 思思久ren热| 色婷婷在线播放| 日本啪啪网| 99精品免费视频| 日hao1区| 九九热AV| 四LLL少妇BBBB槡BBBB| www.狠狠狠.com| 日韩免费视频| 亚洲精品激情| 伊人激情| 三日本无码| 五月天婷婷在线AN| 九九色综合网| 日本女色人人| 综合性爱网| 五月天久久综合| 爱射综合| 久久婷婷丁香六月天| 丁香99| 美女五月天| 久久久WWW| 玖玖在线视频| 久色五月丁香视频| 激情q青青草在线婷婷| 1024在线一区| 久久久www| www.yw尤物| 人妻少妇色综合| 夜夜噜夜夜奇| 五月丁香六月婷| 成AV人片一区二区三区久久| 五月亭亭网成人在线视频| 色五月婷婷av| 婷婷丁香综合在线| 深爱五月婷婷| 成人五月天视频| 色5月婷婷色| 狠狠色婷婷7777久| 一本色道久久综合狠狠躁小说| 天天色99| 91男同视频| 丁香五月人妻| 天天摸夜夜爽天天做| 月丁香久久久| 亚洲婷婷五月天| 色五月激情五月天| 激情五月天综合网| 久久精品亚洲一级牲爱综合| 无码四色色色| 91色九| 欧亚成人A片一区二区| 涩涩涩五月天| 日本九九热| 另类专区在线观看| 一本九九色| 久在热99| 欧亚洲在线高清视频| 欧美日韩二区在线| 内射爽无广熟女亚洲| 桃色激情网| 婷婷五月天成人娱乐| 亚洲第二AV| 久99视频| 五月婷综合| 九九热视频精品| 六月丁香啪| 九九热精品99| 欧美色色色色色色| 9 1在线视频| 麻豆AV一区二区三区| 熟女网站久久| 五月婷婷五月色| 婷婷成人综合五月| 色五月婷婷五月久久| 久久精品91视频| 久久综合婷婷激情| 大地9中文在线观看免费高清| 日本天天操| 五月香蕉婷婷| 婷婷五月天视频小说| 成人在线不卡| 婷婷色婷婷| av激情在线| 91婷婷丁香五月亚洲| 99re在线播放| 欧州婷婷五月天综合| 五月丁香影院| 无码激情AAAAA片-区区| 99国产精品久久久久久久久久久| 激情小说五月天| 99国产在线| 97碰啪啪| 婷婷综合五月天| 激情五月激情综合网| 激情AV| 综合网啪| 色婷婷基地| 久久婷丁香五月| 久久婷网| 婷婷99狠狠| 狠狠操狠狠爱| 久久婷婷精品| 中字幕视频在线永久在线观看免费| 婷婷色播婷婷| 五月久久综合| 色婷婷情片| Av免费网站在线| 爱狠射| 丁香婷婷激情四射五月| 九九av在线| 日本三级网址| 99啪啪视频| 五月婷网| 麻豆WWWCOM内射软件| 天天爽夜夜操| 亚洲AV在线免费看| 欧美毛卡| 他改变了拜占庭| 五月婷婷久久激情 | 欧美三级巜人妻互换| 日韩黄在免| 欧美色必爱| 草榴视频网| 亚洲综合99| 色婷婷丁香网| 欧美α√| 99热这里是精品| 国产精品人成A片一区二区| 久综合4| 久久大香蕉伊人| 一本久道综合99| WWW·天天操·视频?| 午夜爱爱爱成人| 婷婷五月丁香综合激情| 免费AV播放| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 亚洲激情久久| WWW·色色色·COM| 少妇婷婷五月天| 99视频在线精品免费观看2| 婷婷六月综合基地| 亚洲最大成人综合网720P| 1024在线视频| 久久亚洲色导航| 香蕉AV777XXX色综合一区| 狠狠干在线| 精品人妻伦九区久久AAA片| 婷婷五月天亚洲综合网| 天天摸.天天mo| 啪到高潮激情丁香五月| 色色色网站| 成人午夜在线视频| 米奇影视资源777狠狠色婷婷五月天激情网| 噜噜色com| 色五月在线播放| 大香蕉久久伊人网| 狠狠婷婷爱| 97操碰在线视频| 三人荫蒂添的好舒服A片| 亚洲国产网站| 五月伊人婷婷| 欧美怡红院黄站| www.97碰碰com| 天堂AV在线看| 一本色道久久88综合日韩精品| 国产综合久久久777777| 女人天堂 AV| AV大香蕉| 天天草人人摸| 九九RE视频在线精品| 啪啪啪丁香五月| 无码九九| 人人草人人舔| 99热九九这里只有精品| 99日本精品视频热| 99九九热在线观看| 亚洲不卡| 欧美日本黄色| 91九色中文字幕女在线观看| 亚洲另类毛片| 婷婷六月久久综合导航| 九热视频在线伦| 婷婷五月天视频小说| 天天狠狠夜夜狠狠2023| 伊人久久婷婷| 五月激情影视| 婷婷激情五月天天天开心| 夜夜撸夜夜骑| 日本97在线| 天天爽夜夜爽夜夜爽精品视频| 99国产在线精品视频| 同性gv国产精品一区二区| 国产成人网站在线观看| 婷婷色五月激情| 97色永久免费视频| 色一情一乱一乱一区91| 思思久久精品| 日本熟女三区| 91久久精品国产91性色TV| 狠狠操天天操天天操| 综合久| 99re思思热在线视频| www.99热| 日本五月婷婷久久久六月丁香| 天天色综网| 99热91| 色婷婷电影网| 五月天婷婷色播| 少妇高潮呻吟A片免费看软件| 久久AAAA片一区二区| 中文av网站| 五月婷婷色播视频| 95精品区一区二| 国产一区男女| 色玖玖玖| 性色五月天| 五月丁色AV| 日本不卡一区二区三区| 狠狠干综合网| 色婷婷在线播放| 婷婷六月丁香五月| 五月婷婷在线网站| 99免费青青蜜臀| 五月婷婷九九热| 婷婷中文在线| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 可以免费观看的av网址| 久久久国产精品黄毛片| 五月天色婷婷综合| 亭亭玉立国色天香| 99视频啪啪| 丁香五月六月婷婷综合| 欧洲亚洲最新精品| 碰人人操| 国产亚洲精品AAAAAAA片| 久久精品亚洲热| 亚洲无aV在线中文字幕| 亚洲亚洲人成综合网络| 99热这里只有精品8| www.久久| 青青草婷婷久久| 婷婷五月av| ss99热| 五月丁香综合影院| 亚洲乱码日产精品BD| 婷婷五月天干干| Www99热| 色偷偷五月天| 五月天婷久精视频| 丁香五月大片| 亚洲黄色影视| 99热九九在线| 久久无码成人| 网站免费一站二站| 国产精品色婷婷99久久精品| 91大屁股| 99亚洲综合| 色播五月丁香综合| 大色鬼综合| AV在线免费播放| 人妻尝试久久久久久久久久久久| 我爱大香蕉| 丁香婷婷五月综合欧美另类| 777米奇影视第四色| 婷婷的色色五月天| 深爱激情av| 婷婷色亚洲| 久久综合香蕉国产国产蜜臀AV| 深爱婷婷网| 高清资源站日A美A欧亚…| 激情五月丁香综合网站| 国产精产国品一二三在观看| 欧美97色| 另类激情首页| 激情性五月天免费小说视频| 亚洲第一色网站| 激情文学第四色婷婷丁香五月| 成人无码精品1区2区3区免费看| 中文字幕在线不卡| 九九热最新| 色五月六月婷婷| 99热欧美在线观看| 五月开心婷婷极品激情| 99ri在线观看视频| 伊人激情啪啪| 五月丁香 啪啪| 91干在线视频| 丁香五婷| 国产亚洲网站在线| 超碰国产av| 婷婷色综合中心站| 九九九激情网| 大香蕉视频婷| 色婷婷综合在线| 成人网在线观看视频| 天天爽人人综合免费7799| 91人妻人人做人碰人人爽九色| 五月丁香婷婷AV| 久久成人天| 色综合色欲综合天天免费 | 91欧美日韩综合| 天天se在线视频| 婷婷六月久久| 日本WWW九九九| 4399欧美另类视频| 六月丁香色色| www.色婷婷| 这里只有精品免费在线视频| 婷婷久久婷婷色五月| 去干网av| 激情丁香五月激情婷婷| 色综合色综合色综合| 婷婷五月骚厕所| 亚洲人妻五月丁香婷婷| 很很干天天干| 久久婷婷色综合| 超碰在线人妻| 五月婷婷激情综合| 99综合97| 五月香蕉婷婷| 婷婷五月成人色综合| 六月婷婷之青青草| 五月婷婷开心亚州在线| www.婷婷六月天| 丁香五月激情啪| 色香欲综合| 亚洲精品V天堂中文字幕| 国精产品一区一区三区免费视频| 色色六月| 五月丁香综合激情| 婷婷丁香激情五月| 免费亚洲婷婷五月| 这里只有精品视频在线| 五月桃花网综合| yazhochengrenavwang| 无码yw| 五月丁香综合啪啪| 99视频精品全部免费 在线| 激情色视频| 婷婷色操| 丰满老熟妇BBBBB搡BBB| 一本色道久久综合狠狠躁小说| 玖玖爱资源站| 天天橾日日橾夜夜橾17| 五月丁香无码| 大操人妻| 开心五月激情网| 极品五月天| 中文字幕丰满人妻无码专区| 欧美顶级少妇做爰HD| 婷婷综合伊人| 99热思思在线观看| 五月久久婷婷天堂视频| 国产肥白大熟妇BBBB视频| 综合色婷婷| 婷婷在线观看五月天在线视频| 五月婷婷花| 超碰国产在线观看| 久热精品免费视频4| 亚洲天99| 97丁香五月| 99热在线观看免费精品| 香蕉乱插| 丁香九月婷婷色| 久久九九网| 真实的国产乱XXXX在线91| 噜噜色婷婷| 久久只有18视频| 黄色AAAA韩国guochansanji| 国产日批视频免费播放| 色色色色色色色色色色色色色97| 韩国中文字幕91| 99操中文视频| 丁香五月中文字幕色播| 碰超亚洲| 亚洲一区先锋影音| 99久在线精品99re8热| 亚洲免费视频网站| 丁香五月a| 国产精产国品一二三在观看| 久久综合丁香五月| 91丨九色丨43老版熟女| 国产成人高清| 丁香六月婷婷综合缴| 白人荫道BBWBBB大荫道| 亚洲精品电影| 综合网啪| 五月婷久久草| 九九热精品| 久久男人网婷婷| 五月婷婷,六月激情| 思思re99视频在线观看| 丁香婷婷基地| 亚洲激情视频在线观看| 欧美天堂久久| www.婷婷亚洲基地| 综合99综合久久久久久久| 婷婷色五月综合| 色.五月综合网| 五月婷婷久久爱| 欧美在线视频99| 九九热a| 4438激情网| 五月天色色色色色| 这里只有精品免费视频| 超碰丁香五月| 1024操逼视频| 九月激情网| 久久久网站| 中文字幕在线免费观看视频| 丁香九月婷婷综合| 亚洲色情久久| 婷婷啪啪| 狠狠干2007| 成人国产欧美大片一区| 涩涩婷婷五月| 丁香五月婷婷激情蜜桃| 狠狠做深爱婷婷久久综合一区| 五月婷婷开心六月激情小说| 国产毛片精品一区二区色欲黄A片| 日本的α片xxxwww| 大伊香蕉精品视频在线| 丁香五月婷婷综合网| 婷婷五月丁香四射| 天天操比比| 婷婷九月在线| www.超碰| 五月丁香亚洲综合网| 五月丁香婷婷激情图片| 久久怡红院| 九九热自拍| 人人摸人人| 婷婷五月激情片| 任你弄在线视频免费| 五月丁香六月婷婷无码| 一级性感黄色内射视频| 丰满老熟妇BBBBB搡BBB| 丁香五月成人av| 欧美日韩成人免费在线| 免费AV播放| 99精品久久久久久久婷婷久久| 1级欧美日韩| 天天肏高清在线| 97人人干人人操| 少妇熟女视频一区二区三区| dingxiangtingtingliuyue| 久热99久热| www狠狠| 99热思思在线观看| 久久香蕉婷婷| 五月天色五月| 99综合网| 丁香月五月天婷婷久久| 日韩xx在线| 人妻久久久久久久| 亚洲激情97五月天| 丁香六月婷婷综合激情欧美| 色色婷婷婷丁香五月天| 婷婷性爱| w婷婷五月婷婷w| www.狠狠操.con| 伊人9草在线观看| 久操热线| 久久五月天色婷婷| 天天草天天日| 久久五月丁香| 亚洲免费在线观看岛国| 色综合天天| 99综合网| 色噜综| 99久久婷婷| 噜噜五月天综合| 色色色999| 日日撸夜夜操| 这里只有九九精品| 丁香无五月网| 综合久久9| 无毒黄色网址| 久久在线视频免费观看| www.zbzhongsen.com| 国产精品久久7777777精品无码| 天天舔天天插天天爱| 国产色香蕉精品五夜婷| 超碰婷婷五月| 少妇性按摩无码中文A片| 国产一区18| 天天久综合网永久入口18| 亚洲色频| 亚洲综合婷婷| 九色91国产| 欧美色色网| 五月天婷爱综合| 色综久久AV| 91精品久久久久久77777| 九月激情综合婷婷| 超级碰91| 涩玖玖免费视频| 色五月婷婷成人| 偷偷与邻居做爰完整视频| www色色com| 猫咪伊人久久| 五月丁香六月婷婷久久肏| 色五月婷婷小说亚洲中文字幕组| 五月天俺去也| 五月婷婷丁香狠狠撸久久| 婷婷五月天Av| 亚洲成色综合网站免费观看| 再次出发二| 九九热在线亚洲免费视频| aa久久| 婷婷五月天黄色网址| 一级性感毛片| 热99在线精品| 五月婷婷啪啪网| 玖玖爱综合网| 色色婷婷丁香| 激情五月天久久丁香| 色婷婷免费视频| 欧美视频五区| 狠狠综合久久| 99爱在线| 色 五月俺去也| 丁香婷婷六月激情综合| 婷婷五月天免费视频在线观看| 亚洲激情色色| 婷婷五月天激情开心网| 欧美天堂久久| 日日干天天| 色婷婷成人做爰A片免费看网站 | 激情六月日韩| 欧美中文五月天| 99ri视频在线播放| 五月丁香精品| 五月丁香另类图片| 这里只有精彩小视频视频网站| wwW天天干| 亚洲99手机免费看视频| 怡红院一二三| 色情综合网| 91精品综合久久久久久五月丁香| 欧美怡红院黄站| 亚洲人成网站999久久久综合| 久久九九@| 五月婷婷六月丁香激情深爱| 国产精品久久久久久五月天加勒比 | 香蕉久久av一区二区三区| 我淫我色婷婷五月天激情四射| 色情激情五月婷婷| 久久久久久激情| 99热国内| 五月天婷婷色综合| av中文在线| 五月丁香婷婷五月色| 久久色9| 男人天堂伊人五月丁香| 79精品视频| 丝袜人妻| 丁香花狠狠婷婷亚洲中文字幕| 婷婷涩涩五月天| 丁香久久AV| 99综合网| 国产AV熟妇人震精品一品二区| 99热很操老逼| www.天天干.com| 丁香六月在线| 国外亚洲成AV人片在线观看| 大香AV| 开心五月丁香综合久久| 婷婷色片| 亚洲欧洲美女在线观| 色五月91| 激情五月色播五月| 欧美性生交A片免费看| 婷婷丁香五月激情密臀av| henhencao国产在线| 涩婷婷五月天在线精品视频| 国产精品久久久久久久久久久久| 日本一级特黄大片AAAAA级| 啪啪啪五月天| 性综合网| 久草视频一,二三四| 99热在线观看这里只有精品| 色五月首页| 五月天狠狠色| 婷婷五月花丁香| 色伦专区97中文字幕| 激情久久久久久| 天天狠狠夜夜狠狠2023| 天天色综网| 日韩免费乱轮网站| 9l视频自拍9l九色成人| 99热费观看| 激情五月婷婷六月丁香| 99超超碰| 3pAV| 99热只有这里有精品| 久99久精品视频| 激情五月天影院| av五月天婷婷丁香| 色五月成人在线| 丰满老熟妇BBBBB搡BBB| 久热2025无码| 97操碰| 中文网AV| 日韩aaaaa| 久/久精品99看9| 夜夜 操无码| 久久新| 五月丁香成年黄色| 激情视频综合| 色噜噜狠噜噜视频| 91丁香| 婷婷天天婷婷天天澡| 丁香五月激情五月色综合| 欧美va| 婷婷丁香中文字幕| 天天操夜夜爽| 久热精品9999| 激情五月小说婷婷| 99视频在线观看网址| 五月婷婷婷丁香播| 综合性爱网| 九九热自拍| 秋霞性爱AV| 丁香五月电影| 日韩人妻无码一区二区| 99在线精品免费视频| 色综合久久88色综合天天人守婷| 97干干干丁香| 伊人AV五月婷| 狠狠综合区| 综合狠狠干| 99re热在线视频| 99热都是精品| 亚州视频九九99| 99久久久精品| 丁XX 成人| AV在线资源| 天天操天天插| 操逼在线视频| 成人一区在线观看| 97久久久久| 天天日天天干天天爱| 欧美色一级色| 激情丁香五月天图片| 98永久精品| 五月丁香| 久久机只有这里精品| 丁香五月天堂网AV| 粉嫩av懂色av蜜臀av熟妇| 2014天天爽| 久9精品视频在线| 日本九九网| 日韩婷婷五月| 99久久超级| 丁香五月激情啪| 欧美色骚婷婷五月天| 99久久婷婷国产综合亚洲| 欧美视频五区| www.91有码.com| 9视频1在线| 婷婷综合激情| 丁香六月情| 怕怕視頻| 天天艹| 久久人人看| 婷婷丁香色无五月| 激情丁香婷婷| 久久久五月天婷婷| 欧美丁香婷婷五月| 色婷婷六月丁香综合欲精品| av九九| 色99xx| 日本天天操| 久久免片| 亚洲五月天综合| CAoub青青超碰| 国产69久久久欧美黑人A片| 这里只有精品1| 99re热| 99色日本| 婷婷5月久久综合网站| 少妇高潮一区二区三区99欧美| 狠狠干在线视频| 情色五月天网站| 91综合网| 久久精品一区二区三区四区| 九九99免费视频| 色狠狠色噜噜AV天堂五区消防| 人人草公开操| 国内一级精品| ww超碰在线| 国产肥白大熟妇BBBB视频| 另类激情五月| www.天天日| 亚洲乱码成人| 狠狠色丁香五月婷巨| www.com.色色| 9热成人在线视频| 九九色色| 欧美人妻一区二区| 婷婷的色色五月天| 日日夜夜婷婷| 五月丁香激情六月| 五月花成人网| 综合在线网| 成人短视频在线观看| 99久久久久久www| 情色五月天 网站| 久久人妻熟女一区二区| 99精品无码| 亚洲色碰| 五月婷婷天堂| 五月天婷综合| 九九热精品| 很很干天天干| 97丁香五月| 337午夜福利| 婷婷六月天亚州| 婷婷五月开心中文字幕色| 天天操夜夜爽天天操| 操碰99| 五月丁香性爱| 一区视频网站| 91ncom.色| 91美女被操| 日韩欧洲亚洲| 色婷婷影院| 九九色精品| 青草青草久热这里只有精品| 久久久中文| 妇激情基地| 婷婷五月四狠狠| 99综合视频在线| 五月婷婷新网站| 五月丁香激情综合啪| 久热只有这里有精品| 丁香色五月婷婷17C| 日本女天天爽| www。五月天。com| 色五月天激情| 色99欧洲色19| 激情五月综合婷婷| 人人人操| 婷婷丁香五月亚洲17cao| 色色色综合| 最近中文字幕在线中文视频| 国产偷人爽久久久久久老妇APP| 国产又色又爽又黄又免费| 国产午夜精品一区二区三区四区| 丁香五月五月婷婷欧美大香蕉| 国产AV影片| 久热爱大香蕉在线蜜臀悦色| 天天操五月天| 婷婷六月啪啪| 久久激情综合| 色日本网| 婷婷射图| 99色在线| 大大香蕉综合在线| 91精品无码久久久久久五月天| 色~性~乱~伦~噜| 亚洲丁香五月综合| 五月天婷婷五月| 99视频这里有精品| 综合色色色| 色五天综合| 五月激情综合性爱| 五月婷婷六月丁香免费| 天天射天天射一道本日本社区 | 少妇高潮呻吟A片免费看软件| 激情综合视频| 色婷婷久久天天性爱| 久久99激情| 婷婷五月激情在线视频| 五月婷婷亚洲| 激情五月婷婷| 二级黄色毛片| 99视频精品视频| 婷婷五月激情视频在线| 97在线视频观看| 亚洲愉拍99热成人精品| 婷婷五月天丁香社区| 婷婷色五月综合丁香| 79色色色色| 激情五月婷婷五月| 色色色色色九九九九九| 97精品综合久久| 常久最新免费的色吊丝| 亚洲天堂久久| 影音先锋AV资源男人站| 久久婷婷五月天懂色| 欧洲第一久色| 五月婷婷六月色| 六月婷婷操逼| 蜜臀av无码久久久久久久久| 色5月丁香婷婷| WWW.国产| 色色激情五月| 开心激情站婷婷五月天| 婷婷中文字幕| 久久狠婷婷| WWW、日本色丁香、co m| 丁香五月欧美午夜视频| 午夜无码熟熟妇丰满人妻| 99热在线精品播放| cc精品国产性传播| 婷婷亚洲综合| 欧美色色色色色色色| 天天操夜夜爽歪歪| 专区无日本视频高清8| 五月婷在线影院| 日本色色色| 性做爰1一7伦| 99re熱| 色欲天天综合| 久久中国毛毛片爱久久| 色亚洲婷婷| 丁香五月婷婷网| 99玖玖在线视频| 色婷婷色婷婷五月| 思思re最新视频| 色综合色综合婷婷热| 超碰三级片| 日本在线wwww| 五月天婷婷深深爱| 天天色情站| 婷婷激情丁香五月天综合| 棕合影院色色| 久久综合色五月| 婷婷五月天免费视频| 熟女色色一区二区| 五月婷庭丁香在线| 激情婷婷五月天| 狠狠舔| 九九亚洲视频| 色婷婷激情| 国产激情在线| 丁乡久久| 噜噜狠狠色综合久| 久久伊人婷| 婷婷五月天开心网| 婷婷丁香精品视频在线观看| 俺去也在线www色官网| 女人被躁到高潮嗷嗷叫小| 色婷婷欧美在线| 这里只有精品视频| A一级操| 婷婷五月天福利| 天天综合久久| 久色激情| 99热这只有| 国产乱妇无乱码大黄AA片| 久婷婷五月丁香在线观看| 性爱网五月婷婷| 婷婷在线视频| 色婷婷狠狠爱| 天天爽天天日| 色9色| 91人在线观看| 婷婷五月天婷婷| 婷婷丁香六月天激情四射网| 亚洲色综合性| 亚洲婷婷丁香五月| 婷婷五月免费视频| 婷婷丁香成人五月天| 婷婷射丁香| 九九国产视频| 亚洲精品99| 五月花成人网| 国产性爱大片久久| 五月天婷婷成人| 成人综合视频在线| 婷婷色网| 天天爱天天做综合| 在线观看视频1区| 激情五月婷| 五月天婷婷av| 成人视频网| 日本VA视频| 操逼视频一区| 99爱在线视频| 淫荡综合网| 九九精品99久久久| 九九热在线99| 美女主播野战视步页| 五月丁香综合久久夜夜| 激情婷婷丁香五月天| 蜘蛛女免费观看完整版高清电影| 天天狠狠综合精区| 噜啊噜在线| 思思99热热热99| 色综久久久| 伊人超碰| 久久996re热这里只有精品无码| 丁香五月婷婷老师网站| 日本在线视频播放91| 狠色狠色狠狠色综合网| 九九无毛| 五月天综合婷婷| 99人人操人人摸| 99热精品观看| 欧美成人AAA片一区国产精品| 日本久久爱| 91婷婷在线| 色欲AVV| 大香蕉伊人久久| 丁香激激情网| 先锋五月婷婷丁香草草| .青娱乐天天操B| 久9久9久9久9久9久9| 五月丁综合在线观看| 黑人熟妇一区二区三区| 夫妇交换刺激做爰| www.91在线观看| 天天色色婷婷| 亚洲综合99| 久久婷婷五月综合色和| 色播五月婷婷| 伊人在线视频| 狠狠色五月| 99自拍视频| se.久久视频在线观看| 另类少妇人与禽zOZZ0性伦| 综合99视频| 日日噜狠狠色综合久久| 五月丁香激情婷婷| 五月婷婷花| 天天玩夜夜操天天爽| 五月丁香久久色| 九月激情婷婷丁香| 深爱五月婷婷| 色色色综合网| 五月丁香激情在线| 天天日夜夜高潮| 五月天天堂久久| 欧美人人草草| 噼里啪啦完整版中文在线观看| 五月丁香色婷婷久久| 五月婷婷丁香综合| 人人舔人人色人人高潮| 五月婷婷久久久| 欧美日韩国产一区二区| 亚洲mm免费| 欧美三级巜人妻互换| 深爱综合网| 色五月激情| www.99情趣网| 激情九九这里只有精品| 五月婷久久| 天天做天天爱天天日| www.91九色| 九九青草热| 夜夜爱爱亚洲| 蜜乳AV成人| ztEJj| 在线看片h站| 青青久在线视频免费观看| 婷婷社区五月天| 久久三级视频| 色噜噜综合网| 色碰碰视频| 五月丁香亭亭操逼| 色五月欧美| 日本五月天激情| 丁香五月天论坛| 色女伊人| 久久精品只有这| 午夜丁香五月天综合| 天天色天天色天天色天天色天天色| 丁香五月激情月| 欧美性爱特黄一级aaaassss| 婷婷丁香五月精品| 伊人日日干| 26uuu欧美亚洲日韩| 五月色 亚洲| 天天摸天天爽| 五六月丁香激情视频| 五月婷婷m| 亚洲精品色色色| 天天做 天天爱| 九九免费精品| 激情丁香五月天| 色五月大| 色婷婷视频| www久久99| 国产又色又爽又黄又免费| 天天色综网| 91怕怕网| 久久视频婷婷| 中文字幕不卡+婷婷五月| 久久婷色| 好好日激情五月天| 丁香五月婷婷乱| 激情婷婷丁香色五月综合| 成人片在线播放| 五月丁香婷婷综合| 亚洲偷| Av在线不卡一区| 久色五月天| 日本一级一级一级一级| 蜜桃婷婷丁香五月天狠狠久久综合| 五月天色官网| 欧美成人网99网| 人人操97| 色色国产| 激情综合九| 97在线/亚洲| 新久久五月天激情| 五月天中文网| 六月丁香网| 久久五月天综合| 欧美69久成人做爰视频| 99热www| 99熟女| 99久久er| 色婷婷国产精品综合在线观看| 99热6这里只有精品| 一二线视频 另类| 成人在线视频一区| 色视频2025| 婷婷五月花西瓜| 伊综合蕉| 国产精品人妻欲求不满| 内射丰满人妻| 婷婷五月天网址| 日日干夜夜干| 91丨九色熟女丨首页| 五月天色播网| 婷婷五月av| 久久婷婷视频| 96精品国产综合久久久久久| 日本久久天堂| 99青青草| 综合色播| 九月av在线| 天天舔夜夜操www com| 色XX综合网| 婷婷五月婷婷| 免费成人中文字幕| www.夜夜操.con| 婷婷久久色| 最近中文字幕大全免费版在线 | 超碰色女人| 丁香五月aV| 天天摸天天肏| 久草婷妨| 五月天开心激情网色欲无码| 人妻精品一区二区三区| 97色色色| 国产精典视频在线观看| 婷婷五月天亚洲丁香| 丁香五月激情综合| 操比激情五月综合| 亚洲激情免费视频| 久久99视频| 99热网址| 激情五月,婷婷五月,丁香五月| 亚洲综合婷婷| 亭亭色网| 一级性爱视频| 精品久久久91久久影视网| 九月丁香| 久久婷婷五月天激情| 无码字幕中文| 综合激情五月丁香| 久热这里只有精品6| 99久久精品国产色欲| 天天色综合图片| 欧美性生交xXxX久久久| 五月丁香爱婷婷深深| 热久久91| 欧美日韩成人在线免费| 俺去也在线www色官网| 嫩草AV久久伊人妇女超级A | 69综合在线| 99er6热在线观看精品6| 欧美成人精品A片免费一区99| 97香蕉碰碰人妻国产欧美| 五月激情婷婷国产精品久久久久久 | 婷婷娌伦网| 日本人妻操| 色噜噜婷婷| 色婷婷成人色网| 第四色婷婷色五月| 国产成人精品一区二三区熟女在线 | 丰满老熟妇BBBBB搡BBB| 五月天激情综合网站| 99在线观看| 丁香花五月天激情| 久操综合| 美女黄频aⅴ视频| 久草a片| 色五月婷婷自拍| 丁香婷婷性久久| 无码髙清| 玖玖午夜视频| 99玖玖在线视频| 色婷久九| 影视av久久久噜噜噜噜噜三级| 久久精品系列| 大香蕉欧美在线| 色婷婷激情四射视频| 婷婷五月综合色拍| 91无码视频| 五月丁香| 97色色视频| 婷婷狠狠五月综合|