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

基于React/Vue搭建一個通用的表單管理配置平臺

開發 前端
熟悉我的朋友可能會知道,我一向是不寫熱點的。為什么不寫呢?是因為我不關注熱點嗎?其實也不是。有些事件我還是很關注的,也確實有不少想法和觀點。但我一直奉行一個原則,就是:要做有生命力的內容。

[[416071]]

前言

熟悉我的朋友可能會知道,我一向是不寫熱點的。為什么不寫呢?是因為我不關注熱點嗎?其實也不是。有些事件我還是很關注的,也確實有不少想法和觀點。但我一直奉行一個原則,就是:要做有生命力的內容。

這篇文章是一篇應用性極強的文章,我們通過一個實際的應用場景,去解決某一類的問題,提供一種或者幾種解決方案,來探索技術的魅力。接下來筆者主要分析表單定制平臺的實現思路和技術方案,來實現一個類似于金數據或者問卷星一樣的表單配置平臺,大家也可以基于此方案,擴展出功能更加強大的可視化平臺。

正文

為什么要做一個這樣的平臺呢?一方面是因為筆者多年來一直服務于B端產品,對于動態表單以及配置化表單有一定的項目積累,并且深知配置化表單的價值所在。舉一個很傳統的B端表單配置化的例子:傳統2B企業在提供saas服務時,為了滿足不同企業的定制化需求,往往會給企業客戶提供定制化或者自由配置的功能,如下圖:

對于saas系統而言,軟件即服務,在提供基礎服務的同時,同樣要滿足用戶個性化需求,所以傳統的saas軟件提供商往往會提供給客戶自由配置的空間,這種自由配置的橋梁就是通過表單,舉一個簡單的例子:

通過這種方法就可以定制不同風格的企業產品,這里只是舉了個比較簡單的例子,往往實際項目中會更加復雜,可能會有幾十個配置項,當然這種模式是比較傳統的配置化方案,也僅僅是saas軟件提供的很小的一個服務模塊。目前主流的做法是采用可視化方案,而且國內也有非常成熟的方案,但基本的思想是一致的,只不過后者的體驗更好,操作難度更低。

筆者簡單介紹一下saas,方便大家更容易理解其模式:

saas(軟件即服務)是一種云計算產品,為用戶提供對供應商云端軟件的訪問。用戶無需在其本地設備上安裝應用。相反,應用駐留在遠程云網絡中,通過 Web 或 API 進行訪問。通過應用,用戶可以存儲和分析數據,并可進行項目協作。

類似的云計算產品也有很多,比如Paas(平臺即服務),Iaas(基礎架構即服務)等,感興趣的朋友可以學習了解一下。

以上介紹更多的是為了讓大家理解筆者設計這套平臺的基本背景,我們還可以舉個更實際的例子就是金數據或者問卷星的表單配置模式,用戶可以在管理后臺定制自己的表單,并生成一個可訪問的鏈接來向目標用戶發放問卷,填寫信息,收集信息,最后實現數據分析的目的。

本文介紹的表單定制平臺,也同樣支持表單管理,表單數據分析, 表單數據收集, 表單定制等功能, 筆者將采用比較熟悉的技術棧react以及第三方ui庫antd4.0來開發, 后端采用node + koa來設計路由接口.

設計思路

實現效果與分析

1. 表單定制管理列表

管理列表主要用來查看我們配置的表單模板,分析不同表單模板收集的數據,對表單模板進行編輯刪除等操作.

2. 表單定制頁面

由上圖可知表單定制頁面主要用來編輯自定義表單模板,我們可以添加表單標題,表單字段等,目前提供了幾種自定義表單控件如下:

  • 文本框
  • 多行文本框
  • 下拉框
  • 單選框
  • 復選框
  • 文件上傳控件

基本涵蓋了我們所需要的所有表單業務場景.由上圖可知我們可以在任意位置插入自定義字段,同時可以編輯修改刪除表單字段.如果想象力再大一點,我們可以基于它來實現不僅僅是表單問卷型應用,還可以實現答題,發布內容等場景.(后期可支持富文本控件)

3. 草稿管理

