精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

騰訊二面:現在要你實現一個埋點監控SDK,你會怎么設計?

開發 前端
我們要設計SDK,首先要清楚它的基本使用方法,才知道后面的代碼框架要怎么搭;然后是明確SDK的職能范圍:需要能處理用戶行為、頁面性能以及錯誤報警三類監控;最后是react、vue的項目,通常會做錯誤邊界處理,要怎么接入我們自己的SDK。

大家好,我是年年!

這是小伙伴上周被問到的一個綜合性設計題,如果是沒有用過埋點監控系統,或者沒有深入了解,基本就涼涼。

這篇文章會講清楚:

  1. 埋點監控系統負責處理哪些問題,需要怎么設計api?
  2. 為什么用img的src做請求的發送,sendBeacon又是什么?
  3. 在react、vue的錯誤邊界中要怎么處理?

什么是埋點監控SDK

舉個例子,公司開發上線了一個網站,但開發人員不可能預測,用戶實際使用時會發生什么:用戶瀏覽過哪幾個頁面?幾成用戶會點擊某個彈窗的確認按鈕,幾成會點擊取消?有沒有出現頁面崩潰?

所以我們需要一個埋點監控SDK去做數據的收集,后續再統計分析。有了分析數據,才能有針對性對網站進行優化:PV特別少的頁面就不要浪費大量人力;有bug的頁面趕緊修復,不然要325了。

比較有名的埋點監控有Google Analytics,除了web端,還有iOS、安卓的SDK。

埋點監控的職能范圍

因為業務需要的不同,大部分公司都會自己開發一套埋點監控系統,但基本上都會涵蓋這三類功能:

用戶行為監控

負責統計PV(頁面訪問次數)、UV(頁面訪問人數)以及用戶的點擊操作等行為。

這類統計是用的最多的,有了這些數據才能量化我們的工作成果。

頁面性能監控

開發和測試人員固然在上線之前會對這些數據做評估,但用戶的環境和我們不一樣,也許是3G網,也許是很老的機型,我們需要知道在實際使用場景中的性能數據,比如頁面加載時間、白屏時間等。

錯誤報警監控

獲取錯誤數據,及時處理才能避免大量用戶受到影響。除了全局捕獲到的錯誤信息,還有在代碼內部被catch住的錯誤告警,這些都需要被收集到。

下面會從api的設計出發,對上述三種類型進一步展開。

SDK的設計

在開始設計之前,先看一下SDK怎么使用。

import StatisticSDK from 'StatisticSDK';
// 全局初始化一次
window.insSDK = new StatisticSDK('uuid-12345');
<button onClick={()=>{
window.insSDK.event('click','confirm');
...// 其他業務代碼
}}>確認</button>

首先把SDK實例掛載到全局,之后在業務代碼中調用,這里的新建實例時需要傳入一個id,因為這個埋點監控系統往往是給多個業務去使用的,通過id去區分不同的數據來源。

首先實現實例化部分:

class StatisticSDK {
constructor(productID){
this.productID = productID;
}
}

數據發送

數據發送是一個最基礎的api,后面的功能都要基于此進行。通常這種前后端分離的場景會使用AJAX的方式發送數據,但是這里使用圖片的src屬性。原因有兩點:

  1. 沒有跨域的限制,像srcipt標簽、img標簽都可以直接發送跨域的GET請求,不用做特殊處理。
  2. 兼容性好,一些靜態頁面可能禁用了腳本,這時script標簽就不能使用了。

但要注意,這個圖片不是用來展示的,我們的目的是去「傳遞數據」,只是借助img標簽的的src屬性,在其url后面拼接上參數,服務端收到再去解析。

class StatisticSDK {
constructor(productID){
this.productID = productID;
}
send(baseURL,query={}){
query.productID = this.productID;
let queryStr = Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')
let img = new Image();
img.src = `${baseURL}?${queryStr}`
}
}

img標簽的優點是不需要將其append到文檔,只需設置src屬性便能成功發起請求。

通常請求的這個url會是一張1X1px的GIF圖片,網上的文章對于這里為什么返回圖片的是一張GIF都是含糊帶過,這里查閱了一些資料并測試了:

1.同樣大小,不同格式的的圖片中GIF大小是最小的,所以選擇返回一張GIF,這樣對性能的損耗更小。

2.如果返回204,會走到img的onerror事件,并拋出一個全局錯誤;如果返回200和一個空對象會有一個CORB的告警。

