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

低代碼海報(bào)平臺(tái)的編輯器難點(diǎn)剖析

開發(fā) 前端
撤銷、重做其實(shí)是我們平時(shí)一直在用的操作。對(duì)應(yīng)快捷鍵一般就是? Z / Ctrl+Z、?? Z / Ctrl+Shift+Z。這個(gè)功能是很常見的,他可以極大的提升用戶體驗(yàn),提高編輯效率,但是用代碼應(yīng)該如何實(shí)現(xiàn)呢?

通過(guò)上一篇文章,我們對(duì)喬巴樂高海報(bào)平臺(tái)的整體架構(gòu)有了初步的了解。今天我們深入到編輯器部分,對(duì)其中的難點(diǎn)和實(shí)現(xiàn)細(xì)節(jié)進(jìn)行分析。

這是目前生產(chǎn)的編輯器頁(yè)面:

圖片

對(duì)應(yīng)的原型圖:

圖片

不難看出和市面上大部分低代碼平臺(tái)一樣,由三部分組成:左側(cè)組件列表、中間畫布區(qū)域、右側(cè)屬性區(qū)域。

大致操作流程就是拖動(dòng)左側(cè)的組件到中間的畫布,選中組件,右側(cè)屬性面板就會(huì)展示與該組件關(guān)聯(lián)的屬性。編輯右側(cè)屬性,畫布中對(duì)應(yīng)的組件樣式就會(huì)同步更新。頁(yè)面拼接完成。

從中看出組件串聯(lián)其中,在前面一篇文章中,我們大致分析了整體頁(yè)面和組件的數(shù)據(jù)結(jié)構(gòu),但沒有細(xì)化。抽取一下文字、圖片、素材組件的通用特性:

尺寸屬性(Size)

  • 寬度(width)
  • 高度(height)

填充屬性(Padding)

  • 上填充(padding-top)
  • 右填充(padding-right)
  • 下填充(padding-bottom)
  • 左填充(padding-left)

視覺格式屬性

  • 指定如何定位元素(position)
  • 指定所定位元素的上邊緣的位置(top)
  • 指定所定位元素的右邊緣的位置(right)
  • 指定所定位元素底邊的位置(bottom)
  • 指定定位元素左邊緣的位置(left)
  • 將一個(gè)或多個(gè)陰影應(yīng)用于元素的框(box-shadow)

顏色屬性(Color)

  • 透明度(opacity)

邊框?qū)傩裕˙order)

  • 設(shè)置元素所有四個(gè)側(cè)面的邊框顏色(border-color)
  • 設(shè)置元素所有四個(gè)側(cè)面的邊框?qū)挾龋╞order-width)
  • 在元素的所有四個(gè)面上設(shè)置邊框的樣式(border-style)
  • 定義元素邊界角的形狀(border-radius)

除此之外,文字組件還具有以下屬性:

字體屬性(Fonts)

  • 定義元素的字體列表(font-family)
  • 定義文本的字體大小(font-size)
  • 定義文本的字體樣式(font-style)
  • 指定文本的字體粗細(xì)(font-weight)

文字屬性(Text)

  • 設(shè)置內(nèi)聯(lián)內(nèi)容的水平對(duì)齊方式(text-align)
  • 指定添加到文本的裝飾(text-decoration)
  • 設(shè)置文本行之間的高度(line-height)

圖片組件還具有:

圖片屬性(Image)

  • 圖片鏈接(src)

素材組件還具有:

  • 背景屬性(Background)

定義元素的背景色(background-color)

我們將上面的操作流程拆解為三步:

1?? 拖動(dòng)左側(cè)的組件到中間的畫布

2?? 選中組件,右側(cè)屬性面板就會(huì)展示與該組件關(guān)聯(lián)的屬性

3?? 編輯右側(cè)屬性,畫布中對(duì)應(yīng)的組件樣式就會(huì)同步更新

1.添加組件到畫布

通過(guò)上一篇文章,我們知道編輯器整體的數(shù)據(jù)結(jié)構(gòu)是這么設(shè)計(jì)的:

