拓?fù)鋱D編輯器-jsplumb基本配置

默認(rèn)配置

jsPlumb的配置項(xiàng)有很多,如果不主動(dòng)設(shè)置,jsPlumb就使用默認(rèn)配置。
建議不要修改默認(rèn)的配置,而是使用自定義的方式。

  • Anchor:錨點(diǎn),端點(diǎn)連接的位置
  • Anchors:多個(gè)錨點(diǎn),[源錨點(diǎn), 目標(biāo)錨點(diǎn)],默認(rèn)是 BottomCenter
  • Connector:連接線(比如:["Bezier", {curviness: 63}]為貝塞爾曲線)
  • ConnectionsDetachable:節(jié)點(diǎn)是否可以用鼠標(biāo)拖動(dòng)使其斷開,默認(rèn)為true。即用鼠標(biāo)連接上的連線,也可以使用鼠標(biāo)拖動(dòng)讓其斷開。設(shè)置成false,可以讓其拖動(dòng)也不會(huì)自動(dòng)斷開
  • Container: 容器
  • DoNotThrowErrors:當(dāng)錨點(diǎn)(Anchor)、端點(diǎn)(endPoint)和連接器(Connector)不存在的時(shí)候是否拋出異常
  • ConnectionOverlays:連接的覆蓋層
  • DragOptions:為被 jsPlumb.draggable 設(shè)置了拖拽的元素拖拽時(shí)設(shè)置的css樣式.eg:
    hoverClass: "dropHover",//釋放時(shí)指定鼠標(biāo)停留在該元素上使用的css class;
    activeClass: "dragActive"http://可拖動(dòng)的元素使用的css class
  • Endpoint: 端點(diǎn)的形狀定義,比如圓:[ "Dot", { radius:5 } ];正方形:Rectangle
  • Endpoints:設(shè)置了連接器的源和目標(biāo)端點(diǎn)的形狀,[源端點(diǎn), 目標(biāo)端點(diǎn)], 圓: [ [ "Dot", { radius:7 } ], [ "Dot", { radius:11 } ] ]
  • EndpointOverlays: 端點(diǎn)的覆蓋層
  • EndpointStyle:端點(diǎn)樣式
  • EndpointStyles:[源端點(diǎn)樣式,目標(biāo)端點(diǎn)樣式]
  • EndpointHoverStyle:端點(diǎn)的hover狀態(tài)樣式
  • EndpointHoverStyles: [源端點(diǎn)鼠標(biāo)hover樣式,目標(biāo)端點(diǎn)鼠標(biāo)hover樣式]
  • HoverPaintStyle:鼠標(biāo)經(jīng)過連接線時(shí)的樣式
  • LabelStyle: 標(biāo)簽樣式
  • LogEnabled:jsPlumb內(nèi)部日志是否開啟。
  • Overlays:連接線和端點(diǎn)的遮罩層樣式,裝飾連接器,如標(biāo)簽、箭頭等
  • MaxConnections:設(shè)置連接點(diǎn)最多可以連接幾條線,最大連接線數(shù)量默認(rèn)為1, 設(shè)置成-1可以表示無數(shù)個(gè)連接
  • PaintStyle:設(shè)置連線樣式
  • connectorStyle:設(shè)置連接線樣式
  • ReattachConnections:端點(diǎn)是否可以再次重新鏈接
  • RenderMode:渲染模式,默認(rèn)是svg
  • Scope:作用域,用來區(qū)分哪些端點(diǎn)可以鏈接,作用域相同的可以鏈接

錨點(diǎn)(Anchor)

1 . 錨位置:
jsPlumb有九個(gè)默認(rèn)錨點(diǎn)位置,可用于指定連接器連接到元素的位置:分別是元素的四個(gè)角,元素的中心以及元素每個(gè)邊的中點(diǎn):

  • Top (TopCenter)
  • TopRight
  • Right (RightMiddle)
  • BottomRight
  • Bottom (BottomCenter)
  • BottomLeft
  • Left (LeftMiddle)
  • TopLeft
  • Center
//定義一個(gè)底部中間的錨點(diǎn)位置
jsPlumb.connect({...., anchor:"Bottom", ... });

