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

JavaScript與Node.js一起打造一款聊天App

開發(fā) 前端
聊天是我們?nèi)伺c人交流最直接的方式,互聯(lián)網(wǎng)的加入使我們交流更加便捷。我們手機上的微信、QQ是我們手機必不可少的應(yīng)用軟件。那么,我們是否可以做一款聊天應(yīng)用呢?

 聊天是我們?nèi)伺c人交流最直接的方式,互聯(lián)網(wǎng)的加入使我們交流更加便捷。我們手機上的微信、QQ是我們手機必不可少的應(yīng)用軟件。那么,我們是否可以做一款聊天應(yīng)用呢?

之前我自己閑著沒事,研究過一些技術(shù),做了一款即時通訊應(yīng)用,下面我將選取幾幅具有代表性的圖片供大家參考。

一、應(yīng)用示圖

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上是這款應(yīng)用的主要頁面,功能可能相對簡陋點,不過基本的功能已經(jīng)實現(xiàn)了,下面我將給出核心代碼,全部源碼地址在文末。

二、部分核心源碼

前臺主要核心邏輯:

這里我只列舉了js核心代碼,查看完整代碼可以去文末。

 

  1. function sock() { 
  2.     return io.connect("http://localhost:3003"); // http環(huán)境下 
  3. // 心跳機制 
  4. document.addEventListener('visibilitychange'function () { 
  5.     if (document.visibilityState == 'hidden') { 
  6.         //記錄頁面隱藏時間 
  7.         sock() 
  8.         console.log('隱藏了'
  9.     } 
  10. }) 
  11. setInterval(() => { 
  12.     sock() 
  13. }, 10000); 
  14. var socket = sock() 
  15. var re = document.querySelector("#re"); 
  16. var register1 = document.querySelector(".register"); 
  17. var init = document.querySelector(".init"); 
  18. var passr = document.querySelector("#passr"); 
  19. var passl = document.querySelector("#passl"); 
  20. var login1 = document.querySelector(".login"); 
  21. var register_b = document.querySelector("#register_b"); 
  22. var lo = document.querySelector("#lo"); 
  23. var chat = document.querySelector("#chat"); 
  24. var login_b = document.querySelector("#login_b"); 
  25. var myMes = ""
  26. var vf = ""
  27. var na = ""
  28. var p = ""
  29. var we = ""
  30. var div = ""
  31. var v = ""
  32. var q = 0; 
  33. var regCn = /[@:]/im; 
  34. var pattern = /^[\u4E00-\u9FA5]{1,5}$/; 
  35. // 同意 
  36. document.querySelector('.yes').onclick=function () { 
  37.     document.querySelector('.dark').style.display='none' 
  38. document.querySelector('.ys').onclick = function () { 
  39.     document.querySelector('.dark').style.display = 'block' 
  40. // 初始頁面注冊 
  41. document.querySelector("#reg").onclick = function () { 
  42.     register1.style.display = "block"
  43.     init.style.display = "none"
  44.     document.querySelector(".bg").style.display = "none"
  45. // 初始頁面登錄 
  46. document.querySelector("#log").onclick = function () { 
  47.     login1.style.display = "block"
  48.     init.style.display = "none"
  49.     document.querySelector(".bg").style.display = "none"
  50. // 登錄按鈕 
  51. login_b.onclick = function () { 
  52.     login(); 
  53.  
  54. // 注冊按鈕 
  55. register_b.onclick = function () { 
  56.     register(); 
  57. //發(fā)送 
  58. document.getElementById("btn").onclick = function () { 
  59.     send(); 
  60. }; 
  61. // 內(nèi)容填充 
  62. document.getElementById("text").onkeyup = function () { 
  63.     if (document.getElementById("text").value.length != 0) { 
  64.         document.getElementById("btn").style.cssText = "background:#98E165;color:#fff;" 
  65.     } else { 
  66.         document.getElementById("btn").style.cssText = "background: #DDDEE2;color:#fff" 
  67.     } 
  68. document.querySelector("#text").onclick = function () { 
  69.     document.querySelector('#text').scrollIntoView(false); 
  70. // 傳名 
  71. var users2 = ""
  72. socket.on('users'function (users) { 
  73.     users2 = users; 
  74.     //  console.log(users2); 
  75. }); 
  76. // 傳密碼 
  77. var pass2 = "" 
  78. socket.on('pass'function (val) { 
  79.     pass2 = val; 
  80.     //  console.log(pass2) 
  81. }); 
  82. // 統(tǒng)計在線人數(shù) 
  83. var arrh = [] 
  84. socket.on('dataval'function (val) { 
  85.     vf = val; 
  86.     console.log(vf); 
  87.  
  88.     for (let i = 0; i < vf.length; i++) { 
  89.         // uu++ 
  90.         arrh.push(vf[i]) 
  91.         console.log(arrh) 
  92.     } 
  93.     var rf = [...new Set(arrh)] 
  94.     console.log(rf) 
  95.     rf = vf 
  96.     for (let j = 0; j < rf.length; j++) { 
  97.         var li = document.createElement("li"); 
  98.         li.classList.add("active"); 
  99.         li.innerText = rf[j] 
  100.         console.log(rf[j]) 
  101.         socket.emit("time", rf[j]); 
  102.         document.querySelector(".fix").appendChild(li); 
  103.  
  104.     } 
  105. }); 
  106. socket.on('join'function (val) { 
  107.     document.querySelector(".fix").innerHTML = '' 
  108. }) 
  109. socket.on('disconnect'function (val) { 
  110.     console.log('離開了'
  111.     document.querySelector(".fix").innerHTML = '' 
  112. }) 
  113. // 生成數(shù)組 
  114. var ar = ""
  115. socket.on('array'function (val) { 
  116.     ar = val; 
  117.     // console.log(ar); 
  118. }); 
  119. // 封裝注冊 
  120. function register() { 
  121.     if (re.value.length == 0) { 
  122.         sweetAlert("請輸入用戶名!"); 
  123.         return false
  124.     } else if (regCn.test(re.value)) { 
  125.         sweetAlert("格式錯誤,不能夠用和:符號取名,請重新輸入!"); 
  126.         return false
  127.     } else if (pattern.test(re.value)) { 
  128.         sweetAlert("不能使用中文字符哦!"); 
  129.         return false
  130.     } else if (!(re.value.length == 0 && regCn.test(re.value))) { 
  131.         if (users2.indexOf(re.value) != -1) { 
  132.             sweetAlert("已經(jīng)注冊啦,換一個用戶名吧!"); 
  133.         } else { 
  134.             names(re.value.trim()); 
  135.             pass(passr.value.trim()); 
  136.             sweetAlert("注冊成功,您的用戶名:" + re.value.trim()); 
  137.             document.querySelector(".swal-button").onclick = function () { 
  138.                 window.location.reload(); 
  139.             } 
  140.         } 
  141.     } 
  142. //移動端使用touchend 
  143. var event = navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i) ? 'touchend' : 'click'
  144.  
  145. // 選擇器 
  146. var Q = function (id) { 
  147.     return document.getElementById(id) 
  148. }; 
  149. //右 
  150. var _right = new mSlider({ 
  151.     dom: ".layer-right"
  152.     direction: "right" 
  153. }); 
  154.  
  155. Q("btnRight").addEventListener(event, function (e) { 
  156.     _right.open(); 
  157. }) 
  158. // 封裝登錄 
  159. function login() { 
  160.     if (lo.value.length == 0) { 
  161.         sweetAlert("請輸入用戶名!"); 
  162.         return false
  163.     } else if (regCn.test(lo.value)) { 
  164.         sweetAlert("格式錯誤,不能夠用和:符號取名,請重新輸入!"); 
  165.         return false
  166.     } else if (pattern.test(lo.value)) { 
  167.         sweetAlert("不能使用中文字符哦!"); 
  168.         return false
  169.     } else if (!(lo.value.length == 0 && regCn.test(lo.value))) { 
  170.         if (users2.indexOf(lo.value) != -1) { 
  171.             for (var i = 0; i < users2.length; i++) { 
  172.                 if (users2[i] === lo.value && pass2[i] === passl.value) { 
  173.                     if (ar.indexOf(lo.value) == -1) { 
  174.                         sweetAlert("恭喜您,登錄成功!"); 
  175.                         socket.emit('setName', lo.value.trim()); 
  176.                         names1(lo.value.trim()); 
  177.                         login1.style.display = "none"
  178.                         document.querySelector(".bg").style.display = "none"
  179.                         document.querySelector(".cd span").style.display = "none"
  180.                         document.querySelector(".title img").style.display = "block"
  181.                         document.querySelector(".fix").style.display = "block"
  182.                         document.querySelector(".title").style.display = "block"
  183.                          _right.open(); 
  184.                         document.querySelector(".swal-button").onclick = function () { 
  185.                             document.getElementById("text").focus(); 
  186.                             document.querySelector(".fix").addEventListener('click'function (e) { 
  187.                                 if (e.target.nodeName === "LI" && e.target.innerText != document.title) { 
  188.                                     _right.close(); 
  189.                                     document.querySelector(".chat_b").style.display = "block"
  190.                                     document.querySelector(".box").style.display = "block"
  191.                                     document.querySelector(".tit").innerText = e.target.innerText; 
  192.                                     document.querySelector(".ys").style.display="none"
  193.                                     document.querySelector("#text").focus(); 
  194.                                     onOff = true
  195.                                 } else { 
  196.                                     sweetAlert("不能跟自己聊天哦~"); 
  197.                                 } 
  198.                             }) 
  199.                         } 
  200.                     } else { 
  201.                         sweetAlert("不能重復登錄哦!"); 
  202.                         return 
  203.                     } 
  204.                 } 
  205.                 if (users2[i] === lo.value && pass2[i] != passl.value) { 
  206.                     sweetAlert("密碼錯誤!"); 
  207.                     return
  208.                 } 
  209.             } 
  210.         } else { 
  211.             sweetAlert("請先注冊哦!"); 
  212.             login1.style.display = "none"
  213.             register1.style.display = "block"
  214.         } 
  215.     } 
  216. // 傳名 
  217. function names(value) { 
  218.     this.name = value; 
  219.     socket.emit("reg"name); 
  220.  
  221. function names1(value) { 
  222.     this.name1 = value; 
  223.     socket.emit("join", name1); 
  224.     document.title = name1 
  225. // 傳密碼 
  226. function pass(value) { 
  227.     socket.emit("pass", value); 
  228. socket.on("join"function (user) { 
  229.     this.na = user
  230. }) 
  231. socket.on("reg"function (user) { 
  232.     this.na1 = user
  233. }) 
  234. // 私發(fā)消息 
  235. socket.on('message1'function (data) { 
  236.     var p1 = document.createElement("div"); 
  237.     var s1 = document.createElement("p"); 
  238.     var s2 = document.createElement("p"); 
  239.     var div1 = document.createElement("div"); 
  240.     var em = document.createElement("em"); 
  241.     var ads = document.createElement("audio"); 
  242.     ads.src = "https://www.maomin.club/data/res.mp3"
  243.     ads.className = "ads"
  244.     s1.className = "chatlist"
  245.     s2.className = "chatlist1"
  246.     em.className = "zwasked1"
  247.     div1.className = "divbox"
  248.     s1.innerText = data.from
  249.     s2.innerText = data.msg; 
  250.     s1.appendChild(em); 
  251.     p1.appendChild(s1); 
  252.     p1.appendChild(s2); 
  253.     chat.appendChild(ads); 
  254.     ads.play(); 
  255.     div1.appendChild(p1); 
  256.     chat.appendChild(div1); 
  257.     chat.scrollTop = chat.scrollHeight; 
  258. }); 
  259. // 私聊發(fā)送 
  260. function send() { 
  261.     if (document.getElementById("text").value != "") { 
  262.         socket.emit('sayTo', { 
  263.             from: lo.value, 
  264.             to: document.querySelector(".tit").innerText, 
  265.             msg: document.querySelector("#text").value, 
  266.         }) 
  267.         var p1 = document.createElement("div"); 
  268.         var s1 = document.createElement("p"); 
  269.         var s2 = document.createElement("p"); 
  270.         var em = document.createElement("em"); 
  271.         var div1 = document.createElement("div"); 
  272.         var ads = document.createElement("audio"); 
  273.         p1.style.cssText = "float:right;"
  274.         s2.style.cssText = "color:#333;" 
  275.         ads.src = "https://www.maomin.club/data/s.wav"
  276.         ads.className = "ads"
  277.         div1.className = "divbox"
  278.         s1.className = "chatlist"
  279.         s1.style.cssText = "color:#333 !important;float:right; !important"
  280.         s2.className = "chatlist2"
  281.         em.className = "zwasked"
  282.         s1.innerText = lo.value; 
  283.         s2.innerText = document.querySelector("#text").value; 
  284.         s1.appendChild(em); 
  285.         p1.appendChild(s1); 
  286.         p1.appendChild(s2); 
  287.         chat.appendChild(ads); 
  288.         ads.play(); 
  289.         div1.appendChild(p1); 
  290.         chat.appendChild(div1); 
  291.         chat.scrollTop = chat.scrollHeight; 
  292.     } else { 
  293.         sweetAlert('請輸入內(nèi)容!'); 
  294.     } 
  295.     chat.scrollTop = chat.scrollHeight; 
  296.     document.querySelector("#text").value = ""
  297.     document.querySelector("#text").focus(); 

后臺主要核心邏輯:

我這里只列舉了http環(huán)境的,完整代碼中有https環(huán)境的。

 

  1. var http=require("http"); 
  2. var fs=require("fs"); 
  3. var express = require('express'); 
  4. var ws=require("socket.io"); 
  5. var path=require("path"); 
  6. var _ = require('underscore'); 
  7. var usocket = []; 
  8. var usocket1 = []; 
  9. var pass=[]; 
  10. var data=[]; 
  11. var hashName = {}; 
  12. var onlineCount = 0; 
  13. var app = express(); 
  14. // 靜態(tài)文件識別 
  15. app.use(express.static(path.join(__dirname, './public'))); 
  16. var server=http.createServer(function (req,res) { 
  17.     var filename = req.url.split('/')[req.url.split('/').length-1]; 
  18.     var suffix = req.url.split('.')[req.url.split('.').length-1]; 
  19.     if(req.url==='/'){ 
  20.         res.writeHead(200, {'Content-Type''text/html'}); 
  21.         var html = fs.readFileSync("./public/index.html"); 
  22.         res.end(html) 
  23.     }else if(suffix==='css'){ 
  24.         res.writeHead(200, {'Content-Type''text/css'}); 
  25.         res.end(get_file_content(path.join(__dirname, 'public''css', filename))); 
  26.     }else if(suffix==='js') { 
  27.         res.writeHead(200, {'Content-Type''text/javascript'}); 
  28.         res.end(get_file_content(path.join(__dirname, 'public''js', filename))); 
  29.     }else if (suffix in ['gif''jpeg''jpg''png']) { 
  30.         res.writeHead(200, { 
  31.             'Content-Type''image/' + suffix 
  32.         }); 
  33.         res.end(get_file_content(path.join(__dirname, 'public''images', filename))); 
  34.     } 
  35. }); 
  36. function get_file_content(filepath) { 
  37.     return fs.readFileSync(filepath); 
  38. // 獲取在線 
  39. function broadcast() { 
  40.     io.sockets.emit("dataval", hashName); 
  41. //提供私有socket 
  42. function privateSocket(toId) { 
  43.     return (_.findWhere(io.sockets.sockets, { 
  44.         id: toId 
  45.     })); 
  46. // 封裝刪除 
  47. function removeByValue(arr, val) { 
  48.     for (var i = 0; i < arr.length; i++) { 
  49.         if (arr[i] == val) { 
  50.             arr.splice(i, 1); 
  51.             break; 
  52.         } 
  53.     } 
  54. // 連接socket 
  55. var io=ws(server); 
  56. io.on("connection",function(socket){ 
  57. // 寫入成功后讀取測試 
  58. fs.readFile('./user.xls''utf-8'function (err, data) { 
  59.     if(data!=null){ 
  60.     var value = data.split('\n'); 
  61.      io.sockets.emit("users", value);   
  62.     } 
  63.  
  64. }); 
  65. // 寫入成功后讀取測試 
  66. fs.readFile('./password.xls''utf-8'function (err,data) { 
  67.     if(data!=null){ 
  68.     var pass1=data.split('\n'); 
  69.     io.sockets.emit("pass", pass1); 
  70.     } 
  71. }); 
  72.     broadcast(); 
  73. // 生成名字 
  74. socket.on('setName'function (data) { 
  75.     var name = data; 
  76.     hashName[name] = socket.id; 
  77.     // console.log(hashName[name]); 
  78.     broadcast(); 
  79. }); 
  80. // 私聊發(fā)送 
  81. socket.on('sayTo'function (data) { 
  82.     var toName = data.to
  83.     var toId; 
  84.     console.log(toName); 
  85.     if (toId = hashName[toName]) { 
  86.         privateSocket(toId).emit('message1', data); 
  87.     } 
  88. }); 
  89. // 離開 
  90. socket.on('disconnect'function (name) { 
  91.          name=this.i2; 
  92.          io.emit("disconnect"name); 
  93.          removeByValue(data, name); 
  94.          io.sockets.emit("dataval", data); 
  95.     }) 
  96. // 在線 
  97. socket.on('time'function (val) { 
  98.         // console.log(val); 
  99.    }) 
  100. // 注冊 
  101. socket.on("reg"function (name) { 
  102.           usocket[name] = socket; 
  103.           this.i1=name
  104.           io.emit("reg"name); 
  105.           var myname =this.i1+"\n"
  106.           fs.writeFile('./user.xls', myname, { 
  107.               'flag''a' 
  108.           }, function (err) { 
  109.               if (err) { 
  110.                   throw err; 
  111.               } 
  112.               // 寫入成功后讀取測試 
  113.               fs.readFile('./user.xls''utf-8'function (err,data) { 
  114.                   if (err) { 
  115.                       throw err; 
  116.                   } 
  117.               }); 
  118.           }); 
  119.     }) 
  120. // 加入 
  121. io.emit('connected', ++onlineCount); 
  122.     // console.log(data); 
  123.     io.sockets.emit("array", data); 
  124.     socket.on("join"function (name) { 
  125.         usocket1[name] = socket; 
  126.         this.i2 = name
  127.         io.emit("join"name); 
  128.         data.push(name); 
  129.         io.sockets.emit("dataval", data); 
  130.     }) 
  131. // 密碼 
  132. socket.on("pass",function(val){ 
  133.       pass[val]=socket; 
  134.       this.i2=val; 
  135.       io.emit("pass", val); 
  136.       var password=this.i2+"\n"
  137.        fs.writeFile('./password.xls'password, { 
  138.               'flag''a' 
  139.           }, function (err) { 
  140.               if (err) { 
  141.                   throw err; 
  142.               } 
  143.           }); 
  144.     }) 
  145. }); 
  146. server.listen(3003); 
  147. console.log("服務(wù)器運行中"); 

三、源碼地址

這個項目是之前寫的,歡迎大家進行指正。大家可以復制下面的源碼地址,拉取下來就可以在本地實現(xiàn)一個聊天服務(wù)。如果你有服務(wù)器可以把它部署在服務(wù)器上,這樣你就可以有一個屬于自己的聊天App了。大家可以根據(jù)源碼進行學習,有不明白的可以隨時問我。

https://github.com/maomincoding/chat3

責任編輯:華軒 來源: 前端歷劫之路
相關(guān)推薦

2021-10-12 23:45:43

NodeJs事件

2023-06-20 06:44:14

Node.jsCPU 負載

2022-11-14 00:14:49

2022-10-28 15:51:24

JavaScript開發(fā)Node.js

2014-04-01 11:02:00

Node.jsWeb Socket聊天程序

2021-09-15 19:02:42

Node.jsFs模塊

2022-02-17 10:26:17

JavaScript掃雷游戲前端

2014-12-16 10:11:22

2020-12-22 06:02:48

JS聚合聊天

2014-10-30 10:28:55

Node.js

2021-02-01 08:16:14

ChromeNode.js

2016-12-08 11:49:03

APPRetrofitRxJava

2021-11-24 08:51:32

Node.js監(jiān)聽函數(shù)

2015-12-25 16:31:54

開源攻防平臺DVNA

2015-08-18 09:11:34

杜長偉APP

2017-04-10 13:28:32

Node.jsJavaScript

2015-12-24 16:33:42

2011-12-18 18:32:35

APP

2022-03-04 09:05:55

StarRocks數(shù)據(jù)湖數(shù)據(jù)質(zhì)量

2021-11-17 15:36:04

鴻蒙HarmonyOS應(yīng)用
點贊
收藏

51CTO技術(shù)棧公眾號

午夜小视频在线| 91麻豆精品在线| 成人18夜夜网深夜福利网| 亚洲国产一区二区视频| 欧美污视频久久久| 国产精品久久综合青草亚洲AV| 欧美fxxxxxx另类| 日韩精品中文字幕久久臀| 国产性生交xxxxx免费| 黄色小网站在线观看| av动漫一区二区| 国产在线观看精品| 欧美在线观看不卡| 欧美一区免费| 国产一区二区激情| 亚洲一区二区三区黄色| 高清在线一区| 精品国产精品三级精品av网址| 亚洲精品永久www嫩草| www.天堂在线| 蜜桃视频免费观看一区| 98精品国产高清在线xxxx天堂| 中文天堂资源在线| 亚洲动漫在线观看| 亚洲白拍色综合图区| 午夜免费福利视频在线观看| 国产资源在线观看入口av| 亚洲欧洲韩国日本视频| 免费看成人av| 蜜臀久久久久久999| 国产在线精品一区二区不卡了| 欧美在线性爱视频| 精品久久免费视频| 中文字幕亚洲精品乱码| 色综合亚洲精品激情狠狠| 中文字幕丰满孑伦无码专区| 视频欧美一区| 在线播放中文一区| 黑森林精品导航| 中文字幕 在线观看| 亚洲韩国一区二区三区| 国产精品久久久影院| av在线免费观看网| 国产亚洲精品超碰| 欧美精品亚洲精品| 污视频在线免费| 成人永久aaa| 成人免费看片网址| 性一交一乱一透一a级| 国产一区二三区| 91在线播放国产| 国产孕妇孕交大片孕| 久久97超碰国产精品超碰| 国产精品av免费在线观看| 国产精品第5页| 亚洲一区黄色| 日韩免费观看网站| 一级片免费在线播放| 国产欧美日韩一级| 欧洲亚洲妇女av| 人妻丰满熟妇av无码区| 久久精品伊人| 国产精品黄页免费高清在线观看| 亚洲 日本 欧美 中文幕| 视频在线观看国产精品| 国产精品电影在线观看| 中文字幕日韩经典| 精品在线一区二区三区| 91香蕉电影院| 亚洲精品久久久蜜桃动漫| 夫妻av一区二区| 国产精品一区二区欧美黑人喷潮水| 性一交一乱一乱一视频| 91在线丨porny丨国产| 蜜桃传媒一区二区| a视频网址在线观看| 综合久久一区二区三区| www.亚洲成人网| 97超碰在线免费| 日韩欧美亚洲国产一区| 亚洲综合色在线观看| 成人污污视频| 亚洲国产成人久久综合一区| 中文字幕av网址| 成人免费在线观看av| 久久精品国产亚洲| 日本a在线观看| 丝袜美腿高跟呻吟高潮一区| 成人www视频在线观看| 精品国产无码一区二区三区| 99精品一区二区三区| 亚洲v欧美v另类v综合v日韩v| 羞羞污视频在线观看| 岛国av一区二区在线在线观看| 亚洲视频在线观看一区二区三区| 成人午夜888| 精品香蕉在线观看视频一| 美国黄色特级片| 黄色亚洲大片免费在线观看| 国产91免费观看| 精品国产va久久久久久久| 91视频免费观看| 一区二区三区日韩视频| 欧美男人天堂| 欧美一级专区免费大片| 亚洲一级中文字幕| 欧美日韩免费观看一区=区三区| 欧美一级在线播放| www.国产欧美| 国产欧美一区在线| 免费成人午夜视频| 免费精品一区二区三区在线观看| 亚洲欧美日韩国产成人| 久久久99精品| 国内精品在线播放| 午夜午夜精品一区二区三区文| 国产经典三级在线| 这里只有精品电影| 成人性生交大片免费看无遮挡aⅴ| 亚洲小说欧美另类社区| 成人免费福利在线| 成人在线视频成人| 欧美性猛交xxxx富婆弯腰| 18深夜在线观看免费视频| 欧美日韩国产传媒| 欧美一级片一区| 三级视频在线看| 一区二区三区在线观看动漫 | 日本69式三人交| 中文字幕一区二区精品区| 国产色视频一区| 成年网站在线| 色哟哟国产精品| 成人手机在线免费视频| 韩日精品视频| 国产精品国产三级国产专区53| 超碰在线免费播放| 欧美一区二区三区免费大片| 亚洲天堂精品一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 美国av一区二区三区| 午夜欧美激情| 亚洲精品一区二区三区不| 国产精品第9页| www.日本不卡| 欧美日本视频在线观看| 日本成人中文| 91成人天堂久久成人| 亚洲色图欧美视频| 欧美日韩国产一区中文午夜| 在线免费观看污视频| 一本综合久久| 欧美不卡三区| 中韩乱幕日产无线码一区| 亚洲视频在线免费观看| 国产精品成人久久久| 中文字幕国产一区二区| av污在线观看| 亚洲精品国产成人影院| 91观看网站| 国产网站在线| 亚洲欧洲国产精品| 亚洲天堂手机版| 亚洲靠逼com| 国产调教打屁股xxxx网站| 国内一区二区三区| 狠狠爱一区二区三区| 末成年女av片一区二区下载| 亚洲毛片在线观看.| 99成人精品视频| 中文字幕一区视频| 国产sm在线观看| 日韩一级在线| 亚洲 日韩 国产第一区| 国产一区二区视频在线看| 久久久久久久久久久网站| 日韩亚洲视频在线观看| 欧美日韩在线播放三区四区| 精品无码久久久久成人漫画 | 国产色视频一区二区三区qq号| 日日骚欧美日韩| 一级黄色免费在线观看| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 韩国一区二区三区美女美女秀| 小h片在线观看| 日韩在线视频观看| 亚洲精品一区二区口爆| 色女孩综合影院| 超碰在线国产97| 久久日一线二线三线suv| 日韩av.com| 国产亚洲高清视频| 国产麻豆电影在线观看| 欧美激情久久久久久久久久久| 人人澡人人澡人人看欧美| 国产精品久久久久久福利| 亚洲精品电影在线观看| 97超碰人人草| 欧美视频在线看| 天天干中文字幕| 国产亚洲欧美日韩在线一区| aaaaaaaa毛片| 日韩综合小视频| 激情小视频网站| 99久久99久久精品国产片桃花| 国产欧美日韩亚洲| 亚洲欧美专区| 日本精品视频在线播放| 日本在线视频www鲁啊鲁| 国产一区二区日韩| 天天综合网在线观看| 911国产精品| 国产成人精品一区二区色戒| 亚洲第一主播视频| www.xxxx日本| 国产精品久久久久aaaa樱花| 爱爱免费小视频| 成人精品一区二区三区中文字幕| 在线观看免费av网址| 久久国产主播| a级黄色一级片| 好看的av在线不卡观看| 亚洲国产精品女人| 98精品久久久久久久| 日韩欧美精品一区二区三区经典| 美女一区二区在线观看| 97操在线视频| 日韩影片在线观看| 91在线播放国产| vam成人资源在线观看| 91高清免费视频| 搞黄视频免费在线观看| 亚洲精品在线电影| 精品国产999久久久免费| 在线播放中文一区| 中文字幕在线观看1| 精品一区二区日韩| 亚洲丁香久久久| 91精品国产综合久| 欧美性欧美巨大黑白大战| 国产无遮挡aaa片爽爽| 洋洋成人永久网站入口| 波多野结衣爱爱视频| 亚洲欧美另类久久久精品2019| 国产在线免费av| 久久亚洲一级片| 一区二区不卡免费视频| av午夜一区麻豆| 成人手机在线免费视频| 91在线一区二区| 精品少妇人妻一区二区黑料社区| 99久久久国产精品免费蜜臀| 亚洲精品第二页| 99久久伊人网影院| yy6080午夜| 久久午夜免费电影| 夜夜春很很躁夜夜躁| 亚洲国产精品av| www日韩在线| 午夜婷婷国产麻豆精品| 日韩黄色三级视频| 欧美视频在线观看免费| 中文字幕一区二区三区四区欧美| 欧美影片第一页| 国产精品视频无码| 日韩欧美成人激情| 天堂网在线资源| 亚洲欧洲第一视频| 国产乱色在线观看| 国内精品小视频| 欧美第一视频| 成人妇女免费播放久久久| 亚洲**毛片| 久久综合毛片| 欧美韩国日本在线观看| 日本一道在线观看| 国产一区二区三区的电影| 国产一级特黄a大片免费| 精品制服美女丁香| 欧类av怡春院| 国产精品每日更新在线播放网址| 欧美黑人一级片| 日韩欧美国产网站| 国产三级精品在线观看| 亚洲激情国产精品| 日本不卡在线| 国内外成人免费激情在线视频| 色老太综合网| 91久久久一线二线三线品牌| 噜噜噜天天躁狠狠躁夜夜精品 | 欧美天堂社区| 亚洲黄色成人久久久| 国产精品第十页| 久久九九国产视频| 福利一区二区在线| 国产精品一区二区亚洲| 午夜精品一区二区三区三上悠亚 | 亚洲v.com| 国产女人aaa级久久久级| 一区二区在线中文字幕电影视频| 午夜精彩国产免费不卡不顿大片| 欧美 日韩 激情| 国产精品自拍在线| 亚洲精品一区二区三区影院忠贞| 亚洲精品videosex极品| 欧美国产一级片| 精品99999| 麻豆av免费在线观看| 欧美亚洲激情在线| 一区视频网站| 成人短视频在线看| 日韩国产精品久久久久久亚洲| 涩视频在线观看| 亚洲视频免费看| 亚洲精品一区二三区| 日韩精品一二三四区| 污污的网站在线看| 成人妇女免费播放久久久| 国产一区日韩| 日本三级免费网站| 成人丝袜18视频在线观看| 顶臀精品视频www| 欧美日韩精品一区二区天天拍小说| 午夜福利理论片在线观看| 久久97精品久久久久久久不卡| 成人在线高清| 天堂资源在线亚洲资源| 国产视频久久| 亚洲观看黄色网| 亚洲第一福利一区| 亚洲经典一区二区三区| 不卡av电影院| 成人永久在线| 懂色av一区二区三区四区五区| 蜜臀av一级做a爰片久久| 国产精成人品免费观看| 色域天天综合网| 免费在线国产| 日本中文字幕不卡免费| 亚洲涩涩av| 97视频在线免费播放| 99精品欧美一区| 精品成人久久久| 亚洲国产私拍精品国模在线观看| brazzers在线观看| 国产伦精品一区二区三区在线 | 一区二区xxx| 国产精品色婷婷| 一级黄色录像大片| 久久精品国产视频| 日韩成人视屏| 国产九色porny| 99精品国产99久久久久久白柏| 九九九国产视频| 日韩激情视频在线播放| h片在线观看下载| 久久综合九色欧美狠狠| 久久精品主播| 黄色片网站在线播放| 91精品久久久久久久99蜜桃| av网站网址在线观看| 97人摸人人澡人人人超一碰| 韩日成人在线| 中文字幕一区二区人妻在线不卡| 欧美午夜激情视频| 国产色a在线| 成人欧美一区二区三区在线湿哒哒| 亚洲精品888| 亚洲一区二区三区综合| 色哟哟国产精品| 欧美jizzhd欧美| 99精品在线直播| 国产精品美女| 久久久99999| 精品伦理精品一区| 成人性生活视频| 黄色a级在线观看| av在线这里只有精品| 成人黄色三级视频| 色中色综合影院手机版在线观看| 久久资源综合| 在线观看亚洲色图| 亚洲线精品一区二区三区| 免费资源在线观看| 91黄色国产视频| 老司机午夜精品视频在线观看| 三级黄色免费观看| 亚洲精品久久久久中文字幕二区| 日韩一区二区三区免费| 欧美日韩午夜爽爽| 国产欧美日韩在线观看| www.com欧美| 国产精品福利在线| 国精品一区二区三区| 内射毛片内射国产夫妻| 精品99一区二区| 天堂久久一区| 黄色片一级视频| 亚洲国产一二三| 欧美激情办公室videoshd|