Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
qianlong66
uni-app
提交
f102d8c3
U
uni-app
项目概览
qianlong66
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f102d8c3
编写于
7月 02, 2021
作者:
fxy060608
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
wip(app): uni-app-plus
上级
1e6f6be8
变更
19
隐藏空白更改
内联
并排
Showing
19 changed file
with
23906 addition
and
19697 deletion
+23906
-19697
packages/uni-app-plus/__tests__/service/dom/dom.spec.ts
packages/uni-app-plus/__tests__/service/dom/dom.spec.ts
+11
-10
packages/uni-app-plus/__tests__/service/index.spec.ts
packages/uni-app-plus/__tests__/service/index.spec.ts
+1
-1
packages/uni-app-plus/dist/uni-app-view.umd.js
packages/uni-app-plus/dist/uni-app-view.umd.js
+133
-0
packages/uni-app-plus/src/PageAction.ts
packages/uni-app-plus/src/PageAction.ts
+14
-15
packages/uni-app-plus/src/service/framework/page/define.ts
packages/uni-app-plus/src/service/framework/page/define.ts
+2
-2
packages/uni-app-plus/src/view/framework/subscriber/vdom/index.ts
.../uni-app-plus/src/view/framework/subscriber/vdom/index.ts
+24
-0
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeCreate.ts
...p-plus/src/view/framework/subscriber/vdom/onNodeCreate.ts
+6
-0
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeInsert.ts
...p-plus/src/view/framework/subscriber/vdom/onNodeInsert.ts
+25
-0
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeRemove.ts
...p-plus/src/view/framework/subscriber/vdom/onNodeRemove.ts
+1
-0
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeRemoveAttr.ts
...us/src/view/framework/subscriber/vdom/onNodeRemoveAttr.ts
+1
-0
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeSetAttr.ts
...-plus/src/view/framework/subscriber/vdom/onNodeSetAttr.ts
+1
-0
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeSetText.ts
...-plus/src/view/framework/subscriber/vdom/onNodeSetText.ts
+1
-0
packages/uni-app-plus/src/view/framework/subscriber/vdom/utils.ts
.../uni-app-plus/src/view/framework/subscriber/vdom/utils.ts
+18
-0
packages/uni-app-vue/dist/service.runtime.esm.js
packages/uni-app-vue/dist/service.runtime.esm.js
+12327
-9689
packages/uni-app-vue/dist/view.runtime.esm.js
packages/uni-app-vue/dist/view.runtime.esm.js
+11337
-9976
packages/uni-shared/dist/uni-shared.cjs.js
packages/uni-shared/dist/uni-shared.cjs.js
+1
-1
packages/uni-shared/dist/uni-shared.d.ts
packages/uni-shared/dist/uni-shared.d.ts
+1
-1
packages/uni-shared/dist/uni-shared.es.js
packages/uni-shared/dist/uni-shared.es.js
+1
-1
packages/uni-shared/src/vdom/decode.ts
packages/uni-shared/src/vdom/decode.ts
+1
-1
未找到文件。
packages/uni-app-plus/__tests__/service/dom/dom.spec.ts
浏览文件 @
f102d8c3
import
{
UniNodeJSON
}
from
'
@dcloudio/uni-shared
'
import
{
ACTION_TYPE_INSERT
,
ACTION_TYPE_REMOVE
,
ACTION_TYPE_REMOVE_ATTRIBUTE
,
ACTION_TYPE_SET_ATTRIBUTE
,
ACTION_TYPE_SET_TEXT
,
createPageNode
,
InsertAction
,
SetAttributeAction
,
}
from
'
../../../src/service/framework/dom/Page
'
import
{
createPageNode
}
from
'
../../../src/service/framework/dom/Page
'
import
{
createElement
,
createTextNode
,
}
from
'
../../../../uni-app-vue/lib/service.runtime.esm
'
import
{
InsertAction
,
ACTION_TYPE_INSERT
,
SetAttributeAction
,
ACTION_TYPE_SET_ATTRIBUTE
,
ACTION_TYPE_REMOVE_ATTRIBUTE
,
ACTION_TYPE_SET_TEXT
,
ACTION_TYPE_REMOVE
,
}
from
'
../../../src/PageAction
'
describe
(
'
dom
'
,
()
=>
{
const
pageId
=
1
const
root
=
createPageNode
(
pageId
,
{
route
:
'
pages/index/index
'
,
version
:
1
,
locale
:
'
zh_CN
'
,
disableScroll
:
false
,
...
...
packages/uni-app-plus/__tests__/service/index.spec.ts
浏览文件 @
f102d8c3
...
...
@@ -11,6 +11,7 @@ import {
import
{
createPageNode
}
from
'
../../src/service/framework/dom/Page
'
const
defaultPageNodeOptions
=
{
route
:
'
pages/index/index
'
,
version
:
1
,
locale
:
'
zh_CN
'
,
disableScroll
:
false
,
...
...
@@ -55,7 +56,6 @@ describe('vue', () => {
}
const
pageNode
=
createPageNode
(
1
,
defaultPageNodeOptions
,
true
)
createApp
(
Page
).
mount
(
pageNode
as
unknown
as
Element
)
pageNode
.
mounted
()
show
.
value
=
false
handleClick
=
null
nextTick
(()
=>
{
...
...
packages/uni-app-plus/dist/uni-app-view.umd.js
浏览文件 @
f102d8c3
...
...
@@ -818,6 +818,84 @@
function
formatLog
(
module
,
...
args
)
{
return
`[
${
Date
.
now
()}
][
${
module
}
]\uFF1A
${
args
.
map
((
arg
)
=>
JSON
.
stringify
(
arg
)).
join
(
"
"
)}
`
;
}
const
ATTR_MAP
=
{
class
:
"
.c
"
,
style
:
"
.s
"
,
onClick
:
"
.e0
"
,
onChange
:
"
.e1
"
,
onInput
:
"
.e2
"
,
onLoad
:
"
.e3
"
,
onError
:
"
.e4
"
,
onTouchstart
:
"
.e5
"
,
onTouchmove
:
"
.e6
"
,
onTouchcancel
:
"
.e7
"
,
onTouchend
:
"
.e8
"
,
onLongpress
:
"
.e9
"
,
onTransitionend
:
"
.ea
"
,
onAnimationstart
:
"
.eb
"
,
onAnimationiteration
:
"
.ec
"
,
onAnimationend
:
"
.ed
"
,
onTouchforcechange
:
"
.ee
"
};
const
COMPONENT_MAP
=
{
VIEW
:
1
,
IMAGE
:
2
,
TEXT
:
3
,
"
#text
"
:
4
,
"
#comment
"
:
5
,
NAVIGATOR
:
6
,
FORM
:
7
,
BUTTON
:
8
,
INPUT
:
9
,
LABEL
:
10
,
RADIO
:
11
,
CHECKBOX
:
12
,
"
CHECKBOX-GROUP
"
:
13
,
AD
:
14
,
AUDIO
:
15
,
CAMERA
:
16
,
CANVAS
:
17
,
"
COVER-IMAGE
"
:
18
,
"
COVER-VIEW
"
:
19
,
EDITOR
:
20
,
"
FUNCTIONAL-PAGE-NAVIGATOR
"
:
21
,
ICON
:
22
,
"
RADIO-GROUP
"
:
23
,
"
LIVE-PLAYER
"
:
24
,
"
LIVE-PUSHER
"
:
25
,
MAP
:
26
,
"
MOVABLE-AREA
"
:
27
,
"
MOVABLE-VIEW
"
:
28
,
"
OFFICIAL-ACCOUNT
"
:
29
,
"
OPEN-DATA
"
:
30
,
PICKER
:
31
,
"
PICKER-VIEW
"
:
32
,
"
PICKER-VIEW-COLUMN
"
:
33
,
PROGRESS
:
34
,
"
RICH-TEXT
"
:
35
,
"
SCROLL-VIEW
"
:
36
,
SLIDER
:
37
,
SWIPER
:
38
,
"
SWIPER-ITEM
"
:
39
,
SWITCH
:
40
,
TEXTAREA
:
41
,
VIDEO
:
42
,
"
WEB-VIEW
"
:
43
};
const
DECODED_ATTR_MAP
=
/* @__PURE__ */
Object
.
keys
(
ATTR_MAP
).
reduce
((
map
,
name
)
=>
{
map
[
ATTR_MAP
[
name
]]
=
name
;
return
map
;
},
Object
.
create
(
null
));
function
decodeAttr
(
name
)
{
return
DECODED_ATTR_MAP
[
name
]
||
name
;
}
const
DECODED_COMPONENT_ARR
=
/* @__PURE__ */
Object
.
keys
(
COMPONENT_MAP
).
reduce
((
arr
,
name
)
=>
{
arr
.
push
(
name
.
toLowerCase
());
return
arr
;
},
[
""
]);
function
decodeTag
(
tag
)
{
return
DECODED_COMPONENT_ARR
[
tag
]
||
tag
;
}
const
E
=
function
()
{
};
E
.
prototype
=
{
...
...
@@ -2593,6 +2671,49 @@
}
const
ACTION_TYPE_PAGE_CREATE
=
1
;
const
ACTION_TYPE_PAGE_CREATED
=
2
;
const
ACTION_TYPE_CREATE
=
3
;
const
ACTION_TYPE_INSERT
=
4
;
const
ACTION_TYPE_REMOVE
=
5
;
const
ACTION_TYPE_SET_ATTRIBUTE
=
6
;
const
ACTION_TYPE_REMOVE_ATTRIBUTE
=
7
;
const
ACTION_TYPE_SET_TEXT
=
8
;
const
elements
=
new
Map
();
function
$
(
id
)
{
return
elements
.
get
(
id
);
}
function
createElement
(
id
,
tag
)
{
const
element
=
document
.
createElement
(
decodeTag
(
tag
));
elements
.
set
(
id
,
element
);
return
element
;
}
function
setElementAttr
(
element
,
name
,
value
)
{
element
.
setAttribute
(
decodeAttr
(
name
),
value
);
}
function
onNodeCreate
(
id
,
tag
)
{
return
createElement
(
id
,
decodeTag
(
tag
));
}
function
onNodeInsert
(
nodeId
,
parentNodeId
,
refNodeId
,
nodeJson
)
{
const
element
=
$
(
nodeId
);
$
(
parentNodeId
).
insertBefore
(
initElement
(
element
,
nodeJson
),
$
(
refNodeId
));
}
function
initElement
(
element
,
{
a
,
s
})
{
initAttribute
(
element
,
a
);
return
element
;
}
function
initAttribute
(
element
,
attr
)
{
if
(
!
attr
)
{
return
;
}
Object
.
keys
(
attr
).
forEach
((
name
)
=>
setElementAttr
(
element
,
name
,
attr
[
name
]));
}
function
onNodeRemove
(
nodeId
,
parentNodeId
)
{
}
function
onNodeRemoveAttr
(
nodeId
,
name
)
{
}
function
onNodeSetAttr
(
nodeId
,
name
,
value
)
{
}
function
onNodeSetText
(
nodeId
,
text
)
{
}
function
onPageCreate
({
route
,
disableScroll
,
...
...
@@ -2648,6 +2769,18 @@
return
onPageCreate
(
action
[
1
]);
case
ACTION_TYPE_PAGE_CREATED
:
return
onPageCreated
();
case
ACTION_TYPE_CREATE
:
return
onNodeCreate
(
action
[
1
],
action
[
2
]);
case
ACTION_TYPE_INSERT
:
return
onNodeInsert
(
action
[
1
],
action
[
2
],
action
[
3
],
action
[
4
]);
case
ACTION_TYPE_REMOVE
:
return
onNodeRemove
(
action
[
1
],
action
[
2
]);
case
ACTION_TYPE_SET_ATTRIBUTE
:
return
onNodeSetAttr
(
action
[
1
],
action
[
2
],
action
[
3
]);
case
ACTION_TYPE_REMOVE_ATTRIBUTE
:
return
onNodeRemoveAttr
(
action
[
1
],
action
[
2
]);
case
ACTION_TYPE_SET_TEXT
:
return
onNodeSetText
(
action
[
1
],
action
[
2
]);
}
});
}
...
...
packages/uni-app-plus/src/PageAction.ts
浏览文件 @
f102d8c3
import
{
onNodeCreate
}
from
'
./view/framework/subscriber/vdom/onNodeCreate
'
import
{
onNodeInsert
}
from
'
./view/framework/subscriber/vdom/onNodeInsert
'
import
{
onNodeRemove
}
from
'
./view/framework/subscriber/vdom/onNodeRemove
'
import
{
onNodeRemoveAttr
}
from
'
./view/framework/subscriber/vdom/onNodeRemoveAttr
'
import
{
onNodeSetAttr
}
from
'
./view/framework/subscriber/vdom/onNodeSetAttr
'
import
{
onNodeSetText
}
from
'
./view/framework/subscriber/vdom/onNodeSetText
'
export
const
ACTION_TYPE_PAGE_CREATE
=
1
export
const
ACTION_TYPE_PAGE_CREATED
=
2
export
const
ACTION_TYPE_CREATE
=
3
...
...
@@ -27,40 +34,32 @@ export type PageCreatedAction = [typeof ACTION_TYPE_PAGE_CREATED]
export
type
CreateAction
=
[
typeof
ACTION_TYPE_CREATE
,
number
,
// nodeId
string
|
number
//nodeName
...
Parameters
<
typeof
onNodeCreate
>
]
export
type
InsertAction
=
[
typeof
ACTION_TYPE_INSERT
,
number
,
// nodeId
number
,
// parentNodeId
number
,
// index
Record
<
string
,
any
>
// Element JSON
...
Parameters
<
typeof
onNodeInsert
>
]
export
type
RemoveAction
=
[
typeof
ACTION_TYPE_REMOVE
,
number
,
// nodeId
number
// parentNodeId
...
Parameters
<
typeof
onNodeRemove
>
]
export
type
SetAttributeAction
=
[
typeof
ACTION_TYPE_SET_ATTRIBUTE
,
number
,
// nodeId
string
,
// attribute name
unknown
// attribute value
...
Parameters
<
typeof
onNodeSetAttr
>
]
export
type
RemoveAttributeAction
=
[
typeof
ACTION_TYPE_REMOVE_ATTRIBUTE
,
number
,
// nodeId
string
// attribute name
...
Parameters
<
typeof
onNodeRemoveAttr
>
]
export
type
SetTextAction
=
[
typeof
ACTION_TYPE_SET_TEXT
,
number
,
// nodeId
string
// text content
...
Parameters
<
typeof
onNodeSetText
>
]
export
type
PageUpdateAction
=
...
...
packages/uni-app-plus/src/service/framework/page/define.ts
浏览文件 @
f102d8c3
import
{
once
}
from
'
@dcloudio/uni-shared
'
import
{
createApp
,
d
efineComponent
}
from
'
vue
'
import
{
createApp
,
D
efineComponent
}
from
'
vue
'
import
{
createPageNode
}
from
'
../dom/Page
'
import
{
setupPage
}
from
'
./setup
'
import
__vuePlugin
from
'
../plugin
'
import
{
PageNodeOptions
}
from
'
../../../PageAction
'
export
type
VueComponent
=
ReturnType
<
typeof
defineComponent
>
export
type
VueComponent
=
DefineComponent
const
pagesMap
=
new
Map
<
string
,
ReturnType
<
typeof
createFactory
>>
()
...
...
packages/uni-app-plus/src/view/framework/subscriber/vdom/index.ts
浏览文件 @
f102d8c3
import
{
ACTION_TYPE_CREATE
,
ACTION_TYPE_INSERT
,
ACTION_TYPE_PAGE_CREATE
,
ACTION_TYPE_PAGE_CREATED
,
ACTION_TYPE_REMOVE
,
ACTION_TYPE_REMOVE_ATTRIBUTE
,
ACTION_TYPE_SET_ATTRIBUTE
,
ACTION_TYPE_SET_TEXT
,
PageAction
,
}
from
'
../../../../PageAction
'
import
{
onNodeCreate
}
from
'
./onNodeCreate
'
import
{
onNodeInsert
}
from
'
./onNodeInsert
'
import
{
onNodeRemove
}
from
'
./onNodeRemove
'
import
{
onNodeRemoveAttr
}
from
'
./onNodeRemoveAttr
'
import
{
onNodeSetAttr
}
from
'
./onNodeSetAttr
'
import
{
onNodeSetText
}
from
'
./onNodeSetText
'
import
{
onPageCreate
}
from
'
./onPageCreate
'
import
{
onPageCreated
}
from
'
./onPageCreated
'
...
...
@@ -13,6 +25,18 @@ export function onVdSync(actions: PageAction[]) {
return
onPageCreate
(
action
[
1
])
case
ACTION_TYPE_PAGE_CREATED
:
return
onPageCreated
()
case
ACTION_TYPE_CREATE
:
return
onNodeCreate
(
action
[
1
],
action
[
2
])
case
ACTION_TYPE_INSERT
:
return
onNodeInsert
(
action
[
1
],
action
[
2
],
action
[
3
],
action
[
4
])
case
ACTION_TYPE_REMOVE
:
return
onNodeRemove
(
action
[
1
],
action
[
2
])
case
ACTION_TYPE_SET_ATTRIBUTE
:
return
onNodeSetAttr
(
action
[
1
],
action
[
2
],
action
[
3
])
case
ACTION_TYPE_REMOVE_ATTRIBUTE
:
return
onNodeRemoveAttr
(
action
[
1
],
action
[
2
])
case
ACTION_TYPE_SET_TEXT
:
return
onNodeSetText
(
action
[
1
],
action
[
2
])
}
})
}
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeCreate.ts
0 → 100644
浏览文件 @
f102d8c3
import
{
decodeTag
}
from
'
@dcloudio/uni-shared
'
import
{
createElement
}
from
'
./utils
'
export
function
onNodeCreate
(
id
:
number
,
tag
:
string
|
number
)
{
return
createElement
(
id
,
decodeTag
(
tag
))
}
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeInsert.ts
0 → 100644
浏览文件 @
f102d8c3
import
{
UniNodeJSON
}
from
'
@dcloudio/uni-shared
'
import
{
$
,
setElementAttr
}
from
'
./utils
'
export
function
onNodeInsert
(
nodeId
:
number
,
parentNodeId
:
number
,
refNodeId
:
number
,
nodeJson
:
Partial
<
UniNodeJSON
>
)
{
const
element
=
$
(
nodeId
)
$
(
parentNodeId
).
insertBefore
(
initElement
(
element
,
nodeJson
),
$
(
refNodeId
))
}
function
initElement
(
element
:
Element
,
{
a
,
s
}:
Partial
<
UniNodeJSON
>
)
{
initAttribute
(
element
,
a
)
// TODO style
return
element
}
function
initAttribute
(
element
:
Element
,
attr
?:
Record
<
string
,
unknown
>
)
{
if
(
!
attr
)
{
return
}
Object
.
keys
(
attr
).
forEach
((
name
)
=>
setElementAttr
(
element
,
name
,
attr
[
name
]))
}
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeRemove.ts
0 → 100644
浏览文件 @
f102d8c3
export
function
onNodeRemove
(
nodeId
:
number
,
parentNodeId
:
number
)
{}
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeRemoveAttr.ts
0 → 100644
浏览文件 @
f102d8c3
export
function
onNodeRemoveAttr
(
nodeId
:
number
,
name
:
string
)
{}
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeSetAttr.ts
0 → 100644
浏览文件 @
f102d8c3
export
function
onNodeSetAttr
(
nodeId
:
number
,
name
:
string
,
value
:
unknown
)
{}
packages/uni-app-plus/src/view/framework/subscriber/vdom/onNodeSetText.ts
0 → 100644
浏览文件 @
f102d8c3
export
function
onNodeSetText
(
nodeId
:
number
,
text
:
string
)
{}
packages/uni-app-plus/src/view/framework/subscriber/vdom/utils.ts
0 → 100644
浏览文件 @
f102d8c3
import
{
decodeAttr
,
decodeTag
}
from
'
@dcloudio/uni-shared
'
const
elements
=
new
Map
<
number
,
Element
>
()
export
function
$
(
id
:
number
)
{
return
elements
.
get
(
id
)
!
}
export
function
createElement
(
id
:
number
,
tag
:
string
)
{
const
element
=
document
.
createElement
(
decodeTag
(
tag
))
elements
.
set
(
id
,
element
)
return
element
}
export
function
setElementAttr
(
element
:
Element
,
name
:
string
,
value
:
unknown
)
{
// TODO
element
.
setAttribute
(
decodeAttr
(
name
),
value
as
string
)
}
packages/uni-app-vue/dist/service.runtime.esm.js
浏览文件 @
f102d8c3
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
packages/uni-app-vue/dist/view.runtime.esm.js
浏览文件 @
f102d8c3
因为 它太大了无法显示 source diff 。你可以改为
查看blob
。
packages/uni-shared/dist/uni-shared.cjs.js
浏览文件 @
f102d8c3
...
...
@@ -789,7 +789,7 @@ const DECODED_COMPONENT_ARR = /*#__PURE__*/ Object.keys(COMPONENT_MAP).reduce((a
return
arr
;
},
[
''
]);
function
decodeTag
(
tag
)
{
return
DECODED_COMPONENT_ARR
[
tag
]
||
tag
;
return
(
DECODED_COMPONENT_ARR
[
tag
]
||
tag
)
;
}
function
cache
(
fn
)
{
...
...
packages/uni-shared/dist/uni-shared.d.ts
浏览文件 @
f102d8c3
...
...
@@ -45,7 +45,7 @@ export declare function decodeAttr(name: string): any;
export
declare
function
decodedQuery
(
query
?:
Record
<
string
,
any
>
):
Record
<
string
,
string
>
;
export
declare
function
decodeTag
(
tag
:
string
|
number
):
string
|
number
;
export
declare
function
decodeTag
(
tag
:
string
|
number
):
string
;
export
declare
const
defaultRpx2Unit
:
{
unit
:
string
;
...
...
packages/uni-shared/dist/uni-shared.es.js
浏览文件 @
f102d8c3
...
...
@@ -785,7 +785,7 @@ const DECODED_COMPONENT_ARR = /*#__PURE__*/ Object.keys(COMPONENT_MAP).reduce((a
return
arr
;
},
[
''
]);
function
decodeTag
(
tag
)
{
return
DECODED_COMPONENT_ARR
[
tag
]
||
tag
;
return
(
DECODED_COMPONENT_ARR
[
tag
]
||
tag
)
;
}
function
cache
(
fn
)
{
...
...
packages/uni-shared/src/vdom/decode.ts
浏览文件 @
f102d8c3
...
...
@@ -21,5 +21,5 @@ const DECODED_COMPONENT_ARR = /*#__PURE__*/ Object.keys(COMPONENT_MAP).reduce(
)
export
function
decodeTag
(
tag
:
string
|
number
)
{
return
DECODED_COMPONENT_ARR
[
tag
as
number
]
||
ta
g
return
(
DECODED_COMPONENT_ARR
[
tag
as
number
]
||
tag
)
as
strin
g
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录