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

卡口服務——基于前端巡檢系統的拓展實踐

開發 架構
對于卡口服務來說,學習和閱讀巡檢的源碼是一個重要的前置工作。通過深入理解巡檢系統的實現細節和底層架構設計可以更好地理解巡檢系統是如何工作的,從而更好地進行定制和擴展,這些經驗也幫助提升了自己的編碼能力和設計能力,在后續的技術項目中可以得到應用和實踐。

一、背景

體驗是得物的業務關鍵詞之一,對于前端開發而言,提高用戶體驗更是重要工作內容之一。

得物前端平臺目前有巡檢系統、監控平臺等多種手段保障線上頁面穩定運行,但是仍有一部分問題處于“監控死角”,而且巡檢、監控都屬于后置告警手段,為了確保頁面上線前就能得到一定的用戶體驗保障,結合公司的戰略目標,我們決定開發一個H5頁面檢測服務,用來前置檢測即將上線的頁面,提前暴露該頁面可能存在的問題反饋給對應的開發/運營,我們將這個服務稱之為:“體驗卡口”。

本文從這次“體驗卡口”服務的開發實踐出發,同時介紹得物巡檢系統的架構和設計,希望能給參與穩定性建設的開發小伙伴提供一定的學習和參考價值。

二、用戶體驗量化標準

當我們試圖量化影響用戶體驗的問題時,需要思考以下兩個主要問題:

什么影響了用戶體驗?

我們已經通過豐富的數據支撐和實踐經驗,對影響用戶體驗的因素有了深入了解。從過去的線上問題反饋收集和開發經驗中,我們將體驗問題大致分為兩個等級:

  1. P0級:這些問題嚴重影響頁面加載速度或涉及到安全風險,例如頁面包含超大的圖片/媒體資源、頁面中含有個人隱私信息;
  2. P1級:這些問題可能對用戶體驗造成潛在影響,例如頁面中存在響應時間超過300ms的接口請求。

如何檢測以及量化問題?

一旦我們對體驗問題進行了定義和分級,接下來需要建立適當的機制來檢測這些問題。對于卡口服務,我們可以采取以下步驟來量化問題、轉換為可執行的檢測代碼,并通過卡口服務生成相應的檢測報告供調用方使用:

  1. 確定指標和標準:首先,我們需要確定用于量化體驗問題的指標和標準。例如,對于接口請求速度問題,可以使用接口響應時間作為指標,同時設定一定的標準,例如超過特定時間閾值即視為問題。
  2. 編寫自動化腳本:基于指標和標準,我們可以編寫自動化腳本來模擬用戶在無頭瀏覽器中執行相關操作,例如加載頁面、點擊按鈕、發送請求等。這些腳本將根據設定的指標進行性能測量和問題檢測。
  3. 使用無頭瀏覽器執行測試:我們可以在無頭瀏覽器中運行自動化腳本,模擬用戶行為并收集相應的性能數據。
  4. 結果分析和報告生成:通過收集的性能數據,我們可以進行結果分析,并將問題和相關數據轉化為檢測報告。該報告可以包括問題的詳細描述、問題等級、相關性能指標和數據。
  5. 提供給調用方:最后,通過卡口服務,我們可以將生成的檢測報告提供給調用方。調用方可以根據報告中的問題和數據進行相應的優化和改進,以提升用戶體驗。

這樣的機制可以幫助我們自動化地檢測和量化體驗問題,并提供可執行的檢測代碼和相關報告。這樣一來,我們可以更有效地識別和解決問題,并提供準確的數據給予開發團隊進行優化。

以下是我們整理出需要具體實現的檢測case:

圖片

收集完具體的影響用戶體驗的case之后,要確定具體的開發方案,由于卡口服務與得物前端平臺巡檢系統有很多技術實現重合的部分,所以我們決定利用現有的巡檢架構,將“體驗卡口”集成到現有的巡檢系統中,可以節省大量的開發時間。

3、巡檢系統基礎架構

巡檢系統的程序目標一句話總結:定時從數據源獲取待檢測頁面地址列表,然后進行批量檢測并生成報告。