2、基于數(shù)組的語法[x,y,dx,dy]

  • x-相對(duì)該錨點(diǎn)在x軸坐標(biāo)比例(最大1)
  • y-相對(duì)該錨點(diǎn)y軸坐標(biāo)比例(最大1)
  • dx-控制錨的方向,x軸正向?yàn)?,負(fù)向?yàn)?1
  • dy-控制錨的方向,y軸正向?yàn)?,負(fù)向?yàn)?1

左上角為原點(diǎn),如圖:
image.png
//定義了一個(gè)在底部中間的錨點(diǎn)位置
jsPlumb.connect({...., anchor: [ 0.5, 1, 0, 1 ], ... });

除了提供錨點(diǎn)的位置和方向外,還可以選擇提供另外兩個(gè)參數(shù)來定義與給定位置的像素偏移量。這是上面指定的錨點(diǎn),但在y軸正方向有50像素偏移:

jsPlumb.connect({...., anchor:[ 0.5, 1, 0, 1, 0, 50 ], ... }); 

3、動(dòng)態(tài)錨
連線時(shí)錨點(diǎn)根據(jù)位置自動(dòng)調(diào)整到定義的數(shù)組里幾個(gè)點(diǎn)中最合適的位置
創(chuàng)建動(dòng)態(tài)錨點(diǎn)沒有特殊的語法,只需提供一系列單獨(dú)的靜態(tài)錨點(diǎn),例如:

var dynamicAnchors = [ [ 0.2, 0, 0, -1 ],  [ 1, 0.2, 1, 0 ], [ 0.8, 1, 0, 1 ], [ 0, 0.8, -1, 0 ] ];
jsPlumb.connect({...., anchor:dynamicAnchors, ... });

或者混合使用

var dynamicAnchors = [ [ 0.2, 0, 0, -1 ],  [ 1, 0.2, 1, 0 ], "Top", "Bottom" ];
jsPlumb.connect({...., anchor:dynamicAnchors, ... });
  • 默認(rèn)動(dòng)態(tài)錨點(diǎn)
    jsPlumb提供了動(dòng)態(tài)錨AutoDefault,選擇順序:Top,Right,Bottom和Left:
jsPlumb.connect({...., anchor:"AutoDefault", ... });

4、多邊形錨
不理解多邊形錨,可以參考jsplumb中的demo/perimeterAnchors,拖動(dòng)節(jié)點(diǎn)試一下效果

jsPlumb支持六種形狀:

  • Circle(圓)
  • Ellipse(橢圓)
  • Triangle(三角形)
  • Diamond(菱形)
  • Rectangle(矩形)
  • Square(正方形)
    (1) 單個(gè)多邊形
jsPlumb.addEndpoint("someElement", {
    endpoint:"Dot",
    anchor:[ "Perimeter", { shape:"Circle" } ]
});

如果節(jié)點(diǎn)的寬高一樣,該錨點(diǎn)位置為動(dòng)態(tài)圓周,寬高不同為橢圓。

默認(rèn)情況下,錨點(diǎn)個(gè)數(shù)為60,可以手動(dòng)指定:

jsPlumb.addEndpoint("someDiv", {
    endpoint:"Dot",
    anchor:[ "Perimeter", { shape:"Square", anchorCount:150 }]
});

(2) 組合錨點(diǎn)(三角形與菱形):

jsPlumb.connect({
    source:"someDiv",
    target:"someOtherDiv",
    endpoint:"Dot",
    anchors:[
        [ "Perimeter", { shape:"Triangle" } ],
        [ "Perimeter", { shape:"Diamond" } ]
    ]
});

(3) 自定義角度多邊形錨點(diǎn)

jsPlumb.connect({
    source:"someDiv",
    target:"someOtherDiv",
    endpoint:"Dot",
    anchors:[
        [ "Perimeter", { shape:"Triangle", rotation:25 } ],
        [ "Perimeter", { shape:"Triangle", rotation:-335 } ]
    ]
});

上面定義了兩個(gè)三角形旋轉(zhuǎn)不同角度得到的組合圖形。
旋轉(zhuǎn)適用帶角度的多邊形,該值必須以角度為單位,而不是弧度,并且數(shù)字可以是正數(shù)或負(fù)數(shù)

5、CSS類和錨點(diǎn)
錨點(diǎn)的不同位置可以有多種css樣式,那就要有不同的css類提供支持。

