欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

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

圖編輯系統(tǒng)設(shè)計指南:從數(shù)據(jù)模型到布局與性能的工程實踐

圖編輯系統(tǒng)設(shè)計指南:從數(shù)據(jù)模型到布局與性能的工程實踐 1. 為什么我會開始認(rèn)真思考 diagram-design 這件事先坦白一個背景我做的很多項目都需要畫圖——架構(gòu)圖、流程圖、時序圖、拓?fù)鋱D、ER 圖不一而足。早年沒太把這件事當(dāng)回事腦子里有個大概就開始堆代碼今天用某個在線工具拖一拖明天用另外一款軟件補一補后天發(fā)現(xiàn)某個模塊邏輯盤不清干脆 PPT 畫個示意就丟給下游。結(jié)果就是圖與圖之間風(fēng)格混亂、坐標(biāo)系不統(tǒng)一、數(shù)據(jù)模型對不上一個圖換一個人維護就徹底沒法看了。后來做了一個以“圖”為核心的跨平臺系統(tǒng)才真正把 diagram design 當(dāng)作一個嚴(yán)肅工程問題來看待。diagram-design 這個標(biāo)題表面看是“圖表設(shè)計”但做過的朋友應(yīng)該都能感受得到真正難的從來不是“畫圖”這個動作而是怎么把業(yè)務(wù)結(jié)構(gòu)拆解成節(jié)點、邊、分組、布局和交互這套模型再在這套模型之上做出可擴展、可維護、性能還過得去的渲染方案。畫一個靜態(tài)圖誰都會畫一套可以編輯、自動布局、實時聯(lián)動、支持大數(shù)據(jù)量的圖形系統(tǒng)那就是另一回事了。這篇內(nèi)容適合誰如果你正在做可視化編輯器、流程圖引擎、拓?fù)鋱D平臺、數(shù)據(jù)血緣圖或者只是被“項目里上百個圖形節(jié)點怎么管理”這件事折磨這篇文章應(yīng)該能提供一個從我有思路到落到工程實現(xiàn)的完整剖面。我會聊技術(shù)選型、數(shù)據(jù)建模、布局算法、交互與渲染的取舍也會把我在實際項目里踩過的一些坑直接攤開來講。不會有太多玄學(xué)盡量每一個結(jié)論都能對應(yīng)到實際代碼和真實場景。2. 先用一張“圖”拆解 diagram-design 的問題域很多人拿到“做一個圖表設(shè)計系統(tǒng)”的需求第一反應(yīng)是去找渲染庫這是順序錯了。渲染是整個鏈路里最末端的東西前面還有數(shù)據(jù)模型、布局邏輯和交互協(xié)議。如果這三層不先想明白哪怕選了再強的渲染引擎后面也會被各種臨時需求扯得七零八落。2.1 圖的本質(zhì)節(jié)點、邊、端口、分組與畫布把任意一張圖拆到底核心元素就這兩類節(jié)點和邊。但真實業(yè)務(wù)里光有這兩類遠遠不夠。以流程圖為例節(jié)點可能是“開始”“結(jié)束”“處理步驟”“判斷分支”邊是帶方向的箭頭但判斷分支的邊上得帶標(biāo)簽比如“是”和“否”。以網(wǎng)絡(luò)拓?fù)鋱D為例節(jié)點是服務(wù)器和交換機邊是鏈路但鏈路上可能有多條虛擬連接連線的語義遠比箭頭復(fù)雜。以 ER 圖為例節(jié)點是實體表邊是關(guān)系但關(guān)系有一對多、多對多之分邊上還需要標(biāo)注主外鍵字段。所以在設(shè)計數(shù)據(jù)模型的時候我建議一開始就把這幾類基礎(chǔ)設(shè)施建好節(jié)點Node坐標(biāo)、尺寸、類型、樣式、業(yè)務(wù)數(shù)據(jù)掛載點。端口Port節(jié)點上用于連線的錨點決定連線從哪個位置引出。邊Edge源端口與目標(biāo)端口、路徑點、箭頭樣式、線型、標(biāo)簽。分組Group用于表達容器關(guān)系比如泳道、子圖、分組框。畫布Canvas全局變換信息、縮放比例、可視區(qū)域、網(wǎng)格設(shè)置。如果項目里一開始就接受“邊只連接節(jié)點、不連接端口”這種簡化模型后面做節(jié)點拖動、邊跟隨、錨點吸附時會付出大量返工成本。我的經(jīng)驗是寧可第一版把端口模型做上去哪怕界面層暫時隱藏端口也比后續(xù)硬塞進一個不支持的模型要省力得多。2.2 從“畫一張圖”到“圖系統(tǒng)”跨度在哪里“畫一張圖”是單次行為畫完就結(jié)束信息不流動。而圖系統(tǒng)要考慮的是持續(xù)的編輯、序列化、數(shù)據(jù)驅(qū)動更新、多人協(xié)作甚至版本管理。這里有一個容易被低估的復(fù)雜度來源圖的序列化格式。如果只是想畫個靜態(tài)效果把節(jié)點坐標(biāo)和邊路徑直接寫進 JSON 就夠了。可一旦引入自動布局坐標(biāo)就成了派生數(shù)據(jù)而不是源數(shù)據(jù)——你存的是圖的拓?fù)浣Y(jié)構(gòu)坐標(biāo)是布局引擎算出來的。這時候若還把坐標(biāo)當(dāng)成第一公民寫死自動布局和手動調(diào)整之間就會天天打架。我后來采用的方案是源數(shù)據(jù)只保存節(jié)點、邊、端口的連接關(guān)系和業(yè)務(wù)字段坐標(biāo)則作為一個可選的“用戶覆蓋層”保存。布局引擎產(chǎn)出的坐標(biāo)寫入覆蓋層手動微調(diào)也寫入覆蓋層而拓?fù)浔旧硎冀K是干凈的結(jié)構(gòu)化數(shù)據(jù)。這套設(shè)計的直接收益是后續(xù)加新布局算法、做子圖復(fù)用、做圖形模板都不需要動根基。3. 技術(shù)選型的底層邏輯老牌庫就一定省心嗎圖表領(lǐng)域可選的技術(shù)棧其實不多但每個方案都各有各的脾氣。我把主流路線梳理了一遍重點不是“誰最強”而是“誰更適合作為自研圖系統(tǒng)的基礎(chǔ)”。3.1 三條主流路線的對比市面上做 diagram 相關(guān)工具底層渲染路線大抵分三類一是基于 SVG 的方案。代表庫包括老牌的 Raphael 和后來的一些封裝庫。SVG 的優(yōu)點在于 DOM 集成度高事件處理天然樣式可以用 CSS 控制做小型和中型圖非常順手。缺點是節(jié)點數(shù)量一旦上千DOM 節(jié)點數(shù)量會成為明顯的性能瓶頸拖拽縮放時也會感覺跟手度不夠。二是基于 Canvas 的方案。一次繪制、整體渲染性能上限比 SVG 高很多適合節(jié)點數(shù)多、交互相對簡單的場景比如純展示類拓?fù)?。缺點是事件命中檢測要自己做文字換行、樣式定制都得模擬一套 UI 體系開發(fā)成本明顯上去了。三是基于 WebGL 的方案。這是真正的重型武器性能天花板最高能做海量節(jié)點和復(fù)雜動效但開發(fā)門檻也最高普通圖系統(tǒng)上屬于殺雞用牛刀。如果項目里沒有“幾萬個節(jié)點還要流暢漫游”這類極端需求建議不要一上來就碰。3.2 我最終確定的自研組合開頭提到的那個跨平臺系統(tǒng)節(jié)點規(guī)模常規(guī)在幾百到幾千這個區(qū)間同時要求支持用戶交互編輯、拖拽、縮放、框選還要能導(dǎo)入導(dǎo)出多種格式。我最后選的技術(shù)組合是基于 SVG 自研核心渲染引擎配合虛擬化渲染思路來做性能兜底。一句話總結(jié)就是先選對工具車再考慮給車上裝什么樣的引擎。為什么不是 Canvas因為在編輯型圖系統(tǒng)里“精細到每個節(jié)點、每條邊的交互”是核心訴求。SVG 天然就有獨立 DOM 節(jié)點來做事件綁定框選、拖拽、命中檢測這些都順手很多。Canvas 要自己實現(xiàn)的交互層工作量幾乎是 SVG 方案的兩三倍。為什么不是直接套某個大而全的現(xiàn)成庫因為這個項目需要深度定制自定義節(jié)點形狀、自定義端口規(guī)則、自定義自動布局算法、特定的數(shù)據(jù)格式對接。成熟商業(yè)庫的封裝層再厚到了這一步也會成為障礙。與其花大力氣繞開別人的封裝不如在底層之上只保留少量惰性封裝。補充一個表方便你看對比方案交互開發(fā)成本性能上限定制自由度適合場景純 SVG 自研低中配合優(yōu)化手段可提升高中量級編輯型圖系統(tǒng)Canvas 自研高高高展示型、超大量節(jié)點現(xiàn)成 Vue/React 圖庫低中低快速交付、標(biāo)準(zhǔn)圖型WebGL 自研很高極高很高極端大規(guī)模場景這套選型落地的過程中我也有一些心得不要追求“一步到位的全能力框架”先做一個只支持有限節(jié)點類型、有限交互的版本跑通鏈路再逐步開放能力。圖表系統(tǒng)的復(fù)雜度是螺旋上升的最怕一開始就引入大量抽象概念結(jié)果自己先被抽象困住了。4. 數(shù)據(jù)模型先行如何把業(yè)務(wù)“翻譯”成圖結(jié)構(gòu)選定技術(shù)棧之后我做的第一件事不是畫界面而是定數(shù)據(jù)模型。這個階段多花一周后面少花一個月。4.1 核心實體的最小字段集我把最初的 TypeScript 類型定義精簡成下面這個層次這是整個系統(tǒng)最關(guān)鍵的代碼片段沒有之一interface DiagramNode { id: string; type: string; // 節(jié)點類型如 process, start, end x: number; y: number; width: number; height: number; ports: Port[]; // 端口列表 data: Recordstring, any; // 業(yè)務(wù)數(shù)據(jù)掛載點 groupId?: string; // 所屬分組 } interface Port { id: string; nodeId: string; side: top | right | bottom | left; // 所在方位 index?: number; // 同一側(cè)多個端口時的順序 } interface Edge { id: string; source: PortRef; // { nodeId, portId } target: PortRef; points?: Point[]; // 經(jīng)過的關(guān)鍵路徑點 label?: string; style?: EdgeStyle; }這里有兩個容易被忽視的設(shè)計點第一個是Port獨立成實體。連線不是“從這個節(jié)點中心到那個節(jié)點中心”而是“從某節(jié)點的一個端口到另一節(jié)點的一個端口”。在這個模型下節(jié)點拖走時邊的端點能自動跟隨到正確位置多端口節(jié)點也能區(qū)分“這根線究竟連哪個插孔”。第二個是節(jié)點的data字段它專門用來掛載業(yè)務(wù)數(shù)據(jù)。圖系統(tǒng)本身不關(guān)心業(yè)務(wù)字段是啥但交互層、校驗層、后端同步層都需要一個統(tǒng)一入口來讀寫。把業(yè)務(wù)數(shù)據(jù)和圖形數(shù)據(jù)混在一個平級字段里短期省事長期必亂。4.2 序列化格式的版本兼容設(shè)計圖數(shù)據(jù)一定會經(jīng)歷版本迭代。今天你的圖里有節(jié)點、邊、端口明天可能就要加“子圖”或者“泳道”后天可能又要加“聚合節(jié)點”。如果在序列化結(jié)構(gòu)里不做版本字段和兼容策略老數(shù)據(jù)怎么遷移將成為一個大麻煩。我用的做法是給所有持久化數(shù)據(jù)加一個schemaVersion字段同時維護一個遷移函數(shù)鏈。每次數(shù)據(jù)結(jié)構(gòu)變化就新增一個遷移函數(shù)而不是直接改舊數(shù)據(jù)的讀取邏輯。加載時如果發(fā)現(xiàn)版本號低于當(dāng)前版本就依次執(zhí)行遷移函數(shù)把舊數(shù)據(jù)升級到最新格式。這套思路其實就是軟件工程里的數(shù)據(jù)庫遷移思路搬到前端圖數(shù)據(jù)上一樣適用。具體遷移函數(shù)示例const migrations: Recordnumber, (oldData: any) any { 1: (data) { // 版本1升級到版本2為每個節(jié)點補充空數(shù)組 ports return { ...data, nodes: data.nodes.map((n: any) ({ ...n, ports: [], groupId: undefined })) }; }, 2: (data) { // 版本2升級到版本3edge 從 node 引用改為 port 引用 return { ...data, edges: data.edges.map((e: any) ({ ...e, source: { nodeId: e.source, portId: e.sourcePort }, target: { nodeId: e.target, portId: e.targetPort } })) }; } }; function upgrade(data: any): any { let current data; while (current.schemaVersion LATEST_VERSION) { const next current.schemaVersion 1; current migrations[next](current); current.schemaVersion next; } return current; }如果沒有這套機制第一版上線后一改數(shù)據(jù)格式用戶手里的圖就打不開了那是災(zāi)難級事故。我現(xiàn)在對這個事情敏感度很高凡是能持久化的結(jié)構(gòu)必須有版本標(biāo)識、必須有遷移路徑、必須有新舊兼容的至少一個迭代容錯周期。4.3 業(yè)務(wù)語義與視覺表達的邊界圖系統(tǒng)里最容易出問題的地方是把視覺表達直接當(dāng)成業(yè)務(wù)語義存儲。比如說某個節(jié)點在業(yè)務(wù)上屬于“已下線”狀態(tài)你可能會想給它渲染成灰色然后在數(shù)據(jù)模型里也記一個color: gray。短期看著沒問題可一旦業(yè)務(wù)規(guī)則變成“已下線”要顯示成紅色你就得去改全量數(shù)據(jù)而不是只改一套配置。我的做法是數(shù)據(jù)模型里存穩(wěn)定的業(yè)務(wù)狀態(tài)字段比如status: online | offline視覺層統(tǒng)一維護一份“狀態(tài)到樣式的映射表”。當(dāng)多個節(jié)點共用同一種視覺規(guī)則時把樣式注冊成可復(fù)用的主題規(guī)則而不是散布在各節(jié)點數(shù)據(jù)里。用一句話概括就是數(shù)據(jù)存事實樣式存映射規(guī)則集中在主題層。這個原則同樣適用于邊的類型。業(yè)務(wù)里的“依賴關(guān)系”和“調(diào)用關(guān)系”在圖上可能只是顏色和線型不同但在數(shù)據(jù)模型里必須是兩個不同的edgeType。如果只依賴顏色區(qū)分后續(xù)做數(shù)據(jù)導(dǎo)出、權(quán)限控制、語義分析的時候就會缺失關(guān)鍵信息。5. 自動布局決定圖表可讀性的隱藏引擎如果說數(shù)據(jù)模型是圖系統(tǒng)的骨架那自動布局就是它的神經(jīng)系統(tǒng)。理想的布局算法能把一團亂麻的拓?fù)渥詣诱沓扇祟愰喿x時覺得“順眼”的結(jié)構(gòu)。順眼是個主觀感受但底層規(guī)律其實非常穩(wěn)定減少交叉邊、保持層級方向一致、同類節(jié)點對齊、連線盡量短。5.1 分層布局、力導(dǎo)向布局和正交布局的應(yīng)用邊界目前開源的布局算法核心就那幾類選錯了應(yīng)用場景體驗會斷崖式下跌。分層布局的核心思路是先對圖做拓?fù)渑判虬压?jié)點按層級排開再在每一層內(nèi)部調(diào)整順序以降低邊交叉。流程圖、狀態(tài)機、依賴關(guān)系圖都適合分層布局因為它天然有“從上往下、從左往右”的閱讀方向感。實際項目里大多數(shù)業(yè)務(wù)圖的默認(rèn)布局我都會優(yōu)先考慮分層布局。力導(dǎo)向布局模擬的是物理模型節(jié)點之間互相排斥、邊就像彈簧互相拉引迭代若干次后達到穩(wěn)定狀態(tài)。這種布局適合沒有明確方向感的圖比如社交網(wǎng)絡(luò)關(guān)系、系統(tǒng)模塊親密度圖。優(yōu)點是不需要對圖做任何結(jié)構(gòu)假設(shè)缺點是結(jié)果帶有隨機性同一個圖布局兩遍節(jié)點位置可能完全不一樣。對經(jīng)常需要“復(fù)現(xiàn)同樣視覺效果”的場景這是個大忌。正交布局則更貼近電路圖和建筑平面圖的風(fēng)格所有線段都走水平或垂直方向折彎處用直角。ER 圖、微服務(wù)調(diào)用鏈這種強調(diào)連線清晰度的場景正交布局非常有用不過代價是路徑計算的復(fù)雜度明顯更高。實際項目中我一般這樣分配有天然層級關(guān)系的用分層布局不分層但強調(diào)聚類關(guān)系的用力導(dǎo)向需要嚴(yán)謹(jǐn)連線的圖允許用戶在自動布局之后手動微調(diào)路徑點而不是強行全自動。5.2 我基于 dagre 的二次封裝與定制業(yè)界做分層布局dagre 是個繞不開的庫。它實現(xiàn)的是經(jīng)典的 Sugiyama 分層算法框架輸入一個圖結(jié)構(gòu)輸出帶坐標(biāo)的布局結(jié)果。但直接用 dagre 做業(yè)務(wù)系統(tǒng)還是有幾個很別扭的地方。第一個問題dagre 不知道你的節(jié)點尺寸它默認(rèn)把節(jié)點當(dāng)成等寬高的矩形。真實場景中節(jié)點寬度差異很大有的節(jié)點要放圖標(biāo)有的節(jié)點是一大段文本。所以我在封裝時做了一步“先按默認(rèn)尺寸布局再按實際尺寸調(diào)整層級內(nèi)對齊”大致思路如下function layeredLayout(graph: GraphModel, options: LayoutOptions) { // 第一遍預(yù)估尺寸跑 dagre 拿到相對層級與順序 const preliminary dagre.graphlib.Graph(); preliminary.setGraph({ rankdir: options.rankdir }); graph.nodes.forEach(node { preliminary.setNode(node.id, { width: node.width || DEFAULT_WIDTH, height: node.height || DEFAULT_HEIGHT }); }); graph.edges.forEach(edge { preliminary.setEdge(edge.source.nodeId, edge.target.nodeId); }); dagre.layout(preliminary); // 第二遍按實際尺寸做層內(nèi)對齊兼顧同一層節(jié)點的中心線對齊 const layers groupByRank(preliminary, graph); const result: Recordstring, { x: number; y: number } {}; layers.forEach((layer, layerIndex) { const maxHeight Math.max(...layer.map(n graph.node(n).height)); layer.forEach((nodeId, index) { const node graph.node(nodeId); result[nodeId] { x: layerOffset(nodeId, index, layers), y: layerIndex * (maxHeight options.levelGap) }; }); }); return result; }第二個問題dagre 輸出的布局沒有考慮端口方位。它默認(rèn)邊從節(jié)點中心連到節(jié)點中心可真實圖上連線應(yīng)該有明確的出口和入口方向。我的做法是在布局階段先以節(jié)點中心坐標(biāo)做整體排布排完后再根據(jù)邊的相對方位自動推導(dǎo)端口方向這樣既保留了 dagre 的整體結(jié)構(gòu)穩(wěn)定性又讓局部的連線看起來更自然。第三個讓我折騰了一陣的問題節(jié)點寬度差異導(dǎo)致同層節(jié)點參差不齊。比如同一層的三個節(jié)點一個 300px 寬兩個 120px 寬如果只是簡單地把它們擠在一行大節(jié)點會頂著左右兩邊小節(jié)點周圍留出大片空白。最終我采用“層內(nèi)網(wǎng)格居中”策略把每層寬度統(tǒng)一拉伸到該層最大節(jié)點的寬度小節(jié)點在該列內(nèi)水平居中。視覺效果會整齊很多。5.3 布局重計算的觸發(fā)策略布局算法有個常見的性能陷阱用戶只是拖動了某一個節(jié)點整個圖都重新布局了一遍。這會讓用戶感覺到“圖不聽話”因為非被拖動的節(jié)點也亂跳了。我調(diào)參后的觸發(fā)策略是節(jié)點拖動過程中只更新被拖動節(jié)點及其直接相連邊的路徑不做全局重排。節(jié)點拖動結(jié)束標(biāo)記該節(jié)點坐標(biāo)為用戶覆蓋后續(xù)自動布局跳過它。手動觸發(fā)自動布局比如點擊“重新布局”按鈕執(zhí)行全圖重排此時清除所有手動覆蓋信息。圖結(jié)構(gòu)變化新增/刪除節(jié)點、邊以增量方式打補丁優(yōu)先保持已有節(jié)點位置不變讓新節(jié)點在旁邊“長出來”只有在結(jié)構(gòu)變化比例過大時才主動做全量重排。這套策略的核心思想是自動布局要尊重用戶的每一次手動調(diào)整只有在用戶明確要求時才能大動干戈。否則光是一個“拖完節(jié)點又彈回去”的問題就能把用戶逼瘋。6. 交互與渲染的細節(jié)工程拖拽、縮放與路徑重算圖和普通 UI 組件最大的不同在于它面對的是一塊無邊際的虛擬畫布。所有交互計算都要在圖坐標(biāo)和屏幕坐標(biāo)之間做轉(zhuǎn)換這就是整個交互層的數(shù)學(xué)地基。6.1 坐標(biāo)變換與縮放系數(shù)管理假設(shè)畫布有一個全局變換縮放系數(shù)scale平移偏移量tx、ty。那么屏幕坐標(biāo)和邏輯坐標(biāo)之間的換算關(guān)系就是screenX logicX * scale tx screenY logicY * scale ty反推邏輯坐標(biāo)logicX (screenX - tx) / scale logicY (screenY - ty) / scale這套公式本身不復(fù)雜但工程上有幾個細節(jié)容易出問題。第一個是鼠標(biāo)滾輪縮放的中心點。如果鼠標(biāo)停在畫布某處滾輪縮放之后鼠標(biāo)下的那個邏輯坐標(biāo)點應(yīng)該在屏幕位置保持不變。很多初版實現(xiàn)都沒做這個校正結(jié)果就是縮放時圖總是往左上角縮或者上下左右亂飄。校正公式是把光標(biāo)處的邏輯坐標(biāo)作為錨點先換算縮放前后的偏移量差再補償?shù)絫x、ty上。第二個是編輯狀態(tài)下的坐標(biāo)精度。當(dāng)縮放系數(shù)特別大比如放大到 200%同一個邏輯坐標(biāo)在不同幀之間小數(shù)位抖動會導(dǎo)致節(jié)點邊緣不停閃爍。我的做法是渲染層統(tǒng)一用整數(shù)化的邏輯坐標(biāo)避免累積誤差。6.2 連線路徑的自動規(guī)避與折線計算邊是圖系統(tǒng)中最“難畫”的元素因為它的路徑點需要繞過節(jié)點還需要在方向變化處畫成直角折線。直角折線計算的標(biāo)準(zhǔn)思路是如果源端口和目標(biāo)端口在同一水平線就走一段水平線如果不在就要先出端口方向一段“引出線”再走正交線段連接。我用的是簡化版 A* 尋路算法作用范圍限制在包圍盒所在的局部區(qū)域。具體來說網(wǎng)格化源節(jié)點到目標(biāo)節(jié)點之間的矩形區(qū)域把其他節(jié)點當(dāng)成障礙物搜索一條從源端口到目標(biāo)端口的最短正交路徑。這個算法對少數(shù)連線場景表現(xiàn)很好但連線一旦密集比如上百條每根線都做獨立尋路會產(chǎn)生大量重疊和交叉這也是正交布局在復(fù)雜場景下比較難解決的問題。我采取的妥協(xié)方案是自動計算完路徑后再做一次基于熵的路徑平滑把共線的線路合并交叉情況用曲線過渡簡化視覺噪聲。效果上自動連線的“粗糙感”會明顯減輕雖然沒法做到完全零交叉但在千級節(jié)點規(guī)模的系統(tǒng)里已經(jīng)夠用。6.3 選中的反饋與編輯器的撤銷/重做圖編輯器里用戶對“選中”的反饋非常敏感。節(jié)點選中時會出現(xiàn)選中框邊選中時會出現(xiàn)路徑錨點同一時間可以框選多個對象。這個交互層其實藏著一個大坑撤銷/重做棧。圖編輯的撤銷和文本編輯的撤銷復(fù)雜度完全不在一個量級。光是把一個節(jié)點從 A 點拖到 B 點中間會經(jīng)過幾十次鼠標(biāo)移動事件如果不做合并撤銷棧會被幾十條“位置微調(diào)”記錄撐爆用戶按一次撤銷只能回退 1 像素體驗極其糟糕。我后來實現(xiàn)的是“命令模式 操作批次合并”連續(xù)同類型的變更比如連續(xù)拖拽、連續(xù)縮放、連續(xù)框選移動合并成一個撤銷記錄每次交互結(jié)束后才 push 進撤銷棧。像這樣class CommandStack { private stack: Command[] []; private batch: Command[] | null null; beginBatch() { this.batch []; } push(command: Command) { if (this.batch) { this.batch.push(command); } else { this.stack.push(command); } } endBatch() { if (this.batch this.batch.length 0) { this.stack.push(this.batch); } this.batch null; } undo() { const cmd this.stack.pop(); if (Array.isArray(cmd)) { cmd.reverse().forEach(c c.undo()); } else if (cmd) { cmd.undo(); } } }每次鼠標(biāo)按下時beginBatch()鼠標(biāo)松開時endBatch()整個拖拽過程只留下一個可撤銷步驟用戶按 CtrlZ 時能夠一次回到拖拽前狀態(tài)。這個設(shè)計雖然代碼行數(shù)不多但對編輯類工具的使用體驗提升是立竿見影的。7. 性能優(yōu)化的實戰(zhàn)路徑當(dāng)棱角開始穿透 SVG 的天花板SVG 的上限在幾千個節(jié)點時就會開始顯形這個數(shù)字聽起來好像很夠用可真到了流程圖編輯場景一個主節(jié)點掛幾十個子節(jié)點再疊加編輯緩存和歷史記錄內(nèi)存占用很快會飆升。我經(jīng)歷過的性能拐點很明確節(jié)點數(shù)上到 2000 左右拖拽開始卡5000 左右直接沒法互動。所以性能優(yōu)化不是可選項是必選項。7.1 可視區(qū)裁剪是第一優(yōu)先級的優(yōu)化圖表畫布是個無邊際的世界但用戶眼睛能看到的區(qū)域其實很小。不做可視區(qū)裁剪等于把整個城市的地圖一次性畫出來而用戶只盯著一個街區(qū)。實現(xiàn)思路是維護一個可視矩形viewBounds遍歷節(jié)點時只渲染與viewBounds有交集的節(jié)點對完全在可視區(qū)外的節(jié)點直接跳過 DOM 創(chuàng)建。邊的渲染判斷稍微復(fù)雜一些因為一條邊的兩個端點可能都在可視區(qū)外但路徑中途穿過可視區(qū)。所以邊不能用“兩端是否在可視區(qū)”來判斷需要判斷折線線段與viewBounds是否相交。7.2 分層渲染靜態(tài)層與交互層分離很多圖表卡頓的根源在于靜態(tài)展示的圖形和用戶正在拖拽的節(jié)點混在同一個渲染層級每次交互都導(dǎo)致全量重繪。我采用的方案是分層底層靜態(tài)背景網(wǎng)格線、大節(jié)點、固定樣式元素只在畫布變換結(jié)束或數(shù)據(jù)變更時重繪。中間層動態(tài)內(nèi)容節(jié)點和邊的渲染主體在拖拽、縮放時按需更新。頂層交互反饋層選中框、拖拽中的預(yù)覽路徑、臨時高亮每幀刷新但元素數(shù)量極少。TS 項目里對應(yīng)實現(xiàn)就是疊加多個g組操作時精準(zhǔn)定位到對應(yīng)層級的g而不是每次都重建整個畫布。7.3 批量更新原則與渲染節(jié)流節(jié)點數(shù)據(jù)變化是高頻事件如果每次變化都立即操作對應(yīng) DOM往往會造成無謂的性能開銷。我多做了一個隊列化更新機制把一批變化統(tǒng)一收集放到 requestAnimationFrame 的回調(diào)里一次處理。這樣在同一次交互內(nèi)的幾十次節(jié)點移動最終只觸發(fā)一次批量更新。類似的節(jié)流還用在了縮放事件上。滾輪事件在瀏覽器里頻率非常高如果每幀都去重算所有邊的路徑必然卡頓。我的做法是縮放過程中只更新畫布的 transform 和網(wǎng)格線等縮放停止約 150ms 無新事件后才重算邊上路徑點的寬度。視覺上無感性能上會有質(zhì)的提升。8. 一路摸爬滾打總結(jié)的 diagram-design 實用準(zhǔn)則最后把這段經(jīng)歷里最有復(fù)用價值的東西濃縮成幾條原則這些是我每次做圖系統(tǒng)時都會默念的清單。先定數(shù)據(jù)模型再選渲染庫。數(shù)據(jù)模型一旦定錯后續(xù)所有代碼都在給錯誤模型打補丁。節(jié)點、端口、邊、分組、畫布這五個實體齊全了再去接渲染層、布局算法和交互邏輯。自動布局和用戶手動調(diào)整的關(guān)系要趁早想清楚。我用“用戶覆蓋優(yōu)先、自動布局尊重覆蓋、用戶主動觸發(fā)才全量重排”這套策略極大避免了布局和手動的沖突。如果沒有這條策略圖系統(tǒng)會處于一種“永遠在跟用戶搶奪控制權(quán)”的狀態(tài)非常難受。序列化數(shù)據(jù)結(jié)構(gòu)必須帶版本號和遷移機制。好結(jié)構(gòu)是慢慢“長”出來的沒有誰第一版就能設(shè)計完美。允許數(shù)據(jù)模型演進但演進一定要有章法不能直接把舊數(shù)據(jù)處理邏輯撕了。圖系統(tǒng)的性能優(yōu)化以可視區(qū)裁剪為基底再疊加批量更新和分層渲染。這三板的收益在中小圖系統(tǒng)上已經(jīng)足夠真正需要 WebGL 的場景非常少不要過早引入重型技術(shù)。還有一個容易忽略的體驗細節(jié)圖系統(tǒng)的空狀態(tài)。用戶打開編輯器時畫布上什么都沒有此時至少要展示一張“引導(dǎo)浮層”告訴用戶從哪里開始創(chuàng)建節(jié)點、怎么連線、怎么切換布局。這個浮層成本極低但對新用戶的上手體驗幫助極大。很多圖系統(tǒng)做出來功能很強大但新用戶一打開就懵了很大原因是空狀態(tài)沒有設(shè)計過。我現(xiàn)在的習(xí)慣是每做一個 diagram 類項目都會先從數(shù)據(jù)和布局入手搭一個最小原型只支持一個正方形節(jié)點、一條邊、一次拖拽、一次縮放跑通全鏈路后再逐步加功能。這個最小原型的價值不在于功能而在于把坐標(biāo)系、批量更新、撤銷棧、序列化這些地基打牢。地基穩(wěn)了后面長出來的每一層功能才不至于傾覆。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月婷婷激情刺激| www.天天干| 五月综合色| 综合色影| 九九在线精点品| 婷婷色网站| 另类天堂| 婷婷五月天激情小说网站| 日韩AV免费看| 婷婷开心激情综合五月天| 黄色片久久| 26uuu91| 久久AV无码精品人妻系列试探| 一本道综合网| 久久五月天激情婷婷| 五月婷婷天天| 久久综合激情五月天| 99热超碰在线| 天天爽日日爽夜夜爽| 99亚州综合精品成人网| 六月丁香婷婷尤物| 六月丁香狠狠爱| 粉嫩av蜜桃av蜜臀av| 激情婷婷五月久久| 九九婷婷激情综合网| 中文字幕性爱丰满| 色婷网| 91久久久久久| 十月色综合| 乱精品一区字幕二区| 久久开心五月婷婷| 五月丁香六月香香蕉| 六月丁丁香| 婷婷天天综合| 综合大香蕉| 久色五月婷婷综合| 色操综合| 开心激情婷婷| 久久婷婷五月天蜜桃| 99热综合在线| 120分钟婬片免费看| 五月婷婷久久网| 久久99免费视频| 久久九色| 狠狠草狠狠草| 小视频aaa久久久| www,setingting| 991精品在线视频| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 激情另类综合| 肏日网在线看| 五月天婷婷基地| 热的无码综合视频| www99热| 色天堂婷婷| 丁香五月伊人| 开心综合激情综合| 六月色婷婷色| 9色在线视频精品观看| 玖玖99免费视频| 99热首页在线30| 91pornav在线| 99色综合久久| 国产人妻777人伦精品HD| 中文在线视频久1| 婷婷五月色| 伊久大香蕉| 色色免费网站| 丁香五月激情综合网激情五月| 久久婷婷草| 自拍偷窥99热| z色五月播播久久| 激情播丁香| 五月天伊人| 精品香蕉99久久久久网站| 五月天亚洲综合网| 色。 日日日| 久久精品99久久| 能看的AV| 99热8| 久久怕怕视频| 午夜婷婷五月天| 香蕉国产2013| 婷婷九月丁香| 91视频综合网| 久久精品视频在这里有| 丁香色啪综合| 激情伊人六| 99久在线观看| 人人干女人| 九月激情婷婷丁香| 五月丁香天堂网| 色五月六月| 色必久悠悠影院| 99热免费精品| 99热日| 色情网综合| 亚洲激情在线| 五月婷婷五月| 丁香五月激情五月| 色五月天综合网| 日本色五月婷婷| 婷婷丁香五月综合激情小说| 色婷婷亚洲在线| 婷婷五月天777| 五月天激情图片| 伊人大香蕉在线视频| 秋霞AV吧| 五月婷婷很很色| 亚洲精品V天堂中文字幕| 婷婷五月天狠狠色| 成人va视频| 婷婷丁香五月天亚洲| 婷婷丁香五月视频| 国产成人综合在线| 五月伊人婷婷999| 97人碰人操| 久久人妻超碰一区| 色五月色开心开心五月| 丁香激情五月天| 在线免费视频caop| 五月婷婷色白丝| 色色色色热| 夜夜做夜夜愛| 五月婷婷说| 热久久这里只有精品20| 五月深爱网| 一本伊人色婷| 五月婷婷六月丁香综合| 久久精品永久免费| 丁香六月色婷婷综合| 婷婷五月丁香伊人网| 精品99在线| 亚洲婷婷久久综合| 66精品国产成人| 久久婷婷精品| 色色色在线播放| 国产xxxxx在线观看| 五月丁香六月在线欧美| 九九aV| 婷婷五月激情综合啪啪| 激情久久久久久久久久| 五月婷婷啪| 丁香啪啪| 婷婷五月天深爱| 五月丁香成人版| 精品网站99| 色播五月丁香综合| 色色综合网络| 精品久久9| 99综合久久| 久久一热| 天天色2017| 在线一起草av| 五月天久久www| 中文字幕,综合,91| VA色婷婷| 91大屁股| 欧美性丁香色色五月天干干| 九九色综合九九色| 男人先锋久久| 一区二区aV电影免费看| 农村熟妇高潮精品A片| 国产精品成人AV在线观看春天| 九九99九九精品免费| 五月婷婷香蕉| 久久多色| 色五月成人在线| 五月婷婷天天| 99热免费| 国产44页| 97五月天婷婷午夜| 婷婷伊人网| 久久激情五月婷婷| 婷婷的五月天另类视频| 大香蕉久久草| 狠狠色激情综合| 狠狠激情五月天| www一区二区三区| 97五月久久丁香婷婷| 九九视频这里只有精品| 少妇高潮呻吟A片免费看软件| 激情超碰网| 久久婷婷色情7777网站| 国产精品久久久久久五月天加勒比| AV操操操| 精品夜夜澡人妻无码AV| 激情综合色婷婷啪啪六月天| 天天做天天爱天天爽夜夜揉| 亚洲丁香五月天在线视频| 丁香五月婷婷色情综合| 丁香五月天堂| 日韩成人电泉AV| 色一情一乱一乱91Av| 99色在线视频| 亚洲久热无码| 国产精品美女| 日产精品久久久久久久蜜臀| 丁香九九九九| 狠狠色无码| 操九色| 玖玖精品视频| 色色婷婷丁香五月天| 激情五月开心五月在线视频| 婷婷五月成人| 超碰免费人人肏| 99,色| 欧美色五月天| 日本颜色视频人人爱| 亚洲精品大片| A在线观看| 狠狠五月天婷婷激情网。| 婷综合| 九九九九九九热| 999热在线视频| 开心婷婷五月中文字幕组| 日本欧美在线| 亚洲 视频 导航 一区| 丁香久色| 9|无码久久久久久| 丁香五月亚洲综合| 久久久婷丁香五月| 五月色丁香| 色九月国产| 少妇口诉沐足视频播放器网址| 秋霞AV淫| 精品久久久久成人码免费动漫| 午夜九九九九九九| 丁香五月婷婷动漫| 日韩无码专区| 中文字幕黄色片| 99久久大片| 蜜桃人妻无码AV天堂三区| 色伊人啪| 婷婷久久精品| 国精产品一区二区三区| 五月婷婷影| 99久久国产宗和精品1上映| 丁香花成人区| 夜夜骑日日夜夜| 久操操| 六月丁香啪| 久久五月婷综合网| 丰满少妇猛烈A片免费看观看| 亚洲综合99| 人人视频色| 五月天深爱激情网| 久久精品国产一区二区三区四区| 99久久a线观| 九九热免费| 超碰色色综合| 播五月开心婷婷欧美综合| 五月丁小婷婷激情四射| 亚洲色欲欧美一区二区三区| 高清一区二区三区日本久| 毛片新网地| 色播五月婷婷| 91 原创 在线 九色| 九九无码视屏| 成人无码中文| 九九亚洲视频| 丁香五月大香蕉AV| 亚洲视频操| 色婷婷AⅤ| 99视频在线观看网址| 97人人操com| 五月婷六月婷婷| 丁香婷婷五月激情四射网| 开心五月深爱五月婷| 亚洲精品又粗又大又爽A片| 九九蜜臀精品| 无码视频国内精品久久久| va婷婷在线免费观看| 日本人妻伦在线中文字幕| 色色激情五月| 亚洲高清在线| 久久国产性爱A V| 91碰碰| 天天操天天日天天爱| 色婷婷亚洲精品天天综| 538久久| www久久久久久久久久久| 欧美欧盟性爱网| 亚洲精品大片| 538久久| 午夜不卡久久精品无码免费| 五月激情五月婷婷五月天在线| 久久丁香婷婷色情综合| www.五月天婷婷| 91日韩美女被插视频| 亚洲免费99| 少妇激情基地| 日本强伦片中文字幕免费看| 五月丁香婷婷五月| 日韩999| 丁香六月综合激情| httpwww色com日本| 色婷婷先锋| 玖玖无码中文| 色五月丁香激情| 大香蕉丁香婷婷| 激情五月婷婷五月| 2015好吊操| 99这里有精品| 日本高清综合网五月丁香| 丁香五月婷婷偷拍| 91精品久久久久久77777| 人妻AV在线观看| 色色综合网站| 婷婷丁香十月| 再次出发二| 久久五月婷综合| 夜夜操狠狠操| 这里只有精品视频国产| 怡红院91a√| 免费视频无码| 激情影院免费视频婷婷五月天| 超碰成人在线免费观看| 色五月激情五月| 五月婷六月天| 久久婷婷综合网| 色爱综合网| 五月天综合婷婷| 影音先锋噜一噜| 噜噜噜久久| 激情五月婷婷综合色播小说| 秋霞性爱AV| 丁香五月婷婷免费视频| 久热九九| 五月丁香婷婷俺| 亚洲激情五月| 五月天激情小说| 99久久6| 色婷婷久久| 99久操视频| www久久久久久久97| 欧美性丁香色色五月天综合爱爱| 丁香婷婷五月综合影院| 激情五月丁香五月色| 五月丁香色色综合| 精品一区久热| 性综合网| 五月婷婷六月丁香综合| 亚洲综合99| 90色免费视频| 五月天激情影院| 久久怡红院| 丁香五月婷婷六月婷| 国产AV一区二区三区日韩| 天天搞天天色综合| 色色COm| 最新色色五月天| 亚洲成AV人片在线观看| 91操人| 婷婷刺激综合| 五月婷婷激情综合拍| 五月丁香婷婷啪啪| 五月天天综合| www99精品亚| 五月婷婷丁香大陆免费| 丁香丝袜五月| www.99热最新视频8| 婷婷丁香五月天影院 | 六月激情婷婷| 91久久九久久九久久九久久九久久| 日日躁夜夜躁狠狠久久AV| 99综合一区| 色人妻五月| 另类激情五月| 91色在线 | 日韩| 亚洲午夜成人av电影网| 国产亚洲99久久精品| 色情五月天丁香社区| 九九热视频免费| 怡红院院在线导航网 | 色五月婷婷综合在线| 大香蕉伊人丁香五月| www.夜夜操| 久久永久网址| 婷婷色在线| 久久婷婷五月综合色丁香| 日本综合色图| 久久这里只有精品热在99| 91九色丨国产丨爆乳| 开心激情婷婷| 深爱婷婷网| 婷婷五月六月丁香综合| 26UUU亚洲欧美| 五月激情丁香六月狠狠干| 99re视频在线播放| 久99久精品视频| 亚洲色图在线视频| 六月婷婷AV| 中文字幕成人日韩| 婷婷五月开心六月AV| 韩国中文字幕91| 国产乱妇无乱码大黄AA片| 91超级碰| 五月天激情小说| 色一情一乱一乱一区91Av| 久9久9热久热| 五月婷婷香| 99在线观看| 久综合网| 超碰人人在线| 久久精品一区二区三区四区| 91 影音先锋| 成人做爰高潮A片免费视频 | 婷婷激情小说网| www.久久爱| 97人人搞| 人妻自慰在线| 五丁香激情综合| 九九九午夜影院成人| 丁香五月色情av| 亚洲av另类在线观看| 天堂呦 呦百度搜索-百度搜索| 色噜噜综合网| 99热在线观看| 91av成人| 亚洲综合另类| 欧美精品99久久久| 欧美综合激情五月丁香| 日韩操逼小电影| 日日做天天操夜夜爽| 丁香婷婷久久综合在线| 久久激情五月婷婷| 丁香五月天黄色片| 五月天激情四射| 午夜少妇在线观看视频| 俺也去色| 99在线看片| 99热99草97| 久久色五月| 五月婷婷大香蕉| 激情婷婷亚洲五月| 激情99。| 99免费在线| 99热亚洲精品| 99综合视频一体| 一本色道久久88加勒比| 97干在线看| 亚洲第一成人无码A片| 久久99这里只有精品| 色9色| 九九爱激情| 五月婷婷无码| 大香蕉精品视频| 极品人妻VIDEOSSS人妻| 久久一伦| 99色在线视频观看| 79色色色色| 丁香五月六月综合激情| 丁香激情五月| 色涩视频久久| 久久性操| 思思w99| 婷婷久月| 亚洲成人免费在线| 国产三级在线播放| 99色综合网| 天天操天天爱天天玩| jizzdr| 色色网站| 九九九九九九九九九九九九九国产精品| 五月丁香六月激情综合| 丁香婷婷久久老熟女综合网| 五月丁香婷婷久久| 婷婷丁香熟女| 大香蕉手机视频| 草美女在线观看视频在线播放| 深情五月天| 97人人操人人干| 色欲AVV| 99在线视频精品| 狠狠色激情综合| 五月婷婷久久大香蕉| 婷婷97狠狠成人网站| 91超碰人人操| 午夜成人av在线| 91干| 九九色热| 国产99久久久国产精品免费看| 一区二区三区四区牛| 开心婷婷五| 99久热这里只有精品| av在线资源| 成人在线视频男人的天堂4399| 欧美美女国产日韩一区二区久| 亚洲综合激情五月久久| 99综合视频| 婷婷色操| 九九精品视频在线6| 激情五月久久| 丁香 亚洲 久久| 九九九九九九九热| 日韩成人精品中文字幕| 铁牛TV人妻| 天天天摸夜夜夜玩| 亚洲亚洲人成综合网络| av网址在线| 5月丁香婷婷激情网| AA片在线观看视频在线播放| 天天做天天爱高潮片| 婷婷丁香五月色| 欧美色图片88| www.五月婷婷久久.com| 99综合网| 五月天婷婷久草丁香| 五月天婷婷成人资源站| 亚洲日韩一页精品发布| 婷婷午夜| 中文字幕不卡+婷婷五月| 91亚洲免费片| 激情综合婷婷| 99热这里只有精品9| 色久女| 婷婷亚洲五月| 国产操逼网站| 激情内射p| www.99热| 性韩日色婷婷五月天激情啪啪XXX| 欧美成人性爱网| 超碰在线免费观看日韩| 五月天天天开心激情网| 五月天综合| 婷婷五月丁香综合亚洲| 成人丁香五月| 九九色热| 色色丁香五月婷婷| 香蕉久久国产AV一区二区| 婷婷午夜| 天天色视频| 人人操操| 久久精热| 五月激情综合性爱| 噜一噜在线| 亚洲丁香花五月丁香花| 狠狠草综合网| 狠狠爱五月婷婷综合六月| 亚洲九九99精品视频在线播放| 亚洲视频一区| 六月丁香综合999| 亚洲精品无码一区二区| 狠狠香婷婷五月| www婷婷| 色久女| 色色a| 99免费在线视频| 五月丁香激情六月| 夜夜爱爱亚洲| 4438激情网| 国产婷婷五月天| 99在线免费视频| 五月婷婷色综图片| 99爱在线视频| caop在线视频| 久久99网站| 激情婷婷人妻| 嫩草AV久久伊人妇女超级A| 开心婷婷五月花| 日本精品人妻无码77777| 五月天婷婷激情小说| 99视频自拍| 九九精品视频免费在线| 在线只有精品| 亚洲欧州色情在线观看| 日韩色色一区| 五月婷婷色色| 天天天天天色| 色婷婷丁香AV综合| 操人久久| 色五月xxx| 无码人妻丰满熟妇奶水区码| 无码人妻一区二区三区四区| 日韩在线观看网址| 丁香色五月天| 欧美日综合| 婷婷五月丁香五月| 五月天激情子轮| 色99视| 99婷婷| 99高级会所久久| 五月天丁香婷婷久久九| 99亚洲精品| 五月天婷婷色在线视频免费观看 | 五月婷婷五月色| 亚洲五月婷| 午夜精品人妻无码一区二区三区 | 六月婷婷啪啪| 五月婷丁香| 五月丁香花激情综合网| 日本婷久久| 大香蕉综合网| 五月丁香色六月激情干大屄| 超碰1999| 色国产五月| 亚洲色无码| 国产婷婷综合在线免费视频| 久9视频| 婷婷丁香成人在线视频| 伊人久热91网| 99ri精品| 激情五月开心五月丁香五月| 六月丁香深深爱综合网| 久久日本wwww色| 开心五月婷婷激情| www一区二区三区| 婷婷色情网| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 大香蕉伊人久久| 欧美熟女视频 色婷婷| 人人干99| 五月天玖玖狠狠色色| 99精品一二三四视频| 少妇搡BBBB搡BBB搡毛茸茸| 思思热在线视频精品| 这里只有视频精品| 久操97| 婷婷社区五月天| 激情五月天小说| 五月丁香婷婷爱激情综合网| 91精品国产色猫| 99热精品在线在线| 99热这里都是精品| 婷婷激情五月综合丁香社| 99热大香蕉| 五月综合激情啪啪啪啪啪| 操一区| 丁香桃色网| ji'qing'luan'ren'lun| 日韩一级A片黄色| 国产精品黑丝| 午夜少妇在线观看视频| 影音先锋一区二区三区| 国产一区男女| 九九这里只有精品在线视频| 操逼六区| 久久久五月天婷婷成人网| 丁香六月啪啪| 五月丁香综合激情| 色色色色网| 国产又黄又爽又激情不遮挡视频在线观看| 丁香五月在线观看| 玖玖五月| 玖玖精品视频| 99爱最新免费视频在线观看| 在线国产精品色| 夜夜大香蕉婷婷丁香| 任你搞免费视频观看| 五月天婷婷基地| 色999五月色| 色99色| 伊人AV五月婷| 五月天激情网页| 五月天婷亚洲综合在线嫩草网| 色月九九| 非洲一级AV| 色婷婷香蕉丁丁网| 日本9区视频| 97超碰,人人舔,人人操,人人摸| 另类激情中文| 在线播放中文字幕| 碰碰91| 天天做天天爱天天综合网| 久色五月婷婷综合| 99成人精品| 色综合播放| 美女天天久久| 激情丁香婷婷六月天| 超碰激情网| 亚洲视频操| 婷婷色色欧美| 色婷婷91| 天堂爱啪啪| 大香蕉Av在线| 另类视屏| 超碰在线中文字幕| 狼友超碰| 超碰在线精品| 婷婷色在线视频| 草榴视频网| 国产免费av在线| 97久久五月丁香婷婷| 婷婷综合日本| 超碰资源在线| 九九99免费理论| 日韩999| 亚洲色综久久五月| 色综合九九色综合88| 99狠狠| 欧美色宗和激情| 91尤物九色在线| 久久五月天婷婷| 丁香网站| 国产乱妇乱子在线播视频播放网站| 国产AV国片偷人妻麻豆| 艳妇野外情欲放荡HD| 五月婷婷亚洲天堂97色婷婷| 超级碰碰99| 色婷婷丁香社综合| 9久热免费视频99| 97色婷婷成人综合在线观看| 五月丁香久久呀| 特黄三级片| xxxx五月激情| 99久久99热这里只有精品| 五月天激情婷婷小说| 日本五月天一页| 少妇人妻人伦A片| 狠狠干在线| 亚洲精品亚洲人成人网| 99∨VTV| 亚洲黄网在线| 激情五月天的婷婷| 日本婷婷在线| 色八月婷婷| 79色色免费| 爱草人视频| 97干在线视频| 风流少妇A片一区二区蜜桃 | 福利视频在线播放| 无毒黄色网址| 激情九九六月激情免费视频| 色婷婷基地| 六月色婷婷色| 99久久九九| 婷婷月综合| 天天日夜夜爽| 丁香六月欧美| 日本va欧美va欧美va精品| 天天婷婷操| 四色99久久| 超碰av在线| 久草热在线视频| 99久久婷婷精品视频| 九热久| 成人片久久网站| 婷婷瑟瑟五月天| 色婷婷AAA| 桃色成人网| 亚洲乱码日产精品BD| 色色日本欧美| 99热这里只有精品50| 丁香六月综合激情| 九九AV| 五月婷中文娱乐综合| 99在线精品观看99| 婷婷五月天堂一本在线| 色色五月婷婷| 超级碰 久久9| Xx色综合| 人人爱人人草| 强辱丰满人妻HD中文字幕| 亚洲成Av人片乱码色第1集| 婷婷五月黄色激情在线| 99免费| 九九色热| 婷婷五月色花丁香社区| 激情久久四色| 久久一热| 五月天综合在线| pom538精品视频| 99在线视频精品| 激情五月婷婷开心网| 丁香九月婷婷| 五月丁香自拍| 色五月婷婷天天操夜夜操| 青青草tp| 天天天天天天操| 婷婷亚洲综合| 国产成人av在线播放| 久久婷婷五月综合啪| 激情五月色婷婷| 色综合香蕉| 人人舔天天| 婷婷五月天成人| 超碰无码318604| 99精品久久久久久久婷婷久久 | 热99只有里视频| 色综合五月| 久久综合婷婷五月| 丁香五月天人体| 97久久人人操| 日本一级大片| 五月停停丁香| 五月婷视频| 99热爱爱干干日| 五月丁香亚洲婷婷| 99干日日干| 99这里是99在线视频| 欧美色97| 日韩AV中文字幕在线| 久久久久人无码人妻| 久久99视频| 久久久999精品| 婷婷五月天小说| 五月天色色色网| 色欲香综合网| 五月婷婷综合激情| 婷婷丁香射射| 婷婷丁香久久| 激情99热| 国产97色在线 | 日韩| 五月天大香蕉视频| 天天操天爱综合| 97很鲁在线视频| 日本丁香五月婷婷| 五月天婷婷久久| 天天艹天天综合网| 丁香婷婷色情| 国产毛片操B| 婷婷五月天伊人网在线观看视频| 狠狠插狠狠操| 大香蕉五月丁香| 狠狠穞A片一區二區三區| WWW、99热| 99色热视频| 国产偷人爽久久久久久老妇APP| 婷婷欧美色| 五月天啪啪啪| 久热只有这里有精品| 婷婷俺去也| 亚洲人人操| 六月丁香婷婷综合在线| 五月Huangsewang| 日批在线看| 亚洲视频在线网站| 五月天婷婷色小说| 91蝌蚪窝视频在线| 丁香婷婷久久老熟女综合网| 射婷婷中文字幕| 欧美色小说婷婷| 果冻传媒A片一二三区| 狠狠干思思热| 婷婷综合干| 天天狠狠六月婷丁香影院| 中文字幕婷婷在线| 色五月丁香伊人五月| 色玖玖网| 国产婷婷综合在线免费视频| 亚洲无码99| 夜夜躁狠狠| 欧美日本日韩| 九九热视频免费| 欧美日韩国产一二区| 日日天天干| 91啪啪网| 丁香婷婷色五月| 亚洲va日| 中文字幕日本最新乱码视频| 丁香婷在线| 色色色色色色五月婷婷| 五月天久久网站| 超碰人人艹| 婷婷五月天激情网| 久久婷婷操| 九月婷婷在线观看| AV成人在线播放| 91丨九色丨国产打屁股| 91色久| 婷婷五月天激情小说网站| 亚洲AV成人一区二区在线观看| 天天爽,夜夜爽| 国产精典视频在线观看| 五月激情综合网| 九九免费精品在线视频| 丁香五月激情久久麻豆| 人人摸人人| 99综合免费视频| 丰满人妻妇伦又伦精品国产 | 99热这里只有是亚洲国产| 亚洲 欧洲 国产 伦综合| 色碰碰视频| 丁香八月综合激情| 日逼影音先锋AV男人资源站| 久热亚洲| 秋霞午夜理论| 亚洲啪| 五月丁香色色网| 五月天播播综合| 1769在线观看欧美国产| 男人天堂99| 激情网 五月天| 久久久久久久久久久-久五月天婷婷| 五月丁香六月婷婷无码| 99色干| 久久99久久99精品,久国产,久久精品免费,99久在线,久久久久国产精品免费网站,9 | 伊人色综合影院视频| 婷婷久久综合久| 婷婷五月色情天| 激情五月综合网| 96丁香婷婷九月蜜桃综合久久| 五月开心色| 久久这里只有精彩| 婷婷五月天渟渟| 色综合99| 久久综合激情婷婷激情| 91丨九色丨东北熟女| 狠狠狠狠狠狠| 婷婷五月天网| 婷婷六月婷婷| 欧美在线视频免费播放| 极品人妻VIDEOSSS人妻| 丁香婷婷性久久| 91黄色五月天视频| 九九综合九九| 成 人 色 色| 色噜噜狠狠色综合无码久久欧美| 五月婷婷久久网| 五月花免费视频| 五月天婷婷在线AN| 欧美又粗又大一区二区在线观看| 五月天婷婷色色首页| 激情第四色| 天天肏天天肏天天肏| 激情五月天之五月婷婷| 色久女| 97成人丁香| 天堂久久精品| 色婷婷色婷婷五月| 久久五月人人摸| 玖玖99免费视频| 中文字幕不卡网站| 五月丁香网站| 久久9热| 91精品国产综合久久密臀| 婷婷综合在线| 99re视频在线| 国产午夜精品一区二区三区四区| 99热这里| 丁香午夜天| 五月天小说激情| 激情九月婷婷| 九月色婷婷综合| 毛片九九九九九九九九18| 天天色天天操天天射| 日本99色| 亚洲天天综合| 五月婷婷五月天天| 五月丁香花视频| 超碰无码老师| 麻豆AV一区二区三区| 五月丁香六月欧美综合网站| 丁香五月先锋| 国产精品蜜臀99| 91丨熟女丨首页| 生活片五区| 久操人| 99操不停| 丁香花综合永久入口| 国产真实乱了老女人视频| 久久99网| 91碰碰视频| 亚洲综合五月天婷婷| 五月婷婷九| 欧美五月丁香在线观看| 亚洲人成网亚洲欧洲无码久久| 婷婷六月综合| 婷婷色色丁香| 九九伦子片| 六月五月天婷婷涩播在线| 国产精品99久久久久久久女警| 九九视频这里只有精品| 超碰在线视屏| 国产精品成人AV在线| 舔色婷婷| WWW.婷婷| 日韩色五月| 人人噜天天上| 亚洲色模骚货| 亚洲另类噜噜| 久久亚洲婷婷| 日本va视频| 99综合99| 色婷婷色情| 国产日韩欧美性生活| 婷婷五月天成人五月天| 五月丁香网视频| 99精品视频在线观看免费| 九九久久五月天综合伊人| 99在线资源| 日韩综合久久| 亚洲成人一区| 狠狠干婷婷| 丁香五月天视频| 九九色热| 久久xxxx| 大战熟女丰满人妻AV| 777精品久无码人妻蜜桃| 大陆极品少妇内射AAAAAA| 图片区 小说区 区 亚洲五月| 日韩免费视频| 亚洲网站观看视频| 久久五月婷| 午夜精品人妻无码一区二区三区| 97精品人人A片免费看| 99精品视频免费观看近期发布| 超碰免费在线| 国产AV一区二区三区最新精品| 无码激情AAAAA片-区区| 色婷婷激情五月天丁香| 99热个人在线| 亚洲在线网站| 99久热精品在线| 91超级碰在线视频| 玖热精品综合视频| 色亚洲中文| 色五月激情基地| 丁香六月伊人| 麻豆雪千夏| 97色碰| 色色五月天婷婷| 67194线路二在线观看| 正宗黄色毛片| 天天色综合天天| www 五月天 com| 综合一本道| 久久久久久久97| 五月天综合| YW无码| 国产avapp 网| 99热99热在线观看| 夜夜操天天干| 欧美婷婷五月丁香| 超碰成人公开| 久久9999| 爱爱色五月天| 99 这里只有精品| 色深爱五月| 色99网| 成人免费120分钟啪啪| 激情婷婷护士激情| www:99热视频| 欧美久热| site:publishdd.com| www.激情五月| 99久在线精品99re8热| 99久久婷婷国产综合| 九九丁香社区欧美激情| 色www.con| 永久思思热在线| 六月香五月婷| 精品色| 五月天色区| 午夜成人av在线| 丁香六月激情毛片| 婷婷五月大| 六月色丁香中文字幕| 99精品国产在热久久婷婷| 91精品无码| 性色做爰片在线观看WW| 国精产品一区二区三区| 久青青久| 色婷婷小说| 99热这里只有精品9| 婷婷丁香大香蕉| 色综合婷婷| 五月天激情Av| 97碰碰在线看视频免费| 碰97 久| 色婷婷9| 五月天激情综合10p| 色色色婷婷五月天| 伊人婷婷大香蕉在线| 夜夜大香蕉婷婷丁香| 五月丁香av在线| 丁香九月综合| 婷婷色五月综合| 久久9精品| 久久香蕉婷婷五月天| 色五月成人婷婷| 久久精品性爱| 最近中文字幕大全免费版在线 | 五月激情婷婷国产精品久久久久久| 久色视频首页| 欧美日本国产欧美日本韩国99| 精品欧美性爱超级爽| 97色天堂| 久久性爰视频这里只有精品| 日日操日日撸| 海外网站专业操老外| 天天做天天要天天爱| 五月激情六月综合| 欧美在线| 激情伊人| 熟女激情五月天 | 俺也去五月婷婷丁| 婷婷丁香五月麻豆| 色色色色色色色色网站| 欧美美女视频| 久久久久婷婷| 综合婷婷都市激情| 综合久久婷婷| 九九亚洲综合| 夜夜干天天干| 久久综合99综合| 婷婷丁香六月综合激情站| 日本美女五月天| 超碰熟女农村在线69| 久久久久亚洲A∨成人乱码电影| 亚洲av日韩无码| 丁香花五月天婷婷成人社区 | 久色激情| 成人五月天丁香| 天天干天天干天天操| 97超碰,人人舔,人人操,人人摸 | 91色涩| www激情五月天| 强辱丰满人妻HD中文字幕| 婷婷色九月| 美国十月色婷婷在线观看| 97碰碰九九视频| 丁香五月激情站| 婷色五月天| 久激情网| 天天色天天爱天天爱天天爱y| 又大又粗九一在线| 综合xx网| 伊人五月综合网| 亚洲欧美综合7777色婷婷| av在线免费网站| 久久色吧| 激情小说婷婷五月| 狠狠噪| 五月天全国最大成人网| 色综合久| 综合五月草| 婷婷色操| 激情五月综合第一页| 婷婷五月综合网| 丁香五月社区| 人人干人人操外国| 色综合色色色| 色噜久| 色激情五月| 97人人搞| 丁香五月香蕉| 亚洲操逼片| 婷婷六月啪啪| 色婷丁香五月| 熟女人妻一区二区三区免费看| 色9色| 亚洲无AV在线中文字幕| 丁香五月婷婷成人网| 婷婷激情五月呦呦| 色色色色色色色色色色色色色色,网站| 思思干精品| 79精品视频在线观看,| 97热九九| 在线视频另类| 综合97五月| 国产肥白大熟妇BBBB视频| www.伊人天堂偷偷婷婷| 久草丁香婷婷1024| 99精品小视频| 97日在线视频| 九九久久综合| 99r久久这里只有精品| 国产3p露脸普通话对白| 热99热9| 丁香五月婷婷欧美成人色图| 婷婷五月在线观看| 五月婷婷综合激情网| 啪啪啪大香蕉| 天天插天天干天天舔| 丁香五月伊人| 99精品视频在线观看| 亚洲精品无码久久| 久久草大香蕉| 成人国产欧美大片一区| ss99热| 中文字幕人妻AV| 婷婷午夜激情| 色五月丁香总合网| av大片在线| 久久久久人妻网址| 久久综合干| 欧美日本日韩| 五月丁香啪啪伦理电影| 婷婷丁香九月| 色婷婷丁香五月| http://www.sd-xiangsu.com/| 亚洲综合一区二区| 天天操夜夜操| 色色色色色爱| 色婷婷久久天天性爱| 久久99网站| 99日这里只有精品| 日韩色五月| 这里只有精品视频在线| 夜丁香五月婷婷| 色综合色五月| 久99999热视频在线观看免费| 丁香五月天在线观看| 9999久久久久| 激婷网| 99超级碰碰| 六月综和久久| 久久 中文 日本| 天天天天干| 久久久精品色| 、激情六月天| 天天操天天插天天射| 久久99视频| 婷婷五月丁香久久| 色综合久久综合中文综合网| 欧美日韩精品人妻狠狠躁免费视频 | 日日干日日色| 五月天怕怕| 99热18| 激情五月五月婷婷| 国产永久一二一起草| 日本天堂久久| 五月婷久久| 五月花在线观看视频| 99色6爱9热| 欧美人人超级碰| 免费视频无码| 色婷婷五月天成人网| 午夜精品777| 色伊人婷婷| 五月 婷 久| 99色热| 久久婷婷亚洲| 色高清无码视频| 婷婷综合网站| 午夜九九九九九九| 中文字幕无码人妻少妇免费视频| 五月婷婷六月丁香五月| 思思热性操| 色九网| 欧美日韩中国| 丁香五月花| www.zbzhongsen.com| 色色网五月激情| 丁香六月 婷婷六月| 九九热在线99| 中文字幕操比影片| 91色久| 人妻激情综合| 99热免费精品| 婷婷丁香五月天在线视频| 91AV婷婷| 色yeye色综合| 日韩成人不卡| 天天日天天摸| 午夜丁香综合婷婷| 日日舔夜夜操| 五月丁香WWW| 狠狠操综合| 亚洲av无码精品色午夜| 新激情五月天| h在线看免费版在线看| 久久婷婷综合网| 婷婷操婷婷干婷婷射| 激情影院免费视频婷婷五月天| 免费九九热| 婷婷九月综合| 888久久久| 五月天丁香久久综合| 六月丁香啪啪| 伊人91| 国産精品| WWW,五月| 九九在线精点品|