亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

微信小程序旅游服務(wù)后端:Java Spring Boot與數(shù)據(jù)庫(kù)設(shè)計(jì)實(shí)戰(zhàn)解析

微信小程序旅游服務(wù)后端:Java Spring Boot與數(shù)據(jù)庫(kù)設(shè)計(jì)實(shí)戰(zhàn)解析 簡(jiǎn)介這份資源是基于微信小程序的旅游服務(wù)軟件完整項(xiàng)目后端采用Java與SSM框架開(kāi)發(fā)配套數(shù)據(jù)庫(kù)腳本面向計(jì)算機(jī)相關(guān)專(zhuān)業(yè)畢業(yè)設(shè)計(jì)或初學(xué)小程序全棧開(kāi)發(fā)的讀者。項(xiàng)目可在IntelliJ IDEA及微信開(kāi)發(fā)者工具中直接導(dǎo)入運(yùn)行數(shù)據(jù)庫(kù)為MySQL 8.0環(huán)境配置已做精簡(jiǎn)適合快速啟動(dòng)學(xué)習(xí)。壓縮包共22個(gè)文件包括19張界面截圖、2個(gè)源碼壓縮包和1個(gè)SQL數(shù)據(jù)庫(kù)文件整體約61.15MB結(jié)構(gòu)清晰便于按模塊查閱。功能覆蓋旅游攻略、旅游資訊、景點(diǎn)搜索、酒店信息、論壇中心、門(mén)票與酒店預(yù)訂、推薦路線(xiàn)、發(fā)帖互動(dòng)及用戶(hù)管理等從用戶(hù)端到后端管理均有體現(xiàn)可幫助理解小程序與Java后端的數(shù)據(jù)交互、SSM框架分層設(shè)計(jì)和數(shù)據(jù)庫(kù)建模。目前已有2604人學(xué)習(xí)下載對(duì)有畢業(yè)設(shè)計(jì)需求或想系統(tǒng)掌握旅游類(lèi)小程序開(kāi)發(fā)流程的讀者具有較高參考價(jià)值。1. 微信小程序旅游服務(wù)軟件為什么后端Java開(kāi)發(fā)才是項(xiàng)目源碼的重頭戲做旅游類(lèi)微信小程序的人十個(gè)里有八個(gè)卡在同一步小程序端代碼拿到了數(shù)據(jù)庫(kù)文件導(dǎo)入了后端卻怎么都跑不起來(lái)。這個(gè)標(biāo)題其實(shí)點(diǎn)透了畢設(shè)和課設(shè)的核心——前端只是皮相真正的設(shè)計(jì)工作藏在Java后端和數(shù)據(jù)庫(kù)表結(jié)構(gòu)里。這篇文章從項(xiàng)目源碼的組織形式出發(fā)講清楚后端Spring Boot項(xiàng)目怎么搭、數(shù)據(jù)庫(kù)怎么設(shè)計(jì)、小程序怎么對(duì)接再把最容易翻車(chē)的幾個(gè)坑提前給你打上預(yù)防針。適合正在做這類(lèi)項(xiàng)目的學(xué)生也適合想快速上手前后端分離項(xiàng)目實(shí)戰(zhàn)的初級(jí)Java開(kāi)發(fā)。跟著走一遍你會(huì)知道這套方案能不能落地、值不值得往里投入時(shí)間。2. 搭起Spring Boot后端骨架選型、包結(jié)構(gòu)與第一個(gè)能跑的接口2.1 為什么選Spring Boot MyBatis-Plus而不是SSH或Servlet旅游服務(wù)軟件這類(lèi)業(yè)務(wù)核心是用戶(hù)、景點(diǎn)、線(xiàn)路、訂單四組關(guān)系業(yè)務(wù)邏輯并不算復(fù)雜但接口數(shù)量多、表與表之間的關(guān)聯(lián)也多。Spring Boot的自動(dòng)配置和Starter機(jī)制能省掉大量樣板代碼對(duì)拿到項(xiàng)目源碼后想快速跑起來(lái)的場(chǎng)景特別友好。更重要的一點(diǎn)是Spring Boot 2.x MyBatis-Plus的組合在中小型項(xiàng)目和畢業(yè)設(shè)計(jì)里已經(jīng)是事實(shí)標(biāo)準(zhǔn)網(wǎng)上能搜到的報(bào)錯(cuò)和解決方案都很多遇到問(wèn)題不至于卡死。MyBatis-Plus的價(jià)值在于把單表CRUD的代碼幾乎抹平了。景點(diǎn)表、評(píng)論表這類(lèi)低頻變更的單表操作不需要為每個(gè)實(shí)體寫(xiě)一套insert、select、update繼承一個(gè)BaseMapper就完事。旅游項(xiàng)目里最高頻的列表分頁(yè)查詢(xún)用它的Wrapper構(gòu)造條件兩行代碼就能寫(xiě)出來(lái)。我不建議在這個(gè)階段引入過(guò)度復(fù)雜的架構(gòu)。很多人拿到源碼跑不起來(lái)往往不是因?yàn)楣δ芏喽且驗(yàn)槿薉ubbo、Redis緩存、消息隊(duì)列這些重東西。旅游服務(wù)軟件的核心訴求是能跑、能講、能演示技術(shù)棧收斂到Spring Boot MyBatis-Plus MySQL 微信小程序原生開(kāi)發(fā)已經(jīng)足夠撐起整個(gè)項(xiàng)目。2.2 包結(jié)構(gòu)劃分按業(yè)務(wù)模塊劃而非按技術(shù)層次劃拿到源碼后第一件事是看包結(jié)構(gòu)。我見(jiàn)過(guò)不少翻車(chē)的項(xiàng)目把controller、service、mapper按技術(shù)棧堆三層結(jié)果一個(gè)旅游項(xiàng)目幾十個(gè)接口全塞在一個(gè)Controller里改一個(gè)字段要翻十分鐘。常見(jiàn)的做法是按業(yè)務(wù)模塊分包結(jié)構(gòu)大概是這樣com.example.travel ├── config // 全局配置跨域、攔截器、文檔配置 ├── controller // 對(duì)外接口auth、spot、line、order ├── service // 業(yè)務(wù)邏輯 │ └── impl ├── mapper // MyBatis-Plus的Mapper接口 ├── entity // 數(shù)據(jù)庫(kù)實(shí)體 ├── dto // 前端入?yún)?duì)象 ├── vo // 返回給前端的視圖對(duì)象 └── common // 統(tǒng)一返回結(jié)構(gòu)、異常處理controller按auth、spot、line、order四個(gè)模塊拆開(kāi)每個(gè)Controller只負(fù)責(zé)一類(lèi)資源的接口。entity和dto分開(kāi)是很多新手容易忽略的細(xì)節(jié)——如果數(shù)據(jù)庫(kù)字段直接暴露給前端一旦表結(jié)構(gòu)調(diào)整小程序端就得跟著改。用VO把返回字段裁剪一下是前后端分離項(xiàng)目實(shí)戰(zhàn)里最基本的解耦手段答辯時(shí)也能講出設(shè)計(jì)依據(jù)。2.3 最小可運(yùn)行配置pom.xml與application.yml不管項(xiàng)目源碼長(zhǎng)什么樣最終跑起來(lái)都靠這兩個(gè)文件。先看pom.xml的核心依賴(lài)我用Maven坐標(biāo)的方式列出來(lái)dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdorg.springdoc/groupId artifactIdspringdoc-openapi-ui/artifactId version1.7.0/version /dependencyspring-boot-starter-web提供MVC能力mybatis-plus-boot-starter負(fù)責(zé)數(shù)據(jù)庫(kù)操作mysql-connector-java在運(yùn)行期加載驅(qū)動(dòng)。springdoc是Swagger的OpenAPI實(shí)現(xiàn)畢設(shè)答辯時(shí)直接打開(kāi)/swagger-ui.html就能看到一個(gè)可交互的接口文檔頁(yè)面比現(xiàn)場(chǎng)翻代碼講更直觀。注意MyBatis-Plus 3.5.x配Spring Boot 2.7是經(jīng)過(guò)大量項(xiàng)目驗(yàn)證的搭配版本不要隨便升到4.x否則很多配置項(xiàng)會(huì)變。application.yml里最關(guān)鍵的三個(gè)配置是數(shù)據(jù)源、MyBatis-Plus的駝峰映射、日期格式server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/travel_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0url里必須帶serverTimezoneAsia/Shanghai否則MySQL 8.x會(huì)直接報(bào)時(shí)區(qū)錯(cuò)誤這是最常見(jiàn)的啟動(dòng)失敗原因之一。map-underscore-to-camel-case打開(kāi)后數(shù)據(jù)庫(kù)的spot_name字段能自動(dòng)映射到實(shí)體的spotName屬性不用寫(xiě)繁瑣的resultMap。日志輸出打開(kāi)開(kāi)發(fā)階段每個(gè)SQL都會(huì)打印到控制臺(tái)排查問(wèn)題時(shí)這是第一手線(xiàn)索。到這里一個(gè)最小后端已經(jīng)具備跑起來(lái)的條件。寫(xiě)一個(gè)測(cè)試接口驗(yàn)證RestController RequestMapping(/api/health) public class HealthController { GetMapping public ResultString health() { return Result.success(travel backend is running); } }調(diào)用GET /api/health能返回success就說(shuō)明骨架通了。這里的Result是統(tǒng)一返回包裝類(lèi)后面的所有接口都會(huì)復(fù)用這個(gè)結(jié)構(gòu)。我不建議在這個(gè)階段急著往下寫(xiě)業(yè)務(wù)先把跨域配置和全局異常處理加上。小程序端本身沒(méi)有CORS機(jī)制的限制但如果你用H5方式調(diào)試頁(yè)面CORS就繞不開(kāi)。在config包下加一個(gè)WebMvcConfigurer實(shí)現(xiàn)類(lèi)addCorsMappings里放行所有路徑和本地開(kāi)發(fā)端口即可。提示如果啟動(dòng)時(shí)提示8080端口被占用先執(zhí)行netstat -ano | findstr 8080找到占用進(jìn)程再?zèng)Q定是換端口還是清理進(jìn)程。至此項(xiàng)目源碼的后端部分已經(jīng)從一堆文件變成了一個(gè)能響應(yīng)的服務(wù)。接下來(lái)進(jìn)入真正有設(shè)計(jì)含量的部分——數(shù)據(jù)庫(kù)表結(jié)構(gòu)這決定了景點(diǎn)、線(xiàn)路、訂單三塊業(yè)務(wù)能不能在答辯時(shí)講出邏輯閉環(huán)。3. 旅游業(yè)務(wù)數(shù)據(jù)模型用戶(hù)、景點(diǎn)、訂單三張核心表的設(shè)計(jì)細(xì)節(jié)3.1 用戶(hù)表與微信登錄字段的設(shè)計(jì)不含支付功能的旅游小程序用戶(hù)表不需要存密碼。核心字段是openid、昵稱(chēng)、頭像、手機(jī)號(hào)。openid是微信體系下用戶(hù)的唯一標(biāo)識(shí)小程序端通過(guò)wx.login拿到code后端用code換openid這張表就是整個(gè)登錄體系的錨點(diǎn)。CREATE TABLE user ( id bigint(20) NOT NULL AUTO_INCREMENT, openid varchar(64) NOT NULL COMMENT 微信openid, nickname varchar(64) DEFAULT NULL COMMENT 昵稱(chēng), avatar varchar(255) DEFAULT NULL COMMENT 頭像URL, phone varchar(20) DEFAULT NULL COMMENT 手機(jī)號(hào), gender tinyint(1) DEFAULT 0 COMMENT 性別 0未知 1男 2女, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted tinyint(1) DEFAULT 0, PRIMARY KEY (id), UNIQUE KEY uk_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用戶(hù)表;openid字段一定要加唯一索引。同一用戶(hù)重復(fù)調(diào)用登錄接口時(shí)后端應(yīng)該按openid去更新用戶(hù)信息而不是重復(fù)插入。deleted字段配合MyBatis-Plus的邏輯刪除用戶(hù)注銷(xiāo)時(shí)不會(huì)物理刪除數(shù)據(jù)歷史訂單還能關(guān)聯(lián)上。create_time和update_time直接由數(shù)據(jù)庫(kù)維護(hù)不需要在實(shí)體里手動(dòng)賦值MyBatis-Plus的insert和update語(yǔ)句會(huì)自動(dòng)跳過(guò)這兩個(gè)字段。3.2 景點(diǎn)與線(xiàn)路別把兩張表合成一張旅游項(xiàng)目的核心資源是景點(diǎn)和線(xiàn)路。景點(diǎn)是靜態(tài)資源線(xiàn)路是動(dòng)態(tài)組合。新手常見(jiàn)的設(shè)計(jì)錯(cuò)誤是把線(xiàn)路直接做成一個(gè)字段存景點(diǎn)ID列表比如line_detail字段存1,2,3,4看起來(lái)方便但要查某個(gè)景點(diǎn)被哪些線(xiàn)路包含時(shí)必須用LIKE %2%去模糊匹配——不僅慢還會(huì)匹配錯(cuò)誤。正確的做法是線(xiàn)路主表加一張線(xiàn)路-景點(diǎn)關(guān)聯(lián)表CREATE TABLE line_spot ( id bigint(20) NOT NULL AUTO_INCREMENT, line_id bigint(20) NOT NULL COMMENT 線(xiàn)路ID, spot_id bigint(20) NOT NULL COMMENT 景點(diǎn)ID, sort_order int(11) DEFAULT 0 COMMENT 游覽順序, PRIMARY KEY (id), KEY idx_line_id (line_id), KEY idx_spot_id (spot_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT線(xiàn)路景點(diǎn)關(guān)聯(lián)表;sort_order字段記錄景點(diǎn)的游覽順序這是旅游線(xiàn)路區(qū)別于一般商品列表的地方。查詢(xún)線(xiàn)路詳情時(shí)按line_id過(guò)濾、sort_order排序就能還原出一條完整的游覽動(dòng)線(xiàn)。關(guān)聯(lián)表是數(shù)據(jù)庫(kù)多對(duì)多關(guān)系的標(biāo)準(zhǔn)拆法答辯時(shí)能講清楚這一點(diǎn)比堆技術(shù)名詞更讓老師信服。景點(diǎn)表本身相對(duì)簡(jiǎn)單但要注意幾個(gè)字段的類(lèi)型取舍。景點(diǎn)描述用TEXT不要用VARCHAR(255)因?yàn)檎鎸?shí)景點(diǎn)的介紹文案動(dòng)輒幾百字。封面圖URL用VARCHAR(512)現(xiàn)在云存儲(chǔ)的URL普遍帶簽名參數(shù)長(zhǎng)度經(jīng)常超255。景點(diǎn)經(jīng)緯度用DECIMAL(10,6)而不是FLOAT避免浮點(diǎn)精度導(dǎo)致地圖定位偏移。3.3 訂單表價(jià)格快照與狀態(tài)機(jī)的設(shè)計(jì)價(jià)值訂單表是整個(gè)項(xiàng)目里數(shù)據(jù)設(shè)計(jì)含金量最高的部分。旅游訂單的特點(diǎn)是下單時(shí)的價(jià)格和出行時(shí)的價(jià)格可能不同因此必須做價(jià)格快照。如果訂單表只存line_id再去關(guān)聯(lián)查詢(xún)當(dāng)前價(jià)格一旦后臺(tái)改了線(xiàn)路價(jià)格歷史訂單就失真了。CREATE TABLE order ( id bigint(20) NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 訂單號(hào), user_id bigint(20) NOT NULL COMMENT 用戶(hù)ID, line_id bigint(20) DEFAULT NULL COMMENT 線(xiàn)路ID, spot_id bigint(20) DEFAULT NULL COMMENT 景點(diǎn)ID單景點(diǎn)門(mén)票時(shí)使用, title varchar(100) NOT NULL COMMENT 訂單展示名稱(chēng)快照, cover varchar(512) DEFAULT NULL COMMENT 封面圖快照, price decimal(10,2) NOT NULL COMMENT 成交單價(jià)快照, quantity int(11) DEFAULT 1 COMMENT 數(shù)量, total_amount decimal(10,2) NOT NULL COMMENT 成交總價(jià), contact_name varchar(20) NOT NULL COMMENT 聯(lián)系人, contact_phone varchar(20) NOT NULL COMMENT 聯(lián)系電話(huà), travel_date date DEFAULT NULL COMMENT 出行日期, status tinyint(2) DEFAULT 0 COMMENT 0待支付 1已支付 2已完成 3已取消, create_time datetime DEFAULT CURRENT_TIMESTAMP, update_time datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted tinyint(1) DEFAULT 0, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_user_id (user_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT旅游訂單表;title、cover、price這三個(gè)快照字段是重點(diǎn)。下單那一刻的線(xiàn)路名稱(chēng)、封面、價(jià)格被復(fù)制到訂單表里之后后臺(tái)修改線(xiàn)路信息訂單數(shù)據(jù)不受影響。這種做法在電商系統(tǒng)里叫快照模式是答辯時(shí)實(shí)打?qū)嵉脑O(shè)計(jì)亮點(diǎn)。status字段用tinyint存數(shù)字狀態(tài)值比用字符串更節(jié)省空間也便于后期擴(kuò)展?fàn)顟B(tài)機(jī)。建議在Java代碼里用枚舉類(lèi)維護(hù)這些狀態(tài)值而不是在業(yè)務(wù)代碼里寫(xiě)0、1、2這種魔法數(shù)字。3.4 數(shù)據(jù)庫(kù)文件交付SQL腳本的四個(gè)細(xì)節(jié)項(xiàng)目源碼里帶的數(shù)據(jù)庫(kù)文件通常是.sql格式。交付時(shí)要注意四個(gè)細(xì)節(jié)。第一導(dǎo)出要包含CREATE DATABASE語(yǔ)句很多初學(xué)者拿到庫(kù)文件不知道要先建庫(kù)。第二初始化數(shù)據(jù)要覆蓋三個(gè)層級(jí)一個(gè)測(cè)試用戶(hù)、至少10條景點(diǎn)記錄、5條線(xiàn)路記錄這樣小程序端一打開(kāi)就有內(nèi)容可看。第三字符集統(tǒng)一用utf8mb4否則用戶(hù)昵稱(chēng)里的emoji表情會(huì)插入失敗。第四SQL文件里不要包含本地絕對(duì)路徑或數(shù)據(jù)庫(kù)密碼明文保護(hù)基本信息。導(dǎo)入數(shù)據(jù)庫(kù)時(shí)最常見(jiàn)的報(bào)錯(cuò)是排序規(guī)則不兼容。utf8mb4_0900_ai_ci是MySQL 8.0的默認(rèn)排序規(guī)則如果導(dǎo)出用的8.0而本地跑的是5.7會(huì)直接導(dǎo)入失敗。解決辦法是導(dǎo)出時(shí)在Navicat或命令行里指定排序規(guī)則為utf8mb4_general_ci或者導(dǎo)入前用文本編輯器批量替換文件里的規(guī)則串。注意數(shù)據(jù)庫(kù)文件和你自己的后端代碼一樣是項(xiàng)目源碼的重要組成部分。答辯前導(dǎo)出一份干凈的初始數(shù)據(jù)備份比任何講解都更有說(shuō)服力。4. 小程序端與Java后端對(duì)接登錄、列表、詳情頁(yè)的最小閉環(huán)4.1 wx.login換openid會(huì)話(huà)token的處理流程微信小程序的登錄跟傳統(tǒng)網(wǎng)頁(yè)完全不同沒(méi)有cookie機(jī)制也不適合每次請(qǐng)求都拿著openid去查用戶(hù)表。標(biāo)準(zhǔn)做法是小程序wx.login拿到code請(qǐng)求后端/auth/login接口后端拿著code向微信服務(wù)器換openid再用openid查詢(xún)或創(chuàng)建用戶(hù)最后生成一個(gè)自定義token返回給小程序端。小程序端把token存進(jìn)storage后續(xù)所有請(qǐng)求都在header里帶上token。后端登錄接口的Controller層代碼大致是這樣PostMapping(/login) public ResultLoginVO login(RequestBody LoginDTO dto) { String code dto.getCode(); String openid wechatService.code2openid(code); User user userService.findOrCreate(openid); String token jwtUtil.generateToken(user.getId()); return Result.success(new LoginVO(token, user)); }code2openid方法封裝了向微信服務(wù)器發(fā)請(qǐng)求的邏輯用Spring的RestTemplate即可不需要額外引入HTTP庫(kù)。微信接口返回的是JSON其中openid和session_key是核心字段。session_key不要返回給小程序端它是后續(xù)解密手機(jī)號(hào)等敏感操作的密鑰暴露出去會(huì)有安全風(fēng)險(xiǎn)。token生成用JWT而不是UUID因?yàn)镴WT自包含后端不需要把token存在內(nèi)存里驗(yàn)證時(shí)用密鑰解析即可適合小程序這種無(wú)狀態(tài)請(qǐng)求模型。JWT載荷里只放用戶(hù)ID和過(guò)期時(shí)間過(guò)期時(shí)間建議2小時(shí)旅游類(lèi)應(yīng)用用戶(hù)使用頻率不高過(guò)期后重登一次成本很低。小程序端的請(qǐng)求封裝也很關(guān)鍵。wx.request每寫(xiě)一次就要重復(fù)設(shè)置header、處理錯(cuò)誤碼所以常見(jiàn)做法是封裝一個(gè)request.js統(tǒng)一管理const request (url, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: getApp().globalData.baseUrl url, method: method, data: data, header: { Authorization: Bearer wx.getStorageSync(token) }, success: (res) { if (res.statusCode 401) { wx.navigateTo({ url: /pages/login/login }); reject(res); } else if (res.data.code 0) { resolve(res.data.data); } else { wx.showToast({ title: res.data.msg, icon: none }); reject(res.data); } }, fail: reject }); }); };這段代碼的邏輯是所有請(qǐng)求自動(dòng)帶上Authorization頭后端攔截器對(duì)未攜帶token或token過(guò)期的請(qǐng)求返回401小程序端統(tǒng)一捕獲401并跳轉(zhuǎn)登錄頁(yè)。業(yè)務(wù)狀態(tài)用code0表示成功非0時(shí)用toast直接展示后端返回的msg。這樣前端不需要為每個(gè)接口單獨(dú)寫(xiě)錯(cuò)誤處理這個(gè)模式在前后端分離項(xiàng)目里是通用做法能把接口對(duì)接的代碼量減少三分之一。4.2 景點(diǎn)列表分頁(yè)后端參數(shù)與小程序端渲染的配合旅游小程序首頁(yè)通常是景點(diǎn)列表涉及分頁(yè)、搜索、排序三個(gè)參數(shù)。后端接口設(shè)計(jì)時(shí)分頁(yè)參數(shù)我習(xí)慣用一個(gè)統(tǒng)一的PageDTO作為入?yún)ublic class PageDTO { private Integer pageNum 1; private Integer pageSize 10; private String keyword; private String sort; }pageNum從1開(kāi)始pageSize上限設(shè)置20防止有人一次性拉全量數(shù)據(jù)把數(shù)據(jù)庫(kù)拖垮。keyword用于按名稱(chēng)模糊搜索景點(diǎn)sort支持default和price兩種排序模式。后端用MyBatis-Plus的Page對(duì)象做分頁(yè)查詢(xún)public PageSpotVO getSpotPage(PageDTO dto) { LambdaQueryWrapperSpot wrapper new LambdaQueryWrapper(); if (StringUtils.hasText(dto.getKeyword())) { wrapper.like(Spot::getName, dto.getKeyword()); } PageSpot page spotMapper.selectPage( new Page(dto.getPageNum(), dto.getPageSize()), wrapper); PageSpotVO result new Page(dto.getPageNum(), dto.getPageSize()); result.setTotal(page.getTotal()); result.setRecords(spotConverter.toVOList(page.getRecords())); return result; }LambdaQueryWrapper是MyBatis-Plus的條件構(gòu)造器spotMapper.selectPage第一個(gè)參數(shù)是分頁(yè)對(duì)象第二個(gè)是查詢(xún)條件。這里把實(shí)體轉(zhuǎn)成VO再返回避免數(shù)據(jù)庫(kù)字段直接暴露給前端。total總數(shù)對(duì)小程序端的滾動(dòng)加載特別重要——當(dāng)已加載條數(shù)大于等于total時(shí)就該停止上拉分頁(yè)請(qǐng)求。小程序端用onReachBottom實(shí)現(xiàn)觸底加載維護(hù)pageNum和pageSize兩個(gè)data字段每次請(qǐng)求返回后累加列表數(shù)據(jù)而不是覆蓋。這里有一個(gè)新手常犯的錯(cuò)誤pageNum放在data里但請(qǐng)求回調(diào)里忘記在成功后再1導(dǎo)致同一頁(yè)數(shù)據(jù)被重復(fù)加載。4.3 圖片資源與后端靜態(tài)資源映射旅游項(xiàng)目的圖片量很大景點(diǎn)封面、線(xiàn)路詳情圖、用戶(hù)頭像每張圖都走后端轉(zhuǎn)發(fā)不現(xiàn)實(shí)。常見(jiàn)做法是后端只存圖片URL圖片本身放云存儲(chǔ)。開(kāi)發(fā)階段圖片放到后端項(xiàng)目的static目錄下通過(guò)Spring Boot的靜態(tài)資源映射訪(fǎng)問(wèn)。Spring Boot默認(rèn)把classpath:/static/映射為根路徑所以把upload文件夾放在resources/static/upload下訪(fǎng)問(wèn)http://localhost:8080/upload/spot1.jpg就能直接拿到圖片。圖片上傳接口是另一個(gè)容易踩坑的點(diǎn)。小程序端用wx.uploadFile上傳后端接收MultipartFile。Spring Boot的單個(gè)文件大小默認(rèn)限制是1MB景點(diǎn)高清圖動(dòng)輒3MB以上必須提前調(diào)大限制spring: servlet: multipart: max-file-size: 10MB max-request-size: 20MBmax-file-size限制單個(gè)文件max-request-size限制整個(gè)請(qǐng)求體。文件上傳成功后返回給前端的應(yīng)該是可訪(fǎng)問(wèn)的完整URL而不是一個(gè)相對(duì)路徑。我踩過(guò)這個(gè)坑接口返回了upload/20240601.jpg小程序端直接往域名后面拼接卻404原因就是沒(méi)有正確拼接請(qǐng)求根路徑。注意上線(xiàn)前圖片資源必須遷移到對(duì)象存儲(chǔ)并開(kāi)啟CDN加速本地static目錄方案只適合開(kāi)發(fā)和演示環(huán)境。5. 微信小程序旅游后端避坑指南5個(gè)讓我翻車(chē)的真實(shí)案例5.1 真機(jī)預(yù)覽請(qǐng)求全部失敗但開(kāi)發(fā)工具里一切正常現(xiàn)象小程序在開(kāi)發(fā)者工具里調(diào)后端接口全部成功一換成真機(jī)預(yù)覽所有請(qǐng)求全部超時(shí)報(bào)錯(cuò)。原因微信小程序的網(wǎng)絡(luò)請(qǐng)求有嚴(yán)格的域名限制。開(kāi)發(fā)者工具里可以勾選不校驗(yàn)合法域名來(lái)跳過(guò)限制但真機(jī)上這個(gè)開(kāi)關(guān)不起作用。后端localhost地址在真機(jī)上根本找不到而且小程序要求所有請(qǐng)求域名必須是HTTPS且在后臺(tái)配置過(guò)白名單。解決開(kāi)發(fā)階段用手機(jī)連電腦的局域網(wǎng)IP訪(fǎng)問(wèn)后端把后端啟動(dòng)host改成0.0.0.0前端baseUrl改成http://局域網(wǎng)IP:8080。要真機(jī)調(diào)試HTTPS效果就用映射工具把本地的8080端口映射成一個(gè)公網(wǎng)HTTPS地址再把域名加到小程序后臺(tái)的request合法域名里。最終上線(xiàn)前必須配好備案域名和SSL證書(shū)云廠(chǎng)商一般都有免費(fèi)證書(shū)申請(qǐng)入口在Nginx里配置HTTPS是固定套路這部分不是玄學(xué)照著官方文檔配一遍就能跑通。5.2 訂單時(shí)間總是差了8小時(shí)現(xiàn)象后端返回的create_time字段小程序端顯示比本地時(shí)間慢了8小時(shí)。數(shù)據(jù)庫(kù)里存的時(shí)間是正確的響應(yīng)JSON里卻變成了帶T的UTC格式。原因Jackson在序列化LocalDateTime時(shí)默認(rèn)使用UTC時(shí)區(qū)。后端服務(wù)器的系統(tǒng)時(shí)區(qū)、MySQL連接串里的serverTimezone、Jackson的時(shí)區(qū)配置三者不一致就會(huì)造成時(shí)間偏移。解決保持三重配置一致。第一application.yml里加spring.jackson.time-zoneGMT8和date-formatyyyy-MM-dd HH:mm:ss。第二MySQL連接串保持serverTimezoneAsia/Shanghai。第三實(shí)體里的時(shí)間字段加JsonFormat(patternyyyy-MM-dd HH:mm:ss, timezoneGMT8)注解兜底。改完這三處重啟后端再測(cè)一遍時(shí)間就對(duì)齊了。5.3 數(shù)據(jù)庫(kù)連接池耗盡頁(yè)面隨機(jī)卡死現(xiàn)象小程序端高頻請(qǐng)求后后端日志出現(xiàn)Connection is not available, request timed out部分接口偶發(fā)性超時(shí)重啟后才恢復(fù)。原因這是典型的數(shù)據(jù)庫(kù)連接池被打滿(mǎn)。某個(gè)Service方法內(nèi)加了事務(wù)注解事務(wù)內(nèi)又調(diào)用了外部HTTP接口HTTP接口響應(yīng)慢數(shù)據(jù)庫(kù)連接被事務(wù)長(zhǎng)時(shí)間占用。默認(rèn)連接池大小只有1010個(gè)連接都被慢請(qǐng)求占滿(mǎn)后新請(qǐng)求全部排隊(duì)等連接。解決第一排查所有Transactional方法事務(wù)內(nèi)不要做遠(yuǎn)程HTTP調(diào)用先完成數(shù)據(jù)庫(kù)操作再調(diào)外部接口或者用編程式事務(wù)精確控制邊界。第二把連接池調(diào)大并加監(jiān)控Spring Boot默認(rèn)使用HikariCPspring: datasource: hikari: maximum-pool-size: 30 minimum-idle: 10 connection-timeout: 30000把maximum-pool-size調(diào)到30只是緩解癥狀根因還是事務(wù)內(nèi)不要做遠(yuǎn)程調(diào)用。可以用一個(gè)AOP切面把執(zhí)行超過(guò)1秒的事務(wù)方法打印到日志里快速定位慢事務(wù)才能真正解決問(wèn)題。5.4 用戶(hù)連續(xù)點(diǎn)擊下單生成了兩條重復(fù)訂單現(xiàn)象用戶(hù)在小程序端雙擊立即預(yù)訂按鈕后端收到兩個(gè)幾乎同時(shí)到達(dá)的下單請(qǐng)求數(shù)據(jù)庫(kù)里出現(xiàn)了兩條相同的訂單記錄。原因前端只做了按鈕loading狀態(tài)但loading生效前的瞬間兩個(gè)請(qǐng)求已經(jīng)發(fā)出。后端沒(méi)有做任何冪等校驗(yàn)insert語(yǔ)句被重復(fù)執(zhí)行。解決訂單表上已經(jīng)建了order_no唯一索引但如果訂單號(hào)生成邏輯放在事務(wù)內(nèi)用時(shí)間戳生成同一毫秒的兩次請(qǐng)求仍可能撞號(hào)。常見(jiàn)的做法是前端在點(diǎn)擊下單時(shí)生成一個(gè)requestId傳給后端后端判斷requestId是否處理過(guò)處理過(guò)就直接返回已有訂單。更穩(wěn)的方案是在訂單表上建(user_id, line_id, travel_date)的聯(lián)合唯一索引讓重復(fù)插入直接拋異常再在Service層捕獲異常返回請(qǐng)勿重復(fù)操作。這個(gè)方案不依賴(lài)前端配合數(shù)據(jù)庫(kù)層直接兜底。5.5 圖片加載白屏控制臺(tái)報(bào)錯(cuò)圖片鏈接未授權(quán)現(xiàn)象小程序端打開(kāi)景點(diǎn)詳情頁(yè)輪播圖區(qū)域白屏控制臺(tái)提示下載圖片失敗。原因圖片URL是后端拼接的域名可能是localhost或IP地址微信小程序?qū)W(wǎng)絡(luò)圖片有緩存和域名校驗(yàn)機(jī)制。更隱蔽的原因是圖片URL中包含了符號(hào)被解析成多個(gè)參數(shù)實(shí)際訪(fǎng)問(wèn)的URL被截?cái)嗔?。解決第一所有圖片URL統(tǒng)一返回完整路徑即https://域名/ 相對(duì)路徑不要返回相對(duì)路徑讓前端自己拼。第二后端生成URL時(shí)對(duì)查詢(xún)參數(shù)做encodeURIComponent編碼前端拿到后用decodeURIComponent還原避免特殊字符被截?cái)?。第三如果用了云存?chǔ)圖片域名必須加入小程序后臺(tái)的downloadFile合法域名否則真機(jī)上永遠(yuǎn)加載不出來(lái)。6. 項(xiàng)目驗(yàn)收前的三個(gè)驗(yàn)證技巧讓代碼在答辯時(shí)不出丑到這里項(xiàng)目已經(jīng)能跑起來(lái)了。但能跑和能演示之間還有一段距離。我總結(jié)三個(gè)自己驗(yàn)收前必做的驗(yàn)證動(dòng)作每個(gè)都能提前暴露問(wèn)題。第一個(gè)是接口全量冒煙測(cè)試。用Postman或Apifox把項(xiàng)目里的所有接口按業(yè)務(wù)鏈路串起來(lái)跑一遍從登錄拿到token到創(chuàng)建訂單、查詢(xún)訂單、取消訂單覆蓋整條主流程。重點(diǎn)觀察返回狀態(tài)碼和響應(yīng)耗時(shí)。我習(xí)慣在Postman里設(shè)一個(gè)全局變量token登錄接口里用一段test腳本自動(dòng)提取token后續(xù)請(qǐng)求全部引用{{token}}這樣能真實(shí)模擬前端調(diào)用順序。第二個(gè)是事務(wù)回滾驗(yàn)證。找一個(gè)修改類(lèi)接口故意讓SQL執(zhí)行失敗比如給一個(gè)不存在的ID傳參看接口是否正確返回錯(cuò)誤碼以及數(shù)據(jù)庫(kù)里是否發(fā)生了部分更新。這個(gè)驗(yàn)證直接對(duì)應(yīng)答辯時(shí)老師最常問(wèn)的問(wèn)題如果下單流程里第二步失敗了第一步的訂單會(huì)留下來(lái)嗎在Service層加上Transactional并驗(yàn)證回滾后你就能有底氣地回答。第三個(gè)是日志檢查。把后端控制臺(tái)日志打開(kāi)跑一遍核心流程看有沒(méi)有MyBatis打印出select *全量查詢(xún)有沒(méi)有重復(fù)執(zhí)行的相同SQL。全量查詢(xún)?cè)诰包c(diǎn)列表這種接口里非常常見(jiàn)原因通常是實(shí)體關(guān)聯(lián)字段沒(méi)做懶加載。把慢SQL日志打開(kāi)你會(huì)發(fā)現(xiàn)很多接口的耗時(shí)集中在某幾張表的關(guān)聯(lián)上這時(shí)候在JOIN字段上補(bǔ)索引比加Redis緩存更直接有效。最后分享一個(gè)我的習(xí)慣答辯前一周把數(shù)據(jù)庫(kù)導(dǎo)出一份干凈的備份放到項(xiàng)目源碼的database目錄下。這樣不管演示時(shí)數(shù)據(jù)被改成什么樣隨時(shí)能一鍵還原回初始狀態(tài)。這個(gè)習(xí)慣救過(guò)我很多次也希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
女人高潮抽搐喷水视频网站| 搡老女人老91妇女老熟女| 日韩性爱免费观看视频| 一区二区播放| 嗯啊不要啊在线| 日韩人妻有码免费视频| 在线视频 亚洲精品| 超碰地址97| 国产又爽又黄| 密臀在线视频| 人妻在线视频| 粉嫩av平台| 99精品综合久久久久五月天| 久久m| 开心激情婷婷| 日产狠狠干| 中文字幕日本久久| 激情视屏国产乱伦强奸| 97人妻免费中文字幕| 色黄污美女啪啪啪免费网站| 久久鲁干| 亚洲激情在线| 亚洲 自拍偷拍 欧美| 日韩有码专区| 综合亚洲网| 国产蜜臀精品一区二区尤物| 麻豆区久久久久亚| 麻豆黄站| 国产乱不卡| 日韩精品大香蕉伊人在线| 亚洲成人一二三区| 激情文学小说一区二区| 日日躁狠狠躁天天躁精品| av东京热男人的天堂| 日本999精品| 亚州久久9| 97国产亚洲中文在线| 射丝袜高跟鞋99| 久操黄色视频| 青春草A| 欧美永久激情一区二区| 性欧美体内射精| 国产蜜臀精品一区免费尤物| 色婷婷久久综合超碰| 9精品久久| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 91被操| 国产性爱欧美性爱在线| 亚洲国产亚洲天堂| 欧美啪啪色吧在线| av天堂精品久久| 国产AV激情无码久久无码| 亚洲天堂7777| 日本久久久久久久久| 久草视频制服诱惑| 涩涩久久精品| 肥臀熟女一区二区三区视频| 超碰在线一区二区三区| 亚洲日韩国产欧美综合v| 国产 热久久久久国产精品| 99久久久无码国产精品性男| 亚洲综合色网| 99re在线精品78| 狠狠爱夜夜| 精品久久久久久中文字幕三区| 亚洲成人日韩小说| 超碰亚洲97| 久插综合| 18禁看网站一区| 黄色网址在线免费观看| 性91| 被窝影院午夜看片无码| 操逼免费视频无码国产| 99这里有精品| 91美女視頻| 午夜精品久久久久久久第一页按摩| 1240青青草一区二区三区视频天爱| a片偷拍视频| 亚洲成?V人片在线观看福利| 超碰在线974| 丝袜美腿91| 无码高清少妇久久| 欧美精品丝袜久久久中文字幕| 91女优在线观看 | 亚洲中文字幕av | 老师充足的奶水小说| KK色在线影院| 夜夜嗨TV| 一起草欧美| 人妻熟女一区在| 国产呦精品一区二区三区下载| 色五月激情综合网| 欧美在线 亚洲| 欧美日韩中文字幕人妻| 盗摄女人妻在线| 青青草视频久久久久| 亚洲成?V人片在线观看福利| 中文字幕啊啊啊在线观看视频| 久久免费精品视频免一| 亚洲资源一区| 内射夫妻三片| 美女尤物人人操| 色噜噜人妻丝袜AV资源| 99re99在线视频| 天天射天天操天天干天天吃2018| 熟妇人妻一区二区三区| 男同专区一区二区三区在线| 国产av美女被艹的乱叫| 久久AV色| 在线强奷到舒服的无码视频 | 一区二区偷拍拍视频| 色偷偷超碰亚洲| 操逼天美3区| 97一区二区蜜臀| 欧美另类丝袜熟女| 婷婷丁香六月| 友优传媒精品在线一区二区| 国产精品一二三免费网站| 图片区小说区| 亚洲情色综合网| 成人26uuu| 亚洲男人天堂Av| 亚洲色婷婷综合久久一区二区三区| 国产偷人伦激情在线观看| 丁香五月天啪啪| 美欧色综合| 亚洲啪啪性视频| 天天在线91| 国产九九九九九九九九| 91天天综合在线观看| 人人操人人摸人| 亚洲综合69| 亚洲欧美国产其他二区| 久久久久久人体| 99热精品在线观看| 欧美天天弄| wwwss在线观看| 亚洲另类春色| 99九九久久| 免费看国产曰批40分钟怎么下载| 伊人96在线| 麻豆国产原创AV色哟哟| 蜜桃久久久久久久| 人人摸.人人色| 国产日产欧产美韩系列麻豆免费| 久久婷婷五月天| 精品一区二区三区麻豆| 91网亚洲| 亚洲国产欧美中日韩成人综合视频| 91超碰在线观看| 亚洲精品亚洲人成人网| 强奸乱伦AV一天堂网| 日韩9999| 九九精品美女高溯喷水| 巨爆乳一区二区爆乳区| 久热伊人| m欧洲一级午老| 一级A啪啪啪啪| 九九热AV| 精品无码产区一区二| 一区二区娱乐网站| 一区二区三区亚洲| 激情婷婷黑人91| 久久综合18p| 成年人一级黄色毛片大全在线观看| 亚洲激情欧美色图| 免费人人搞97| 五月婷丁香| 国产乱弄免费在线视频。| 亚洲最新av无码成人精品区| 久艹免费| 日本性一区| 艳美熟妇先锋一二三区| 天美麻花大全视频| 久久香蕉影院| 精品成人无码| 亚洲成a人v欧美综合天堂下载| 色香伊人| 激情综合网一盗摄| 亚洲免费97免费| 日韩啪啪啪啪啪| 啪啪视频亚洲第一| 午夜国产乱伦视频| www.亚洲黄色| 99人妻| 青操影院| 亚洲偷拍欧美激情| 伊人伊人LD| 天天爽爽爽爽| 色综合久| 秋霞视频一区二区 | 大地资源在线观看中文第二页| 国产在线综合福利网站| 欧美性91| 神马麻豆福利院| 中文字幕一二三av| www.男人的天堂| 激情视频图片| 啊啊啊 在线| 九九热精彩视频| 91人妻丝袜无码| 91neishe| 好湿好紧好爽 视频| 天天肏夜夜肏| 麻豆国产尤物AV| 99操视频| 特污免视频| 五月天激情综合网| 六月色色| 九九热免费国产视频婷婷伊人| 伊人久久88国产女| 麻豆久久久一区二区| 伊人色综合网| 九九久久九九久久| a人欧美综合天堂麻豆| 97青青操视频| 欧美日韩人人早| 麻豆人妻少妇在线免费观看| 二对二中文字幕。| 91AV天堂| 日韩精品人妻中文字幕不卡乱码| AV有码在线| 久久婷婷成人综合色怡春院| 国产精品情侣啪啪| 91欧美成人色站| yy少妇精品久久| 九九热午夜欧亚国产视频| 果冻传媒一区二区三区| 亚洲色图91| 一个国产在线综合网站| 午夜操一视频一区| 欧美另类色图片| 2020中文字幕| 久久久久9久久久久| 日韩乱码Av| 99re视频这里只有精品| 日韩三级在线观看mp4| 欧美一区二区情色| 日韩精品怡红院| 蜜臀va69| 亚洲天堂五月天国产| 亚洲色图尤物视频| 中文字幕性感少妇av| 日韩人妻精品久久久久| 久久久久元码视频| 欧美日韩1234| 金莲网址| 天天操女人| 91丝袜激情在线| 啊啊啊男女| 日韩免费在线观看不卡| 丁香九月激情| 天天舔天天日天天射| 91欧美色| 日韩欧美亚洲一区二区三区影院| 混色激情av| 国产久久av| 91 丝袜在线| 少妇高潮一区二区三区在线| 成全在线观看免费观看| 99国产精品免费| 中文字幕乱妇免费视频| 成人性爱美曰韩| 国产有码一区| 91 丝袜在线播放| 99精品久久| 欧美色天堂网在线视频| 国产精品96| 国产精品自拍欧美在线| 精品九九淫乱男| 日本精品五区| 午夜婷婷| 欧美色另类| 3P乱轮视频| 69精品人人人人| 国产精品乱码久久久| 久久AV无码网址| 天天做天天爱天天爽AV| 国产一级内射高清视频| 亚洲色图91欧美日韩| 一级A啪啪啪啪| 都市激情人妻一区二区青青操视频| 亚洲一级特黄大片在线播放91| 看日韩操逼| 日韩三四五区| 中文久久久| 婷婷丁香六月| 亚洲情色视频| 九月伊人中文字幕| 少妇高潮喷水无套久久久久久| 99999精品成人| 试看60秒 爽| 九九黄色网| 久久久久久99999国产精品| 欧美一区二区三区互相| 精品国产72| 国产一级舔足在线观看| 97视频播放| 熟女精品日韩一区二区三区| 天天做天天爱天天爽| 欧美91网| 91 亚洲 欧洲| 久久永久无码人妻视频| 日本少妇va7777| 国产精品分类在线观看| 少妇69中文| 久操凹凸视频| 亚洲第二页| 91九色网| 91综合网| 美女上床网站| 激情综合五月| 日本人妻伦在线中文字幕| 国产乱弄免费在线视频。| 中文字幕人成乱码熟女香港| 午夜AV污污污| 男人夜色天堂ss| 免费岛国一级片| 国产丰满熟夫69mpp| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 91久青| 1769一区| 人人操人人射人人干| 在线人人人人人人精品超| 四虎影视永久在线观看精品免费网站 | 色色无码| 人人摸.人人色| 啊啊好多水| 麻豆伊人网| 91美女精品| 亚洲欧洲小说图片视频 | 久久久久久99AV无码免费网站| 欧美日韩淫加| 亚洲欧美成人在线| 日韩偷拍一区二区三区| 亚洲,欧美,综合网| 日韩一级二级在线| 99热这里只有精品地址| 人人操欧美风骚| 日本熟妇色熟妇在线视频播放| 97操操| 亚洲欧美日韩免费电影| 鲁鲁色综合网| 乱伦系列一区二区| 亚瑟国产精品久久无码| 亚洲丝袜少妇在线| 物业黑人 AV一区| 暖暖精品二区三区观看| 国产剧情AV不卡在线观看| 99久久99久久免费精品蜜臀| 九九久精品| 肥佬影院91| 波多野结衣被操50分钟免费视频 | 精品一级| 亚洲av无码国产精品字幕| 九九av| 亚洲三区视频| 久久久久久久强迫| 色就色综合| 无码国产精品午夜不卡(| 国产又黄又爽| 黄色工厂这里只有精品| 四虎免费视频| 好好的日:com久久九九| 玖玖视频在线资源一区二区三区| 日本午夜久久电影| 操婷婷逼| 亚洲精品精品一区二区| 亚洲欧洲精品视频发布| 岛国激情视频软件| 日韩在线性爱免费视频| 久久无码一区二区二三区性色| www.婷婷| 精品 码产区一区二-1080P高清在线www-B029AV | 啪啪性爱免费视频| 99久久久无码国产精品性啊聊| 色偷偷综合91久久噜噜| 亚州Av天美传媒| 色老牛| 97超碰久久色| 色麻豆AV| 久久丝袜| 日本天天干天天操一区| 97视频在线看| 在线αⅴ| 日本色色视频网站| 亚洲欧洲综合av在线| 精品中文字幕一区二区| 精品少妇人妻av久久免费| 呦呦影院| 91中文精品日韩欧美在线| 四虎影库国产精品免费| 久久一二三四五六七八九区区区| 丁香激情五月天| 综合激情五月丁香| 亚洲色图激情小说| 午夜成人福利影视| 亚洲国产精品久久久久婷婷老年| 欧美 日韩第一性色| 麻豆熟妇乱妇熟色A片在线看| 少妇蹲下买菜露大唇0| 亚洲熟妇综合久久久久久| 精品一区二区亚洲国产| 青青草日韩无码| 国产久久久9999| 麻豆性爱视频在线播放| 免费看国产大AB| 97综合久第一页| 国产999精品久久久| 97人妻免费中文字幕| 91欧美丝袜| 激情另类激情| 国内偷拍精品一区二区| 亚洲av影音先锋| 五月丁香婷婷综合| 欧美色997| 欧美天天综合站| 一区二区三区一亚洲中文字幕、综合区灬 | 久久有码视频| 干我久操| 97超碰香蕉| 综合国产影视三级| 操逼国产免费| 一色网男人的天堂| 亚洲极品| 视频在线观看青青99国产| 亚洲人妻av| 男女做爰猛烈动高潮A片免费应用| 久久久久78| 伊人久久亚洲中文字幕不卡| 唯美清纯 妖精视频| 香蕉久久国产AV一区二区| 97香焦色区| 制服丝袜第二页| 欧美97超碰| 日韩人妻中文视频| 超碰性爱97| 久久九九精品一区二区 | 天天天天天超碰| 色亚洲欧美| 午夜福利无毒不卡| 中文字幕一区二区三区蜜臀| 97伦综合| 中文字幕免费看大片| 亚洲不卡不卡中文字幕不卡 | 国产精品一区二区三区,亚洲综合| 懂色综合久久久| 色综九九九一区| 日本狂喷奶水在线播放212| 天天爽爽爽爽| 超碰色大香蕉| 欧美做爰无码A片视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 亚洲色图欧美色图综合| 久久亚州精品成人Av无| 日本少妇va7777| 国产精品夜夜| 丁香久久| 午夜传煤十二区精品| 欧美日韩国产高清在线一二三区 | 9九九国产| 99这里只有精品国产| 插入综合网| 992视频一区| 欧美中出1| 亚洲在线综合| 五月天婷婷小说| 情色大香蕉| 中文字幕 国产区| 东方亚洲在线操逼天堂| 黄色小视频日本txt| 久久伦理视频久久大香蕉视频| 成人一道本免费视频| 人妻一区二区三区| 美女视频尤物网在线看| 大肉棒导航| 干干干天天| 欧美超碰人妻97| 久久精品国产亚洲AV片多多 | 欧美人人操人人插| 欧美日韩大黄片| 国产成自自拍在线观看| 国产黄片在线免费观看| 91综合天天看| 激情四射婷婷四五月天| 婷婷干黄色| 欧美91在线+|+欧美| www.大香| 久久二| 九九久久首页| 日韩视频啪啪| 精品国产乱子伦一区二区三区,精品一| 另类天堂| 你懂的在线观看区国产| 校园春色综合香蕉| 五月天成人综合| 日本亚洲嫩草影院啪啪| 欧美的性爱网站免费| 91久久国产综合久久| 无码日韩人妻av一| 800zy一区二区| 骚货操死你| 欧洲综合视频| 日韩无码精品综合久久| 91久久久久久久| 免费黄色片子| 国产黄色影片在线观看| 青青久久久| 久久久久久久久久久97| 国产白嫩漂亮KTV在线| 亚洲 欧美 日韩另类 麻豆| 99热这里只有精| 口爆吞精在线观看| 精品欧美老熟女一二区| 亚洲精品蜜桃久久久久久久| 激情综合五月| 一区二区三区成人高清视频| 好爽视频在线观看| 91国精产品| 精品一区二区啪啪啪| 欧美成人A天堂片在线观看| 日韩欧美~中文字| 亚洲综合影视| 五月天色图影视| 操逼国产免费| 四虎国产精品永久入口| 男人的天堂Va| 国产成人啪一区二区| 国产精品肉丝自拍| 婷婷综合激情| 亚洲国产精品成人无码久久久| 2019天天干| 综合网亚洲1| 日韩激情视频| 九九无码久久精品视频| 五月婷丁香| 成人八戒网站| 26uuu性| 大学生美女口爆| 婷婷激情丁香| 老熟女天天操| 亚洲第一视频 欧美风情 日韩| 亚洲限制级| 大屁股xxxxx| 懂色影视久久| 60秒免费视频| 成熟熟女国产精品一区二区| 日本一区99| 毛片视频白嫩| 久久久久久久极品香蕉视频| 99热色精品| 另类天堂| 国产按摩一区二区三区| 九九热在线视频| 柠檬AV导航| 日韩不卡av一二三| 亚洲aV无码成人在线观看| 色官网色综合| 99在线无码精品秘 入口黑人| 一区二区三区在线美女| 色天使亚洲综合在线观看| 狠狠色噜噜狠狠狠狠2018| 欧美亚洲中文| 国内毛片欧美香蕉精品| 免费家庭乱伦视频| 国产精品人人爽人人做可爱福利| 性色av大全| 人妻一区二区三区视频| 操操吧亚洲乱伦视频| 欧美性爱91| 国产三级多多影院2022国产AA一级毛片无码| 一级人妻性爱视频| 亚洲成人福利电影免费| 亚洲第一在线视频| 情色AV电影| 欧美亚洲第1页| 国产成人AV麻豆| 亚熟hd视频在线| 蜜臀aV午夜一区二区三区| 中文字幕欧洲有码| 综合97| 亚洲无码国产探花在线观看| 26uuu性| 5278欧美一区二区三区| 天天干天天插| 免费看污网址| 久久大香蕉97| 91AV入口| 美国日韩黄色片| 欧美淫穴| 亚洲999综合| 久久久久久久久久久久色网| 婷婷色色五月天福利| 国产亚洲日韩在线三区黑人| 色爱国产| 婷婷另类小说| 日韩BBN| AV天堂国产| 美女黄色91| 国产无码精品成人| 狼人久草| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 蜜臀99久久精品久久久久久| 大香蕉伊人网| 中文字幕av乱伦| 久久综合18p| 嫩草91| 伊人一级免费黄片| 99∨VTV| 日韩精品9区| 天天综合97| 在线观看日韩av不卡| 黄色成品网站| 婷婷激情四射| 欧亚性爱视频免费看| 亚洲另类色图片| 97伊人| 黄色av片三级三级三级免费看| 奸色色 男人天堂 天天射| 亚洲欧美91√| 国产高清精品一区二区三区毛片| 偷拍欧美综合| 欧美欧美少妇| 亚洲欧洲网站免费观看| 男人的天堂日本东京热| 九九九精品成人免费视频小说| 大香蕉久久| 狠狠干妹子| 再深点灬舒服灬太大了添视频| 91亚洲人电影| 丰满人妻一区二区三区四区| 欧美成人一区二区三区在线播放| 男人天堂综合| 色五天伊人| AV高清一区| 99人妻| 97亚洲综合电影| 999热这里只有精品| 国产激情片在线观看| 99精品久久久久久| 精品少妇人妻av久久免费| 二区熟妇韩日| 精品日韩人妻精品一二三区| 亚洲中文字幕精品一区| 大香蕉碰碰| 久久久久久97| www鬼畜国产男人的天堂| 男人综合网| 日日夜夜狠狠| 男人在线天堂| 香一区二区三区| 国产精品人妻无码久久久互動交流| 一区二区日韩欧美久久| 999精品久久久久久久| 亚洲天堂,男人| 亚州综合| 91AV天堂| 懂色AV蜜臀无码精品APP| 哑洲在线| 日韩三级一区| 国产狂喷潮在线精品| 91热情品| 久久免费精品视频免一| 少妇的嫩逼图片| 校园春色之综合网| 中文字幕五月婷婷免费| 激情小说亚洲图片| 99熟女| 放黄片放3级黄片没穿衣服| 熟女一区二区| 日本性爱网址| 午夜在线播放| 91丝袜激情在线| 日韩人妻中文视频| 男人的天堂1024| 尻女朋友一夜| 国产区91柔拿会所技师| 精品国产乱码久久久久久久久久毛片 | 亚洲精品久| 100啪啪视频大全| 国产丸一视频| 欧美超碰9798| 国产操偷| 色吧91| 好爽免费视频,| 五月激情啪啪| 色就色综合| 无码二级三级| 亚洲成人精品久久久| 一区二区三区精品久久| 性天堂| 亚洲啪啪性视频| 国产精品人妻无码久久久老鸭窝| 狠狠躁日日躁夜夜躁A| 日日干日日| 强奸国产在线| 亚洲 暴爽 AV人人爽日日碰| 啊啊啊啊啊好舒服视频| 国产一区二区三区中文字幕| 丰满人妻无码一区二区三区| 91美女小视频| 天天影视之亚洲综合网| 91精品电影18| 操逼网站视频漫画国产| 欧美福利视频啊啊啊啊| 欧美高清16| 亚洲无限观看| 欧美性区| 亚洲综合色男人网| 国产超碰人人操| 91影库| 囯产精品久久久久久久久久梁医生 | 久九干| 五月丁香狠狠爱| 强奸乱伦大香蕉| 婷婷久久五月综合激情| 亚洲成人在线乱码色午夜| 国产成自自拍在线观看| 一区二区久久天天干狠狠| 欧美一区二区亚洲天堂| 激情网色| 一级@啪啪视频| 综合影院永久入口国产| 99re98| 精品玖九九久| 国产丁香精品露脸视频| 国偷自 一区二区| 久久人妇| 天天舔天天日天天射| 青春草A| 亚洲网自拍| 在线人妻熟女一区二区三区四区五区| 99在线免费观看| 亚洲九区| 大香蕉啪啪啪| 伊人久久88国产女| 亚洲人成网www| 99热免费| 97色伦欧美| 亚 欧 美 综合| 天天综合日韩网| 花野真衣| 女同性恋一区二区三区精品视频| 中文字幕在在线观看网站| 麻豆天美国美国产AV| 久操大香蕉手机视频在线看| 日韩人妻大香蕉| 内射白嫩美女| 欧美曰韩国产精品| 久久同城AV| 69丨亚洲丨精品丨入口免费播放| 玖玖玖玖精品国产剧情| 久久精品国产72国产精品福利| 精品性爱一二三区| 日本网色| 91色艳| 欧美无圣光在线| 久久久久9999妇女| 91成人久久| 色噜噜人妻av中文字幕| 日韩91网站| 毛片久久| 欧美精品成人在线播放| 黄色高清无码无码破解免费暗网 | 91麻豆一二三区| 国产黑白丝在线| 久久啊啊| 另类TS人妖一区二区三区| 黄页视频网站野外| 99热精品在线播放| 国产精品久久久久久夜夜夜| 国产视频第2页| 欧美综合色图网| 91 欧美| 国产成人亚洲精品无码古代早漏男 | 97超碰免费人人性爱| 日韩情色一区二区| 欧美精品一区二区少妇免费A片| 全免费a敌肛交毛片免费| julia高潮后不停追击中出| 久久九九一区二区三区成人| 熟女久久久| 青娱乐休闲视频在线观看| 无码人妻精品一区二区中文| 色婷婷久久| 97精品视频免费| 国产9熟妇视频网站| 91P0RNY大屁股人妻| 亚洲AV无码国产精品久久久久 | 蜜乳中文字幕a在线| 秋霞曰韩R级| 男人干美女| 九九九不卡| 欧美探花网| 色欧美天天| 男人天堂免费| 午夜男女爽爽爽影院视频| 中文自拍欧美影视| 欧美一区二区传媒| 日韩熟女精一区二区三区不卡| 蜜桃久久久久久久久久久久| 嗯嗯不要视频| 婷婷中文网| 亚州色图欧美| 国产精品人妻无码久久久互動交流| 国产午夜无码片在线观看影视 | 欧美性高潮在线| 18禁中文字幕| 热久久九九热| 国产成年女黄特黄| 日本免费中文一区二区三区四区| 超碰伊人在线| 无码高清国产AV| 一区黄二区黄| 亚欧美综合网| 日本精品成人无码| 午夜福利在线合集| 熟女五十路一区二区三| 亚洲中文人妻色| 麻豆精品.欧美精品.日韩精品.| 久久香蕉综合一本到3atv| 丝袜综合| 岛国1区2区3区在线观看| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 少妇3P性爱自拍| 操逼精品视频| 岛国免费视频在线| 亚洲日本男人天堂网| 91精品国产一区三一| 91碰碰碰| 啪啪自拍九九综合| 超碰碰碰碰| 啊啊啊好舒服视频| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 成人资源中文字幕在线观看天天| 99re欧美| 一区二区三区精品黑丝白丝酒店对鸡| 综合少妇网| 综合色一区三区二区| 一区二区三区机械有限公司| 亚洲精品蜜桃久久久| 中文字幕jul-617人妻熟女| 激情文学亚洲| 色色五月天婷婷| 伊人网高清| 中文伊人大香蕉视频| 日韩一级二级三级免费看完整版| 久久理论字幕视频| 免费看片黄| 欧美熟妇亚洲版| 日韩午夜精品一区二区三区电影| 亚洲大色鬼| www.久久99| 亚洲欧美第一页| 久久最新视频免费观看| 91艹B视频| 91激情国产| 日韩人妻大香蕉| 人妻精品免费一二三区| 色网在线| 九九色逼| 国产精品福利资源在线尤物| 久久久性爱视频| 婷婷AV一区二区三区| 啊啊啊好舒服视频| 国产传媒美日韩av| 欧美日韩国内不卡| 2017亚洲天堂| 国产熟女精品区| www.丁香五月| 国产精品久久久吖| 日本免费一区二区不卡| 天天综合网~69| 影音先锋视频在线| 国内毛片四区| 十八禁黄色成人网站观看| 日人妻视频91| 中文字幕三四区| 91色伦综合| 丁香激情五月天| 黑人白女精品一区| 人妻第一页| 久久久99999久网站| AA丁香综合激情| 久久透逼视频| 777超碰| 欧美一区二区三区黄色影视| 成人夜夜爽| 伊人久操| 国产兽交视频在线播放| 日本幼女18+| 国产熟妇一区二区| 精品一区二区3区| 秋霞蝌科网日本一区| 亚洲伊人成综合成人网| 伊人国产AV| 97操在线| 冬京热男人的天堂| www.久久| 午夜爽爽爽在线观看永久入口姬片| 亚欧成人一级片在线播放| 久久精品成人一区二区三区蜜臀| 成全动漫视频观看免费下载| 人人操人人精品影片| 九九热超碰97亚洲最新香蕉 | 亚洲色天堂九9| 国产AV人人 夜夜人人澡| 98色网| 免费一级视频特黄色大片| 国产美女裸体秘 永久无遮挡| 国产熟妇 码视频户外直播| 午夜福利 成人 91| 中文字幕一区二区三四五区日日骚| 国产自产91区13区| 欧美综合站| 狠狠干综合| 成年女人18级毛片毛片免费观看| 国产Aα| 人人操人人操人人人操| 国产精品高潮久久久无码| 97这里有精品| 日天天九九天堂666| 欧美色图自拍| 97视频在线视频| 都市激情人妻一区二区青青操视频| 少妇被玩视频二三区| 九九久久久九九| 久久精品免费| 国产有码一区| 91网亚洲| 99re69| 金典av| jiujiujiujingpin| 91影视亚洲| 欧美青青草视频| 欧美草草| 有码专区最新中文字幕有码| 久久久久深夜无码| 人妻少妇无码| 精品美女少妇一区二区| 日本大香蕉综合网红本杳社区| 亚洲成人在线乱码色午夜| 十八禁黄色| 96精品久久| 亚洲婷婷丁香在线| 性色AV蜜色av色欲av| 人妻一区二区三区视频| 精品国产91av一区二区三区| 国产一进一出视频网站| 日逼国产| 99精品久久| 91是天天| 屌妞视频久久久久久久| 欧美91久久久久| 2019男人的天堂| 欧美人妻制服| 试看日韩黄片| 中文字幕精品一区欧美| www.黄色在线| www99热| 亚洲精品天天影视综合网| 夜夜福利| 国产9熟妇视频网站| 96久久久久| 一级人妻性爱视频| 欧美丝袜制服久久| 人妻少妇视频在线播放| 天天爽夜夜欢视| 天天爱综合网| 亚洲91在线| 欧美一级国产一级| 97亚洲中文| 国产精品蜜臀久久久久无码AV| 91三级理论片播放器| 天天爱天天韩国日本牛牛牛牛| 少妇国产不卡| 美女爽爽爽刺痛洞洞| 日韩色| 欧美日韩一区二区三区四区蜜桃| 午夜福利成人免费视频| 欧美爆操91| 青青久草| 欧美黄色大片在线观看 | 91亚洲精品青草| 偷拍五区| 免费操逼91| 激情综合网五月婷婷五月天| 伊人网av| 99国产精品自在自在| 水多多映视AV| 香蕉人人操tv| 日本午夜福利视频| 精品十八在线观看| 亚欧免费| 国产亚洲 中文欧美久久| 韩日自拍| 蜜乳成人AV| 久热这里只有精品9| 欧美夜夜草视频| 天天躁日日躁xxxxx| 国产九月婷婷| 肉丝中文无码高清| 成年人网站在线免费观看| 国产精品一区二区黄片| 99国产精品免费| 欧美资源| 91九色精品熟女内射| 亚洲色丰满少妇高潮| 久久久久97| 天美麻花大全视频| 国产第11页| 日韩精品在线放| 亚洲春色激情小说| 超碰97久| 亚洲少妇中文字幕网址| 久久中日麻豆| A级片一区| 女优免费一区二区永久| 97 国产精品| 欧美日本国产日韩激情视频| 精品久一区免费| 91黑人狂躁丰满熟妇| 婷婷五月天综合网| 亚春色色| 3p国产欧美99热| 免费草草草草草视频| 人妻丰满熟妇一区二区三| 久九九九九九九热| 色香AV| 蜜臀久久99精品久久久老,,| 国产美女自拍视频| 另类天堂| 国产路线专区| 97精品国产97久久久久久| 男人的天堂视频精品乱在线| 免费在线观看AV无码网站| 欧美精品欧美精品系列| 亚洲第一黄色av网站| 欧美熟妇亚洲版| 熟女五十路一区二区三| 亚洲美女色图| 欧美日韩国产三级黄色| 蜜臀久久久国产| 国产精品极品美女视频| 国产精品嫩草影院免费| 午夜福利在线合集| www国产天美久久久| 亚洲久久东京热一二三四五区视频| 男人高清无码一区二区| 久久九操在线观看| 92人人操人人| 久久东京热成人| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 3PAV乱伦视频| 日韩懂色网| 伊人五月天激情| 99re99在线视频| 亚码激情| 国产精品福利视频播放| 亚洲精品蜜桃久久久久久久| AV不卡在线| 殴美色网| 宗合情欲网| av在线免费一区二区| 91天天综合在线| 女色视频社区| 一本色道久久天天射天天干| 午夜精品人妻二区三区| 97人妻碰碰中文无码久热丝袜| 久久人妻熟女一区二区| 97超碰色屌| 國產尤物AV尤物在線觀看| 人妻熟女一区二区三区视频| 肥臀熟女福利视频一区二区| 日韩中文字幕精品一区在线| 久久亚洲日韩国产欧| 午夜天堂精品久久久久91| 伊人网青青| 色香综合天天影视综合 | 精品久| 国产乱人妻精品入口| 91久久久久久| 伊人丁香五月婷婷| 亚洲中文字幕av| 韩日男人的天堂| 久久男女激情视频网站| 色呦呦国产精品免费看| 死我十八禁| 久久a久久| 在线可观看的黄色网址| 亚洲中文字幕在现观看| 日韩97视频| 99啪| 丁香五月大香蕉| 欧美日韩国产三级黄色| 96精品久久| 欧洲亚洲人人爽爽视频| 夜夜夜久久| 成人午夜视频免费播放| 国产探花日韩援交| 精品欧美乱码久| 91成人久久| 天天做天天爱天天爽AV| 成人看片网站| 国产精品一级毛片不卡视| 亚洲色婷婷久久91| 91高清欧美| 日韩一级二级三级免费看完整版国语版| 一区二区三区精品黑丝白丝酒店对鸡| 99国产在线 精品 视频| 亚洲色图欧美色图另类图片| 中文字幕av片| 蜜桃一区二区三区| 97超碰色屌| 99热97| 一区二区 韩日AV| 色婷婷五月综合激情中文字幕| 国产精品成人无码a v毛片| 欧美少妇色图| 超碰久超碰久| 亚欧美色图| 嗯嗯啊啊的视频| 裸体1区| 麻豆福利视频导航| 国产丝袜美女诱惑| 无码78| 深喉吞精| 一本色道久久综合狠狠操| 免费97视频| 色综合久久夜色精品国产天堂| 密臀在线免费观看| 成人在线视频二区| 夜夜嗨一区二区| 欧美成人精品A片免费一区99| 性爱乱伦网址| 婷婷丁香五月天亚洲天堂网| 色五天伊人| 国产精品毛片?v一区二区三区 | 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 国产老太乱伦一区| 五月天亚洲色图| 97爱亚洲| 水多多映视AV| 思思久热在线精品66| 91精品人| 欧美成熟性爱精品| 日韩在线地址一| 国产又黄又粗的视频| 91深夜夜| 欧亚乱色熟女一区二区| 日本色色色视频| 欧美成人性爱视频大全| 91色色色| 嗯嗯啊在线视频| 精品人妻二区三区| AV老汉| 91操人| 啊啊啊啊免费视频| 搡老女人老91妇女老熟女| 91人妻人人澡人人爽人人精品|