(1) 被寫入到錨點(diǎn)的CSS類和元素以jsPlumb實(shí)例的endpointAnchorClass為前綴,默認(rèn)為:

jtk-endpoint-anchor-
var ep = jsPlumb.addEndpoint("someDiv", {
  anchor:[0.5, 0, 0, -1, 0, 0, "top" ]
};

jsPlumb將會(huì)分配這個(gè)類給創(chuàng)建的 endpoint 和元素 someDiv:

jsplumb-endpoint-anchor-top

(2) 動(dòng)態(tài)錨的示例:

var ep = jsPlumb.addEndpoint("someDiv", {
  anchor:[
    [ 0.5, 0, 0, -1, 0, 0, "top" ],
    [ 1, 0.5, 1, 0, 0, 0, "right" ]
    [ 0.5, 1, 0, 1, 0, 0, "bottom" ]
    [ 0, 0.5, -1, 0, 0, 0, "left" ]
  ]
});

這里,分配給Endpoint和Element的類將在錨位置更改時(shí)循環(huán)顯示這些值:

jsplumb-endpoint-anchor-top
jsplumb-endpoint-anchor-right
jsplumb-endpoint-anchor-left
jsplumb-endpoint-anchor-bottom

注意,如果提供的類名由多個(gè)術(shù)語組成,則jsPlumb不會(huì)在該類中的每個(gè)術(shù)語前添加前綴:

var ep = jsPlumb.addEndpoint("someDiv", {
  anchor:[ 0.5, 0, 0, -1, 0, 0, "foo bar" ]
});

將導(dǎo)致將2個(gè)類添加到端點(diǎn)和元素:

jtk-endpoint-anchor-foo和bar

(3) 更改錨類前綴
與錨類一起使用的前綴為jsPlumb的endpointAnchorClass??梢栽趈sPlumb的某個(gè)實(shí)例上將其更改為喜歡的任何內(nèi)容:

jsPlumb.endpointAnchorClass = "anchor_";

或者

var jp = jsPlumb.getInstance();
jp.endpointAnchorClass = "anchor_";
連接器(Connectors)

jsPlumb提供了四種連接線:

  • straight(直線)
  • Bezier(貝塞爾曲線),默認(rèn)
  • flowchart(流程圖)
  • state machine(狀態(tài)機(jī))
straight

在兩個(gè)端點(diǎn)之間畫一條直線。 支持兩個(gè)參數(shù):
stub:可選,默認(rèn)為0px。此參數(shù)的任何正值將導(dǎo)致在與連接線的兩端產(chǎn)生一段不可改變方向的線段
gap:可選,默認(rèn)為0px。在連接線的一端和連接的元素之間指定一個(gè)間隙。

Bezier

貝塞爾提供了一個(gè)立方的貝塞爾曲線。 支持一個(gè)參數(shù):
curviness:可選,默認(rèn)為150px。 定義了曲線的彎曲程度。

flowchart

垂直或水平的連接線,支持四個(gè)參數(shù):
stub:可選,最小長(zhǎng)度,以像素為單位,最初的存根,源自一個(gè)端點(diǎn)。可以是整數(shù),指定了連接器的每個(gè)末端的存根,或是一個(gè)整數(shù)數(shù)組,指定[源, 目標(biāo)]端點(diǎn)的連接。默認(rèn)值為30像素的整數(shù)
alwaysRespectStubs:可選,默認(rèn)為false,此參數(shù)表示jsPlumb始終從每個(gè)端點(diǎn)繪制指定存根長(zhǎng)度,而不是比較兩個(gè)元素的存根
gap:可選,默認(rèn)為0像素。在連接線的一端和連接的元素之間指定一個(gè)間隙。
midpoint:可選,默認(rèn)為0.5。兩個(gè)元素之間的距離。
cornerRadius:默認(rèn)為0。此參數(shù)的正值將改變彎角的度數(shù)。

state machine

略微彎曲的線(實(shí)際上是二次Bezier曲線),類似于狀態(tài)機(jī)的連接器,支持三個(gè)參數(shù):
margin:可選,默認(rèn)為5。定義連接線開始/結(jié)束的元素的距離。
curviness:可選的,默認(rèn)為10,定義了曲線的彎曲程度。
proximityLimit:可選,默認(rèn)為80。 連接線的兩端之間的最小距離,它描繪為一條直線而非二次貝塞爾曲線。

端點(diǎn)(Endpoints)

端點(diǎn)是連接里的一個(gè)端點(diǎn)外觀和行為表現(xiàn)的集合,jsPlumb實(shí)現(xiàn)了四個(gè)端點(diǎn):

  • Dot(點(diǎn))
  • Rectangle(矩形)
  • Blank(空)
  • image(圖像)
創(chuàng)建端點(diǎn)

端點(diǎn)以多種不同方式創(chuàng)建:
(1) 調(diào)用jsPlumb.connect(..)并傳遞元素id或DOM元素作為源/目標(biāo),創(chuàng)建并分配新的端點(diǎn)

jsPlumb.connect({
  source: 'item_left',
  target: 'item_right',
  endpoint: 'Rectangle'
})

(2) 調(diào)用jsPlumb.addEndpoint(...)創(chuàng)建新的端點(diǎn)

jpInstance.addEndpoint("myDivId", EndpointConfig)

(3) 使用jsPlumb.makeSource(...)并隨后從該元素拖動(dòng)連接時(shí),將創(chuàng)建并分配新的端點(diǎn)

jsPlumb.makeSource("el1", {
  anchor:"Continuous",
  endpoint:["Rectangle", { width:40, height:20 }],  
  maxConnections:3
});
Dot

在屏幕上繪制一個(gè)點(diǎn),支持三個(gè)參數(shù):
radius:可選,默認(rèn)為10像素。 定義點(diǎn)的半徑
cssClass:可選,端點(diǎn)元素的CSS類
hoverClass: 可選,元素或連線的hover屬性樣式類

Rectangle

繪制一個(gè)矩形。 支持構(gòu)造函數(shù)參數(shù)有:
width:可選,默認(rèn)為20像素。定義矩形的寬度
height:可選,默認(rèn)為20像素。定義矩形的高
cssClass:可選,端點(diǎn)元素的CSS類
hoverClass:可選,元素或連線的hover屬性樣式類

Image

從一個(gè)指定的URL加載圖像,支持三個(gè)參數(shù):
src:圖片的url
cssClass:可選,端點(diǎn)元素的CSS類
hoverClass:可選,元素或連線的hover屬性樣式類

覆蓋(Overlays)

jsPlumb有五個(gè)類型的覆蓋:

  • Arrow(箭頭) :沿連接器某點(diǎn)繪制的可配置箭頭??梢钥刂萍^的長(zhǎng)度和寬度,'折返'點(diǎn) - 尾點(diǎn)折回的點(diǎn)和方向(允許值為1和-1; 1是默認(rèn)值,表示指向連接的方向)
  • Label(標(biāo)簽):在連接器的某個(gè)點(diǎn)上繪制的可配置標(biāo)簽
  • PlainArrow(平原箭頭):箭頭形狀為三角形,沒有折返
  • Diamond(鉆石):鉆石箭頭
  • Custom(自定義):可自定義DOM元素
位置

位置表明連接元素在連接線的位置,通常有三種表明方式:

  • [0 . . 1]范圍內(nèi)的小數(shù),表示沿連接器內(nèi)的比例。默認(rèn)值0.5,意味著連接器上的Overlay的默認(rèn)位置是沿連接器的一半
  • 大于1的整數(shù),表示從起點(diǎn)沿連接器行進(jìn)的一些絕對(duì)像素?cái)?shù)
  • 小于零的整數(shù),表示從終點(diǎn)沿連接器向后行進(jìn)的一些絕對(duì)像素?cái)?shù)

