国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

來(lái)淘寶團(tuán)隊(duì) | 搭建編輯器的可擴(kuò)展架構(gòu)探索和實(shí)踐

共 9329字,需瀏覽 19分鐘

 ·

2021-05-15 18:56

背景

大量的業(yè)務(wù)運(yùn)作離不開紛繁復(fù)雜的頁(yè)面制作,比如淘寶,無(wú)論是行業(yè)類目還是形態(tài)各異的導(dǎo)購(gòu)營(yíng)銷方式,背后都是需要制作大量的頁(yè)面支撐。對(duì)這些頁(yè)面制作的過(guò)程進(jìn)行抽象,于是有了“頁(yè)面搭投系統(tǒng)”。

天馬搭建服務(wù)就是提供這種頁(yè)面搭建能力的服務(wù),然而僅提供實(shí)現(xiàn)搭建能力的API服務(wù)對(duì)于服務(wù)的接入方而言還是有不少的工作量,尤其是需要自行實(shí)現(xiàn)頁(yè)面搭建和數(shù)據(jù)配置這類復(fù)雜的前端交互邏輯,而這部分前端交互邏輯又幾乎趨同,于是將這部分邏輯抽離出來(lái),單獨(dú)開發(fā)了搭建編輯器實(shí)現(xiàn)了一套統(tǒng)一的基礎(chǔ)的搭建交互邏輯,于是搭建編輯器1.0版本產(chǎn)生了。

盡管搭建編輯器1.0能夠已經(jīng)能夠滿足大部分的頁(yè)面搭建需求,但是隨著業(yè)務(wù)的發(fā)展,不同的場(chǎng)景對(duì)頁(yè)面搭建產(chǎn)生了新的訴求。比如:

  1. 增加新能力:想要在頁(yè)面發(fā)布之前添加有一個(gè)審核流程
  2. 去除無(wú)關(guān)信息:釘釘場(chǎng)景下,物料的數(shù)據(jù)配置只需要上傳一張圖片,不想有電商屬性的配置干擾
  3. 僅想復(fù)用搭建編輯器的部分能力:自定義的頁(yè)面編輯,復(fù)用搭建編輯器的發(fā)布流程
  4. ...


對(duì)于這些訴求,有以下的解決方案:

  1. 方案一:接入方不再使用搭建編輯器,自己重新開發(fā)一個(gè)新的搭建編輯器,實(shí)現(xiàn)自己期望的功能。
  2. 方案二:我們幫業(yè)務(wù)在搭建編輯器中實(shí)現(xiàn),在搭建編輯器中通過(guò)不同的分支語(yǔ)句實(shí)現(xiàn)不同場(chǎng)景的需求。
  3. 方案三:將搭建編輯器進(jìn)行細(xì)粒度的拆分,提供基礎(chǔ)組件供接入方按需使用

方案一,存在重復(fù)建設(shè),而且當(dāng)搭建服務(wù)推出新功能或者做能力升級(jí)的時(shí)候,接入方需要重新開發(fā)UI交互才能做新功能的統(tǒng)一升級(jí)。
方案二,雖然能夠?qū)崿F(xiàn),但是有了一次就會(huì)有第二次,會(huì)有越來(lái)越多的業(yè)務(wù)讓你幫助實(shí)現(xiàn)不同場(chǎng)景下的邏輯,最后搭建編輯器的代碼就都是分支語(yǔ)句,而且很難維護(hù)。

if(場(chǎng)景1){
  xxxx
}
if(場(chǎng)景2){
  xxxx
}
if(場(chǎng)景3){
  xxxx
}
...

方案三,可行但價(jià)值不大。一方面增加了對(duì)細(xì)粒度組件的維護(hù)成本,另一方面接入方需要知道搭建編輯器中的數(shù)據(jù)流狀態(tài),自行將細(xì)粒度組件組合起來(lái),增加了接入成本,再一方面只有部分業(yè)務(wù)對(duì)部分組件有定制需求,拆解出細(xì)粒度組件本質(zhì)上是為了讓部分業(yè)務(wù)定制。所以能不能探尋一種方案,在不拆解現(xiàn)有組件的情況下,讓業(yè)務(wù)接入方可以快速的定制。

我們對(duì)這些訴求做了如下梳理:接入方想要使用搭建編輯器80%的能力,其中20%的能力想要自己做一下拓展定制,包括在指定的位置執(zhí)行渲染邏輯和使用搭建編輯器中的數(shù)據(jù)流。

抽象一層就是,期望搭建編輯器能夠給定一個(gè)渲染組件的節(jié)點(diǎn)并支持訪問內(nèi)部的數(shù)據(jù)狀態(tài),而且可以按需獨(dú)立加載。

于是,我們開始對(duì)下一代搭建編輯器進(jìn)行探索和實(shí)踐,期望實(shí)現(xiàn)以下兩種能力:
(1)支持內(nèi)部組件替換
(a)組件替換
(b)屏蔽不需要的交互邏輯
(2)共享業(yè)務(wù)組件內(nèi)部的數(shù)據(jù)狀態(tài)
(a)獲取組件的內(nèi)部狀態(tài)
(b)修改組件的內(nèi)部狀態(tài)
**

兩個(gè)思路

可擴(kuò)展架構(gòu)

所有接入方在使用搭建編輯器的時(shí)候?qū)拥暮蠖朔?wù)本質(zhì)上都是天馬提供的服務(wù),所以可以理解為同一套后端服務(wù)在不同業(yè)務(wù)場(chǎng)景下的前端交互實(shí)現(xiàn)。其本質(zhì)是讓搭建編輯器在不同場(chǎng)景下具備不同的能力,參考vscode的設(shè)計(jì),我們讓搭建編輯器具備擴(kuò)展的能力,讓使用方通過(guò)開發(fā)擴(kuò)展的方式來(lái)豐富搭建編輯器的能力,從而滿足不同場(chǎng)景下的需求,搭建編輯器則提供最核心的搭投能力。