草稿箱設計的目的是方便使用者在配置表單的過程中不確定是否符合需求或者由于某種臨時性舉動而無法繼續配置,這個時候可以將以配置好的內容存入草稿箱,下次繼續編輯,所以筆者專門設計了草稿箱管理列表,一旦用戶存在草稿,會在管理頁面通知用戶并顯示草稿的數量.作為一個追求體驗的技術人,這一塊的設計還是相當有必要的.

4. 生成前臺表單訪問鏈接

當我們配置好表單之后,我們點擊保存, 會生成一個前臺訪問地址,實時訪問表單信息,如下圖為點擊鏈接之后的頁面:

我們也可以根據自己的風格,設計自己的表單錄入頁面, 具體如何實現這樣的過程, 后面我會詳細介紹.

5. 查看用戶已有數據錄入

我們可以通過點擊"查看數據"來訪問收集到的表單數據,并通過可視化的工具對數據做分析比較,同時我們也可以在數據列表中刪除數據,來控制我們數據展示的純凈.

6. 表單數據分析

[[416075]]

收集到數據只有,我們會自動集成幾個可視化組件來分析表單數據,以上是筆者列出的幾個可視化組件,基于antv G2來封裝.

應用場景

以上主要介紹了自定義表單定制平臺的一些功能和交互效果, 我們可以利用該平臺做很多有意思的事情.因為表單的抽象是數據,我們拿到定制化的表單json數據之后,我們可以有不同的展現形式,比如用戶的問卷調查, 網站平臺的投票, 答題頁面, 發布動態等功能,如下圖配置:

以上配置可以實現類似于微信的發布朋友圈的功能, 然后我們可以通過前端的手段根據用戶發表的數據渲染成一個朋友圈列表.

如果我們再打開自己的腦洞,我們可以這樣配置,配置一個這樣的表單,表單包括一個文件上傳控件和n個文本輸入控件,如下圖:

將這樣的表單配置到H5管理模塊,我們只需要上傳三張圖,然后填寫好對應的配文,然后利用市面上成熟的H5全屏滾動插件,就能輕松的定制各種H5活動頁面了。該方案已被筆者的很多子系統使用,效果還是非常好的。

當然基于該平臺甚至能直接配置小型的宣傳網站,還有更多想象空間,期待大家去挖掘。

代碼實現

要想開發這樣一個表單定制平臺, 核心在于如何實現表單動態配置的機制.這里筆者將其劃分為兩部分:基礎表單物料和表單編輯生成器, 如下圖所示拆分圖:

接下來我們一步步實現以上兩個核心模塊。

1. 基礎表單物料

基礎表單物料主要是為了用戶選擇自定義表單控件使用,我們常用的表單動態渲染有map循環+條件判斷和單層map+對象法,前者如果要渲染一個動態表單,可能實現如下:

  1.     list.map((item, i) => { 
  2.         return <React.Fragment key={i}> 
  3.             { 
  4.                item.type === 'input' && <Input /> 
  5.             } 
  6.             { 
  7.                item.type === 'radio' && <Radio /> 
  8.             } 
  9.             // ... 
  10.         </React.Fragment> 
  11.     }) 