對(duì)于端點(diǎn),適用相同的原則,將位置指定為[x,y]數(shù)組
(1) 指定一個(gè)覆蓋在端點(diǎn)的中心位置:
location:[ 0.5, 0.5 ]

(2) 從左上角沿x軸疊加5像素
location: [ 5, 0 ]

(3) 從右下角沿x軸疊加5像素
location: [ -5, 0 ]

對(duì)于位置的操作,jsPlumb提供了兩個(gè)方法:

  • getLocation:返回當(dāng)前位置
  • setLocation:設(shè)置當(dāng)前位置,對(duì)于端點(diǎn),位置以[x,y]數(shù)組表示,其值與端點(diǎn)的寬度/高度成正比(0-1(包括0-1)的小數(shù))或絕對(duì)值(小數(shù)大于0)
添加覆蓋層

(1) jsPlumb.connect調(diào)用時(shí)
使用箭頭的默認(rèn)選項(xiàng)和帶有文本“foo”的標(biāo)簽創(chuàng)建一個(gè)箭頭

jsPlumb.connect({
  ...
  overlays:[ 
    "Arrow", 
      [ "Label", { label:"foo", location:0.25, id:"myLabel" } ]
    ],
  ...
});

這個(gè)連接將有一個(gè)位于中間的箭頭,位于四分之一的標(biāo)簽“foo”。注意id參數(shù),如果希望刪除覆蓋層或更改其可見性,可以在以后使用它