擴(kuò)展只能夠新增一些能力,如果對(duì)于現(xiàn)有的搭建編輯器能力有定制需求,期望可以通過(guò)替換內(nèi)部組件的方式進(jìn)行修改。我們可以將搭建編輯器視為一個(gè)組件的容器,其中的每一個(gè)子組件都在容器中進(jìn)行注冊(cè)

{
  name:'組件名',
  component:'組件實(shí)例'
}

當(dāng)容器中組件的映射關(guān)系發(fā)生變化的時(shí)候就動(dòng)態(tài)渲染組件,這樣就可以通過(guò)全局注冊(cè)組件的方式來(lái)進(jìn)行組件替換。

組件數(shù)據(jù)狀態(tài)共享

Redux這樣的數(shù)據(jù)狀態(tài)管理庫(kù)已經(jīng)能夠在同一個(gè)組件的不同子組件之間跨級(jí)共享數(shù)據(jù)狀態(tài),但是兩個(gè)業(yè)務(wù)組件之間共享數(shù)據(jù)狀態(tài)則需要在這兩個(gè)業(yè)務(wù)組件之間加一個(gè)公共父組件,再通過(guò)Redux這樣的數(shù)據(jù)管理方案進(jìn)行數(shù)據(jù)狀態(tài)的共享,但是想要從業(yè)務(wù)組件A訪問當(dāng)業(yè)務(wù)組件B中的數(shù)據(jù)狀態(tài)就非常的難。

如果業(yè)務(wù)組件A和業(yè)務(wù)組件B的數(shù)據(jù)狀態(tài)能夠分別維護(hù)在組件內(nèi)部,但是又可以通過(guò)某種方式相互訪問那就最好不過(guò)了。


為了實(shí)現(xiàn)上述兩個(gè)思路,我們做了以下的實(shí)現(xiàn)。

設(shè)計(jì)實(shí)現(xiàn)

第一步:核心搭投流程梳理

首先我們對(duì)核心搭投流程進(jìn)行梳理,確定搭建編輯器需要提供的核心能力,也就是搭建編輯器的內(nèi)核所具備的能力。

定義一次搭投流程:新建頁(yè)面->選擇搭建類型->進(jìn)入搭建編輯器->頁(yè)面搭建->數(shù)據(jù)投放->發(fā)布 目前主要為模塊搭建為核心流程

第二步:搭建編輯器層級(jí)設(shè)計(jì)

按照搭建流程中使用的核心能力,我們將搭建編輯器設(shè)計(jì)成UI和Data兩部分。

  • UI:
    • Header:收斂頁(yè)面級(jí)別的操作:頁(yè)面設(shè)置和頁(yè)面發(fā)布。
    • Editor:頁(yè)面的核心編輯區(qū)域,包括頁(yè)面插件、搭建頁(yè)面預(yù)覽、模塊管理和數(shù)據(jù)配置
  • Data:
    • Model:全局的數(shù)據(jù)狀態(tài)管理

第三步:Model層設(shè)計(jì)

原來(lái)組件之間的數(shù)據(jù)狀態(tài)可以通過(guò)props傳遞進(jìn)行共享,例如,當(dāng)需要實(shí)現(xiàn)點(diǎn)擊模塊列表的添加模塊按鈕時(shí)彈出模塊中心,這時(shí)候需要在模塊列表和模塊中心的公共父組件中通過(guò)props將數(shù)據(jù)狀態(tài)傳遞給模塊中心和模塊列表來(lái)實(shí)現(xiàn)。

// 模塊中心和模塊列表偽代碼
// 模塊中心和模塊列表的公共父組件偽代碼
import ModuleCenter from 'ModuleCenter';
import ModuleList from 'ModuleList';
import {useState} from 'react;
function App() {
  const [moduleCenterVisible,setModuleCenterVisible] = useState(false);
  
  return (
    <>
     <ModuleCenter 
      moduleCenterVisible={moduleCenterVisible} 
    setModuleCenterVisible={setModuleCenterVisible}
   />
     <ModuleList setModuleCenterVisible={setModuleCenterVisible}/>
    </>
  )
}

由于搭建編輯設(shè)計(jì)之初并沒有考慮組件替換和數(shù)據(jù)狀態(tài)共享的能力,所以我如果想改變交互方式,能夠在Header中點(diǎn)擊打開模塊中心就成了一件難事。
為了讓組件的數(shù)據(jù)狀態(tài)能跨區(qū)域在多個(gè)位置調(diào)用,我們需要對(duì)Model層進(jìn)行設(shè)計(jì),將原來(lái)復(fù)雜的依賴關(guān)系抽離出來(lái)統(tǒng)一管理,用一個(gè)全局的數(shù)據(jù)狀態(tài)進(jìn)行管理。


之后,再多一個(gè)數(shù)據(jù)狀態(tài),只需要在全局的數(shù)據(jù)狀態(tài)管理器上進(jìn)行注冊(cè),其余組件就可以通過(guò)全局?jǐn)?shù)據(jù)狀態(tài)拿到這里值了。

我們按照操作的類型將Model層劃分為四類:

  • 全局配置
  • 模塊操作
  • 頁(yè)面操作
  • 插件相關(guān)

第四步:支持內(nèi)部組件替換

下一代搭建編輯器核心還是能夠修改業(yè)務(wù)組件的內(nèi)部細(xì)節(jié), 很重要的一點(diǎn)就是組件替換。如果內(nèi)部組件可以被替換,這樣使用者只需要替換自己有定制訴求的那個(gè)組件,將開發(fā)整個(gè)業(yè)務(wù)組件的成本降低為只開發(fā)部分功能組件。比如,某個(gè)業(yè)務(wù)并不需要復(fù)雜的發(fā)布流程,僅需要一個(gè)發(fā)布審核,這時(shí)候替換掉發(fā)布流程是最快復(fù)用搭建編輯器的方式。

原發(fā)布流程

新增發(fā)布審核

我們對(duì)可替換的組件進(jìn)行了接口規(guī)范約束:

interface IInjectComponent {
  name: string// 被替換的組件的名稱,全局唯一
  component?: React.ComponentType | string// 替換的組件
}

用一個(gè)全局的Map來(lái)管理name到component的映射關(guān)系,component可以是npm包或者cdn的方式。提供一個(gè)組件注冊(cè)的方法registerComponent,用來(lái)修改component的映射關(guān)系