state:{
// 所有添加到畫布中的組件數(shù)據(jù)
componentData:[],
}

reducers:{
// 添加組件到componentData
addComponentData(){},
// 編輯組件,更新componentData及curComponent
editComponentData(){},
// 刪除組件
delComponentData(){}
}

那么從左側(cè)組件列表添加組件到畫布的操作其實(shí)就是向componentData中push一條組件數(shù)據(jù)。

這里主要是關(guān)注下組件列表要怎么設(shè)計(jì):為了便于用戶快速創(chuàng)建活動(dòng),組件列表最好是預(yù)設(shè)一些模板,其實(shí)就是針對(duì)文字、圖片和素材分別提供一些已有的元素。這樣當(dāng)對(duì)應(yīng)組件點(diǎn)擊添加到畫布時(shí),對(duì)應(yīng)就會(huì)commit一個(gè)mutation來(lái)修改store中的componentData。

這里組件列表底層渲染也是用的組件庫(kù),只是不同模板的props不同。

2.選中組件展示其關(guān)聯(lián)屬性

當(dāng)在畫布中選中具體組件時(shí),我們需要知道此刻是哪個(gè)組件被選中了,意味著需要一個(gè)變量來(lái)存儲(chǔ)當(dāng)前高亮的組件。那么在store中添加setActive和getCurrentElement:

const editorModule = {
state: {
componentData: [],
currentElement: "",
},
mutations: {
addComponentData(state, component) {

},
setActive(state, id) {
state.currentElement = id;
},
},
getters: {
getCurrentElement: (state) => {
return state.componentData.find(
(component) => component.id === state.currentElement
);
},
}
}

當(dāng)在畫布中選中組件時(shí),就會(huì)觸發(fā)setActive,更新currentElement。(通過(guò)getCurrentElement可以獲取到當(dāng)前正在被操作的組件)。

這個(gè)時(shí)候,怎么在右側(cè)屬性區(qū)域動(dòng)態(tài)展示不同組件的不同屬性呢?

對(duì)于單獨(dú)的組件來(lái)說(shuō),屬性面板應(yīng)該是語(yǔ)義化的,無(wú)論是開發(fā)還是非開發(fā)同學(xué),通過(guò)屬性面板的操作區(qū),就可以直觀的知道一個(gè)組件的屬性是什么,應(yīng)該如何使用和編輯。

那么屬性面板應(yīng)該包含哪些內(nèi)容呢?

1、label:屬性名稱。這個(gè)可以顯式的告訴具體的屬性的作用,比如元素的寬高、邊框、背景顏色等。

2、description:屬性的描述信息。對(duì)于一些特殊屬性,可能第一下通過(guò)label并不能直觀的識(shí)別屬性的含義,添加描述信息可以進(jìn)行詳細(xì)的闡述。

3、content:屬性渲染器。用戶可以基于此實(shí)現(xiàn)對(duì)屬性的修改。最常見的有 textarea、input、select 等。

4、error:屬性校驗(yàn)信息。當(dāng)用戶輸入了不合法的或者類型不匹配時(shí),可給予適當(dāng)?shù)腻e(cuò)誤提示信息。

通過(guò)以上描述,我們會(huì)發(fā)現(xiàn),這其實(shí)就是我們常用的表單。

對(duì)應(yīng)上面組件的props信息,我們可以對(duì)這些屬性做一些歸類,那歸類的標(biāo)準(zhǔn)又是什么呢?我認(rèn)為應(yīng)該把屬性與js中的數(shù)據(jù)類型做一下映射,然后在具體的分類下選用合適的渲染器。

我們知道在JavaScript中,一共有七種數(shù)據(jù)類型,字符串(String)、數(shù)字(Number)、布爾(Boolean)、空(Null)、未定義(Undefined)、Symbol和對(duì)象(Object)。其中對(duì)象類型包括:數(shù)組(Array)、函數(shù)(Function)、還有兩個(gè)特殊的對(duì)象:正則(RegExp)和日期(Date)。

