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

精品福利在线看| 国产成人欧美日韩在线电影| 亚洲欧洲日产国产网站| 9l视频白拍9色9l视频| 毛片av在线| 成人国产精品免费| 国产精品久久久久久超碰 | 99视频国产精品| 国产精品美女久久久久av超清| 九九视频免费观看| 精品国产一区探花在线观看| 日韩三级中文字幕| 欧美极品欧美精品欧美图片| 黄色网址免费在线观看| 久久嫩草精品久久久精品| 亚洲最大av网站| 69xxxx国产| 亚洲国产日本| 久久九九精品99国产精品| 国产肉体xxxx裸体784大胆| 成人黄色理论片| 色系网站成人免费| 丰满的少妇愉情hd高清果冻传媒 | 久久久一本二本三本| 男女啪啪在线观看| 国产三级一区二区| 国产一区喷水| www.污视频| 麻豆91精品视频| 国产高清在线不卡| 91午夜视频在线观看| 欧美.www| 久久国产精品亚洲| 久久日免费视频| 欧美日韩一本| 日韩一区二区三区精品视频| 一级黄色特级片| 日韩欧美一区二区三区在线观看| 亚洲午夜私人影院| 日韩人妻精品一区二区三区| 欧美女子与性| 91捆绑美女网站| 国产一区二区无遮挡| 神马久久久久久久久久| 国产成人精品免费一区二区| 91天堂在线观看| 国产在成人精品线拍偷自揄拍| 亚洲专区一区| 性欧美xxxx视频在线观看| 久久久久久福利| 国产一在线精品一区在线观看| www国产精品视频| 国产精品suv一区二区88| 日韩精品91| 色yeye香蕉凹凸一区二区av| 91麻豆制片厂| 欧美电影一二区| 日韩一区二区三区国产| 亚洲精品久久久久久国| 亚洲精品一二三区区别| 日韩视频在线观看免费| 婷婷在线精品视频| 伊人成年综合电影网| 欧美高清在线观看| 国产午夜激情视频| 亚洲欧美大片| 国产精品999999| 伊人亚洲综合网| 极品少妇xxxx精品少妇| 成人在线观看91| 日本精品久久久久| 久久久久久一二三区| 性欧美videosex高清少妇| 免费在线视频欧美| 亚洲一区二区欧美| 虎白女粉嫩尤物福利视频| 91av亚洲| 5月丁香婷婷综合| 中文字幕在线观看91| 欧美高清视频看片在线观看| 亚洲欧美第一页| 九九热久久免费视频| 欧美黄色一区| 69**夜色精品国产69乱| 中文在线最新版天堂| 国产精品一区二区久久精品爱涩| 国产伦精品一区二区三区视频免费| 五月婷婷开心中文字幕| 亚洲国产成人自拍| 公共露出暴露狂另类av| 久久男人天堂| 欧美精品日韩精品| 精品一区二区视频在线观看| 欧洲激情综合| 欧美激情中文字幕乱码免费| 久久久久久久亚洲| 国产大片一区二区| 欧美在线一区二区三区四区| 蜜桃视频在线观看免费视频网站www| 亚洲自拍偷拍欧美| 91最新在线观看| www.亚洲一二| 中文字幕综合一区| 国产精品自拍99| 国产一区欧美一区| 欧美少妇一区| 丁香影院在线| 欧美剧情片在线观看| 中出视频在线观看| 欧美激情视频一区二区三区免费| 日本欧美一级片| www.五月激情| 亚洲欧洲在线观看av| 亚洲自偷自拍熟女另类| 国语精品视频| 中文字幕亚洲自拍| 国产精品视频123| 高清shemale亚洲人妖| 亚洲国产精品123| 成人香蕉视频| 亚洲国产精品视频在线观看| 裸体武打性艳史| 日韩av电影天堂| 久久久婷婷一区二区三区不卡| 性爱视频在线播放| 欧美男人的天堂一二区| 美女爆乳18禁www久久久久久| 亚洲无线一线二线三线区别av| 国产欧美精品一区二区| 国产在线91| 日韩欧美在线网址| 天堂久久久久久| 亚洲小说欧美另类社区| 99高清视频有精品视频| 国产成人在线视频免费观看| 欧美另类高清zo欧美| 超碰97av在线| 日韩电影在线看| 欧洲av一区| 国产经典一区| 在线免费看av不卡| 中文字幕免费高清网站| 国产亚洲精品超碰| 波多野结衣家庭教师视频| 欧美1区2区3区4区| 91国产视频在线| 污视频网站免费观看| 午夜精品123| 亚洲一区二区在线免费| 亚洲黄色三级| 激情五月综合色婷婷一区二区 | 国产精品视频久久| wwwww在线观看免费视频| 91福利在线看| 午夜精产品一区二区在线观看的 | 亚洲天堂一区二区在线观看| 久久久9色精品国产一区二区三区| 国产日韩欧美中文| 伊人手机在线| 亚洲激情在线观看| 日韩在线视频不卡| 国产女主播在线一区二区| 天天爽人人爽夜夜爽| 国产精品99一区二区三| 亚洲精品欧美极品| 欧美xxxbbb| 日韩精品中文字幕在线观看| 久久久精品视频网站| 国产日韩欧美综合一区| 污污网站在线观看视频| 欧美日韩18| 精品国产乱码久久久久久郑州公司| 在线黄色的网站| 中文字幕欧美亚洲| www.久久久久久| 欧美日韩另类字幕中文| 国产精品www爽爽爽| 黑人精品欧美一区二区蜜桃 | 欧美精品高清视频| 久操免费在线视频| 久久人人97超碰com| 亚洲成人福利在线| 影音先锋中文字幕一区二区| 久久综合九色欧美狠狠| 精品久久福利| 国产+人+亚洲| 日本视频在线观看| 亚洲国产日韩精品在线| 中文字幕在线观看高清| 亚洲国产aⅴ天堂久久| 欧美多人猛交狂配| 国产精一区二区三区| 日本精品一区在线观看| 久久久人成影片免费观看| 国产亚洲福利社区| 一区二区三区| 日产日韩在线亚洲欧美| 污视频在线看网站| 国产小视频国产精品| 丰满熟妇人妻中文字幕| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 天堂网av成人| 91在线精品播放| 欧美成人精品三级网站| 久久久久久一区二区三区| aaa日本高清在线播放免费观看| 亚洲精品一区二区三区福利| 夜夜爽8888| 色综合天天综合网天天看片| 久久久久久蜜桃| 国产精品国产自产拍在线| 法国伦理少妇愉情| 床上的激情91.| www.国产福利| 日韩电影在线一区二区三区| 亚洲自偷自拍熟女另类| 狠狠88综合久久久久综合网| 日本女人高潮视频| 欧美日韩激情| 欧美亚洲国产免费| 日本成人a网站| αv一区二区三区| 成人噜噜噜噜| 国产欧美中文字幕| 亚洲熟妇一区二区| 自拍偷自拍亚洲精品被多人伦好爽| 久久亚洲春色中文字幕| 1pondo在线播放免费| 亚洲欧美日韩精品| 天堂成人在线| 日韩成人av一区| 欧美自拍偷拍一区二区| 欧美成人精品3d动漫h| 一起草av在线| 欧美日韩国产一区| 中文字幕乱码中文字幕| 色一情一伦一子一伦一区| 丁香六月婷婷综合| 欧美小视频在线| 国产午夜免费福利| 欧美丝袜第一区| 黄色片免费观看视频| 精品久久中文字幕久久av| 日本一区二区欧美| 午夜精品久久久久久久99樱桃| 国产无套在线观看| 精品久久久久久久大神国产| 免费日韩一级片| 欧美性黄网官网| 激情五月婷婷网| 欧美自拍丝袜亚洲| 亚洲精品国产精品国自产网站按摩| 欧美性猛交xxxx| 波多野结衣家庭主妇| 欧美亚洲丝袜传媒另类| 亚洲视频在线观看一区二区| 欧美日韩三级视频| 国产精品嫩草影院精东| 日韩一二三区视频| 人妻妺妺窝人体色www聚色窝| 亚洲福利影片在线| 日韩av视屏| 中文字幕一区二区三区电影| 黄视频网站在线| 欧美精品www| 小视频免费在线观看| 日韩美女激情视频| 日本精品在线一区| 亚洲综合视频1区| h视频久久久| 蜜桃999成人看片在线观看| 欧美伦理在线视频| 成人在线免费观看网址| 99精品视频免费全部在线| aa在线免费观看| 麻豆一区二区三区| 18深夜在线观看免费视频| 91色视频在线| 99国产精品无码| 亚洲一区二区成人在线观看| 国产又粗又猛又黄视频| 欧美精品乱码久久久久久| 日韩中文字幕免费在线观看| 亚洲女成人图区| 国产激情视频在线| 欧美主播福利视频| 国产成年精品| 欧美精品一区二区三区四区五区 | 久久er热在这里只有精品66| av一区二区三区四区电影| 伊人精品一区| 欧美日韩视频免费| 日韩成人av影视| 肉丝美足丝袜一区二区三区四| 久久午夜国产精品| 欧美日韩精品在线观看视频| 欧洲在线/亚洲| 国产91免费看| 北条麻妃一区二区三区中文字幕| 小视频免费在线观看| 91在线免费看片| 精品午夜久久| 亚洲 自拍 另类小说综合图区| 久久国产精品色| 日本aaa视频| 一区二区激情小说| 一区二区小视频| 亚洲欧美一区二区激情| 丁香花高清在线观看完整版| 国产区精品在线观看| 中文字幕亚洲影视| 91视频 - 88av| 男人的j进女人的j一区| 久久久久国产精品无码免费看| 亚洲视频一区二区在线观看| 亚洲毛片一区二区三区| 亚洲国产天堂久久综合| 最爽无遮挡行房视频在线| 国产欧美在线播放| 欧美日韩在线观看视频小说| 久久久999视频| 成人国产精品免费观看| 手机在线免费看毛片| 欧美色区777第一页| 精彩国产在线| 国产成人精品电影久久久| 首页亚洲中字| 国产午夜福利100集发布| 国产99一区视频免费| 老女人性淫交视频| 欧美一区二区三区四区五区| 色哟哟免费在线观看| 国产欧美精品日韩精品| 日韩激情一区| 日韩成人精品视频在线观看| 国产情人综合久久777777| 久久久久久久久久一级| 精品调教chinesegay| 亚洲美女久久精品| 青青草成人激情在线| 日韩精品久久久久久| 一级黄色片网址| 在线一区二区视频| av免费在线一区二区三区| 国产福利视频一区二区| 成人午夜国产| 手机av在线网| 最新久久zyz资源站| 国产精品无码天天爽视频| 精品国内产的精品视频在线观看| 婷婷成人av| 黄色小视频大全| 成人综合激情网| 日韩欧美亚洲视频| 日韩乱码在线视频| 经典三级一区二区| 亚洲一区3d动漫同人无遮挡| 久久 天天综合| 久草国产在线观看| 日韩二区三区在线| 偷拍视频一区二区三区| 亚洲一区三区| 国产成人亚洲综合a∨猫咪| 亚洲视频免费播放| 亚洲性线免费观看视频成熟| 成人国产激情在线| 黄色特一级视频| 91亚洲精品久久久蜜桃网站| 午夜精品一区二| 日韩中文字幕在线视频播放| 玖玖玖视频精品| 免费看又黄又无码的网站| 久久精品视频一区| 一区不卡在线观看| 97视频在线观看播放| 激情综合网五月| 爱豆国产剧免费观看大全剧苏畅| 亚洲精品一卡二卡| 青青视频在线观| 国产日韩中文字幕| 一区二区三区高清视频在线观看| 女人又爽又黄免费女仆| 欧美军同video69gay| 美女搞黄视频在线观看| 亚洲国产另类久久久精品极度| 国产精品一区二区久久不卡| 五月婷婷视频在线| 久久精品国产一区二区三区| 激情小说亚洲图片| 男女视频在线看| 亚洲成av人片一区二区梦乃| av中文在线| 国产精品国产精品国产专区蜜臀ah | 久久久精品美女| 日韩精品免费一区二区夜夜嗨| 亚洲欧美日韩精品一区| 欧美日韩国产黄| 50度灰在线| 三区精品视频| 99久久久无码国产精品|