亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

圖表設(shè)計器核心實現(xiàn):數(shù)據(jù)建模、SVG渲染與交互全解析

圖表設(shè)計器核心實現(xiàn):數(shù)據(jù)建模、SVG渲染與交互全解析 diagram-design這個詞前端圈子里應(yīng)該不陌生——你接手過一個流程編輯器、架構(gòu)可視化工具、邏輯編排平臺或者哪怕只是臨時給業(yè)務(wù)方搭一個拖拽畫布都會發(fā)現(xiàn)一個尷尬的事實圖表設(shè)計這事表面看就是畫幾個框、連幾條線但真正做起來數(shù)據(jù)建模、渲染方案、交互細節(jié)、性能優(yōu)化每一項都能折騰掉好幾個版本。這個項目名雖然短但它背后不是一個簡單的畫布Demo而是一整套結(jié)構(gòu)化圖形的可視化編輯基礎(chǔ)設(shè)施。這篇文章我就拿真實項目中做的圖表設(shè)計器來聊從需求拆解、技術(shù)選型到核心模塊的代碼實現(xiàn)和問題排查把能落地的經(jīng)驗一次講透。1. 項目到底要干什么拆解diagram-design的核心需求1.1 圖表設(shè)計器不只是畫布很多第一次接觸這類項目的人會理解偏以為圖表設(shè)計器就是個可拖拽的繪圖白板。實際不是。圖表設(shè)計器解決的核心命題是讓用戶用圖形化的方式編輯一份嚴(yán)格的結(jié)構(gòu)化數(shù)據(jù)。打個比方。畫布是表象數(shù)據(jù)模型才是內(nèi)功。用戶在畫布上拖一個節(jié)點、連一根線本質(zhì)是在改一份類似 JSON 的圖結(jié)構(gòu)節(jié)點有哪些、連線的起點終點在哪、每個節(jié)點帶什么業(yè)務(wù)屬性。而一個合格的 diagram-designer 必須保證兩件事所見即所得畫布上的位置、連線、樣式能無損映射回數(shù)據(jù)模型可恢復(fù)、可流轉(zhuǎn)數(shù)據(jù)可以導(dǎo)出、導(dǎo)入換個渲染器也能還原出同樣的圖。我記得在模擬項目X里一開始需求方一直強調(diào)要好看、要流暢團隊差點就往畫圖工具的方向跑偏了。后來我硬是拉著業(yè)務(wù)方過了一遍真正的使用閉環(huán)——從創(chuàng)建節(jié)點、設(shè)置屬性、連接關(guān)系、導(dǎo)出結(jié)構(gòu)化配置他們才意識到自己需要的不是畫板而是一個可視化的圖編輯器。這個認(rèn)知對齊非常關(guān)鍵直接決定了后面所有技術(shù)方向。1.2 核心功能清單與優(yōu)先級排序不同場景下的 diagram-design 需求差異很大做流程圖編輯器和做網(wǎng)絡(luò)拓?fù)淇梢暬m然都叫圖表設(shè)計器重點完全不同。結(jié)合通用情況我把核心功能按優(yōu)先級排一下優(yōu)先級功能模塊說明P0畫布基礎(chǔ)節(jié)點渲染、拖拽、縮放、平移這是地基沒有它一切都免談P0節(jié)點與連線創(chuàng)建/刪除節(jié)點設(shè)置連線起點終點支持連線樣式配置P0數(shù)據(jù)導(dǎo)入導(dǎo)出至少支持 JSON 序列化/反序列化保證圖數(shù)據(jù)可保存可恢復(fù)P1對齊輔助參考線、吸附、自動對齊批量操作效率全靠這個P1撤銷重做用戶操作錯了要能回退這是編輯器區(qū)別于畫板的核心標(biāo)志P2布局算法自動排版功能比如樹形布局、分層布局復(fù)雜圖必備P2小地圖圖大了以后定位用的一般放到后期做這里多說一句優(yōu)先級順序直接影響架構(gòu)設(shè)計。如果上來就做布局算法、小地圖把架構(gòu)搞得特別重反而拖慢核心鏈路的推進。我見過不少團隊一上來就往畫布里塞多選、框選、自動布局、版本歷史結(jié)果拖到最后連基礎(chǔ)的節(jié)點拖拽都有 bug。正確的姿勢是先打通數(shù)據(jù)—渲染—編輯—導(dǎo)出這條主鏈路再往上面加輔助特性。2. 技術(shù)選型自研還是用現(xiàn)成庫怎么選才對2.1 自研 or 第三方庫沒有標(biāo)準(zhǔn)答案只要做圖表設(shè)計器第一個問題就是能不能直接用現(xiàn)成庫。市面上的方案我不一一列舉簡單分成三類完全自研、基于通用渲染庫封裝、直接基于完整圖編輯器框架。完全自研所有渲染、交互、數(shù)據(jù)都由自己實現(xiàn)。優(yōu)點是完全可控、不依賴第三方框架體積和性能都能做到極致缺點是工作量大光是一個拖拽的精細度比如縮放后坐標(biāo)修正、吸附算法就夠調(diào)一陣子的?;谕ㄓ娩秩編旆庋b比如用 SVG 或用 Canvas 渲染庫做底層業(yè)務(wù)邏輯和交互自己寫。靈活性高工作量適中這是大多數(shù)項目的務(wù)實之選。直接套完整編輯器框架優(yōu)點是功能全、開箱即用缺點是定制深了會很痛苦框架的抽象一旦和業(yè)務(wù)模型不一致改起來比自己寫還難受。我在某公司的項目里就吃過直接套框架的虧。當(dāng)時團隊為了省時間引入了一個完整的圖編輯器框架結(jié)果業(yè)務(wù)方要求節(jié)點必須是多層嵌套的復(fù)合形狀且內(nèi)嵌表單要實時聯(lián)動。框架的節(jié)點模型根本撐不住最后硬改框架源碼維護成本爆炸。后來重做時干脆基于 SVG 自己搭了一套反而清爽得多。經(jīng)驗之談如果業(yè)務(wù)里的圖結(jié)構(gòu)是規(guī)規(guī)矩矩的流程節(jié)點、連線成熟框架能省很多事但如果你的圖有特殊的交互、復(fù)合節(jié)點、自定義業(yè)務(wù)編排自研的靈活度和可控性是框架給不了的。我接觸過的diagram-design類項目絕大多數(shù)走到后期都是自研或半自研。2.2 渲染方案SVG 還是 Canvas這是繞不過去的技術(shù)決策。兩者特點我整理成一張表維度SVGCanvas渲染方式矢量 DOM 元素位圖繪制節(jié)點數(shù)量幾百個量級還能撐再多就卡上萬個也能流暢刷新交互能力每個元素都是 DOM天然支持事件需要自己做命中檢測、事件管理樣式控制CSS 隨便寫樣式靈活樣式靠繪制代碼控制縮放清晰度矢量無限清晰按像素繪制縮放可能模糊開發(fā)效率心智簡單適合編輯器復(fù)雜度高一點適合高刷場景我的判斷是做圖編輯器默認(rèn)選 SVG。原因很簡單編輯器最核心的是人和元素的交互——節(jié)點要被選中、拖動、高亮、彈菜單SVG 天然用 DOM 支持這些鼠標(biāo)事件、鍵盤事件、樣式切換都是現(xiàn)成的。數(shù)據(jù)量很大時比如超過大幾百上千個節(jié)點再考慮 Canvas 或者 Canvas 虛擬化方案。當(dāng)然如果你做的是實時監(jiān)控大屏這種以展示為主、節(jié)點多到爆的場景Canvas 是更合理的。但 diagram-design 的重點是設(shè)計而不是展示這個定位想清楚渲染方案自然就有答案了。2.3 數(shù)據(jù)模型一切交互的中樞圖表設(shè)計器的數(shù)據(jù)模型我建議遵循一個根節(jié)點 兩層結(jié)構(gòu)的設(shè)計思路Graph圖整個圖表設(shè)計器的根數(shù)據(jù)包含全局的版本號、縮放平移視口信息、節(jié)點列表、連線列表Node節(jié)點代表一個可編輯的元素。除了唯一 id 和 position / size 這些幾何信息還要有一個 data 字段用來存業(yè)務(wù)自定義數(shù)據(jù)Edge連線代表節(jié)點和節(jié)點之間的連接關(guān)系。關(guān)鍵是它必須記錄從哪個節(jié)點的哪個端口到哪個節(jié)點的哪個端口。數(shù)據(jù)模型設(shè)計得好不好直接決定后面回退、聯(lián)動、序列化的復(fù)雜度。我后來的做法是讓所有數(shù)據(jù)都掛在根對象上用統(tǒng)一的狀態(tài)容器管理任何一次操作都通過生成新狀態(tài)來驅(qū)動渲染。這樣一個好處是撤銷重做、多端同步、歷史記錄都變成了狀態(tài)切換的問題而不是在組件里手動改來改去。我放一個最小化的數(shù)據(jù)模型示意TypeScript 風(fēng)格interface DiagramData { version: number; viewport: { x: number; y: number; zoom: number; }; nodes: NodeData[]; edges: EdgeData[]; } interface NodeData { id: string; type: string; x: number; y: number; width: number; height: number; data?: Recordstring, unknown; } interface EdgeData { id: string; source: string; // 源節(jié)點 id sourcePort?: string; // 源端口 id target: string; // 目標(biāo)節(jié)點 id targetPort?: string; label?: string; }在實際項目中我看到不少團隊為了省事直接把節(jié)點坐標(biāo)、樣式、業(yè)務(wù)數(shù)據(jù)混在一起也不抽象 Graph。前期看著還行一旦要做選中、框選、屬性面板聯(lián)動、序列化就發(fā)現(xiàn)到處在打補丁。建議一開始就把數(shù)據(jù)模型當(dāng)數(shù)據(jù)庫表來設(shè)計每個字段職責(zé)單一后面會少掉大量重構(gòu)成本。3. 核心模塊實現(xiàn)要點從畫布到節(jié)點到連線3.1 畫布基礎(chǔ)坐標(biāo)系與視圖變換畫布的第一個門檻是坐標(biāo)系。屏幕上呈現(xiàn)的內(nèi)容和用戶操作時拿到的鼠標(biāo)坐標(biāo)通常不在一套坐標(biāo)系里。我一般把坐標(biāo)系分成兩層世界坐標(biāo)系圖表元素真實使用的坐標(biāo)系。節(jié)點存的 x/y 是世界坐標(biāo)和縮放無關(guān)屏幕坐標(biāo)系用戶看到的坐標(biāo)系。它等于世界坐標(biāo)乘以縮放倍率再加平移偏移。畫布放大縮小時節(jié)點的世界坐標(biāo)不要變只更新 viewport 里的 zoom 和 x/y 偏移。鼠標(biāo)事件給的是屏幕坐標(biāo)要轉(zhuǎn)換到世界坐標(biāo)再去做命中、拖拽計算。轉(zhuǎn)換公式很簡單const worldX (screenX - viewport.x) / viewport.zoom; const worldY (screenY - viewport.y) / viewport.zoom;這個基礎(chǔ)卻極容易踩坑。我遇到過一個經(jīng)典的 bug拖動節(jié)點時節(jié)點跑到鼠標(biāo)后面越縮放偏差越大。最終定位到問題——拖拽期間混用了屏幕坐標(biāo)和世界坐標(biāo)特別是 zoom 不等于 1 的時候一加一減就出錯了。經(jīng)驗是所有落到數(shù)據(jù)模型里的坐標(biāo)統(tǒng)一存世界坐標(biāo)所有讀取鼠標(biāo)位置的代碼統(tǒng)一先轉(zhuǎn)世界坐標(biāo)再用。3.2 節(jié)點的拖拽、選中與對齊輔助節(jié)點拖拽的交互邏輯拆開其實就三步鼠標(biāo)按下節(jié)點時記錄起始世界坐標(biāo)和節(jié)點的起始位置鼠標(biāo)移動時用當(dāng)前世界坐標(biāo)減去起始點得到偏移量更新節(jié)點位置鼠標(biāo)抬起時觸發(fā)一次快照更新供撤銷重做使用。但真實的拖拽體驗遠沒有這么簡單。要做得順手還得加兩樣?xùn)|西臨界判定鼠標(biāo)按下到移動的距離超過某個閾值比如 3px才算拖拽否則是點擊選中。不然每次點一下節(jié)點都會誤拖。對齊吸附拖節(jié)點的時候系統(tǒng)幫它跟附近節(jié)點的邊緣、中心線對齊。實現(xiàn)思路是候選對齊線離節(jié)點邊緣小于某個閾值比如 5px時直接把節(jié)點坐標(biāo)修正到對齊位置。吸附這個功能看著不起眼卻是編輯器順手不順手的分水嶺。我在項目里專門寫了個對齊線計算工具每次拖拽時找候選對齊線、計算修正量實測下來用戶的排版效率提升很明顯尤其是做流程圖和腦圖這類對齊要求高的場景。3.3 連線交互錨點、貝塞爾曲線與命中檢測連線的設(shè)計比節(jié)點復(fù)雜不少。一個完整的連線交互鏈路由三部分構(gòu)成錨點端口、連線路徑、命中檢測。錨點一般定義在節(jié)點邊緣或內(nèi)部的固定位置。連線不是從一個節(jié)點拉到一個節(jié)點就完事而是從一個錨點拉到另一個錨點。錨點模型允許同一個節(jié)點向外拉出多條線而且能區(qū)分這條線是從哪個方向出去的方便后面計算連線路徑。連線路徑的繪制我最常用的是貝塞爾曲線默認(rèn)用三次貝塞爾曲線控制點根據(jù)錨點方向和目標(biāo)位置自動計算。這么做的好處是曲線平滑美觀而且方向感強一眼能看出從哪出來、到哪進去。我給一個基于 SVG 的簡化示意// 假設(shè) source 方向朝右target 方向朝左 import React from react; export function BezierEdge({ sourceX, sourceY, targetX, targetY }) { const dx Math.abs(targetX - sourceX) * 0.5; const path M ${sourceX} ${sourceY} C ${sourceX dx} ${sourceY}, ${targetX - dx} ${targetY}, ${targetX} ${targetY}; return path d{path} stroke#8492A6 strokeWidth{1.5} fillnone /; }這種實現(xiàn)方式在可視化類項目里非常通用。要處理的情況還包括連線的 label文字標(biāo)簽、連線樣式虛線、實線、顏色、以及箭頭 marker。命中檢測是另一個坑。用戶要能點擊連線、選中連線、拖動連線改路。SVG 下path元素默認(rèn)的可點擊區(qū)域是路徑本身很窄不太容易點中。我當(dāng)時的方案是畫一條透明的寬 stroke比如strokeWidth{20}stroketransparent墊在真實路徑下面讓透明路徑來響應(yīng)點擊。這樣既保留了視覺上的細線又給了用戶友好的點擊熱區(qū)。3.4 布局算法放在什么階段做布局算法是個容易過把癮就死的功能。自動排版看起來炫酷但做好很困難。我的建議是如果項目不是以自動生成圖為核心布局算法別放在早期版本。原因很現(xiàn)實——自動布局很難滿足用戶的審美有時候排出來的圖是邏輯正確但怎么看怎么怪用戶最后還是要手動調(diào)。真正需要的場景一般是三種樹形結(jié)構(gòu)比如組織架構(gòu)圖、目錄樹。這類布局用經(jīng)典的樹形遞歸布局就能搞定從上到下逐層排同一層節(jié)點對齊。分層結(jié)構(gòu)比如流程圖、狀態(tài)機??梢杂梅謱硬季炙惴ò压?jié)點按層級分列擺開再調(diào)整連線交叉。自由拓?fù)浔热缇W(wǎng)絡(luò)拓?fù)?、關(guān)系圖。這個比較復(fù)雜一般要上力導(dǎo)向布局模擬物理彈性、斥力、引力讓節(jié)點自動散開。如果在后期必須做一個見效快的自動排版我建議從樹形布局和分層布局入手計算公式和效果可預(yù)期也好看力導(dǎo)向布局雖然炫但參數(shù)調(diào)起來很磨人投入產(chǎn)出比要好好掂量。4. 實操記錄搭建一個最小可用的圖表設(shè)計器4.1 項目骨架與依賴準(zhǔn)備這一節(jié)我把當(dāng)初做最小可用圖表設(shè)計器的實操過程完整走一遍。技術(shù)棧我選 Vite React TypeScript加一個輕量的狀態(tài)管理庫。為什么選這套原因有兩個一是生態(tài)成熟寫交互組件方便二是類型定義完善對數(shù)據(jù)模型的約束強特別適合圖表編輯器這種數(shù)據(jù)結(jié)構(gòu)驅(qū)動的工程。項目初始化命令按當(dāng)時的推進方式大概是npm create vitelatest diagram-design-demo -- --template react-ts cd diagram-design-demo npm install npm install zustand選 Zustand 是因為它在中小型圖表編輯器里的狀態(tài)管理成本最低不需要像大型框架那樣寫一堆模板代碼同時又支持按需訂閱更新對性能友好。真實項目里我更喜歡直接用 Zustand而不是再套一層模型層因為圖表數(shù)據(jù)本身的結(jié)構(gòu)已經(jīng)足夠表達模型了沒必要再包一層。4.2 定義數(shù)據(jù)模型與狀態(tài)容器繼續(xù)往下之前先把數(shù)據(jù)模型寫進代碼。我把 Graph、Node、Edge 的類型定義和狀態(tài)初始化放一起import { create } from zustand; interface Viewport { x: number; y: number; zoom: number; } interface NodeData { id: string; type: string; x: number; y: number; width: number; height: number; data: Recordstring, unknown; } interface EdgeData { id: string; source: string; sourcePort: string; target: string; targetPort: string; } interface DiagramState { viewport: Viewport; nodes: NodeData[]; edges: EdgeData[]; selectedIds: string[]; moveNode: (id: string, dx: number, dy: number) void; } export const useDiagramStore createDiagramState((set) ({ viewport: { x: 0, y: 0, zoom: 1 }, nodes: [], edges: [], selectedIds: [], moveNode: (id, dx, dy) set((state) ({ nodes: state.nodes.map((node) node.id id ? { ...node, x: node.x dx, y: node.y dy } : node ) })) }));這里有一個關(guān)鍵點我反復(fù)提節(jié)點位置用世界坐標(biāo)存儲更新時只做加減不做縮放換算。這樣實現(xiàn)撤銷快照時最簡單至少不用每次快照前先把坐標(biāo)還原到統(tǒng)一基準(zhǔn)快照之間的數(shù)據(jù)口徑始終一致。4.3 畫布組件SVG 渲染與坐標(biāo)轉(zhuǎn)換有了數(shù)據(jù)層直接到渲染層。畫布組件負(fù)責(zé)渲染所有節(jié)點和邊、以及把鼠標(biāo)屏幕坐標(biāo)轉(zhuǎn)成世界坐標(biāo)。我當(dāng)時的實現(xiàn)如下import React, { useRef, useCallback } from react; import { useDiagramStore } from ./store; import { BezierEdge } from ./BezierEdge; export function Canvas() { const svgRef useRefSVGSVGElement(null); const viewport useDiagramStore((s) s.viewport); const nodes useDiagramStore((s) s.nodes); const edges useDiagramStore((s) s.edges); const toWorld useCallback((clientX: number, clientY: number) { const svg svgRef.current; const rect svg.getBoundingClientRect(); const screenX clientX - rect.left; const screenY clientY - rect.top; return { x: (screenX - viewport.x) / viewport.zoom, y: (screenY - viewport.y) / viewport.zoom }; }, [viewport]); const handleMouseMove (e: React.MouseEvent) { const world toWorld(e.clientX, e.clientY); console.log(world coords:, world); }; return ( svg ref{svgRef} width100% height600 style{{ background: #F7F8FA }} onMouseMove{handleMouseMove} g transform{translate(${viewport.x} ${viewport.y}) scale(${viewport.zoom})} {edges.map((edge) { const source nodes.find((n) n.id edge.source); const target nodes.find((n) n.id edge.target); if (!source || !target) return null; return ( BezierEdge key{edge.id} sourceX{source.x source.width} sourceY{source.y source.height / 2} targetX{target.x} targetY{target.y target.height / 2} / ); })} {nodes.map((node) ( g key{node.id} transform{translate(${node.x} ${node.y})} rect width{node.width} height{node.height} rx{6} fill#FFFFFF stroke#C0C4CC / text x{12} y{24} fontSize{14} fill#1F2D3D {String(node.data.label ?? node.id)} /text /g ))} /g /svg ); }這里有個容易忽略的細節(jié)g的transform用的是translate(...) scale(...)順序不能反。如果寫成scale(...) translate(...)縮放中心就從原點變掉了圖會到處亂跑。我當(dāng)時調(diào)試縮放功能時就被這個問題坑了半小時后來把這個順序固定下來并寫進注釋避免后續(xù)維護再造坑。節(jié)點拖動事件在真實項目里通常要綁定在單個節(jié)點上對rect或整個g加onMouseDown然后配合window級的mousemove/mouseup來完成拖拽。這里不貼全量代碼了但要點就一個拖拽移動的監(jiān)聽不要掛在 SVG 上而要掛在 window 上。否則鼠標(biāo)移出 SVG 邊界節(jié)點就丟了這是實戰(zhàn)中第一必踩的坑。4.4 連線交互拖線拉出一條新邊除了渲染已有的邊從節(jié)點拉一條線出來也是圖表設(shè)計器的標(biāo)志性動作。實現(xiàn)思路是開始拖拽時創(chuàng)建一個臨時邊狀態(tài)終點跟著鼠標(biāo)走松開時若落在合法錨點上則生成正式邊。簡化版的臨時邊狀態(tài)interface TempEdge { sourceId: string; sourceX: number; sourceY: number; currentX: number; currentY: number; }臨時邊渲染時用貝塞爾曲線把 source 端連到鼠標(biāo)當(dāng)前位置鼠標(biāo)松開時找到命中的節(jié)點和端口然后調(diào)用addEdge寫入正式數(shù)據(jù)。這個交互的細節(jié)在端點命中上。我當(dāng)時設(shè)計了端點的熱區(qū)概念如果鼠標(biāo)位置離某個節(jié)點的中心很近比如節(jié)點寬高的一半以內(nèi)就認(rèn)為要連接到該節(jié)點否則是空白區(qū)域取消連線。沒有一個好的熱區(qū)規(guī)則用戶拉線的時候總是差一點接上體驗會非常挫敗。這個熱區(qū)規(guī)則的調(diào)優(yōu)沒有一個萬能參數(shù)但基本思路是一致的給用戶靠近即吸附的手感。4.5 導(dǎo)入導(dǎo)出讓圖數(shù)據(jù)能保存和恢復(fù)圖表設(shè)計器做得再好數(shù)據(jù)不能導(dǎo)出就廢了一半。導(dǎo)入導(dǎo)出的兩條曲線第一JSON 導(dǎo)入導(dǎo)出。這個最簡單直接JSON.stringify(diagramData)保存導(dǎo)入時解析賦值回狀態(tài)。注意解析的時候要做數(shù)據(jù)校驗別帶一堆非法節(jié)點進來至少檢查 nodes 不是數(shù)組、id 唯一。第二圖片導(dǎo)出。很多用戶都想要導(dǎo)出 PNG。SVG 做法比 Canvas 簡單把 SVG 序列化成字符串放進Image對象然后繪制到canvas上再toDataURL下載。這里有個常見坑如果 SVG 里有外部字體導(dǎo)出時字體可能渲染不一致更常見的是內(nèi)部用了foreignObject嵌入 HTML導(dǎo)出會白屏。所以導(dǎo)出前最好確保內(nèi)容都是純矢量。我當(dāng)時做圖片導(dǎo)出時就是把內(nèi)嵌的 HTML 移除改成 SVG 原生 text 來渲染文字才解決了白屏問題。這個經(jīng)驗適用于大部分圖表設(shè)計器項目導(dǎo)出圖片前考慮 SVG 的兼容性避免依賴外部資源。4.6 快捷操作與撤銷重做快捷鍵是編輯器體驗的放大器。至少要支持 Ctrl/Cmd Z撤銷、Ctrl/Cmd C / V復(fù)制粘貼、Delete刪除選中。實現(xiàn)上不要寫給每個組件單獨建一個全局快捷鍵監(jiān)聽模塊統(tǒng)一分發(fā)。撤銷重做我推薦兩種方案對比方案思路優(yōu)點缺點快照每次操作后保存整體數(shù)據(jù)快照實現(xiàn)簡單邏輯清晰內(nèi)存消耗大節(jié)點多時頻繁快照會卡命令模式每個操作定義 undo/redo 兩個方法內(nèi)存友好操作粒度細抽象成本高每個操作要寫兩遍邏輯我實際的項目里中等復(fù)雜度圖用了快照 節(jié)流的組合只有鼠標(biāo)松開、鍵盤刪除這類操作結(jié)束時才生成快照拖拽過程中的實時移動不生成快照。這樣內(nèi)存壓力可控代碼也簡單得多。真到了圖譜特別大的場景再考慮命令模式也不遲。5. 常見問題與排查實錄把踩過的坑都攤開說5.1 圖表一多就卡頓到底卡在哪圖表設(shè)計器最常見的性能問題是節(jié)點上百個之后拖拽畫布、縮放開始掉幀交互有明顯的延遲。我排查性能問題的固定套路是三步走先確定瓶頸在渲染還是狀態(tài)。如果純 DOM 渲染卡資源面板里看 JS 執(zhí)行時間如果狀態(tài)更新頻繁導(dǎo)致大量組件重渲染就要看更新訂閱范圍。減少不必要的重渲染。用 Zustand 時每個組件按需訂閱它關(guān)心的字段別把整個 store 都放進去。這個點在 React 下特別有效。SVG 元素數(shù)量過大。幾百個節(jié)點在 SVG 里其實還好上千個就明顯吃力。此時可以選擇對離屏/不顯示的節(jié)點做懶渲染或按視口裁剪只渲染可視區(qū)域。我清楚的記得模擬項目X里節(jié)點一多畫布平移就卡后來定位到問題在所有節(jié)點都在 SVG 里常駐渲染平移時每個節(jié)點都要跟著重排。后來我把節(jié)點分組平移時只更新外層g的 transform內(nèi)層節(jié)點不動性能一下提了上來。這種靜態(tài)內(nèi)容打包成小組動態(tài)位移只動小組外層的思路特別適合 SVG 渲染的圖表編輯器。5.2 拖拽錯位坐標(biāo)換算別踩坑拖拽錯位是圖表設(shè)計器里出現(xiàn)頻率最高、也最容易讓人迷惑的問題。癥狀是拖動節(jié)點時節(jié)點明顯偏離鼠標(biāo)位置而且縮放比例越大偏得越多。我在排查這種問題時必查三處事件監(jiān)聽用的坐標(biāo)是什么如果直接用e.clientX、e.clientY這是屏幕坐標(biāo)如果用e.offsetX、e.offsetY那是相對于當(dāng)前目標(biāo)元素的坐標(biāo)。兩者都要先轉(zhuǎn)世界坐標(biāo)。節(jié)點位置和拖拽開始位置是否同一坐標(biāo)口徑節(jié)點存的是世界坐標(biāo)拖拽計算如果用屏幕坐標(biāo)加一減一加就錯位了。CSS transform 有沒有影響坐標(biāo)換算如果容器不是全屏svg.getBoundingClientRect()返回的 rect 會包含容器位置和縮放所以不要想當(dāng)然地拿clientX做減法要先減去rect.left。這個排查思路幫我在好多次 Code Review 里一針見血地發(fā)現(xiàn)問題。遇到錯位問題別急著加偏移補償先把坐標(biāo)口徑理清楚80% 的問題半小時內(nèi)就能定位。5.3 撤銷重做的幾個隱形坑撤銷重做看著簡單做起來全是細節(jié)。最典型的問題有三個撤銷后節(jié)點和連線不同步。比如節(jié)點刪了連到它的邊還在或者撤銷添加節(jié)點操作時節(jié)點沒了邊還懸空。根治辦法是操作封裝成變更集節(jié)點和受影響的邊一起進快照。撤銷時 viewport 要不要恢復(fù)用戶把一個地方放大然后撤銷編輯視圖卻跳回之前的狀態(tài)體驗很差。常規(guī)做法是視口不進撤銷快照單獨維護一個純視圖狀態(tài)。連按撤銷過快導(dǎo)致內(nèi)存爆炸。這個好解決限制快照數(shù)量比如只保留最近的 50 個快照超出就把最老的丟掉。還有一個細節(jié)特別容易忽略編輯器初始加載時不要生成快照否則用戶一進頁面按撤銷發(fā)現(xiàn)界面回到了一片空白。解決辦法是初始數(shù)據(jù)先應(yīng)用完再初始化快照棧的起點。5.4 縮放后節(jié)點位置漂移或文字模糊如果使用 SVG 渲染矢量圖形理論上不會模糊。文字模糊常常是因為用了某些外部字體、或者 SVG 嵌入了foreignObject。解決辦法是文字統(tǒng)一用 SVG text 渲染字體用系統(tǒng)字體棧。節(jié)點位置漂移的問題多半還是出在坐標(biāo)口徑或 transform 順序上。我之前調(diào)試過一個 bug縮放時節(jié)點位置看起來是飄的后來發(fā)現(xiàn)是scale寫在了translate前面縮放中心從原點變成了 0,0導(dǎo)致整個圖縮放時整體往一個方向跑。修正順序后一切恢復(fù)正常。記住transformtranslate(x y) scale(zoom)才是以 (x,y) 為錨點縮放的正確寫法。6. 一點自己的心思圖表設(shè)計器這類項目真正有價值的地方不是堆了多少炫酷功能而是把數(shù)據(jù)模型這個地基打扎實。我吃過的虧里十有八九是前期不重視數(shù)據(jù)模型后期返工補課。節(jié)點、邊、端口、視口這四類數(shù)據(jù)一開始分清楚職責(zé)邊界后面加功能都順。還有一個感受想分享做 diagram-design一定要多跟真實用戶一起操作幾輪。你真看用戶是怎么畫圖的會發(fā)現(xiàn)他們根本不關(guān)心技術(shù)選型只在乎拖得順不順、對齊準(zhǔn)不準(zhǔn)、連線好不好接、撤銷穩(wěn)不穩(wěn)。銷售說的用戶體驗就是這些看起來很不起眼的交互細節(jié)。把這些細節(jié)打磨好才是這個項目最值得投入的地方。如果你正要開始做類似的圖表設(shè)計器我的建議是先用最簡版本打通畫節(jié)點、拉連線、導(dǎo)出 JSON這條鏈路再回去填功能細節(jié)。別一上來就規(guī)劃宏偉藍圖先把一杯水倒?jié)M再考慮裝更大的壺。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
国产AB视频| 色综合五月天| 日本精品五区| 99后入| 国产情侣自拍在线播放| 欧美亚洲尤物久久| 麻豆国产97在线| 18禁久极品美女久久哦哟呀!| 97色碰| 日韩A优精品在线观看| 99久在线精品99re8蜜桃| 第四色亚洲色图| 亚洲各类熟们中文字幕| 一级黄色视频网| 91美| 人妻蜜桃臀| 精产国品一区二三产品| 东京太热久久久| 人人考人人摸人人干| 日本欧美成人片AAAA| 强奸乱伦 亚洲一区| 久久香蕉国产线看观看亚洲女人 | 1024亚洲中文字幕久在线看片你懂的 | 久久男人网| www.99热| 91人妻PORNY九色大屁股| 日韩av不卡在线观看| 欧美Aⅴ| 天天射天天| 午夜一区| 亚洲中文字幕在现观看| 91综合熟女| 午夜在线播放| 啊啊啊啊操死我| 天天综合欧美| 久久男人精品| 熟妇精品juliaannAV| 98色网| 久久精视频美日韩在线视频| 亚洲中文字母在线播放| 日韩av在线播放不卡| 国产成人bd在线观看| 人妻中文字幕精品无码| 樱花蜜乳av| 中文字幕精品一区二区精| 久久91精品国产9丨久久分亭| 激情小说图片亚洲首页| 老熟女搡BBBB搡BBBB视频| 色欲Av人妻精品一区二| xxxx网站亚洲精品| 婷婷色在线| 色五月婷婷麻豆在| 麻豆国产原创AV色哟哟| 色综和网| 91亚洲综合| 久久超碰国产一区二区三区| 综合久久久久久久综合网| a v网站在线播放| 国产精品免费日韩| 日本岛国黄色网址| 日韩精品一区二区三区四虎影视| 91丝袜美女| 黑人天8A∨高清网站| 97超碰天天爱天天爱| 天天综合网AV91| 99热这里只有精品1| 无套内射性感少妇视频| 国产精品久久久久久久久久久久久久久久久久 | 欧美少妇大量自拍视频在线观看| 熟女天天干| 日日干夜夜骑| 色香天天| 天天摸夜夜添无码小视频| 操逼网站视频漫画国产| 国色天香av| 色拍偷亚洲| 天堂av最新电影网| 蜜乳中文字幕a在线| 在线人人人人人人精品超| 男人的天堂2010| 草久久久| 麻豆久久精品亚洲精品88| 国模私拍一区二区三区神乳| 手机看片1025| 天天干天天日天天射黄色片| 亚洲精品一二牛牛| 久久国产视频性吧 | 麻豆91熟妇人妻中文字幕茄子| 超碰97网站| 99热99在线播放激情| 亚洲av乱伦色图网站| 精品免费一区二区三区在线亚洲人成| 亚洲日韩XXX| 综合网亚洲| 无码聚合| 日韩不卡网操逼中文字幕日韩| 久久东京热久久| 欧美亚洲尤物久久| 色综合加勒比四四季| 夜夜黄| 久久国产熟女影院| 日韩午夜国产| 麻豆天美91| 嫩草影院在线观看精品| 久欲AV| 影音先锋新男人| AV九九| 亚洲宗合网| 欧美人体性爱互联网第一页婷婷日本| 亚洲图片欧美在线视频| 欧美天堂亚洲电影院一区在线播放| 少妇无码av专区线| 大香蕉 222| 欧美色图综合网| 性爱乱伦一区| 久草色在线观看| 囯产乱伦一区二区三女| 男人天堂新| 欧美黄片欧美黄片xxx| 久久有码| av天堂精品久久| 一区二区 电影 亚洲| 成年人黄色视频免费| 美女啊啊啊啊啊啊啊| 天啪| 91天天日| 国产JDAV无码视频在线观看| 日本裸体久久色噜噜| 欧美91精品国产自产| 婷婷五月天网| 久96热在线观看视频| 日韩一级二级在线| 亚洲天天做日日做天天谢日日| 久久久工口| 男女一进一出视频久久| AV天堂电影网| 人妻 中文 日韩| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 天天躁日日躁xxxxx| 久九九九九九九热| 熟女这里只有精品6| 91黑丝美女| 精品偷拍13p欧美dodk视频| 亚欧美综合网。| 亚洲精品中文字幕一区在线视频| www.久久超碰| 欧美专区在线| 26uuu国产日韩综合在线观看| 97久久国产精品| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 日韩欧美偷拍美女视频| 一区二区三区精品视频| 另类图片综合| 99re综合伊人| 欧美黑人猛交春色影视大全| 国产极品精品美女视频| a啊啊啊啊啊啊啊啊一区二区| 97福利视频| 少妇色| 日本东京热大香蕉a片| 色噜噜精品一区二区三| 2020中文在线一区二区三区| 91精品91久久久久77777| 偷拍 亚洲| 国产精品亚洲无码| 婷婷五月天激情四射| 1204av韩国| 久久九九网| 中文字幕av色| 欧美熟爽综合| 91 亚洲 欧美 日韩 国产 综合| 超碰色97| 欧美超碰人妻97| 九九久久九九久久| AV无码久久久精品| 亚洲国产精品成人综合| 久久久啊啊啊| 欧美熟女逼久久久久久| 98福利在线视频| 91n美女视频| 亚洲高潮少妇| 香蕉综合网| 视频黄色国产一级| 青娱乐亚洲自拍| 久久精品人妻一区| 97干色| 激情婷婷黑人91| 天美传媒AV国产在线| 97爱爱爱综合| 欧美拳交在线播放| 9久热| 人人操人人搞人人草| 91P0RNY大屁股人妻| 18精品一二区| 亚洲蜜臀精品视频久久| 91超碰在线播放| 97资源欧美| oumeisetupian| 婷婷色一区| 老鸭窝成人免费毛片视频 | 色乱二区| 久久精品三级影视| 熟女视频久久| 嗯嗯嗯好爽| 亚洲色色色| 六十路日本| 九九热AV| 青青草精玖玖69精品| AND人妻系列| 精品少妇后入一区二区三区四区人妻巨乳 | 亚洲吊色| 啊啊啊好舒服视频在线观看| 96国产污污污丝袜| 97丝袜亚洲在线播放| 男生女生啊啊啊啊| 天天内射| 中文字幕第95页| 搡老女人老91妇女熟女| 97伦综合| 草草草视频在线免费看| Sekablack无码一区| 美国日韩黄片| 亚洲国产尤物yw在线观看| 伊人精品久久网站| 五月天婷婷小说| 欧美制服另类丝袜| 91国产大片| 黄色十八禁| 很狠操| 夜夜嗨一区二区三区直播内容| www.人人摸在线视频| 91|九色|国产熟女| 超碰国产情侣自拍网| 四季AV综合网址| 91色色综合| 精品欧美日韩在线观看| 欧美中文综合| 草草影院日本第一页| 囯产乱伦一区二区三女 | 美女高潮国产高清| 91久久九九精品国产综合| 免费公开人人操| 91站街按摩店老熟女熟女| 天天色悠悠激情| 91在线丝袜视频| 熟妇一区,二区,三区。| 久久精品国产亚洲AV清纯| 久操com| 亚洲aV性爱| 九九天堂| 久久精品无码不卡| 久久久久亚洲熟妇熟女| 91性高潮久久久久久久久| 久草久热| 色欧美在线| 综合久久久久久久久91| 五月婷婷五月天| 欧美在线啊啊啊| 五月天精品| 日韩黄色av中文字幕| 一区二区三区欧美激情| 亚洲色性情三级| 三四中文字幕| 乱伦日本色图AⅤ| 九九九九九九九九九九九免费国产| 91欧美性| 亚洲国产欧美一区二区潘金莲| 欧美色五月| 精品无码一区二区人妻久久蜜桃| 欧美色www亚洲国产阿娇要播| 成人国产精品三级A片| 久久亚洲熟妇在线视频| 影音先锋日本乱伦| 欧美欲色| 日韩一级久久毛片| 久久久久9久久久久| 中文字幕三四五区| 看黑人AV不卡| 夜色综合| 欧美激情综合色综合啪啪五月| 91男同| 无码一区二区精品视频久久久春药 | 亚洲欧美校园另类春色| 麻豆精品.欧美精品.日韩精品.| 日韩久久.一级黄色片| 99热精品青草在线 | 亚洲天堂电影精品一区| 人妻天堂三区| 在线观看一卡二卡| 亚洲色图91| 蜜桃视频精品一区二区| 日韩有码中文字幕女同性恋| 9久综合网| 中文字幕青青草| 大地资源在线观看中文第二页| 青青伊人久久| 国产伦乱91| 亚洲日韩资源| 色综合中文字幕不卡| 加勒比综合| 九九热九九热| 欧美熟妇成人一区二区| 91熟女综合| 三级AV入口| 97资源免费视频| 无码逼| 国产女主播视频在线观看| 欧美一区二区观看在线| 亚洲成人ab| 久久这里都是精品| 色操逼网| 国产精品69久久久久久久| 日韩中文字幕二区| 日本精品五区| 伊人96在线| 伊人色综合网| 亚洲啪AⅤ永久无码| 天天操人人操骚逼网站| 日韩三级视频一区二区三区| 视频一区二区免费在线| 欧美线天码中字| 日韩性色b| 欧美人人曰人人操人人射射| 嗯~啊~快点 死我视频免费看网站| 两性综合网| 伊人超碰97| 久久人人爽爽爽人久久久| 欧美一级特黄淫片在线观看| 偷窥自拍亚洲| 欧美亚洲一区二区久久久婷精品大包诱| 人妻啪| 日韩欧美中文字幕搭讪巨乳美人妻视频| 久久久蜜桃一区二区三区| 日韩精品在线放| 伊人少妇久久久| 99r九九| 99精品成人免费看| 台湾一区国产高清在线| 91成人亚洲色图| 青娱乐av在线| 97精品综合久久| 国产成人拍国产亚洲精品| 97久久精品不卡| 国产视频一区二区三区久久亚洲天堂| 国产精品久久久鸭无码的功能| 欧美18老人禁| 中文一区二区三区影院| 精品夜夜澡人妻无码AV| 精品人妻一区二区三区夜夜| 偷拍 精品 另类 四区| 3p国产欧美99热| 男女做爰猛烈动高潮A片免费应用| 九九这里只有精品| 四虎影视永久在线观看精品免费网站| 日本啊啊啊啊啊视频| 开心五月婷婷| 久久精品性| 做爱A级亚欧| 97超碰超碰| 青草精品视频一日本久久久久网站| 国产农村妇女精品一二区| 丁香六月啪| 国语av最新自产拍在线观看| 欧美精品日韩久久久九| av在线观看不卡网站| 日本成人免费一区二区三区| 天美传媒精品一区二区| 国产搭汕a级片| 亚洲怡春院| 激情小说亚洲视频| 天天内射| 久草久日| 欧美图片校园春色| 狠狠色五月亚洲91| 青草精品视频一日本久久久久网站| 中文字幕乱偷人妻久久艾草网| 欧美精品双插| 丰满少妇高潮无码| 欧美在线视频播放| 亚州男人的天堂| 97视频在| 热久久无毒不卡| 精品美女人人干| 台湾佬中文娱乐网久久久久久久久久com | 天美一区在线| 岛国不卡超碰护士AV在线播放| 91网站18在线| 熟妇国产免费一区| 日本道日本道中文字幕日本道最新日本道在线观看| 九七毛片九九毛片| 久久久久99精品成人片蜜臀| 超碰九7免费| 超碰在线一区| 精品无码久久久久久国产浪潮| 国产黄色在线播放观看| 99精品视频在线观看免费| 亚洲 日韩 丝袜 熟女 变态| 久久久久久久国产a∨| 色官网在线| 色噜噜狠狠色综合日日| 99re6久热只有精品6在线直播 | 羞涩视频| 色黄污美女啪啪啪免费网站| 在线强奷到舒服的无码视频| julia高潮后不停追击中出| 97天天搞在线| 本道在线| 久久久亚洲| 国产又黄又粗的视频| 成人无码影片视频在线| 亚洲天堂男人在线| 青青欧洲黑| 91操熟女视频| 一级毛片电影免费看| 久久精品国产99精品亚洲蜜...| 1禁看欧美黄片免费看| 六月丁香五月婷婷| 超碰天天操你比| 久久99干一本高清| 欧美日韩*字幕一区| 啪一啪免费视频| 久久久久免费少妇| 亚洲天堂资源| 丁香婷婷五月| 澳门特级毛片免费观看| 97欧美精品综合| 视频在线观看青青99国产| 97久久网| **一级毛片国产| 91精品成人| 亚洲人妻爽爽爽| 国产二区视频在线观看电影| 激情五月综合网| 啊啊啊啊啊啊啊好爽不要| 91四海无码日韩欧美| 欧美爆乳精品一区二区| 色婷婷影视| 东京热不卡视频| 欧美日本成人一区二区| 伊人久久婷婷| 99热大香蕉伊在线| 妇女性内射冈站HDWWWCOM| 婷婷五月av| 亚洲综合图色在线| 久久在线观看免费视频| 色婷婷av在线观看| 亚洲久草AV色图| 亚洲无线码一区国产欧美国| 香蕉大久久久| 大香蕉乱级| 中文字幕一区日韩精| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 亚洲成人无码影院| 志村玲子视频一区二区| 久久激情亚洲精品无码?V| 黄片色区软件| 丰满人妻一区二区三区四区| 色欧洲| 亚洲中文日韩精品| 欧亚揄拍偷拍精品视频| 欧美五十路熟| 欧美老熟另类| 欧美亚洲中文| 95人妻爽爽人人做人人澡| 欧美91久久久久| 免费精品人妻一区二区三| 久久久久久久一级黄色打同平台| 欧美第二页午夜| 强奸乱伦大香蕉网| 亚洲综合伊人| 色综合久| 亚洲高清91| julia高潮后不停追击中出| 9久9久9久9久视频网站| 婷婷丁香五月激情啪啪| 91九色丰满高潮| 精品久久久亚洲AV成人网站| 亚洲深夜福利| 亚洲综合在线视频| 久久精品熟妇丰满人妻99| 婷色五月天| 欧美资源| 九九av| 涩五月婷婷| 亚洲阿v天堂在线| 玖玖97综合 | 久久久久国产无av| 十八禁一区二区无码观看| 超碰79人人乐| 99久久综合| 欧美亚洲国产91在线| 精品九九国产无码| 色婷婷综合久久中文字幕雪峰| 日日夜夜模| 美女被啪到深处抽搐视频| 日本一区二区做爱的视频| 91男人综合| 内射黑丝袜| 久久大黄片| www.四虎在线| 日韩在线观看三级电影| 超碰久在线天天做| 婷婷人妻激情| 久9久9精品| 小少妇| 秋霞操逼片| 国产熟女精品区| 一本大道不卡一二三区| 欧美色图片色哟哟| 午夜天堂精品久久| 日韩乱伦视频| 国产亚洲深夜激情| 欧美在线综合| 大香蕉操久久| 亚洲一区二区三区播放在线| 久久人人爽av亚洲精品天堂桃色 | 性爱av在线免费观看| 69av一区二区三区| 亚洲www91| 日日夜夜噜| 五月激情天| 综合久久六月久久婷婷| 精品区国产区一区二区三区| 簧片免费看视频| 日本三级中国三级99人妇网站| 久久久精品网站| 人人妻人人澡人人爽人人精品浪潮| 日本一级不卡一二区| 亚洲欧美综合网站| 91国精产品| 亚洲情色 无码专区| 亚洲色图 91| 国产白丝AV| 国产精品免费久久久久久久久久| 日韩97P| 99精品国产户外露出| 精品国产一区探花在线观看| 香伊人在线| 天天色综亚洲91污| 99热这里| 一区二区三区蜜桃成人撸久久东京热| 秋霞午夜视频一区二区| 久久人人爽av亚洲精品天堂桃色 | 91狠狠色丁香婷婷综合久久精品| 色五月婷婷色| 鸥美插入视频| 久久人妻熟女一区二区| 波多野42部激情无码喷潮| 色黄色美女大长腿午夜视频| 亚洲四虎熟女精品| 熟女在线视频| 狠狠躁伊人中文字幕| 91人精品妻入口| 99在线免费视频| 最新无码国产| 熟妇艹鸡八| 五月婷婷无码| 天天综合精品| 99久久无色码| 黄色AAAAA欧美| 91高跟美女在线播放| 91伊人久| 超碰九九| Av色五月| 韩国三级色呦呦| 国产天美传媒精品| 偷拍2020| 噜噜噜噜天天狠狠| 久久二| 97天天综合| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 蜜臀人妻少妇久久在线观看| 欧美暴力猛交| 国产97综合| 快灬快灬 一下爽蜜桃在线观看 | 日日夜夜干| 国产精品乱人伊人网| 秋霞男人网| 亚洲性综合| 欧美亚州综合网图片| 日韩15p| 狠狠久久手机视频精品| ..日韩av毛片精品久久久| 国产精品成人蜜臀AV在线| 五月天婷婷基地| 在线女人91| 99久在线精品99re8a| 亚洲熟女一区二区| 日本αv| 操我无码| 久草综合京东| 麻豆区久久久久亚| 神马久久久久久| 强奸乱伦Av网| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 日本日日色视频| 色97综合中文字幕| 秋霞Av理论一级在线| 久久亚洲AV成人精品无码| 久久精品国产精品亚洲艾通辽熟妇| 日韩一级二级在线| 日本黄色精品| 亚洲国产婷婷在线播放| 国产av高清版| 亚春色色| 人人潮人人摸| 日本免费不卡二区| 国产蜜臀精品一区二区尤物| 国产亚洲欧美每日在线| 五月婷婷影院| 大香蕉92| 午夜激情成人在线观看| 久久黄黄| 岛国天天午夜影院传媒网| 国产日韩欧美操逼视频| 欧美一区91大爱| 亚洲久草AV色图| 秋霞一级A片黄色视频| 亚洲欧美大| 人妻喷水| 户外裸露刺激视频第一区| 快点操死我| 麻豆成人影音在线| 亚洲综合激情五月久久| 97天天插| 日本高清_区二区三区 | 国产二区三区免费视频| 爽爽淫人网| 骚熟女AV网| 欧美黑人精品一区二区| 亚洲污污网站| A 在线网址| 女人一区| 中文字幕日韩精品久久| 一区=区三区视频| 国产精品操| 日韩AV一区二区三区四四| 日韩91网| 亚洲综合中文字幕有码| 九一性生活免费视频| 亚洲天堂一区二区久久| a人欧美综合天堂麻豆| 天天上日日上日韩精品| 观看视频图片一区二区三区| 中国一级αV| 精品人妻一区二区三区-国产精品| 超碰在线一区二区三区| 乱人伦 国语对白:视频直接看| 亚洲丨在线| 丁香六月综合激情| 欧美激情区| 91狠| A级片一区| 欧美色997| 伊人黄色片| 国产精品天干天干综合网麻豆 | 超碰97首页| 色婷婷九月天天综合| 亚洲人妻久久久| 五月婷丁香| 欧美性爱第1 页| 久久111| 国产区91柔拿会所技师| 91久久国产精品| 中文字幕在线播放2中文字幕在线观看2| 噜噜噜噜久久久精品免费| 一色网男人的天堂| jizz啪啪| 2019亚洲男人天堂| 长长久久免费视频| 亚洲日韩在线a不卡99精品| 亚洲自拍一区夜夜操| 影音先锋乱| 天天看片青娱乐| 天色综合网| 亚洲二区精品在线观看 | 极品丝袜无码| 国产亚洲美日韩Aⅴ中文字幕无码成人| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 中文字幕日本久久| 欧美少妇色图| 久久九精品| a网站免费观看| 牛牛操视频逼| 亚洲高潮影院| 99热aaa| 亚洲色啪| 天天操人人操狠狠插| 亚洲色天堂九9| av在线浏览| 92午夜免费福利视频| 97操| 久久华人网| 久久国产视频专区一二三 | 亚洲精品蜜桃久久久| 久久伊人在线五区| 亚洲各类熟们中文字幕| 国产v片在线免费观看| 日韩在线观看AV| 欧洲精品在线播放| 天天干美少妇一区| 天天日B夜夜干B时时操B| 少妇被c 黄 免费观看| 春色综合免费| 欧美午夜视频| 久久久久国产亚洲一区欧美色图日韩 | 韩国一级婬片A片AAAAA| 国产亚洲日韩欧| 伊香蕉综合久久久久久久噜噜噜 | 日本不卡高清视频| 日韩国产精品人妻无码久久久| 本道在线| 精品无码久久久久| 狠肏骚人妻| 欧美 亚洲 综合 制服| 日本护士高潮| 99精品欧美一区二区三区桃色| 欧美色女人| 狠狠入| yazhououmeizongya| 九一性生活免费视频| 中出789在线视频| 欧美熟爽综合| 国产一区二区三区中文字幕| 久久激情视频| 丁香九月激情| 日本国产成人亚洲精品无码| 青娱乐国产盛宴视频| 超清福利精品视频在线| 亚洲精品国产精品成人| 91狠狠综| 免费精品无码一级毛片牛牛影视| 九九九九九九九九九国产精品| 91亚洲狠狠色| 99精品在线| 日本不卡免费二区| 99操逼| 久久久久久十| 男人精品区| 精品78| 97爱综合| 国产一区二区三区高清视频| 亚洲一区中文精品| 久久午夜鲁丝片| 91久久免费视频互動交流| 久久国产逼| 国产精品ⅴ无码大片在线看.| 国产精品一区二区久久精品| 青草草免费网站av| AV不卡在线| 在线精品福利免费播放| 青青草天天亲夜夜操网| 97干在线| 丰满翘臀美女影院视频| 神马午夜久久久| 操逼999| 91精品操美女| 欧美 亚洲 第一页 | 国模不卡一本二本三电影| 日日夜夜青青草母狗| 天天激色| 欧美性性性| 国内偷拍精品一区二区| 一区二区三区亚洲| 欧美 亚洲 偷拍自拍| 思思热在线视频精品| 国产精品九9| 精品一二三区女同| 欧美亚洲特P| 一级性爱视频免费观看| 伊人网综合在线视频| 99综合免费视频| 欧美亚洲丝袜美女电影| 91精品少妇搡搡搡| 国产一区二区在线播放| 成人无码电影在线观看网| 一级免费啪啪片| 国产女上位好爽在线| 97碰碰日本乱偷人妻中文的| 国产丁香精品露脸视频| 乱伦一二三区| 九九色图| 一牛一区二区三区久久| 9久久久久久| 免费观看国产小粉嫩喷水精品午| 国产又爽又黄| 97精品视频免费| 麻豆尤物视频网| 国产操逼视频在线观看| 九九热精品| 97视频900| 欧美一二三| 美中日韩无码| 第45页一区二区| 伊色久人大在线| 成人亚欧免费视频| 观看免费区二区三区二| 国产91丝袜 在线播放| 伊人五月天婷婷| 偷拍 精品另类 凸凹了四区| wuyechaopeng| 成人性爱AV在线免费观看| 能看的AV| 美女网站黄页| 日韩欧美大力操| 欧美大香蕉卡久久| 国产搭汕a级片| 国产精品久久久无码AV网站| 精品国产99| 高潮精品| 极品色社| 超碰97日韩| 欧美日韩香蕉| 亚洲涩涩| 国产精品ⅴ无码大片在线看.| 欧美天天插| 蜜臀99久久国产| 91free福利| 五月天亚洲网| 乱伦a片视频| 99re69| 亚洲 中文字幕 精品| 精品国产乱码久久久久久久久1| 骚妻少妇精品性色无码四色A V| 久久精品日韩| 97 九色| 九九综合久久中文字幕| 日韩午夜国产| 国产乱伦亚洲| 日夜干射色啊| 国产人妖的免费的视频| 欧美日韩大陆黑人少妇99| 人人么人人操| 国产有码一区| 亚洲人体视频在线观看| 中文字幕亚洲欧美在线不卡| 秋霞怕怕片| 人妻插插人妻人| 欧美大香蕉久| 中文幕97| 久久99午夜精品一区人妻| 91 国产丝袜在线播放-百度| 91丨熟女丨丰满熟女| 天天情欲宗合网| 最新国产精品久久精品| 抽插亚洲无码| 亚洲欧美校园另类春色| 麻豆久久精品亚洲精品88| 久久精品亚洲东京热色播| 亚洲成aⅴ人片不卡无码| 美女诱惑在线一区| hd成人一区二区在线| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 99久久无色码| 草莓精品视频在线免费观看| 久久精品视| 91粉嫩萝控精品福利网站_精品影音先锋国 | 性爱久久| 青娱乐福利99| 91精品免费| 大香蕉av在线| 亚洲日韩在线a不卡99精品| 美日韩在线不卡人妻| 丰满人妻一区二区三区大胸懂色 | 天天影视综合网欧美精品| 先锋影音av先锋一区| 久久久久9999精品九九九| 伊人色综合网电影| 热99这里有精品综合久久| 欧美熟妇操操视频| 强奸乱亚洲| 97香蕉网| 天天天操天天天爱| 日韩乱码Av| 国产精品国产自产高清AV| 骚鸭AV| 国产夫妻一区二区| 天天做日日做天天欢。| 久一区久久蜜桃| 九九国产热| 亚洲日韩AV视色| 999亚洲国产视频| 97亚洲在线| 国产情色在线| 久久久亚洲精品电影免费看| 国产麻豆福利av在线播放| 久久岛国| 日日日日做夜夜夜夜做无码97| 粉嫩国产精品久久粉嫩| 日本欧美一区二区三区免费| 日韩小电影| 国偷自 一区二区| 有码免费观看| 亚洲激情AV| 日欧亚洲二三区大片不卡| 91青青草| AV有码在线| 精品成人女人久久| 人妻一区二区三区| 六月婷婷激情| 欧美日本一区二区a人| 国产亚洲色停停久久99精品91| 五月天亚洲网| 日本精品性生活久久久| 久久熟女人| 99热伊人| 中文字幕精品资源在线| 人人操人人插人人摸人人干| 九九综合九九综合| 国产欧美另类久久久精品课程| 91爱看| 亚洲男人的天堂AV| 国产极品999| 麻豆久久久一区二区| 欧美啪啪女女| 一本一道vs波多野结衣| 国产特级毛片AAAAAA高潮流水| 色欲av国内精品久久久久久| 999国产精品999久久久久久| 智利AV在线网| 亚洲资源网| 欧美激情久| 伊人青青草久久| 色第一页| 麻豆国产av网| 亚洲国产剧情少妇激情| 欧美亚州综合网图片| 国产精品久久久 | 九九综合色| 国产一线二线三线av| 九九九九九九九精品视频| 激情欧美97| 91人妻超碰| 操高情无码| 日韩超碰97| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 欧美一级黄片免费播放| 啊啊啊啊好疼| 天天综合网91入口| 欧美亚洲日本激情在线| av中亚| 91久久久亚洲| 麻豆人妻偷人精品无码视频| 久久99热这里只频精品6学生| 男女性无套 免费九一| 91蜜臀人妻中文字幕在线| 国产夫妻一区二区| 色狠狠综合| 日韩探花精品在线视频| 日韩av性爱在线播放| 欧美日韩亚洲少妇寂寞影院正在播放 | 最好看的中文字幕在线2018| 2024年最新色情网站在线观看 | 五月天婷婷在线看| 屁股久久久久久| 97se亚洲综合自| 丝袜足交视频| 久久精品熟妇丰满人妻99| 欧美精品一二三| 另类欧美综合| 超碰免费人妻在线| 亚洲国产另类在线中文| 成年无码动漫av片无尽在线| 91亚洲综合| 亚洲欧美日韩制服另类| CCYY草草影院地址入口| 亚洲 日本 国产 综合| 思思视频免费看网站| 在线一道啪| 嫖老熟女A片一二三区| 狠狠色综合网| 美女在线H91| 久久婷婷欧美| 啊啊啊啊好爽好舒服一区二区易域| 亚洲欧美日韩不卡人妻| 中国一级αV| 久久欧美性爱视频| www.色婷婷| 天堂国产AV| 男人的天堂com| 精品无码一区二区三区色欲| 国产成年精品高清在线观看91| 偷看洗澡一二三区美女| 久操九九九九| 日夜尻逼网| 国产精品日本无码A片| 国产精品自拍欧美在线| 污到发麻的视频 国产| 九九综合网| 超碰97欧美| 五月天社区| 欧美极品色| 日韩性爱1级片视频| 99热亚洲| 超碰欧美97资源| 国产精品久久久久中文字幕| 天堂av2019| 欧美日韩久久精品爱爱| 国产久久av| 色www精品视频在线观看| 久久免费9| 亚洲国产精品久久久久久久久久| 99re99视频在线免费观看| 国产性爱强奸乱伦大全| 亚洲色五月| 91无码精品| 久肏视频字幕| 天天综合色电影| 秋霞福利网| 欧美亚洲图片| 先锋精品av色鲁| 清纯唯美激情| 女优视频第10页| 国产美女高潮| 色欲人妻一区二区在线| 亚洲日韩视频二区| 91五月天| 亚洲成人美女无吗| 欧美性爱一区二区三区| 国内外色色色色色成人视频| 青娱乐啪啪视频| 韩日男人的天堂| www.91逼逼.com| 人妻人久久精品中文字幕| 我爱大香蕉| 在线视频免费观看午夜| 日韩欧亚中文在线| 大地资源在线观看中文第二页| 玖玖爱视频网站| 宅男91视频在线播放| 狼狼色丁香久久婷婷综合五月| 精品中文日韩字幕视频| 五月激情影院| 性爱视频啪啪啪啪| 中文字幕免费在线观看| 欧美日韩黄色片一区二区三区四区人与兽做爱| 国内毛片欧美香蕉精品| 亚洲综合大片| 偷拍超碰| 校园春色制服丝袜中文字亚洲| 欧美日韩国产另类综合| 在线播放欧洲免费av| 美女主播色欲91抠b在线播放| 国产福利影视| 粉嫩av久久一区二区三区| 加勒比aⅴ| 伊人嫩草| 亚洲资源网| 久久超碰大香蕉| 青青欧美在线| 久久久久久久一级黄色打同平台| 亚洲一级特黄大片在线播放91| 国产女大学生AV| 久 久无码人妻AV| 欧美图片校园春色| 九九久精品| 人妻天天爽夜夜爽2| 91超碰碰在线| 久草男人天堂| 韩日精品福利视频一区不卡在线免| 懂色AV一区二区三区| 午夜婷婷| 久久久久久夜夜夜夜夜| 天天综合色电影| 超碰三级秋霞| 国产suv精品一区二区四| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 国产视频三区四区| 色综合91| 97在线欧洲| 伊人色综合欧美| 亚洲精品黑丝| 精品无av| 一起草三级AV电影在线观看 | 久久人妻视频网| 日韩一999精品| 亚洲91网站| 97超碰大| 1769国内精品视频| 久久性爱网站| 欧美精品另类人妖xxxx| 青青草啪啪网| 99999亚洲另类| 国产精品成久久久久午夜午夜| 天堂а√在线最新版在线| 国产真实野战在线视频| 亚洲五月丁香花狠狠干一区二区三区 | 日韩天堂av电影在线观看| 国产在线精品电影观看| 三及片网站| 男人a天堂手机在线版| 亚洲丝袜色| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 97欧美色| 囯戸精品高潮呻吟旡码| 99热自拍| 啊啊啊久久久视频| 欧洲亚洲国产综合在线| 五月色综合| 久久风骚城市人| 多毛小伙内射老太婆| 青青爽| 九九碰九九爱97超| 五月天婷婷久久| 久欲AV| 永久免费发布性爱网| 天天日日本| 亚洲人成网站7777| 日本人妻最新在线中| 五月天综合在线| 锕锕好爽 死我在线观看| 秋霞一级鲁丝片A片| 人人澡人人爽人人精品| 亚洲精品久久久久久久蜜桃臀| 噜噜噜无码AV一级一级久久影院| www.AV有限公司一区| 激情小说图片亚洲首页| 蜜桃中文字日产乱幕4区| av网站免费线看| 60秒试看最爽10分钟网站| 欧美自拍偷拍综合图片| 九九自拍伦理| 国产真实野战在线视频| 啊啊在线| AV中文在线可看| 日本在线观看网址| 老鸭窝黄色视频网站| 日韩人妻中文视频| 97国产|免费| 无码99| 强奸乱伦Av网| 久久久久女教师免费一区 | 91粉嫩萝控精品福利网站_精品影音先锋国 | 天天干嫩逼网| 久久成年精品| 欧美精品久久久久久久久88| 久久久精选| 91麻豆天美传媒HD| www.久久99| 久久精品久久久久久久久| 91 亚欧| 啊啊啊97视频| 超碰在线91| 成年人一级黄色毛片大全在线观看| 东京热,男人的天堂| 天天操美美| 99国产精品人妻人伦| 丰满人妻av一区二区三区| 国产辣妈在线视频福利| 天天操天天干美女网址导航| 怡红院成人av| 96AV精品| 日韩操人| 竹菊影视国产一区二区| 丰满美女一级毛片在线播放| 亚洲 欧美 色图| www.人人摸在线视频| 制服诱惑亚洲一区二区三区在线观看| 日韩人妻少妇 一区二区三区| 精品伊人久久久大香线蕉小说|