這里面的空(Null)、未定義(Undefined)、Symbol和正則(RegExp)在渲染器中基本用不到。

我們先來(lái)看一下字符串(String)、數(shù)字(Number)、布爾(Boolean)和日期(Date)可能渲染的方式:

字符串(String)

渲染器類型

組件

input

圖片

textarea

圖片

數(shù)字(Number)

渲染器類型

組件

input-number

圖片

slider

圖片

布爾(Boolean)

渲染器類型

組件

switch

圖片

日期(Date)

渲染器類型

組件

date

圖片

除了這幾種,還有對(duì)象(Object)、數(shù)組(Array)、函數(shù)(Function)。

對(duì)象和數(shù)組屬于較復(fù)雜的類型,不過(guò)我們可以把它抽象為多層級(jí)(可以理解為嵌套)的基礎(chǔ)數(shù)據(jù)類型:

渲染器類型

組件

array

圖片

像數(shù)組一般是用下拉框的形式來(lái)展現(xiàn)。

至于函數(shù)(Function),可以采用預(yù)定義的形式:

渲染器類型

組件

function

圖片

到這里,不難想到,我們要維護(hù)一個(gè)屬性和表單組件的對(duì)應(yīng)關(guān)系。屬性對(duì)應(yīng)上面的key,像borderColor、text、width、fontFamily這些,那組件呢?組件其實(shí)就是對(duì)屬性的具體呈現(xiàn),像width可以用數(shù)字輸入框、text可以用普通輸入框,但是對(duì)于一些比較復(fù)雜的特性,我們自己去實(shí)現(xiàn)這些組件,就顯得捉襟見肘了,這個(gè)時(shí)候我們就可以考慮和現(xiàn)有的組件庫(kù)做一下結(jié)合了(這里我采用的是Ant Design Vue)。

那么這樣,屬性prop和component基礎(chǔ)的對(duì)應(yīng)關(guān)系就有了:

const mapPropsToComponents = {
text: {
component: "a-input",
},
width: {
component: "a-input-number",
},
borderWidth: {
component: "a-slider",
},
// ...
}

但這只是滿足了常規(guī)的基礎(chǔ)組件設(shè)計(jì),像一些獨(dú)有的屬性或者基礎(chǔ)組件不能滿足的情況,我們需要對(duì)其做一定擴(kuò)展:

渲染器類型

組件

upload

圖片

color-picker

圖片

上面提到的上傳組件和顏色選擇組件是需要我們單獨(dú)去實(shí)現(xiàn)的。

3.編輯屬性,畫布同步更新

上面只是初步建立了屬性和組件的對(duì)應(yīng)關(guān)系,組件初始值的展示、復(fù)雜組件的展示以及表單值更新后,畫布如何同步更新,這些問題我們還都沒有解決。

其實(shí)把問題簡(jiǎn)化,這就是表單的回顯和更新問題。

以我以往的經(jīng)驗(yàn)來(lái)看:表單組件在設(shè)計(jì)時(shí),有兩點(diǎn)是必須的:

  • 表單初始值(默認(rèn)value),供初始展示使用
  • 表單屬性更改的事件(默認(rèn)為change)

對(duì)于不同的表單,初始值和屬性更改后,參數(shù)的處理是不一樣的:

  • 像高度、寬度這種數(shù)字類型的,傳入表單時(shí)應(yīng)保證是number(24)類型,屬性更改后,事件參數(shù)應(yīng)該是string(24px)類型的
  • 字體加粗與否、傾斜與否、加下劃線與否,傳入表單時(shí)應(yīng)保證是boolean(true/false)類型,屬性更改后,事件參數(shù)應(yīng)該是string(bold/normal)類型的

所以給每一個(gè)屬性在傳入表單和事件更改后都要加一個(gè)額外的轉(zhuǎn)化函數(shù)去處理值:

  • initialValueConvert
  • eventChangeValueConvert

