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

構(gòu)建一個(gè)即時(shí)消息應(yīng)用(七):Access頁(yè)面

開(kāi)發(fā)
這是一系列關(guān)于構(gòu)建“即時(shí)消息”應(yīng)用的新帖子。現(xiàn)在我們已經(jīng)完成了后端,讓我們轉(zhuǎn)到前端。 我將采用單頁(yè)應(yīng)用程序方案。

[[345596]]

本文是該系列的第七篇。

現(xiàn)在我們已經(jīng)完成了后端,讓我們轉(zhuǎn)到前端。 我將采用單頁(yè)應(yīng)用程序方案。

首先,我們創(chuàng)建一個(gè) static/index.html 文件,內(nèi)容如下。

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="utf-8"
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0"
  6.     <title>Messenger</title> 
  7.     <link rel="shortcut icon" href="data:,"
  8.     <link rel="stylesheet" href="/styles.css"
  9.     <script src="/main.js" type="module"></script> 
  10. </head> 
  11. <body></body> 
  12. </html> 

這個(gè) HTML 文件必須為每個(gè) URL 提供服務(wù),并且使用 JavaScript 負(fù)責(zé)呈現(xiàn)正確的頁(yè)面。

因此,讓我們將注意力轉(zhuǎn)到 main.go 片刻,然后在 main() 函數(shù)中添加以下路由:

  1. router.Handle("GET""/...", http.FileServer(SPAFileSystem{http.Dir("static")})) 
  2.  
  3. type SPAFileSystem struct { 
  4.     fs http.FileSystem 
  5.  
  6. func (spa SPAFileSystem) Open(name string) (http.File, error) { 
  7.     f, err := spa.fs.Open(name
  8.     if err != nil { 
  9.         return spa.fs.Open("index.html"
  10.     } 
  11.     return f, nil 

我們使用一個(gè)自定義的文件系統(tǒng),因此它不是為未知的 URL 返回 404 Not Found,而是轉(zhuǎn)到 index.html

路由器

在 index.html 中我們加載了兩個(gè)文件:styles.css 和 main.js。我把樣式留給你自由發(fā)揮。

讓我們移動(dòng)到 main.js。 創(chuàng)建一個(gè)包含以下內(nèi)容的 static/main.js 文件:

  1. import { guard } from './auth.js' 
  2. import Router from './router.js' 
  3.  
  4. let currentPage 
  5. const disconnect = new CustomEvent('disconnect'
  6. const router = new Router() 
  7.  
  8. router.handle('/', guard(view('home'), view('access'))) 
  9. router.handle('/callback'view('callback')) 
  10. router.handle(/^\/conversations\/([^\/]+)$/, guard(view('conversation'), view('access'))) 
  11. router.handle(/^\//, view('not-found')) 
  12.  
  13. router.install(async result => { 
  14.     document.body.innerHTML = '' 
  15.     if (currentPage instanceof Node) { 
  16.         currentPage.dispatchEvent(disconnect) 
  17.     } 
  18.     currentPage = await result 
  19.     if (currentPage instanceof Node) { 
  20.         document.body.appendChild(currentPage) 
  21.     } 
  22. }) 
  23.  
  24. function view(pageName) { 
  25.     return (...args) => import(`/pages/${pageName}-page.js`) 
  26.         .then(m => m.default(...args)) 

如果你是這個(gè)博客的關(guān)注者,你已經(jīng)知道它是如何工作的了。 該路由器就是在 這里 顯示的那個(gè)。 只需從 @nicolasparada/router 下載并保存到 static/router.js 即可。

我們注冊(cè)了四條路由。 在根路由 / 處,我們展示 home 或 access 頁(yè)面,無(wú)論用戶(hù)是否通過(guò)身份驗(yàn)證。 在 /callback 中,我們展示 callback 頁(yè)面。 在 /conversations/{conversationID} 上,我們展示對(duì)話或 access 頁(yè)面,無(wú)論用戶(hù)是否通過(guò)驗(yàn)證,對(duì)于其他 URL,我們展示一個(gè) not-found 頁(yè)面。

我們告訴路由器將結(jié)果渲染為文檔主體,并在離開(kāi)之前向每個(gè)頁(yè)面調(diào)度一個(gè) disconnect 事件。

我們將每個(gè)頁(yè)面放在不同的文件中,并使用新的動(dòng)態(tài) import() 函數(shù)導(dǎo)入它們。

身份驗(yàn)證

guard() 是一個(gè)函數(shù),給它兩個(gè)函數(shù)作為參數(shù),如果用戶(hù)通過(guò)了身份驗(yàn)證,則執(zhí)行第一個(gè)函數(shù),否則執(zhí)行第二個(gè)。它來(lái)自 auth.js,所以我們創(chuàng)建一個(gè)包含以下內(nèi)容的 static/auth.js 文件:

  1. export function isAuthenticated() { 
  2.     const token = localStorage.getItem('token'
  3.     const expiresAtItem = localStorage.getItem('expires_at'
  4.     if (token === null || expiresAtItem === null) { 
  5.         return false 
  6.     } 
  7.  
  8.     const expiresAt = new Date(expiresAtItem) 
  9.     if (isNaN(expiresAt.valueOf()) || expiresAt <= new Date()) { 
  10.         return false 
  11.     } 
  12.  
  13.     return true 
  14.  
  15. export function guard(fn1, fn2) { 
  16.     return (...args) => isAuthenticated() 
  17.         ? fn1(...args) 
  18.         : fn2(...args) 
  19.  
  20. export function getAuthUser() { 
  21.     if (!isAuthenticated()) { 
  22.         return null 
  23.     } 
  24.  
  25.     const authUser = localStorage.getItem('auth_user'
  26.     if (authUser === null) { 
  27.         return null 
  28.     } 
  29.  
  30.     try { 
  31.         return JSON.parse(authUser) 
  32.     } catch (_) { 
  33.         return null 
  34.     } 

isAuthenticated() 檢查 localStorage 中的 token 和 expires_at,以判斷用戶(hù)是否已通過(guò)身份驗(yàn)證。getAuthUser() 從 localStorage 中獲取經(jīng)過(guò)身份驗(yàn)證的用戶(hù)。

當(dāng)我們登錄時(shí),我們會(huì)將所有的數(shù)據(jù)保存到 localStorage,這樣才有意義。

Access 頁(yè)面

 

access page screenshot

讓我們從 access 頁(yè)面開(kāi)始。 創(chuàng)建一個(gè)包含以下內(nèi)容的文件 static/pages/access-page.js

  1. const template = document.createElement('template'
  2. template.innerHTML = ` 
  3.     <h1>Messenger</h1> 
  4.     <a href="/api/oauth/github" onclick="event.stopPropagation()">Access with GitHub</a> 
  5.  
  6. export default function accessPage() { 
  7.     return template.content 

因?yàn)槁酚善鲿?huì)攔截所有鏈接點(diǎn)擊來(lái)進(jìn)行導(dǎo)航,所以我們必須特別阻止此鏈接的事件傳播。

單擊該鏈接會(huì)將我們重定向到后端,然后重定向到 GitHub,再重定向到后端,然后再次重定向到前端; 到 callback 頁(yè)面。

Callback 頁(yè)面

創(chuàng)建包括以下內(nèi)容的 static/pages/callback-page.js 文件:

  1. import http from '../http.js' 
  2. import { navigate } from '../router.js' 
  3.  
  4. export default async function callbackPage() { 
  5.     const url = new URL(location.toString()) 
  6.     const token = url.searchParams.get('token'
  7.     const expiresAt = url.searchParams.get('expires_at'
  8.  
  9.     try { 
  10.         if (token === null || expiresAt === null) { 
  11.             throw new Error('Invalid URL'
  12.         } 
  13.  
  14.         const authUser = await getAuthUser(token) 
  15.  
  16.         localStorage.setItem('auth_user', JSON.stringify(authUser)) 
  17.         localStorage.setItem('token', token) 
  18.         localStorage.setItem('expires_at', expiresAt) 
  19.     } catch (err) { 
  20.         alert(err.message) 
  21.     } finally { 
  22.         navigate('/'true
  23.     } 
  24.  
  25. function getAuthUser(token) { 
  26.     return http.get('/api/auth_user', { authorization: `Bearer ${token}` }) 

callback 頁(yè)面不呈現(xiàn)任何內(nèi)容。這是一個(gè)異步函數(shù),它使用 URL 查詢(xún)字符串中的 token 向 /api/auth_user 發(fā)出 GET 請(qǐng)求,并將所有數(shù)據(jù)保存到 localStorage。 然后重定向到 /

HTTP

這里是一個(gè) HTTP 模塊。 創(chuàng)建一個(gè)包含以下內(nèi)容的 static/http.js 文件:

  1. import { isAuthenticated } from './auth.js' 
  2.  
  3. async function handleResponse(res) { 
  4.     const body = await res.clone().json().catch(() => res.text()) 
  5.  
  6.     if (res.status === 401) { 
  7.         localStorage.removeItem('auth_user'
  8.         localStorage.removeItem('token'
  9.         localStorage.removeItem('expires_at'
  10.     } 
  11.  
  12.     if (!res.ok) { 
  13.         const message = typeof body === 'object' && body !== null && 'message' in body 
  14.             ? body.message 
  15.             : typeof body === 'string' && body !== '' 
  16.                 ? body 
  17.                 : res.statusText 
  18.         throw Object.assign(new Error(message), { 
  19.             url: res.url, 
  20.             statusCode: res.status, 
  21.             statusText: res.statusText, 
  22.             headers: res.headers, 
  23.             body, 
  24.         }) 
  25.     } 
  26.  
  27.     return body 
  28.  
  29. function getAuthHeader() { 
  30.     return isAuthenticated() 
  31.         ? { authorization: `Bearer ${localStorage.getItem('token')}` } 
  32.         : {} 
  33.  
  34. export default { 
  35.     get(url, headers) { 
  36.         return fetch(url, { 
  37.             headers: Object.assign(getAuthHeader(), headers), 
  38.         }).then(handleResponse) 
  39.     }, 
  40.  
  41.     post(url, body, headers) { 
  42.         const init = { 
  43.             method: 'POST'
  44.             headers: getAuthHeader(), 
  45.         } 
  46.         if (typeof body === 'object' && body !== null) { 
  47.             init.body = JSON.stringify(body) 
  48.             init.headers['content-type'] = 'application/json; charset=utf-8' 
  49.         } 
  50.         Object.assign(init.headers, headers) 
  51.         return fetch(url, init).then(handleResponse) 
  52.     }, 
  53.  
  54.     subscribe(url, callback) { 
  55.         const urlWithToken = new URL(url, location.origin) 
  56.         if (isAuthenticated()) { 
  57.             urlWithToken.searchParams.set('token', localStorage.getItem('token')) 
  58.         } 
  59.         const eventSource = new EventSource(urlWithToken.toString()) 
  60.         eventSource.onmessage = ev => { 
  61.             let data 
  62.             try { 
  63.                 data = JSON.parse(ev.data) 
  64.             } catch (err) { 
  65.                 console.error('could not parse message data as JSON:', err) 
  66.                 return 
  67.             } 
  68.             callback(data) 
  69.         } 
  70.         const unsubscribe = () => { 
  71.             eventSource.close() 
  72.         } 
  73.         return unsubscribe 
  74.     }, 

這個(gè)模塊是 fetch 和 EventSource API 的包裝器。最重要的部分是它將 JSON web 令牌添加到請(qǐng)求中。

Home 頁(yè)面

 

home page screenshot

因此,當(dāng)用戶(hù)登錄時(shí),將顯示 home 頁(yè)。 創(chuàng)建一個(gè)具有以下內(nèi)容的 static/pages/home-page.js 文件:

  1. import { getAuthUser } from '../auth.js' 
  2. import { avatar } from '../shared.js' 
  3.  
  4. export default function homePage() { 
  5.     const authUser = getAuthUser() 
  6.     const template = document.createElement('template'
  7.     template.innerHTML = ` 
  8.         <div> 
  9.             <div> 
  10.                 ${avatar(authUser)} 
  11.                 <span>${authUser.username}</span> 
  12.             </div> 
  13.             <button id="logout-button">Logout</button> 
  14.         </div> 
  15.         <!-- conversation form here --> 
  16.         <!-- conversation list here --> 
  17.     ` 
  18.     const page = template.content 
  19.     page.getElementById('logout-button').onclick = onLogoutClick 
  20.     return page 
  21.  
  22. function onLogoutClick() { 
  23.     localStorage.clear() 
  24.     location.reload() 

對(duì)于這篇文章,這是我們?cè)?nbsp;home 頁(yè)上呈現(xiàn)的唯一內(nèi)容。我們顯示當(dāng)前經(jīng)過(guò)身份驗(yàn)證的用戶(hù)和注銷(xiāo)按鈕。

當(dāng)用戶(hù)單擊注銷(xiāo)時(shí),我們清除 localStorage 中的所有內(nèi)容并重新加載頁(yè)面。

Avatar

那個(gè) avatar() 函數(shù)用于顯示用戶(hù)的頭像。 由于已在多個(gè)地方使用,因此我將它移到 shared.js 文件中。 創(chuàng)建具有以下內(nèi)容的文件 static/shared.js

  1. export function avatar(user) { 
  2.     return user.avatarUrl === null 
  3.         ? `<figure class="avatar" data-initial="${user.username[0]}"></figure>` 
  4.         : `<img class="avatar" src="${user.avatarUrl}" alt="${user.username}'s avatar">` 

如果頭像網(wǎng)址為 null,我們將使用用戶(hù)的姓名首字母作為初始頭像。

你可以使用 attr() 函數(shù)顯示帶有少量 CSS 樣式的首字母。

  1. .avatar[data-initial]::after { 
  2.     content: attr(data-initial); 

僅開(kāi)發(fā)使用的登錄

 

access page with login form screenshot

在上一篇文章中,我們?yōu)榫帉?xiě)了一個(gè)登錄代碼。讓我們?cè)?nbsp;access 頁(yè)面中為此添加一個(gè)表單。 進(jìn)入 static/ages/access-page.js,稍微修改一下。

  1. import http from '../http.js' 
  2.  
  3. const template = document.createElement('template'
  4. template.innerHTML = ` 
  5.     <h1>Messenger</h1> 
  6.     <form id="login-form"
  7.         <input type="text" placeholder="Username" required> 
  8.         <button>Login</button> 
  9.     </form> 
  10.     <a href="/api/oauth/github" onclick="event.stopPropagation()">Access with GitHub</a> 
  11.  
  12. export default function accessPage() { 
  13.     const page = template.content.cloneNode(true
  14.     page.getElementById('login-form').onsubmit = onLoginSubmit 
  15.     return page 
  16.  
  17. async function onLoginSubmit(ev) { 
  18.     ev.preventDefault() 
  19.  
  20.     const form = ev.currentTarget 
  21.     const input = form.querySelector('input'
  22.     const submitButton = form.querySelector('button'
  23.  
  24.     input.disabled = true 
  25.     submitButton.disabled = true 
  26.  
  27.     try { 
  28.         const payload = await login(input.value) 
  29.         input.value = '' 
  30.  
  31.         localStorage.setItem('auth_user', JSON.stringify(payload.authUser)) 
  32.         localStorage.setItem('token', payload.token) 
  33.         localStorage.setItem('expires_at', payload.expiresAt) 
  34.  
  35.         location.reload() 
  36.     } catch (err) { 
  37.         alert(err.message) 
  38.         setTimeout(() => { 
  39.             input.focus() 
  40.         }, 0) 
  41.     } finally { 
  42.         input.disabled = false 
  43.         submitButton.disabled = false 
  44.     } 
  45.  
  46. function login(username) { 
  47.     return http.post('/api/login', { username }) 

我添加了一個(gè)登錄表單。當(dāng)用戶(hù)提交表單時(shí)。它使用用戶(hù)名對(duì) /api/login 進(jìn)行 POST 請(qǐng)求。將所有數(shù)據(jù)保存到 localStorage 并重新加載頁(yè)面。

記住在前端完成后刪除此表單。


這就是這篇文章的全部?jī)?nèi)容。在下一篇文章中,我們將繼續(xù)使用主頁(yè)添加一個(gè)表單來(lái)開(kāi)始對(duì)話,并顯示包含最新對(duì)話的列表。

 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2020-10-16 14:40:20

即時(shí)消息Home頁(yè)面編程語(yǔ)言

2020-10-19 16:20:38

即時(shí)消息Conversatio編程語(yǔ)言

2020-10-09 12:45:19

創(chuàng)建消息即時(shí)消息編程語(yǔ)言

2019-09-29 15:25:13

CockroachDBGoJavaScript

2020-10-09 15:00:56

實(shí)時(shí)消息編程語(yǔ)言

2020-03-31 12:21:20

JSON即時(shí)消息編程語(yǔ)言

2019-10-28 20:12:40

OAuthGuard中間件編程語(yǔ)言

2020-10-10 20:51:10

即時(shí)消息編程語(yǔ)言

2021-03-25 08:29:33

SpringBootWebSocket即時(shí)消息

2023-08-14 08:01:12

websocket8g用戶(hù)

2025-06-30 01:45:00

Netty輪詢(xún)HTTP 協(xié)議

2015-03-18 15:37:19

社交APP場(chǎng)景

2021-04-03 12:31:48

Python開(kāi)發(fā)數(shù)據(jù)科學(xué)

2014-10-15 11:01:02

Web應(yīng)用測(cè)試應(yīng)用

2018-08-22 17:32:45

2023-09-21 08:00:00

ChatGPT編程工具

2022-02-10 07:03:32

流量應(yīng)用架構(gòu)數(shù)據(jù)交換

2021-07-14 17:39:46

ReactRails API前端組件

2021-12-03 00:02:01

通訊工具即時(shí)

2023-09-15 10:10:05

R 語(yǔ)言
點(diǎn)贊
收藏

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

国产成人免费av一区二区午夜| 动漫av一区二区三区| 成人在线电影在线观看视频| 欧美日韩精品欧美日韩精品一| 一区二区成人国产精品 | 亚洲性图自拍| 91亚洲资源网| 91久久久久久久久久| 日本免费在线播放| 国产高清欧美| 日韩电影中文 亚洲精品乱码| 日本肉体xxxx裸体xxx免费| 高h视频在线播放| 中文一区一区三区高中清不卡| www.久久久| 影音先锋国产资源| 国产精品久久久久毛片大屁完整版| 最近2019免费中文字幕视频三| 日韩av无码一区二区三区不卡 | 人妻精品久久久久中文字幕| 亚洲ww精品| 色狠狠av一区二区三区| www.国产在线播放| 爆操欧美美女| 国产三级三级三级精品8ⅰ区| 成人av资源| 国产乱码精品一区二区三区精东| 亚洲欧美日韩国产一区| 久久综合九色九九| 美女av免费看| 欧美极品在线观看| 亚洲精品久久久久国产| a级大片免费看| 99久久999| 欧美色综合影院| 92看片淫黄大片一级| 国产激情在线播放| 亚洲国产视频网站| 人妻激情另类乱人伦人妻| 日韩av中文| 中国av一区二区三区| 欧美激情第六页| 免费观看黄一级视频| 国产精品亚洲人在线观看| 91网站在线免费观看| 在线视频 91| 久久精品国产久精国产爱| 日韩av电影手机在线观看| 久久露脸国语精品国产91| 欧美三级特黄| 九九热最新视频//这里只有精品 | 蜜臀视频在线观看| 日韩成人18| 日韩视频一区二区三区| 操人视频免费看| 国产免费av国片精品草莓男男| 7777精品伊人久久久大香线蕉超级流畅| 韩国日本美国免费毛片| 羞羞影院欧美| 欧美日韩高清一区| 成人综合久久网| 麻豆一区在线| 日韩精品一区二区三区中文不卡 | 亚洲精品国产成人久久av盗摄 | 亚洲插插视频| 一本到高清视频免费精品| 国产又黄又猛视频| 欧美视频精品| 欧美白人最猛性xxxxx69交| 亚洲av成人精品一区二区三区| 色狼人综合干| 中文欧美日本在线资源| 99鲁鲁精品一区二区三区| 欧美日韩久久| 琪琪亚洲精品午夜在线| 黄色网址中文字幕| 激情六月婷婷综合| 国产视频在线观看一区| 久久久资源网| 中文字幕日韩欧美一区二区三区| 久久天天东北熟女毛茸茸| 欧美videossex另类| 婷婷激情综合网| 一区二区在线播放视频| 国产日韩一区二区三免费高清| 亚洲的天堂在线中文字幕| 免费看污片网站| 91久久国产| 97视频在线观看视频免费视频 | 在线观看视频二区| 国产很黄免费观看久久| 麻豆91蜜桃| 2021国产在线| 色噜噜久久综合| 欧美xxxx黑人| 欧美美乳视频| 久久久久久国产三级电影| 中文字幕第四页| 国产一区二区伦理| 欧洲在线视频一区| 久草在线新免费首页资源站| 在线看日本不卡| 久久国产免费视频| 日韩88av| 57pao国产精品一区| 国产色视频在线| 国产欧美精品一区aⅴ影院 | 97精品在线播放| aa国产精品| 亚洲bt天天射| 97在线观看免费观看高清| 亚洲成在人线免费| 日韩成人av免费| 俺要去色综合狠狠| 欧美影院久久久| 亚洲经典一区二区| 成人免费在线视频观看| 久久午夜夜伦鲁鲁一区二区| 色狠狠久久av综合| 国内成人精品一区| jizz中国少妇| 欧美日韩黑人| 一区二区三区视频在线观看| 久久久久久香蕉| 日韩理论电影中文字幕| 欧美激情精品久久久久久久变态 | 婷婷在线精品视频| 日本欧美在线观看| 欧美日韩精品久久| 麻豆成全视频免费观看在线看| 日韩视频免费观看高清完整版在线观看| 男女做爰猛烈刺激| 麻豆九一精品爱看视频在线观看免费| 波多野结衣久草一区| 巨大荫蒂视频欧美另类大| 在线观看视频一区二区欧美日韩| 一本色道综合久久欧美日韩精品 | 亚洲欧洲另类国产综合| 黄色片在线免费| 国产一区二区观看| 日韩美女激情视频| 青青草免费在线| 狠狠色噜噜狠狠狠狠97| 色婷婷免费视频| 99精品国产在热久久婷婷| αv一区二区三区| 黄污视频在线观看| 欧美精品一区二区三区在线播放| 妺妺窝人体色www聚色窝仙踪| 激情久久五月天| 影音先锋欧美在线| 成人网av.com/| 欧美成人sm免费视频| 在线免费观看一级片| 中文字幕巨乱亚洲| 最新天堂中文在线| 成人3d动漫在线观看| 国产精品18久久久久久麻辣| 亚洲美免无码中文字幕在线| 台湾佬中文娱乐网欧美电影| 亚洲精品美女久久久久| 国产黄色片免费看| 久久久久久久免费视频了| 欧美激情成人网| 国产乱码精品一区二区三区四区| 欧美综合国产精品久久丁香| 亚洲欧洲成人在线| 色欧美88888久久久久久影院| 性欧美13一14内谢| 日韩国产欧美在线观看| 一区二区三区偷拍| 亚洲日本va午夜在线电影| 欧美高清视频在线| 婷婷亚洲一区二区三区| 日本道精品一区二区三区| www.黄色com| 国产福利一区二区| 免费看一级大黄情大片| 九九免费精品视频在线观看| 国产精品av电影| 黄色大片在线播放| 精品久久久久久久一区二区蜜臀| 国产一二三四在线| 久久久影院官网| 少妇网站在线观看| 欧美精选一区| 你懂的网址一区二区三区| 亚洲综合在线电影| 九九热精品视频在线播放| 免费a级毛片在线观看| 欧美精品第1页| 精品国产乱码一区二区| 国产精品传媒视频| 中文字幕 日本| 久草中文综合在线| 欧美色图另类小说| 91超碰国产精品| 久草精品电影| 国产精品成人3p一区二区三区| 国产资源精品在线观看| 日本xxx免费| 亚洲国产合集| 成人国产1314www色视频| 少妇一区视频| 久久久免费精品| 日p在线观看| 亚洲视频日韩精品| 亚洲第一页视频| 欧美日韩一区二区欧美激情| 久久精品亚洲无码| 中文字幕中文字幕中文字幕亚洲无线| 日本精品一二三| 日本在线不卡视频| 日韩网站在线免费观看| 欧美电影免费播放| 欧美欧美一区二区| 精品国产影院| 成人免费网站在线| 日韩和的一区二在线| 久久久亚洲成人| 天天影视久久综合| 国产一区二区成人| 欧美美女搞黄| 亚洲第一中文字幕在线观看| 精品国产无码一区二区三区| 欧美中文字幕一二三区视频| 偷偷操不一样的久久| 亚洲精品福利视频网站| 色撸撸在线视频| 国产婷婷色一区二区三区四区| 中文字幕天堂网| 狠狠狠色丁香婷婷综合激情| 爆乳熟妇一区二区三区霸乳| 久久成人精品| 18岁网站在线观看| 亚洲人成免费| 男人添女荫道口图片| 国产精品www994| 无码人妻精品一区二区三区99v| blacked蜜桃精品一区| 蜜桃麻豆91| 欧美美女在线直播| 国产精品视频免费一区二区三区| 亚洲一区二区av| 国产欧美在线看| 高清在线一区| 国产精品旅馆在线| 久久精品国产亚洲av高清色欲 | 久久人人爽人人爽人人片av高请 | 97中文字幕在线观看| 国产美女娇喘av呻吟久久| 污免费在线观看| 粉嫩嫩av羞羞动漫久久久| 91视频免费入口| 丁香五精品蜜臀久久久久99网站 | 久久免费午夜影院| 波多野结衣 在线| 国产日韩欧美精品综合| 色欲狠狠躁天天躁无码中文字幕| 国产视频一区二区在线观看| 在线观看免费黄色网址| 亚洲视频免费在线观看| 免费一级特黄特色大片| 五月婷婷激情综合| 在线精品免费视| 欧美三级在线视频| 国产男女猛烈无遮挡| 日韩欧美国产1| 五月激情丁香婷婷| 一区二区在线视频播放| 好了av在线| 97久久久久久| 精品乱码一区二区三区四区| 北条麻妃高清一区| 国产欧美一区二区三区精品观看 | 国产精品一区二区欧美| 三级精品视频| 中文字幕免费在线不卡| 亚洲成色精品| 另类小说色综合| 国产黄人亚洲片| 国产精品久久久久无码av色戒| 中文字幕成人av| 久久在线视频精品| 在线观看av一区| wwwxxxx国产| 亚洲视屏在线播放| 在线黄色网页| 国产精品69精品一区二区三区| 成人在线视频www| 女同一区二区| 欧美激情四色| 可以免费在线看黄的网站| 狠狠色狠狠色合久久伊人| 国产又黄又粗又猛又爽的视频 | 中文成人激情娱乐网| 国产伦精品一区二区三区四区免费| 日韩影视在线观看| 日本xxxxx18| 日本不卡中文字幕| a天堂视频在线观看| 国产精品福利影院| yjizz国产| 精品国产成人在线影院| 国产露出视频在线观看| 欧美激情极品视频| 91精品国产一区二区在线观看| 六月婷婷久久| 女人色偷偷aa久久天堂| 天天影视综合色| 97aⅴ精品视频一二三区| 永久久久久久久| 欧美日本高清视频在线观看| 青青草视频在线观看| 欧美激情第三页| 免费观看在线一区二区三区| 日韩片电影在线免费观看| 日韩亚洲在线| 韩国av中国字幕| 亚洲精品国产精品乱码不99 | 亚洲国产精品福利| 91高清在线观看视频| 国产免费一区二区三区在线能观看| 全国精品免费看| 国产黄色激情视频| 国产毛片精品国产一区二区三区| 久久久久99精品成人| 色国产综合视频| 黄色片在线免费看| 日本精品性网站在线观看| 欧美尿孔扩张虐视频| www.xxx麻豆| 国产aⅴ综合色| 久久综合加勒比| 日韩三级精品电影久久久| 日本精品一区二区三区在线播放| 国产精品第8页| 国产永久精品大片wwwapp| 人妻精品无码一区二区三区| 99国产精品国产精品毛片| 色播视频在线播放| 亚洲精品久久久久国产| 涩涩涩在线视频| 狼狼综合久久久久综合网| 香蕉成人久久| 90岁老太婆乱淫| 欧美亚洲一区二区三区四区| 番号集在线观看| 国产一区视频在线| 91成人看片| 日本特黄在线观看| 亚洲一区二区五区| 亚洲aaa在线观看| 17婷婷久久www| 国产欧美日韩精品一区二区免费| 五月婷婷深爱五月| 亚洲日本青草视频在线怡红院 | 精品亚洲国产成av人片传媒| 九色porny自拍视频在线播放| 精品日本一区二区三区在线观看 | 九九九九九九九九| 一区二区三区美女视频| 韩国av在线免费观看| 欧美性在线视频| 欧洲激情视频| 又黄又爽又色的视频| 亚洲成av人片| 可以在线观看的av| 91免费国产网站| 亚洲精品在线二区| 一级肉体全黄裸片| 欧美一区二区性放荡片| tube8在线hd| 天堂社区 天堂综合网 天堂资源最新版 | 成人中文字幕视频| 成年人视频网站免费观看| 国产精品午夜在线| 免费看av毛片| 国产a级全部精品| 91精品国产91久久久久久黑人| 99re这里只有| 欧美日韩国产影片| 97蜜桃久久| 中文字幕一区二区三区有限公司 | 成年人一级黄色片| 亚洲精品国精品久久99热| 欧美激情不卡| 日韩一级性生活片| 亚洲国产精品精华液ab| 午夜精品久久久久久久99热黄桃 | 久久精品2019中文字幕| 国产精品香蕉| 超碰成人在线播放| 岛国av在线不卡| gogo在线观看| 清纯唯美一区二区三区| 国产成人在线网站| 亚洲免费视频二区| 91精品国产网站| 欧美1区免费|