function registerComponent(props:IInjectComponent|IInjectComponent[]{
  // 替換component的映射關(guān)系
}

實(shí)現(xiàn)組件替換的能力:
(1)npm包方式加載的本地組件我們采用 React.createElement 的方式進(jìn)行渲染;
(2)遠(yuǎn)程cdn加載的的組件,我們使用了@ice/stark-module ,它可以將UMD打包的組件進(jìn)行遠(yuǎn)程加載成一個(gè)微模塊。然后讓組件運(yùn)行時(shí)替換。

此時(shí)支持內(nèi)部組件替換的方式基本完成,偽代碼的實(shí)現(xiàn)方式就是

function InjectComponent(props{
  const {name,defaultComponent,...otherProps} = props;
  const component= getComponent(name) || defaultComponent;// 通過(guò)name找到Map上注冊(cè)的組件
  if(isRemote(component)) {
    return <MicroModule url={component} {...otherProps}/>;
  }else {
    return React.createElement(component,otherProps)
  }
}



//讓發(fā)布組件可替換,將發(fā)布組件用如下方式實(shí)現(xiàn)
registerComponent({
  name:'publish-component',
  component:PublishComponent
})
//defaultComponent用來(lái)注冊(cè)默認(rèn)的組件
<InjectComponent name="publish-component" defaultComponent={PublishComponent} {...defalutProps}/>
 
// 替換發(fā)布組件
registerComponent({
  name:'publish-component',
  component:'https://new-publish-component'
})

這樣一來(lái)既支持修改業(yè)務(wù)組件的局部邏輯也支持了擴(kuò)展的動(dòng)態(tài)按需加載。而且業(yè)務(wù)組件的任何子組件只需要通過(guò) InjectComponent 進(jìn)行包裝就可以成為一個(gè)可被替換的組件。

第五步:共享業(yè)務(wù)組件內(nèi)部的數(shù)據(jù)狀態(tài)

由于接入方開發(fā)的擴(kuò)展組件不會(huì)打包到搭建編輯器內(nèi)部,這時(shí)候就需要有一種方法來(lái)獲取搭建編輯器內(nèi)部的狀態(tài)。這時(shí)候一個(gè)常見的想法就是預(yù)先設(shè)計(jì)好,需要使用的數(shù)據(jù)狀態(tài)通過(guò)props傳入,只要替換組件與原組件的props保持一致,就可以使用搭建編輯器傳入的數(shù)據(jù)狀態(tài)

<InjectComponent name="publish-component" props1={props1} props2={props} {...otherProps}/>

這種方式會(huì)有一個(gè)限制,只允許使用傳入的props,如果想要使用其他數(shù)據(jù)狀態(tài)就需要修改搭建編輯器的代碼,增加額外的props。

如果業(yè)務(wù)組件的數(shù)據(jù)狀態(tài)是掛載在全局應(yīng)用的狀態(tài)中的,那么就可以全局共享業(yè)務(wù)組件中的數(shù)據(jù)狀態(tài)了。


一個(gè)想法就是有一個(gè)狀態(tài)管理庫(kù)是一個(gè)單例模式,通過(guò)命名空間來(lái)管理數(shù)據(jù)狀態(tài),當(dāng)同時(shí)使用這個(gè)狀態(tài)管理庫(kù)的兩個(gè)組件在一個(gè)應(yīng)用中使用的時(shí)候就可以通過(guò)命名空間訪問到對(duì)應(yīng)的數(shù)據(jù)狀態(tài)。全局狀態(tài)管理庫(kù)只需要具備兩個(gè)方法registerModel,useModel,偽代碼表示:

// 業(yè)務(wù)組件內(nèi)部的狀態(tài)管理
import {registerModel} from 'golbalStore'// 全局狀態(tài)管理庫(kù)
import {useState} from 'react'
function ModleA(){
  // 也可以使用Redux,這里為了方便使用useState
  const [state1,setState1] = useState() 
  return {
    state1,setState1
  }
}
// 按照name進(jìn)行注冊(cè)到全局單例上
export default registerModel(ModuleA,{name:'ComA-ModuleA'})
// 在擴(kuò)展組件中獲取業(yè)務(wù)組件A中的數(shù)據(jù)狀態(tài)
import {useModel} from 'golbalStore';

function ExtCom({
  // 通過(guò)命名空間找到單例上的Model
  const comAModelA = useModel('ComA-ModuleA');
  // 訪問數(shù)據(jù)狀態(tài)
  console.log(comAModelA.state1)
  ...
}

我提供了一個(gè)類似Redux的狀態(tài)管理工具,將Model層注冊(cè)到全局的單例中。這樣,擴(kuò)展組件只需要通過(guò)這個(gè)單例就能夠快速訪問和修改數(shù)據(jù)狀態(tài)。

第六步:實(shí)現(xiàn)類中間件的方式修改局部狀態(tài)

有時(shí)候只是想修改組件的部分狀態(tài)并不需要替換掉整個(gè)組件,比如,一個(gè)搭建編輯器的一個(gè)Button文案想要從“發(fā)布”修改為“發(fā)布頁(yè)面”,其實(shí)只是修改文案,Button的點(diǎn)擊邏輯還是想保留,這時(shí)候組件替換需要重新實(shí)現(xiàn)一遍Button的點(diǎn)擊邏輯。

// Button 的使用
import Button from 'Button'

function App(){
  return <Button text="發(fā)布"}/>
}

假如,Button的文案是通過(guò)props傳入的,那我們其實(shí)只需要一個(gè)類似中間件的能力,對(duì)傳入的props做中轉(zhuǎn)處理,返回我們想要的結(jié)果即可。

搭建編輯器實(shí)現(xiàn)

<Injectcomponent name="publish-button" component={Button} text="發(fā)布"/>

在Injectcomponent內(nèi)部修改props

function InjectComponent(props){
  const = {name,component,...otherProps} = props;
  // 調(diào)用中間件處理
  const newProps = FnModdileWay(otherProps)
  ...
  React.createElement(component,newProps)
}

再舉一個(gè)復(fù)雜的案例,對(duì)于想要新增一個(gè)發(fā)布節(jié)點(diǎn)的需求。將問題簡(jiǎn)化一下就是有一個(gè)List中插入一個(gè)item的問題

[a,b,c] => [a,d,b,c]

此時(shí),我們需要獲取到原始傳入的List [a,b,c] 之后對(duì)這個(gè)List進(jìn)行操作,添加一個(gè) d 獲得新的List [a,d,b,c] ,然后消費(fèi)新的List。

如果將發(fā)布流程中的節(jié)點(diǎn)抽象出來(lái)作為props傳入,然后有一個(gè)中間件函數(shù)能夠?qū)rops進(jìn)行修改,這樣就能夠滿足需求。我們將這類可以對(duì)props進(jìn)行操作的組件稱為擴(kuò)展點(diǎn)ExtensionPoint。

首先我們需要一個(gè)中間件的注冊(cè)函數(shù)來(lái)告訴組件"傳給你的props需要先經(jīng)過(guò)中間件加工",并注冊(cè)中間件函數(shù)。register函數(shù)會(huì)將中間件函數(shù)放入一個(gè)隊(duì)列中。

// 偽代碼實(shí)現(xiàn)

// 獲取ComA-ModuleA的擴(kuò)展點(diǎn)注冊(cè)函數(shù),并采用泛型傳入props的定義
const register = useExtensionPoint<ComAModuleAProps>('ComA-ModuleA');

// 注冊(cè)使用

useEffect(()=>{
  // 返回一個(gè)clean,用于組件卸載的時(shí)候清楚中間件和副作用
  const clean = register((props)=>// 注冊(cè)
    return {
      props,
      state1:newState1 // 修改新的state
    }
  })
  return () => clean();
},[])