(2) jsPlumb.addEndpoint調(diào)用時(shí)
注:在addEndpoint 使用 connectorOverlays 代替 overlays,因?yàn)?overlays指向端點(diǎn)覆蓋。
此連接將有一個(gè)位于連接頭部的10x30箭頭,標(biāo)簽“foo”位于中間點(diǎn)。端點(diǎn)本身也有一個(gè)覆蓋,相對(duì)于端點(diǎn)的左上角位于[-0.5 *寬度,-0.5 *高度]

jsPlumb.addEndpoint("someDiv", {
  ...
  overlays:[
    [ "Label", { label:"foo", id:"label", location:[-0.5, -0.5] } ]
  ],
  connectorOverlays:[ 
    [ "Arrow", { width:10, length:30, location:1, id:"arrow" } ],
    [ "Label", { label:"foo", id:"label" } ]
  ],
  ...
});

(3) jsPlumb.makeSource調(diào)用
同樣使用 connectorOverlays,而且 makeSource 支持 endpoint 參數(shù)。
此連接將有10x30像素箭坐落在連接頭,標(biāo)簽“foo”位于中點(diǎn)。

jsPlumb.makeSource("someDiv", {
  ...
  endpoint:{
    connectorOverlays:[ 
      [ "Arrow", { width:10, length:30, location:1, id:"arrow" } ], 
      [ "Label", { label:"foo", id:"label" } ]
    ]
  }
  ...
});

注: jsPlumb.makeTarget調(diào)用時(shí)不能添加覆蓋層

(4) addOverlay調(diào)用
端點(diǎn)和連接都有一個(gè)addOverlay方法,它將一個(gè)Overlay定義作為參數(shù)

var e = jsPlumb.addEndpoint("someElement");
e.addOverlay([ "Arrow", { width:10, height:10, id:"arrow" }]); 
覆蓋類型

(1) Arrow(箭頭)
繪制一個(gè)箭頭,使用四個(gè)點(diǎn):頭部和兩個(gè)尾點(diǎn),以及一個(gè)foldback允許箭頭尾部縮進(jìn)的點(diǎn)。此Overlay的可用構(gòu)造函數(shù)參數(shù):

  • width: 箭頭尾部的寬度
  • length: 從箭頭尾部到頭部的距離
  • location: 在連線上的位置
  • direction: 指向,1(默認(rèn)值,表示向前,-1,表示向后
  • foldback: 沿著箭頭的軸線指向尾部折返的距離。默認(rèn)值為0.623
  • paintStyle: Endpoints 和 Connectors 的樣式對(duì)象

(2) PlainArrow
Arrow的foldback為1 的特殊實(shí)例,意味著箭頭的尾部是扁平。Arrow的所有構(gòu)造函數(shù)參數(shù)都適用于PlainArrow

(3) 鉆石
Arrow的foldback為2,意味著箭頭變成鉆石。Arrow的所有構(gòu)造函數(shù)參數(shù)都適用于Diamond。

(4) 標(biāo)簽
提供用于裝飾連接器的文本標(biāo)簽??捎玫臉?gòu)造函數(shù)參數(shù)是:

  • label : 顯示的文本。 可以提供一個(gè)函數(shù),而不是純文本:作為參數(shù)傳遞給Connection,應(yīng)該返回一個(gè)String
  • cssClass: 用于Label的可選css類。建議使用
  • labelStyle: 標(biāo)簽外觀的可選參數(shù)。 可用參數(shù)有:
    font: 適合Canvas元素的格式的字體字符串
    fillStyle: 標(biāo)簽的背景顏色填充,可選。
    color: 字體顏色,可選
    padding: 表示標(biāo)簽的寬度的比例,而不是px和ems。
    borderWidth: 標(biāo)簽的邊框?qū)挾?,默認(rèn)0
    borderStyle: 標(biāo)簽邊框的樣式,可選
  • location: 標(biāo)簽位置

