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

搭建編輯器的可擴(kuò)展架構(gòu)探索和實(shí)踐

共 9329字,需瀏覽 19分鐘

 ·

2021-05-18 10:05

背景

大量的業(yè)務(wù)運(yùn)作離不開(kāi)紛繁復(fù)雜的頁(yè)面制作,比如淘寶,無(wú)論是行業(yè)類(lèi)目還是形態(tài)各異的導(dǎo)購(gòu)營(yíng)銷(xiāo)方式,背后都是需要制作大量的頁(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ù)配置這類(lèi)復(fù)雜的前端交互邏輯,而這部分前端交互邏輯又幾乎趨同,于是將這部分邏輯抽離出來(lái),單獨(dú)開(kāi)發(fā)了搭建編輯器實(shí)現(xiàn)了一套統(tǒng)一的基礎(chǔ)的搭建交互邏輯,于是搭建編輯器1.0版本產(chǎn)生了。

盡管搭建編輯器1.0能夠已經(jīng)能夠滿(mǎn)足大部分的頁(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. 方案一:接入方不再使用搭建編輯器,自己重新開(kāi)發(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í)候,接入方需要重新開(kāi)發(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)并支持訪(fǎng)問(wèn)內(nèi)部的數(shù)據(jù)狀態(tài),而且可以按需獨(dú)立加載。

于是,我們開(kāi)始對(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ò)開(kāi)發(fā)擴(kuò)展的方式來(lái)豐富搭建編輯器的能力,從而滿(mǎn)足不同場(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訪(fǎng)問(wèn)當(dāng)業(yè)務(wù)組件B中的數(shù)據(jù)狀態(tài)就非常的難。

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


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

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

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

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

定義一次搭投流程:新建頁(yè)面->選擇搭建類(lèi)型->進(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ì)之初并沒(méi)有考慮組件替換和數(shù)據(jù)狀態(tài)共享的能力,所以我如果想改變交互方式,能夠在Header中點(diǎn)擊打開(kāi)模塊中心就成了一件難事。
為了讓組件的數(shù)據(jù)狀態(tài)能跨區(qū)域在多個(gè)位置調(diào)用,我們需要對(duì)Model層進(jìn)行設(shè)計(jì),將原來(lái)復(fù)雜的依賴(lài)關(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)拿到這里值了。

我們按照操作的類(lèi)型將Model層劃分為四類(lèi):

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

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

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

原發(fā)布流程

新增發(fā)布審核

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

interface IInjectComponent {
  name: string// 被替換的組件的名稱(chēng),全局唯一
  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)

由于接入方開(kāi)發(fā)的擴(kuò)展組件不會(huì)打包到搭建編輯器內(nèi)部,這時(shí)候就需要有一種方法來(lái)獲取搭建編輯器內(nèi)部的狀態(tài)。這時(shí)候一個(gè)常見(jiàn)的想法就是預(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ò)命名空間訪(fǎng)問(wèn)到對(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');
  // 訪(fǎng)問(wèn)數(shù)據(jù)狀態(tài)
  console.log(comAModelA.state1)
  ...
}

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

第六步:實(shí)現(xiàn)類(lèi)中間件的方式修改局部狀態(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è)類(lèi)似中間件的能力,對(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)的需求。將問(wèn)題簡(jiǎn)化一下就是有一個(gè)List中插入一個(gè)item的問(wèn)題

[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)行修改,這樣就能夠滿(mǎn)足需求。我們將這類(lèi)可以對(duì)props進(jìn)行操作的組件稱(chēng)為擴(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="組件名稱(chēng)" defaultComponent={默認(rèn)組件} {...默認(rèn)的props}/>

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

未來(lái)

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

1、搭建編輯器會(huì)提供默認(rèn)的組件,即使進(jìn)行了組件替換,原組件還是打包在搭建編輯器內(nèi)部,增加了代碼體積。未來(lái)還是期望能夠按照擴(kuò)展的配置文件,按需打包組件。
2、尚未形成像vs code 這樣的擴(kuò)展生態(tài)。需要建立統(tǒng)一的擴(kuò)展開(kāi)發(fā)標(biāo)準(zhǔn)和擴(kuò)展開(kāi)發(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體系,一起開(kāi)源出去。



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

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 中文字幕乱码中文乱码91| 日韩一级在线视频| 精品成人在线视频| 三级黄视频| 中文字字幕中文字幕乱码| 艹逼片| 中文字幕Av在线| 欧美一级在线观看| 91av一区二区三区| 狠狠狠狠干| 久久夜色精品噜噜亚洲AV| 深爱激情五月婷婷| 五月丁香婷中文| 午夜成人小视频| 久久国产免费视频| 欧美日本亚洲| 欧美日韩一级黄片| 91在线无码精品秘入口三人| 狠狠爱一区| 狠狠色噜噜狠狠狠888米奇视频| 人妻无码在线视频| 丁香花在线小说免费阅读| 三级网站网址| 在线成人网站| 一本一道久久综合| 亚洲啪啪| 3D动漫精选啪啪一期二期三期| 亚洲操色| 色色婷婷五月天| 免费黄视频在线观看| 操久久久| 亚洲视频综合网| 91人妻人人爽人人澡人人爽 | 无码人妻精品一区二区三区蜜桃91| 国产美女裸体网站| 三级在线网站| 日韩欧美在线视频观看| 毛片小电影| 天天摸夜夜操| 暴操美女网站| 北条麻妃无码一区二区| 亚洲AV秘一区二区色盗战流出| 在线天堂999| www.俺去也| 亚洲热在线视频| 中文精品字幕人妻熟女| 欧美日逼小视频| 蜜臀久久久99久久久久久久| 一区二区在线视频| 国产精品毛片视频| 亚洲人成电影| 欧美日韩亚洲一区二区| 午夜精东影业果冻传媒| 97精品人妻一区二区| 超碰狠狠操| 男人的天堂aa| 亚洲在线播放| 先锋成人av| 国产三级在线播放| 91无码人妻精品1国产四虎| 在线黄色网| 成人午夜婬片A片| 青草精品视频| 骚骚肥肥一区二区三区| 国模精品无码一区二区免费蜜桃| 成人AV午夜福利| 91精品久久香蕉国产线看观看| 高圆圆一区二区三区| 性爱视频免费网站| 十八禁网站在线播放| 在线一级片| 男人操女人免费网站| 啪啪免费网站| 最新激情网站| 一级AA毛片| 蜜臀99| 亚洲欧美精品AAAAAA片| 黄色a一级| 中文字幕在线观看免费| 中文一区在线| 国产精品剧情| 超碰碰碰碰碰| 国产成人免费观看视频| 爆乳一区二区| 丁香六月婷婷综合缴| 口爆在线| 老汉AV| 亚洲国产精品成人网站| 欧美成人精品欧美一级私黄| 成人H视频| 五月天性爱| 99久久精品国产成人一区二区| 亚洲综合色网| 91AV视频在线| 亚洲欧美婷婷五月色综合| 欧美日韩成人视频| 精品无码一区二区三区在线| 男女日皮视频| 精品欧美一区二区三区久久久 | 国产AA| BBB搡BBB搡BBB搡BBB| 亚洲色在线播放| 国产AV在| 丁香五月在线播放| 日本一级一片免费视频| 97黄片| 69性影院| 69超碰| 大鷄巴成人A片视频| 在线亚洲日韩| 九色PORNY自拍视频| aaa三级片| 免费无码在线看| 国产成人免费观看| jizz免费在线观看| 亚洲高清无码久久| 俺也干| 亚洲男女免费视频| 人人操人人爽人人爱| 一区二区三区在线免费观看| 91人妻人人澡人人爽人人玩| 天天爽夜夜爽精品成人免费| 亚洲国产精品久久人人爱| 人与禽一级A片一区二区三区| 欧美精品一区二区少妇免费A片| 撸一撸在线| 可以看的毛片| 人人操人人操人人操人人操人人操 | 东京热一区二区三区| 成熟的国模冰莲[2]| 色综合五月| 人人妻人人爽人人操| 丰满人妻一区二区三区四区54| 亚州黄色电影| 狠狠躁日日躁夜夜躁A片无码视频 强伦轩一区二区三区四区播放方式 | 欧美三级片视频| 欧美一区二区三区成人片下载| 伊人大香蕉婷婷| 狠狠爱一区| 成人网站一区| 河南乱子伦视频国产| 婷婷五月天成人社区| 欧美性猛交XXXX乱大交3| 人人澡人人爽| 亚洲字幕av| 亚洲日本无码50p| 久久亚洲Aⅴ成人无码国产丝袜 | 精品天堂| 亚洲专区在线| 在线国产91| 日韩逼逼| 亚洲国产精品尤物yw在线观看| 麻豆偷拍| 人人操在线播放| 中文字幕免费高清网站| 亚洲无码精品一区| 国产久久久久久久久久| 人妻丰满熟妇av无码| 日韩无码黄色片| 外国成人视频| 日本人妻视频| 国产免费AV片| 蜜桃AV在线| 国产操比| 国产精品午夜福利视频| 大香蕉免费在线观看| 欧美一区免费| 嫩BBB搡BBB搡BBB四川| 成人亚洲网| 人人爽亚洲AV人人爽AV人人片| 婷婷久久久| 欧美A视频| 亚洲AV无码电影| 中国老女人操逼视频| 9999国产精品| 五月天色色网站| 欧美国产综合| 亚洲日韩免费| 国产三级片91| 免费看黄色毛片| 婷婷V亚洲V丁香月天V日韩V| 久久天堂av| 天天摸天天肏| 嫩BBB槡BBBB槡BBB小号| 亚洲中文自拍| 亚洲精品97| 2025四虎在线视频观看| 久久三级片| 伊人黄| 中文字幕视频2023| 嫩BBB槡BBBB槡BBBB撒尿-百度 | 东方AV免费在线观看| 国产精品aaa| 欧洲三级片网站| aaa在线免费视频| 成人免费毛片视频| 欧美一级黄色性爱视频| 中文字幕人妻精品一区| 91迷奸| 蜜臀AV一区二区三区免费看| 色五月综合| 国产操逼视频网站| 国产视频二区| 草久影院| 国产精品一线| 黄色特级片| 亚洲无码网| 一个色综合网| 亚洲视频一区二区| 安徽妇女BBBWBBBwm| 亚洲无码视频观看| 91麻豆精品| 无码国产精品一区二区三| 欧美日韩成人| 日韩精品一区二区三区四区蜜桃视频 | 一级片三级片| 大吊妞| 乱伦a片| 一级a片在线| 狠狠躁夜夜躁人人爽视频| 久久综合婷婷| 亚洲综合一区二区三区| 中文无码一区二区三区四区| 蜜桃av无码一区三区| 牛牛AV在线| 日韩h视频| 探花视频在线观看| 国产在线h| 伊人网视频在线| 国产无遮挡又黄又爽又色学生软件| 成人A片视频| 色欲影视插综合一区二区三区 | 国产黄色三级片| 欧美伊人| 一区二区三区视屏| 在线免费观看国产视频| 51伦理| 亚洲AV成人一区二区三区不卡| 亚洲第一综合| 极品久久| 丁香五月色情| 国产高清免费视频| 久久久久久久| 亚洲人成777| 不卡无码免费视频| 亚洲精品国产精品国自产| 亚洲欧美第一页| 好色婷婷| 97久久精品国产熟妇高清网| 无码精品一区| 欧美高清久久| 18禁网站免费观看| 高潮免费视频| 无码AV一区| 911亚洲精品| 91探花足浴店按摩店| 人人操夜夜| 涩涩视频成人| 91人妻人人澡人人爽人人爽| 美女天堂网| 俺来也俺也啪www色| 亚洲无码免费| 夜色福利在线看| 操BBB操BBB| 1024在线| 日韩AV小说| 欧美日韩视频| 深爱开心激情| 影音先锋国产在线| 黄色网址在线免费观看| 日韩高清无码一区| 国产人与禽zoz0性伦| 人妻无码中文字幕蜜桃| 99看片| 国产三级电影在线观看| 国产亚洲久一区二区| 亚洲色成人中文字幕在线| 国产精品永久久久久久久久久| 国产凹凸视频| 欧美激情五月| 天天摸天天肏| 东京热久久综合| 污视频在线看| 99久久99| 狼友视频免费| AV香蕉| 丁香五月激情五月| 操操影院| 日本少妇高潮喷水XXXXXXX| 超碰成人在线免费观看| 丁香六月综合| 日韩在线| 特爽特黄特级特色视频| 蜜桃精品视频在线观看| 超碰AV在线| 亚洲一本色道中文无码| 日本色网址| 欧美一道本| 亚洲中文字幕在线观看视频| jzzijzzij亚洲成熟少妇在线观看 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 国产五月天婷婷| 精品视频国产| 国精产品秘一区二区| 在线观看AV网站| 人妻熟妇乱子伦精品无码专区毛片 | 在线播放日韩| 亚洲H| 国产AV中文字幕| 国产精品久久久久久亚洲毛片 | 美女被操91| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 中日韩精品A片中文字幕| 超碰免费91| ppypp电影频道| 高潮视频在线观看| 另类老妇性BBwBBw| 亚洲成人自拍无码| 精品乱子伦一区二区三区在线播放 | 九九r在线精品观看视频| 久久久久久成人无码| 综合激情AV| 久久久9999| 日韩欧美日韩| 日韩福利一区| 91在线无精精品秘白丝| 国产成人秘一区二区三区东京热 | 一区视频| 97超碰自拍| 国产精品成人99一区无码| 免费一级无码婬片A片AAA毛片| www黄色com| 国产h视频在线观看| 日韩中文久久| 三上悠亚无码破解69XXX| 一区二区av| 国产精品无码无套在线照片| 欧美精品无码| 久草中文在线视频| 亚洲天堂AV网| 兔子先生和優奈玩游戲脫衣服,運氣報表優奈輸到脫精光 | 亚洲清高毛无码毛片| 欧美成人不卡| AA片视频| 国产精品无码永久免费不卡| 国产极品无码| 国产一区二区三区视频在线观看| 四虎国产精品成人久久| AV天天干| 亚洲一级电影| 国产热99| 日本人妻A片成人免费看片| 五月婷婷综合激情| 五月天性爱| 婷婷热| 青青草激情视频| 人人操人人爱人人摸| 日韩黄色视频网站| 欧美亚洲系列| 看一级黄色片| 日韩一级一级一级| 成人精品一区二区三区中文字幕| 亚洲一本在线电影av| 成人视频18+在线观看| 五月丁香在线观看| 色鬼综合网| 手机AV在线| 少妇人妻av| 亚洲一区视频| 五月丁香婷婷啪啪| 亚洲AV无码A片在线观看蜜桃| 苍井空无码在线观看| 男女av在线| 精品一区三区| 久久在线视频| 亚洲欧美日韩动漫| 91成人视频| 精品人妻午夜| 操女人逼AV| 先锋影音av资源站| 大香蕉亚洲成人| 色欲综合网| 亚洲色情在线播放| 麻豆免费成人视频| 免费欧美成人网站| 操b在线| 水蜜桃成人网| 女生自慰在线观看| 国产成人免费视频在线| 九九九成人视频| 在线黄色av| 亚洲欧美久久久久久久久久久久| 中文字幕在线精品| 中文字幕中文字幕无码| 中文无码在线播放| 九九天堂| 亚洲国产另类精品| 一本一道无码免费看视频| 国产女人水真多18毛片18精品| 操欧美逼| 国产精品码ls字幕影视| 欧美成人A片在线观看| 91无码人妻一区二区| 做aAAAAA免费视频| 日韩成人在线免费观看| 精品日韩中文字幕| 日本中文字幕在线观看| 欧美毛片在线观看| 久久艹综合网| 欧美a视频| 国产91视频在线观看| 中文字幕网在线| 亚洲无码视频在线看| 超碰九九热| 大香蕉75| 操逼视频观看| 浮力影院av| 国产激情视频在线| 牛牛免费视频| 996热re视频精品视频| 中文字幕在线字幕中文乱码区别| 日韩爱爱网站| 人与鲁牲交| 女人天堂AV| 97无码精品人妻一区二区三区| 国产第八页| 内射视频在线观看| 在线观看亚洲专区| 中文字幕av网站| 青草免费视频| 中文字幕35页| 亚洲天堂AV2025| 国产一级无码| 尤物精品在线| 亚洲成人性爱在线| 欧美精品性爱| 久久在线精品| 国产精品午夜在线| 亚洲一区欧美二区gay| 色婷婷在线视频观看| 国产在线看| 日本精品久久| 麻豆91精品人妻成人无码| 97超碰资源总站| 国产日韩a| 东京热高清无码| 婷婷五月一区| 无码电影在线播放| 996久久| 成人毛片在线观看| 日韩高清无码网站| 182AV| 人人狠狠综合婷婷| 久操视频在线播放| 国产精品第一| 艹逼视频免费观看| 国产精品999| 免费看的毛片| 人人操人人干人人看| 黄色网页免费观看| 一区二区三区四区在线| 嗯啊av| 亚洲成人精品一区二区| 日韩免费性爱视频| 韩剧《邻居的妻子》电视剧| 国产黄色视频在线免费观看| 日韩区一中文字幕a∨| 福利导航页| 五月天青青草超碰免费公开在线观看| 色天堂网| 天堂网在线观看| 日韩欧美在线免费| 日本一级理论片在线大全| 精品福利在线| 免费无码进口视频| 久久理论| 韩国gogogo高清在线完整版 | 亚洲AV人人夜夜澡人人| 欧美成人一级a片| 人人草人人摸| 亚洲第一av| 噜噜在线| www俺来也com| 99re99热| 亚洲日韩中文字幕无码| 亚洲无码电影在线观看| 黄色视频视频| 69成人免费视频| 影音先锋亚洲AV| 99re88| 五月天婷婷AV| 亚洲中文字幕av| 老司机免费视频| 亚洲制服在线观看| 日本高清视频免费观看| 成人无码激情| 人人肏人人射| 亚洲国产另类精品| 国产成人电影| 日本黄色视频在线| 韩国无码一区二区三区| www.婷婷六月天| 91成人网站| 黑人一区二区三区四区| 国产精品2025| 久久久久久麻豆| 欧美怡春院| 亚洲第一福利视频| 日本A片视频| 成人AV一区二区三区| 一级a免一级a做免费线看内裤| 99久久人妻精品免费二区| 欧美怕怕怕| 久久毛| 欧美成人精品一区二区| 河南少妇搡BBBB搡BBBB| 日韩啪啪视频| 亚洲天堂色| 国产女人18毛片水18精| 91免费成人电影| 美日韩一区二区三区| 成人免费黄色视频网站| 五月天成人导航| 欧美日韩中文视频| 成人国产片| 亚洲精品一区二区三区四区高清| 麻豆电影| 婷婷丁香五月激情一区综合网| 国产日韩欧美在线| 夜夜骚av.一区二区三区| 国产一级二级三级| 婷婷av在线| 中国一级A片| 97A片在线观看播放| 免费无码进口视频| 亚洲精品成人av无码| 午夜成人视频在线观看| 国产精品婷婷午夜在线观看| 俺去啦俺来也| 久久久久久久免费| 亚洲中文字幕观看| 国产一级婬乱片AV片AAA毛片| 国产TS变态重口人妖| 中文字幕在线不卡视频| 色婷婷精品视频| 国产一级a毛一级a毛视频在线网站) | 乱伦自拍| 开心激情站| 日本一级A片| 91超碰在线| 精品人妻一区二区三区四区不卡在| 黑人内射人妖| 韩国午夜电影| 中文无码人妻少妇| 中文字幕日韩无码片| av天天av无码av天天爽| 成人黄网站免费观看| 久草大香蕉在线视频| 3D精品啪啪一区二区三区| 苍井空一区二区三区四区| 天天拍天天日| av一区二区在线观看| 丝袜久久| 好吊妞视频在线| 欧美高潮视频| 亚洲日韩AV无码| 特级A级毛片| 国产亲子乱XXXXinin| 日本免费高清视频| 天堂无码在线| 东京热高清无码| 黄色成人网站在线观看| 久久人搡人人玩人妻精AV香蕉| 18禁裸体美女| 日本少妇高潮喷水XXXXXXX| 嫩草国产在线| 麻豆传媒在线| 亚洲欧美影院| 北条麻妃无码一区二区| 北条麻妃网站| 国产乱码一区二区三区的解决方法 | 国产熟女一区二区| 无码在线电影| 亚洲第一色网站| 午夜精品秘一区二区三区| 牛牛AV| 中文字幕视频在线免费观看| 亚洲综合免费观看高清完整版在线观| 国产小视频在线看| 成人做爰黄A片免费看| 色色A| 色婷婷在线视频观看| 成人做爰A片一区二区app| 国产激情综合五月久久| 亚洲成人免费福利| 天天射中文| H网站在线观看| 日韩中文在线播放| 最近2021中文字幕免费| 欧美激情综合| AAA片网站| 欧美日韩中文视频| 91成人网站| 青春草在线观看国产| 中文二区| 成人h在线| 国外成人在线视频老鸭窝| 三级99| 亚洲AV无码成人精品区在线欢看| 翔田千里無碼破解| 成人AV免费在线观看| 91丝袜一区二区| 天天操大香蕉| 亚州v| 国产成人精品123区免费视频| 黄片大全在线观看| 日本少妇电影| 十八无码成人免费网站| 97人人人人人人| 成人无码动漫A片| 亚洲在线观看视频| 无码三级视频| 懂色一区二区二区在线播放视频| 亚洲国产精品精JIZZ老师| 第一页在线观看| 97视频国产| 亚洲色欲色欲www在线成人网| 三级视频网站| 久久高清亚洲| 成人免费黄色视频| 日韩特级片| 欧美打炮网| 亚洲欧美日韩成人| 污片网站| 三级片中文字幕| 亚洲人妻免费视频| 色黄视频在线观看| 粉嫩小泬BBBBBB免费| 青青青草视频在线观看| 无码在线免费观看视频| 亚洲一本色道中文无码| 免费观看高清无码| 91人妻精| 久久久久久久久久免费视频| 激情五月俺也去| 久久AV影院| 亚洲天堂本一| 日韩无码1| 羞羞视频com.入口| 好想被c秘好爽n网址| 欧美日韩一级二级三级| 国产剧情91| 亚洲黄色网址| 亚洲精品久久久久毛片A级牛奶 | 三级国产在线| 色综合中文字幕| 在线播放亚洲| 日日爱99| 小泬BBBBBB免费看| 黄片在线免费观看| 狠狠干2024| 天天操夜夜撸| 成人社区视频| 久久成人无码电影| 欧美群交在线| 少妇搡BBBB搡BBB搡毛片| 青青草原网站在线观看| 午夜av无码| 日皮视频在线观看免费| 亚洲A在线观看| 成人在线免费观看视频| 欧美老妇另类BBwBBw| www高清无码| 日韩一二三| 无码人妻一区二区三区三| 北条麻妃99精品| 九七影院第二页| 亚洲淫秽视频| 日韩精品成人无码| 日本一区二区三区视频在线观看 | 亚洲欧洲日本在线| 大鸡巴视频在线观看| a三级片| 亚洲操B视频| 日韩无码三级片| 国产一区二区视频在线| 日韩精品成人无码| 亚州在线播放| 69精品无码成人久久久久久| 99cao| 欧美精品系列| 91AV视频| 韩国三级HD久久精品| 亚洲日韩中文字幕| 在线免费观看成人视频| 国产毛片一区二区三区| 久久久无码电影| 婷婷内射| 俩小伙3p老熟女露脸| 日日干综合| 奶大丰满一乱一视频一区二区三区在| 99天天操| 一区在线视频| 国产成人精品无码区在线| 国产成人视频| 欧美特黄一级视频| 操人妻视频| 蜜桃视频com.www| AV电影在线观看| 黄色一级大片在线免费看国产| 日日爱爱| 欧美成人日韩| 女人的天堂av| 香蕉在线观看| 潮喷在线| 婷婷深爱激情| 天天干,夜夜操| 三级A片视频| 操逼操| 亚韩av| 国产成人一区| 日韩三级久久| 久久久久久国际四虎免费精品视频| 日韩三级一区| 日韩欧美视频一区国产欧美在线 | 中韩无码| 97人妻精品一区二区三区免| 91传媒在线观看| 色婷婷久久综合| 黄色视频在线免费看| 欧美日韩国产激情| 国产精品秘入口18禁网站| 久久综合五月天| 婷婷五月天在线电影| 欧美成人网站在线| 国产高潮视频在线观看| 国产又爽又黄免费视频免费| 在线天堂a| 少妇无码视频| 97AV视频| 日本三级片在线| 乱子伦国产精品视频一级毛| 色青娱乐| 欧美成人AA| 四川美女网久草| 天天天天日| 国产精品九九视频| 亚洲成人三级片| 天天舔天天干| 天天躁狠狠躁av| 亚洲欧美日韩电影| 99热官方网站| 天天日日天天| 二区三区免费视频| 性欧美一区二区| 黄片免费观看视频| 日本久久综合网| aaa在线免费视频| 中文字幕免费视频在线观看| 中文字幕乱码中文乱码图片| 亚洲精品视频在线| 亚洲激情片| 无码中文综合成熟精品AV电影 | 逼特逼视频在线观看| 亚洲中文免费观看| 欧美无人区码suv| 在线观看污网站| 霸道总裁雷总各种姿势白浆爱情岛论坛| 人妻无码免费视频| 欧美三级网站在线观看| 五月丁香视频在线| 五月天堂网| 俺来也av| A片免费的| 乱子伦国产精品| 国产TS变态重口人妖| 高清无码操逼视频| 亚洲成人一区二区三区| 国产三级片精品| 女邻居的B好大| 欧美大片视频| 成人激情在线观看| 日韩一级免费在线观看| 91麻豆国产福利精品| 日韩电影无码| 免费AV在线播放| 肏屄在线观看| 骚白虎一区| 97A片在线观看播放| 日本在线一区| 亚洲激情综合视频| 天天日天天爽| 国产性爱精品| 在线免费观看黄色视频网站| 微拍福利一区二区| 亚洲视频一区二区三区| 在线无码电影| 国产精品成人在线视频| 国产一区二区久久| 亚洲www啪成人一区二区麻豆| 日韩大香蕉视频| 狠狠色五月| 成人在线伊人| 性v天堂| 日本一区二区视频| 无码成人在线| 688AV秘无码一区二区| 黄片免费观看| 猫咪AV成人永久网站| 三级片网站在线播放| 亚洲真人无码| 中文字幕一区二区三区人妻在线视频| 狠狠的日| 久久精品国产99精品国产亚洲性色 | 2025AV中文字幕| 久久er热| 午夜激情五月天| AV无码免费| 夜夜嗨av一区二区三区| 国产精品果冻传媒| 泄火熟妇2-ThePorn| 强伦轩一区二区三区四区| 久久人人超碰| 丁香五月在线播放| 中文无码字幕视频| 国产三级片网站| 国产靠逼| 色老板亚洲| 中文字幕在线视频第一页| 99三级片| 白峰美羽人妻AND-499| 亚洲激情视频| 无码免费高清| 一本一道无码免费看视频| 五月天丁香网| 日中国老太太B| 超碰在线观看免费版| 夜夜爽日日爽| 欧美高清在线综合| 免费a网站| 国产一二三四区| 99热这里有精品| yjizz视频| 日韩一| AV电影在线免费观看| 欧美,日韩,中文字幕| 色999网址| 成人视频免费在线观看| 一区在线播放| 最近日韩中文字幕中文翻译歌词| 精品欧美一区二区三区久久久| 免费三级片网址| 日韩国产综合| 日韩中文字| 亚洲高清无码免费| 在线看黄片| 久热免费视频在线观看| 国产在线拍揄自揄拍无码男男| 成人A视频| 亚洲国产精品成人va在线观看 | 手机看片久草| 亚欧无码| 五月丁香婷婷综合| 无码人妻av黄色一区二区三区 | 水多多成人免费A片| 国产午夜福利免费视频在线观看| 色婷婷久久久久swag精品| 91大神在线免费看| 欧美日韩国产尤物主播精品| 国产熟妇码视频黑料| AV中文在线| 色哟哟AV| 国产免费无码一区二区| A片视频网站| 无码av在线观看| 成人在线视频播放| 伊人天天干| 猫咪AV成人永久网站| 波多野结衣在线无码| 亚洲视频免费播放| 人妻少妇无码视频| 午夜成人在线观看| 国产乱国产乱300精品| 97超碰人妻| 亚洲AV永久无码精品| 免费精品99| 国产精品一二区| 国产一区二区在线视频| 自拍偷拍亚洲| 色婷婷色| 99热在线免费观看| 午夜操| 91熟女视频| 色就是色欧美成人网| 天堂麻豆天美| 在线A∨视频| 国产免费网址| 成人黄色在线看| 日韩三级黄色| 一级黄色A片视频| 欧美色图888|