為了應對不同場景下的個性化需求,巡檢系統抽象出了三個巡檢器基類,各場景繼承基類實現定制需求。

3.1 巡檢器基類

  1. DataProviderBase(數據提供基類):
  • dataSlim(): 簡化冗余數據;
  • fetchData():獲取遠程數據,處理并返回待檢測頁面url列表;
  • isSkipTime():用來設置條件,在某些特定條件下跳過定時任務;
  • schedule():設置定時任務運行區間;

圖片

  1. PageInspectorBase(頁面檢查器基類):
  • check():檢查器入口,用來打開指定的檢測頁面,并初始化各種資源的監聽;
  • injectRequestHeaders():注入頁面接口請求需要的cookie、token等;
  • urlCheck():url地址檢查;
  • onRequest():監聽頁面請求;
  • onResponse():監聽頁面響應;
  • onPageError():監聽頁面錯誤;

圖片

  1. DataReporterBase(數據報告基類):
  • buildReporter(): 根據采集到的錯誤信息生成檢測報告;
  • feishuNotify():將生成的報告通過飛書發送到指定的通知群;
  • getHTMLReporterUrl():根據ejs模板將報告生成html靜態文件并上傳,返回在線報告地址;

圖片

我們可以形象地將這三個基類比成一家飯店的三個不同分工的部門,能更方便地去理解它:

飯店前臺負責接收顧客提供的訂單,后廚根據訂單下料炒菜裝盤,服務員將做好的飯菜提供給顧客。

DataProviderBase(數據提供基類):負責定時輪詢接收外部提供的待檢測頁面列表。這個組件類似于飯店前臺,接收顧客提供的訂單。它負責從外部獲取待檢測的頁面列表,并將這些頁面傳遞給檢測器進行檢測。

PageInspectorBase(頁面檢查器基類):逐一檢測頁面列表中的每一個URL,并檢測頁面中的潛在問題。類似于后廚根據訂單下料、炒菜和裝盤的過程,這個組件負責逐個檢測待檢測頁面列表中的URL,并對每個頁面進行問題檢測。它可以使用一系列的檢測方法和規則,以確定頁面是否存在潛在問題。

DataReporterBase(數據報告基類):將檢測搜集的問題進一步整理后發送報告。類似于服務員將做好的飯菜提供給顧客,這個組件負責將經過檢測的問題進行整理和匯總,并生成相應的報告。報告可以包括問題的描述、嚴重程度、相關頁面URL等信息。然后,報告可以被發送給相關的利益相關者,例如開發或運營。

3.2 巡檢器

基于以上三個基類,根據不同巡檢場景開發不同的巡檢器(inspector),每一個巡檢器都包含了分別繼承以上三個基類的三個子類,繼承了基類的子類巡檢器通過覆寫/拓展基類方法以實現自己的個性化需求,以下是一個極簡的巡檢器例子:

// data-provider.ts
export class DataProvider extends DataProviderBase {
  // 實現特定的頁面列表獲取邏輯
  async fetchData(args) {
    return await axios.get('https://xxx.xxx').then(res => res.data.urlList)
  }
  // 每隔15分鐘獲取一次待檢測列表
  async schedule() {
    return [{cron: '*/15 * * * *',args: {}}]
  }
}


// page-inspector.ts
export class PageInspector extends PageInspectorBase {
  async onPageOpen(page, reporter: PageReporter, data) {
    const pageTitle = await page.evaluate('window.document.title')
    console.log('這里可以獲取到頁面title', pageTitle)
  }
}


// data-reporter.ts
export class DataReporter extends DataReporterBase {
  async beforeFeishuNotify(data: InspectorReportBase) {
    console.log('在飛書通知前做點什么', data)
    return data
  }
}

3.3 巡檢主程序

在巡檢系統中,每個頁面的檢測任務都是獨立的異步任務,并且每份檢測報告的整理和發送也是獨立的異步任務。為了方便管理和維護這些異步任務以及任務消息的存儲和傳遞,巡檢系統使用Redis結合Bull作為巡檢系統的異步任務管理工具。