我們將上面提到的InjectComponent進(jìn)行一輪改造

function InjectComponent(props{
  const {name,...otherProps} = props;
  // 通過(guò)name找到Map上注冊(cè)的組件
  const component= getComponent(name);
  //通過(guò)name找到對(duì)應(yīng)的中間件處理函數(shù)隊(duì)列,依次執(zhí)行中間件函數(shù),會(huì)對(duì)otherprops進(jìn)行deepClone
  const extProps = useExtension(name,otherprops);
  
  if(isRemote(component)) {
    return <MicroModule url={component} {...extProps}/>;
  }else {
    return React.createElement(component,extProps)
  }
  
}

這樣就能方便修改內(nèi)部組件的props了,從而修改局部的狀態(tài),對(duì)于新增發(fā)布流程節(jié)點(diǎn)就是為props新增一個(gè)符合節(jié)點(diǎn)抽象規(guī)范的新節(jié)點(diǎn)。

一種通用的將業(yè)務(wù)組件可擴(kuò)展化的方案

至此搭建編輯器已經(jīng)修改為具備可擴(kuò)展能力的業(yè)務(wù)組件。而且這種改造方式十分簡(jiǎn)單,可以被快速移植,只需要將一個(gè)應(yīng)用的狀態(tài)用一個(gè)全局的單例進(jìn)行管理,并將需要改造的組件修改為下面的方式:

<InjectComponent name="組件名稱" defaultComponent={默認(rèn)組件} {...默認(rèn)的props}/>

即可快速將一個(gè)現(xiàn)有的業(yè)務(wù)組件快速修改為一個(gè)具備擴(kuò)展能力的組件。

未來(lái)

目前的實(shí)現(xiàn)相當(dāng)于將現(xiàn)有的"橡皮" + "鉛筆" 組合成 "帶橡皮的鉛筆",雖然能夠達(dá)到想要的效果,但是還是存在一些問題:

1、搭建編輯器會(huì)提供默認(rèn)的組件,即使進(jìn)行了組件替換,原組件還是打包在搭建編輯器內(nèi)部,增加了代碼體積。未來(lái)還是期望能夠按照擴(kuò)展的配置文件,按需打包組件。
2、尚未形成像vs code 這樣的擴(kuò)展生態(tài)。需要建立統(tǒng)一的擴(kuò)展開發(fā)標(biāo)準(zhǔn)和擴(kuò)展開發(fā)腳手架,逐步建立搭建編輯器的擴(kuò)展生態(tài),方便對(duì)擴(kuò)展的治理和維護(hù)。
3、豐富頁(yè)面搭建的能力。 頁(yè)面=頁(yè)面結(jié)構(gòu)(數(shù)據(jù)) 是產(chǎn)生一張頁(yè)面的基本范式,頁(yè)面與數(shù)據(jù)之間的接口是固定的,但產(chǎn)生頁(yè)面結(jié)構(gòu)的方式是靈活的,通過(guò)擴(kuò)展的方式,可以豐富頁(yè)面搭建的能力,在不同的場(chǎng)景下使用不同的搭建方式。 
4、目前技術(shù)方案中采用的狀態(tài)管理是icestore,微模塊替換方案是icestack/module,所以還是期望能夠?qū)⑦@套方案集成到ice體系,一起開源出去。