還有對(duì)屬性進(jìn)行賦值時(shí),不是所有的表單控件接收的都是value,像checkbox就是checked,這種單獨(dú)抽一個(gè)屬性valueProp去控制即可。

其次,像上面提到的復(fù)雜組件(我們這里是指父子層級(jí))的渲染,除了component還要多加一個(gè)subComponent。

完善后,屬性prop和component的對(duì)應(yīng)關(guān)系為:

const mapPropsToComponents = {
text: {
component: "textarea-fix",
eventName: "change",
valueProp: "value",
initialValueConvert: (v: any) => v,
eventChangeValueConvert: (e: any) => e.target.value,
text: "文本",
},
width: {
component: "a-input-number",
eventName: "change",
valueProp: "value",
initialValueConvert: (v: string) => (v ? parseInt(v) : ""),
eventChangeValueConvert: (e: number) => (e ? `${e}px` : ""),
text: "寬度",
},
textDecoration: {
component: "icon-switch",
eventName: "change",
initialValueConvert: (v: string) => v === "underline",
eventChangeValueConvert: (e: boolean) => (e ? "underline" : "none"),
valueProp: "checked",
},
backgroundSize: {
component: "a-select",
eventName: "change",
initialValueConvert: (v: any) => v,
eventChangeValueConvert: (e: any) => e,
subComponent: "a-select-option",
text: "背景大小",
options: [
{ value: "contain", text: "自動(dòng)縮放" },
{ value: "cover", text: "自動(dòng)填充" },
{ value: "", text: "默認(rèn)" },
],
},
// ...
}

我們的數(shù)據(jù)始終保持自上而下的順序,也就是說(shuō)表單更新最終要反射回到總體的 store 當(dāng)中去。這個(gè)時(shí)候我們?cè)趯?duì)應(yīng)的組件當(dāng)中發(fā)射出一個(gè)事件(change),當(dāng) change 發(fā)生的時(shí)候,我們能夠知道是哪個(gè)元素的哪個(gè)屬性,以及新的值是什么,我們就用這些信息更新這個(gè)值,這樣 store完成更新,元素的 props 發(fā)生更新,那么整個(gè)數(shù)據(jù)流動(dòng)就完成了。

4.畫布區(qū)域交互設(shè)計(jì)實(shí)現(xiàn)

上面說(shuō)了這么多,基本都是圍繞左側(cè)組件區(qū)域、中間畫布區(qū)域、右側(cè)屬性區(qū)域相互之間的數(shù)據(jù)流動(dòng)來(lái)講的。最后來(lái)說(shuō)一下畫布區(qū)域本身一些比較復(fù)雜的交互實(shí)現(xiàn)。

我大概整理了這幾種:

  • 拖拽(組件在畫布中移動(dòng))
  • 組件圖層
  • 放大/縮小
  • 撤銷/重做

拖拽(組件在畫布中移動(dòng))

這個(gè)相對(duì)比較簡(jiǎn)單,就是mousedown、mousemove和mouseup事件的結(jié)合使用:在組件上按下鼠標(biāo)后,記錄組件當(dāng)前位置,也就是 x、y 坐標(biāo)(對(duì)應(yīng)的是 css 中的 left 和 top);每次鼠標(biāo)移動(dòng)時(shí)用當(dāng)前最新的 xy 坐標(biāo)減去最開始的 xy 坐標(biāo),計(jì)算出移動(dòng)的距離,然后更新組件位置;鼠標(biāo)抬起時(shí)結(jié)束移動(dòng)。

組件圖層

圖層面板主要是控制組件的顯示/隱藏、不同組件的層級(jí)關(guān)系以及點(diǎn)擊選中。

這里主要說(shuō)一下層級(jí)關(guān)系吧,正常情況下,我們會(huì)選擇使用z-index來(lái)控制層級(jí)。但是這里我沒有使用z-index,而是利用了層疊領(lǐng)域黃金準(zhǔn)則的第二條。