Redis是一個內存數據庫,它提供高性能的數據存儲和訪問能力。

Bull是一個基于Redis的任務隊列庫,它提供了任務的調度、執行和消息傳遞的功能。

有了巡檢器和異步任務管理能力,主程序的主要工作如下:

  1. 定義任務:使用Bull創建兩個任務隊列,page_queue用于存放“頁面檢測任務”,reporter_queue用于存放“報告生成任務”。
  2. 生產任務:在巡檢系統中,頁面檢測任務和報告生成任務的生產者(主程序)負責將任務添加到相應的隊列中。當巡檢器(inspector)需要進行頁面檢測時,生產者將頁面檢測任務加入page_queue;當需要生成報告時,生產者將報告生成任務加入reporter_queue。
  3. 消費任務:巡檢系統中的任務消費者(主程序)負責從任務隊列中獲取任務并執行,一次檢測任務會有>=1個頁面檢測任務,交由上文介紹的頁面檢查器PageInspector執行頁面檢查,然后將檢測報告存儲到Redis中,當該次檢測任務的所有頁面都完成檢測后,reporter_queue任務被創建并交由巡檢器(inspector)的DataReporter消費。

四、卡口服務

介紹完巡檢系統,接下來我們看如何將卡口服務集成自巡檢系統中。

卡口服務的主要功能用一句話概括:接入巡檢系統的現有架構,對外暴露一個遠程接口,提供給接口調用方主動檢測頁面的能力,然后將檢測報告回傳給調用方。

對比現有巡檢系統與卡口服務的差異:


檢測發起方

檢測case

檢測報告重點

檢測回調

在線報告

巡檢系統

系統自行定時觸發

通用檢測

重點關注異常

卡口服務

接口調用觸發

基于通用檢測拓展

給出詳細報告

根據需求觸發

從上文的巡檢系統架構介紹以及分析上面的表格可知,卡口服務的開發工作就是基于巡檢系統的巡檢器架構去定制實現一個巡檢器。

4.1 卡口服務運行時序

開始開發卡口服務的巡檢器之前,我們先梳理一下整個卡口服務的運行時序:

圖片

其中卡口服務主要開發任務:步驟2、3、4、7。

4.2 創建任務接口

我們在上文提到,巡檢是一種后置檢測手段,所以巡檢系統的DataProviderBase(數據提供基類)主要能力是:“定時輪詢接收外部提供的待檢測頁面列表”。

對于卡口服務來說,檢測任務由檢測方主動創建,所以我們不需要過多關注DataProviderBase的實現,而是要啟動一個api服務,負責創建檢測任務,示例代碼如下:

app.post('/xxx.xxx', async (req, res) => {
  const urls = req.body?.urls // 待檢測url列表
  const callBack = req.body?.callBack // 調用方接收報告的回調接口地址
  const transData = req.body?.transData // 調用方需要在回調中拿到的透傳數據
  // 巡檢系統檢測任務創建函數
  newApp.createJob(urls.map(url => ({ url,
      // 在redis任務隊列中傳遞的信息
      pos: { callBack, transData },
    })),
    jobId => { // 返回任務id給調用方
      res.json({ taskId: jobId })
    }
  )
})

4.3 頁面檢測

PageInspectorBase(頁面檢查器基類)是卡口服務的改造重點,在這個基類的子類實現方面,我們需要去做前文提到的具體待實現的檢測case,主要有兩類檢測case:

  1. 請求資源型檢測case:在子類中覆寫onResponse方法,針對不同的資源類型執行不同的檢測邏輯;
  2. 運行時檢測case:在子類中覆寫onPageOpen方法,通過基類傳入的Page對象,注入js腳本,執行頁面運行時檢測;
// 頁面檢測類
class PageInspector extends PageInspectorBase {
  // ...
  // 針對不同資源類型檢測方法配置Map
  checkResponseMethodsMap = new Map([['image', this.checkImageResponse]])
  
