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

Vue3 中如何加載動態菜單?

開發 前端
當前端收到后端返回來的菜單 JSON 之后,該如何將之渲染出來?這就是我們目前所面臨的問題了。

之前寫了兩篇文章和大家分享了 TienChin 項目中的菜單數據問題,還沒看過的小伙伴請戳這里:

這兩篇文章主要是和大家說明了后端如何根據當前登錄用戶,動態生成一個菜單 JSON。

那么現在的問題就是,當前端收到后端返回來的菜單 JSON 之后,該如何將之渲染出來?這就是我們目前所面臨的問題了。

TienChin 項目基于 RuoYi 腳手架來完成,所以本文的分析你也可以看作是對 RuoYi-Vue3 項目的分析。

一、整體思路

首先我們來梳理下整體上的實現思路,首先一點:整體思路和 vhr 一模一樣。

考慮到有的小伙伴可能已經忘記 vhr 中前端動態菜單的實現思路了,因此本文再和大家分析一下。

為了確保在所有的 .vue 文件中都能訪問到到菜單數據,所以選擇將菜單數據存入 vuex 中,vuex 是 vue 中一個存儲數據的公共地方,所有的 .vue 文件都可以從 vuex 中讀取到數據。存儲在 vuex 中的數據本質上是存在內存中,所以它有一個特點,就是瀏覽器按 F5 刷新之后,數據就沒了。所以在發生頁面的跳轉的時候,我們應該去區分一下,是用戶點擊了頁面上的菜單按鈕之后發生了頁面跳轉還是用戶點擊了瀏覽器刷新按鈕(或者按了 F5)發生了跳轉。

為了實現這一點,我們需要用到 vue 中的路由導航守衛功能,對于我們 Java 工程師而言,這些可能聽起來有點陌生,但是你把它當作 Java 中的 Filter 來看待就好理解了,實際上我們視頻中和小伙伴們講解的時候就是這么類比的,將一個新事物跟我們腦海中一個已有的熟悉的事物進行類比,就很容易理解了。

vue 中的導航守衛就類似一個監控,它可以監控到所有的頁面跳轉,在頁面跳轉中,我們可以去判斷一下 vuex 中的菜單數據是否還在,如果還在,就說明用戶是點擊了頁面上的菜單按鈕完成了跳轉的,如果不在,就說明用戶是點擊了瀏覽器的刷新按鈕或者是按了 F5 進行頁面刷新的,此時我們就要趕緊去服務端重新加載一下菜單數據。

整體上的實現思路就是這樣,接下來我們來看看一些具體的實現細節。

二、實現細節

1. 加載細節

首先我們來看看加載的細節。

小伙伴們知道,單頁面項目的入口是 main.js,路由加載的內容在 src/permission.js 文件中,該文件在 main.js 中被引入,src/permission.js 中的前置導航守衛內容如下:

router.beforeEach((to, from, next) => {
NProgress.start()
if (getToken()) {
to.meta.title && useSettingsStore().setTitle(to.meta.title)
/* has token*/
if (to.path === '/login') {
next({ path: '/' })
NProgress.done()
} else {
if (useUserStore().roles.length === 0) {
isRelogin.show = true
// 判斷當前用戶是否已拉取完user_info信息
useUserStore().getInfo().then(() => {
isRelogin.show = false
usePermissionStore().generateRoutes().then(accessRoutes => {
// 根據roles權限生成可訪問的路由表
accessRoutes.forEach(route => {
if (!isHttp(route.path)) {
router.addRoute(route) // 動態添加可訪問路由表
}
})
next({ ...to, replace: true }) // hack方法 確保addRoutes已完成
})
}).catch(err => {
useUserStore().logOut().then(() => {
ElMessage.error(err)
next({ path: '/' })
})
})
} else {
next()
}
}
} else {
// 沒有token
if (whiteList.indexOf(to.path) !== -1) {
// 在免登錄白名單,直接進入
next()
} else {
next(`/login?redirect=${to.fullPath}`) // 否則全部重定向到登錄頁
NProgress.done()
}
}
})

我跟大家捋一下這個前置導航守衛中的思路:

(1) 首先調用 getToken 方法,這個方法實際上是去 Cookie 中拿認證 Token,也就是登錄成功后后端返回給前端的那個 JWT 字符串。