瀏覽 35
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 国产一区久久| 欧美国产激情| 亚洲成人AV无码| 91美女被操| 日日射视频| 体内射精免费视频| 亚洲无码免费| 97人妻在线| ThePorn日本无码| 久草毛片| 日本免费黄| 熟女人妻在线视频| 亚洲AV久久无码| 水果派解说A∨无码区| 欧美日韩一区二区三区| 欧美在线一区二区| 免费一级黄色| 免费操逼视频在线观看| 伦理被部长侵犯HD中字| 高清无码爱爱| 风间由美大荫蒂无码AV| 亚洲AV无码成人精品区h麻豆| 亚洲精品一区中文字幕乱码| 超碰自拍私拍二区三区区| 久久69| 99精品在线免费观看| 中文字幕不卡无码| 乱子伦国产精品www| 99成人网站| 先锋资源久久| 天天日天天操天天爽| 无码人妻丰满熟妇啪啪| 国产成人小视频在线观看| 日本三级网址| 韩国GOGOGO高清| www.狠狠操| 国产黄色影院| 日本一级黃色大片看免费| 日韩小视频在线观看| 天天色AV| 欧美级毛片一进一出夜本色| 中文字幕无码网站| 99成人网站| 国产做爰XXXⅩ久久久骚妇| 91人人妻人人澡人人爽人人精品| 中文无码毛片| 亚洲天堂AV2025| 麻豆艾秋MD0056在线| 天堂成人在线视频| 殴美亚洲一流| 亚洲综合伊人| 高清无码黄片| 国产精品揄拍一区二区| 国产高清无码在线| 在线一级片| av三级片在线观看| 搞搞爱| 亚洲色图一区二区三区| 国产在线观看无码免费视频| 大黑人荫蒂BBBBBBBBB| 无码日韩视频| 波多野结衣无码高清视频| 亚洲黄色视频网站在线观看 | 国产aaaaaaaaaa| av一区二区在线观看| 91无码一区二区| 粉嫩99国产精品久久久久久人妻| 亚洲综合成人在线| igao在线观看| 丁香五月激情啪啪| 高清无码成人视频| 午夜试看120秒体验区的特点| 操逼首页123| 毛片天天干| 日韩一区二区在线看在线看| 天天澡日日久| 岛国免费视频| jizz国产视频| 少妇BBB| 日韩日韩日韩日韩日韩| 丁香花五月天| 69成人在线电影| 99久久国产热无码精品免费| 欧美熟妇搡BBBB搡BBBBB| 97国产精品视频人人做人人爱| 17c白丝喷水自慰| 成人不卡在线| 无码aⅴ| 神马午夜精品91| 中文字幕日本无码| 亚洲欧美卡通| 国产女人18水真多18精品一级做 | 性九九九九九九| 天天日天天操天天摸天天干天日射天天插 | av无码毛片| 欧美黄色免费在线观看| 欧美在线视频网| 欧洲AV在线| 精品国产A片| 亚洲国产电影| 久久久久久婷婷| AV无码中文| 夜夜操网站| 久久久久无码| 欧美黑吊大战白妞欧美大片| 日韩午夜成人| 欧美四区| 东京热无码视频| 国产精品视频一区二区三| 激情导航| 日韩精品成人AV| 超碰在线最新| 91一级A片在线观看| 猛男大粗猛爽h男人味| 翔田千里在线观看| 俄罗斯白嫩BBwBBwBBw91| 五月天婷婷导航| 亚洲AV无码精品成人| 色婷婷亚洲婷婷| 黄色福利在线观看| 大香蕉伊人综合| 六月激情| 国产曰韩欧美综合另类在线| 欧美草比| 性欧美丰满熟妇XXXX性久久久| 四川性BBB搡BBB爽爽爽小说 | 亚洲色偷精品一区二区三区| 大香蕉av在线观看| 国产十八岁在线观看| 成人做爰A片一区二区| 伊人大香蕉在线| 欧美大吊在线| 亚洲无码午夜| 三区在线观看| 丁香五月中文| 中文在线a∨在线| 亚洲图片欧美另类| 一级A片一毛片大全| 三级片大香蕉| 久久亚洲日韩天天做日日做综合亚洲| 操日视频| 欧美成人网址在线观看| 人人cao| 国产精品国三级国产a11| 三根一起进菊眼| 91AV在线看| 人人操人妻| 俺去搞| 一级操逼大片| 日韩av无码电影| 作爱网站| 亚洲欧洲免费| 成人国产综合| 97国产在线| 11孩岁女精品A片BBB| 黄色网址在线观看视频| 99国产综合| 河南乱子伦视频国产| Chinese搡老女人| AV一级片| 97伊人| 欧美熟女性爱视频| 日韩精品观看| 天天搞天天搞| 成人性爱免费视频| 天天操网站| 日韩综合色视频导航| 人人摸人人操人人爽| 99re在线精品| 男女黄网站| 国产真实乱婬A片三区高清蜜臀| 青青草97国产精品麻豆| 日韩国产欧美精品一区| 婷婷视频导航| 人人妻天天干| 一道本一区二区三区| 国产成人小视频| 伊人在线| 国产午夜精品视频| av一区在线观看| 精品孕妇一区二区三区| 成人久久视频| 黄片AV| www.av免费| 91成人视频免费观看| 欧美久久久久久| 麻豆国产精品一区| 亚洲AV成人片无码网站| 久久免费看视频| 亚洲高清福利视频| 水蜜桃视频在线| 亚洲AV毛片| 奇米久久| 蝌蚪窝免费在线视频| 免费无码婬片AAAA片在线蜜芽| 免费AV在线播放| 国产免费AV在线| 国产精品久久| 一本色道久久88亚洲精品综合| 91AV在线免费观看| 秋霞福利网| 精品在线免费观看| 狠狠香蕉| 第一福利导航大全| 杨门女将婬乱史1—6| 国产天堂在线| 中文字幕乱码视频32| 麻豆91蜜桃传媒在线观看| 天天高清无码| 欧美成人无码A片免费| 中文视频免费播放| 熟女伦乱| 成人福利午夜A片公司| 国产成人无码精品久在线观看| 97在线观看免费| 蜜臀久久99精品久久久久久牛牛| 在线中文AV| 国产精品视频99| AV在线精品| 懂色成人av影院| 91无码人妻东京热精品一区| 婷婷在线电影| 国产高清无码视频在线观看| 免费观看高清无码视频| 性欧美欧美巨大69| 中文字幕一区二区三区免费2023| 国产福利视频在线观看| 欧美一级做| 中文字幕高清无码在线| 91婷婷五月天| 一本一道vs波多野结衣| 在线观看黄色网页| 一区二区三区电影| 91人人澡| 毛片A片免费看| 天天干视频在线| 国产精品无码一区二区在线欢| 9191久久| 亚洲午夜av| 一本一道久久| 韩国三级AV| 四川少妇搡bbw搡bbbb| 2025AV天堂| 国产在线观看免费成人视频| 蜜桃人妻无码AV天堂二区| 日本在线视频一区二区| 狼友在线视频| 成年片免费观看网站免费观看,亚洲+欧... | 成人自拍视频在线| www.6969成人片亚洲| 国产黄色大片| 五月天综合在线| 干屄网| 就去se超碰| 免费污视频在线观看| 怡红院欧美| 在线无码播放| 欧美老妇另类BBwBBw| 亚洲精品久久久久久久久豆丁网| 先锋AV资源| 水多多成人视频| 日批免费视频| 日韩aaa| 一区二区三区在线视频观看| AV网站在线播放| 久久久久久无码日韩欧美电影| 国产亚洲精品午夜福利巨大软件| 中文字幕第12页| 欧美成人视频电影无码高清| 猛男大粗猛爽H男人味| 九色PORNY9l原创自拍| 无码av观看| 9l视频自拍九色9l视频成人| a天堂视频| 黄色网址五月天| 91无码人妻精品一区二区蜜桃| 国产乱码一区二区三区的解决方法| 国产免费网址| 深夜福利av| 亚洲一级黄色片| 中文字幕国产在线观看| 日韩无码视| 视频在线a| 国产视频在线免费观看| 91成人影片| 波多野结衣视频无码| 欧美色色色色色| 午夜成人福利视频在线观看| 爱草在线| 国产小黄片| 欧美激情一区二区A片成人牛牛| 黄色视频网站在线免费观看| 黑吊操| a√免费看| 88av在线| 亚洲高清无码视频在线播放| 麻豆视频一区二区| 成年人毛片视频| 家庭乱伦AV| h片在线免费观看| 成年人视频网| www.偷拍| 91精品久久久久久综合五月天| 丰满人妻一区二区三区精品高 | 女人卖婬视频播放| 国产乱人伦无码视频| 香蕉久草| 日本黄色片在线播放| 日本高清黄色视频| 无码人妻丰满熟妇区毛片蜜桃麻豆 | 亚洲婷婷五月天| 免费亚洲婷婷| www,色婷婷| 国产激情无码视频| 国产精品视频导航| 日韩成人无码电影| 国产久久精品视频| 亚洲综合影院| 中文字幕高清无码免费视频| 熟女人妻视频| 无码a区天堂| 日韩综合在线观看| 国产免费无码| 伊人大香蕉视频在线观看| 国产精品TV| 蜜桃无码在线| 大香伊人中文字幕精品| 免费AV资源在线观看| 在线免费毛片| 日韩中文字幕无码人妻| 日批视频在线观看| 国产乱码精品一区二区三区的特点| 色妞视频| 国产熟女一区二区久久| 无码内射在线播放| A∨无码免费| 亚洲中文幕| 一区二区三区av| 黃色一級片黃色一級片尖叫声-百度-百| 国产欧美熟妇另类久久久| 免费黄网站在线观看| 毛片福利| 中文精品在线| 透逼视频| 黄色一级视频在线观看| 91免费观看视频| 日韩一区二区三区免费视频| 激情欧美| 国内精品久久久久久久久久| 精品福利在线观看| 性爱视频久久| 久久777| 成人精品123| 欧美精品在线观看| 一级性爽AV毛片| 懂色av| 少妇bbb| 秋霞精品一区二区三区| 黄片小视频在线观看| 亚洲高清人妻| 91丨九色丨熟女丰满| 蜜桃视频网站在线观看| 亚洲色图成人网| 超碰在线免费播放| 日韩熟妇无码中文字幕| 久久久久久久极品内射| 正在播放国产精品| 2026AV天堂网| 色婷婷精品| 国产乱子伦一区二区三区免看| 欧美精品久久久| 日韩三级片在线视频| 色AV高清| 高潮AV在线观看| 日韩三级中文| 欧美性爱视频在线观看| 欧美日韩在线观看一区二区三区| 国产特级毛片| 日韩无码AV中文字幕| 日日撸夜夜撸| 91成人在线电影| 白浆四溢av| www.日韩无码| 日本熟妇HD| 中文字幕熟女人妻| 五月婷综合| 大香蕉伊人视频| 国产三级免费观看| 亚洲无码高清在线观看视频| 一区二区三区视频在线| 亚洲无码另类| 国产一区二区三区免费| 亚洲欧美另类色图| 日韩性爱网站| 国产亚洲欧美精品综合在线| 西西西444www无码视频| 中文字幕熟女人妻| 九九精品免费视频| 甘肃WBBBB搡wBBBB| 九九热re99re6在线精品| 中文字幕一区二区三区人妻在线视频 | 亚州精品无码| 欧美黄片一区| 亚洲色人妻| 国产精品美女毛片真酒店| 蜜桃视频无码区在线观看| 好想被c秘好爽n网址| 精品日韩一区二区三区| 亚洲AV无码成人精品久久久| 91绿帽人妻-ThePorn| 性色在线| 天天影视综合网免费观看电视剧国产 | 三级乱伦| 青青草无码在线| 国产性精品| 成人特级毛片全部免费播放 | 欧美日韩一级二级三级| 亚洲久热| 无码人妻A片一区二区青苹果| 国产成人精品a区在线观看| 毛多水多丰满女人A片| 成人无码影院日韩,成人年…| 国产九色91回来了| 国产AV小电影| 亚洲成人视频在线播放| 综合天堂AV久久久久久久| NP玩烂了公用爽灌满视频播放 | 亚州在线中文字幕经典a| 天天插天天拍| 青草网在线观看| 亚洲黄片视频| 一区二区三区网站| 色哥网在线一区| 久久77777| 天天日天天干天天爽| 三级黄色视频| 青草久久久| AA丁香综合激情| 亚洲天堂在线观看视频网站| 国产高清免费视频| 国产精品不卡在线观看| 久草电影网站| 久久精品一区| 大鸡吧视频在线观看| 先锋资源久久| 人妻少妇91精品一区黑人| 中文字幕熟女人妻| 三上悠亚一区二区| 天堂中文网| 天天干网址| 97国产在线视频| 97超碰在线视| 国产免费视频| 视频一二三区| www.日韩| 91在线一区二区| 老熟女伦一区二区三区| 日本伊人网| 中文字幕在线日韩| 91原创视频| 亚洲婷婷精品国产成人| 日本少妇午夜福利| 日本性爱一区| v天堂| 黄色三极片| 国产精品大香蕉| 日韩免费黄色电影| 国产女人18毛片水真多成人如厕 | 99精品亚洲| 丁香六月婷婷| 亚洲AV永久无码精品| 狠狠狠狠狠狠狠狠狠| 中文字幕无码精品| 青娱乐青青草| 亚洲中文字幕视频在线观看| 色吊丝中文字幕| 人人操人人干人人妻| 99热这里有精品| 免费a片视频| 国产熟女一区| 国产suv精品一区二区6精华液 | 无码一区二区黑人猛烈视频网站| 肏逼网站在线观看| 91蜜桃视频| 日本黄色视| 国产午夜精品一区二区三区牛牛 | 日韩在线中文| 操欧美美女| 爆操网站| 日韩bbbb| 免费看性蜜桃| 免费在线观看毛片| 有码中文字幕在线观看| 伊人大香蕉精品| 欧美自拍一区| 在线观看免费黄色视频| 操逼亚洲| 国产a级视频| 肏逼免费视频| 91亚洲在线观看| 波多野结衣av在线| 日本黄色小视频| 特级西西444www大精品| 国产香蕉视频在线播放| 日韩vA| 伊人黄色| 一本色道久久综合亚洲二区三区| 你懂的网站在线观看| 精品精品精品| 日本欧美一级片| 性欧美成人18| 欧美综合激情| 牛牛影视av老牛影视av| 久色视频在线| 黄色小说在线播放| 婷婷激情丁香五月天| 日韩一区二区视频| 91人妻论坛| 狠狠躁日日躁夜夜躁2022麻豆| 日本A在线播放| 美日韩一级| 一级黄色蜜芽视频| 97超碰在线播放| 成人无码区免费A片| 处破女初破全过免费看| 青青草视频偷拍| 91福利区| 色94色.欧美.setu| 欧一美一婬一伦一区| 91精品导航| 伊人影院在线观看| 高清无码在线视频观看| 一道本无码视频| 欧美性爱XXXX| 99视频在线| 91久久99久久91熟女精品| 国产成人无码区免费AV片在线| 人人爽久久涩噜噜噜网站| 亚洲免费人妻| 天天干天天操天天拍| 大香蕉伊人成人网| 不雅一级| 男女啪啪免费| 午夜成人在线| 国产日韩一区| 日韩亚洲欧美在线| 中文字幕精品一区| 免费人成在线观看视频播放| 婷婷色大师| 国产三级国产三级国产普通话| 亚洲资源在线| 日韩一区无码| 五月天啪啪| www.婷婷六月天| 国产亲子乱XXXXimim/| 精品三级在线观看| 影音先锋婷婷| 操美女一区二区| 人妻无码一二三区免费| 欧美三级片在线| 亚洲日本欧美| 337p大胆色噜噜噜噜噜| 男人的天堂亚洲| 久久久久久免费毛片精品| 国产色悠悠| 精品尤物在线| 女女女女女女BBBBBB手| 成人黄色网址| yOujiZZ欧美精品| 无码一区二区三区四区五区| 亚洲无码AV电影| 蜜桃av在线播放| 99精品视频免费| 一区二区三区无码高清| 亚州免费视频| 成人伊人电影| 黄色香蕉视频| 亚洲黄色在线免费观看| 色婷婷欧美在线播放内射| 91资源在线| 尤物视频在线| 9999国产精品| jizz无码| 亚洲精品一区二区三区四区五区六区 | 一区二区水蜜桃| 成人午夜福利视频| 五月天精品视频| 亚洲日韩欧美色图| 一卡二卡三卡无码| 亚洲中文字幕第一| 可以免费观看的AV| 秋霞91| 黄色成人网站在线观看| 人人操人人摸人人干| 久久五月天婷婷| 夜夜爽天天爽| 成人精品久久| 黄色小说视频网站| 中文字幕在线观看日本| 黃色一級片黃色一級片尖叫声-百度-百 | 超碰精品在线| 十八禁在线播放| 视频一区二区三区在线观看| 蜜芽成人网站| 99热在线只有精品| 在线观看视频无码| 成人av免费观看| 中文字幕日韩AV| 亚洲AV无码乱码A片无码沈樵| 好逼天天操| 久热只有精品| 污污污污污www网站免费民国| 国产精品欧美综合在线| 狼友视频在在观看| 成人网站在线观看免费| 成年人毛片| 激情欧美| 日韩在线中文| 成人做爰A片AAA毛真人| 久久综合电影| 一二三四在线视频| 成人爽a毛片一区二区免费| 亚洲国产激情| 欧美成人激情视频| 狠操在线| 免费黄片视频在线观看| 特级西西人体WWWWW| 91叉叉叉| 亚洲色爽| 91视频中文字幕| 国产黄色视频在线免费看| 北条麻妃性爱视频| 国产视频黄| 午夜成人中文字幕| 国产l精品久久久久久久久久| 亚洲精品一区二区三区无码电影| 天天爽夜夜爽夜夜爽精品| 在线se| 黄片高清无码在线观看| 刘玥一级婬片A片AAA| 大地影视官网第三页入口| 手机AV在线观看| 丁香五月天激情网| 久久久久久久免费无码| 久久国产精品精品国产色婷婷| 成人TV| 先锋资源久久| 免费尻屄视频| 人人操超碰在线观看| 亚洲天堂在线观看免费视频| 国产美女福利| 日韩欧美中文字幕公布| 亚洲男女免费视频| 九九韩剧网最新电视剧免费观看| 东北操逼视频| 日本V片| 日本aa视频| 亚洲无码在线播放视频| 囯产精品99久久久久久WWW| 爱操综合| 欧美性爱天天操| 狠狠干五月天| 欧美一级性爱视频| 午夜成人无码| 欧美一级黄色A片| 亚洲男人天堂av| 日本一区二区三区在线视频| 中文字幕日韩在线观看| 伊人无码视频| 亚洲黄色影院| 免费观看毛片| www.91av| 999reav| 亚洲国产黄片| 91探花精品偷拍在线播放| 亚洲av色图| 91无码高清视频| 成人久久久久久| av一卡二卡| 嫩草嫩草69| 国产av三级| 天码人妻一区二区三区在线看| 操逼操123| 国产精品福利小视频| 毛片毛片毛片毛片毛片毛片| 免费精品视频| www.黄色在线观看| 无码电影网站| jizz亚洲| 少妇在厨房| 99日韩无码| 黄片www.| 国产成人久久777777| 九九久久精品视频| www.污污污| 久久久精品久久久| 久久久精品免费视频| 黄色视频网站在线免费观看| 99热99精品| 国产欧美一区二区三区在线看蜜臀 | 国产Av一区二区三区| 成人AAA| 中文字幕三级片| 亚洲AVwww| 亚洲成人中文字幕在线| 日韩无修正| 国产一级二级三级久久久| 多啪啪免费视频| 熟女少妇视频| 男人在线天堂| 俺去听听婷婷| 女人天堂av| 激情婷婷| 青青青青操| 北条麻妃九九九精品视频免费观看| 97免费视频在线观看| 亚洲在线成人| 国产免费av片| 99热在线观看精品免费| 久久久久91| 韩国av在线| 亚洲在线高清视频| 5252a我爱haose01我愿| 黄色国产在线| 日韩欧美中文字幕公布| 欧美A片网站| 色婷婷激情| 悠悠色综合| 一区二区三区四区无码| 国产欧美一级片| 国产精品一区一区三区| 丰满人妻一区二区三区四区不卡 | 四虎性爱| 亚洲三级片在线观看| 国内自拍激情视频| 激情五月天色色| 69成人在线电影| 成人A片免费观看| 丁香五月激情小说| 99热精品在线播放| 日韩欧美中文| 久久成人18免费网站波多野结衣 | 中文人妻第9页| 国产色天使| 18成人在线观看| 毛片aaa| 日韩乱伦av| 国产精品免费看| 操碰在线| 色老板在线视频| 狼友免费视频| 男人天堂免费视频| 草逼国产| 久久久999久久久999精神| 黄色一级A片| 美女裸体视频网站| 亚洲欧美日韩中文字幕在线观看| 在线免费观看网站| 国产精品国产三级国产专业不| 亚洲精品偷拍| 亚洲口味重一级黄片| 国产精品无码成人AV电影| 超清无码在线| 五月婷婷五月| 亚洲在线视频播放| 亚洲成人自拍| 日韩不卡高清在线观看视频 | 五月av| 四季AV一区二区凹凸懂色桃花| 色五月婷婷婷| 国产AV中文| 午夜精品久久久久久久| 91麻豆精品| 自拍一区在线观看| 人人摸在线视频| 91叉叉叉| 国产在线不卡| 久久丁香五月婷婷五月天激情视频| av一二三区| 无码成人在线| 久久AV秘一区二区三区水生| 国产精品一二三区夜夜躁| 久久久久久国际四虎免费精品视频| 男女做爱无码| 老师搡BBBB搡BBB| 亚洲成人三级| 亚洲视频第一页| 亚洲人在线观看| 五月丁香综合在线| 黑人猛躁白人BBBBBBBBB | 狠狠躁夜夜躁人人爽人妻| 国产午夜成人视频| 一级电影视频去去去| 国产无码Av| 五月丁香在线视频| 成人久久AV| 天天草av| 国产精品欧美一区二区三区苍井空 | 偷拍精品视频| 污网站免费在线观看| 日韩TV| 日本白嫩的BBw| 热久久伊人| 91香蕉在线观看| 天堂无线av无码av| 波多野结衣无码网站| 免费Av网站| 青青久操| 国产探花视频在线免费观看| 高清无码视频免费版本在线观看 | 青春草在线免费观看| 亚洲性无码| 亚洲AV永久无码精品| 中文字幕++中文字幕明步| 亚洲免费视频在线看| 俺去俺来也www色官网黑人| 亚洲精品视频在线播放| 97在线鲁碰免费视频| 在线观看中文字幕一区| 日本欧美一级| 综合久久网| 懂色一区二区二区在线播放视频| 免费91| 91人人草| 青草影视久久| 国产精品美女久久久久久久久| 无码123区| 天天操网站| 毛片黄片| 毛茸茸BBBBBB毛茸茸| 四川女人毛多水多A片| 91人妻人人澡人人爽人人精品| 国产精品v欧美精品v日韩精品| 欧美一级在线免费观看| 外国一级片| 黄色电影天堂网站| 无码人妻少妇| 成人国产AV| 午夜无码鲁丝片午夜精品一区二区| 国产精品人妻无码久久久郑州天气网| 91麻豆精品传媒| 五月丁香在线视频| 无码视频一二三区| 亚洲在线一区| 一道本在线观看| 蜜桃视频免费网站| 国产黄a| 强伦轩人妻一区二区电影| 久久这里有精品视频| 日韩啊啊啊| eeuss一区| 日韩中文字| 风流老熟女一区二区三区| 狠狠穞A片一區二區三區| 最新国产激情视频| 亚洲成年网| 91精品国产综合久久蜜臀使用方法 | 色婷婷一区二区三区久久午夜| 天天拍天天干| 中文字幕乱在线| 欧美高清无码视频| 北条麻妃在线无码| 围内精品久久久久久久久白丝制服 | 大香蕉伊人手机在线| 大香蕉在线伊人| 成人网视频| 天堂中文8资源在线8| 豆花av在线| 69无码| 996热re视频精品视频| 亚洲图片在线观看| 无码三级| 亚洲.www| 91九色视频| 黑人又粗又大XXXXOO| 免费黄色视频网站在线观看| 一级黄色视频在线观看| 国产剧情自拍| 成人aV无码精品国产一区二区 | 777久久久| 亚洲色情在线播放| 免费看黄的网站在线观看| 成人日韩| 日p视频在线观看| 亚州天堂| 嫩BBB嗓BBBB榛BBBB| 嫩草导航| 翔田千里av| 国产精品成人69| 日韩操逼电影| 北条麻妃无码在线观看| av一卡二卡| 青青艹在线视频| 在线草| 特级欧美AAAAAA| 538在线视频| 亚洲女同在线| 一道本高清无码| 伊人久久在线| 综合偷拍|