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

從零開發一款圖片編輯器Mitu-Dooring

開發 前端
我最近一直在做數據可視化和lowcode/nocode相關的項目,針對我自己的工作經驗和對lowcode/nocode的探索,也寫了一系列低代碼可視化搭建系列文章,今天我們繼續來分享可視化相關的內容——可視化圖片編輯器。

[[419482]]

背景介紹

我們知道,為了提高企業研發效能和對客戶需求的快速響應,現在很多企業都在著手數字化轉型,不僅僅是大廠(阿里,字節,騰訊,百度)在做低代碼可視化這一塊,很多中小企業也在做,擁有可視化低代碼相關技術背景的程序員也越來受重視。

我最近一直在做數據可視化和lowcode/nocode相關的項目,針對我自己的工作經驗和對lowcode/nocode的探索,也寫了一系列低代碼可視化搭建系列文章,今天我們繼續來分享可視化相關的內容——可視化圖片編輯器。

在分享過程中,我會以最近我寫開源的一個項目Mitu為案例,仔細拆解它的實現過程。Mitu主要是輔助H5編輯器 H5-Dooring 做圖像處理用的,大家也可以輕松基于它進行二次開發和擴展,變成更強大的圖片編輯器。

在文章末尾我會附上 github 地址 和 demo 地址,方便大家學習和體驗。接下來我就來帶大家介紹和剖析一下這款開源圖片編輯器 Mitu。

項目介紹

圖片

以上是圖片編輯器的部分演示效果,我們可以通過拖拽重組的方式快速生成我們想要的圖片,也能將圖片保存為模版,以便后期復用。在項目開發之前我也設計了一個簡單的原型,保證自己的開發方向不會跑偏,大家可以參考一下:

按照我一向的寫作風格,我先列一下技術實現的大綱,以便大家有選擇且高效率的閱讀和學習:

  • 可視化編輯器項目搭建和技術選型
  • 圖形庫設計
  • 屬性編輯器設計
  • 自定義圖元控制器實現
  • 預覽功能實現
  • 保存圖片功能實現
  • 模版保存實現
  • 導入模版功能實現
  • 可視化圖片編輯器后期規劃

好了,話不多說,接下來開始我們的技術實現。

技術實現

項目搭建和技術選型

編輯器的實現思路和技術棧無關,這里我采用了 React 來實現,當然大家如果更喜歡 Vue 或者 sveltejs,也是沒問題的,項目整體技術選型如下:

  • umi 可擴展的企業級前端應用框架
  • React + Typescript
  • Antd 前端組件庫
  • fabric 一個可以簡化 Canvas 程序編寫的庫
  • localStorage 本地數據存儲

當然在項目的實現過程中還有很多細節和思想,接下來我會一一和大家介紹。如果大家對 fabric 這個庫不太熟悉也不用擔心,我會通過具體功能的實現來帶大家熟悉這個庫。

在介紹下面的內容之前我們先安裝一下 fabric ,然后初始化一個畫布。

  1. yarn add fabric 