(2) 如果 getToken 方法有返回值,說明用戶已經登錄了,那么進入到 if 分支中,如果 getToken 沒拿到值,說明用戶未登錄,未登錄的話,又分為兩種情況:i:訪問的目標地址處于免登錄白名單中,那么此時直接訪問即可;ii:訪問的目標地址不在白名單中,那么此時就跳轉到登錄頁面去,跳轉的時候同時攜帶一個 redirect 參數,這樣方便在登錄成功之后,再跳轉回訪問的目標頁面。這個免登錄訪問的白名單,是一個在 src/permission.js 文件中定義的變量,默認有四個路徑,分別是['/login', '/auth-redirect', '/bind', '/register']。

(3) 如果 getToken 拿到了值,說明用戶已經登錄了,此時又分情況:如果用戶訪問的路徑是登錄頁面,那么就給他重定向到項目首頁(也就是在已經登錄的情況下,不允許用戶再次訪問登錄頁面);如果用戶訪問的路徑不是登錄頁面,那么首先判斷 vuex 中的 roles 是否還有值?如果有值,說明當前就是用戶點擊了一個菜單按鈕進行跳轉的,那么直接跳轉就行了;如果沒有值,說明用戶是按了瀏覽器的刷新按鈕或者是 F5 按鈕刷新進行的頁面跳轉,那么此時首先調用 getInfo 方法(位于 src/store/modules/user.js 文件中)去服務端重新加載當前用戶的基本信息、角色信息以及權限信息,然后再調用 generateRoutes 方法(位于 src/store/modules/permission.js 文件中)去服務端加載路由信息,并將加載到的路由信息放入到 router 對象中(前提是這個路由對象不是一個 http 鏈接,就是普通的路由地址)。

這就是動態路由的加載整體思路。

在第三步驟中,涉及到兩個方法,一個是 getInfo 還有一個 generateRoutes,這兩個方法也都比較關鍵,我們再來稍微看下。

2. getInfo

首先這個加載用戶信息的方法位于 src/store/modules/user.js 文件中,換言之,這些用戶的基本信息加載到之后,是存儲在 vuex 中的,如果刷新瀏覽器這些數據就會丟失:

getInfo() {
return new Promise((resolve, reject) => {
getInfo().then(res => {
const user = res.user
const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar;
if (res.roles && res.roles.length > 0) { // 驗證返回的roles是否是一個非空數組
this.roles = res.roles
this.permissions = res.permissions
} else {
this.roles = ['ROLE_DEFAULT']
}
this.name = user.userName
this.avatar = avatar;
resolve(res)
}).catch(error => {
reject(error)
})
})
},

方法的邏輯其實倒沒啥好說的,結合服務端返回的 JSON 格式,應該就很好理解了(部分 JSON):

{
"permissions":[
"*:*:*"
],
"roles":[
"admin"
],
"user":
"userName":"admin",
"nickName":"TienChin健身",
"avatar":"",
}
}

另外再強調下,之前在 vhr 中,我們是將請求封裝成了一個 api.js 文件,里邊有常用的 get、post、put 以及 delete 請求等,然后在需要使用的地方,直接去調用這些方法發送請求即可,但是在 TienChin 中,腳手架的封裝是將所有的請求都提前統一封裝好,在需要的時候直接調用封裝好的方法,連請求地址都不用傳遞了(封裝的時候就已經寫死了),所以小伙伴們看上面的 getInfo 方法只有方法調用,沒有傳遞路徑參數等。

3. generateRoutes

generateRoutes 方法則位于 src/store/modules/permission.js 文件中,這里值得說道的地方就比較多了:

generateRoutes(roles) {
return new Promise(resolve => {
// 向后端請求路由數據
getRouters().then(res => {
const sdata = JSON.parse(JSON.stringify(res.data))
const rdata = JSON.parse(JSON.stringify(res.data))
const defaultData = JSON.parse(JSON.stringify(res.data))
const sidebarRoutes = filterAsyncRouter(sdata)
const rewriteRoutes = filterAsyncRouter(rdata, false, true)
const defaultRoutes = filterAsyncRouter(defaultData)
const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
asyncRoutes.forEach(route => { router.addRoute(route) })
this.setRoutes(rewriteRoutes)
this.setSidebarRouters(constantRoutes.concat(sidebarRoutes))
this.setDefaultRoutes(sidebarRoutes)
this.setTopbarRoutes(defaultRoutes)
resolve(rewriteRoutes)
})
})
}

首先大家看到,服務端返回的動態菜單數據解析了三次,分別拿到了三個對象,這三個對象都是將來要用的,只不過使用的場景不同,下面結合頁面的顯示跟大家細說。

