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

ARTICLE DETAIL

資訊詳情

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

ThinkPHP+uniapp上門預(yù)約源碼:從部署到訂單并發(fā)控制實(shí)戰(zhàn)

ThinkPHP+uniapp上門預(yù)約源碼:從部署到訂單并發(fā)控制實(shí)戰(zhàn) 簡介面向同城家政、上門按摩等本地生活服務(wù)場景的預(yù)約系統(tǒng)完整源碼后端基于ThinkPHP與FastAdmin框架前端采用Uniapp實(shí)現(xiàn)微信H5和小程序端適合具備PHP基礎(chǔ)、希望快速搭建可商用預(yù)約平臺(tái)的開發(fā)者或創(chuàng)業(yè)團(tuán)隊(duì)。系統(tǒng)已完整跑通并通過測試包內(nèi)包含公眾號(hào)通知模塊、后端主程序、前端Uniapp源碼、數(shù)據(jù)庫SQL腳本及通知音頻文件運(yùn)行環(huán)境為LinuxNginxphp7.2mysql5.6需安裝fileinfo與redis擴(kuò)展H5屬于公眾號(hào)H5須在微信內(nèi)訪問并配合認(rèn)證服務(wù)號(hào)、微信支付、小程序賬號(hào)完成部署。資源共2000個(gè)文件以JavaScript、Vue組件、Markdown文檔為主輔以JSON、HTML、CSS等配置樣式文件以及SQL、Python輔助腳本整體66.31MB目錄按功能模塊劃分便于快速定位與二次開發(fā)。已有255人學(xué)習(xí)下載參照包內(nèi)說明即可完成環(huán)境搭建、支付與服務(wù)號(hào)配置明顯降低從零開發(fā)聯(lián)調(diào)的踩坑成本。1. 為什么一套thinkphpuniapp的上門預(yù)約源碼能把三個(gè)月工期壓到兩周接到一個(gè)上門家政按摩的需求時(shí)多數(shù)團(tuán)隊(duì)的第一反應(yīng)是拆端用戶端一個(gè)小程序技師端一個(gè)微信小程序后臺(tái)一個(gè)管理系統(tǒng)再來一套H5做分享四端聯(lián)動(dòng)光聯(lián)調(diào)就得一個(gè)月。而thinkphpmysqluniappfastadminuniapp這套組合的思路是后端只有一份PHP負(fù)責(zé)接口和后臺(tái)前端只有一份uniapp代碼同時(shí)編譯成H5、微信小程序和App。后臺(tái)管理用fastadmin二次開發(fā)RBAC權(quán)限、菜單管理、數(shù)據(jù)表格CRUD這些重復(fù)勞動(dòng)直接點(diǎn)出來用。也就是說你真正要寫的只有業(yè)務(wù)層的預(yù)約、派單、支付回調(diào)、結(jié)算這幾個(gè)模塊。這個(gè)方案適合的正是中小本地生活團(tuán)隊(duì)、接外包的獨(dú)立開發(fā)者以及想用最小成本快速驗(yàn)證同城上門模式的初創(chuàng)團(tuán)隊(duì)。它不追求架構(gòu)上的炫技追求的是從拿源碼到跑通首單的速度。2. 選型邏輯這套技術(shù)組合憑什么能扛住上門預(yù)約業(yè)務(wù)2.1 thinkphpfastadmin為什么還是上門預(yù)約類項(xiàng)目的主力選型上門預(yù)約系統(tǒng)這類項(xiàng)目核心業(yè)務(wù)是訂單而訂單系統(tǒng)的首要要求是開發(fā)快、能維護(hù)、招人容易。thinkphp在國內(nèi)中小型項(xiàng)目里的存量非常大中文文檔和社區(qū)問答足夠覆蓋開發(fā)中遇到的絕大多數(shù)問題。對(duì)這個(gè)場景來說生態(tài)比性能重要——你招一個(gè)PHP開發(fā)大概率不用從零教框架你在搜索引擎里搜一個(gè)問題大概率能直接搜到別人踩過的坑。這就是為什么很多同城服務(wù)源碼、外賣源碼、預(yù)約源碼都在thinkphp里做市場已經(jīng)用腳投票了。fastadmin則是建立在thinkphp之上的后臺(tái)開發(fā)框架。它解決的痛點(diǎn)和上門預(yù)約項(xiàng)目高度相關(guān)后臺(tái)要管理用戶、技師、訂單、服務(wù)項(xiàng)目、優(yōu)惠券、提現(xiàn)申請(qǐng)……這些本質(zhì)上都是數(shù)據(jù)表格。fastadmin提供了一鍵生成CRUD的功能你在數(shù)據(jù)庫建好表后臺(tái)就能自動(dòng)生成對(duì)應(yīng)的菜單、控制器、模型和視圖模板。對(duì)于技師審核、訂單列表、資金流水這類管理頁面幾乎不用手寫。我一般接手這類項(xiàng)目時(shí)第一步是先把fastadmin后臺(tái)跑起來看它的菜單結(jié)構(gòu)再?zèng)Q定哪些表直接生成CRUD哪些表需要寫自定義接口。這比從零搭后臺(tái)至少省一半工作量。還有一個(gè)關(guān)鍵點(diǎn)是權(quán)限。上門預(yù)約系統(tǒng)需要區(qū)分總管理、商家/門店管理、財(cái)務(wù)、客服這些角色。fastadmin自帶RBAC權(quán)限管理每個(gè)角色分配菜單和操作權(quán)限這套機(jī)制是現(xiàn)成的。如果自己寫角色-權(quán)限-菜單三張關(guān)聯(lián)表加上中間的邏輯校驗(yàn)又是兩三天的活。省下來的時(shí)間投到業(yè)務(wù)里去。2.2 uniapp一套代碼覆蓋H5、微信小程序和App的編譯鏈路上門預(yù)約系統(tǒng)的前端有一個(gè)特點(diǎn)用戶可能在微信里搜小程序進(jìn)來也可能從朋友圈的H5鏈接進(jìn)來技師端又往往需要裝App。如果用原生開發(fā)這三端各寫一遍維護(hù)壓力巨大。uniapp的價(jià)值就在這里——一套vue語法的代碼通過不同的編譯配置分別產(chǎn)出微信小程序包、H5頁面和原生App包。我在實(shí)際項(xiàng)目中一般把前端分成兩個(gè)uniapp工程一個(gè)是用戶端包含首頁、服務(wù)分類、下單、訂單列表、支付、評(píng)價(jià)另一個(gè)是技師端包含接單大廳、訂單詳情、導(dǎo)航、結(jié)算記錄、提現(xiàn)。兩個(gè)工程共用公共組件和接口封裝但頁面和登錄邏輯分開。用戶端用微信授權(quán)登錄H5端用手機(jī)號(hào)驗(yàn)證碼登錄不同端之間的差異通過條件編譯處理。條件編譯是uniapp里比較重要的一個(gè)機(jī)制。比如支付邏輯小程序端需要調(diào)起wx.requestPaymentH5端走的是公眾號(hào)支付或掃碼支付。代碼里可以這樣處理// #ifdef MP-WEIXIN uni.requestPayment({ provider: wxpay, orderInfo: res.data.payParams, success: () this.loadOrderDetail() }); // #endif // #ifdef H5 window.location.href res.data.payUrl; // #endif這段代碼的邏輯是編譯到微信小程序時(shí)只保留MP-WEIXIN塊調(diào)用小程序原生的支付接口編譯到H5時(shí)只保留H5塊直接跳轉(zhuǎn)到支付鏈接。這樣支付這種強(qiáng)平臺(tái)差異的邏輯就分開了頁面結(jié)構(gòu)和業(yè)務(wù)邏輯則完全復(fù)用。新人在接這類項(xiàng)目時(shí)最容易出問題的地方就是分不清哪些代碼是跨端通用的哪些是端特有的。我的經(jīng)驗(yàn)是只管接口和渲染的代碼盡量寫通用一碰到登錄、支付、地理位置、文件上傳這類邊界能力馬上用條件編譯隔離。2.3 mysqlredis的分工哪些數(shù)據(jù)必須走數(shù)據(jù)庫哪些走緩存上門預(yù)約系統(tǒng)的數(shù)據(jù)可以分成兩層一層是訂單、用戶賬戶、技師資料、交易流水這些是核心業(yè)務(wù)數(shù)據(jù)必須保證強(qiáng)一致一律放mysql另一層是驗(yàn)證碼、token會(huì)話、在線狀態(tài)、首頁熱門技師緩存這些允許短暫過期和延遲放redis是常規(guī)做法。mysql這邊有一個(gè)值得注意的點(diǎn)所有的訂單狀態(tài)變更都應(yīng)該用事務(wù)條件更新來保證安全。比如用戶取消訂單、技師接單、平臺(tái)關(guān)閉訂單三者的本質(zhì)都是把某個(gè)狀態(tài)的訂單變成另一個(gè)狀態(tài)必須確保同一時(shí)刻只有一個(gè)操作能成功。事務(wù)在這里是底線。redis的作用則更偏提速和限流。上門預(yù)約系統(tǒng)里最典型的redis應(yīng)用是短信驗(yàn)證碼的發(fā)送間隔控制同一個(gè)手機(jī)號(hào)60秒內(nèi)只能發(fā)一次直接在redis里存一個(gè)key設(shè)置有效期60秒發(fā)送前先查這個(gè)key。另一個(gè)典型應(yīng)用是技師端接單大廳的訂單列表緩存——新訂單寫入mysql后同步寫一條到redis列表技師端輪詢接口優(yōu)先讀redis減輕mysql的查詢壓力。緩存和數(shù)據(jù)庫之間的一致性我的做法是只在非關(guān)鍵路徑上用緩存訂單狀態(tài)、賬戶余額這種敏感數(shù)據(jù)絕不先進(jìn)緩存再落庫直接寫mysql讀也直接讀mysql。為省那么一點(diǎn)查詢壓力引入數(shù)據(jù)不一致的坑不值得。2.4 為什么不用微服務(wù)單體架構(gòu)對(duì)這個(gè)業(yè)務(wù)到底夠不夠很多開發(fā)者拿到這類項(xiàng)目后會(huì)問訂單、用戶、支付、技師管理是不是應(yīng)該拆成微服務(wù)這里要給個(gè)明確的結(jié)論同城上門預(yù)約的流量模型是典型的脈沖式峰值QPS大概率在幾十到幾百之間單體架構(gòu)完全扛得住。拆微服務(wù)帶來的服務(wù)發(fā)現(xiàn)、分布式事務(wù)、鏈路追蹤這些問題對(duì)一支三五個(gè)人的開發(fā)團(tuán)隊(duì)來說是負(fù)擔(dān)而不是收益。我傾向于這樣看架構(gòu)業(yè)務(wù)量級(jí)沒到一個(gè)模塊單獨(dú)部署一臺(tái)機(jī)器之前保持單體但把模塊在代碼層面拆清楚。比如fastadmin里的應(yīng)用目錄按模塊組織admin后臺(tái)、api接口、job隊(duì)列各自獨(dú)立邏輯上已經(jīng)分離了。等哪天真需要拆先把a(bǔ)pi模塊抽出來獨(dú)立部署其他模塊保持原樣遷移成本是可控的。這套組合選型的最終理由是它能讓你把有限的開發(fā)資源全部投到業(yè)務(wù)邏輯里而不是基礎(chǔ)設(shè)施里。3. 把上門預(yù)約系統(tǒng)從源碼跑成本地可用的完整步驟3.1 環(huán)境準(zhǔn)備PHP版本、擴(kuò)展和nginx偽靜態(tài)上門預(yù)約系統(tǒng)的源碼跑起來之前先確認(rèn)本機(jī)環(huán)境。PHP建議用7.2到7.4之間的版本這既是thinkphp 5.x系列最穩(wěn)妥的運(yùn)行區(qū)間也兼容fastadmin第三方的絕大多數(shù)插件。需要用到的擴(kuò)展包括pdo_mysql、redis、fileinfo、openssl、gd。其中fileinfo在部分環(huán)境下默認(rèn)沒開thinkphp的文件上傳和圖片處理會(huì)用到漏了會(huì)報(bào)Class finfo not found。redis擴(kuò)展也常被忽略但驗(yàn)證碼和token依賴它后面會(huì)專門說。PHP環(huán)境就緒后設(shè)置php.ini里的兩個(gè)參數(shù)date.timezone Asia/Shanghai post_max_size 100M upload_max_filesize 20M時(shí)區(qū)必須顯式配置。PHP默認(rèn)是UTCmysql默認(rèn)又是系統(tǒng)時(shí)區(qū)兩個(gè)不一致訂單創(chuàng)建時(shí)間、技師接單時(shí)間全都會(huì)歪8個(gè)小時(shí)查數(shù)據(jù)時(shí)翻車概率很高。upload相關(guān)的兩個(gè)參數(shù)是為了后臺(tái)上傳服務(wù)項(xiàng)目圖片、技師頭像時(shí)不至于被大小限制卡住。接下來是nginx的偽靜態(tài)配置。thinkphp的URL訪問方式是入口文件index.php加上路由參數(shù)nginx默認(rèn)配置下訪問https://域名/order/detail?id1這類地址時(shí)nginx會(huì)嘗試找order目錄下的detail文件結(jié)果404。必須在server塊里加上重寫規(guī)則server { listen 80; server_name your.domain.com; root /path/to/your-project/public; index index.php index.html; location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; } } location ~ \.php$ { include fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; } }這段配置的邏輯是當(dāng)請(qǐng)求的文件不存在時(shí)把路徑交給index.php處理并作為參數(shù)s傳遞php文件由fastcgi處理靜態(tài)資源單獨(dú)設(shè)置30天緩存減輕接口服務(wù)器壓力。參數(shù)方面root指向的是項(xiàng)目下的public目錄而不是項(xiàng)目根目錄這是thinkphp的安全要求public之外的目錄不允許被直接訪問。fastcgi_pass的端口要和你本機(jī)php-fpm的listen端口一致默認(rèn)9000如果改動(dòng)過要同步。3.2 導(dǎo)入數(shù)據(jù)庫與后臺(tái)初始化從SQL文件到第一個(gè)管理員賬號(hào)源碼包一般會(huì)帶一個(gè).sql格式的數(shù)據(jù)庫備份文件。操作前先創(chuàng)建一個(gè)utf8mb4編碼的數(shù)據(jù)庫編碼用utf8mb4是為了正確存儲(chǔ)用戶昵稱里的emoji字符。然后導(dǎo)入SQL文件mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS house_service DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; mysql -uroot -p house_service house_service.sql命令說明第一條命令創(chuàng)建數(shù)據(jù)庫第二條把備份文件里的表結(jié)構(gòu)和初始數(shù)據(jù)灌入。導(dǎo)入過程如果報(bào)錯(cuò)常見原因是sql文件里包了創(chuàng)建數(shù)據(jù)庫語句或者是mysql版本差異導(dǎo)致語法不兼容。遇到這種情況直接用可視化工具導(dǎo)入更省心導(dǎo)入后再確認(rèn)一下表數(shù)量和數(shù)據(jù)量避免中途中斷導(dǎo)致缺表。數(shù)據(jù)庫導(dǎo)入后配置項(xiàng)目根目錄下的.env文件或application/database.php。核心是數(shù)據(jù)庫連接信息// application/database.php 中的連接配置 return [ type mysql, hostname 127.0.0.1, database house_service, username root, password your_password, hostport 3306, prefix fa_, charset utf8mb4, ];注意prefix這個(gè)參數(shù)它對(duì)應(yīng)數(shù)據(jù)表前綴。fastadmin的數(shù)據(jù)表默認(rèn)前綴是fa_例如fa_order、fa_technician。如果導(dǎo)入的表還是源碼自帶的前綴這里就不動(dòng)如果手動(dòng)改過表名前綴這里必須保持同步否則模型查詢時(shí)找不到表。表前綴不一致是拿到新項(xiàng)目后最常見的啟動(dòng)報(bào)錯(cuò)原因看到table not exists先查這里。后臺(tái)初始化在瀏覽器訪問http://127.0.0.1/install.phpfastadmin會(huì)引導(dǎo)你設(shè)置管理員賬號(hào)和密碼。安裝完成后后臺(tái)入口一般是http://127.0.0.1/admin.php。管理員登錄后第一件事是檢查菜單管理是否完整其次是權(quán)限管理里的角色是否可用。如果登錄后空白頁或者報(bào)權(quán)限錯(cuò)誤基本都是后臺(tái)菜單緩存或權(quán)限緩存沒生成清掉runtime目錄下的緩存文件再刷新。3.3 前端uniapp編譯到H5和小程序manifest配置與接口域名前端工程是uniapp項(xiàng)目用HBuilderX或命令行工具打開。編譯到H5之前必須修改manifest.json里的配置。H5模塊需要設(shè)置路由模式小程序模塊需要填A(yù)ppID——如果還沒有小程序AppID在微信公眾平臺(tái)注冊(cè)一個(gè)測試號(hào)即可。另一個(gè)容易漏的是小程序后臺(tái)的request合法域名配置這個(gè)放到避坑章節(jié)詳細(xì)說。接口請(qǐng)求地址統(tǒng)一封裝在一個(gè)工具文件里下面是實(shí)際項(xiàng)目里常用的寫法// utils/request.js const BASE_URL https://api.yourdomain.com; export function request(path, data {}, method POST) { return new Promise((resolve, reject) { uni.request({ url: BASE_URL path, method: method, data: data, header: { Content-Type: application/json, Token: uni.getStorageSync(token) }, success: (res) { resolve(res.data); }, fail: (err) { reject(err); } }); }); }這個(gè)封裝把三件事統(tǒng)一了接口前綴統(tǒng)一、token自動(dòng)帶上、返回結(jié)果統(tǒng)一走Promise。實(shí)際開發(fā)中所有業(yè)務(wù)模塊都引用這個(gè)request函數(shù)不要在每個(gè)頁面里直接調(diào)uni.request否則后續(xù)要改接口地址或者加統(tǒng)一錯(cuò)誤處理時(shí)就得全局搜索替換。BASE_URL對(duì)應(yīng)的是后端api模塊的地址本地聯(lián)調(diào)時(shí)先指向本機(jī)IP加端口編譯發(fā)布時(shí)再改成正式域名。3.4 前后端聯(lián)調(diào)打通從登錄到首單的接口路徑環(huán)境全準(zhǔn)備好后按一條鏈路驗(yàn)證整個(gè)前后端是否打通用戶登錄、獲取服務(wù)項(xiàng)目、提交預(yù)約、技師接單、生成訂單。這條鏈路走通系統(tǒng)就算跑起來了。我一般會(huì)先在后端api模塊里寫一個(gè)ping接口驗(yàn)證網(wǎng)絡(luò)鏈路// application/api/controller/Test.php public function ping() { return json([code1, msgpong, timetime()]); }前端瀏覽器或微信開發(fā)者工具請(qǐng)求http://localhost/thinkphp/public/index.php/api/test/ping能拿到JSON就說明后端可用。這里要提醒一點(diǎn)如果是本地聯(lián)調(diào)H5瀏覽器直接請(qǐng)求http://localhost的php接口通常是通的但小程序開發(fā)者工具有自己的限制后面避坑章節(jié)展開講。接下來按業(yè)務(wù)流程逐項(xiàng)測試手機(jī)號(hào)驗(yàn)證碼登錄、服務(wù)項(xiàng)目列表、提交預(yù)約單、模擬技師端接單。每測試一個(gè)接口都在mysql里查一下對(duì)應(yīng)表的數(shù)據(jù)變化確認(rèn)寫庫成功再進(jìn)入下一步。前后端聯(lián)調(diào)的常見問題十有八九出在參數(shù)名不一致上php端讀的是tech_id前端傳成technician_id接口返回參數(shù)錯(cuò)誤。我的習(xí)慣是先打開php的DEBUG模式把真實(shí)報(bào)錯(cuò)暴露出來再逐個(gè)接口對(duì)齊參數(shù)名。聯(lián)調(diào)通過之后再把DEBUG關(guān)掉避免線上暴露敏感信息。4. 上門預(yù)約系統(tǒng)核心業(yè)務(wù)訂單狀態(tài)、搶單邏輯與同城距離排序4.1 訂單狀態(tài)機(jī)讓狀態(tài)的每一次流轉(zhuǎn)都有據(jù)可查上門預(yù)約系統(tǒng)的訂單和標(biāo)準(zhǔn)電商訂單有本質(zhì)差異多了一個(gè)上門的物理過程。一次完整的服務(wù)要經(jīng)過用戶提交預(yù)約、平臺(tái)或技師接單、技師上門、正在服務(wù)、服務(wù)完成待評(píng)價(jià)、結(jié)算完成中間還穿插用戶取消、技師取消、超時(shí)未接自動(dòng)取消等多種分支。把這個(gè)流程管理好訂單模塊就穩(wěn)了一半。狀態(tài)清單和允許的流轉(zhuǎn)方向如下狀態(tài)含義允許流轉(zhuǎn)到0待支付1-待接單、-1-已取消1待接單2-待服務(wù)、-1-已取消2待服務(wù)3-服務(wù)中、-1-已取消3服務(wù)中4-待評(píng)價(jià)4待評(píng)價(jià)5-已完成5已完成無-1已取消無注意待支付可以直接跳待接單而不是經(jīng)過已支付這個(gè)狀態(tài)。這里是為了和支付回調(diào)對(duì)齊用戶支付成功回調(diào)里直接把狀態(tài)改成待接單同時(shí)更新支付時(shí)間和第三方流水號(hào)。把已支付省掉能減少一次狀態(tài)流轉(zhuǎn)也避免出現(xiàn)已支付但沒進(jìn)待接單的中間態(tài)。我在項(xiàng)目里見過這個(gè)坑問題不大但排查時(shí)很繞。狀態(tài)流轉(zhuǎn)的校驗(yàn)必須在后端做不能依賴前端傳state直接update。一個(gè)簡單的狀態(tài)機(jī)控制類// application/common/model/OrderStatus.php class OrderStatus { const UNPAID 0; const PENDING 1; const TO_SERVE 2; const SERVING 3; const WAIT_COMMENT 4; const COMPLETED 5; const CANCELED -1; private static $flows [ self::UNPAID [self::PENDING, self::CANCELED], self::PENDING [self::TO_SERVE, self::CANCELED], self::TO_SERVE [self::SERVING, self::CANCELED], self::SERVING [self::WAIT_COMMENT], self::WAIT_COMMENT [self::COMPLETED], ]; public static function canChange($from, $to) { return isset(self::$flows[$from]) in_array($to, self::$flows[$from]); } }這段代碼定義了訂單狀態(tài)的全集和每個(gè)狀態(tài)允許跳轉(zhuǎn)到的目標(biāo)狀態(tài)。所有修改訂單狀態(tài)的地方先調(diào)canChange校驗(yàn)不通過就直接拒絕。這樣即使前端被改過、接口被惡意調(diào)用訂單也不會(huì)進(jìn)入非法狀態(tài)。值得注意的是狀態(tài)變更接口對(duì)外提供時(shí)只能接受當(dāng)前狀態(tài)目標(biāo)狀態(tài)訂單號(hào)絕不能直接把整個(gè)訂單對(duì)象傳上來讓你自由更新字段那是自尋死路。4.2 技師搶單的并發(fā)控制為什么直接update比先select再update可靠技師端接單大廳的核心操作是搶單而搶單的本質(zhì)是并發(fā)競爭一個(gè)資源。兩個(gè)技師同時(shí)看到同一個(gè)訂單都點(diǎn)了接單如果代碼寫成先select查狀態(tài)再update改狀態(tài)就會(huì)出大問題。兩個(gè)請(qǐng)求幾乎同時(shí)讀到status為1都認(rèn)為訂單可接然后各自執(zhí)行update后執(zhí)行的覆蓋先執(zhí)行的一個(gè)訂單被兩個(gè)技師同時(shí)接走。這屬于典型的競態(tài)條件。正確做法是單條SQL原子更新把狀態(tài)檢查放進(jìn)update的where條件里// application/api/controller/Order.php 技師接單 public function accept() { $orderId $this-request-post(order_id); $techId $this-request-post(tech_id); $result Db::name(order) -where(id, $orderId) -where(status, OrderStatus::PENDING) -update([ status OrderStatus::TO_SERVE, tech_id $techId, accept_time time(), ]); if ($result 1) { // 影響行數(shù)為1說明本次更新成功訂單歸這位技師 return json([code 1, msg 接單成功]); } // 影響行數(shù)為0說明訂單狀態(tài)已不是待接單被別的技師搶了 return json([code 0, msg 手慢了訂單已被接走]); }這個(gè)寫法的精妙之處在于where里帶了status條件數(shù)據(jù)庫行鎖在更新時(shí)會(huì)再次校驗(yàn)where條件只有狀態(tài)仍是1的記錄才會(huì)被更新返回值影響行數(shù)是1否則影響行數(shù)是0。不需要事務(wù)不需要redis鎖一條SQL就把并發(fā)問題解決了。這是這類項(xiàng)目里最值得記住的寫法比引入分布式鎖簡單得多也穩(wěn)得多。再說一下redis鎖在什么情況下才需要當(dāng)一個(gè)操作涉及多張表的多個(gè)步驟且必須在整個(gè)過程中獨(dú)占資源時(shí)才需要考慮鎖。比如用戶余額提現(xiàn)到微信錢包需要凍結(jié)余額、創(chuàng)建提現(xiàn)單、調(diào)第三方接口這串操作需要一把鎖保護(hù)。而單純搶單這種單表單字段的變更原子update就夠了。不要把所有并發(fā)問題都甩給redis很多問題的正解就在數(shù)據(jù)庫本身。4.3 同城距離計(jì)算經(jīng)緯度排序在mysql里的高效寫法同城兩個(gè)字是這類系統(tǒng)的業(yè)務(wù)核心。上門預(yù)約服務(wù)里用戶看到技師列表時(shí)一般有兩個(gè)訴求只看到同一個(gè)城市的技師并且按照距離從近到遠(yuǎn)排序。城市過濾用city_id字段即可難點(diǎn)在距離排序。同城業(yè)務(wù)的覆蓋范圍通常在一個(gè)城市內(nèi)部經(jīng)緯度差異不大這時(shí)可以用haversine公式的簡化形式在mysql里直接算距離并排序。下面這段SQL在幾千技師的數(shù)據(jù)量下性能可以接受SELECT id, name, avatar, lat, lng, 6371 * 2 * ASIN(SQRT( POWER(SIN((:user_lat - lat) * PI() / 360), 2) COS(:user_lat * PI() / 180) * COS(lat * PI() / 180) * POWER(SIN((:user_lng - lng) * PI() / 360), 2) )) AS distance FROM fa_technician WHERE city_id :city_id AND status 1 HAVING distance 10 ORDER BY distance ASC LIMIT 20;參數(shù)說明user_lat和user_lng是用戶當(dāng)前定位的經(jīng)緯度city_id是用戶所選城市distance的單位是公里HAVING distance 10表示只顯示10公里內(nèi)的技師。這段SQL的代價(jià)是每條記錄都做三角函數(shù)運(yùn)算在技師表數(shù)據(jù)量超過幾萬時(shí)響應(yīng)會(huì)變慢但同城業(yè)務(wù)單城市技師數(shù)通常不會(huì)到這個(gè)量級(jí)所以前期完全夠用。如果技師數(shù)增長到十萬級(jí)再考慮引入按經(jīng)緯度網(wǎng)格分區(qū)或使用空間索引不要一開始就上重型方案。數(shù)據(jù)量上來后常見的優(yōu)化手段是粗篩后精算第一步用經(jīng)緯度差做一個(gè)方形框過濾把計(jì)算限定在一個(gè)小矩形區(qū)域里第二步只對(duì)框內(nèi)記錄做精準(zhǔn)的距離計(jì)算。方形框的邊界值用固定比例估算一個(gè)經(jīng)度約111公里緯度約111乘以cos緯度公里來算。這個(gè)優(yōu)化可以直接在一開始就寫進(jìn)SQL里把三角函數(shù)計(jì)算量降一個(gè)量級(jí)。5. 上門預(yù)約系統(tǒng)避坑記錄5個(gè)上線前后最容易翻車的現(xiàn)場5.1 小程序請(qǐng)求接口直接失敗連失敗回調(diào)都不觸發(fā)現(xiàn)象H5端一切正常換成微信開發(fā)者工具后所有接口請(qǐng)求都報(bào)request:fail。原因微信小程序?qū)W(wǎng)絡(luò)請(qǐng)求有域名限制正式環(huán)境要求request的url必須是HTTPS且在微信公眾平臺(tái)后臺(tái)配置過request合法域名開發(fā)環(huán)境下雖然可以勾選不校驗(yàn)合法域名但前端代碼里的接口地址如果是http://localhost或http://192.168.x.x這類本機(jī)地址在真機(jī)預(yù)覽時(shí)依然會(huì)被攔截。解決本地調(diào)試時(shí)在微信開發(fā)者工具的詳情設(shè)置里勾選不校驗(yàn)合法域名、web-view業(yè)務(wù)域名、TLS版本以及HTTPS證書要真機(jī)預(yù)覽則需把接口部署到一臺(tái)有公網(wǎng)地址且已配置HTTPS證書的服務(wù)器上并在小程序管理后臺(tái)添加合法域名。另外注意小程序要求TLS版本不能低于1.2部分老服務(wù)器上自簽證書或舊openssl配置會(huì)在這里卡住。5.2 thinkphp在nginx下訪問任何非首頁路由都404現(xiàn)象首頁能打開但訪問http://域名/order/list這類地址時(shí)nginx直接返回404后端接口全掛。原因nginx沒有配置thinkphp的偽靜態(tài)規(guī)則nginx在找不到對(duì)應(yīng)文件時(shí)按自身默認(rèn)行為處理沒有把路徑轉(zhuǎn)交給index.php。解決在nginx的server配置里加上rewrite規(guī)則核心是if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; }。改完配置后reload nginx不要忘記。還有一個(gè)容易踩的細(xì)節(jié)點(diǎn)thinkphp的入口文件是public/index.php如果root配置指向了項(xiàng)目根目錄而不是public目錄即使rewrite正確也會(huì)報(bào)錯(cuò)因?yàn)閕ndex.php不在根目錄下也等于把非public目錄里的文件暴露了出去。5.3 mysql時(shí)間差8小時(shí)訂單時(shí)間、技師服務(wù)時(shí)間全錯(cuò)位現(xiàn)象后臺(tái)看到的訂單創(chuàng)建時(shí)間比實(shí)際時(shí)間慢8個(gè)小時(shí)技師端顯示的預(yù)約時(shí)間也偏移。原因PHP的默認(rèn)時(shí)區(qū)是UTCmysql的默認(rèn)時(shí)區(qū)取決于服務(wù)器系統(tǒng)配置。PHP寫入的時(shí)間戳在mysql里顯示出來會(huì)因?yàn)闀r(shí)區(qū)換算產(chǎn)生8小時(shí)偏移。解決先確保php.ini中配置date.timezone Asia/Shanghai再確認(rèn)mysql的時(shí)區(qū)設(shè)置可以執(zhí)行SQL查詢select now();如果結(jié)果和服務(wù)器本地時(shí)間不一致在mysql配置文件的[mysqld]段加一行default-time-zone08:00。兩個(gè)地方都對(duì)齊之后再測試一遍。這個(gè)問題玄學(xué)的地方在于本地開發(fā)可能不出現(xiàn)一部署到云服務(wù)器就出現(xiàn)因?yàn)樵品?wù)器默認(rèn)時(shí)區(qū)往往是UTC。5.4 技師端輪詢接口打垮服務(wù)器沒有增量拉取的搶單大廳現(xiàn)象上線第一天技師端接單大廳接口的響應(yīng)從50毫秒漲到3秒服務(wù)器CPU持續(xù)跑滿mysql連接數(shù)被打滿。原因技師端每3秒輪詢一次訂單列表每次都返回全量待接單訂單幾百個(gè)技師同時(shí)輪詢瞬間打出的查詢量遠(yuǎn)超mysql承受能力。解決輪詢接口改成增量拉取。前端記錄上一次請(qǐng)求返回的最大訂單ID下一次請(qǐng)求帶上這個(gè)ID后端只返回ID大于它的新訂單和狀態(tài)有變更的訂單。這個(gè)方案能在不引入websocket的前提下把服務(wù)器壓力降低一個(gè)量級(jí)。改造后同樣規(guī)模的并發(fā)接口響應(yīng)時(shí)間恢復(fù)到100毫秒以內(nèi)。這里要特別強(qiáng)調(diào)不要一上來就上websocket方案先把輪詢的增量邏輯做對(duì)大多數(shù)同城預(yù)約場景的實(shí)時(shí)性要求根本用不上長連接。5.5 并發(fā)搶單出現(xiàn)一單多接先查后改的代碼寫錯(cuò)了位置現(xiàn)象兩個(gè)技師都收到接單成功的通知后臺(tái)查詢訂單發(fā)現(xiàn)tech_id字段被后操作的技師覆蓋。原因接單接口寫成了先select查詢訂單狀態(tài)、判斷可接、再update更新狀態(tài)的三段式。兩個(gè)并發(fā)請(qǐng)求同時(shí)讀到status為待接單都通過了判斷先后執(zhí)行update后執(zhí)行的覆蓋先執(zhí)行的。解決按第4章講的方式改寫為單條update語句將狀態(tài)判斷放進(jìn)where條件用影響行數(shù)判斷是否搶單成功。代碼改完后可以做一次并發(fā)壓測驗(yàn)證簡單方式是用兩個(gè)瀏覽器同時(shí)點(diǎn)接單按鈕也能復(fù)現(xiàn)。這是一條典型的血淚經(jīng)驗(yàn)我在早期項(xiàng)目里踩過直接在線上出現(xiàn)過一單多接的運(yùn)維事故。修完之后要同步檢查其它可能的并發(fā)點(diǎn)用戶余額扣減、優(yōu)惠券核銷、技師時(shí)間表占用凡是存在先查后寫模式的地方一律改成條件更新。6. 上線前的最后一道工序把演示源碼變成能商用的可用系統(tǒng)演示源碼跑通和真正對(duì)外接單之間還隔著幾道不得不做的工序。第一道是支付和結(jié)算確認(rèn)微信支付/支付寶的小程序商戶號(hào)配置在后端配置項(xiàng)里支付回調(diào)地址必須是公網(wǎng)HTTPS地址回調(diào)邏輯要處理支付成功但訂單狀態(tài)沒更新的重復(fù)通知——支付回調(diào)可能被微信多次推送冪等處理必須做。第二道是把用戶協(xié)議、隱私協(xié)議、技師入駐協(xié)議加上這是這類平臺(tái)的合規(guī)底線。第三道是接口的鑒權(quán)和限流后臺(tái)登錄、下單、提現(xiàn)、驗(yàn)證碼發(fā)送這幾個(gè)接口至少要加頻率限制redis計(jì)數(shù)器就能實(shí)現(xiàn)避免被刷。真正進(jìn)入運(yùn)營后有個(gè)技巧值得優(yōu)先投入把技師端搶單做成可配置的策略。前期單量少可以先用平臺(tái)派單——管理員在后臺(tái)直接把訂單分配給指定技師單量上來了再切先到先得的搶單模式。這個(gè)開關(guān)的核心邏輯就是一個(gè)配置項(xiàng)// 配置項(xiàng)dispatch_mode值為manual表示后臺(tái)派單compete表示搶單 $mode config(site.dispatch_mode); if ($mode manual) { // 后臺(tái)指派管理員選技師接口直接綁定訂單 Db::name(order)-where(id, $orderId) -where(status, OrderStatus::PENDING) -update([status OrderStatus::TO_SERVE, tech_id $techId]); } else { // 搶單模式走第4章的原子更新邏輯 }參數(shù)說明dispatch_mode這個(gè)配置放在后臺(tái)的系統(tǒng)配置里運(yùn)營人員可以不用改代碼直接切換。不同模式下前端技師端的交互也要配合——搶單模式顯示立即接單按鈕派單模式只顯示訂單已指派的提示。這是從源碼走向商業(yè)運(yùn)營最值得做的改造之一能讓運(yùn)營策略的試錯(cuò)成本降到最低。我自己的經(jīng)驗(yàn)是做這類系統(tǒng)卡住進(jìn)度的從來不是技術(shù)難點(diǎn)而是以為演示能跑就等于能上線的心態(tài)。演示源碼解決的是從無到有的問題從有到可用還需要把并發(fā)、支付、合規(guī)這三件事挨個(gè)磨一遍。每多提前一天處理這些問題上線后就少一分被用戶罵的風(fēng)險(xiǎn)。希望這篇筆記對(duì)你有點(diǎn)幫助。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
人妻精品视频一区二区三区| 欧美成年人性爱视频免费观看| 丁香五月偷拍| 91久久免费视频互動交流| 中文字幕在线24| 国产精品另类一区大香蕉| 99操99| 91色花堂| 天天天堂影视日韩亚洲91| 国产极品美女高潮无套在线观看| 国产中文字幕在线点播| 亚洲欧美另类图片| 婷婷10月天青娱乐| 777超碰| 狠狠干妹子| 中文一区二区婷婷视频| 久操B网| 激情五月丁香五月| 抽插无码高清一区| 精品人妻一区| 亚洲AV无码黄色强奸| 乱性AV| 香蕉视频欧美一卡二卡| 噜噜噜亚洲精| 91视频在线观看18| 亚洲性天堂| 97欧美色| 超碰9 7女人 | aaa一级黄片| 人妻 中文 日韩| 久久久久久69国产一区二区| 狠狠操,使劲操| 伊人91| 97人妻人人躁人人玩人人| 大香蕉在线视频重口味毛片在线| 大香蕉免| 竹菊一区二区三区AV线| 日曰骚久久精品| 五月天九九日国产精品一区二区三区| 大香蕉92| 一起草视频在线| 国产精品久久久久久久久久久久久久吹 | 国产无码高清操逼视频| 秋霞网—男女啪啪亚洲免费体验区 | 91老熟女视频| 夜夜操美女| 亚洲全色网| av毛片aaaaa免费看| 美女诱惑久久| 色y情视频免费看| 操逼天美3区| 奇米四色网| 国产精品自产拍在线观看社区| 小视频玖玖| 国产小黄片在线免费观看| 97任你吞精| 欧美久热| 97久久久精品| 丰满熟女人妻一区二区三五十一路| 无卡一区=区| 91狠狠狠| 最好看的中文字幕在线2018| 久久久久国产无av| 日本熟妇熟色97一本在线观看| 久操99| 亚洲欧美啪啪| 欧美狠狠干| 成人av在线播放| 伊人女女资源在线观看| 亚洲少妇激情视频| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 强奸乱伦麻豆| 婷婷五月天久久精品视频一区二区三区| 五十路熟女工口| 久久久99999久网站| 麻豆人妻少妇在线免费观看| 日本免费人成视频播放120秒| 伊香蕉综合久久久久久久噜噜噜| www.久久制服糖| hd成人一区二区在线| www.天天干| 亚洲人妖网| 夜夜嗨免费视频| 四虎在线观看视频| 亚洲精品aa久久伊人| 亚洲日本加勒比在线| 91九九九逼| 久久久91福利姬| 欧美高清无码免费视频高清版| 日本色色色视频| 人妻夜夜爽天天爽麻豆三区网站| 九七人妻在线| 思思视频免费看网站| 99精品视频在线观看| www.99热| 一级毛片电影免费看| 久久久免费的精品| 磁力99AV| 亚洲色图欧美一区二区不卡| 97资源超碰| 超碰这里有精品| 日本东京热加勒比久久| 久久e6只有精品| 乱人乱色一区二区三区免费| 亚洲有薄码区日本系列中文字幕| 色综合1991| 琪琪精品免费一区二区三区| 亚洲精品视频在线播放| 福利在线观看一区二区| 天堂性色| 91free福利| 欧美91精彩| 一级毛片久久久久久久女人18| 色播五月丁香| 91天天综合日韩欧美| 无码免费一区二区三区啪啪| 不卡视频一区蜜桃视频| 操一区| 精品丰满熟妇人妻一区| 国产色呦呦| 91久久堂| 黄片直播三级黄片两女一男| 97超碰9| 99热精品在线| 亚洲资源站| 欧美一级色| 天天躁日日躁狠狠狠躁| 五月丁香综合啪啪| 9久热这里只有精品| 国产懂色精品国产av| 亚洲日韩熟女人妻高清在线| 午夜激情成人在线观看| 亚洲无限观看| 干干干天天| 日本天天干天天操一区| www.久久| 国产精品另类| 伊人青青一区成人视频在线观看区| 四方色播| 老熟女91av| 欧美一级A一级a爱片久久| WWW4虎| 久综合国内精品自在自线| 天美传媒AV国产在线| 93人人操人人| 97久操| 美女刺激久久国产欧美| 黄色操人| 五月天久久综合网| 欧美综合色,www| 国产午夜精品理论片a大结局| 午夜精品久久久| 很黄很污的免费网站| 老司机午夜精品视频| 少妇天堂网络| 亚洲AV无线| 亚洲九九视频| 欧美狠狠操| a级成人毛片免费视频高清| 欧美日韩亚洲少妇寂寞影院正在播放 | 欧美天天谢综合网| 国产精品久久久三级无码| 日日爱99| 97jingpin| 99国产精品免费| 久久久婷婷| 免费中文综合精品| 九久久精| 欧美色图人妻| 97WW精品| 婷婷五月天网| 欧美日韩性爱操大逼| 91亚洲欧美激情| 国产黄色动态精品| 超碰人人乐97| 95精品在线| 日韩欧美经典在线观看| 老外又粗又长一晚做五次| 97资源站国产精品| 久草热制服丝袜在线观看| 激情五月婷婷综合| 凹凸视频特色日本特黄| 一类av片在线看| 91人妻少妇| 国产人妻精品一区二区三区秋霞| 99色骚| 丝袜美腿诱惑亚洲欧美视频在线观看 | 国产丰满少妇久久久精品影院| 伊人网高清| 探花一区二区三| 国产91丝袜在线播放蜜月| 91精品少妇搡搡搡| 91成人国产综合久久精品蜜月| 色欲久久综合| 日韩欧美经典在线观看| 久久首页| 国产对白刺激视频| AVE乱伦| 欧美91变态| 亚洲精品国产拍免费91在线| 小电影欧美91| 97色欧洲| 欧美色老汉| 激情内射| 精品少妇一区二区| 91亚洲黄色网| 日日躁夜夜躁狠狠躁超爽| 中日韩久久久免费看| 天天射夜夜| 密臀视频一区二区三区| 亚洲drav色图| 国产三级中文字幕粉嫩| 久操视频在线观看| 精品无码一区二区三区| 亚洲日韩视频二区| 在线国产福利网址导航 | 高清无码网址| 欧美日韩情色一区二区| 91女神在线视频| 国产福利夜| 久久久∴| 鸥美中出| 91av一区二区在线观看| 色色色天美视频| 精品人妻1237| 国产精品99精品视频网站| J?P?NESEHD熟女熟妇伦| 国产精品美女在线一区| 伊人五月天激情| 欧美特大黄一级片片免费| 激情接吻视频久久久久久| 在线性黄高清免费视频| 很很干很很操| 欧洲精品一区二区三区| 欧美淫乱视频| 男人天堂网站| 99精品久久久久久久婷婷| 婷婷久久综合久| 韩国女主播青草福利视频| 午夜福利区| 校园春色美腿丝袜| 超碰在线香蕉| 99热综合在线| 色香网| 热99这里有精品综合久久 | 婷婷色综合| 亚欧美天堂在线| 久久综合av| 97干在线视频| 中文字幕精品日韩中文字幕| 女优视频第10页| 欧美页片| 五月天伊人网| WWW黄片COM| 啊啊啊啊啊好大好舒服想要| 99精品九九九九九九| 激情小说日韩无码| 色999亚洲人成色| 污污污8888| 亚洲情色 欧美| 小日子操bb在线看| 欧美男人一区| BBBBB97COM| 思思热久久成人| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 91老妇女| 在线观看成人性爱免费小视频| 婷婷亚洲天堂| 亚洲系列欧美| 正在播放国产精品一区| 久久亚洲不卡一区二区三区| 性爱免费视频成人| 无码久久亚洲高清,| 国产成人无码网站在线视频| 十八禁视频一区二区| 91无码人妻精品一区二区三区蜜桃 | 久9热| 情色五月天久久久| 乱操乱伦AV| 大香蕉九九| 超碰精品人妻狠狠干| 久久久久亚洲av综合波多野制衣| 黄色成品网站| 亚洲欧洲自拍图片专区满春格| 99久久网站| 亚洲区小说| 操逼视频免费日韩无码| 狠狠操狠狠燥| 91人妻中文| 天天激色| 99亚洲天堂| 亚洲资源吧| 国产亚洲国产超碰| 97超碰精品图片| 综合色播| 97欧美精品| 国产日本熟女顶级一区二区三区视频 | 欧美在线中M| 噜噜噜在线视频| 精品成人女人久久| 国产麻豆福利av在线播放| 亚州九九九精品视频| 亚洲 日韩 丝袜 熟女 变态| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 东北老女人的激情视频| 国产欧美成人第一页在线观看 | 啪啪免费| 一区二区不卡视| 久久久久精| 九九九色| 97一区二区三区视频| 亚洲 日韩 丝袜 熟女 变态| 狠狠爱夜夜干| 久悠悠av| 在线国产福利网址导航 | 人人扣人人操| 97啪啪| 国产成人主播| www.色婷婷色综合| 久久九色| 亚热日本熟女| 五月婷婷色| 日本孕妇一区二区视频操逼免费看 | 亚洲高清无毛一区二区| 日本加勒比无码专区一二三| 开心激情婷婷| 岛国1区2区3区在线观看| 欧美激色| 中文一区二区婷婷视频| 国产亚洲精品美女久久久久久2021| 国产91专区| 99热精品在线| 99xav| 九九九热| 中文字幕视频在线观看一区二区| 精品无码一区二区三区色欲| 18禁免费视频| 91视频伊人| 欧美亚洲特P| 综合国产影视三级| 二三四区精品| 欧美色图91p| 使劲用力艹少妇视频一区二区| 久久综合久色欧美综合狠狠| 五月婷婷激情网| 深夜啪啪啪视频免费| 蜜臀aV午夜一区二区三区| 成人性爱AV在线免费观看| 亚洲成人在线资源| 东京热一区二区中文字幕| 色爱三区| 亚洲日韩天堂| 人人看人人插| 亚洲aV无码成人在线观看| 99无码| 日韩色欲久久一二三四区| 中文字幕在线观看二区三区| 99热综合在线| 色婷婷在线视频精品导航| 麻豆AV一区二区| 热久日综合| 亚洲欧美综合图片| 日本色色色网站免费看不卡| 日逼国产| 亚洲色图欧美另类在线| 亚洲宗合网| 91A欧美电影网站| 亚洲国产精品99久久久| AA丁香综合激情| 97干com| 天天综合网合集91| 成人自拍三级在线观看| 日本一二区不卡| 亚州情色j区| 人妻天天爽夜夜爽2| 大香蕉78| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 日韩视频小说在线观看| 大鸡巴久久| 国产精品视频白浆免费| 四虎免费看黄| 日韩激情毛片一级久久久| 婷色五月天| 精品人妻视频一区二区在线播放 | 大香蕉中文201| 亚洲AV无码成人精品久久| 肉嘟嘟www视频在线观看高清| 欧美九9 9 9| 97国产精品久久久久| 两女互慰AV高潮喷水在线观看| 六月丁香啪啪| 91欧美大片| 色999人与兽| 97超碰资源网| 艳美熟妇先锋一二三区| 亚洲综合首页| 抽查国产福利主播| 日韩一区二区精彩视频| 妇女视频网站| 色香色欲天天综合网天天来吧 | 超碰人妻中文在线| 亚洲第一精品在线视频| 九一综合精品视品av| 日韩欧无码一区二区三区免费不卡| 99在线精品观看99| 永久免费av无码网站国产app| 中文一区二区婷婷视频| 精品毛片av一区二区| 怡红院亚洲怡春院av| 久久久久国产无av| 超碰成人人人爽人人爽| 长久操视频| 人妻熟女字幕一区二区| 国产极品美女高潮无套在线观看 | 黄色毛片A片| 国产路线专区| 一区二区国产视频在线观看| 亚洲av成人精品一区| 大香蕉2017| 亚洲欧美在线观看无码| 淮穴色AV| 日韩免费簧片| 日本人人操人人操| 传媒在线观看一区二区三区| 天天摸夜夜摸| 亚洲情色91| 日本性爱不卡视频| 日韩AV无码网站| 97日韩欧美亚洲| 熟女熟妇一区二区三区视频| 黄色av网站在线播放| 九九九九九九九九九国产精品 | 色狠狠综合| 欧美欧美啪啪视频| 99久久99九九99九九九| 少妇三P| 日本欧美成人片AAAA| 亚洲成人美女无吗| 国产精品久久久久久无码红治院| 国产精品直播在线观看直播| 天天欧美| 人人妻人人爽人人精品| 美女啪欧美一区| 欧美性爱三区二区| 蜜臀网 一区| 伊人久久大香线综合无码| A级国产欧美激情在线| 囯产精品久久久久久久久久梁医生| 91色拍| 97激情97激情| 加勒比海成人视频网| 天天操熟妇| 熟女精品一区二区三区| 国产精品探花视频| 人妻无一区二区三区| 久久99干一本高清| 青青三级视频| 久草精品视频| 色九九综合AV| 一本一道久久综合久久| 日本肉体xxxx裸交| 久久精品国产精品亚洲艾通辽熟妇 | 麻豆国产精品午夜视频| 男人a天堂手机在线版| 国产精选视频| 欧美97在线欧| 国产精品久久久三级无码| 91高清日| 五月丁香久久| 五月天我淫我色av| 少妇毛片久久| 亚洲情色91| 亚洲激情综合另类男同| 精品久久久无码| 中文字幕亚洲在线一区 | A级国产欧美激情在线| 久久AV无码AV| 乱论91| 99无码精品| 国产A v无码专区| 啊啊啊啊啊啊在线| 亚洲成人碰碰| 97视频网站| 国产亚卅97| 亚洲激情视频| 国产精品国产自产高清AV | av天堂天堂av日韩| 中日韩久久久免费看| 九九九九日本 | 亚洲欧美不卡线| 久操com| 婷婷五月丁香五月| 亚洲日韩东京热一区| 国产精品对白自产拍| 人妻欧美| 久久婷婷综合国际产色怕| 精品久久久无码| 欧美综合综合| 久久6热视频免费观看| 91女网站| 伊人九九九| 色情乱伦AV| 超碰 97国产熟女| 我爱操| 91人妻最真实刺激绿帽| 国产精品久久久777| 五月丁香激情四射| 色爱综合网欧美| 日韩三级伦理中文字幕| 国产中午字一暮区| 亚州综合网| 操逼免费视频无码国产| 中文字幕精品亚洲熟女| 97精彩视频网站| 97综合在线观看| 天天日天天搞天天干| 亚洲超碰在线| 亚洲丝袜二区在线| 国产又色又爽又舒服的三级视频| 综合97久久| 日韩少妇一区二区三区| 麻豆精品一区二区三区四区免费观看| 日本福利社| 精品国产乱码久久久久久网站入口| 性爱av在线免费观看| 日韩精品影视| 99爱视频| 黑人白女精品一区| 玖玖爱视频网站| 青青草伊人久久| 亚洲色图日韩精品| 91视频综合| 欧美熟爽综合| 日韩性爱视频免费在线| 97色网| 日韩精品人妻中文字幕久久久| 五月丁香拍拍激情综合三级| 蜜臀99久久国产| a人欧美综合天堂麻豆| 丰满人妻一区二区三区大胸懂色| 色香av| 欧美激色| 玖玖综合色| 日本一区二区做爱的视频| 精品免费囯产一区二区三区| 嗯嗯啊啊操死我| 思思热影视| 亚洲国产精品无码AV久久久| 久久东京热成人| 一级黄碟| 91影视亚洲| 啊啊啊啊二区好大| 啊啊啊啊操死我了| 欧美激情片一区二区| 丁香激情五月天| 亚洲中文字幕精品久久久久久直播| 欧美性爱第1 页| 一区二区三区黄色片a| 老熟女熟妇| 亚洲国产丝袜在线观看| 五月天婷婷色| 综合网~91综合网| 久久人妻少妇| 曰韩无码777| 日韩日韩日韩-国产乱码精品一区二区| 免費人妻夜夜爽天天爽爽一区| 天天日天天插| 韩日男人的天堂| 日日夜夜草草草| 1024午夜激情男人的天堂| 少妇精品久久久八区九区| 九九操久久国产免费视频| www.人人摸在线视频| 日本 情色 1区| 96精品久久久久久久久久| 五月天婷婷在线看| 国产黄片在线免费观看| 国产女人成人精品视频| 人妻熟女字幕一区二区| 大屁股熟女一区二区三区| 3p国产欧美99热| 欧美一级AAAAAAA| 久久夜黄色无码A级大片| 国产欧美一区激情交| 欧美黑人精品一区二区| 男人的天堂2018东京热啪啪啪| 日本一天色道久久久精品视频| 欧美国产操逼| 亚洲av性爱电影| 91爆操视频| 人妻少妇蜜桃视频欧美一区| 人人九九精| 岛国色情视频在线观看| 日韩久久三区| 久干网| 亚洲国产青青| 色图四区| 亚洲精品一区二区精品| 国产亚洲精品玖玖玖在线观看| 欧美午夜一区二区三区| 屌逼传媒| 亚洲色香| 91爱网| 搡老女人老妇女AAA一VU麻豆| 国产伦乱91| sss视频华人在线| 色婷婷一区二区三区久久午夜| 亚洲天天天| 亚洲婷婷丁香在线| 手机在线视频国内精品| 天天综合91在线| 亚洲日韩熟女人妻高清在线| 97超碰欧美中文字幕| 三级特黄60分钟播放| 99ri视频| 日韩精品9区| 人人摸人人入| 色婷婷丁香| 亚洲欧洲第二视频在线观看色图| 诱惑网综合| 日韩午夜精品一区二区三区电影| 四虎AV无码| 强奸熟女一区二区三区| 久久精品人妻一区| 婷婷久久网| 大香蕉色欲AV| 9丨亚洲一区二区在线| 亚洲男人天堂Av| 欧美亚洲清纯| 变态乱伦伪娘灌肠一区二区| 色综合中文字幕不卡| 综合熟妇一区二区三区| 国产免a费看黄片在线| 一区二区三区四区五区高清无码永久视频| 99久久免费看精品国产一区| 日韩人妻播放| 色色综合97| 亚洲国产一级黄色视频| 六月婷激情福利天堂69| 狠狠爱夜夜| www.99色| 人妻熟女一区二区在线视频| 中字乱伦AV| 老鸭窝在线视频播放| 3P乱轮视频| 色网综合网| 乱论91| 日噜夜夜夜夜夜夜夜夜夜夜爽爽爽爽爽爽爽爽爽爽爽爽 | 国产极品一区二区三区三州| www.91欧美| 激情抓乳插进去啪啪啪日韩| 久久超碰免费的| 国产狂喷潮在线精品| 日欧美色| 福利社区午夜一区二区| 久久九精品| 国产精品久久久久久久毛片1| 色综合99999| 国产激情av女片自拍| 九九九九九九免费视频| 一块操欧美性爱| 99少妇内射| 日本特黄f c2| 在线αⅴ| 校园春色中文字幕AV| 亚洲九月丁香| 欧美伊人电影| 91人妻超碰| 国产成人99久久亚洲综合| 大香蕉啪啪啪啪在线| 人人操人人摸人| 精品无码久久| 免费看污网站| 欧美色性爱| 亚洲综合色图欧美| 日韩欧美亚洲国产日韩| 日本一区视频在线观看| 亚洲诱惑天堂 | 噜噜噜久久亚洲精品色情| av在线免费一区二区| 91精品在线播放| 精品久久視頻在线| 高清无码一区二区三区| 深夜激情| 国产有码一区| 爽 好舒服 无码刺激久久| 高清孕妇孕交 交| 少妇500双飞99| 亚洲福利中文字幕在线| 97啪啪| 大香蕉在线SuP| 色香阁在线| 亚洲αv一区二区三区| 伊人麻豆传媒| 日韩丝袜高跟制服在线观看| 91丨九色丨东北熟女| 欧美18 在线观看| 熟妇无码视频三区| 99热精品国产| 麻豆久久久一区二区| 男人天堂黄片| 亚洲欧美不卡线| 97伪v| 欧美中文字幕男人天堂久久精品| 国产三级中文有码在线视频| 免费成人自拍视频在线| 97 国产精品| 亚洲欧洲色情高清| 日本熟妇熟色97一本在线观看| 久久精品高清AV| 色波多| 欧美欧美少妇| 色香欲天天天天综合色| 懂色AV中文| 91蜜臀熟女| 免费看久久久性性| 青娱乐亚洲自拍| 国产二区三区免费视频| 欧美激情高清性猛交| 劲爆欧美人妖三区91| 任我爽视频在线观看| 91日韩在线| 亚洲欧美日韩精品久| 日逼逼免费看| 日本爽爽爽爽爽爽免费视频| 好爽免费视频| 久久久久女教师免费一区| 欧美日韩亚洲电影| 国产精品久久久九九九| 97日视频| 午夜天堂精品久久| 怡红院怡春院| 欧洲射精91| 亚洲s在线观看| 久久亚洲影院一区二区| 成功精品影院| 日韩三级一区| 伊人AAA| 国产11页| 欧美日韩国产中文超碰| 天天综合日韩网| 欧美熟女少妇| 在现视频女上位好爽| 一本道综合色图| 激情色色| 天天干天天干天天| 色蜜AV| 亚洲AV无码天美传媒一区| 亚洲五月丁香花狠狠干一区二区三区 | 日日干日日摸| 992大香蕉| 色九久| av激情亚洲五月天| 亚洲啪啪视频免费| 欧美一级特黄淫片在线观看| 亚洲精品无码久久AV| 欧美不卡二区| 综合一区中亚洲国产成人综合精品| 日韩欧美国产高清视频| 9+1视频网址| 国产在线不卡导航| 国产亚洲精品美女| 亚洲天在线| 欧美综合网| 久久riav中文精品| 久久婷婷色| 精品久久在线区一区| 啊啊啊快操我视频| 国产尤物在线三区| 91免费看一区二区三区 | 九九av| 传媒在线观看一区二区三区| 91综合在线| 欧美日韩日产免费网站看| 国产一级黄色片在线观看| 99色视频| 亚州综合AⅤ| 色原狠狠天天天| 欧美色网| 思思性爱| 中文字幕在线观看AV| 美熟女逼导航AV操逼| 日本不卡在线二区三区| 日韩精品在线观看观看| 99久久9| 欧美激情一区二区| AV色女综合| 色翁荡息又大又硬又粗又爽| 久色网| 97色涩| 91丝袜美女视频| 亚洲欧综合另类无码一区| 精品久久久久久亚洲| 丝袜视频一区二区在线播放国产中文| 亚洲在线综合| 久久久久久电影| 亚洲国产第一页综合视频| 91性感网站| 国产激情视频一区区三区| 玖玖爱免费观看视频| 中文字幕制服欧美久久一区| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 久久日韩毛| 日本久久久精品电影| www.亚洲成人一区| www.91色综合| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 欧洲综合视频| 96超碰网| 日亚韩精品视频二区三| 又摸又舔在线观看网站| 亚洲国产精品无石码久久| 免费av大片| 日韩欧亚中文在线| 丁香五六月啪啪| 殴美性色a级欧美| 天天久久久久久| 97人人操人人摸人人爱| 目产99999久久999| 国产亚洲精品一区二区三区| 人妻激情偷乱视频一区二区三区 | 激情色色| 久久成人东京热人妻| 日韩在线观看字幕精品| 天堂射| 免费1级a做爰片观看| 少妇同性| 欧美大香蕉久| 草伊人高潮喷水超碰| TS人妖另类精品视频系列| 人妻熟女字幕一区二区| 欧美日韩狠狠爱| 色欲天天综合网| 插插综合网天天影视网| 九九RE视频在线精品| 好一吊区二区| 99久久久久| 久草看看看| 久久人妻视频| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 日韩成人高清一区二区| 江都AV在线| 九九九精品成人免费视频小说| 天堂av2019| 日韩欧无码一区二区三区免费不卡| 猛交交| 一区二区乱码福利| 91精品成人| 国产精品一级特黄aaa大片在线观看| 久神马| 91精品国产高清久久久久久,亚洲成人 | 日本久久999| 天天躁日日躁XXXXYY| 爱丝福利| 91黑丝在线播放| 欧美成年人性爱视频免费观看| 九九热免费在线国产视频伊人五月| 性无码专区2020| 亚洲人91| 国产AV久久久蜜爱影集| 老熟妇91| 欧美日韩一干二干| 国产色呦呦| 亚洲激情视频| 人妻人人澡人人爽人人| 91三级理论片播放器| 97国产精选| 97在线国产精品| 国产日韩区| 亚洲狠狠入| 婷婷三区| 亚洲国产成人精品无码专区| 婷婷人妻激情| 少妇天堂网络| 天天日天天干天天整| 亚洲风情在线观看| 加勒比日本在线| 999岛国大片| 精品国产三级av韩国在线| 欧美影音在线| 欧美极品女人的天堂| 亚洲国产奇米影视久久| 久久久亚洲精品中文字幕人妻| 91人妻视频在线| 日本精品高清一二区一本到| 欧美日本成人一区二区| 亚洲欧美日韩电影网站一区| 激情五月天网| 污污汅18禁网站在线永久免费观看| 啊啊啊男女| 欧亚第一综合网| 狠狠色丁香| 插穴性爱视频在线观看| 亚洲欧美人妻| 久久久久久无码人妻中文字幕| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 亚洲第一页欧美| 综合色色网| av网站在线观看了| 射久久| 国产suv精品一区二六| 亚洲精品天天影视综合网 | 久久中文字幕一区不卡| 加勒比中文av| 人澡逼| 超碰综合色| 中文字暮97| 女人高潮大叫一级毛片| 久久久久亚洲av综合波多野制衣| 69一区二区三区| 熟妇一区,二区,三区。| 欲射影视| 青青草手机在线免费观看| 98色网| 99自拍视频| 亚洲精品人妻吞精av| 久久五十路熟女人妻| 成人毛片免费| 加勒比海色香蕉婷婷| 97ai亚洲| 夜夜春夜夜操| 国产高清在线自在拍69| 欧美色图 人妻| 97高清啪啪| WWW4虎| 2001天天操| 亚洲欲色9532548967一区| 五月婷婷六月丁香| 柠檬AV导航| 欧美极度丰满熟妇hd| 人妻人人做人人澡人人爽欧美一区| 牛牛操视频逼| 欧美18 在线观看| 日韩免费高清大片在线| 欧美人人操人人插| 日韩有码 一区二区三区| 在线αⅴ| 在线岛国新天堂8| 日韩操逼性鲍| 性爱免费视频成人| 亚洲中文字幕久久人妻| 亚洲成人日韩小说| 国产精品久久久无码AV网站| 国产91精品福利在线| blacked精品一区国产| 亚洲系列第一页| 日韩精品亚洲专区在线影视| 国产三级日产三级韩国三级| 每日更新AV| 人人透人人操| 亚洲人人操| 97精品一二区| 欧美日韩淫加| 国产乱码精品久久久久久| 日韩精品电影| 天天影视91看看| 中文字幕一二三| 成人午夜高潮av猛片| 欧美偷拍区| 国产真实野战在线视频| 欧美性生活综合| 四虎AV在线观看| 麻豆区99999| 秋霞福利网| 乱人乱色一区二区三区免费 | 五月综合久久| 九九九久千久久激情蜜桃在线看 | 污色区网站| 黄色激情电影在线观看| 黄色视频特级毛片| 日本在线一二| 嗯嗯啊啊视频一区二区三区| 激情情色五月天| 超碰欧美97| 操逼不卡中文字幕| 久久人妻视频网| 亚洲视频,小说| 中文字幕日韩情色| 国产强奸乱伦无码视频| 91成人精品在线播放| 日韩偷拍色图| 囯产精品强| 女色综合| 探花熟女,姿勢到位,體驗感也到位| 亚洲精品亚洲人成人网| 97色欧州| 四虎av在线| 在线观看高清AV| 激情婷婷| 国产精品天干天干综合网麻豆| 中文字幕丝袜| 91c色| 白丝1区2区3区| 成人情色综合网| 国产亚洲精品美女久久久| 婷婷在线播放| 亚州色阁| 国产狂喷潮在线精品| 成人av免费观看| 骚女高跟AV在线| 男人的天堂 在线一区| 国产树林里野战在线看| 好吊色一区| 美女久久久久久久久久久| 亚洲AV操| 午夜精品久久久久| 国产v亚洲v日韩v欧美v片另类| 十八禁成人网站在线观看| 日韩AV一区二区三区三州三州| 96国产精品| 免费伦费视频在线观看| 欧美色图偷拍另类| 久久78| 好吊妞转入那个网| 国产美女91| 玖玖爱免费观看视频| 久久色一区二区| 欧美日韩在线视频网站| 麻豆久久久一区二区| 骚鸭AV| 久久免费精品视频免一| 亚洲精品 欧美精品| 一级岛国大片| 99综合自拍| 国产午夜福利专区综合| 97精品国产97久久久久久免费| 性欧美91| 六月天婷婷| 超碰导航97| 美女自卫慰黄网站免费| 久久华人网| 99久久久无码国产精品性男| 裸体美女久久久| 园内精品自拍视频在线播放| 欧美中字二区| 久久首页| 久久99草| 国产福利小视频高清在线观看| 91超碰碰在线| 久久久无码av精| 欲色啪| 日本精品成人无码| 亚洲女优有码无码高清| 91热爆在线| 不卡二三区人妻少妇| 人人人人人人少妇| 试看日韩黄片| 99re95| 亚洲无吗在线视频| 超碰在线1234区| 国产AV久久久蜜爱影集| 国产精选视频| 看看小穴| 久久精品国产AV一区二区三区| 区二区亚洲婷| 激情综合网五月婷婷五月天| 五月天人妻综合| 97电影院超碰| 丁香五六月啪啪| 狠狠做深爱婷婷久久二区| 在线性黄高清免费视频| 超碰97国产欧美| 亚洲免费精品一区| 日韩乱伦AⅤ| 综合情欲网| 日韩精品 资源| 91人精品妻入口| 蜜桃丰满熟妇av无码区不卡| 五月天婷婷久久| 草草草视频在线免费看| 少妇内射www在线观看视频 | 99RE在线视频精品,这里只有精品| 波多野42部无码喷潮在线观看| 激情四射婷婷六月天| 激情五月天色播| 亚洲精品一二牛牛| 久久久内射良家| 亚洲五月丁香花狠狠干一区二区三区 | 大干人妻| 天天日老熟妇| 蜜桃视频成a人v在线| 999热这里只有精品| 97青娱乐超碰久久| 中国亚洲呦女专区| 高清无码久操视频| 本道在线| 欧美日韩222| 一区三区啪啪| 中文字幕精品免费一区二区| 欧美第一页| 久久精品免费| 操逼网免费无码视频| 午夜男女爽爽大片免费观看| 国产精品乱码久久久、久久| 91九久| 国产又色又爽又舒服的三级视频| 一二三区操逼国产91| 久久久三区二区一区| 日韩激情视频| 无码色| 人妻系列无码专区中文有码| 91丝袜在线观看| 欧美日本视频一区| 综合亚洲情色| 91 手机在线播放 绯色| 日本一区二区三区四区免费观看| 中文字幕99999| 老鸭窝在线视频播放| 日韩电影天堂视频二区三区| 亚洲午夜免费狠狠干| 白嫩国模丰满一二三区| 眼镜人妻101.com| 婷婷五月天激情四射| 国产97在线播放| 综合91网| 五月天久久婷婷亚洲 | 少妇高潮九九九九| 久久久一二三四区| 亚洲综合骚逼| 久久久久久91香蕉国产| 97精品国产97久久久| 色色五月天激情| 抽插无码高清一区| 韩国黄色片精品久久久| 这里只有精品视频在线观看麻豆| 加勒比海色香蕉婷婷| 亚洲色图8| 久久精品六区| 国产精品久久久久久夜夜夜夜| 校园春色综合色| 国产自产91区13区| 丝袜AV一二三区| 91校园春色长篇| 五月天激情网图片| 九九这里只有精品| 久久久久9999| 五月丁香综合啪啪| 久久 国产精品 一区| 综合自拍| 久久久夜夜嗨免费视频| A片三级无码| 无码视频黄色网战| 欧美麻豆成人同性GⅤ在线| 殴美在线AⅤ| 日韩av在线免费网站| 国产AV无码AV| 亚洲 欧美 手机在线观看| 欧美视频一区二区在线| 搡老女人老妇女AAA一VU麻豆| 国产毛片在线| 美中日韩无码| 欧美疯狂做爰xxxx| 日本久久99| 亚洲欧美精品91| 美女啊啊啊啊pc| 青青草视频在线观看一区二区| 久久蜜桃综合网| 国产成人主播| 97天天在线| 99久久久|