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

Vue3 + TypeScript 復(fù)盤總結(jié)

開發(fā) 前端
這篇文章主要記錄一下我在開發(fā)最后一層-設(shè)備管理系統(tǒng)的前端開發(fā)過程中的一些總結(jié)。

 [[401627]]

背景

近期在研發(fā)一套物聯(lián)網(wǎng)設(shè)備管理系統(tǒng),其主要用途是將公司旗下所負(fù)責(zé)智能園區(qū)中的硬件設(shè)備通過物聯(lián)網(wǎng)云平臺(tái)來進(jìn)行綜合管控。

由于這個(gè)產(chǎn)品是實(shí)驗(yàn)性項(xiàng)目,沒有合同,沒有明確收益。所以能夠拿到的資源非常少。

產(chǎn)品具體的負(fù)責(zé)人,只有 1.5 人,幾乎只有我自己。所以既要擔(dān)任產(chǎn)品經(jīng)理,又要擔(dān)任開發(fā)者,還要擔(dān)任運(yùn)維。不過從技術(shù)角度而言,選型可以更加自由。

整個(gè)系統(tǒng)在架構(gòu)上設(shè)計(jì)分為 4 層。自底向上分別是設(shè)備硬件、設(shè)備接入網(wǎng)關(guān)、物聯(lián)網(wǎng)平臺(tái)、設(shè)備管理系統(tǒng)。除去設(shè)備硬件,其它 3 層都屬于軟件范疇。

這篇文章主要記錄一下我在開發(fā)最后一層-設(shè)備管理系統(tǒng)的前端開發(fā)過程中的一些總結(jié)。

前端采用 Vite2.x、Vue3.x、Vuex4.x、VueRouter4.x、TypeScript、Element-Plus 進(jìn)行開發(fā)??梢钥吹剑@些框架和庫(kù)所采用的版本是比較激進(jìn)的,大部分都是最新版本,以及 rc 和 beta 版本。不過從項(xiàng)目開始到寫這篇總結(jié),其中的一些庫(kù)的版本已經(jīng)不是最新的了,不得不感慨前端技術(shù)變化之快。

一個(gè)組件的思考

首先來看一個(gè)組件。

水波紋.gif

這是一個(gè)具有波紋效果、用來表示當(dāng)前 websocket 連接狀態(tài)的小圓點(diǎn)。是一個(gè)非常簡(jiǎn)單的純展示組件。樣式效果使用 css3 變量、動(dòng)畫、和 before、after 偽類實(shí)現(xiàn)。

props 設(shè)計(jì)非常簡(jiǎn)單,只有一個(gè) type 字段。根據(jù) type 字段的不同,波紋的顏色也不同。

思路有了,下面是實(shí)現(xiàn)上的一些細(xì)節(jié)性問題。

如何聲明字段名為枚舉的類型?

根據(jù)設(shè)計(jì),type 字段應(yīng)該是一個(gè)枚舉值,不應(yīng)該由調(diào)用方隨意設(shè)置。