  // 請求資源型檢測入口 針對請求資源進行檢測
  async onResponse(response: Response, reporter: PageReporter, data: IJobItem) {
    const resourceType = response.request().resourceType()
    const checkMethod = this.checkResponseMethodsMap.get(resourceType)
    await checkMethod(response, reporter, data)
  }
  
  // 檢測圖片資源
  async checkImageResponse(response: Response, reporter: PageReporter, data: IJobItem) {
    // ...
    if (imageCdnList.includes(url)) {reporter.add({ errorType: "圖片類型錯誤.非cdn資源" })}
    // ...
  }
    
  // 運行時檢測入口 在頁面打開時執行注入的js腳本進行運行時檢測
  async onPageOpen(page, reporter: PageReporter, data) {
    // ...
    const htmlText = await page.evaluate('window.document.documentElement.innerHTML')
    const phoneRegex = /\b((?:\+?86)?1(?:3\d{3}|5[^4\D]\d{2}|8\d{3}|7(?:[35678]\d{2}|4(?:0\d|1[0-2]|9\d))|9[189]\d{2}|66\d{2})\d{6})\b/g;
    let phoneMatch: RegExpExecArray
    let collectMessage = []
    while ((phoneMatch = phoneRegex.exec(html)) !== null) {
      const phone = phoneMatch[1];collectMessage.push(`手機號碼:${phone}`);
    }
    collectMessage.forEach(val => {reporter.add({ errorMessage: `敏感信息:${val}`})})
    // ...
  }
  // ...
}

RegExp.prototype.exec()

在設置了 global 或 sticky 標志位的情況下(如 /foo/g 或 /foo/y),JavaScript RegExp 對象是有狀態的。它們會將上次成功匹配后的位置記錄在 lastIndex 屬性中。使用此特性,exec() 可用來對單個字符串中的多次匹配結果進行逐條的遍歷(包括捕獲到的匹配),而相比之下, String.prototype.match() 只會返回匹配到的結果。

4.4 報告與回調

檢測任務執行完畢后,reporter_queue中會被創建一個新的“報告生成任務”,主程序調用繼承了DataReporterBase的子類進行以下操作:

  1. 對檢測項逐一整理,將搜集到的錯誤進行等級分類,整理出報告源數據;
  2. 根據報告源數據結合ejs模板生成靜態html并上傳,得到在線檢測報告地址;
  3. 向調用方回調檢測報告。

4.4.1 利用ChatGPT生成報告模板

大部分研發的UI設計水平有目共睹,與其死磕報告模板的樣式和交互,不如交給AI去搞定,輸入預先定義好的數據結構和要求,ChatGPT能非??焖俚亟o到一個模板,然后只需要稍微做一點點調整就能達到可用的狀態。

Q: 我需要你寫一個ejs模板,這個模板用來展示一個統計報告,為了樣式和交互方便,模板會通過內置bootstrap的css樣式和Jquery,你可以用到他們來實現html元素的組合和設置交互,具體的數據結構如下:


interface CheckResult {
  name: string;
  status: 0 | 1;
  message: string;
  severityLevel: 0 | 1;
}


interface DetectionResult {
  url: string;
  status: 0 | 1;
  checkResults: CheckResult[];
}


interface InspectorReport {
  taskId: string;
  reporterUrl?: string;
  detectionResults: DetectionResult[];
  startTimeStr: string;
  endTimeStr: string;
  duration: number;
  pageTotal: number;
  taskStat: {
    completed: number,
    waiting: number,
    active: number,
    delayed: number,
    paused: number,
    failed: number,
  }
}


export interface InspectorReportBase {
  manifest: IManifest,
  data: InspectorReport;
}


export interface IManifest {
  name: string
  desc?: string
  notifyTo?: string[]
}
A: 好的,以下是基于提供的數據結構設計的ejs模板:
<!DOCTYPE html>
<html lang="en">


<head>
  <meta charset="UTF-8">
  <link  rel="stylesheet">
  <script src="https://xxx.xxx.js"></script>
  <title>
    <%=data.manifest.desc%>
  </title>
</head>