(1) 首先是調用 filterAsyncRouter 方法,這個方法的核心作用就是將服務端返回的 component 組件動態加載為一個 component 對象。不過這個方法在調用的過程中,后面還有兩個參數,第二個是 lastRouter 在該方法中并無實質性作用;第三個參數則主要是說是否需要對 children 的 path 進行重寫。小伙伴們知道,服務端返回的動態菜單的 path 屬性都是只有一層的,例如一級菜單系統管理的 path 是 system,二級菜單用戶管理的 path 則是 user,那么用戶管理最終訪問的 path 就是system/path,如果第三個參數為 true,則會進行 path 的重寫,將 path 最終設置正確。

(2) 所以這里的 sidebarRoutes 和 defaultRoutes 只是能用于菜單渲染(因為這兩個里邊的菜單 path 不對),而最終的頁面跳轉要通過 rewriteRoutes 才可以實現。

(3) 除了服務端返回的動態菜單,前端本身也定義了一些基礎菜單,前端的基礎菜單分為兩大類,分別是 constantRoutes 和 dynamicRoutes,其中 constantRoutes 是固定菜單,也就是一些跟用戶權限無關的菜單,例如 404 頁面、首頁等;dynamicRoutes 是動態菜單,也就是也根據用戶權限來決定是否展示的菜單,例如分配用戶、字典數據、調度日志等等。

(4) filterDynamicRoutes 方法則是將前端提前定義好的 dynamicRoutes 菜單進行過濾,找出那些符合當前用戶權限的菜單將之添加到路由中(這些菜單都不需要在菜單欄渲染出來)。

(5) 接下來涉及到四個不同的保存路由數據的變量,分別是 routes、addRoutes(經松哥分析,這個變量并無實際作用,可以刪除之)、defaultRoutes、topbarRouters 以及 sidebarRouters,四個路由變量的作用各有不同:

routes:

routes 中保存的是 constantRoutes 以及服務端返回的動態路由數據,并且這個動態路由數據中的 path 已經完成了重寫,所以這個 routes 主要用在兩個地方:

(1) 首頁的搜索上:首頁的搜索也可以按照路徑去搜索,所以需要用到這個 routes,如下圖:

圖片

(2) 用在 TagsView,這個地方也需要根據頁面渲染不同的菜單,也是用的 routes:

圖片

sidebarRouters:

這個就是大家所熟知的側邊欄菜單了,具體展示是 constantRoutes+服務端返回的菜單,不過這些 constantRoutes 基本上 hidden 屬性都是 false,渲染的時候是不會被渲染出來的。

圖片

topbarRouters:

這個是用在 TopNav 組件中,這個是將系統的一級菜單在頭部顯示出來的,如下圖:

圖片

一級菜單在頂部顯示,左邊顯示的都是二級三級菜單,那么頂部菜單的渲染,用的就是這個 topbarRouters。

defaultRoutes:

想要開啟頂部菜單,需要在 src/layout/components/Settings/index.vue 組件中設置,如下圖:

圖片

開啟頂部菜單之后,點擊頂部菜單,左邊菜單欄會跟著切換,此時就是從 defaultRoutes 中遍歷出相關的菜單設置給 sidebarRouters。

好了,這就是這四個 routes 變量的作用,老實說,腳手架中這塊的代碼設計有點混亂,沒必要搞這么多變量,等松哥抽空給大家優化下。

generateRoutes 方法最終會返回 rewriteRoutes 變量到前面說的那個前置導航守衛中,最終前置導航守衛將數據添加到 router 中。

菜單的渲染都是在 src/layout/components/Sidebar/index.vue 中完成的,看了下都是常規操作,沒啥好說的。

責任編輯:趙寧寧 來源: 江南一點雨
相關推薦

2024-01-08 08:50:19

Vue3級聯菜單數據懶加載

2023-11-28 09:03:59

Vue.jsJavaScript

2024-08-07 10:16:00

2021-12-02 05:50:35

Vue3 插件Vue應用

2021-12-01 08:11:44

Vue3 插件Vue應用

2024-03-13 08:37:18

Vue3Suspense異步組件

2021-12-08 09:09:33

Vue 3 Computed Vue2

2021-11-30 08:19:43

Vue3 插件Vue應用

2022-07-14 10:38:39

動態標簽Spring

2024-11-06 10:16:22

