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

使用 Meteor 和 Node.js 構建實時應用

開發 開發工具
這是基于Tom的 Vimeo screencast的一個新手指引. 與Tom的 Vimeo screencast最大的不同是處理事件的方式. 比起復制粘貼一個Meteor示例的代碼, 我會一步一步的通過自己的方式來處理使用Enter鍵來提交一則訊息.

最近,有許多關于 Derby.js的激動人心的討論涌現在了我的Twitter Timeline. 我從未體驗過一個框架能夠幫你做這么多–實時同步客戶端和服務端. 從本質上講, 這使得我們可以自己編寫一個代碼量很少的應用可以讓兩個人編寫同一個 text field–live. 而 Derby幫你處理了在 models 和 views 之間所有的同步. 就如 Google Docs 的協作編輯那樣.

這非常的強大, 但經過深入的研究, 發現 Derby.js 并沒有我想象中的那么成熟–目前還沒有到1.0版本. 當然, Node.js 和 Meteor.js 也同樣沒有. 但相比起來, 似乎Derby缺少的更多一些. 比如, 據我目前知道的, 還沒有一個好使的方法來處理sessions. 或許是因為缺乏文檔的原因吧, 但是, 據說Derby的團隊目前正在開發authentication. 如果有誰有一些關于Derby.js 處理sessions的新手指引, 我會很樂意去研究的.

另外一個我經常見到被拿來與Derby.js做比較的框架是Meteor.js. 與Derby相似的是,它也能在多個客戶端下實時更新views, 盡管做法上可能跟Derby有點不同. Derby可以較容易的使用多種數據庫, 而Meteor則只親近于MongoDB. 事實上, 通過如Mongoose客戶端接入數據庫的API與你在服務端所期望的已經非常接近了.

雖然現在meteor是個有一些缺點和爭議的框架, 但Meteor看起來是非常有趣的選擇用來建立有實時需求的應用. 個人還是喜歡Derby基于傳統回調的編程形式更吸引我, 但在Derby的強大背后,卻缺乏健壯的文檔和一個大的開發者社區, 這無疑是個很大的打擊. 或許這會隨著時間推移而有所改變吧, 但比起Meteor來說還是會慢很多, 因為后者最近獲得了1100萬美元的資金. 這筆財政資金確保了Meteor的存在以及得到持續的支持. 對于那些需要財政與發展穩定的框架的開發者而言, 這筆資金只會讓Meteor更加優勝. <!– more –> 今天,讓我們一起來看看如何新建一個真實的但又簡單的Meteor應用. 本質上說, 這是基于Tom的 Vimeo screencast的一個新手指引. 與Tom的 Vimeo screencast最大的不同是處理事件的方式. 比起復制粘貼一個Meteor示例的代碼, 我會一步一步的通過自己的方式來處理使用Enter鍵來提交一則訊息. 讓我們開始吧.

創建一個 Meteor應用

Derby和Meteor 他們共有的一個大加分是他們各自的命令行工具. 與Derby使用Node的內置的 npm 工具所不同的是, Meteor使用的是它自己的.

在終端(Mac OS X 和 Linux),執行如下的命令. (在這之前請確保你已經安裝了Node)

  1. $curl https://install.meteor.com | /bin/sh 

Metror會自己搞定,并安裝命令行工具.

要新建一個項目, 先轉到你的工作目錄然后運行下邊的代碼. 這會創建一個目錄, 里邊包括有Meteor和一個最基本模板程序.

  1. $meteor create chat 

現在, 你可以轉到該目錄并運行下面的代碼讓它跑起來

  1. $cdchat$meteor  
  2. Running on: http://localhost:3000/ 

想要看到這個最基礎的應用程序, 你只需要在任意一款不過時的瀏覽器下打開http://localhost:3000/

只要你想, 你就可以使用Meteor內置的meteor deploy命令來部署你的應用到Meteor自己的服務器上

  1. $meteor deploy my-app-name.meteor.com 

只要你更新保存了你的代碼, 所有連接上的瀏覽器都會實時更新其頁面.

開發聊天應用

在Meteor Create指令產生的文件夾中,你可以看見不同的文件。如果你知道怎么查看隱藏文件的話,你還可以看見個.meteor這個文件夾。這個文件夾包含了Meteor它本身,以及MongoDB的數據文件。