<body>
  <div class="container">
    <h2 class="text-center">
      <%= data.manifest.desc %> 統計報告
    </h2>


    <div class="row">
      <div class="col-md-4">
        <div class="card">
          <div class="card-body">
            <h5 class="card-title">任務信息</h5>
            <p class="card-text">任務ID: <%= data.data.taskId %>
            </p>
            <p class="card-text">檢測開始時間: <%= data.data.startTimeStr %>
            </p>
            <p class="card-text">檢測結束時間: <%= data.data.endTimeStr %>
            </p>
            <p class="card-text">檢測時長: <%= data.data.duration %> 秒</p>
            <p class="card-text">檢測頁面數: <%= data.data.pageTotal %>
            </p>
            <!--以下省略 -->
</body>
</html>

AI生成的在線報告模板:

圖片

4.4.2 與調用方解耦

作為服務提供者,卡口服務并不想過多關注調用者是誰,那么要如何實現與調用方的解耦?

——回顧上文“創建任務接口”環節,這個接口設計的入參有callBack和transData字段:

  1. callBack:檢測任務結束時,卡口服務將調用該地址回傳檢測報告;
  2. transData:檢測任務結束時,需要透傳給callBack的數據;

頁面檢測任務完成后,在回調測試報告環節,卡口服務將從redis隊列任務的緩存中中取出這兩個值,使用POST請求將報告和transData發送給callBack。

// 卡口服務回調示例代碼
axios.post(callBack, { 
  data: { msg: "本次檢測檢測報告如下:xxxxx", transData: `透傳的數據如下:${transData}` }
})

在后續的規劃中,為了使卡口服務能適應更多場景的不同需求,參考后端微服務注冊中心的概念,可以實現一個簡易的注冊中心的抽象模型,進一步解耦卡口服務與其調用方之間的邏輯,同時能拓展更多功能:自定義檢測項、自定義報告模板等。

圖片

5、總結

對于卡口服務來說,學習和閱讀巡檢的源碼是一個重要的前置工作。通過深入理解巡檢系統的實現細節和底層架構設計可以更好地理解巡檢系統是如何工作的,從而更好地進行定制和擴展,這些經驗也幫助提升了自己的編碼能力和設計能力,在后續的技術項目中可以得到應用和實踐。希望閱讀完本文的開發同學都能從本篇實踐總結中有所收獲~

引用/參考鏈接

GitHub - OptimalBits/bull

RegExp.prototype.exec() - JavaScript | MDN

責任編輯:武曉燕 來源: 得物技術
相關推薦

2022-08-15 22:28:57

串口訪問鴻蒙

2022-06-27 09:36:29

攜程度假GraphQL多端開發

2017-09-01 18:27:36

前端 RxJs數據層

2018-04-20 10:38:25

2022-05-26 21:33:09

業務前端測試

2025-06-20 02:11:00

2021-02-20 10:26:00

前端

2019-10-15 09:20:40

Linux系統服務器

2022-05-26 10:12:21

前端優化測試

2022-07-27 22:56:45

前端應用緩存qiankun

2025-09-09 02:00:00

2023-09-27 07:28:02

CQRS架構直播房間

2024-08-20 09:59:22

2021-07-28 10:55:26

接口服務https:

2021-11-22 10:40:35

Linux腳本內存

2021-04-15 08:08:48

微前端Web開發

2025-02-13 00:00:12

LangServeDeepsee大模型

2015-07-22 15:19:46

Docker云計算微服務

2017-05-09 12:40:05

2022-06-20 06:24:13

5GWeb前端開發
點贊
收藏

51CTO技術棧公眾號