標(biāo)簽覆蓋提供了兩個(gè)方法 getLabel 和 setLabel 用于動(dòng)態(tài)地get/set標(biāo)簽內(nèi)容:

var c = jsPlumb.connect({
  source:"d1", 
  target:"d2", 
  overlays:[
    [ "Label", {label:"FOO", id:"label"}]
  ] 
});

...

var label = c.getOverlay("label");
console.log("Label is currently", label.getLabel());
label.setLabel("BAR");
console.log("Label is now", label.getLabel());

標(biāo)簽被賦予一個(gè)id ‘label’,然后檢索這個(gè)id動(dòng)態(tài)設(shè)置lable的值。

Connections和Endpoints都支持Label Overlays,并且因?yàn)楦臉?biāo)簽是一種非常常見的操作,所以setLabel和getLabel方法已添加到這些對(duì)象中:

var conn = jsPlumb.connect({
  source:"d1", 
  target:"d2",
  label:"FOO"
});

...

console.log("Label is currently", conn.getLabel());
conn.setLabel("BAR");
console.log("Label is now", conn.getLabel());

這些方法支持傳入Function而不是String,如果在調(diào)用setLabel時(shí),jsPlumb將為您創(chuàng)建一個(gè)標(biāo)簽覆蓋:

var conn = jsPlumb.connect({
  source:"d1", 
  target:"d2"
});                 

...

conn.setLabel(function(c) {
  var s = new Date();
  return s.getTime() + "milliseconds have elapsed since 01/01/1970";
});
console.log("Label is now", conn.getLabel());

(5) Custom(自定義)
jsPlumb允許自定義OverLays,只需要實(shí)現(xiàn) create(component):
自定義覆蓋允許創(chuàng)建自己的覆蓋層,jsPlumb將為您定位。只需要實(shí)現(xiàn)一個(gè)方法 - create(component):

var conn = jsPlumb.connect({
  source:"d1",
  target:"d2",
  paintStyle:{
    stroke:"red",
    strokeWidth:3
  },
  overlays:[
    ["Custom", {
      create:function(component) {
        return $("<select id='myDropDown'><option value='foo'>foo</option><option value='bar'>bar</option></select>");                
      },
      location:0.7,
      id:"customOverlay"
    }]
  ]
});

此處的id為 customeOverlay,可以在 Connection 或者 Endpoint上使用 getOverlay(id) 方法。

隱藏/顯示覆蓋層

可以使用 setVisible 方法控制 Overlays 的顯示屬性,或者在一個(gè)連接上使用 showOverlay(id)hideOverlay(id)。
(1) 使用id

var connection = jsPlumb.connect({
  ...
  overlays:[ 
    "Arrow", 
    [ "Label", { label:"foo", location:0.25, id:"myLabel" } ]
  ],
  ...
});

// time passes
var overlay = connection.getOverlay("myLabel");
// now you can hide this Overlay:
overlay.setVisible(false);
// there are also hide/show methods:
overlay.show();
overlay.hide();

(2) 使用 showOverlay(id)hideOverlay(id)
Connection 和 Endpoint 可以使用showOverlay(id) 和 hideOverlay(id):

var connection = jsPlumb.connect({
  ...
  overlays:[ 
    "Arrow", 
    [ "Label", { label:"foo", location:-30 , id:"myLabel" }]
  ],
  ...
});

// time passes
connection.hideOverlay("myLabel");

// more time passes
connection.showOverlay("myLabel");
刪除 Overlays

Connection和Endpoint有一個(gè)removeOverlay方法,可以刪除覆蓋

var connection = jsPlumb.connect({
  ...
  overlays:[ 
    "Arrow", 
    [ "Label", { label:"foo", location:0.25 , id:"myLabel"} ]
  ],
  ...
});     

// time passes
connection.removeOverlay("myLabel");

參考:
http://jsplumb.github.io/jsplumb/overlays.html
http://www.itdecent.cn/p/0e7bb5c081c8

下一篇:拓?fù)鋱D編輯器-jsplum連接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容