但是這樣做有個明顯的缺點就是會產生很多沒必要的判斷,如果對于復雜表單,性能往往很低,所以筆者采用后者來實現,復雜度可以降到O(n).我們先來做配置模版:

  1. // 基礎模版數據 
  2. const tpl = [ 
  3.   { 
  4.     label: '文本框'
  5.     placeholder: '請輸入內容'
  6.     type: 'text'
  7.     value: ''
  8.     index: uuid(5) 
  9.   }, 
  10.   { 
  11.     label: '單選框'
  12.     type: 'radio'
  13.     option: [{label: '男', value: 0}, {label: '女', value: 1}], 
  14.     index: uuid(5) 
  15.   }, 
  16.   { 
  17.     label: '復選框'
  18.     type: 'checkbox'
  19.     option: [{label: '男', value: 0}, {label: '女', value: 1}], 
  20.     index: uuid(5) 
  21.   }, 
  22.   { 
  23.     label: '多行文本'
  24.     placeholder: '請輸入內容'
  25.     type: 'textarea'
  26.     index: uuid(5) 
  27.   }, 
  28.   { 
  29.     label: '選擇框'
  30.     placeholder: '請選擇'
  31.     type: 'select'
  32.     option: [{label: '中國', value: 0}, {label: '俄羅斯', value: 1}], 
  33.     index: uuid(5) 
  34.   }, 
  35.   { 
  36.     label: '文件上傳'
  37.     type: 'upload'
  38.     index: uuid(5) 
  39.   } 
  40.  
  41. // 模版渲染組件 
  42. const tplMap = { 
  43.   text: { 
  44.     component: (props) => { 
  45.       const { placeholder, label } = props 
  46.       return <div className={styles.fieldOption}><span className={styles.fieldLabel}>{label}:</span><Input placeholder={placeholder} /></div> 
  47.     } 
  48.   }, 
  49.   textarea: { 
  50.     component: (props) => { 
  51.       const { placeholder, label } = props 
  52.       return <div className={styles.fieldOption}><span className={styles.fieldLabel}>{label}:</span><TextArea placeholder={placeholder} /></div> 
  53.     } 
  54.   }, 
  55.   radio: { 
  56.     component: (props) => { 
  57.       const { option, label } = props 
  58.       return <div className={styles.fieldOption}> 
  59.               <span className={styles.fieldLabel}>{label}:</span> 
  60.               <Radio.Group
  61.                 { 
  62.                   option && option.map((item, i) => { 
  63.                     return <Radio style={radioStyle} value={item.value} key={item.label}> 
  64.                       { item.label } 
  65.                     </Radio> 
  66.                   }) 
  67.                 } 
  68.             </Radio.Group
  69.         </div> 
  70.     } 
  71.   }, 
  72.   checkbox: { 
  73.     component: (props) => { 
  74.       const { option, label } = props 
  75.       return <div className={styles.fieldOption}> 
  76.               <span className={styles.fieldLabel}>{label}:</span> 
  77.               <Checkbox.Group
  78.                 <Row> 
  79.                   { 
  80.                     option && option.map(item => { 
  81.                       return <Col span={16} key={item.label}> 
  82.                               <Checkbox value={item.value} style={{ lineHeight: '32px' }}> 
  83.                                 { item.label } 
  84.                               </Checkbox> 
  85.                             </Col> 
  86.                     }) 
  87.                   } 
  88.                 </Row> 
  89.             </Checkbox.Group
  90.         </div> 
  91.     } 
  92.   }, 
  93.   select: { 
  94.     component: (props) => { 
  95.       const { placeholder, option, label } = props 
  96.       return <div className={styles.fieldOption}> 
  97.               <span className={styles.fieldLabel}>{label}:</span> 
  98.               <Select placeholder={placeholder} style={{width: '100%'}}> 
  99.                 { 
  100.                   option && option.map(item => { 
  101.                     return <Option value={item.value} key={item.label}>{item.label}</Option
  102.                   }) 
  103.                 } 
  104.             </Select
  105.         </div> 
  106.     } 
  107.   }, 
  108.   upload: { 
  109.     component: (props) => { 
  110.       return <div className={styles.fieldOption}> 
  111.               <span className={styles.fieldLabel}>{props.label}:</span> 
  112.               <Upload 
  113.               listType="picture-card" 
  114.               className="avatar-uploader" 
  115.               showUploadList={false
  116.               action="https://www.mocky.io/v2/5cc8019d300000980a055e76" 
  117.             > 
  118.               <div>+</div> 
  119.             </Upload> 
  120.         </div> 
  121.     } 
  122.   } 
  123.  
  124. export { 
  125.   tpl, 
  126.   tplMap 

 

 

基礎物料在下圖所示中使用:

 

 

當我們要添加一個表單項時,我們就可以在左邊預覽操作區看到添加的項,并可以基于表單編輯生成器來編輯表單字段。

 

 

2. 表單編輯生成器

 

 

表單編輯生成器分為2部分, 第一部分是用來生成表單項的容器組件,封裝了添加,刪除,編輯操作功能,代碼如下:

  1. // 表單容器組件 
  2. const BaseFormEl = (props) => { 
  3.   const {isEdit, onEdit, onDel, onAdd} = props 
  4.   const handleEdit = (v) => { 
  5.     onEdit && onEdit(v) 
  6.   } 
  7.   return <div className={styles.formControl}> 
  8.     <div className={styles.formItem}>{ props.children }</div> 
  9.     <div className={styles.actionBar}> 
  10.       <span className={styles.actionItem} onClick={onDel}><MinusCircleOutlined /></span> 
  11.       <span className={styles.actionItem} onClick={onAdd}><PlusCircleOutlined /></span> 
  12.       <span className={styles.actionItem} onClick={handleEdit}><EditOutlined /></span> 
  13.     </div> 
  14.   </div> 

 

 

第二部分主要用來渲染操作區模版,基于BaseFormEl包裝不同類型的表單組件, 這里舉一個比較復雜的select來說明,其他表單控件類似:

  1. const formMap = { 
  2.   title: {}, 
  3.   text: {}, 
  4.   textarea: {}, 
  5.   radio: {}, 
  6.   checkbox: {}, 
  7.   select: { 
  8.     component: (props) => { 
  9.       const { onDel, onAdd, onEdit, curIndex, index, type, label, placeholder, required, message, option } = props 
  10.       return <BaseFormEl  
  11.         onDel={onDel.bind(this, index)} 
  12.         onAdd={onAdd.bind(this, index)} 
  13.         onEdit={onEdit.bind(this, {index, type, placeholder, label, option, required})} 
  14.         isEdit={curIndex === index
  15.       > 
  16.         <Form.Item name={label} label={label} rules={[{ message, required }]}> 
  17.           <Select placeholder={placeholder}> 
  18.             { 
  19.               option && option.map(item => { 
  20.                 return <Option value={item.value} key={item.label}>{item.label}</Option
  21.               }) 
  22.             } 
  23.           </Select
  24.         </Form.Item> 
  25.       </BaseFormEl> 
  26.     }, 
  27.     editAttrs: [ 
  28.       { 
  29.         title: '字段名稱'
  30.         key'label' 
  31.       }, 
  32.       { 
  33.         title: '選項'
  34.         key'option' 
  35.       }, 
  36.       { 
  37.         title: '提示文本'
  38.         key'placeholder' 
  39.       }, 
  40.       { 
  41.         title: '是否必填'
  42.         key'required' 
  43.       }, 
  44.     ] 
  45.   }, 
  46.   upload: {} 

 

 

editAttrs主要用來渲染編輯列表,說明哪些表單項可以編輯,這部分代碼比較簡單,這里直接用圖舉例:

 

 

最后我們來渲染表單生成器組件:

  1. export default (props) => { 
  2.   const { 
  3.     formData, 
  4.     handleDelete, 
  5.     handleAdd, 
  6.     handleEdit, 
  7.     curEditRowIdx 
  8.   } = props 
  9.   return <Form name="customForm"
  10.             { 
  11.               formData && formData.map(item => { 
  12.                 let CP = formMap[item.type].component 
  13.                 return <CP {...item} key={item.index
  14.                   onDel={handleDelete}  
  15.                   onAdd={handleAdd} 
  16.                   onEdit={handleEdit} 
  17.                   curIndex={curEditRowIdx} 
  18.                 /> 
  19.               }) 
  20.             } 
  21.          </Form> 

 

 

至此,基本功能模塊已經開發完成,我們只需要將這些物料和組件導入到編輯頁面,基于業務來操作和請求即可。由于實現該案例還是有一定復雜度的,筆者沒有將所有組件都一一寫出來,希望為大家提供一個思考空間,后續筆者將會把該平臺整合到筆者的開源CMS系統中,供大家學習使用。有關nodejs部分的內容,由于筆者后期會陸續整理,如果有其他疑問,可以和筆者多交流。

 

 

最后

 

 

如果想學習更多H5游戲, webpack,node,gulp,css3,javascript,nodeJS,canvas數據可視化等前端知識和實戰,歡迎在公號《趣談前端》加入我們的技術群一起學習討論,共同探索前端的邊界。

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2023-10-06 11:48:37

reactvuenodejs

2023-01-18 07:49:42

2024-07-22 07:05:00

nodejs爬蟲管理平臺爬蟲框架

2023-03-06 10:42:45

2013-06-18 09:51:52

PomeloPomelo平臺搭建平臺

2024-12-09 00:00:03

Vue3項目表單

2010-03-08 17:20:56

搭建私有云

2009-07-24 11:29:33

WinForm表單窗體

2023-09-14 08:46:50

ReactVue

2021-04-25 08:58:00

Go拍照云盤

2017-04-25 16:12:49

2021-04-26 18:48:48

微應用React

2021-03-31 08:01:24

React Portareactcss3

2022-04-25 10:49:12

RuoYi-Vue管理系統

2023-07-14 07:23:21

ReactuseEffect

2018-01-02 16:08:00

AndroidiOSReact Nativ

2010-03-02 13:35:59

Fedora apac

2023-10-20 09:49:46

AI技術

2017-02-06 10:30:13

iOS表單正確姿勢

2023-09-05 20:17:18

typescriptPropTypesreact
點贊
收藏

51CTO技術棧公眾號

日韩欧美一区二区三区免费看| 黄在线免费观看| 天堂久久久久va久久久久| 国产亚洲激情在线| 日韩欧美中文视频| 无遮挡在线观看| 国产精品久久综合| 国产精品视频免费一区| 亚洲性猛交富婆| 激情欧美亚洲| 最新69国产成人精品视频免费| 黄色片子免费看| 天天综合网天天| 亚洲国产一二三| 亚洲成人网上| 亚州视频一区二区三区| 国产一区二区不卡| 国产精品r级在线| 久草免费在线观看视频| 成人影院在线| 亚洲精品视频免费在线观看| 免费看91视频| 欧美成人福利| 色94色欧美sute亚洲线路一ni| 日韩专区第三页| 在线免费观看黄色网址| 26uuu国产一区二区三区| 99视频网站| 97免费观看视频| 青青国产91久久久久久| 538国产精品一区二区免费视频| 日韩欧美国产成人精品免费| av中文字幕一区二区| 国产视频一区在线| 国产麻豆xxxvideo实拍| 91成人午夜| 欧美一区二区三区系列电影| 男人添女人下面免费视频| 欧美电影免费看| 狠狠躁天天躁日日躁欧美| 日本香蕉视频在线观看| bt在线麻豆视频| 国产精品久久久久久久久晋中 | 日韩国产一二三区| 在线免费观看日韩欧美| 三级4级全黄60分钟| 中文字幕在线高清| 高跟丝袜欧美一区| 日韩欧美国产免费| 亚洲天堂免费电影| 日韩欧美极品在线观看| www.玖玖玖| 伊人久久av| 日本韩国欧美一区二区三区| 国产精品视频一区二区三区四区五区 | 九一国产在线观看| 国产精品日本| 国产999精品久久久| 在线观看 亚洲| 久久午夜精品| 国产精品久久久久久久久久免费| 91porny九色| 美女网站色91| 91在线观看免费高清| 国产黄色一区二区| 成人一区二区三区| 精品国产免费一区二区三区| 四虎影视2018在线播放alocalhost| 91影院在线观看| 日本福利一区二区三区| 91xxx在线观看| 亚洲欧美国产高清| 久久久性生活视频| 偷拍精品精品一区二区三区| 欧美日韩一区二区在线观看| 五月天丁香花婷婷| 99ri日韩精品视频| 亚洲美女在线看| 欧美88888| 国产综合视频| 国产91网红主播在线观看| 中文字幕在线视频免费| 福利一区福利二区| 欧美系列一区| 2024最新电影在线免费观看| 五月天一区二区| 91香蕉视频污版| 国产情侣一区在线| 亚洲精品www久久久| 国产美女永久免费无遮挡| 久久精品播放| 97视频在线观看免费高清完整版在线观看| 日本一本在线观看| 国产精品18久久久久久久久久久久| 久久一区二区三区欧美亚洲| 免费黄网站在线| 狠狠色狠狠色综合日日小说| 手机免费看av网站| 日本午夜精品久久久| 久久久999精品| 天码人妻一区二区三区在线看| 久久9热精品视频| 久久久久久久久一区二区| 精品黄色免费中文电影在线播放| 狠狠色狠狠色综合日日五| 九九九九九伊人| 要久久电视剧全集免费| 久久99久久久久久久噜噜| 波多野结衣在线电影| 成人涩涩免费视频| 人人妻人人澡人人爽精品欧美一区| 亚洲小少妇裸体bbw| 精品久久国产97色综合| 欧美性生交大片| 水蜜桃久久夜色精品一区的特点 | 亚洲色图久久久| 猫咪成人在线观看| 九九热精品视频在线播放| 中文字幕黄色av| 国产亚洲精品中文字幕| 国产无限制自拍| 日韩成人久久| 日韩在线视频观看正片免费网站| 少妇高潮av久久久久久| 波多野结衣在线一区| 日本老太婆做爰视频| 欧美成人一二区| 中文字幕一精品亚洲无线一区| 国产日产精品一区二区三区| 成人午夜av影视| 日本精品福利视频| 国产美女亚洲精品7777| 久久伊人免费视频| 国产又粗又黄视频| 欧美韩国日本不卡| 三年中国国语在线播放免费| 久久99国内| 日韩美女视频中文字幕| 飘雪影院手机免费高清版在线观看| 亚洲国产综合人成综合网站| 国产精品偷伦视频免费观看了| 亚洲人成免费网站| 亚洲影院在线看| av激情在线| 欧美不卡在线视频| 久久久久久久伊人| 99久久精品情趣| 欧美色图另类小说| 羞羞答答一区二区| 国产成人极品视频| 午夜激情在线观看| 91精品国产一区二区三区| 欧美三级免费看| 成人性生交大片免费看中文| 国产www免费| 亚洲伊人春色| 国产精品久久久久久久久久 | 日日干夜夜操s8| 久久成人综合| 99久久99久久| 无遮挡爽大片在线观看视频| 国产亚洲精品久久| 国产精品老熟女视频一区二区| 亚洲桃色在线一区| 动漫美女无遮挡免费| 亚洲欧美日韩专区| 日韩影院一区| 91精品在线免费视频| 欧美日韩高清区| 视频一区二区在线播放| 欧美中文字幕亚洲一区二区va在线 | 国产成人亚洲精品无码h在线| 欧洲grand老妇人| 91视频国产高清| 黄色在线网站噜噜噜| 亚洲天堂成人在线视频| 国产影视一区二区| 亚洲一级二级三级在线免费观看| 朝桐光av一区二区三区| 日本中文字幕不卡| 国产 欧美 日韩 一区| 免费欧美激情| 亚洲一区二区免费在线| www.com.cn成人| 欧美成人精品在线视频| 日韩午夜影院| 欧美一级理论性理论a| 亚欧视频在线观看| 成人欧美一区二区三区1314| 成人在线视频免费播放| 卡一卡二国产精品| av动漫在线看| 亚洲天堂免费| 欧美日韩大片一区二区三区| 国产电影一区二区| 日本在线观看天堂男亚洲| 性国产高清在线观看| 国产亚洲欧美视频| 人妻无码一区二区三区久久99| 欧美在线三级电影| 国产情侣在线视频| 亚洲三级小视频| 91网站免费入口| 成人手机电影网| 波多野结衣在线免费观看| 久久久久久黄| www.好吊操| 亚洲中无吗在线| 天天综合狠狠精品| 欧美天堂社区| 成人动漫视频在线观看完整版| 偷拍视频一区二区三区| 久久久日本电影| av片哪里在线观看| 中文字幕在线看视频国产欧美在线看完整| 亚洲人视频在线观看| 日韩视频免费直播| 91中文字幕在线播放| 91福利国产精品| 毛片基地在线观看| 亚洲成av人片在www色猫咪| 亚洲国产精品免费在线观看| 国产精品理论在线观看| 欧美性猛交xxxx乱| 久久青草国产手机看片福利盒子 | 国产精品不卡一区二区三区| 日韩中文字幕电影| 91美女精品福利| 鲁大师私人影院在线观看| 成人免费av资源| 中文字幕无人区二| 国产麻豆精品视频| 91精产国品一二三产区别沈先生| 日本视频免费一区| 成人性视频欧美一区二区三区| 在线亚洲精品| 美女日批免费视频| 亚洲免费在线| 日本精品一区二区三区四区| 亚洲欧美卡通另类91av| 国产精品免费入口| 久久精品一区二区国产| 亚洲熟妇av一区二区三区| 香蕉久久夜色精品国产| 欧美污视频网站| 久久天天综合| 亚洲综合日韩欧美| 久久99精品国产.久久久久久| gogogo高清免费观看在线视频| 日本aⅴ精品一区二区三区 | 国产·精品毛片| 欧洲熟妇的性久久久久久| 91在线视频官网| xxxxx在线观看| 欧美国产日本韩| 欧美h片在线观看| 亚洲精品久久嫩草网站秘色| 久久久久久久久久网站| 性做久久久久久久久| 日本视频在线观看免费| 欧美在线观看禁18| 97人妻精品一区二区三区软件| 欧美一区二区精品久久911| 全部免费毛片在线播放一个| 日韩黄色在线免费观看| 国产精品四虎| 久久午夜a级毛片| av岛国在线| 国产福利视频一区二区| 亚洲精品伦理| 国产精品综合久久久久久| 一本久久青青| 天天操天天干天天玩| 国自产拍偷拍福利精品免费一| 国产视频九色蝌蚪| 日韩高清国产一区在线| 韩国黄色一级片| 久久亚洲精品小早川怜子| 三级黄色在线观看| 亚洲国产cao| 中文字幕久久熟女蜜桃| 精品国产免费人成在线观看| 免费在线黄色影片| 美日韩在线视频| 性xxxxfreexxxxx欧美丶| 国产日韩在线免费| 日韩欧美影院| 在线看视频不卡| 99精品视频免费观看| 99sesese| 91亚洲精品一区二区乱码| 国产精品麻豆一区| 舔着乳尖日韩一区| 国产又黄又爽视频| 亚洲男人天堂2024| 欧美人与动牲性行为| 国产精品国产三级国产aⅴ浪潮| 一区二区三区高清在线观看| 视频在线精品一区| 亚洲日本免费| 亚洲一区二区图片| 国产视频一区不卡| 日本三级免费看| 欧美精品一级二级| 欧美孕妇孕交| 久久久久久午夜| 四虎在线精品| 日本一区免费在线观看| 亚洲高清二区| 欧美国产在线一区| 欧美国产一区视频在线观看| 国产午夜免费福利| 欧美精品一区二区三区在线 | 国产精品免费看久久久香蕉| 久久香蕉网站| 日韩精品一区二区免费| 久久成人综合网| 国产黄色大片免费看| 狠狠躁夜夜躁人人爽天天天天97| 亚洲av无码乱码国产精品| 久久精品2019中文字幕| 国产精品久久久久久妇女| 久久久久久久久久久久久久久久av| 欧美日韩1区| 日批视频在线看| 亚洲色图欧洲色图| 91久久久久国产一区二区| 中文字幕亚洲图片| 日韩毛片在线| 日本中文不卡| 日韩在线一区二区| 丰满少妇高潮一区二区| 日韩欧美在线视频免费观看| 深夜福利在线视频| 91爱视频在线| 色综合www| 高清在线观看免费| 久久伊99综合婷婷久久伊| 久久久久久久久久免费视频| 日韩av一区二区在线| 91老司机福利在线| 国产综合色一区二区三区| 亚洲国内精品| 亚洲熟女乱综合一区二区三区| 午夜精品成人在线视频| 五月婷婷伊人网| 日本久久亚洲电影| 人人狠狠综合久久亚洲婷| 少妇一级淫免费播放| 国产精品久久久久久户外露出 | 中文日韩在线观看| 欧美黄色成人| 男人天堂成人网| 国产成人免费视频一区| www.天天色| 亚洲男女性事视频| 国产精品99久久久久久董美香| 亚洲欧美日韩不卡| 国产不卡高清在线观看视频| 国产在线视频在线观看| 亚洲精品视频播放| jizzyou欧美16| 久久久久亚洲av无码专区喷水| 国产很黄免费观看久久| 日韩欧美大片在线观看| 亚洲人a成www在线影院| 日本a人精品| 欧美另类videosbestsex日本| aaa亚洲精品| 免费在线观看av的网站| 美乳少妇欧美精品| 日韩三级av| 爱爱爱爱免费视频| 亚洲成人中文在线| av中文字幕一区二区三区| 99久久99久久精品国产片| 国产日韩一区二区三区在线播放| 一级黄色片网址| 精品国产伦一区二区三区观看方式| 亚洲精品88| gogogo免费高清日本写真| 成人激情免费网站| 黄色网址中文字幕| 欧美黑人性猛交| 欧洲毛片在线视频免费观看| 国产精品欧美性爱| 91国偷自产一区二区开放时间| 91极品在线| 日韩中文字幕一区二区| 成人午夜免费视频| 在线黄色av网站| 97超级碰碰人国产在线观看| 久久精品国产亚洲夜色av网站| 亚洲一区二区在线免费| 欧美年轻男男videosbes| 少妇视频一区| 久久在线中文字幕| 中文字幕在线播放不卡一区| 亚州av在线播放| 成人黄动漫网站免费|