3.當然如果不在意這個報錯可以采取返回空對象,事實上也有一些工具是這樣做的。

有一些埋點需要真實的加到頁面上,比如垃圾郵件的發送者會添加這樣一個隱藏標志來驗證郵件是否被打開,如果返回204或者是200空對象會導致一個明顯圖片占位符。

<img src="http://www.example.com/logger?event_id=1234">

更優雅的web beacon

這種打點標記的方式被稱web beacon(網絡信標)。除了gif圖片,從2014年開始,瀏覽器逐漸實現專門的API,來更優雅的完成這件事:Navigator.sendBeacon。

使用很簡單。

Navigator.sendBeacon(url,data)

相較于圖片的src,這種方式的更有優勢:

  • 不會和主要業務代碼搶占資源,而是在瀏覽器空閑時去做發送。
  • 并且在頁面卸載時也能保證請求成功發送,不阻塞頁面刷新和跳轉。

現在的埋點監控工具通常會優先使用sendBeacon,但由于瀏覽器兼容性,還是需要用圖片的src兜底。

用戶行為監控

上面實現了數據發送的api,現在可以基于它去實現用戶行為監控的api。

class StatisticSDK {
constructor(productID){
this.productID = productID;
}
// 數據發送
send(baseURL,query={}){
query.productID = this.productID;
let queryStr = Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')
let img = new Image();
img.src = `${baseURL}?${queryStr}`
}
// 自定義事件
event(key, val={}) {
let eventURL = 'http://demo/'
this.send(eventURL,{event:key,...val})
}
// pv曝光
pv() {
this.event('pv')
}
}

用戶行為包括自定義事件和pv曝光,也可以把pv曝光看作是一種特殊的自定義行為事件。

頁面性能監控

頁面的性能數據可以通過performance.timing這個API獲取到,獲取的數據是單位為毫秒的時間戳。

上面的不需要全部了解,但比較關鍵的數據有下面幾個,根據它們可以計算出FP/DCL/Load等關鍵事件的時間點:

  1. 頁面首次渲染時間:FP(firstPaint)=domLoading-navigationStart。
  2. DOM加載完成:DCL(DOMContentEventLoad)=domContentLoadedEventEnd-navigationStart。
  3. 圖片、樣式等外鏈資源加載完成:L(Load)=loadEventEnd-navigationStart。

上面的數值可以跟performance面板里的結果對應。

回到SDK,我們只用實現一個上傳所有性能數據的api就可以了:

class StatisticSDK {
constructor(productID){
this.productID = productID;
// 初始化自動調用性能上報
this.initPerformance()
}
// 數據發送
send(baseURL,query={}){
query.productID = this.productID;
let queryStr = Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')
let img = new Image();
img.src = `${baseURL}?${queryStr}`
}
// 性能上報
initPerformance(){
let performanceURL = 'http://performance/'
this.send(performanceURL,performance.timing)
}
}

并且,在構造函數里自動調用,因為性能數據是必須要上傳的,就不需要用戶每次都手動調用了。

錯誤告警監控

錯誤報警監控分為JS原生錯誤和React/Vue的組件錯誤的處理。

JS原生錯誤

除了try catch中捕獲住的錯誤,我們還需要上報沒有被捕獲住的錯誤——通過error事件和unhandledrejection事件去監聽。

error

error事件是用來監聽DOM操作錯誤DOMException和JS錯誤告警的,具體來說,JS錯誤分為下面8類:

  1. InternalError: 內部錯誤,比如如遞歸爆棧。
  2. ?RangeError: 范圍錯誤,比如new Array(-1)。
  3. EvalError: 使用eval()時錯誤。
  4. ReferenceError: 引用錯誤,比如使用未定義變量。
  5. SyntaxError: 語法錯誤,比如var a = 。
  6. TypeError: 類型錯誤,比如[1,2].split('.')。
  7. URIError: 給 encodeURI或 decodeURl()傳遞的參數無效,比如decodeURI('%2')。
  8. Error: 上面7種錯誤的基類,通常是開發者拋出。

也就是說,代碼運行時發生的上述8類錯誤,都可以被檢測到。

unhandledrejection

Promise內部拋出的錯誤是無法被error捕獲到的,這時需要用unhandledrejection事件。

回到SDK的實現,處理錯誤報警的代碼如下:

class StatisticSDK {
constructor(productID){
this.productID = productID;
// 初始化錯誤監控
this.initError()
}
// 數據發送
send(baseURL,query={}){
query.productID = this.productID;
let queryStr = Object.entries(query).map(([key, value]) => `${key}=${value}`).join('&')
let img = new Image();
img.src = `${baseURL}?${queryStr}`
}
// 自定義錯誤上報
error(err, etraInfo={}) {
const errorURL = 'http://error/'
const { message, stack } = err;
this.send(errorURL, { message, stack, ...etraInfo})
}
// 初始化錯誤監控
initError(){
window.addEventListener('error', event=>{
this.error(error);
})
window.addEventListener('unhandledrejection', event=>{
this.error(new Error(event.reason), { type: 'unhandledrejection'})
})
}
}

和初始化性能監控一樣,初始化錯誤監控也是一定要做的,所以需要在構造函數中調用。后續開發人員只用在業務代碼的try catch中調用error方法即可。

React/Vue組件錯誤

成熟的框架庫都會有錯誤處理機制,React和Vue也不例外。

React的錯誤邊界

錯誤邊界是希望當應用內部發生渲染錯誤時,不會整個頁面崩潰。我們提前給它設置一個兜底組件,并且可以細化粒度,只有發生錯誤的部分被替換成這個「兜底組件」,不至于整個頁面都不能正常工作。

它的使用很簡單,就是一個帶有特殊生命周期的類組件,用它把業務組件包裹起來。

這兩個生命周期是getDerivedStateFromError和componentDidCatch。

代碼如下:

// 定義錯誤邊界
class ErrorBoundary extends React.Component {
state = { error: null }
static getDerivedStateFromError(error) {
return { error }
}
componentDidCatch(error, errorInfo) {
// 調用我們實現的SDK實例
insSDK.error(error, errorInfo)
}
render() {
if (this.state.error) {
return <h2>Something went wrong.</h2>
}
return this.props.children
}
}
...
<ErrorBoundary>
<BuggyCounter />
</ErrorBoundary>

回到SDK的整合上,在生產環境下,被錯誤邊界包裹的組件,如果內部拋出錯誤,全局的error事件是無法監聽到的,因為這個錯誤邊界本身就相當于一個try catch。所以需要在錯誤邊界這個組件內部去做上報處理。也就是上面代碼中的componentDidCatch生命周期。

Vue的錯誤邊界

vue也有一個類似的生命周期來做這件事,不再贅述:errorCaptured。

Vue.component('ErrorBoundary', {
data: () => ({ error: null }),
errorCaptured (err, vm, info) {
this.error = `${err.stack}\n\nfound in ${info} of component`
// 調用我們的SDK,上報錯誤信息
insSDK.error(err,info)
return false
},
render (h) {
if (this.error) {
return h('pre', { style: { color: 'red' }}, this.error)
}
return this.$slots.default[0]
}
})
...
<error-boundary>
<buggy-counter />
</error-boundary>

現在我們已經實現了一個完整的SDK的骨架,并且處理了在實際開發時,react/vue項目應該怎么接入。

實際生產使用的SDK會更健壯,但思路也不外乎,感興趣的可以去讀一讀源碼。

結語

文章比較長,但想答好這個問題,這些知識儲備都是必須的。

我們要設計SDK,首先要清楚它的基本使用方法,才知道后面的代碼框架要怎么搭;然后是明確SDK的職能范圍:需要能處理用戶行為、頁面性能以及錯誤報警三類監控;最后是react、vue的項目,通常會做錯誤邊界處理,要怎么接入我們自己的SDK。

責任編輯:姜華 來源: 前端私教年年
相關推薦

2020-07-28 07:56:59

網站

2024-08-28 08:38:51

2019-08-12 10:45:54

Flutter框架Native

2021-11-30 07:51:29

共享內存進程

2022-08-31 07:54:08

采集sdk埋點數據

2025-04-29 02:00:00

高并發系統場景

2016-12-12 13:42:54

數據分析大數據埋點

2023-12-29 11:32:27

2023-12-14 17:27:28

架構設計數據表

2023-11-08 07:05:07

架構設計群聊系統

2025-03-17 02:00:00

2021-02-19 07:59:21

數據埋點數據分析大數據

2023-06-29 08:43:44

DNS解析IP

2025-09-08 08:25:45

2025-09-01 07:27:02

2023-12-13 18:46:50

FlutterAOP業務層