2025-10-24 10:47:25

Vue3前端插槽

2020-09-19 21:15:26

Composition

2024-02-01 09:10:04

頁面引導工具Vue3

2022-07-08 08:52:25

Vue3組合動態返回

2024-08-12 08:33:05

2024-06-20 12:17:17

前端Vue3

2025-10-17 07:10:00

前端開發Vue

2025-11-19 08:23:42

2024-03-21 08:34:49

Vue3WebSocketHTTP

2023-12-11 07:34:37

Computed計算屬性Vue3
點贊
收藏

51CTO技術棧公眾號

一本一道波多野毛片中文在线| jizz国产在线观看| 国产成人高清精品免费5388| 欧美日韩国产精品| 亚洲欧美精品在线观看| 国产成人精品一区二三区四区五区 | www.综合网.com| 久久久亚洲欧洲日产国码αv| 成人免费看黄网站| 成人在线免费看视频| 久久精品国产亚洲夜色av网站| 日韩一二在线观看| 日韩有码免费视频| xxxx在线视频| 综合欧美亚洲日本| 欧美重口乱码一区二区| 国产成人精品亚洲精品色欲| 日本最新不卡在线| 97视频在线观看成人| 任我爽在线视频| 亚洲区小说区图片区qvod| 日韩无一区二区| 一区二区三区网址| 成人香蕉视频| 午夜免费久久看| av中文字幕av| 免费av在线网站| 国产情人综合久久777777| 国产精品区二区三区日本| 波多野结衣日韩| 久久久久久婷| 国内精品久久影院| 久久久久久久久艹| 欧美激情麻豆| 日日狠狠久久偷偷四色综合免费| 最近中文字幕免费| 亚洲福利天堂| 精品亚洲精品福利线在观看| 国产精品麻豆入口| 黄色美女久久久| 欧美变态口味重另类| 国产农村妇女精品久久| 欧洲亚洲精品| 欧美高清你懂得| 天天操狠狠操夜夜操| 国产一区二区三区四区五区3d | 97在线播放免费观看| 日韩福利视频导航| 日本不卡高字幕在线2019| 欧美日韩综合在线观看| 国产午夜精品一区二区三区欧美 | 中文字幕av一区二区| 久久精品无码一区| 国产一区二区三区91| 亚洲人成在线观| 手机免费看av| 国产精品久久久久一区二区三区厕所| 色视频www在线播放国产成人| 国产三级在线观看完整版| 精品视频99| 爽爽爽爽爽爽爽成人免费观看| 亚洲天堂av中文字幕| 99热国内精品永久免费观看| 久久精品国产电影| 久久久久久天堂| 亚洲精品三级| 国产高清在线不卡| 国产有码在线观看| 国产盗摄一区二区三区| 精品乱码一区二区三区| 欧美老女人性开放| 日本一区二区三区高清不卡| 亚欧洲精品在线视频免费观看| 日韩精品毛片| 亚洲一级电影视频| 熟妇人妻va精品中文字幕 | 潘金莲一级黄色片| 欧美久久久久| 清纯唯美日韩制服另类| 中文字幕无线码一区| 国产老肥熟一区二区三区| 精品欧美一区二区精品久久| 国产三级在线| 亚洲乱码国产乱码精品精的特点 | 超碰aⅴ人人做人人爽欧美| 在线免费观看日本一区| 97超碰人人看| 久久不见久久见中文字幕免费 | 亚洲一区二区黄| 黄色录像二级片| 国产九九精品| 亚洲字幕一区二区| 男人天堂网在线观看| 亚洲天堂久久久久久久| 成人免费毛片网| 99re8精品视频在线观看| 亚洲激情在线视频| 日韩在线一卡二卡| 午夜一区在线| 999热视频| av在线播放免费| 亚洲综合图片区| www.激情小说.com| 国产精品调教| 欧美精品在线免费| 国产九色91回来了| 9i在线看片成人免费| 亚洲天堂av免费在线观看| 都市激情亚洲一区| 亚洲丁香婷深爱综合| 五月婷婷综合激情网| 另类av一区二区| 成人三级视频在线观看一区二区| caoporn国产精品免费视频| 香蕉加勒比综合久久| 91丨九色丨蝌蚪| 奇米狠狠一区二区三区| 欧美激情一二三| 国产精品人人爽| 中日韩av电影| 最近免费中文字幕中文高清百度| 激情av综合| 欧美激情精品久久久久久| 国产suv精品一区二区69| 欧美国产激情二区三区| 国产男女无遮挡| 成人爽a毛片免费啪啪红桃视频| 久久久久www| 亚洲一区二区人妻| 欧美激情综合在线| mm1313亚洲国产精品无码试看| 西瓜成人精品人成网站| 97婷婷涩涩精品一区| 高清毛片aaaaaaaaa片| 一区二区三区中文字幕| 成人免费播放视频| 9191国语精品高清在线| 91精品国产综合久久香蕉| 成年在线观看免费人视频| 色94色欧美sute亚洲线路二| av黄色免费网站| 亚洲综合精品四区| 日韩av在线电影观看| 成人看片在线观看| 在线免费看av不卡| 中文字幕人妻精品一区| 国产精品国产馆在线真实露脸 | 久久久精品麻豆| 欧美三级三级| 国产精品无av码在线观看| 中文字幕在线播放| 欧美一级免费观看| 国产一级做a爱免费视频| 成人国产精品免费观看| 国产91在线免费| 欧美日韩中文字幕一区二区三区| 国产成人精品优优av| 亚洲1卡2卡3卡4卡乱码精品| 555夜色666亚洲国产免| 青娱乐av在线| 91香蕉视频污在线| 国产乱子夫妻xx黑人xyx真爽| 国产伦一区二区三区| 国产欧美日韩专区发布| 影院在线观看全集免费观看| 精品国产免费人成在线观看| 免费黄色网址在线| 国产精品麻豆网站| 最新国产精品自拍| 免费亚洲一区| 国产免费色视频| 国产精品对白| 国产精品久久色| 91精品久久| 国产婷婷成人久久av免费高清| 国产成人精品一区二区色戒| 亚洲欧美成人一区二区三区| 无码人妻一区二区三区免费n鬼沢| 一区二区三区国产在线| 亚洲欧美99| 2023国产精华国产精品| 国产91免费观看| 国产精品va在线观看视色| 亚洲国产欧美一区二区三区同亚洲 | 香蕉视频在线免费看| 精品sm在线观看| 最好看的日本字幕mv视频大全 | 久久视频国产精品免费视频在线| 伊人国产在线视频| 2020国产在线视频| 日韩三级中文字幕| 黄色av网站免费| 亚洲一区在线观看网站| av黄色在线免费观看| 国产91精品精华液一区二区三区| 国产精品亚洲a| 欧美国产激情| 亚洲精品人成| 欧美日韩一区二区三区四区不卡 | 欧美精品性视频| 国产51人人成人人人人爽色哟哟| 亚洲精品在线观看网站| 一级片视频免费| 色一情一伦一子一伦一区| 麻豆亚洲av熟女国产一区二| 中文天堂在线一区| 波多野结衣办公室33分钟| 国产精品18久久久久久久网站| 少妇黄色一级片| 国产一区二区高清| 久久这里只有精品18| 亚洲国产精品成人| 日韩中文字幕一区二区| 色天下一区二区三区| 国产a一区二区| 日韩精品成人在线观看| 国产三级精品网站| av亚洲一区二区三区| 欧美亚洲国产另类| 999av小视频在线| 欧美成年人视频| 人人干在线视频| 国产一区二区三区视频免费| 日韩在线无毛| 日韩av在线直播| 深夜福利视频网站| 精品成人一区二区| 亚洲精华国产精华精华液网站| 制服丝袜成人动漫| 国产一区二区小视频| 欧美日韩久久一区| 91精品人妻一区二区三区果冻| 欧美自拍偷拍午夜视频| 国产一区免费看| 欧美中文字幕一二三区视频| 午夜精品一区二| 欧美影片第一页| 一区二区视频免费观看| 欧美日韩一级二级三级| 中文字幕在线2018| 欧美日韩五月天| 国产精品热久久| 日韩欧美激情在线| 国内爆初菊对白视频| 亚洲成人精品av| 天天干天天草天天射| 日韩av有码在线| 韩国三级在线观看久| 色多多国产成人永久免费网站 | 欧美视频在线观看免费| 日产精品久久久| 一本一道久久a久久精品综合蜜臀| 久久青青草原亚洲av无码麻豆| 一本久道中文字幕精品亚洲嫩| 亚洲永久精品一区| 欧美精品日韩一区| a级片在线免费看| 精品国产乱码久久久久久影片| 手机在线精品视频| 亚洲人成电影在线| 在线观看av的网站| 欧美精品在线免费播放| 交100部在线观看| 国产成人精品一区二区| 电影中文字幕一区二区| 国产精品国产一区二区| 一区二区美女| 中文字幕一区二区三区有限公司| 中文字幕免费一区二区| 又粗又黑又大的吊av| 麻豆91在线播放免费| 亚洲精品成人无码毛片| 久久夜色精品一区| 免费中文字幕日韩| 欧美日韩性视频| 91精品人妻一区二区三区果冻| 精品国产乱码久久久久久影片| 精品视频二区| 欧美另类精品xxxx孕妇| 吉吉日韩欧美| 99久久伊人精品影院| 久久av网址| 99国产精品白浆在线观看免费| 日韩精品亚洲专区| 一级黄色大片免费看| 国产午夜精品一区二区三区视频 | 欧美日韩在线视频一区| 91成人国产综合久久精品| 亚洲成色777777在线观看影院| 国产福利电影在线| 欧美激情一区二区三区成人| 成人在线黄色| 精品中文字幕人| 欧美在线播放| 亚洲色图久久久| av爱爱亚洲一区| 欧美日韩精品亚洲精品| 欧美最猛性xxxxx直播| 香蕉视频成人在线| 久久艳片www.17c.com| 欧美色片在线观看| 精品国产一区二区三区免费| 香蕉av一区二区| 99视频在线免费| www.在线成人| 国产盗摄一区二区三区在线| 在线免费观看一区| 日本一本草久在线中文| 久久久久久久久久婷婷| 国产精品一区二区三区av | 国产亚洲精品美女久久久m| 99久久国产综合精品成人影院| 日本一极黄色片| 91亚洲国产成人精品一区二三| 欧美黑吊大战白妞| 欧美一二三四在线| 三级外国片在线观看视频| 国产精品入口日韩视频大尺度| 蜜臀av免费一区二区三区| 国产成人在线免费看| 岛国精品一区二区| 日韩欧美123区| 69成人精品免费视频| 午夜视频在线观看网站| 国产精品视频内| 激情婷婷综合| 中文字幕第21页| 国产欧美一区二区精品忘忧草 | 性xxxxfreexxxxx欧美丶| 国产91免费视频| 狠狠久久婷婷| 精品国产一二区| 亚洲国产成人精品视频| 成人精品在线播放| 久久免费精品日本久久中文字幕| 综合欧美精品| 国产女主播av| 国产成人午夜视频| 久久亚洲AV无码| 亚洲成人av片| 日韩精品av| 欧美一级二级三级| 丝袜美腿高跟呻吟高潮一区| 无码人妻aⅴ一区二区三区69岛| 欧美性猛交xxxx久久久| 极品美乳网红视频免费在线观看| 国产suv精品一区二区三区88区| 精品在线观看入口| 男女啪啪网站视频| 中文字幕一区二区在线观看| 国产又大又长又粗| 欧美日本啪啪无遮挡网站| 97久久综合精品久久久综合| 黄色www网站| 久久久精品蜜桃| 91av久久久| 欧美激情女人20p| 四虎884aa成人精品最新| 国产a级片免费观看| 国产精品久久99| 亚洲精品人妻无码| 5566成人精品视频免费| 欧美日韩久久精品| 深夜做爰性大片蜜桃| 亚洲观看高清完整版在线观看| 日本不卡免费播放| 国产欧美va欧美va香蕉在| 欧美日韩亚洲一区二区三区在线| 污污免费在线观看| 日本韩国精品一区二区在线观看| 五月天婷婷在线视频| 国产精品免费一区二区| 日韩成人精品视频| 五月婷婷一区二区| 亚洲毛片在线观看.| **精品中文字幕一区二区三区| 欧美午夜性视频| 日本一区二区三区视频视频| 国产黄色片网站| 国产成人欧美在线观看| 亚洲一区二区| 国产熟妇久久777777| 91精品国产综合久久香蕉的特点| 蜜桃av在线播放| 自拍偷拍视频在线| 久久影院午夜片一区| 国产免费的av| 欧美一区第一页| 欧美在线三区| 亚洲一二三精品| 亚洲国产另类久久精品| 一区二区三区| 欧美色图另类小说| 一区二区三区在线视频观看| 搞黄视频免费在线观看| 国产伦精品一区二区三区视频免费| 蜜桃视频在线观看一区| 天堂网一区二区三区| 操日韩av在线电影| 欧美午夜精品一区二区三区电影|