日本国产欧美| 日韩电影免费| 精品成人一区| 国产视频精品xxxx| 美女少妇一区二区| 男人影院在线观看| 粉嫩av亚洲一区二区图片| 2019亚洲男人天堂| 欧美自拍偷拍网| 8848成人影院| 在线看日本不卡| 青青草免费在线视频观看| 嫩草影院一区二区| 老鸭窝一区二区久久精品| 久久影视免费观看| 高潮毛片无遮挡| 欧美影院在线| 日本高清不卡一区| 中文精品无码中文字幕无码专区| 九色在线播放| 国产999精品久久久久久| 日韩男女性生活视频| 成人免费毛片东京热| 亚洲桃色综合影院| 日韩免费一区二区| 小泽玛利亚视频在线观看| 黄色羞羞视频在线观看| 国产精品美女久久久久久久 | 一级日韩一区在线观看| 日本美女一级片| 激情久久五月天| 国产成人jvid在线播放| 日本天堂在线视频| 一本一本久久a久久综合精品| 亚洲欧洲午夜一线一品| 水蜜桃av无码| jizz18欧美18| 日韩一级片网站| 黄色在线视频网| 成人线上视频| 精品久久香蕉国产线看观看亚洲| 在线国产精品网| 91在线品视觉盛宴免费| 久久精品视频一区二区三区| 国产亚洲自拍偷拍| 亚洲卡一卡二卡三| 国产一区亚洲一区| 成人精品久久久| 一级黄色大毛片| 蜜臀久久99精品久久久久久9 | 伊人久久免费视频| 日本少妇色视频| 香蕉久久精品| 精品视频中文字幕| 丰满大乳奶做爰ⅹxx视频| 风间由美一区二区av101| 日韩欧美电影一区| 国产香蕉精品视频| 国产精品xxx在线观看| 日韩精品一区在线| 不许穿内裤随时挨c调教h苏绵| 免费一级欧美在线大片| 日韩欧美国产午夜精品| 日韩av成人网| 成人看片爽爽爽| 亚洲成色www8888| 国产美女视频免费观看下载软件| 牛牛视频精品一区二区不卡| 亚洲精品mp4| 免费a在线观看播放| 欧美美女在线| 色一情一乱一区二区| 国产一级淫片久久久片a级| 久久一区91| 九色精品美女在线| 黄色激情视频在线观看| 亚洲综合国产| 国产精品午夜视频| 国产夫妻在线观看| 成人精品国产免费网站| 久久亚洲午夜电影| 成黄免费在线| 亚洲精品国产精品乱码不99 | 久久国产精品久久w女人spa| 国产91色在线免费| 日韩xxx视频| 国产一区二区三区四区在线观看| 高清国语自产拍免费一区二区三区| 日本黄色三级视频| 久久久精品天堂| 中文字幕一区二区三区乱码 | 在线观看xxx| 日本一二三四高清不卡| 六月婷婷激情网| 日韩电影免费看| 欧美色网一区二区| 911亚洲精选| 国产亚洲精品美女久久久久久久久久| 丝袜亚洲欧美日韩综合| 久久久综合久久久| 免费亚洲电影在线| 国产精品麻豆免费版| 高清毛片在线看| 一区二区三区波多野结衣在线观看| 日本国产在线播放| 成人精品国产| 亚洲成人网久久久| 日本不卡一二区| 国产麻豆综合| 亚洲aⅴ男人的天堂在线观看| 污污视频在线观看网站| 成人免费小视频| 国语对白做受xxxxx在线中国| 激情五月综合婷婷| 国产亚洲欧美aaaa| 日韩乱码一区二区| 国产在线视频不卡二| 日韩福利视频| 国内激情视频在线观看| 欧美日本一道本| 实拍女处破www免费看| 国精品一区二区三区| 成人国产精品一区| 国产一二三在线观看| 午夜精品福利在线| 国产麻豆剧传媒精品国产| 色爱综合网欧美| 日韩美女免费线视频| 三级小视频在线观看| 亚洲日本在线天堂| 天堂网在线免费观看| 国产91一区| 欧美一级电影久久| 黄色av小说在线观看| 亚洲天堂精品在线观看| 999精品视频在线| 亚洲婷婷影院| 91精品国产免费久久久久久 | 亚洲18在线| 亚洲最大中文字幕| 91porny九色| 久久久久国产免费免费| 久久国产成人精品国产成人亚洲| 亚洲成av人片在线观看www| 日韩视频第一页| 中文资源在线播放| 中文字幕av在线一区二区三区| 欧美牲交a欧美牲交aⅴ免费真| 久9re热视频这里只有精品| 久久久久久九九九| 亚洲精品久久久蜜桃动漫| 亚洲人一二三区| 一级片免费在线观看视频| 羞羞色午夜精品一区二区三区| 国产在线视频一区| 国产二区三区在线| 日韩一区和二区| 九九九免费视频| 成人福利视频在线看| 人妻少妇精品无码专区二区| 99re91这里只有精品| 欧美精品999| 天堂av2024| 色哟哟欧美精品| 欧美 日韩 成人| 蜜臀av性久久久久蜜臀aⅴ流畅| 午夜午夜精品一区二区三区文| 最新日韩三级| 正在播放欧美视频| 国产内射老熟女aaaa∵| 亚洲最新视频在线观看| 国产精品久久久久久久无码| 亚洲一区二区伦理| 性欧美精品一区二区三区在线播放 | 国产人成视频在线观看| 一本色道88久久加勒比精品| 鲁鲁狠狠狠7777一区二区| 欧美大胆成人| 日韩视频免费看| 好吊色一区二区三区| 高潮白浆女日韩av免费看| 影音先锋制服丝袜| 国产原创一区二区| 成熟丰满熟妇高潮xxxxx视频| 久久最新网址| 91精品网站| 一区二区乱码| 久久亚洲精品小早川怜子66| 特黄aaaaaaaaa真人毛片| 欧美视频一区二| 久久久精品91| 国产日韩欧美精品一区| 中文字幕第三区| 免费看的黄色欧美网站| 中文字幕色一区二区| 神马午夜久久| 亚洲xxxxx性| 韩国精品主播一区二区在线观看| 久久不射热爱视频精品| 日本午夜在线视频| 91精品一区二区三区在线观看| 日本熟妇色xxxxx日本免费看| 国产欧美日韩视频一区二区 | 伊人久久亚洲综合| 亚洲国产精品久久久久婷婷884 | 欧洲精品久久一区二区| 欧美在线观看视频一区二区 | 色天天综合色天天久久| 国产性xxxx| 欧美国产一区视频在线观看| 人妻换人妻a片爽麻豆| 美女视频网站久久| av之家在线观看| 综合在线视频| 亚洲va久久久噜噜噜久久狠狠| 97久久综合精品久久久综合| 国产91在线视频| av色在线观看| 久久综合网hezyo| 爱久久·www| 精品中文字幕久久久久久| 亚洲第九十九页| 欧美电影一区二区| 91视频在线视频| 大桥未久av一区二区三区| 四虎免费在线视频| 亚洲色图制服丝袜| 纪美影视在线观看电视版使用方法| 成人18视频在线播放| 一级日本黄色片| 六月丁香婷婷色狠狠久久| 欧美成人免费高清视频| 一区二区日韩免费看| 日韩精品在线中文字幕| 欧美不卡一区| 最新av在线免费观看| 成人综合久久| 午夜一区二区三区| 青青草成人影院| 日韩av电影免费在线| 要久久电视剧全集免费| 国产偷国产偷亚洲高清97cao| 精品亚洲二区| caoporen国产精品| 亚洲亚洲一区二区三区| 亚洲一区二区三区成人在线视频精品 | 在线观看国产精品入口| 手机成人av在线| 国产高清欧美| 26uuu成人| 91精品天堂福利在线观看| 中文字幕一区二区三区有限公司| 色偷偷综合网| 手机成人av在线| 午夜精品电影| a级免费在线观看| 在线欧美亚洲| 免费 成 人 黄 色| 国产日韩一区二区三区在线| 男人操女人逼免费视频| 亚欧成人精品| 日韩欧美黄色大片| 毛片av一区二区三区| 黄色片免费网址| 岛国一区二区在线观看| 欧美精品欧美极品欧美激情| 91免费国产视频网站| 欧美老熟妇乱大交xxxxx| 国产亲近乱来精品视频| 老司机精品免费视频| 日韩毛片精品高清免费| 九九热国产精品视频| 天天影视涩香欲综合网 | 日本h片在线观看| 久久久女人电视剧免费播放下载 | 蜜芽tv福利在线视频| 宅男66日本亚洲欧美视频| 麻豆av免费在线观看| 欧美激情在线狂野欧美精品| 中文在线免费二区三区| 国产精品午夜视频| 成人h动漫精品一区二区器材| 久久综合给合久久狠狠色| 成人精品影视| 欧美激情亚洲天堂| 免费在线日韩av| 天天操狠狠操夜夜操| av午夜一区麻豆| 久久精品三级视频| 亚洲一区二区三区美女| 中文字幕精品视频在线观看| 欧美精品在线观看播放| 日韩中文字幕综合| 日韩中文字幕国产精品| 97天天综合网| 国产精品自在线| 国产一区二区三区亚洲| 亚洲 国产 日韩 综合一区| 欧美日韩三区| 九九九在线观看视频| 国产成人激情av| 老头老太做爰xxx视频| 亚洲一二三区视频在线观看| 波多野结衣电车| 亚洲国产私拍精品国模在线观看| av资源网站在线观看| 久久久久久久久久久久av| 欧美91在线|欧美| 久久国产精品 国产精品| 91tv精品福利国产在线观看| av网站在线观看不卡| 国产麻豆精品视频| 老司机福利在线观看| 日韩人体视频一二区| 黄色一级大片在线免费看国产一| 日韩中文字幕第一页| 成人啊v在线| 欧美一区二区在线| 国产欧美日韩亚洲一区二区三区| 一级黄色高清视频| 国产精品久久久久久久久久久免费看 | 草草在线观看| 国产高清一区二区三区| 一级毛片免费高清中文字幕久久网| 欧美污视频网站| 91丨九色丨蝌蚪丨老版| 国产成人亚洲精品自产在线| 日韩欧美国产三级| 色女人在线视频| 97超碰人人看人人| 中文字幕日韩一区二区不卡| 性生生活大片免费看视频| 国产欧美日韩在线| 国产九色91回来了| 国产亚洲视频在线观看| 我爱我色成人网| 欧洲亚洲一区二区| 久久在线精品| 久久丫精品忘忧草西安产品| 一本到三区不卡视频| 日本在线视频1区| 国产成人小视频在线观看| 色棕色天天综合网| 韩国中文字幕av| 中文字幕在线观看不卡| 一区二区三区午夜| 精品国产一区二区三区久久久狼 | 无码人妻av一区二区三区波多野| 日韩av最新在线| gogo高清午夜人体在线| 懂色一区二区三区av片| 91tv官网精品成人亚洲| 欧美美女一级片| 亚洲视频免费看| 国产三级自拍视频| 欧美交受高潮1| theporn国产在线精品| 国产老熟妇精品观看| a在线欧美一区| 国产精品午夜一区二区| 在线亚洲午夜片av大片| 女生影院久久| 视频一区二区三区免费观看| 日本午夜一本久久久综合| 国产成人精品视频免费| 欧美年轻男男videosbes| 在线看女人毛片| 成人自拍偷拍| 国产在线日韩| 午夜视频在线观看国产| 午夜视频一区二区| 国产福利在线| 国产精品一区二区在线| 国产精品99免费看| 亚洲自拍偷拍精品| 欧美系列一区二区| 黄色网在线免费看| 国模精品一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频| 中文字幕制服丝袜| 色婷婷av一区二区三区软件| 午夜视频在线观看网站| 国产a一区二区| 美女91精品| 人妻久久一区二区| 亚洲电影第1页| 超碰这里只有精品| 中文字幕一区二区三区四区五区人 | 日韩av电影在线播放| 日本在线电影一区二区三区| 天天操狠狠操夜夜操| 激情久久av一区av二区av三区| 激情小视频在线观看| 96成人在线视频| 国产亚洲高清视频| 国产成人福利在线| 日韩欧美在线影院| 九七电影院97理论片久久tvb| 亚洲小视频在线播放| 久久久青草青青国产亚洲免观|