在你App的根目錄文件夾下,你應該可以看到這三個文件:chat.html, chat.css和chat.js。這三個文件都是自帶說明部分的。HTML文件包含了App的模型以及外觀,他們都是被chat.css定義的。Javascript文件包含了在client和server端要執行的腳本。有一點很重要,不要把任何東西放進這個腳本文件,比如說配置參數和密碼,因為任何人都可以通過查看你應用程序的代碼看到這些。

用你喜歡的文本編輯軟件打開chat.js這個文件。就個人而言,我喜歡用Sublime Text2,因為這個工具簡潔還有多種鼠標狀態提示。

你可以在chat.js文件中查看到下面這樣一段代碼:

  1. if (Meteor.is_client) {  
  2.   Template.hello.greeting = function () {  
  3.     return "Welcome to chat.";  
  4.   };  
  5.    
  6.   Template.hello.events = {  
  7.     'click input' : function () {  
  8.       // template data, if any, is available in 'this'  
  9.       if (typeof console !== 'undefined')  
  10.         console.log("You pressed the button");  
  11.     }  
  12.   };  
  13. }  
  14.    
  15. if (Meteor.is_server) {  
  16.   Meteor.startup(function () {  
  17.     // code to run on server at startup  
  18.   });  

在Meteor.js中注意if段落中Meteor.is_client和Meteor.is_server的兩個部分。在這些區塊中的代碼會分開執行,當運行這段代碼的機器是client端則只運行clint塊中的代碼,server同理。這就說明了Meteor在實際運用中的代碼共享能力。

刪除掉if中所有Meteor.is_client和Meteor.is_server段的代碼,最后只剩下一段:

  1. if (Meteor.is_client) { } 

注意,當你保存了 腳本文件之后,你的瀏覽器會立刻刷新加載這段新的代碼。
創建視圖(View)

在我們正式對這個腳本文件動工之前, 我們需要先新建一個視圖用來展示聊天記錄. 在編輯器里打開chat.html并刪除body標簽里邊的代碼. 包括名為hello的template標簽.只留如下部分

  1. <head> 
  2.   <title>chat</title> 
  3. </head> 
  4.    
  5. <body> 
  6.    
  7. </body> 

接著在body標簽里添加下面這句

  1. {{> entryfield}} 

Meteor使用的模板系統與Mustache很相似.大括號{% raw %}{{}}{% endraw %}表示要呈現的內容. 通過簡單地在兩對大括號里添加內容如{% raw %}{{hello}}{% endraw %}, 模板系統會用hello這個變量的值來替換它. 后面會更詳細的介紹.

注意到了在entryfield這個詞前面有個大于號>了嗎? 使用該符號來指定渲染哪一個模板.

  1. <template name="entryfield">  
  2.     <input type="text" id="name" placeholder="Name" /> <input type="text" id="message" placeholder="Your Message" />  
  3. </template> 

在這個例子中,template標簽有單個屬性, 即模板的名字, 這就是我們要渲染的模板, 注意, 模板的名字要和body里的代碼指定的模板名字一樣 ({{> entryfield}})

查看瀏覽器, 你會發現頁面已經刷新了, 輸入框已經呈現出來了.

接下來, 在body里邊添加另外的一個mutache標簽用以渲染訊息列表

  1. {{> messages}} 

最后, 我們還需要新建一個名叫messages的模板. 在entryfield模板下面添加下面這段代碼

  1. <template name="messages">  
  2.     <p>  
  3.         {{#each messages}}  
  4.             <strong>{{name}}</strong>- {{message}}  
  5.         {{/each}}  
  6.     </p>  
  7. </template> 

注意到each子句. 在Meteor中你可以使用如下的語法來遍歷一個數組模板

  1. {{#each [name of array]}}  
  2. {{/each}} 

使用each循環時,上下文會有所改變. 當引用變量的時候, 實際上你引用的是每一個數組元素的值.

例如,在我們的chat應用中, 我們遍歷了數組模板”messages”里邊的每個元素, 該數組可以像下面這樣,

  1. [  
  2.     {  
  3.         "name""Andrew",  
  4.         "message""Hello world!" 
  5.     },  
  6.     {  
  7.         "name""Bob",  
  8.         "message""Hey, Andrew!""  
  9.     }  

然后, 在each循環中, 你可以看到{% raw %}{{message}}{% endraw %}{% raw %}{{name}}{% endraw %}, 這會引用 每一個數組元素的值來替代(Andrew 和 Bob 替換 name, 以及各自的問候信息.)

當返回到你的瀏覽器, 你還看不到任何的改變. 因為訊息數組還沒被傳送到模板, 所以Meteor遍歷不到任何東西來呈現.

你的chat.html最后應該是這樣的

  1. <head> 
  2.   <title>chat</title> 
  3. </head> 
  4.    
  5. <body> 
  6.   {{> entryfield}}  
  7.    
  8.   {{> messages}}  
  9. </body> 
  10.    
  11. <template name="entryfield"> 
  12.     <input type="text" id="name" placeholder="Name" /> <input type="text" id="message" placeholder="Your Message" /> 
  13. </template> 
  14.    
  15. <template name="messages"> 
  16.     <p> 
  17.         {{#each messages}}  
  18.             <strong>{{name}}</strong>- {{message}}  
  19.         {{/each}}  
  20.     </p> 
  21. </template> 

#p#

JavaScript

從現在開始, 我們處理的大部分代碼都是客戶端代碼, 所以, 除非特別說明, 以下的代碼都是在if (Meteor.is_client)代碼塊中.

在我們編寫展示訊息的代碼之前,讓我們先新建一個Collection. 從本質上講, 這是一組Models. 換句話說, 在這個chat應用的環境下, Messages collection保存著整個聊天記錄, 而每條訊息記錄是一個Model.

在if語句前, 添加如下代碼來初始化Collection:

  1. Messages = new Meteor.Collection('messages'); 

因為我們希望這個Collection可以在客戶端和服務端被創建, 所以我們把它寫在了客戶端代碼塊之外.

由于Meteor為我們做了大部分的工作, 要展示聊天記錄是非常容易的. 只需要把下面的代碼添加進if語句里邊.

  1. Template.messages.messages = function(){  
  2.     return Messages.find({}, { sort: { time: -1 }});  

讓我們拆開來分析這段代碼:

  1. Template.messages.messages = function(){ … } 

第一部分Template表示我們正在修改一個模板的行為.

  1. Template.messages.messages = function(){ … } 

第二部分messages是模板的名字, 表示是在修改哪一個模板. 例如,如果我們想要對”entryfield”模板做些什么, 只需把代碼改成Template.entryfields.variable = function(){ … }(在這里, 請別這么做)

  1. Template.messages.messages = function(){ … } 

第三部分的這個messages代表的是一個這個模板里的一個變量. 還記得我們的each循環遍歷messages嗎? 這就是那個mesaages.

當你打開瀏覽器時, 頁面還是沒有什么改變. 這是意料之中的事, 因為我們只抓取的訊息, 而沒有展示出來.

此時,你的chat.js應該是這樣的. 是否很驚訝就只需在服務器寫這么些代碼我們就能展示一個實時的聊天記錄應用.

  1. Messages = new Meteor.Collection('messages');  
  2. if (Meteor.is_client) {  
  3.   Template.messages.messages = function(){  
  4.     return Messages.find({}, { sort: { time: -1 }});  
  5.   }  

在console里添加Message

這部分的內容是可選的, 當然它有助于你調試程序. 你可以直接跳過往下學習建立form來響應鍵盤事件(key press).

如果你想要測試你的訊息顯示代碼, 你可以手動插入一條記錄到數據庫. 打開你的瀏覽器控制臺, 并輸入如下:

  1. Messages.insert({ name: 'Andrew', message: 'Hello world!', time: 0 }) 

這將會在數據庫中新建一條記錄, 如果正確的操作了的話,那瀏覽器就會即刻更新這條訊息在頁面上.

消息表單

回到chat.js文件當中,我們會將供輸入的form和數據庫鏈接起來以接收用戶聊天數據的提交。在底部添加下面的代碼,不過注意要在if語句塊中。

  1. Template.entryfield.events = {  
  2.   "keydown #message"function(event){  
  3.     if(event.which == 13){  
  4.       // Submit the form  
  5.       var name = document.getElementById('name');  
  6.       var message = document.getElementById('message');  
  7.    
  8.       if(name.value != '' && message.value != ''){  
  9.         Messages.insert({  
  10.           name: name.value,  
  11.           message: message.value,  
  12.           time: Date.now()  
  13.         });  
  14.    
  15.         name.value = '';  
  16.         message.value = '';  
  17.       }  
  18.     }  
  19.   }  

代碼有點多,讓我們再回顧一遍。你也許還記得,在Template后面的第二個單詞決定了我們正在修改的是哪個模板。不過跟之前不同的是,我們寫的代碼是用來綁定數據庫和messages模板的,我們正在修改的模板是entryfield。

這個模板中events的屬性包含了一個object,events的屬性按照下面的格式呈現:

  1. "[eventname] [selector]" 

例如,如果我們想為一個ID為hello的button綁定一個點擊事件的話,我們會把下面的代碼加入到events的個結構體當中。

  1. "click #hello"function(event){ … } 

在我們的例子當中,我們是將一個函數綁定到了ID為“message”的一個keydown事件當中。如果你還記得,這段代碼早在我們在chat.html文件中建立模板的時候就已經設定好了。

在事件對象中,每個key都有一個函數作為它的值。這個函數在事件被調用時執行,其中事件對象作為第一個參數傳遞給該函數。在我們的app里,每當ID帶有“message”的輸入欄中有任意鍵被按下(keydown)時,該函數就被調用了。

函數內的代碼相當簡單。首先,我們檢查回車鍵是否被按下(輸入中有13的關鍵代碼)。第二,我們通過ID取得兩個輸入欄的DOM元素。第三,我們檢查并確保輸入值不為空,以防止用戶提交一個空的名字或信息(name or message)。

注意下面的代碼很重要。這段代碼是將message插入數據庫。

  1. Messages.insert({  
  2.   name: name.value,  
  3.   message: message.value,  
  4.   time: Date.now()  
  5. }); 

正如你看到的,這和我們插入到控制臺的代碼類似,但不是硬編碼的數值,我們用的是DOM元素的值。此外,我們加入了當前時間,以保證聊天日志被正確的按時間排序。

最后,我們將兩個輸入的值簡單的設為”以清空輸入欄。

現在,如果你進入瀏覽器,你可以試著輸入一個名字與信息到兩個輸入欄。按下回車以后,輸入欄將被清除,一個新的消息會出現在你的輸入字段的正下方。打開另一個瀏覽器窗口,導航到同一個URL(http://localhost:3000/)。試著鍵入另一個信息,而

正如你看到的,Meteor非常強大。不需要寫一行明確更新消息日志的代碼,新的信息顯示出來并同步到多個瀏覽器和客戶端。

總結

雖然Meteor工作起來非常酷,而且也有一些非常有用的應用支持它,比如Derby.js,但它是不成熟的。一個說明這一點例子就是,瀏覽文檔并找找紅色的引文。例如,關于MongoDB集合該文檔做了如下陳述:

目前客戶端被給予集合的完全寫訪問權限。它們可以執行任意的更新命令。一旦我們建立鑒權認證,你將能夠限制客戶端的直接插入,更新和刪除。我們也在考慮校驗器或者其他類似ORM的功能。

任何用戶擁有完全的寫訪問權限是一個非常大的問題,因為對任何一個app產品——如果一個用戶對你的整個數據庫有寫訪問權限,這是一個相當大的安全問題。

看到Meteor(和Derby.js!)在像哪個方向前進是令人激動的,但是除非它成熟一點,它可能不是一個產品級應用的最好選擇。期待那1100萬美元資金能很好的利用起來。

原文鏈接:http://www.oschina.net/translate/introduction-to-realtime-web-meteor-and-nodejs

責任編輯:張偉 來源: oschina
相關推薦

2023-01-10 14:11:26

2022-05-09 17:33:23

PWA漸進式Web應用程序離線優先

2024-03-22 11:40:40

Node.jsNodeCRUD

2023-04-18 15:18:10

2022-08-22 07:26:32

Node.js微服務架構

2022-09-12 15:58:50

node.js微服務Web

2024-03-27 11:18:02

2014-10-30 10:28:55

Node.js

2022-01-05 09:00:00

加密貨幣數據技術

2014-07-11 14:16:15

AbsurdJSExpress

2021-06-15 15:03:21

MongoDBNode.jsCRUD

2020-09-22 07:35:42

Node.jsVue.js文件壓縮

2022-08-28 16:30:34

Node.jsDocker指令

2013-11-01 09:34:56

Node.js技術

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2019-05-05 11:47:09

TypeScript開發Node.js

2020-09-04 15:06:04

Docker容器化Node.js

2014-06-10 13:54:05

Node.jsSocket.IOWebSocket

2019-01-03 09:06:55

Node.js命令行工具 前端

2015-07-21 16:23:22

Node.js構建分布式
點贊
收藏

51CTO技術棧公眾號

国产无套粉嫩白浆在线2022年 | 狠狠色丁香久久婷婷综合_中| 在线视频免费一区二区| 五月天亚洲视频| 91福利国产在线观看菠萝蜜| 99精品国产视频| 国产美女精彩久久| 国产在线一二区| 欧美先锋资源| 精品播放一区二区| www.色就是色| 美女av在线免费看| 国产精品第四页| 久久久亚洲综合网站| 一区二区三区免费在线| 夜夜精品视频| 欧美成人一区二区三区电影| www.中文字幕av| 在线播放一区二区精品视频| 欧美亚洲国产一区二区三区va| 国产精品视频一二三四区| 蜜桃视频在线入口www| 国产黄色成人av| 国产精品久久久久久久久久久久久久 | 久久久久久久性| a级国产乱理论片在线观看99| 日韩精品一区二区亚洲av观看| 欧美三级乱码| 日韩一区二区三区在线播放| 亚洲午夜久久久久久久久红桃| 美国十次综合久久| 欧美日精品一区视频| 97av视频在线观看| 国产美女一区视频| 亚洲视频在线一区观看| 日韩欧美视频第二区| 手机看片国产1024| 粉嫩久久99精品久久久久久夜| 国产精品自产拍在线观看中文| 日本视频免费观看| 国产欧美综合一区二区三区| 欧美精品久久一区二区 | 午夜天堂影视香蕉久久| 992tv成人免费观看| eeuss影院在线观看| 久久一二三国产| 国产伦理久久久| 亚洲高清视频网站| 国产一二三精品| 91色p视频在线| 97人妻一区二区精品免费视频| 免费久久精品视频| 国产精品一区二区三区在线播放| 亚洲国产精品无码久久久| 日一区二区三区| 国产成人97精品免费看片| 中文字字幕在线中文| 亚洲欧美日韩国产一区二区| 55夜色66夜色国产精品视频| 四虎成人永久免费视频| 亚洲在线观看| 国产激情综合五月久久| wwwwww在线观看| 奇米影视一区二区三区| 国产欧美久久一区二区| 国产欧美一区二区三区视频在线观看 | 性亚洲最疯狂xxxx高清| 91av在线免费视频| 免费日韩视频| 国产精品美女www爽爽爽视频| 亚洲中文字幕在线观看| 久久成人免费日本黄色| 亚洲综合在线做性| 欧洲av在线播放| 久久久久久久久免费| 神马影院午夜我不卡影院| 日本电影在线观看网站| 亚洲国产日韩一区二区| 黄色一级视频片| 麻豆精品蜜桃| 欧美一区二区免费| 欧美熟妇精品一区二区蜜桃视频| 九九久久电影| 精品久久国产精品| 国产午夜视频在线播放| 丝袜诱惑亚洲看片| 91在线看www| 亚洲成人av综合| 久久五月婷婷丁香社区| 国产精品h视频| av电影在线免费| 在线欧美日韩精品| 欧美性猛交乱大交| 国产精品一区二区av日韩在线| xxxxx91麻豆| 免费日韩一级片| 免费观看在线综合色| 国产精品免费一区二区三区在线观看| 三级无遮挡在线观看| 中文字幕一区二区三区精华液| 日产精品久久久久久久蜜臀| 日韩中文影院| 精品免费日韩av| 色婷婷国产精品免| 在线观看日韩av电影| 国产精品毛片a∨一区二区三区|国| 国产国语亲子伦亲子| 国产亚洲精品久| 日韩成人三级视频| 成人一区视频| 亚洲精美色品网站| 加勒比婷婷色综合久久| 三级影片在线观看欧美日韩一区二区| 亚洲japanese制服美女| 精品亚洲成a人片在线观看| 亚洲精品视频免费看| 日本免费观看网站| 国产精品网在线观看| 久久久999成人| 国产乱码77777777| 99热99精品| 成人免费a级片| 91麻豆精品| 色一情一乱一区二区| 久久99国产综合精品免费| 成人性视频免费网站| 色撸撸在线观看| 日韩福利影视| 国产一区二区三区直播精品电影| 日韩欧美亚洲一区二区三区| 国产精品资源站在线| 一区二区三区久久网| **欧美日韩在线观看| 亚洲九九九在线观看| 日本在线视频中文字幕| 粉嫩aⅴ一区二区三区四区| 小说区视频区图片区| 福利一区在线| 中文字幕亚洲欧美一区二区三区 | 国产日韩欧美三级| 国产日韩一区欧美| 牛牛在线精品视频| 日韩三级中文字幕| 亚洲色婷婷一区二区三区| 九一九一国产精品| 亚洲最新在线| 国产精品白丝久久av网站| www亚洲精品| 国产人妖一区二区三区| 亚洲三级电影全部在线观看高清| 午夜免费看毛片| 天天综合久久| 亚洲a成v人在线观看| 黄色一级大片在线免费看产| 7878成人国产在线观看| 色婷婷在线视频观看| 国产乱人伦偷精品视频不卡| 日韩中文字幕亚洲精品欧美| 亚洲三区欧美一区国产二区| 欧美精品九九久久| 日批视频免费播放| 精品久久久久久久久久国产| 国产又黄又粗又猛又爽的视频 | 精品九九在线| 国产精品欧美一区二区| 欧美videos极品另类| 日韩精品一区二区三区视频| 精品肉丝脚一区二区三区| 不卡视频免费播放| 妺妺窝人体色www在线观看| 日韩国产综合| 亚洲综合中文字幕在线| 男人av在线播放| 国产亚洲精品久久久久久| 亚洲天堂国产精品| 一区二区三区成人| 91精品国产自产| 奇米影视一区二区三区| 欧美日韩中文字幕在线播放| 欧美大片网址| 国产美女久久久| 欧美性video| 亚洲人av在线影院| 国产女同91疯狂高潮互磨| 欧美日韩精品在线播放| 成人一级片免费看| 国产69精品久久777的优势| 成人av一级片| 天天做天天爱综合| 免费国产一区二区| 国产精品一区二区三区www| 97国产成人精品视频| 在线免费观看黄色| 欧美精品一区二区三区视频| 无码视频在线观看| 一区二区三区成人在线视频| 中文字幕有码在线播放| 国产成人亚洲综合色影视| 欧美 激情 在线| 欧美激情1区2区3区| 免费在线观看91| 国产中文欧美日韩在线| 日本亚洲欧洲色| 日本动漫理论片在线观看网站 | 性久久久久久| 中文字幕在线中文| 欧美军人男男激情gay| 懂色中文一区二区三区在线视频| 成人涩涩视频| 91精品国产高清久久久久久久久 | 精品乱子伦一区二区| 一本色道a无线码一区v| 精品97人妻无码中文永久在线| 国产欧美日韩不卡免费| 日本japanese极品少妇| 国产精品影音先锋| 欧美美女一级片| 老司机免费视频久久| 亚洲一区二区三区av无码| 欧美好骚综合网| 日韩免费一区二区三区| 久久久久观看| 国产成人免费观看| 激情五月综合婷婷| 国产日韩换脸av一区在线观看| 新片速递亚洲合集欧美合集| 97超级碰碰碰| 大黄网站在线观看| 欧美另类xxx| 黄色的网站在线观看| 在线观看国产欧美| 男人的天堂在线视频| 亚洲国产欧美一区二区丝袜黑人| www.亚洲欧美| 欧美一级高清大全免费观看| 中文字幕人妻一区二区在线视频 | 中文字幕无码不卡免费视频| 91久久视频| a级片一区二区| 最新欧美人z0oozo0| 最新av在线免费观看| 91精品天堂福利在线观看| 一级日韩一区在线观看| 99久久婷婷| 中文字幕欧美日韩一区二区| 天天超碰亚洲| 中文字幕日韩一区二区三区| 91综合在线| 亚洲成人动漫在线| 欧美一区二区| 黄色成人在线看| 亚洲一区一卡| 激情综合网俺也去| 日本成人在线一区| 亚洲 欧美 另类人妖| 精品亚洲国产成人av制服丝袜 | 久久精品无码中文字幕| 精品动漫3d一区二区三区免费| 国产免费黄色一级片| 日韩午夜电影| 亚洲国产精品久久久久爰色欲| 乱码第一页成人| www.欧美日本| 精品亚洲国内自在自线福利| 午夜诱惑痒痒网| www.欧美色图| 欧美黄色一级生活片| 中文在线一区二区| 男人操女人的视频网站| 亚洲国产成人精品视频| 午夜婷婷在线观看| 欧美日韩和欧美的一区二区| 国产精品怡红院| 欧美精品一区二区三区很污很色的| 天天射天天色天天干| 亚洲人高潮女人毛茸茸| 在线视频自拍| 久久久亚洲精选| 粉嫩一区二区三区| 91精品国产综合久久香蕉最新版 | 亚洲国产欧美精品| 国产露出视频在线观看| 另类视频在线观看| av丝袜在线| 国产精品人人做人人爽| 欧美成年网站| 欧美国产综合视频| 在线成人超碰| 精品www久久久久奶水| 韩国女主播成人在线| 中文字幕人妻一区二区三区| 日本一区二区成人| 国产性猛交普通话对白| 色视频一区二区| 精品国产av鲁一鲁一区| 亚洲精品之草原avav久久| 成年人黄视频在线观看| 日本中文字幕成人| 日韩最新av| 欧美一进一出视频| 欧美午夜一区二区福利视频| 九九九在线观看视频| 丁香婷婷深情五月亚洲| 国产aaaaaaaaa| 欧美日韩在线视频首页| 国产美女www爽爽爽视频| 亚洲欧美精品suv| 欧美家庭影院| 成人h猎奇视频网站| 亚洲另类春色校园小说| 日本a级片在线播放| 麻豆91精品视频| 色婷婷av777| 午夜欧美大尺度福利影院在线看| 一炮成瘾1v1高h| 亚洲女人天堂视频| 蜜桃视频在线网站| 国产精品午夜av在线| 在线成人超碰| 成人综合久久网| 欧美激情一区三区| 欧美一区二区激情视频 | 免费在线观看污视频| 欧美激情小视频| 玖玖玖电影综合影院| 亚洲欧洲日韩精品| 久久久蜜桃一区二区人| 欧美肉大捧一进一出免费视频| 亚洲美女屁股眼交| 亚洲天堂网视频| 中文字幕久热精品在线视频 | 欧美无人高清视频在线观看| 欧美日韩伦理片| 欧美性做爰毛片| 久草精品视频| 国产中文字幕视频在线观看| 成人毛片老司机大片| 国产在线一区视频| 欧美不卡在线视频| 最爽无遮挡行房视频在线| 亚洲一区二区三区乱码aⅴ| 久久精品久久久| 午夜精品免费看| 中文字幕永久在线不卡| 在线观看中文字幕2021| 日韩中文字幕免费看| 国产精品亚洲成在人线| 亚洲国产精品久久久久久女王| 日本色综合中文字幕| 特级西西人体高清大胆| 欧美日韩精品一区二区天天拍小说| 在线毛片网站| 91精品视频网站| 欧美精品偷拍| 欧美xxxxx精品| 天天色图综合网| 四虎影视精品成人| 国产成人精品视频在线观看| 成人精品视频| 国产免费中文字幕| 一区二区三区日韩欧美| 免费观看国产精品| 18久久久久久| 日韩国产在线| 中文字幕在线观看视频www| 亚洲一二三级电影| 午夜av免费观看| 国产精品久久久久国产a级| 91精品蜜臀一区二区三区在线| 超级砰砰砰97免费观看最新一期 | 国模视频一区二区| 亚洲老女人视频免费| 亚洲另类第一页| 亚洲一区二区三区精品在线| 色视频在线观看| 国产欧美亚洲精品| 欧美日韩专区| 成人免费网站黄| 51精品视频一区二区三区| 国产美女福利在线观看| 欧美精品一区三区在线观看| 久久国产精品一区二区| 久草免费在线观看视频| 亚洲美女av电影| 经典三级久久| www.四虎成人| 亚洲欧洲无码一区二区三区| 六月丁香综合网| 国产精品视频一区二区高潮| 欧美一区网站| 91精品久久久久久久久久久久| 日韩一级片在线播放| 久久电影tv| 日韩在线视频在线| 久久精品欧美一区二区三区不卡| 国产成人精品亚洲精品色欲| 国产精品久久久久秋霞鲁丝| 影音先锋久久| 中国一级片在线观看| 日韩精品视频免费|