層疊領(lǐng)域黃金準(zhǔn)則:1、誰(shuí)大誰(shuí)上: 當(dāng)具有明顯的層疊水平標(biāo)示的時(shí)候,如識(shí)別的 z-indx 值,在同一個(gè)層疊上下文領(lǐng)域,層疊水平值大的那一個(gè)覆蓋小的那一個(gè)。2、后來(lái)居上: 當(dāng)元素的層疊水平一致、層疊順序相同的時(shí)候,在 DOM 流中處于后面的元素會(huì)覆蓋前面的元素。

為什么選擇第二個(gè)而沒有選擇最常見的第一條呢?首先,我們需要一個(gè)圖層列表可以對(duì)每個(gè)組件對(duì)應(yīng)的圖層進(jìn)行排序,其實(shí)就是對(duì)store中的components進(jìn)行排序,也就是數(shù)組排序了,那么在圖層列表中,如果你想增加某一圖層的層級(jí),把它放置到后面就可以了(這樣渲染時(shí),數(shù)組后面的元素就會(huì)處在 DOM 流的后面了。對(duì)應(yīng)的層疊順序也就居上了),這樣不僅操作方便,也不用增加額外冗余代碼,可謂一舉兩得。

放大/縮小

核心實(shí)現(xiàn):在畫布組件的四個(gè)角(↖?、↗?、↙?、↘?)分別加一個(gè)小圓點(diǎn):

左上:組件 left、top 均減小;width、height 均變大

右上:組件 left 不變、top 減小;width、height 均變大

左下:組件 left 減小、top 不變;width、height 均變大

右下:組件 left、top 均不變;width、height 均變大

撤銷/重做

撤銷、重做其實(shí)是我們平時(shí)一直在用的操作。對(duì)應(yīng)快捷鍵一般就是? Z / Ctrl+Z、?? Z / Ctrl+Shift+Z。這個(gè)功能是很常見的,他可以極大的提升用戶體驗(yàn),提高編輯效率,但是用代碼應(yīng)該如何實(shí)現(xiàn)呢?

責(zé)任編輯:武曉燕 來(lái)源: 前端森林
相關(guān)推薦

2022-06-02 09:09:27

前端React低代碼編輯器

2009-06-11 10:03:57

NetBeans代碼

2020-07-15 15:12:17

Python代碼編輯器編程語(yǔ)言

2011-10-31 10:17:05

插件

2015-02-12 09:51:24

代碼編輯

2021-03-10 09:15:15

代碼文本編輯器編程

2022-03-03 20:57:53

代碼編輯器VS code

2011-01-10 16:17:49

2020-09-03 10:06:53

低代碼平臺(tái)編碼低代碼

2017-03-09 19:25:38

JavaScript代碼編輯器

2024-08-14 08:33:46

前端編輯器

2017-01-06 18:06:22

2018-10-13 09:10:06

代碼開發(fā)編輯器

2014-06-25 09:15:33

JavaScript 編輯器

2024-04-03 08:22:54

代碼編輯器組件

2019-06-18 09:40:57

Graviton開源代碼編輯器

2010-03-24 09:20:07

CentOS vi編輯

2024-02-21 16:40:06

Web代碼編輯器開源

2023-08-10 08:38:57

Project IDFlutter谷歌

2023-03-17 10:03:51

服務(wù)器編輯器vscode
點(diǎn)贊
收藏

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