初始化一個畫布:

  1. import { fabric } from "fabric"
  2. import { nanoid } from 'nanoid'
  3. import { useEffect, useState, useRef } from 'react'
  4.  
  5. export default function IndexPage() { 
  6.     const canvasRef = useRef<any>(null); 
  7.     useEffect(() => { 
  8.         canvasRef.current = new fabric.Canvas('canvas'); 
  9.         // 創建一個文本元素 
  10.         const shape = new fabric.IText(nanoid(8), { 
  11.              text: 'H5-Dooring'
  12.              width : 60, 
  13.              height : 60, 
  14.              fill : '#06c'
  15.              left: 30, 
  16.              top: 30 
  17.          }) 
  18.         // 將文本元素插入畫布 
  19.         canvasRef.current.add(shape); 
  20.         // 設置畫布的背景色 
  21.         canvasRef.current.backgroundColor = 'rgba(255,255,255,1)'
  22.     }) 
  23.     return <canvas id="canvas" width={600} height={400}></canvas> 

這樣我們就創建好了一個畫布,并在畫布中插入了一段可編輯可拖拽的文本,如下:

圖形庫設計

作為一款圖片編輯器,為了提高使用的靈活性我們還需要提供一些基礎圖形方便我們設計圖片,所以我在編輯器里添加了圖形庫:

主要有如文本,圖片,直線,矩形,圓形,三角形,箭頭,馬賽克,當然大家可以根據自己的需求添加更多的基本圖元。我們在圖片庫中點擊任意一個元素即可將其插入畫布,這塊是利用 fabric 的 add 方法,當然 fabric 也內制了很多基本圖形,我們可以在文檔中參考一下。為了讓圖形插入更有封裝性,我定義了圖形的基本 schema 結構:

  1. const baseShapeConfig = { 
  2.   IText: { 
  3.     text: 'H5-Dooring'
  4.     width : 60, 
  5.     height : 60, 
  6.     fill : '#06c' 
  7.   }, 
  8.   Triangle: { 
  9.     width: 100, 
  10.     height: 100, 
  11.     fill: '#06c' 
  12.   }, 
  13.   Circle: { 
  14.     radius: 50, 
  15.     fill: '#06c' 
  16.   }, 
  17.   Rect: { 
  18.     width : 60, 
  19.     height : 60, 
  20.     fill : '#06c' 
  21.   }, 
  22.   Line: { 
  23.     width: 100, 
  24.     height: 1, 
  25.     fill: '#06c' 
  26.   }, 
  27.   Arrow: {}, 
  28.   Image: {}, 
  29.   Mask: {} 

這樣我們插入圖形的方法就可以這樣寫:

  1. type ElementType = 'IText' | 'Triangle' | 'Circle' | 'Rect' | 'Line' | 'Image' | 'Arrow' | 'Mask' 
  2.  
  3. const insertShape = (type:ElementType) => { 
  4.     shape = new fabric[type]({ 
  5.         ...baseShapeConfig[type],  
  6.         leftsize[0] / 3, 
  7.         topsize[1] / 3 
  8.     }) 
  9.     canvasRef.current.add(shape); 

后續我們添加圖形時只需要定義 schema 即可,但是需要注意的是 fabric 創建圖形的方式并不都都是統一的,我們需要對特定圖片的創建進行特殊判斷,比如直線路徑:

  1. if(type === 'Line') { 
  2.       shape = new fabric.Path('M 0 0 L 100 0', { 
  3.         stroke: '#ccc',  
  4.         strokeWidth: 2, 
  5.         objectCaching: false
  6.         leftsize[0] / 3, 
  7.         topsize[1] / 3 
  8.       }) 

當然我們也可以用 switch 來對不同情況進行不同處理,這樣我們就實現了一個基本圖片庫。

屬性編輯器設計

屬性編輯器主要是用來對圖形屬性進行配置的,比如填充顏色,描邊顏色,描邊寬度,目前我主要定義了這3個維度,大家也可以基于此繼續擴展更多的可編輯屬性,類似于 H5-Dooring 的組件屬性配置面板。

我們可以在編輯器右側的屬性編輯區控制圖形的屬性,因為屬性目前只有3個,我就直接硬編碼寫上去了,大家也可以用動態渲染的方式來實現。需要注意的是我們怎么知道我們選中的是那個組件呢? 好在 fabric 提供了一系列 api 幫助我們更好的控制元素對象,這里我們用 getActiveObject 方法拿到當前選中的元素,具體實現代碼如下:

  1. // ... 
  2. // 定義基礎屬性 
  3. const [attrs, setAttrs] = useState({ 
  4.     fill: '#0066cc'
  5.     stroke: ''
  6.     strokeWidth: 0, 
  7.   }) 
  8. // 更新選中的元素 
  9. const updateAttr = (type: 'fill' | 'stroke' | 'strokeWidth' | 'imgUrl', val:string | number) => { 
  10.     setAttrs({...attrs, [type]: val}) 
  11.     // 獲取當前選中元素對象 
  12.     const obj = canvasRef.current.getActiveObject() 
  13.     // 設置元素屬性 
  14.     obj.set({...attrs}) 
  15.     // 重新渲染 
  16.     canvasRef.current.renderAll(); 

屬性編輯器的樣式實現這里我就不一一介紹了,都比較基礎,我們來看一下編輯項的基本結構:

  1. <span className={styles.label}>描邊寬度: </span> 
  2. <InputNumber size="small" min={0} value={attrs.strokeWidth}  onChange={(v) => updateAttr('strokeWidth', v)} /> 

自定義圖元控制器實現因為默認情況下 fabric 沒有提供刪除按鈕和邏輯,所以我們需要自己二次擴展,恰好 fabric 提供了自定義擴展的方法,接下來我們就一起自定義一個刪除按鈕并實現刪除邏輯。

具體實現代碼如下:

  1. // 刪除按鈕 
  2. const deleteIcon = "data:image/svg+xml,%3C%3Fxml version='1.0' encoding='utf-8'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E%3Csvg version='1.1' id='Ebene_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='595.275px' height='595.275px' viewBox='200 215 230 470' xml:space='preserve'%3E%3Ccircle style='fill:%23F44336;' cx='299.76' cy='439.067' r='218.516'/%3E%3Cg%3E%3Crect x='267.162' y='307.978' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -222.6202 340.6915)' style='fill:white;' width='65.545' height='262.18'/%3E%3Crect x='266.988' y='308.153' transform='matrix(0.7071 0.7071 -0.7071 0.7071 398.3889 -83.3116)' style='fill:white;' width='65.544' height='262.179'/%3E%3C/g%3E%3C/svg%3E"
  3.  
  4. // 刪除方法 
  5. function deleteObject(eventData, transform) { 
  6.     const target = transform.target; 
  7.     const canvas = target.canvas; 
  8.     canvas.remove(target); 
  9.     canvas.requestRenderAll(); 
  10.  
  11. // 渲染icon 
  12. function renderIcon(ctx, lefttop, styleOverride, fabricObject) { 
  13.       const size = this.cornerSize; 
  14.       ctx.save(); 
  15.       ctx.translate(lefttop); 
  16.       ctx.rotate(fabric.util.degreesToRadians(fabricObject.angle)); 
  17.       ctx.drawImage(img, -size/2, -size/2, sizesize); 
  18.       ctx.restore(); 
  19.  
  20. // 全局添加刪除按鈕 
  21. fabric.Object.prototype.controls.deleteControl = new fabric.Control({ 
  22.       x: 0.5, 
  23.       y: -0.5, 
  24.       offsetY: -32, // 自定義距元素的偏移距離, 也可以定義offsetX 
  25.       cursorStyle: 'pointer'
  26.       mouseUpHandler: deleteObject, 
  27.       render: renderIcon, 
  28.       cornerSize: 24 
  29. }); 

這樣我們就實現了自定義元素控制,我們也可以按照類似的方法實現自定義的控件。效果如下:

預覽功能實現

預覽功能我主要是利用原生 canvas 的 toDataURL 方法來生成base64的數據,然后賦值給 img 標簽。還有一個細節需要注意的是如果我們在預覽之前畫布仍然有選中狀態的元素,那么控制點也會被截取出來,如下:

這樣對用戶體驗非常不好,我們需要在預覽時看到一張純粹的圖片,我的方案是在預覽前取消畫布所有元素的選中狀態,可以用 fabric 實例的 discardActiveObject() 方法取消激活狀態,然后更新畫布即可,具體實現邏輯如下:

  1. // 1. 取消畫布所有元素的選中狀態 
  2. canvasRef.current.discardActiveObject() 
  3. canvasRef.current.renderAll(); 
  4.  
  5. // 2. 將當前畫布轉化為圖片的base64地址 
  6. const img = document.getElementById("canvas"); 
  7. const src = (img as HTMLCanvasElement).toDataURL("image/png"); 
  8.  
  9. // 3. 設置元素url,顯示預覽彈窗 
  10. setImgUrl(src) 
  11. setIsShow(true

預覽效果展示:

保存圖片功能實現

保存圖片其實和預覽功能很像,唯一不同的是我們需要把圖片下載到本地,那么我主要是用純前端的方式實現圖片下載,大家也可以用自己熟悉的前端下載方案,接下來貼一下我的方案實現:

  1. function download(url:string, filename:string, cb?:Function) { 
  2.   return fetch(url).then(res => res.blob().then(blob => { 
  3.     let a = document.createElement('a'); 
  4.     let url = window.URL.createObjectURL(blob); 
  5.     a.href = url; 
  6.     a.download = filename; 
  7.     a.click(); 
  8.     window.URL.revokeObjectURL(url); 
  9.     cb && cb() 
  10.   })) 

主要是用的window 的 URL 對象的 createObjectURL 和 revokeObjectURL 方法,兩年前我也在我的文章中分享過對應的實現,感興趣的可以參考一下。下載的效果如下:

模版保存實現

在設計圖片編輯器的過程中我們也要考慮保存用戶的資產,比如做的比較好的圖片可以保存為模版,以便下次復用,所以我在編輯器里還實現的簡單的模版保存和使用的功能。我們先看一下效果:

我們在演示中可以看到保存為模版之后會自動同步到左側的模版列表中,我們下次創作時可以直接導入模版進行二次創作。以下是實現的邏輯圖:

由上圖可以發現我們保存模版不僅僅是保存圖片,還需要保存圖片對應的 json schema 數據,之所以要保存 json schema 是為了當用戶切換到對應的模版之后可以保證模版的每個元素都可以還原,類似于我們最熟悉的 PSD 源文件。fabric 提供了序列化畫布的方法 toDatalessJSON(),我們在保存模版的時候只要把序列化后的 json 和圖片一起保存即可,這里方便處理我暫時存在 localStorage 中,大家也可以使用大容量本地化存儲方案 indexedDB,我之前也基于 indexedDB 封裝了開箱即用的緩存庫 xdb,大家可以直接拿來使用。

  • xdb | 基于promise封裝且支持過期時間的開箱即用的indexedDB緩存庫

保存模版的具體實現如下:

  1. const handleSaveTpl = () => { 
  2.     const val = tplNameRef.current.state.value 
  3.     const json = canvasRef.current.toDatalessJSON() 
  4.     const id = nanoid(8) 
  5.     // 存json 
  6.     const tpls = JSON.parse(localStorage.getItem('tpls') || "{}"
  7.     tpls[id] = {json, t: val}; 
  8.     localStorage.setItem('tpls', JSON.stringify(tpls)) 
  9.     // 存圖片 
  10.     canvasRef.current.discardActiveObject() 
  11.     canvasRef.current.renderAll() 
  12.     const imgUrl = getImgUrl() 
  13.     const tplImgs = JSON.parse(localStorage.getItem('tplImgs') || "{}"
  14.     tplImgs[id] = imgUrl 
  15.     localStorage.setItem('tplImgs', JSON.stringify(tplImgs)) 
  16.     // 更新模版列表 
  17.     setTpls((prev:any) => [...prev, {id, t: val}]) 
  18.     setIsTplShow(false
  19.   } 

導入模版功能實現

導入模版的本質是反序列化 Json Schema,在研究 fabric 的過程中發現了其可以直接加載 json 渲染圖形序列,所以我們可以直接將上文保存的 json 直接加載到畫布:

  1. // 1.加載前清空畫布 
  2. canvasRef.current.clear(); 
  3. // 2.重置畫布背景色 
  4. canvasRef.current.backgroundColor = 'rgba(255,255,255,1)'
  5. // 3. 渲染json 
  6. canvasRef.current.loadFromJSON(tpls[id].json, canvasRef.current.renderAll.bind(canvasRef.current)) 

然后我們就可以根據保存的模版列表,動態切換模版了:

后期規劃這款圖片編輯器我已經在 github 開源了,大家可以基于次開發更強大的圖片編輯器。

本文轉載自微信公眾號「 趣談前端」

 

責任編輯:姜華 來源: 趣談前端
相關推薦

2022-08-31 08:32:22

數據可視化項目nocode

2021-04-12 08:31:53

PC-Dooring項目PC端搭建

2024-03-06 08:26:29

2021-04-08 14:58:59

開發前端編輯器

2021-11-24 09:12:11

Markdown編輯器Linux

2023-06-20 00:04:18

框架開發UMD

2020-09-16 10:27:50

MarkDown編輯器編程

2019-05-30 08:43:45

JavaScript富文本編輯器編輯器

2022-09-05 13:16:42

MicroVim編輯器

2021-03-08 06:00:03

Markdown在線編輯器開源

2021-09-11 21:03:09

可視化搭建框架

2019-11-26 08:43:44

平臺桌面軟件

2023-01-07 08:09:41

零代碼Dooring組件

2021-06-22 14:47:19

electronDooring架構

2021-09-26 16:31:18

滑動驗證碼開發組件設計

2022-05-27 10:00:06

C++游戲引擎

2015-02-12 09:51:24

代碼編輯

2021-03-10 09:15:15

代碼文本編輯器編程

2021-10-28 08:42:31

Dooring表單設計器數據可視化

2022-04-15 14:44:10

編輯器前端富文本
點贊
收藏

51CTO技術棧公眾號

久久99热这里只有精品| 成人在线视频免费观看| 午夜电影网一区| 免费观看成人在线| 97在线公开视频| 亚洲婷婷免费| 亚洲一区999| 亚洲av午夜精品一区二区三区| 97蜜桃久久| 国产精品热久久久久夜色精品三区 | 日韩欧美一区视频| 中文字幕剧情在线观看一区| 日本人妻丰满熟妇久久久久久| 天堂在线一区二区| 欧美成人一区在线| 精品一区二区三区蜜桃在线| 欧美a级大片在线| 色噜噜狠狠色综合中国| 少妇一晚三次一区二区三区| 国产免费永久在线观看| 高清视频一区二区| 国产精品久久久久免费a∨| 神马久久精品综合| 精品久久精品| 日韩电影免费在线观看中文字幕| 色91精品久久久久久久久| 一区一区三区| 亚洲国产精品麻豆| 九九久久九九久久| 午夜视频在线| 国产日韩av一区二区| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 日本中文字幕免费| 在线一区免费| 日韩在线视频导航| 国产精品美女高潮无套| 日韩中文av| 亚洲护士老师的毛茸茸最新章节| 色综合五月婷婷| 国产香蕉久久| 日韩欧美视频一区二区三区| 国产精品69久久久| 羞羞视频在线观看免费| 成人欧美一区二区三区白人| 亚洲精品一品区二品区三品区| 天堂在线中文| 91小视频免费看| 国产一区精品在线| 深爱激情五月婷婷| 不卡一区在线观看| 国产精品手机在线| 亚洲成人av综合| 国产成人午夜高潮毛片| 91九色国产在线| 国产精品无码在线播放| 精品无码三级在线观看视频| 国产精品嫩草视频| 中文字幕av网站| 美女脱光内衣内裤视频久久网站| 国产精品极品尤物在线观看| 天天干天天操天天操| 天堂久久久久va久久久久| 日本高清视频精品| 精品黑人一区二区三区| 久久精品天堂| 国产精品视频自在线| 亚洲一区二区人妻| 久久99精品久久久久婷婷| 91欧美精品成人综合在线观看| 国产三级精品在线观看| 国产毛片精品国产一区二区三区| 51国产成人精品午夜福中文下载| 午夜精品久久久久久久96蜜桃| 国产成人在线色| 国产成人亚洲欧美| 天天影院图片亚洲| 国产精品人妖ts系列视频| 国产日韩视频在线播放| 在线中文字幕-区二区三区四区| 亚洲精品免费看| 国产原创中文在线观看 | 午夜一区二区三区在线观看| 男女猛烈激情xx00免费视频| gay欧美网站| 欧美性猛交xxxx黑人交| 中文国产在线观看| 黑人久久a级毛片免费观看| 亚洲美女久久久| 99热这里只有精品4| 欧美精品18| 91sa在线看| 91精品国产色综合久久不8| 国产成人在线影院| 欧美日韩亚洲在线| 国产黄色小视频在线| 午夜视频久久久久久| 亚洲视频在线观看一区二区三区| a一区二区三区亚洲| 亚洲经典中文字幕| 国产视频精品免费| 国产日韩一区| 亚洲r级在线观看| 青春有你2免费观看完整版在线播放高清 | 欧美性色欧美a在线播放| 午夜诱惑痒痒网| 亚洲综合图色| 欧美大片免费观看| 中文字幕乱码在线观看| 99久久伊人精品| 永久久久久久| 亚洲成人激情社区| 亚洲国产精品久久精品怡红院| 美国黄色特级片| 国产欧美欧美| 91精品久久久久久蜜桃| 国产高清视频在线观看| 亚洲高清中文字幕| 日韩欧美亚洲另类| 国产精品亚洲二区| 国自产精品手机在线观看视频| 伊人精品在线视频| 久久久久久久久99精品| 成人午夜免费在线视频| 久久精品超碰| 亚洲天堂开心观看| 丰满少妇乱子伦精品看片| 国产一区二区精品久久91| 日韩欧美亚洲v片| 三妻四妾的电影电视剧在线观看| 日韩一区二区电影在线| 精品女人久久久| 日韩综合在线视频| 看欧美日韩国产| 蜜桃视频动漫在线播放| 精品噜噜噜噜久久久久久久久试看| 亚洲色图欧美色| 日本成人在线视频网站| 欧美在线一区二区三区四区| 亚洲福利影院| 日韩国产激情在线| 午夜精品久久久久久久久久久久久蜜桃| 国产一区二区三区免费看| 亚洲精品中字| 国产精品久久久久久久久免费高清 | 日本高清免费在线视频| 欧美成免费一区二区视频| 国产精品白嫩美女在线观看| 日本亚洲一区| 91久久精品一区二区三| 阿v天堂2014| 日韩激情一区二区| 亚洲成人18| 日韩欧乱色一区二区三区在线| 中文国产亚洲喷潮| 夜夜嗨av禁果av粉嫩avhd| 国产精品国产精品国产专区不蜜| 日本在线观看免费视频| 色乱码一区二区三区网站| 国产精品一区二区三区免费视频| 日本在线播放| 欧美一区二区三区视频| 深夜福利影院在线观看| 高潮精品一区videoshd| 精品无码一区二区三区爱欲| 欧美xxxx在线| 国产成人av在线播放| seseavlu视频在线| 91麻豆精品国产| 国产在线视频你懂的| 白白色 亚洲乱淫| 国产精品97在线| 色综合久久一区二区三区| 91久久在线播放| caoporn视频在线观看| 国产视频一区在线| 一级黄色a毛片| 亚洲激情自拍视频| 无码精品一区二区三区在线播放| 亚洲专区一区二区三区| 一区二区三区久久网| 精品久久久久久久久久岛国gif| 欧美激情手机在线视频| 瑟瑟在线观看| 欧美乱妇一区二区三区不卡视频| 青娱乐国产盛宴| 久久网这里都是精品| 九九精品久久久| 黄色日韩在线| 色噜噜狠狠色综合网| 久久精品九色| 国产成人一区二| 里番在线播放| 国产一区二区三区丝袜| 精品久久久无码中文字幕| 欧美日韩国产在线看| 在线免费观看日韩av| 国产综合久久久久久久久久久久| 鲁一鲁一鲁一鲁一色| 色综合咪咪久久网| 玛丽玛丽电影原版免费观看1977| 国产成人亚洲一区二区三区| 亚州成人av在线| 日本在线免费看| 亚洲精品一区中文字幕乱码| 国产欧美熟妇另类久久久| 红桃视频成人在线观看| 91传媒免费观看| 91视频观看视频| 北条麻妃亚洲一区| 日本欧美一区二区在线观看| 国产精品www在线观看| 日韩精品免费一区二区三区| 国产一区二区视频在线免费观看| 中文幕av一区二区三区佐山爱| 欧美一区二三区| 性xxxxfjsxxxxx欧美| 最近2019中文字幕一页二页| 日色在线视频| 亚洲国产精品va在线观看黑人| 国产女人爽到高潮a毛片| 色伊人久久综合中文字幕| 午夜国产福利一区二区| 日本一区二区久久| 九色porny自拍视频| 成人av网址在线观看| 一级片免费在线观看视频| 麻豆精品精品国产自在97香蕉| 久久9精品区-无套内射无码| 精品1区2区3区4区| 国产精品av免费观看| 91青青国产在线观看精品| 天堂资源在线亚洲资源| 亚洲区小说区图片区qvod| 精品久久久久久乱码天堂| 97se亚洲| 国产精品久久九九| 福利片在线一区二区| 成人一区二区三区四区| 亚洲视频国产精品| 97久草视频| 日韩精品视频一区二区三区| 亚洲精品欧美极品| 日韩影片在线观看| 成人国产1314www色视频| 日韩高清一区| 国产精品手机在线| 秋霞综合在线视频| 国产有色视频色综合| 国产乱人伦精品一区| 国产精品对白刺激久久久| 91亚洲无吗| 久久精品国产一区二区三区不卡| 高清日韩中文字幕| 精品亚洲一区二区三区四区五区高| 这里视频有精品| 国产日韩一区欧美| 亚洲激情77| 视频在线99re| 婷婷综合久久| 男人添女荫道口喷水视频| 狠狠色狠狠色综合日日tαg| 久激情内射婷内射蜜桃| 国产日韩一区二区三区在线| 免费日韩视频在线观看| 日韩一区精品视频| 欧美视频亚洲图片| 成人一区二区三区视频| 97香蕉碰碰人妻国产欧美| 久久综合久久鬼色中文字| 久久久久久国产免费a片| 国产精品久久综合| 久久国产在线观看| 欧美日韩一区二区免费视频| 波多野结衣不卡| 91精品国产综合久久婷婷香蕉| www五月婷婷| 亚洲精品在线91| 欧美a免费在线| 久久久噜噜噜久久中文字免| 午夜欧美巨大性欧美巨大| 国产玖玖精品视频| 国产精品流白浆在线观看| 快播亚洲色图| 国产精品99久久精品| 国产69精品久久久久久久| 日韩精彩视频在线观看| 香蕉视频xxxx| 久久蜜桃av一区二区天堂| 免费精品在线视频| 欧美性高潮床叫视频| 国产精品久久久久久无人区| 亚洲国产天堂久久综合| 欧美高清视频| 欧美影院在线播放| 国产精品中文| 日韩欧美一区二区三区四区| 午夜精品久久| 天堂在线资源视频| 北条麻妃国产九九精品视频| 手机看片国产日韩| 婷婷中文字幕一区三区| 一级α片免费看刺激高潮视频| 亚洲级视频在线观看免费1级| 精品美女在线观看视频在线观看 | 美女色狠狠久久| 国产精品一区免费观看| 99久久.com| 毛葺葺老太做受视频| 成人av免费网站| 91 在线视频| 91福利视频久久久久| 色哟哟中文字幕| 美女av一区二区三区| 国产亚洲一区二区手机在线观看| 国产成人成网站在线播放青青 | 久久久亚洲午夜电影| 免费看一级一片| 欧美精品1区2区3区| 国产在线观看网站| 69精品小视频| 综合激情久久| 国产又粗又爽又黄的视频| 免费欧美日韩国产三级电影| 中文字幕一区二区久久人妻网站| 亚洲黄色av一区| 国产同性人妖ts口直男| 中文字幕欧美日韩| 日日夜夜天天综合| 久久久久久久久一区二区| 雨宫琴音一区二区在线| 免费国偷自产拍精品视频| 国产精品不卡在线| 中文字幕+乱码+中文乱码91| 一夜七次郎国产精品亚洲| 在线免费三级电影网站| 国产亚洲精品美女久久久m| 欧美+日本+国产+在线a∨观看| 日韩精品你懂的| 亚洲国产成人自拍| 中文字幕黄色av| 国产一区二区三区三区在线观看| 亚洲精品一区| 免费观看国产成人| 日韩电影免费在线| 男人舔女人下部高潮全视频| 91成人在线观看喷潮| 国产区视频在线播放| 国产精品久久久久久久av大片| 精品少妇av| 手机免费av片| 亚洲免费观看在线视频| 99热这里是精品| 欧美激情videos| 日本成人a网站| 国产美女三级视频| 亚洲国产精品成人综合| 亚洲自拍第二页| 欧美成人精品在线播放| 亚洲一区电影| 黄页网站在线观看视频| 91麻豆国产福利精品| 天天爱天天做天天爽| 日韩视频免费在线观看| 欧美片网站免费| 国产自产在线视频| 久久久精品综合| 国产乱码精品一区二区三区精东| 美日韩精品免费视频| 国产丝袜一区| 日本成人在线免费视频| 中文av一区二区| 东京干手机福利视频| 欧美亚洲国产视频小说| 青青草综合网| 丰满少妇中文字幕| 黑人精品xxx一区一二区| 国产高清视频在线观看| 亚洲一区二区三区四区在线播放 | 国产精品福利电影一区二区三区四区| 一级片视频免费| 久久久亚洲精选| 欧美亚洲国产激情| 伊人影院在线观看视频| 精品国产福利在线| 137大胆人体在线观看| 99免费在线观看视频| 石原莉奈在线亚洲二区| 波多野结衣亚洲一区二区| 亚洲欧美激情精品一区二区| 国产精品亚洲一区二区在线观看| 日本在线xxx| 国产精品传媒在线| 天天综合天天色| 91精品在线看| 久久激情综合| 久久久久成人网站| 正在播放亚洲1区| 加勒比视频一区| 久久久久无码精品| 欧洲中文字幕精品|