2020-10-16 15:06:59

開發技術方案

2019-10-31 13:58:32

阿里電商系統

2024-09-14 14:14:26

Dubbo框架微服務

2022-09-02 14:20:32

800G網絡組件
點贊
收藏

51CTO技術棧公眾號

99在线观看免费视频精品观看| 19禁羞羞电影院在线观看| 三级久久三级久久久| 伊人伊成久久人综合网小说| 午夜国产一区二区三区| 日韩免费网站| av综合在线播放| 国产精品高清在线观看| 91麻豆制片厂| 嗯用力啊快一点好舒服小柔久久| 91成人看片片| www.好吊操| 992tv免费直播在线观看| 国产成人综合网| 国产精品高潮呻吟久久av无限 | 国产一区二区视频在线观看| 91日韩中文字幕| 亚洲图片久久| 精品国产青草久久久久福利| 国产免费视频传媒| 日本三级在线观看网站| 国产亚洲精品资源在线26u| 91色在线观看| 中文字幕免费观看| 亚洲欧洲日本mm| 精品国产一区二区三区在线观看| 久久一区二区电影| 亚洲精品aaa| 色天使色偷偷av一区二区| 久久人妻无码一区二区| 中文字幕在线免费| 久久亚洲综合色一区二区三区| 91网站在线看| 91福利免费视频| 日本最新不卡在线| 57pao国产精品一区| 曰本女人与公拘交酡| 欧美亚洲高清| 亚洲开心激情网| 国产免费一区二区三区最新6| 国产一区二区| 91麻豆精品91久久久久同性| 亚洲福利精品视频| 人人鲁人人莫人人爱精品| 亚洲成人精品影院| 国产精品videossex国产高清| 久草中文在线| 亚洲人成小说网站色在线| 亚洲不卡1区| 欧美精品少妇| 久久中文娱乐网| 欧美xxxx黑人又粗又长精品| 视频午夜在线| 久久在线观看免费| 日本精品一区二区三区视频| 国产香蕉在线| 日本一区二区高清| 亚洲一区二区三区乱码| 免费网站免费进入在线| 综合在线观看色| 免费观看国产视频在线| wwwav在线| 亚洲亚洲人成综合网络| 91午夜在线观看| 免费高潮视频95在线观看网站| 欧美日韩精品在线视频| 国产成人亚洲精品无码h在线| 韩日成人影院| 欧美天天综合网| 中文字幕第一页在线视频| 精品69视频一区二区三区| 777色狠狠一区二区三区| 一级淫片在线观看| 136国产福利精品导航网址应用| 精品国产伦一区二区三区观看方式| 亚洲无人区码一码二码三码| 欧美亚洲大陆| 在线观看国产欧美| 日本天堂中文字幕| 一本久道综合久久精品| 国产精品久久久久久av| 国产理论片在线观看| 国产成人av一区二区| 精品国产中文字幕| h视频在线免费| 一区二区三区高清| 亚洲欧洲日产国码无码久久99| 日韩欧美一区二区三区免费观看| 欧美精品777| 四虎精品一区二区| 不卡中文一二三区| 久久69精品久久久久久国产越南| 成人免费视频毛片| 久久精品久久99精品久久| 亚洲最大福利网站| 九色视频网站在线观看| 亚洲色图一区二区三区| 亚洲精品少妇一区二区| 中文字幕高清在线播放| 91精品国产综合久久小美女| 国产激情第一页| 欧美高清在线| 91地址最新发布| 国产精品一级视频| 久久久三级国产网站| 最近免费观看高清韩国日本大全| 欧美男男tv网站在线播放| 欧美精品xxxxbbbb| 亚洲自拍偷拍一区二区| 夜间精品视频| 国产精品精品视频| 手机在线不卡av| 亚洲另类在线视频| 日韩欧美在线免费观看视频| 我要色综合中文字幕| 国产一区二区三区在线观看视频 | 国产精品红桃| 国产精品高清网站| 日中文字幕在线| 樱花草国产18久久久久| 尤蜜粉嫩av国产一区二区三区| 综合激情网...| 久久精品国产一区二区三区| 无码aⅴ精品一区二区三区| 粉嫩蜜臀av国产精品网站| 国产又大又长又粗又黄| 日韩免费小视频| 亚洲人在线观看| 国产农村妇女aaaaa视频| 国产成人免费av在线| 亚洲在线欧美| a屁视频一区二区三区四区| 国产视频自拍一区| 午夜影院在线看| 成人一道本在线| 成年人深夜视频| 视频精品二区| 欧美国产日韩中文字幕在线| a在线观看视频| 亚洲欧美国产三级| 国产精欧美一区二区三区白种人| 成人久久一区| 国产精品一区二区久久| 成年人免费在线视频| 在线观看视频一区二区| 天天躁日日躁aaaa视频| 久久精品人人做人人爽电影蜜月| 久久综合狠狠综合久久综青草| 国产在线xxx| 亚洲国产欧美自拍| 制服.丝袜.亚洲.中文.综合懂色| 99久久久精品免费观看国产蜜| 成人免费毛片在线观看| 久久97久久97精品免视看秋霞| 97国产suv精品一区二区62| 亚洲国产精品久久久久久6q| 一区二区三区在线视频观看58 | 免费av中文字幕| 国产欧美一区二区三区在线看蜜臀 | 女女色综合影院| 这里只有精品免费| 婷婷色中文字幕| 成熟亚洲日本毛茸茸凸凹| 国产va亚洲va在线va| 欧美激情影院| 国产成+人+综合+亚洲欧美丁香花| 国产日本在线视频| 在线综合视频播放| 久久久久久免费观看| av色综合久久天堂av综合| 人妻少妇被粗大爽9797pw| 精品理论电影在线| 成人在线播放av| 波多野结衣在线观看| 亚洲女人天堂色在线7777| 成人黄色片在线观看| 17c精品麻豆一区二区免费| 国产又粗又猛又爽又黄| 夜夜精品视频| 一区二区三区四区五区精品 | 国产成人av免费在线观看| 成人一区二区三区在线观看| 久草综合在线观看| 自拍欧美日韩| 欧美精品久久久| 国产精品777777在线播放| 91精品国产精品| 91高清在线视频| 精品国产乱码久久久久久久久 | 日本成人三级| 欧美二区观看| 国产99视频精品免视看7| 国语对白在线播放| 国产一区二区三区视频在线播放| 91精品国产91久久久久麻豆 主演| 久久99久久人婷婷精品综合| 成人免费高清完整版在线观看| 白白色在线观看| 在线日韩av观看| 亚洲第一大网站| 欧美性色综合网| 国产一级视频在线| 国产日韩av一区| 老司机午夜免费福利| 麻豆一区二区99久久久久| 2018国产在线| 综合在线一区| 五月天亚洲综合| 午夜精品无码一区二区三区| 丝袜美腿综合| 成人午夜在线视频一区| 中文字幕在线直播| 九九热精品视频国产| 国产98在线| 亚洲第一免费播放区| 国产欧美综合视频| 欧美亚洲动漫制服丝袜| 日韩精品一卡二卡| 亚洲激情六月丁香| 一区二区三区影视| 国产女主播视频一区二区| 成人手机在线免费视频| 成人永久看片免费视频天堂| 天天色天天综合网| 秋霞电影网一区二区| 国产免费一区二区三区视频| 激情久久婷婷| 日本香蕉视频在线观看| 香蕉国产精品| 中文字幕一区二区三区有限公司| 国产一区二区区别| 欧美区高清在线| 外国成人在线视频| 久久99热只有频精品91密拍| 成人另类视频| 成人av片网址| 99精品中文字幕在线不卡 | 国产成人av免费看| 欧美高清性hdvideosex| 中文字幕 国产| 欧美日韩一区二区在线视频| 97人妻一区二区精品视频| 欧美三级免费观看| 天堂а√在线中文在线新版| 欧美日韩免费区域视频在线观看| 日韩免费不卡视频| 亚洲大型综合色站| 久久狠狠高潮亚洲精品| 精品久久久久久久大神国产| 久久久久久久久久免费视频| 精品magnet| 国产区一区二区三| 91久久精品一区二区三区| 欧美男人天堂网| 欧美性受xxxx黑人xyx| 一区二区 亚洲| 欧美一区二区三区四区久久| 成人1区2区3区| 亚洲第一页在线| 亚洲色偷精品一区二区三区| 亚洲精选在线观看| 国产福利小视频在线| 中文字幕欧美日韩va免费视频| 免费看美女视频在线网站| 精品国产一区二区三区四区在线观看 | 欧美日韩第二页| 日韩成人dvd| 捷克做爰xxxⅹ性视频| 国产91精品在线观看| 熟妇人妻久久中文字幕| 久久久亚洲精品石原莉奈| 在线观看免费黄色网址| 亚洲伦理在线精品| 99热在线观看免费精品| 欧美午夜精品久久久久久超碰| 96日本xxxxxⅹxxx17| 精品国产成人系列| 九色蝌蚪在线| 九九九热精品免费视频观看网站| 美女高潮视频在线看| 国产精品激情av在线播放| 国产成人免费av一区二区午夜| 国产亚洲精品美女久久久m| 国产成人ay| 777久久精品一区二区三区无码| 国产欧美在线| 成人av毛片在线观看| av亚洲精华国产精华| 一级免费黄色录像| 五月天一区二区三区| 中文字幕日本人妻久久久免费| 日韩精品中文字幕一区二区三区| 深夜影院在线观看| 久久夜色精品国产欧美乱| 国产777精品精品热热热一区二区| 国产精品入口夜色视频大尺度 | 韩国欧美一区二区| 欧美大片免费播放器| 中文字幕永久在线不卡| 日韩三级一区二区三区| 欧美喷潮久久久xxxxx| 色欲av永久无码精品无码蜜桃| 日韩一级黄色av| 一区二区三区电影大全| 2014亚洲精品| 日本欧美肥老太交大片| 国产午夜伦鲁鲁| 国产乱对白刺激视频不卡 | 亚洲蜜臀av乱码久久精品| 日韩色图在线观看| 精品sm捆绑视频| 激情影院在线观看| 国产成人亚洲综合91| 国产精品nxnn| 路边理发店露脸熟妇泻火| 久久久噜噜噜| 中文字幕一区二区人妻电影丶| 亚洲欧美日韩综合aⅴ视频| 蜜臀尤物一区二区三区直播| 亚洲精品成a人在线观看| 污网站在线免费看| 成人乱人伦精品视频在线观看| 国内精品伊人久久久| 男人日女人下面视频| 成人在线综合网| 69av视频在线| 日韩欧美中文一区| 国产黄a三级三级三级av在线看 | 成人av综合网| 99热这里只有精品免费| 狠狠色丁香久久婷婷综合_中| 日韩av片在线| 日本韩国一区二区三区视频| 欧美视频综合| 欧美一区深夜视频| 羞羞答答一区二区| 欧美污视频网站| 久久网站热最新地址| 国产91av视频| 亚洲第一视频网站| 天堂中文av在线资源库| 精品国产一区二区三区四区vr| 亚洲伦理精品| 国产草草浮力影院| 欧美午夜性色大片在线观看| 亚洲欧美丝袜中文综合| 91精品国产91| 免费精品国产的网站免费观看| 成人黄色片视频| 欧美国产一区在线| 在线观看视频二区| 精品国产一区久久久| 亚洲三区欧美一区国产二区| 成年在线观看视频| 不卡一区二区中文字幕| 久久久国产高清| 国产小视频91| 伊人久久大香伊蕉在人线观看热v| 国产av不卡一区二区| 国产成人在线免费观看| 国产污视频在线看| 亚洲精品自在久久| 成人一级视频| 久久天天东北熟女毛茸茸| 国产成人免费视| 久久久久久91亚洲精品中文字幕| 亚洲人午夜精品| 四虎国产精品永久在线国在线| 今天免费高清在线观看国语| 国产 日韩 欧美大片| 九九热在线视频播放| 亚洲一区www| 久久av网站| 日韩欧美亚洲天堂| 国产精品久久久久aaaa| 国产欧美久久久精品免费| 久久免费在线观看| 国产伦精品一区二区三区视频| 亚洲天堂国产视频| 亚洲一二三级电影| 粉嫩av一区| 99国产精品久久久久老师| 久久久夜精品| 精品国产精品国产精品| 亚洲国产精品va在线| 韩日精品一区| www.好吊操| 国产精品欧美极品| 欧美熟妇交换久久久久久分类 | 中文字幕欧美三区| 精品人妻一区二区三区换脸明星| 18性欧美xxxⅹ性满足| 四虎成人精品永久免费av九九| 国产精品久久久久久亚洲av| 欧美在线观看视频一区二区 | 欧美极品jizzhd欧美仙踪林| 欧美视频中文一区二区三区在线观看 | 96日本xxxxxⅹxxx17| 欧美最猛性xxxxx免费| 欧美一区国产在线|