精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

蜜臀av一区二区在线观看| 超碰97久久国产精品牛牛| 国产日韩欧美激情| 国产日韩精品一区二区| 紧身裙女教师波多野结衣| 亚洲国产视频二区| 色综合色狠狠综合色| 亚洲乱码国产乱码精品天美传媒| 国产免费黄色录像| 中文亚洲字幕| 色老头一区二区三区在线观看| 青青在线视频免费| 污污的网站在线看| 97超碰欧美中文字幕| 国产色视频一区| 国产午夜福利一区二区| 成人嘿咻视频免费看| 日韩欧美高清在线| 午夜dv内射一区二区| 天堂av中文在线| 日本一区二区视频在线观看| 成人av资源| 亚洲午夜在线播放| 最新成人av网站| 俺去了亚洲欧美日韩| 国产制服丝袜在线| 精品欧美视频| 欧美性色黄大片| 免费一级特黄毛片| 国产精品刘玥久久一区| 国产亚洲va综合人人澡精品| 99精彩视频| 怡红院男人天堂| 亚洲激情网址| 久久国产天堂福利天堂| 久久亚洲无码视频| 欧美黄色网视频| 日韩一区二区三区精品视频 | 亚洲欧美日本一区二区| 亚洲妇女成熟| 亚洲高清免费视频| 麻豆传媒网站在线观看| 在线观看h片| 久久久精品黄色| 久久精品99久久| 亚洲国产精品久久久久久久| 久久草av在线| 国产精品夜间视频香蕉| 一级片视频在线观看| 精品成人久久| 欧美精品在线免费播放| 黄色片子在线观看| 日本电影一区二区| 亚洲最新视频在线| 一区二区精品免费| 美女精品一区最新中文字幕一区二区三区| 日韩女优av电影在线观看| 久久久九九九热| 免费视频成人| 666欧美在线视频| 天堂av手机在线| **国产精品| 欧美一区二区美女| 巨乳女教师的诱惑| aiai久久| 亚洲国产天堂久久国产91| 日韩av无码一区二区三区不卡| 成人福利一区| 亚洲国产高清自拍| 老司机福利av| 激情五月色综合国产精品| 一本色道久久88综合日韩精品 | 精品综合久久久| 天堂av手机版| 久久九九久久九九| 亚洲草草视频| 免费av在线网站| 亚洲黄色小说网站| av免费观看大全| 亚洲午夜天堂| 欧美图片一区二区三区| 激情文学亚洲色图| 99精品国产一区二区三区2021| 精品国产91乱码一区二区三区 | 天堂网一区二区| 奇米影视7777精品一区二区| 成人福利视频网| www.97av| 久久久久99精品一区| 在线天堂一区av电影| 性欧美ⅴideo另类hd| 欧美日韩国产精品一区| 日本www.色| 国产一区二区三区| 亚洲电影免费观看高清| 88久久精品无码一区二区毛片| 女人天堂av在线播放| 欧美电影《轻佻寡妇》| 亚洲最大中文字幕| 欧美黑人精品一区二区不卡| 99亚洲一区二区| 国产97色在线| 国产精品视频第一页| www.色综合.com| 日韩视频在线观看国产| 成人影欧美片| 色婷婷精品大视频在线蜜桃视频| 精品综合久久久久| 日韩一级电影| 久久久精品久久| 国产精品乱子伦| 麻豆国产一区二区| 久久99精品久久久久久秒播放器| 日本暖暖在线视频| 福利微拍一区二区| 两女双腿交缠激烈磨豆腐| 伊人久久大香线蕉综合网站 | 亚洲国产无码精品| 欧美jjzz| 国产精品久久久999| 日韩一级免费视频| 亚洲日韩欧美一区二区在线| 不卡影院一区二区| 大香伊人久久精品一区二区| 在线免费观看羞羞视频一区二区| 日韩av黄色片| 国产一区二区在线视频| 日韩一二三区不卡在线视频| av在线最新| 欧美一区二区三级| 亚洲a∨无码无在线观看| 亚洲影视综合| 成人性色av| 国产黄大片在线观看画质优化| 91黄色免费观看| 免费成人蒂法网站| 激情成人亚洲| 69174成人网| 国产黄色在线网站| 欧美老肥妇做.爰bbww| 免费看的黄色网| 另类国产ts人妖高潮视频| 国产伦精品一区二区三区四区视频| 日本www在线| 欧美在线三级电影| 国产伦理片在线观看| 麻豆久久精品| 麻豆av一区二区三区| 爱情岛亚洲播放路线| 精品免费一区二区三区| 国产高潮流白浆| 国产精品原创巨作av| 在线视频91| 国产精品3区| 精品久久久av| 国产又粗又黄视频| 中文字幕亚洲一区二区va在线| 国产性生交xxxxx免费| 亚欧日韩另类中文欧美| 青青在线视频一区二区三区| 日本人妖在线| 91成人免费在线| 五月天综合视频| 免费人成精品欧美精品| 亚洲高清在线播放| 亚洲伦理网站| 久久国产精品偷| 亚洲欧美激情在线观看| 亚洲一区二区免费视频| 漂亮人妻被黑人久久精品| 亚洲区第一页| 欧美激情一区二区三区在线视频 | 精品人妻aV中文字幕乱码色欲| 亚洲女同一区二区| 美国黄色一级视频| 国产精品久久久一区二区| 欧美国产一区二区在线| 粉嫩av一区二区三区四区五区 | 蜜臀av粉嫩av懂色av| 亚洲日本视频| 日韩精品不卡| 国产精品毛片aⅴ一区二区三区| 欧美人与物videos| 亚洲av成人无码久久精品老人| 91福利在线免费观看| 99成人在线观看| 国产成人超碰人人澡人人澡| 亚洲熟妇av一区二区三区漫画| 国产91久久精品一区二区| 成人网在线免费看| jizz一区二区三区| 在线精品视频视频中文字幕| 国产黄色免费大片| 精品日本美女福利在线观看| 欧美88888| 成人av在线网站| 亚洲高清在线免费观看| 欧美a级一区| 品久久久久久久久久96高清| 成人在线啊v| 91超碰caoporn97人人| 国产在线超碰| 欧美v国产在线一区二区三区| 天天操夜夜操视频| 综合在线观看色| 中文字幕精品视频在线| 久久99精品久久久久久久久久久久| 中国丰满熟妇xxxx性| 日韩久久精品| 国产综合 伊人色| 亚洲伊人精品酒店| 欧美在线影院在线视频| 99热国产在线| 在线日韩精品视频| 四虎在线免费看| 欧美一区二区视频在线观看2020| 精品人妻无码一区二区性色| 一区二区三区四区精品在线视频| 欧美 日韩 国产 成人 在线观看 | 国产99久久久欧美黑人 | 国产日韩成人内射视频| 欧美三级免费| 亚洲国内在线| 五月天亚洲色图| 丁香婷婷久久久综合精品国产 | 欧美1区2区3区| 深夜福利成人| 亚洲伊人春色| 国产超碰91| 精品国产三区在线| 91精品久久久久久久久中文字幕 | 成人区精品一区二区婷婷| 国产一区二区黄色| 久久久久久久久成人| 国产精品综合不卡av| 人人鲁人人莫人人爱精品| 欧美激情在线播放| 影音先锋男人在线资源| 日韩中文字幕精品| www日韩tube| 亚洲天堂av在线播放| 在线观看xxx| 亚洲国产91精品在线观看| 国产高清免费av| 91麻豆精品91久久久久同性| 中文字幕在线观看视频一区| 在线一区二区三区四区五区| 欧美日韩乱国产| 偷窥国产亚洲免费视频| 日韩女同强女同hd| 性做久久久久久久免费看| 久久精品国产亚洲av高清色欲| 一区二区成人在线| 国产乱国产乱老熟300| 亚洲欧美日韩中文字幕一区二区三区| 亚洲毛片亚洲毛片亚洲毛片| 日本一区二区成人| 久久久免费看片| 国产精品系列在线| chinese全程对白| 中文字幕一区日韩精品欧美| 视频国产一区二区| 亚洲精品久久久蜜桃| 久久精品www| 亚洲午夜激情av| 国产小视频在线免费观看| 精品久久久免费| 日韩黄色片网站| 欧美日韩国产综合久久| 国产免费黄色大片| 精品处破学生在线二十三| 五月天婷婷激情网| 亚洲欧美激情四射在线日| 国产精品一区二区婷婷| 国产偷国产偷亚洲高清人白洁| 椎名由奈jux491在线播放 | 欧美一区2区视频在线观看| 国产理论片在线观看| 日韩午夜在线观看| 人妻91麻豆一区二区三区| 精品视频在线播放| 国产免费a∨片在线观看不卡| 色999日韩欧美国产| 国产激情视频在线| 97国产成人精品视频| 亚洲精品一级二级| 91九色在线视频| 久草精品视频| 天天久久人人| 欧美成熟视频| 成人在线看视频| 精品一二三四在线| www.88av| 国产精品网曝门| 国产一级免费观看| 91极品美女在线| 亚洲AV无码精品国产| 亚洲无限av看| 日韩免费影院| 国产福利精品av综合导导航| 国产激情精品一区二区三区| 麻豆精品视频| 自拍偷拍欧美专区| 日本一极黄色片| 国产美女精品在线| 人妻一区二区视频| 一区二区成人在线观看| 波多野结衣视频在线看| 日韩免费高清av| av国产在线观看| 97激碰免费视频| 婷婷久久免费视频| 欧美不卡1区2区3区| 欧美日韩天堂| 9l视频白拍9色9l视频| 91视频免费观看| 青青草成人免费| 色嗨嗨av一区二区三区| 高潮毛片7777777毛片| 中文字幕精品av| 日韩精品美女| av成人观看| 91一区在线| 精品久久久久久无码国产| 成人激情免费网站| 国产精品视频一区二区三| 欧美亚洲综合久久| 日本a一级在线免费播放| 欧美福利小视频| 99综合99| 亚洲一区bb| 日韩在线播放一区二区| 偷拍女澡堂一区二区三区| 亚洲国产你懂的| www.天堂在线| 精品国模在线视频| 深夜福利亚洲| 五月天国产一区| 视频一区欧美日韩| 久久国产精品影院| 精品欧美激情精品一区| 黄色一级大片在线免费看国产| 久久国产精品久久久久久| 欧美在线se| 亚洲精品一区二区三区蜜桃久| 鲁大师成人一区二区三区| 三级电影在线看| 欧美日韩国产黄| 天堂在线资源8| 欧美精品激情blacked18| 999久久久久久久久6666| youjizz.com在线观看| 高清不卡在线观看av| 清纯粉嫩极品夜夜嗨av| 日韩欧美一二三| 色婷婷av在线| 国产精品青青草| 欧美日韩一视频区二区| 中文字幕 日本| 亚洲va在线va天堂| 亚洲av成人精品日韩在线播放| 91大神福利视频在线| 一区二区三区日本久久久| 日韩一级免费在线观看| 中文字幕国产精品一区二区| 在线观看中文字幕码| 精品国内亚洲在观看18黄| 视频二区欧美| 男女超爽视频免费播放| 99久久综合精品| 中文字幕在线观看视频免费| 中文字幕亚洲欧美日韩高清| 四虎国产精品成人免费影视| 日本a级片在线观看| 成人亚洲精品久久久久软件| 国产精品一区二区6| 国产亚洲精品美女久久久| 久久久精品一区二区毛片免费看| 路边理发店露脸熟妇泻火| 成人高清免费观看| 一区二区三区在线观看av| 色午夜这里只有精品| 97品白浆高清久久久久久| 黄色片久久久久| 国产精品传媒在线| 国产18精品乱码免费看| 清纯唯美亚洲综合| 欧美一区二区| 粉嫩av懂色av蜜臀av分享| 欧美日韩精品一区二区天天拍小说 | sm久久捆绑调教精品一区| 日韩av在线一区二区三区| 国产真实精品久久二三区| 日韩三级视频在线播放| 丝袜美腿亚洲一区二区| gogo人体一区| 手机视频在线观看| 香蕉久久一区二区不卡无毒影院| 国产黄色免费在线观看| 99国产视频|