欧美日韩一区二区三区四区在线观看 | 麻豆疯狂做受xxxx高潮视频| av成人在线观看| 欧美激情自拍偷拍| 91香蕉电影院| 国产亚洲色婷婷久久99精品| 卡通动漫精品一区二区三区| 欧美日韩精品在线| 日本精品一区二区| 国产女人高潮时对白| 精品69视频一区二区三区Q| 精品国产sm最大网站| 波多野结衣50连登视频| 国产小视频在线| 久久精品国产亚洲高清剧情介绍 | 牛牛精品在线| 91女神在线视频| 国产精品免费久久久久久| 中文字幕观看av| 精品视频高潮| 欧美日韩五月天| 99热久久这里只有精品| 久草在现在线| 国产久卡久卡久卡久卡视频精品| 国外色69视频在线观看| 国产亚洲精品精品精品| 色悠久久久久综合先锋影音下载| 欧美午夜精品久久久久久久| 一区二区高清视频| 日本精品久久久久| 黄页视频在线91| 4438全国成人免费| 性生交大片免费全黄| 欧美大胆视频| 91精品婷婷国产综合久久竹菊| 99热亚洲精品| 日本www在线观看| 91视频精品在这里| 3d蒂法精品啪啪一区二区免费| 天天爽夜夜爽人人爽| 欧美成人嫩草网站| 最近更新的2019中文字幕| 性高潮免费视频| 欧美天堂在线| 日韩欧美高清视频| 国产一区二区三区小说| 午夜免费福利在线观看| 久久久久久久久一| 3d动漫啪啪精品一区二区免费 | 91蝌蚪视频在线| 成人影院网站| 午夜激情综合网| 免费看日b视频| 久cao在线| 国产精品人成在线观看免费| 乱一区二区三区在线播放| 亚洲xxxx天美| 国产综合久久久久久鬼色 | 亚洲精品一区二区久| 熟妇女人妻丰满少妇中文字幕| 玛雅亚洲电影| 欧美视频免费在线| www.射射射| 视频在线观看入口黄最新永久免费国产| 中文字幕电影一区| 欧美精品久久| 九色在线观看| 国产亚洲精品7777| 欧美午夜精品理论片a级大开眼界| 欧美一级淫片aaaaaa| 国产美女av一区二区三区| 国产在线久久久| 依依成人在线视频| 久久99热狠狠色一区二区| 国产精品欧美激情在线播放| 中文在线最新版天堂| 久久久噜噜噜久久狠狠50岁| 热re91久久精品国99热蜜臀| 男女啊啊啊视频| 久久av最新网址| 日本久久久久久| 无码人妻aⅴ一区二区三区有奶水 无码免费一区二区三区 | 亚洲av片不卡无码久久| 亚洲欧美日本伦理| 亚洲香蕉成人av网站在线观看 | 欧美日韩一区二区三区四区不卡| 精品久久久久香蕉网| 影音先锋资源av| 久久九九热re6这里有精品| 亚洲高清久久久久久| 国产亚洲色婷婷久久99精品91| 欧美美女黄色| 亚洲欧美日韩爽爽影院| 色噜噜在线观看| 久久99国产精品久久99大师 | 成人免费小视频| 看一级黄色录像| 爱看av在线| 91成人在线免费观看| 国产特级淫片高清视频| 成人黄色免费短视频| 欧美老人xxxx18| 在线观看你懂的视频| 欧美精品中文| 在线日韩日本国产亚洲| 亚洲国产精品久| 久久免费高清| 成人精品在线观看| 殴美一级特黄aaaaaa| 久久久久国产一区二区三区四区| 亚洲视频sss| 青青草原国产在线| 色婷婷av一区二区| 国内av免费观看| 亚洲欧洲免费| 久久91亚洲人成电影网站| 午夜精品久久久久久久久久久久久蜜桃| 日韩国产一区二| www久久99| 成人亚洲性情网站www在线观看| 亚洲色欲色欲www| 波多野结衣家庭教师视频| 福利一区和二区| 欧美精品一区二区三区久久久| 精品人妻无码一区二区三区| 欧美成人一区二区在线| 欧美人与性动交α欧美精品济南到 | 欧美大黄免费观看| 97人妻人人揉人人躁人人| 欧美日韩免费| 国产精品视频在线播放| 亚洲av成人精品一区二区三区在线播放| 国产精品天美传媒沈樵| 国产a级片网站| 久久精品免视看国产成人| 国产小视频91| 日操夜操天天操| 精品一区二区三区不卡| 欧美精品二区三区四区免费看视频 | 欧美国产视频| 亚洲欧美日韩图片| 日韩精品一区二区三区国语自制| 韩国毛片一区二区三区| 日本三级中国三级99人妇网站| 金瓶狂野欧美性猛交xxxx| 欧美人xxxx| 国产jjizz一区二区三区视频| 亚洲经典三级| 91精品久久久久久蜜桃| av男人的天堂在线| 一本一道久久a久久精品| 国产视频精品视频| 91九色精品| 国产人妖伪娘一区91| 成人精品一区二区三区免费| 色综合天天综合网国产成人综合天| 绯色av蜜臀vs少妇| 欧美不卡视频| 国产精品国产自产拍高清av水多| 欧美美女搞黄| 狠狠综合久久av一区二区小说 | 69精品久久久| 国产成人自拍网| 蜜臀av.com| 精品视频成人| 欧美xxxx18性欧美| 国产av精国产传媒| 夜夜亚洲天天久久| 岛国大片在线免费观看| 欧美喷水视频| 成人午夜电影在线播放| 免费在线中文字幕| 欧美本精品男人aⅴ天堂| 免费在线一级片| 成人免费精品视频| 黄色国产一级视频| 日韩av影院| 国产999精品久久久影片官网| 日韩欧美电影在线观看| 色综合天天综合网天天看片| 一区二区三区伦理片| 日韩有码一区二区三区| 免费亚洲精品视频| 黄色在线观看www| 国产视频亚洲视频| 免费黄色av片| 国产精品不卡一区二区三区| 欧美一级免费在线| 亚洲美女色禁图| 久久久久久久久久久久久久一区 | 黄色手机在线视频| 久久精品高清| 国产91精品一区二区绿帽| av资源网在线播放| 亚洲色图综合网| 国产精品久久久久久在线| 一区二区三区在线播| 老司机免费视频| 丝袜美腿成人在线| 国产精品亚洲天堂| 伦理一区二区三区| 国产精品自拍偷拍| av影片在线| 夜夜嗨av色一区二区不卡| jlzzjlzz亚洲女人18| 午夜久久电影网| 91精品人妻一区二区三区| 精彩视频一区二区| 日本免费不卡一区二区| 99久久婷婷这里只有精品| 成人女人免费毛片| 青青热久免费精品视频在线18| 欧美老女人性视频| 可以免费看污视频的网站在线| 欧美精品在欧美一区二区少妇| 久久久一区二区三区四区| 久久丝袜美腿综合| 成年网站在线播放| 欧美不卡在线| 免费av在线一区二区| 啪啪av大全导航福利综合导航| 美女av一区二区| 日色在线视频| 欧美精品三级在线观看| 国产在线一区视频| 国产欧美综合色| 免费在线观看日韩av| 日韩高清电影一区| 国产高清av在线播放| 五月开心六月丁香综合色啪| 久久久久高清| 视频一区在线| 成人精品在线视频| 日本欧美韩国| 热久久这里只有| 丁香花在线高清完整版视频| 日韩亚洲综合在线| 女人天堂在线| 日韩大陆毛片av| xxxx国产精品| 91精品国产色综合久久不卡蜜臀| 香蕉污视频在线观看| 亚洲va韩国va欧美va精品| 欧美精品久久久久久久久46p| 国产欧美日韩在线看| 欧美精品欧美极品欧美激情| 国产传媒日韩欧美成人| 在线免费看污网站| 久久精品国产一区二区三| 男女无套免费视频网站动漫| 蜜乳av另类精品一区二区| 波多野结衣之无限发射| 在线高清一区| 亚洲精品久久久久久久蜜桃臀| 欧美aa国产视频| 中国一级大黄大黄大色毛片| 99精品网站| 精品一区二区成人免费视频 | 91成人在线免费视频| 久久香蕉国产线看观看99| 黄色污在线观看| 91在线播放网址| 在线免费看黄色片| 成人av电影免费观看| 91九色蝌蚪porny| 成人国产免费视频| 中文字幕第3页| 99re热这里只有精品视频| 成人影视免费观看| 久久久久久日产精品| 日本免费www| 国产精品美女久久久久久久| 国产一二三av| 亚洲乱码日产精品bd| 青草草在线视频| 亚洲已满18点击进入久久| 国产亚洲精品女人久久久久久| 综合网在线视频| 免费在线观看av网址| 一区二区三区资源| 国产无码精品在线播放| 亚洲一二三区视频在线观看| 先锋在线资源一区二区三区| 国产一区福利| 久久日韩精品| 国产91久久精品一区二区| 日韩免费电影一区二区| 天天色综合色| 三年中文高清在线观看第6集| 欧美在线不卡| 男女h黄动漫啪啪无遮挡软件| 国产精品久久久久一区二区三区厕所 | 成人福利在线看| 双性尿奴穿贞c带憋尿| 久久久久亚洲蜜桃| 黄色香蕉视频在线观看| 一个色妞综合视频在线观看| 日本高清www免费视频| 日本大香伊一区二区三区| 97超碰资源站| 精品国产乱码久久久久久图片 | 天堂av在线| 国产精品九九九| 人人爱人人干婷婷丁香亚洲| 久久综合狠狠综合久久综青草 | 一区二区三区国| 欧美日韩国产高清| 青青草国产精品视频| 日韩精品视频网站| 99热一区二区| 国产高清在线观看免费不卡| 精品人妻无码一区二区三区| 亚洲人成精品久久久久| 日韩精品在线免费看| 欧美日韩三级一区| 四虎永久在线观看| 日韩中文视频免费在线观看| mm视频在线视频| 欧美在线观看日本一区| 精品一区二区三区中文字幕 | 一卡二卡在线视频| 日韩福利视频在线观看| 久久黄色美女电影| 91a在线视频| 精品国产三区在线| 日韩av高清在线播放| 欧美黄在线观看| 黄色国产小视频| 99久久国产综合精品色伊 | 欧美女王vk| 久无码久无码av无码| 黄页视频在线91| 久久婷婷五月综合| 色综合欧美在线视频区| 亚洲高清精品视频| 久久成人这里只有精品| 欧美暴力调教| 久久精品二区| 狠狠干成人综合网| 99999精品| 国产精品传媒在线| 自拍偷拍第八页| 精品国产百合女同互慰| 黄色网页网址在线免费| 国产精品露脸av在线| 蜜臀91精品国产高清在线观看| 成人免费性视频| 国产福利91精品| 日韩三级久久久| 欧美日韩综合不卡| 成人精品福利| 成人春色激情网| 久久裸体网站| 午夜精品中文字幕| 国产精品免费精品一区| 91精品国产欧美一区二区18| fc2在线中文字幕| 日本午夜精品理论片a级appf发布| 激情亚洲另类图片区小说区| 新呦u视频一区二区| 日韩精品欧美成人高清一区二区| 国产ts丝袜人妖系列视频| 亚欧色一区w666天堂| 人妻一区二区三区四区| 久久久综合av| 黄色美女久久久| 国产 日韩 欧美在线| a级高清视频欧美日韩| 全部毛片永久免费看| 亚洲美女久久久| 女生影院久久| 欧美日韩在线观看一区| 快she精品国产999| 成人片黄网站色大片免费毛片| 欧美丰满熟妇bbbbbb| 色综合久久88色综合天天免费| 国产香蕉在线| 国产日韩欧美91| 狠狠88综合久久久久综合网| 给我看免费高清在线观看| 欧美亚洲国产bt| 欧美色图天堂| 日韩黄色影视| 国产精品18久久久久| 69成人免费视频| 日韩亚洲综合在线| 久久狠狠久久| 亚洲黄色av片| 精品久久在线播放| 黄网站在线播放| 欧美精彩一区二区三区| 国产在线播精品第三| 日本视频在线观看免费| 久久精品国产2020观看福利| 欧美激情15p| 欧美又黄又嫩大片a级| 欧美午夜美女看片| 日本伦理一区二区| 亚洲一区二三| 久久久精品影视|