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

如何利用Electron開發一個桌面APP

開發 前端 移動開發
你是否曾經想過可以用 HTML、CSS 和 JavaScript 這些前端技術來構建跨平臺的桌面應用?使用 Electron 就能做到。本文帶著你深入 Electron 的核心概念。

你是否曾經想過可以用 HTML、CSS 和 JavaScript 這些前端技術來構建跨平臺的桌面應用?

使用 Electron 就能做到。

本文帶著你深入 Electron 的核心概念。

[[216364]]

閱讀本文后,你會知道如何使用 Electron、HTML 和 CSS 構建跨平臺桌面應用。

在開始之前,你可以提前看看我們在本教程中要構建的應用。

Hear Me Type [譯者注:本文的示例應用名為 Hear Me Type] 功能簡單直接,應用中每個鍵都會播放特有的聲音。比如我按下了 “A”,應用會播放字母 A 特有的聲音。

該應用目前有兩個版本可供下載:本教程的源碼,以及一個推薦給更有經驗的 Electron 用戶的高級版本。

因為我還在為改善應用以及添加一些新功能,所以代碼會發生變化,請一定注意看看有哪些更新。

就此打住,我們現在開始學習 Electron 并用它來創建***個應用!

什么是 Electron?

Electron 是一個基于 Chrominum 和 Node.js 的跨平臺桌面應用框架。

在這個框架中很容易構建基于 HTML、CSS 和 JavaScript 技術的跨平臺應用。構建出來的應用會很好地兼容 Mac、Windows 和 Linux 操作系統。

它還有其它一些特性:

  • 自動更新 —— 應用支持自動更新
  • 原生菜單和通知 —— 可以創建原生應用菜單和上下文菜單
  • 應用崩潰報告 —— 可以將崩潰報告提交到遠程服務器
  • 調試和分析 —— Chrominum 的內容模塊可以發生性能瓶頸和緩慢的操作。你也可以在應用中使用自己喜歡的 Chrome 開發者工具。
  • Windows installer —— 可以快速便捷地創建安裝包。

如果你對 Electron 的功能感到滿意,我們就繼續深入,創建一個簡單的 Electron 應用。

動手之前需要先安裝 Node.js。你還應該申請一個 GitHub 賬戶來保存和更新應用。雖然這個賬戶并不是必須的,但我非常建議你去申請一個。Github 是一個行業標準,學會使用 Github 非常重要。

我會在教程中使用 Github。

開始

準備好之后,打開系統終端窗口。

按照下面的介紹將 Electron Quick Start 這個 Git 庫克隆到計算機上。

我們會基于 Electron Quick Start 來創建自己的軟件。

 

  1. # Clone the Quick Start repository 
  2. git clone  
  3. # Go into the repository 
  4. cd electron-quick-start 
  5. # Install the dependencies and run 
  6. npm install && npm start 

完成上面的步驟之后,你會看到一個像瀏覽器窗口的應用打開。它確實是一個瀏覽器窗口!

這個窗口顯示的樣子在不同的操作系統上會有所不同。我選擇使用 Windows 的經典樣式。非常贊!

 


Quick-Start Electron 應用的主窗口

正如我之前所說,你可以在應用中使用 Chrome 開發者工具,這個工具的用法跟在瀏覽器中的開發者工具一樣,再贊一個!

Electron 應用程序架構

我們來看看這個應用的源代碼及其文件結構??梢允褂媚阕约合矚g的編輯器或者 IDE 打開項目,我使用 Atom …… 你猜到了 …… 它就是用 Electron 構建的![譯者注:我比較喜歡 VSCode,也是基于 Electron 構建的]

如何利用Electron開發一個桌面APP

新應用的目錄和文件結構。

我們有一個基本的文件結構:

electron-quick-start

  • - index.html
  • - main.js
  • - package.json
  • - render.js

文件結構類似于我們創建網頁的結構。

我們有:

  • index.html 是一個 HTML5 頁面,它具有很重要的作用:提供畫布
  • main.js 創建窗口并處理系統事件
  • package.json 是應用的啟動腳本。它包含了應用的信息,在主進行中運行
  • render.js 處理應用的渲染進程

也許你對主進程和渲染進程存有疑問。它們到底是什么,用來干什么?