下面是 Type 的枚舉聲明,共有 6 個(gè)字段。 

  1. enum Type {  
  2.   primary = "primary" 
  3.   success = "success" 
  4.   warning = "warning" 
  5.   warn = "warn", // warning alias  
  6.   danger = "danger" 
  7.   info = "info" 

TypeScript 中聲明類型的關(guān)鍵字有兩個(gè),interface 和 type,在聲明 key 不確定類型的字段時(shí)稍有不同。

使用 type 進(jìn)行聲明: 

  1. type ColorConfig = {  
  2.   [key in Type]: Colors;  
  3. }; 

使用 interface 卻只能像下面這樣: 

  1. interface ColorConfig {  
  2.   [key: string]: Colors;  

因?yàn)?interface 的索引只能是基礎(chǔ)類型,類型別名也不可以。而 type 的索引可以是復(fù)合類型。

Vue 3 如何獲取元素實(shí)例?

在 vue3 中,組件的邏輯可以放在 setup 函數(shù)里面,但是 setup 中不再有 this,所以 vue2 中的 this.$refs 的用法在 vue3 中無(wú)法使用。

新的用法是:

給元素添加 ref 屬性。

在 setup 中聲明與元素 ref 同名的變量。

在 setup 的 return 對(duì)象中將 ref 變量作為同名屬性返回。

在 onMounted 生命周期中訪問 ref 變量,既是元素實(shí)例。

第一步: 

  1. <div class="point point-flicker" ref="point"></div> 

第二步: 

  1. const point = ref<HTMLDivElement | null>(null); 

注意類型要填寫 HTMLDivElement,這樣才能享受類型推斷。

第三步: 

  1. return { point }; 

這一步必不可少,如果返回對(duì)象中不包含這個(gè)同名屬性,onMounted 中訪問的 ref 對(duì)象會(huì)是 null。

第四步: 

  1. onMounted(() => {  
  2.   if (point?.value) {  
  3.     // logic  
  4.   }  
  5. }); 

如何操作偽類?

JavaScript 無(wú)法獲取到偽類元素,但是可以換一種思路。偽類樣式引用 css 變量,再通過 js 控制 css 變量來完成間接操作偽類的效果。

比如這是一個(gè)偽類: 

  1. .point-flicker:after {  
  2.   background-color: var(--afterBg);  

它依賴了 afterBg 變量。

如果需要修改它的內(nèi)容,只需要使用 js 操作 afterBg 的內(nèi)容即可。 

  1. point.value.style.setProperty("--bg", colorConfig[props.type].bg); 

API 的變化

Vue3 中組件如何修改自身的 props?

有一種不是很常見的情況,需要組件修改父組件傳遞給自己的 Props。

比如抽屜組件、擬態(tài)框組件等。

在 vue2 中常見的用法是 sync 和 v-model。

vue3 中只推薦使用 v-model:xxx="" 的方式。

比如父組件傳遞: 

  1. <ws-log v-model="wsLogVisible" /> 

子組件: 

  1. <template>  
  2.     <div v-model:visible="visible">  
  3.     ... 
  4.     </div>  
  5. </template>  
  6. <script>  
  7. // ...  
  8.  props: {  
  9.     visible: {  
  10.       type: Boolean,  
  11.     },  
  12.   },  
  13. </script> 

Vue3 中 watch 用法的變化

watch 變得更加簡(jiǎn)單。 

  1. import { watch } from "vue";  
  2. watch(source, (currentValue, oldValue) => {  
  3.     // logic  
  4. }); 

當(dāng) source 變化時(shí)自動(dòng)執(zhí)行 watch 第二個(gè)參數(shù)所傳入的函數(shù)。

Vue3 中 computed 用法的變化

computed 也變得更加簡(jiǎn)單。 

  1. import { computed } from "vue"  
  2. const v = computed(() => {  
  3.     return x  
  4. }); 

computed 返回的變量是一個(gè)響應(yīng)式對(duì)象。

Vue3 中組件循環(huán)自身的技巧

這是一種開發(fā)組件的技巧。

假設(shè)你有一個(gè)不確定深度的樹狀結(jié)構(gòu)數(shù)據(jù)。 

  1.  
  2.   "label": "root",  
  3.   "children": [  
  4.     {  
  5.       "label": "a",  
  6.       "children": [  
  7.         {  
  8.           "label": "a1",  
  9.           "children": []  
  10.         },  
  11.         {  
  12.           "label": "a2",  
  13.           "children": []  
  14.         }  
  15.       ]  
  16.     }  
  17.   ]  

它的類型定義如下: 

  1. export interface Menu {  
  2.   id: string;  
  3.   label: string;  
  4.   children: Menu | null;  

你需要實(shí)現(xiàn)一種樹狀組件來渲染它們。這時(shí)就需要用到這種技巧。 

  1. <template>  
  2.     <div>{{ menu.label }}</div>  
  3.     <Menu  
  4.       @select="select"  
  5.       v-for="item in menu.children"  
  6.       :key="item.id"  
  7.       :menu="item"  
  8.     />  
  9. </template>  
  10. <script  lang="ts">  
  11. import { defineComponent } from "vue";  
  12. export default defineComponent({  
  13.   name: "Menu",  
  14.   props: {  
  15.     menu: {  
  16.       type: Object,  
  17.     },  
  18.   },  
  19. });  
  20. </script> 

組件的 name 可以在自身中直接使用,而不需要在 component 中聲明。

一些坑

Vuex:慎用 Map

在 Vuex 中,我設(shè)計(jì)了一個(gè)數(shù)據(jù)結(jié)構(gòu)用于存儲(chǔ)模塊(業(yè)務(wù)概念)不同的狀態(tài)。 

  1. type Code = number 
  2. export type ModuleState = Map<Code, StateProperty>

但是我發(fā)現(xiàn)一個(gè)問題,當(dāng)我修改 Map 中某一個(gè) value 中的屬性時(shí),不會(huì)觸發(fā) Vuex 的監(jiān)聽。

所以我只好將數(shù)據(jù)結(jié)構(gòu)修改為對(duì)象的形式。 

  1. export type ModuleState = { [key in Code]: StateProperty }; 

ts 中索引不可以使用類型別名,但是可以寫成下面這樣: 

  1. type Code = number 
  2. export type ModuleState = { [key in Code]: StateProperty }; 

除此之外,Map 還存在另外一個(gè)問題。

當(dāng)一個(gè) Map 類型的 Proxy 對(duì)象作為參數(shù)被傳遞時(shí),是無(wú)法使用 get、set、clear 等 Map 方法的,但是 TypeScript 會(huì)提示這些方法可用。如果使用了這些方法,會(huì)得到一個(gè) Uncaught TypeError。

如果使用 Object 則不會(huì)產(chǎn)生這個(gè)問題。

WebSocket 發(fā)生異常無(wú)法被 try catch 監(jiān)聽

ws 的異常只能在 onerror 和 onclose 兩個(gè)事件中進(jìn)行處理,try catch 是無(wú)法捕獲的。

有些時(shí)候,onerror 和 onclose 會(huì)連續(xù)執(zhí)行,比如觸發(fā) onerror,導(dǎo)致連接關(guān)閉,就會(huì)緊接著觸發(fā) onclose。

Vue Devtools

vue devtools 目前無(wú)法支持 Vue3,但是 vue devtools 幾乎是開發(fā)中必不可少的工具,目前可以使用 vue devtools beta 版本,但存在一些 Bug。

下載地址:

https://chrome.google.com/webstore/detail/vuejs-devtools/ljjemllljcmogpfapbkkighbhhppjdbg?utm_source=chrome-ntp-icon

用法非常簡(jiǎn)單,安裝后重啟瀏覽器就可以。不需要設(shè)置 vue.config.devtools = true,在 vue3 中 vue.config 實(shí)例不存在 devtools 屬性。

ESbuild 安裝依賴

在使用 vite 啟動(dòng)服務(wù)的同時(shí)安裝依賴,非常容易碰到一個(gè)錯(cuò)誤。

 

  1. Error: EBUSY: resource busy or locked, open 'E:\gxt\property-relay-fed\node_modules\esbuild\esbuild.exe' 

這個(gè)問題的原因是 vite 依賴的編譯工具 esbuild.exe 被占用所導(dǎo)致的,解決方法很簡(jiǎn)單,就是停掉 vite,安裝完依賴后再重新啟動(dòng) vite。

Vite 在 Chrome 中調(diào)試的問題

系統(tǒng)中有一些移動(dòng)頁(yè)面,需要嵌入在 App 中使用。

常見的調(diào)試 WebView 的方法有兩種,一種簡(jiǎn)單的方式是使用騰訊開源的 vcosnole,另一種麻煩一些的調(diào)試方式是使用 Chrome 的 DevTools。

但是 vconsole 并沒有想象中那么好用。

image.png

所以我選擇使用 Chrome 調(diào)試,chrome://inspect/#devices

但是在調(diào)試過程中我發(fā)現(xiàn) Chrome 調(diào)試工具里面竟然運(yùn)行的是 TS 源碼,TS 的語(yǔ)法直接被認(rèn)為語(yǔ)法錯(cuò)誤。(我是使用 Vite 啟動(dòng)的開發(fā)服務(wù)。)

解決方案很簡(jiǎn)單,但挺 Low。先使用 vite build 把 TS 代碼編譯成 JS,再使用 vite preview 啟動(dòng)服務(wù)。

WebSocket

websocket 和 Vue3 沒什么關(guān)系,但是在這里簡(jiǎn)單提一下。

設(shè)備管理系統(tǒng)的核心概念是設(shè)備,設(shè)備會(huì)有很多屬性,在硬件上也被稱作數(shù)據(jù)點(diǎn)。這些屬性會(huì)經(jīng)歷非常長(zhǎng)的鏈路傳輸?shù)接脩艚缑嫔?。整體流程大概是:硬件通過 tcp 協(xié)議上傳到接入網(wǎng)關(guān),接入網(wǎng)關(guān)處理后再通過 mqtt 協(xié)議上傳到物聯(lián)網(wǎng)平臺(tái),物聯(lián)網(wǎng)平臺(tái)再經(jīng)過規(guī)則引擎處理,通過 webhook restful 的形式發(fā)送到業(yè)務(wù)系統(tǒng),業(yè)務(wù)系統(tǒng)再通過 websocket 推送到前端。

雖然數(shù)據(jù)通過層層編解碼、不同的協(xié)議繞了非常遠(yuǎn)的距離呈現(xiàn)到用戶面前,但是前端只需要關(guān)心 websocket 就足夠了。

WebSocket 重連

在做重連時(shí),需要注意 onerror 和 onclose 連續(xù)執(zhí)行的問題,通常是使用類似防抖的方法來解決。

我的做法是增加一個(gè)變量來控制重連次數(shù)。

let connecting = false; // 斷開連接后,先觸發(fā) onerror,再觸發(fā) onclose,主要用于防止重復(fù)觸發(fā) 

  1. conn();  
  2.  function conn() {  
  3.    connecting = false 
  4.    if (ctx.state.stateWS.instance && ctx.state.stateWS.instance.close) {  
  5.      ctx.state.stateWS.instance.close();  
  6.    }  
  7.    const url = ctx.state.stateWS.url + "?Authorization=" + getAuthtication();  
  8.    ctx.state.stateWS.instance = new WebSocket(url);  
  9.    ctx.state.stateWS.instance.onopen = () => {  
  10.      ctx.commit(ActionType.SUCCESS);  
  11.    };  
  12.    ctx.state.stateWS.instance.onclose = () => {  
  13.      if (connecting) return;  
  14.      ctx.commit(ActionType.CLOSE);  
  15.      setTimeout(() => {  
  16.        conn();  
  17.      }, 10 * 1000);  
  18.      connecting = true 
  19.    }; 
  20.    ctx.state.stateWS.instance.onerror = () => {  
  21.      if (connecting) return;  
  22.      ctx.commit(ActionType.ERROR);  
  23.      setTimeout(() => {  
  24.        conn();  
  25.      }, 10 * 1000);  
  26.      connecting = true 
  27.    };  
  28.    ctx.state.stateWS.instance.onmessage = function (  
  29.      this: WebSocket,  
  30.      ev: MessageEvent  
  31.    ) {  
  32.      // logic  
  33.      } catch (e) {  
  34.        console.log("e:", e);  
  35.      }  
  36.    };  
  37.  } 

WebSocket 連接活動(dòng)日志

系統(tǒng)是設(shè)計(jì)成 7*24 小時(shí)不間斷運(yùn)行。所以 websocket 很容易受到一些網(wǎng)絡(luò)因素或者其它因素的影響發(fā)生斷開,重連是一項(xiàng)非常重要的功能,同時(shí)還應(yīng)該具備重連日志功能。

在用戶的不同環(huán)境中,排查 WebSocket 的連接狀態(tài)很麻煩,添加一個(gè)連接日志功能是比較不錯(cuò)的方案,這樣可以很好的看到不同時(shí)間的連接情況。

image.png

需要注意,這些日志是存儲(chǔ)在用戶的瀏覽器內(nèi)存中的,需要設(shè)置上限,到達(dá)上限要自動(dòng)清除早期日志。

WebSocket 鑒權(quán)

websocket 的鑒權(quán)是很多人容易忽視的一個(gè)點(diǎn)。

我在系統(tǒng)設(shè)計(jì)中,restful API 的鑒權(quán)是通過在 request header 上附帶 Authorization 字段,設(shè)置生成的 JWT 來實(shí)現(xiàn)的。

websocket 無(wú)法設(shè)置 header,但是可以設(shè)置 query,實(shí)現(xiàn)思路類似 restful 的認(rèn)證設(shè)計(jì)。

關(guān)于 ws 鑒權(quán)的過期、續(xù)期、權(quán)限等問題,和 restful 保持一致即可。

script setup:更加清爽的 API

script setup 至今仍是一個(gè)實(shí)驗(yàn)性特性,但它確實(shí)非常清爽。

單文件組件的 setup 常規(guī)用法像下面這樣: 

  1. <script lang="ts"> 
  2. import { defineComponent } from 'vue'  
  3. export default defineComponent({ 
  4.   setup () {  
  5.     return {}  
  6.   }  
  7. })  
  8. </script> 

使用 script setup 后,代碼變成了下面這樣: 

  1. <script setup lang="ts">    
  2. </script> 

在 sciprt 標(biāo)簽中的頂層變量、函數(shù)都會(huì) return 出去。

在這種模式下,減少了大量代碼,可以提高開發(fā)效率、降低心智負(fù)擔(dān)。

但這時(shí)也存在幾個(gè)問題,比如在 script setup 中怎么使用生命周期和 watch/computed 函數(shù)?怎么使用組件?怎么獲取 props 和 context?

使用組件

直接導(dǎo)入組件后,vue 會(huì)自動(dòng)識(shí)別,無(wú)需使用 component 掛載。 

  1. <script setup lang="ts">  
  2.   import C from "component"  
  3. </script> 

使用生命周期和監(jiān)聽計(jì)算函數(shù)

和標(biāo)準(zhǔn)寫法基本無(wú)差異。 

  1. <script setup lang="ts">  
  2.   import { watch, computed, onMounted } from "vue"  
  3. </script> 

使用 props 和 context

由于 setup 被提升到 script 標(biāo)簽上了,自然也就沒辦法接收 props 和 context 這兩個(gè)參數(shù)。

所以 vue 提供了 defineProps、defineEmit、useContext 函數(shù)。

defineProps

defineProps 的用法和 OptionsAPI 中的 props 用法幾乎一致。 

  1. <script setup lang="ts">  
  2. import { defineProps } from "vue";  
  3. interface Props {  
  4.   moduleID: string;  
  5.  
  6. const props = defineProps<Props>(["moduleID"]);  
  7. console.log(props.moduleID);  
  8. </script> 

defineEmit

defineEmit 的用法和 OptionsAPI 中的 emit 用法也幾乎一致。 

  1. <script setup lang="ts">  
  2. import { defineEmit } from "vue";  
  3. const emit = defineEmit(["select"]);  
  4. console.log(emit("select"));  
  5. </script> 

emit 的第一個(gè)參數(shù)是事件名稱,后面支持傳遞不定個(gè)數(shù)的參數(shù)。

useContext

useContext 是一個(gè) hook 函數(shù),返回 context 對(duì)象。 

  1. const ctx = useContext() 

原理

原理相當(dāng)簡(jiǎn)單。增加了一層編譯過程,將 script setup 編譯成標(biāo)準(zhǔn)模式的代碼。

但是實(shí)現(xiàn)上有非常多的細(xì)節(jié),所以導(dǎo)致至今仍未推出正式版。

Vue3 Composition 所帶來的模塊化開發(fā)方式

這套技術(shù)棧帶給我最深的感受還是開發(fā)方式上的變化。

在 Vue2 的開發(fā)中,Options API 在面對(duì)業(yè)務(wù)邏輯復(fù)雜的頁(yè)面時(shí)非常吃力。當(dāng)邏輯長(zhǎng)達(dá)千行時(shí),追蹤一個(gè)變量的變化是一件非常頭痛的事情。

但是有了 Composition API 后,這將不再是問題,它帶來了一種全新的開發(fā)方式,雖然有種 React 的感覺,但這相比之前已經(jīng)非常棒了!

這項(xiàng)目中所有的頁(yè)面,我都使用 hooks 的方式開發(fā)。

在設(shè)備模塊中,我的 js 代碼是這樣的。 

  1. <script lang="ts">  
  2. import { defineComponent, toRefs } from "vue";  
  3. import { useDeviceCreate } from "./create";  
  4. import { useDeviceQuery } from "./query";  
  5. import { useDeviceDelete } from "./delete";  
  6. import { useUnbind } from "./unbind";  
  7. import { useBind } from "./bind";  
  8. import { useDeviceEdit } from "./edit";  
  9. import { useState } from "./state";  
  10. import { useAssign } from "./assign";  
  11. export default defineComponent({  
  12.   setup() {  
  13.     const queryObj = useDeviceQuery();  
  14.     const { query, devices } = queryObj;  
  15.     const reload = query 
  16.     return {  
  17.       ...toRefs(useDeviceCreate(reload)),  
  18.       ...toRefs(queryObj),  
  19.       ...toRefs(useDeviceDelete(reload)),  
  20.       ...toRefs(useUnbind(reload)),  
  21.       ...toRefs(useBind(reload)),  
  22.       ...toRefs(useDeviceEdit(reload)),  
  23.       ...toRefs(useState(devices)),  
  24.       ...toRefs(useAssign()),  
  25.     };  
  26.   },  
  27. });  
  28. </script> 

每個(gè)模塊各司其職,各自有自己的內(nèi)部數(shù)據(jù),各個(gè)模塊如果需要共享數(shù)據(jù),可以通過 Vuex,或者在頂層組件的 setup 中傳遞,比如上面的 reload 函數(shù)。

我的目錄結(jié)構(gòu)是這樣的。

image.png

整體上非常清爽,工程化的感覺越來越強(qiáng)。

前端架構(gòu)不同于后端架構(gòu)。

后端考慮的更多是高可用、高性能、可擴(kuò)展。前端考慮的問題更多是如何實(shí)現(xiàn)高內(nèi)聚低耦合的分層設(shè)計(jì),架構(gòu)即設(shè)計(jì)。

良好的架構(gòu)設(shè)計(jì)能夠極大的開發(fā)效率,降低開發(fā)人員的心智負(fù)擔(dān)。

這也是我們一直以來所關(guān)注的問題。     

 

責(zé)任編輯:龐桂玉 來源: 前端教程
相關(guān)推薦

2020-09-17 07:08:04

TypescriptVue3前端

2021-12-01 08:11:44

Vue3 插件Vue應(yīng)用

2021-11-30 08:19:43

Vue3 插件Vue應(yīng)用

2023-11-28 09:03:59

Vue.jsJavaScript

2020-09-28 06:45:42

故障復(fù)盤修復(fù)

2021-09-13 07:58:52

考試算法PAT

2021-11-19 09:29:25

項(xiàng)目技術(shù)開發(fā)

2020-09-19 21:15:26

Composition

2025-10-17 07:10:00

前端開發(fā)Vue

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2025-11-19 08:23:42

2021-11-16 08:50:29

Vue3 插件Vue應(yīng)用

2022-03-10 11:04:04

Vue3Canvas前端

2021-12-08 09:09:33

Vue 3 Computed Vue2

2025-10-17 07:10:00

2025-08-22 09:47:44

2020-10-25 18:43:20

VueTypeScript前端

2024-11-06 10:16:22

2022-06-21 12:09:18

Vue差異

2022-07-20 11:13:05

前端JSONVue3
點(diǎn)贊
收藏

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

亚洲欧美日韩精品久久亚洲区| 亚洲精品中文在线| 国产精品91一区| 男人av资源站| 免费福利视频一区| 欧美色视频在线| 日b视频免费观看| 久久米奇亚洲| 国产美女精品在线| 69久久夜色精品国产69| 久久久国产一级片| 国产主播性色av福利精品一区| 色香蕉久久蜜桃| 日本福利视频在线观看| 久青草国产在线| 国产91富婆露脸刺激对白| 秋霞午夜一区二区| 妺妺窝人体色www婷婷| 狠狠色丁香婷婷综合影院| 欧美一区二区三区精品| 久久精品网站视频| heyzo中文字幕在线| 国产女主播视频一区二区| 波多野结衣一区二区三区在线观看| 青青青国产在线| 欧美~级网站不卡| 伊人av综合网| 亚洲天堂成人av| 免费看日产一区二区三区| 在线观看欧美日本| 国产精品沙发午睡系列| 日本精品600av| 国产精品久久精品日日| 欧美综合激情| 亚洲色图狠狠干| 国产成人自拍网| 成人网在线免费观看| 老熟妇一区二区三区啪啪| 91久久亚洲| 欧美日产国产成人免费图片| 免费看日本黄色片| 性欧美xxxx免费岛国不卡电影| 91精品国产一区二区三区香蕉| 噼里啪啦国语在线观看免费版高清版| 国模精品视频| 亚洲成人av福利| 国产精品久久久久久久久电影网| 蜜桃视频在线观看www社区| 久久精品欧美一区二区三区麻豆| 久久久久久国产精品mv| 天天操天天干天天爱| 成人网在线播放| 成人自拍爱视频| 国产chinasex对白videos麻豆| 久久国产尿小便嘘嘘| 国产精品爽黄69| 在线免费观看视频网站| 蜜桃视频第一区免费观看| 国产经典一区二区| 免费看污视频的网站| 母乳一区在线观看| 国产97在线亚洲| 国产性生活视频| 日本欧美韩国一区三区| 国产精品网红福利| 国产口爆吞精一区二区| 国产成人一区在线| 国产精品一区二区av| 男人天堂手机在线观看| 99国产精品99久久久久久| 久久综合一区二区三区| 国产在线高清| 中文字幕一区二区三区在线观看| 中国一级黄色录像| 1区2区3区在线| 疯狂做受xxxx高潮欧美日本| 成人黄色片视频| 久久国内精品| 日韩欧美国产综合| 一起草在线视频| 欧美亚洲高清| 欧美成人免费大片| 国产一级淫片a| 日韩精品亚洲专区| 国产视频福利一区| 亚洲精品一区二区三区新线路 | 国产91精品网站| 中文字幕第一页在线播放| 国产美女一区二区| 鲁丝一区二区三区免费| 调教视频免费在线观看| 亚洲一区二区在线观看视频| 日韩av黄色网址| 在线观看欧美| 国产视频丨精品|在线观看| 国产欧美小视频| 韩国一区二区三区在线观看| 国产69久久精品成人| 亚洲午夜激情视频| 成人av网址在线| 一级日韩一区在线观看| 91探花在线观看| 欧美日韩免费高清一区色橹橹| 制服下的诱惑暮生| 国产在线日韩精品| 欧美高清第一页| 中文字幕第一页在线播放| 粉嫩蜜臀av国产精品网站| 色就是色欧美| av免费不卡| 欧美一区二区国产| 日本精品久久久久中文| 亚洲区国产区| 亚洲专区在线视频| 91社区在线| 色综合一区二区| 91九色蝌蚪porny| 国产精品成人一区二区不卡| 91精品国产高清自在线| 国产视频www| 国产精品久99| 欧美精品性生活| 嫩草国产精品入口| 欧美激情在线观看| 国产精品毛片一区二区在线看舒淇 | 欧美亚洲国产日韩2020| av手机免费看| 国产精品久久精品日日| 午夜欧美福利视频| 日韩欧美黄色| 97人人做人人爱| www香蕉视频| 亚洲人成网站影音先锋播放| 男女视频在线看| 国产中文精品久高清在线不| 97久久久久久| 婷婷五月综合激情| 性感美女极品91精品| 色婷婷综合在线观看| 波多野结衣在线观看一区二区| 欧美一级淫片丝袜脚交| 日本黄色不卡视频| 午夜影视日本亚洲欧洲精品| 国产又粗又猛又爽又黄| 亚洲午夜精品一区二区国产| 国产在线视频91| 永久av在线| 欧美三级中文字幕在线观看| 色欲狠狠躁天天躁无码中文字幕| 久久综合中文| 日本公妇乱淫免费视频一区三区| 亚洲一二三四| 亚洲人成在线观看网站高清| 中文字幕第四页| 国产午夜精品在线观看| 久久久久久久久久久久久久国产| 亚欧日韩另类中文欧美| 欧美性做爰毛片| 蜜桃视频在线观看网站| 91久久久免费一区二区| 天天躁夜夜躁狠狠是什么心态| 久久综合亚州| 在线成人性视频| 国产精品视频首页| 久久久亚洲欧洲日产国码aⅴ| 六月婷婷综合网| 狠狠色噜噜狠狠狠狠97| 性少妇bbw张开| 美女网站视频久久| 免费在线精品视频| 99ri日韩精品视频| 97视频在线观看免费| 天天影院图片亚洲| 欧亚一区二区三区| 亚洲成人生活片| 成人av网站免费观看| 久久婷婷五月综合色国产香蕉| 欧美极品在线观看| 成人av在线网址| 久久大胆人体| 国产午夜精品视频免费不卡69堂| 一级黄在线观看| 亚洲成在线观看| 韩国三级hd中文字幕| 国产精品资源在线| 久久成人免费观看| 91免费精品| 国产精品区二区三区日本| 日韩新的三级电影| 日韩视频一区在线| 三级毛片在线免费看| 欧美日韩视频在线观看一区二区三区| 精品国产视频在线观看| 9i在线看片成人免费| 在线视频日韩一区 | www.日本在线播放| 日韩精品一区二区三区免费观看 | 狼人精品一区二区三区在线| 国产精品看片资源| 国产精品论坛| 久久久国产精品x99av| 天天干视频在线观看| 欧美精品国产精品| 国产成人无码一区二区在线播放| 日韩一区在线免费观看| 中文文字幕文字幕高清| 麻豆精品国产传媒mv男同| 国产在线精品91| 外国成人激情视频| 欧美日韩在线播放一区二区| 日本高清久久| 91精品国产综合久久香蕉922| 第一福利在线视频| 欧美成人在线影院| 麻豆av在线免费看| 亚洲视频在线看| 日韩中文字幕免费在线观看| 在线不卡中文字幕| 久久影视中文字幕| 精品国产福利在线| 九九视频在线免费观看| 中文字幕在线观看一区| 免费观看av网站| 不卡av在线网| 色婷婷狠狠18禁久久| 狠狠色综合色综合网络| 天天色综合社区| 日韩精品色哟哟| 精品99在线视频| 亚洲麻豆一区| 精品无码国产一区二区三区av | 国产视频九色蝌蚪| 欧美日韩国产欧| dy888午夜| 欧美激情电影| 一区二区日本伦理| 日韩中文首页| 亚洲午夜精品一区二区| 精品久久久久久久| 欧美伦理一区二区| 欧美自拍视频| 免费国产一区| 猛男gaygay欧美视频| 久久狠狠久久综合桃花| 色狼人综合干| 欧美伦理一区二区| 国产欧美日韩| 亚洲日本精品| 99久久亚洲精品| 艳母动漫在线免费观看| 亚洲91视频| 草草草视频在线观看| 欧美日韩一区自拍| 妞干网在线视频观看| 一本色道久久综合亚洲精品不卡| 免费成人在线视频网站| 久久精品官网| 色综合天天色综合| 国产综合色精品一区二区三区| 九九热精品国产| 粉嫩13p一区二区三区| 四虎精品一区二区| 99国产一区二区三精品乱码| 丰满圆润老女人hd| 中文字幕欧美国产| 精品无码久久久久成人漫画| 亚洲激情图片一区| 日韩成人在线免费视频| 一本大道久久a久久精二百| 亚洲成人av网址| 7777女厕盗摄久久久| 丰满少妇高潮在线观看| 亚洲精品视频免费在线观看| 成人在线播放视频| 久久婷婷国产麻豆91天堂| 毛片在线导航| 国产精品都在这里| 日本一区精品视频| 久久av一区二区三区亚洲| 欧美一级精品| 免费观看亚洲视频| 日韩精品一二区| 日本高清免费观看| 久久五月婷婷丁香社区| 999精品久久久| 亚洲成年人影院| 日批视频免费观看| 精品国产凹凸成av人导航| 三级在线播放| 欧美日韩第一页| 日韩一区二区三区在线免费观看| 亚洲一区二区三区视频播放| 欧美久久精品| 色香蕉在线观看| 免费亚洲网站| 三上悠亚 电影| 国产日韩av一区| 久久久精品国产sm调教网站| 一本到不卡免费一区二区| 99久久精品国产色欲| 亚洲九九九在线观看| 国产黄色小视频在线| 日韩av大片在线| 中文字幕一区二区三区日韩精品| 日韩一本精品| 国产精品呻吟| 国产清纯白嫩初高中在线观看性色| 久久男人中文字幕资源站| 成人免费精品动漫网站| 欧美日韩国产精品一区二区三区四区| 成人一二三四区| 欧美mv和日韩mv的网站| 日p在线观看| 国产91九色视频| 精品国产午夜肉伦伦影院| 97超碰人人爱| 蜜乳av一区二区| 成人在线一级片| 狠狠躁18三区二区一区| 蜜桃91麻豆精品一二三区| 久久精品电影网| 欧美系列精品| 色播五月综合| 日韩在线一区二区| 熟女丰满老熟女熟妇| 亚洲狠狠爱一区二区三区| 国产av无码专区亚洲a∨毛片| 中文字幕在线看视频国产欧美在线看完整 | 丰满少妇被猛烈进入高清播放| 国产一区91精品张津瑜| 污污视频网站在线免费观看| 在线国产电影不卡| 久蕉在线视频| 日本久久亚洲电影| 精品中文一区| 久久综合久久色| 久久众筹精品私拍模特| 亚洲国产综合久久| 亚洲国语精品自产拍在线观看| 免费在线观看av电影| 7777精品伊久久久大香线蕉语言| 亚洲激情五月| 色哟哟在线观看视频| 亚洲日本一区二区| 国产成年妇视频| 久久99精品久久久久久青青91| 国产美女精品视频免费播放软件 | 麻豆网站在线| 成人有码视频在线播放| 亚洲欧美网站在线观看| 成人三级做爰av| 亚洲一区二区三区自拍| 天天操天天射天天| 日本精品久久久久久久| 欧洲美女日日| 91插插插影院| 亚洲一区二区三区四区在线观看| 亚洲va天堂va欧美ⅴa在线| 欧美激情视频网| 欧美日韩精品一区二区三区在线观看| 黄色一级视频片| 久久精品视频一区二区三区| 中文字幕1区2区3区| 超碰97人人做人人爱少妇| 91国内精品| 无码人妻精品一区二区三区在线| 久久女同互慰一区二区三区| 亚洲黄网在线观看| 播播国产欧美激情| ccyy激情综合| 日韩 欧美 高清| 国产精品毛片久久久久久| 国产免费不卡视频| 午夜精品久久久久久久白皮肤| 蜜臀91精品国产高清在线观看| www.日本一区| 亚洲一二三四久久| 久色视频在线| 亚洲综合第一页| 亚洲在线观看| 日韩在线一卡二卡| 亚洲成人xxx| 国产一区精品福利| 国内精品视频一区二区三区| 国产午夜精品一区二区三区四区| 亚洲中文字幕在线一区| 欧美大片免费看| 成人羞羞网站| 国产51自产区| 欧美日韩国产系列| 白浆在线视频| 性做爰过程免费播放| 91麻豆精品在线观看| 国产精品日韩无码| 日本久久久a级免费| 一区二区电影在线观看| av黄色免费网站| 精品欧美一区二区久久| 久久久成人av毛片免费观看| 穿情趣内衣被c到高潮视频|