很高興你有此疑問。注意了,如果你來自瀏覽器的 JavaScript 領域,這對你來說可能是一塊新的領域!

什么是進程?

看到“進程”這個詞的時候,想像一下操作系統級的進程。那是運行在系統中的計算機程序實例。

啟動 Electron 應用之后,查看 Windows 的任務管理器或者 macOS 的活動監視器,就可以看到與這個應用相關的進程。

 

這些進程都是并行運行的,為每個進程分配的內存和資源相互隔離。

如果我想創建一個 for 循環在渲染進程中逐步處理一些事件。

 

  1. var a = 1; 
  2. for ( a = 1; a < 10; a ++) { 
  3.  console.log('This is a for loop'); 

這些改變只在渲染進程中有效,根本不會對主進行造成影響。“This is a for loop”消息只會出現在渲染模塊中。

主進程

主進程控制著應用的生命周期。它內置了完整的 Node.js API,可以打開對話框,創建渲染進程,還可以處理其它其它與操作系統的交互操作,包括啟動和退出應用。

按照慣例,這個進程寫在名為 main.js 的文件中。不過你想使用其它名字也沒有問題。

你可以在 package.json 文件中配置主進程文件的名稱。

試驗一下,打開 package.json 并將

  1. “main”: “main.js”, 

修改為

  1. “main”: “mainTest.js”, 

啟動應用看看它是否仍然正常運行。

注意,主進程只有一個。

渲染進程

應用中的渲染進程是一個瀏覽器窗口。與主進程不同,可以存在多個獨立的渲染進程。

因為渲染進程是各自獨立的,如果其中一個崩潰了并不會影響到其它進程,這得益于 Chrominum 的多進程架構。

這些瀏覽器窗口就像演示網頁一樣,也可以被隱藏或自定義。

不過 Electron 內置了完整的 Node.js API,也就是說我們可以打開對話框或進行其它與操作系統的交互。

這樣考慮;

 


[來源: Kristian Poslek]

還有一個問題,它們能以某種方式聯系起來嗎?

這些進程都在獨立運行,但他們仍然需要通信,因為它們負責不同的任務,這尤其需要通信。

為此,存在一個進程間的通信系統或者 IPC。你可以使用 IPC 在主進程和渲染進程間進行通信。對于這個知識點更深入一些的解釋,請閱讀 Christian Engvall 的文章。

上面說的都是開發 Electron 應用的基礎知識。

現在回到我們的代碼!

私有化

讓我們給應用所在的目錄起一個合適的名稱。

將目錄名從 electron-quick-start 改為 hear-me-type-tutorial。

重新在編輯器或 IDE 中打開這個目錄,我們打開 package.json 來進一步定制應用標識。

package.json 包含了至關重要的應用信息。這里定義應用的名稱、版本、主文件、作者、許可協議等。

現在把作者改成自己的名稱,自豪感油然而生。

找到 “author” 參數,然后將值改成自己的名稱。它看起來像這樣:

  1. “author”: “Carol Pelu”, 

我們還要改其它一些參數。在 package.json 中找到 name(名稱) 和 description(說明)并修改它們:

如何利用Electron開發一個桌面APP

帥呆了!現在應用有了新名稱,還有簡短而清晰的說明。

記住,你可以在終端運行 npm start 來運行應用,以觀察所做的改變。

我們會繼續在應用中添加一些期望的功能。我們想在按下每個鍵的時候播放不同的聲音。

哦,有趣的功能!

沒有功能的應用是什么?什么都不是……

現在我們要給它添加功能。

為了讓應用響應輸入,我們必須定義一個元素來捕捉事件,然后觸發期望的動作。

為此,我們會創建一個具有特殊名稱的若干 audio 元素,對應于按鍵。然后我們會使用一個 switch 語句來定位按下的鍵,播放與之關聯的聲音。

如果你現在覺得有點復雜,不要怕,我會指引你一步步進行。

下載這個壓縮包,它包含了我們要使用的所有聲音文件。很快就會用到!

我們會打開 index.html 文件,創建一個<audio> 元素,在我們的應用中加入聲音。

在<body> 元素內部,創建一個 div 元素,將其 class 屬性設置為 audio。

在剛剛創建的 div 元素,創建<audio> 元素,將其 ID 命名為 “A”,source 屬性設置為 “sounds/A.mp3”,preload 屬性設置為 “auto”。

preload=”auto” 用于告訴應用在頁面加載的時候就加載完整的聲音文件。index.html 是應用的主文件,所有聲音都會在應用啟動的時候加載。

下面是代碼:

  1. <div class="audio"
  2. <audio id="A" src="sounds/A.mp3" preload="auto"></audio> 
  3. </div> 

 

如何利用Electron開發一個桌面APP

你的 index.html 應該就像這樣。

現在 指向一個未知的文件。我們要創建一個名為 soudes 的目錄,并將所有聲音文件解壓到這個目錄中。

非常好!現在唯一缺少的是 JavaScriopt 代碼。

創建一個叫 functions.js 的新文件,并在 index.html 中通過 require 引用它,這樣應用運行的時候才會執行 JS 代碼。

在示例的 require(./renderer.js') 下載添加這樣一行:

  1. require('./functions.js'

之后項目看起來是這樣的:

如何利用Electron開發一個桌面APP

不錯!一切就緒,下面是見證奇跡的時刻。

打開 functions.js 文件并將下面的代碼添加到文件中。我稍后解釋這段代碼。

 

  1. document.onkeydown = function(e) { 
  2.     switch (e.keyCode) { 
  3.         case 65: 
  4.             document.getElementById('A').play(); 
  5.             break; 
  6.         default
  7.             console.log("Key is not found!"); 
  8.     } 
  9. }; 

代碼現在是這樣:

如何利用Electron開發一個桌面APP

打開 Bash 或者終端窗口,確保當前是在項目目錄下,運行 npm start 來啟動應用。

調整揚聲器的音量并敲下按鍵。

  1. #MindBlown 

 

[[216365]]

JS 代碼非常簡單明了。

我們使用了 document 對象上的 onkeydown 事件,在這里找到被訪問的元素。記住,document 對象是應用的主窗口。

我們在在匿名函數中使用了 switch 語句,根據 Unicode 值來判斷按鍵。

如果找到按鍵對應的 Unicode 值,就會播放相應的聲音,否則拋出 “not found” 錯誤。這個錯誤要在控制臺中去找。

多么愉快的過程!

你可能注意到了,我們的聲音文件包含了 A-Z 和 0-9 這些鍵,把它們都用起來。

在 index.html 中為每個有對應聲音文件的鍵都創建一個 元素。

之后代碼就像這樣:

 

當然你可以用拷貝粘貼:

  1. <audio id="B" src="sounds/B.mp3" preload="auto"></audio> 
  2. <audio id="C" src="sounds/C.mp3" preload="auto"></audio> 
  3. <audio id="D" src="sounds/D.mp3" preload="auto"></audio> 
  4. <audio id="E" src="sounds/E.mp3" preload="auto"></audio> 
  5. <audio id="F" src="sounds/F.mp3" preload="auto"></audio> 
  6. <audio id="G" src="sounds/G.mp3" preload="auto"></audio> 
  7. <audio id="H" src="sounds/H.mp3" preload="auto"></audio> 
  8. <audio id="I" src="sounds/I.mp3" preload="auto"></audio> 
  9. <audio id="J" src="sounds/J.mp3" preload="auto"></audio> 
  10. <audio id="K" src="sounds/K.mp3" preload="auto"></audio> 
  11. <audio id="L" src="sounds/L.mp3" preload="auto"></audio> 
  12. <audio id="M" src="sounds/M.mp3" preload="auto"></audio> 
  13. <audio id="N" src="sounds/N.mp3" preload="auto"></audio> 
  14. <audio id="O" src="sounds/O.mp3" preload="auto"></audio> 
  15. <audio id="P" src="sounds/P.mp3" preload="auto"></audio> 
  16. <audio id="Q" src="sounds/Q.mp3" preload="auto"></audio> 
  17. <audio id="R" src="sounds/R.mp3" preload="auto"></audio> 
  18. <audio id="S" src="sounds/S.mp3" preload="auto"></audio> 
  19. <audio id="T" src="sounds/T.mp3" preload="auto"></audio> 
  20. <audio id="U" src="sounds/U.mp3" preload="auto"></audio> 
  21. <audio id="V" src="sounds/V.mp3" preload="auto"></audio> 
  22. <audio id="W" src="sounds/W.mp3" preload="auto"></audio> 
  23. <audio id="X" src="sounds/X.mp3" preload="auto"></audio> 
  24. <audio id="Y" src="sounds/Y.mp3" preload="auto"></audio> 
  25. <audio id="Z" src="sounds/Z.mp3" preload="auto"></audio> 
  26. <audio id="0" src="sounds/0.mp3" preload="auto"></audio> 
  27. <audio id="1" src="sounds/1.mp3" preload="auto"></audio> 
  28. <audio id="2" src="sounds/2.mp3" preload="auto"></audio> 
  29. <audio id="3" src="sounds/3.mp3" preload="auto"></audio> 
  30. <audio id="4" src="sounds/4.mp3" preload="auto"></audio> 
  31. <audio id="5" src="sounds/5.mp3" preload="auto"></audio> 
  32. <audio id="6" src="sounds/6.mp3" preload="auto"></audio> 
  33. <audio id="7" src="sounds/7.mp3" preload="auto"></audio> 
  34. <audio id="8" src="sounds/8.mp3" preload="auto"></audio> 
  35. <audio id="9" src="sounds/9.mp3" preload="auto"></audio> 

現在在 functions.js 中加點代碼。

你可以在這個網站上查到字符碼(charCode 或 keyCode)。

當然,也可以使用拷貝粘貼:

 

  1. document.onkeydown = function(e) { 
  2.     switch (e.keyCode) { 
  3.         case 48: 
  4.             document.getElementById('0').play(); 
  5.             break; 
  6.         case 49: 
  7.             document.getElementById('1').play(); 
  8.             break; 
  9.         case 50: 
  10.             document.getElementById('2').play(); 
  11.             break; 
  12.         case 51: 
  13.             document.getElementById('3').play(); 
  14.             break; 
  15.         case 52: 
  16.             document.getElementById('4').play(); 
  17.             break; 
  18.         case 53: 
  19.             document.getElementById('5').play(); 
  20.             break; 
  21.         case 54: 
  22.             document.getElementById('6').play(); 
  23.             break; 
  24.         case 55: 
  25.             document.getElementById('7').play(); 
  26.             break; 
  27.         case 56: 
  28.             document.getElementById('8').play(); 
  29.             break; 
  30.         case 57: 
  31.             document.getElementById('9').play(); 
  32.             break; 
  33.         case 65: 
  34.             document.getElementById('A').play(); 
  35.             break; 
  36.         case 66: 
  37.             document.getElementById('B').play(); 
  38.             break; 
  39.         case 67: 
  40.             document.getElementById('C').play(); 
  41.             break; 
  42.         case 68: 
  43.             document.getElementById('D').play(); 
  44.             break; 
  45.         case 69: 
  46.             document.getElementById('E').play(); 
  47.             break; 
  48.         case 70: 
  49.             document.getElementById('F').play(); 
  50.             break; 
  51.         case 71: 
  52.             document.getElementById('G').play(); 
  53.             break; 
  54.         case 72: 
  55.             document.getElementById('H').play(); 
  56.             break; 
  57.         case 73: 
  58.             document.getElementById('I').play(); 
  59.             break; 
  60.         case 74: 
  61.             document.getElementById('J').play(); 
  62.             break; 
  63.         case 75: 
  64.             document.getElementById('K').play(); 
  65.             break; 
  66.         case 76: 
  67.             document.getElementById('L').play(); 
  68.             break; 
  69.         case 77: 
  70.             document.getElementById('M').play(); 
  71.             break; 
  72.         case 78: 
  73.             document.getElementById('N').play(); 
  74.             break; 
  75.         case 79: 
  76.             document.getElementById('O').play(); 
  77.             break; 
  78.         case 80: 
  79.             document.getElementById('P').play(); 
  80.             break; 
  81.         case 81: 
  82.             document.getElementById('Q').play(); 
  83.             break; 
  84.         case 82: 
  85.             document.getElementById('R').play(); 
  86.             break; 
  87.         case 83: 
  88.             document.getElementById('S').play(); 
  89.             break; 
  90.         case 84: 
  91.             document.getElementById('T').play(); 
  92.             break; 
  93.         case 85: 
  94.             document.getElementById('U').play(); 
  95.             break; 
  96.         case 86: 
  97.             document.getElementById('V').play(); 
  98.             break; 
  99.         case 87: 
  100.             document.getElementById('W').play(); 
  101.             break; 
  102.         case 88: 
  103.             document.getElementById('X').play(); 
  104.             break; 
  105.         case 89: 
  106.             document.getElementById('Y').play(); 
  107.             break; 
  108.         case 90: 
  109.             document.getElementById('Z').play(); 
  110.             break; 
  111.         default
  112.             console.log("Key is not found!");     
  113.     } 
  114. }; 

大功告成!

應用的主要功能已經完成了,但仍然還有些工作要做!

完善!

應用程序的功能已經完成,但它尚不完善。

比如,可以在 index.html 中修應用的標題和主窗口的內容。

此外,這個應用沒有設計炫麗的色彩,也沒有使用漂亮的圖片。

充分發揮你的想像,找出改進應用設計的方法。

代碼也不***,我們有很多相同的代碼需要優化以減少代碼行數,至少看起來不那么難受。

重復代碼真不是好做法!

 

測試!就是測試!

好的軟件需要通過測試。

我建議你先按鍵看看,會發生什么事。

***的情況是你會聽到每個鍵對應的聲音。但如果你快速的按下多個鍵的時候會發生什么呢?如果按下了非預期的鍵,比如 Home 和 NumLock,又會發生什么呢?

如果你最小化程序再嘗試著按鈕會怎樣?能聽到聲音嗎?如果沒有選擇應用程序窗口,按下鍵盤時,還會聽到聲音嗎?

答案是否定的。

Electron 的架構決定了其行為。它允許你可以像 C# 語言那樣使用所有按鍵,但你不能注冊個性化的按鍵。這已經超出了 Electron 應用的使用范圍。

一行行的執行代碼,并深度中斷它,看看會發生什么,Electron 會拋出什么樣的錯誤。這一練習能幫助你更好地進行調試。如果你知道應用的缺陷,那么你就知道該如何去修復,讓應用變得更好。

我故意在 functions.js 文件中使用了一個廢棄的 JavaScript 事件,你能發現嗎?

如果你找到了,我希望你能在不改變應用程序功能的情況下替換它。

使用廢棄的代碼很不好,這可能會導致嚴重錯誤,你甚至可能意識不到這些錯誤的存在。關注語言的***文件,了解可能發生的變化,始終了解***狀態。

責任編輯:未麗燕 來源: 開源中國編譯
相關推薦

2023-08-09 14:43:42

應用開發ArkTS

2013-07-08 10:40:02

2020-10-13 10:49:23

APPAndiroid終端

2018-10-11 21:00:18

2019-10-29 09:48:20

ElectronGithub開源庫

2014-07-02 10:03:42

App推廣渠道

2017-11-13 13:33:09

MySQL全備份恢復表

2018-03-19 15:46:42

LinuxCTagsSublime Tex

2018-06-19 16:04:27

Dubbo應用Java

2022-09-01 11:04:47

PythonApp

2022-05-17 08:39:05

VueViteTypeScript

2010-05-24 09:16:30

云計算虛擬桌面

2014-03-12 10:00:26

移動開發跨平臺

2022-02-24 20:34:02

Dooring開發桌面端應用

2023-03-17 18:33:12

ChatGPTLLM應用

2015-03-10 11:21:44

JavaScript組JavaScript

2022-02-22 20:35:22

公鑰私鑰數據

2023-06-03 00:04:43

Electron版本安全

2024-02-21 09:43:50

ElectronNode.js前端

2023-10-11 10:03:33

Electron桌面應用開發工具
點贊
收藏

51CTO技術棧公眾號

国产91视觉| 中文字幕亚洲一区二区三区| www插插插无码免费视频网站| 亚洲va天堂va欧美ⅴa在线| 99热免费精品| 国产亚洲日本欧美韩国| 亚洲自拍第三页| 春色校园综合激情亚洲| 欧美激情在线一区二区| 91蜜桃网站免费观看| 男人的天堂一区二区| 国产一区二区在线| 日韩欧美国产午夜精品| 欧美牲交a欧美牲交aⅴ免费真| 日本高清在线观看wwwww色| 成人国产精品免费观看视频| 国产精品一区二区久久精品 | 西野翔中文久久精品字幕| 精品视频全国免费看| 日本福利视频一区| 天堂中文а√在线| 91小视频在线免费看| 91精品免费久久久久久久久| 日本中文在线播放| 中文字幕午夜精品一区二区三区| 亚洲欧洲视频在线| 久久久久久久穴| 青娱乐极品盛宴一区二区| 五月激情综合婷婷| 国产精品久久久影院| se在线电影| 久久婷婷色综合| 国产精品国模在线| 草视频在线观看| 欧美日韩水蜜桃| 亚洲黄色av女优在线观看 | 亚洲人高潮女人毛茸茸| 亚洲精品久久一区二区三区777| 日本美女久久| 色播五月激情综合网| 免费观看国产精品视频| 亚洲精品一线| 亚洲色图在线播放| 亚洲精品中文字幕在线| 欧洲一区av| 99久久er热在这里只有精品15| 91九色露脸| 国产精品久久久久久久久毛片 | 亚洲第一色av| 国产一区精品福利| 欧美午夜一区二区三区免费大片| 欧美日韩国产精品激情在线播放| 91资源在线观看| 亚洲在线观看免费视频| 精品免费久久久久久久| a免费在线观看| 中文字幕字幕中文在线中不卡视频| 日韩在线国产| 337p日本欧洲亚洲大胆鲁鲁| 欧美国产日韩在线观看| 日韩中文一区| 天堂аⅴ在线地址8| 中文在线一区二区| 亚洲欧洲日韩综合二区| 在线看的av网站| 国产精品久久一级| 国产91av视频在线观看| 男人的天堂在线视频免费观看 | 亚洲一区欧美在线| 一本色道88久久加勒比精品| 午夜精品福利视频| 中国一级特黄毛片| 午夜亚洲性色视频| 国产精品电影观看| 在线观看xxxx| 国产精品一区三区| 国产美女精品在线观看| 天天操天天操天天操| xnxx国产精品| 亚洲一区二区三区午夜| 成人午夜在线影视| 亚洲午夜久久久久久久久电影网| 国产美女主播在线| 韩国美女久久| 欧美日韩国产一二三| 亚洲一区二区图片| 成人影院中文字幕| 亚洲欧洲美洲在线综合| 亚洲天堂精品一区| 国产精品va| 日本欧美国产在线| 国产精品怡红院| 国产寡妇亲子伦一区二区| 国产亚洲情侣一区二区无| 黄色片视频在线观看| 中文字幕一区二区三| 欧美狂野激情性xxxx在线观| 亚洲天堂导航| 67194成人在线观看| av漫画在线观看| 国产一区二区三区91| 欧美精品日韩www.p站| 国产精品500部| 久久精品国产77777蜜臀| 国产亚洲欧美一区二区| 色影视在线观看| 午夜成人在线视频| 亚洲午夜激情影院| 中文有码一区| 欧美日韩国产91| 日本精品入口免费视频| 国产成人在线电影| 亚洲国产一区二区在线| 韩国日本一区| 欧美福利视频导航| 国产传媒第一页| 欧美高清一区| 国产欧美中文字幕| 日本五码在线| 亚洲第一福利一区| 五月六月丁香婷婷| 国产a久久精品一区二区三区| 欧美日韩国产二区| 在线视频免费观看一区| 久久综合色8888| 菠萝蜜视频在线观看入口| 国产成+人+综合+亚洲欧美| 亚洲精品久久久久中文字幕欢迎你 | 99久久免费精品高清特色大片| 艳母动漫在线免费观看| 亚洲伦乱视频| 日韩精品免费看| 国产精品成人久久| 国产一区二区不卡| 夜夜爽99久久国产综合精品女不卡| 无遮挡在线观看| 亚洲成人在线视频播放| 欧美色图一区二区| 黄页网站大全一区二区| 亚洲精品高清国产一线久久| 成人性生活视频| 亚洲精品二三区| 好吊操这里只有精品| 国产精品亚洲综合一区在线观看| 亚洲一区二区三区四区中文| 国产第一亚洲| 亚洲欧美999| 亚洲欧美一区二区三区在线观看| 99视频精品全部免费在线| 国产精品三级一区二区| 久久国产精品美女| 久久天天躁日日躁| 国产精品国产av| 国产亚洲欧洲997久久综合 | 国产成人在线免费| 特级西西444| 欧美午夜在线播放| 欧美日韩xxxxx| 亚洲国产一二三区| 亚洲国产另类精品专区| 欧美夫妇交换xxx| 日韩视频二区| 美女亚洲精品| 日韩精品三区| 爽爽爽爽爽爽爽成人免费观看| 波多野结衣在线观看一区| 日本一区二区三区高清不卡| 久久久久久蜜桃一区二区| 国产精品久久久久久麻豆一区软件 | 男人天堂中文字幕| 91天堂素人约啪| 男女视频一区二区三区| 欧美韩日一区| 91在线在线观看| 麻豆国产在线| 中文字幕不卡在线视频极品| 国产精品视频久久久久久| 一级精品视频在线观看宜春院| 秘密基地免费观看完整版中文 | 亚洲日穴在线视频| 国产在线a视频| 国产亚洲毛片在线| 午夜欧美性电影| 欧美一区一区| 97香蕉超级碰碰久久免费的优势| 国产小视频福利在线| 欧美日韩免费不卡视频一区二区三区 | 九九视频精品在线观看| 欧美不卡高清| 明星裸体视频一区二区| 亚洲欧美在线人成swag| 久久久久国产一区二区三区| 国产三级在线免费| 91精品在线麻豆| 91浏览器在线观看| 中文字幕在线视频一区| 日本少妇毛茸茸| 免费成人美女在线观看.| 国产青草视频在线观看| 国产精品免费不| 成人h在线播放| 欧美性猛交xxxx免费看漫画| 亚洲高清免费视频| 国产免费一区二区三区视频| 不卡视频在线| 高清视频一区| 91超碰碰碰碰久久久久久综合| 欧美另类极品videosbestfree| 欧美色视频免费| 日韩精品专区在线影院重磅| 久久久999久久久| 亚洲国产精品嫩草影院| 国产精品18在线| 91丨porny丨国产入口| 九九九九九九九九| 久久综合狠狠| 久久精品无码中文字幕| 希岛爱理一区二区三区| 欧美主播一区二区三区美女 久久精品人 | 一女被多男玩喷潮视频| 在线精品视频在线观看高清| 日韩精品伦理第一区| 理论片一区二区在线| 91亚洲精品久久久久久久久久久久| 午夜伦理福利在线| 欧美激情小视频| 国产在线1区| 色多多国产成人永久免费网站| 欧美欧美欧美| 日韩av一区在线| 男人天堂综合网| 日韩视频免费直播| 国产一区二区三区三州| 欧美最新大片在线看| 亚洲影院在线播放| 亚洲h动漫在线| 久久久久无码国产精品不卡| 亚洲视频免费观看| 国产免费美女视频| 国产精品乱子久久久久| 九九九视频在线观看| 久久久亚洲高清| 人人妻人人藻人人爽欧美一区| 91丨九色丨国产丨porny| 久久久久9999| 91香蕉国产在线观看软件| 国产真实乱人偷精品| 成人免费福利片| 欧美双性人妖o0| 成人高清视频在线观看| 在线xxxxx| 99久久精品免费看| 亚洲色图14p| 92国产精品观看| 大地资源二中文在线影视观看| 99久久精品国产网站| 男生裸体视频网站| 久久久久久久久久久久久女国产乱| 成年人网站免费看| 国产色综合久久| 成人午夜免费影院| 1000部国产精品成人观看| 黄色一级大片在线免费观看| 一区二区在线免费| 国产一级视频在线播放| 丰满岳妇乱一区二区三区| 国语对白永久免费| 欧美无砖专区一中文字| 中文字幕日本人妻久久久免费 | 九一精品久久久| 国产精品 日产精品 欧美精品| 欧美熟妇精品一区二区| eeuss鲁片一区二区三区在线观看 eeuss影院一区二区三区 | 国内精彩免费自拍视频在线观看网址 | 欧美做爰啪啪xxxⅹ性| 亚洲国产欧美在线| 中文字幕亚洲高清| 欧美美女直播网站| 亚洲AV无码精品色毛片浪潮| 日韩电影免费观看中文字幕| 男人的天堂在线| 久久精品国产成人精品| 波多野结衣在线观看| 国产精品福利片| 免费观看亚洲视频大全| 久久爱av电影| 91麻豆精品国产91久久久平台 | 日日夜夜精品视频天天综合网| 日韩精品视频一二三| 国产成人亚洲综合a∨婷婷图片| 亚洲av片不卡无码久久| 国产精品黄色在线观看| 国产精品变态另类虐交| 欧美影院精品一区| 性生活黄色大片| 亚洲视频在线免费观看| 性xxxfreexxxx性欧美| 日本精品久久久久久久| 精品亚洲a∨一区二区三区18| 麻豆av一区二区三区| 97在线精品| 久草青青在线观看| 国产精品亚洲午夜一区二区三区 | 综合色天天鬼久久鬼色| 日韩免费视频一区二区视频在线观看| 欧美日韩一区二区三区视频 | 亚洲欧洲中文天堂| 污污片在线免费视频| 国产精品久久久av| 欧美大片网址| 91免费版看片| 美女视频黄 久久| 国精产品一区一区三区免费视频 | 成人高清伦理免费影院在线观看| 亚洲午夜精品久久久久久高潮| 亚洲va韩国va欧美va精品 | 青青草视频一区| 人妻 丝袜美腿 中文字幕| 国产精品国产a| 少妇一级淫片日本| 亚洲女人天堂色在线7777| 大桥未久在线播放| 96sao精品视频在线观看| 不卡在线一区二区| 久久精品一区二| 99久久伊人网影院| 在线看成人av| 精品捆绑美女sm三区| 黄网站免费在线播放| 国产精品高潮呻吟久久av无限 | 国产成人精品亚洲777人妖| www.4hu95.com四虎| 色av成人天堂桃色av| 天堂视频中文在线| 性色av香蕉一区二区| 国产精品18| 久久天天东北熟女毛茸茸| 另类中文字幕网| 国产一级淫片久久久片a级| 在线观看网站黄不卡| 麻豆av电影在线观看| 91超碰caoporn97人人| 天堂俺去俺来也www久久婷婷| 国产va亚洲va在线va| 成人av影院在线| 日韩精品无码一区二区| 亚洲黄在线观看| 男人av在线播放| 精品久久久久久乱码天堂| 亚洲激情黄色| 丰满大乳奶做爰ⅹxx视频| 精品美女久久久久久免费| 五月婷婷丁香花| 久久人人97超碰精品888| 国产伦理久久久久久妇女| 日韩一级片免费视频| 99久久精品国产观看| 日韩不卡在线播放| 国产一区二区动漫| 国产成人福利夜色影视| 一区二区三区三区在线| 国产精品自在在线| 精品无码人妻一区二区三区| 亚洲国产精品999| www.精品| 亚洲午夜在线观看| 国产精品一区在线观看乱码| 日本天堂在线视频| 亚洲精选在线观看| 成人精品动漫| www.一区二区.com| 91香蕉视频mp4| 中文字幕无码乱码人妻日韩精品| 日韩中文字幕亚洲| 91久久偷偷做嫩草影院电| 国产乱子伦农村叉叉叉| 久久精品亚洲国产奇米99| 一级做a爱片性色毛片| 欧美丰满老妇厨房牲生活| 牛牛影视久久网| 手机视频在线观看| 一区二区三区中文免费| 天天干免费视频| 国产精品旅馆在线| 欧美成人国产| 中文字幕在线1| 6080yy午夜一二三区久久| segui88久久综合9999| 亚洲激情啪啪| 成人av中文字幕| 91国产免费视频| 91精品国产91久久久久久久久| 成人系列视频| 国产免费a级片| 欧洲视频一区二区| 丝袜综合欧美| 婷婷五月色综合| 国产成人av网站| 中文字幕自拍偷拍| 91精品国产91久久久久久久久|