Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
clx-fluwx
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
openSourceLibrary
clx-fluwx
Commits
a5cc5f33
提交
a5cc5f33
authored
8月 13, 2018
作者:
JarvanMo
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
share iamge & music
上级
9ed90582
显示空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
217 行增加
和
45 行删除
+217
-45
WechatPluginKeys.java
.../com/jarvanmo/wechatplugin/constant/WechatPluginKeys.java
+2
-0
WeChatPluginHandler.kt
.../com/jarvanmo/wechatplugin/handler/WeChatPluginHandler.kt
+27
-35
ShareImageUtil.java
...otlin/com/jarvanmo/wechatplugin/utils/ShareImageUtil.java
+79
-0
WeChatThumbnailUtil.java
.../com/jarvanmo/wechatplugin/utils/WeChatThumbnailUtil.java
+63
-8
wechat_share_models.dart
lib/src/wechat_share_models.dart
+41
-2
wechat_plugin.dart
lib/wechat_plugin.dart
+5
-0
没有找到文件。
android/src/main/kotlin/com/jarvanmo/wechatplugin/constant/WechatPluginKeys.java
浏览文件 @
a5cc5f33
...
@@ -18,4 +18,6 @@ public class WechatPluginKeys {
...
@@ -18,4 +18,6 @@ public class WechatPluginKeys {
public
static
final
String
IMAGE
=
"image"
;
public
static
final
String
IMAGE
=
"image"
;
public
static
final
String
THUMBNAIL
=
"thumbnail"
;
public
static
final
String
THUMBNAIL
=
"thumbnail"
;
public
static
final
String
PACKAGE
=
"?package="
;
}
}
android/src/main/kotlin/com/jarvanmo/wechatplugin/handler/WeChatPluginHandler.kt
浏览文件 @
a5cc5f33
package
com.jarvanmo.wechatplugin.handler
package
com.jarvanmo.wechatplugin.handler
import
android.util.Log
import
com.jarvanmo.wechatplugin.WechatPlugin
import
com.jarvanmo.wechatplugin.constant.CallResult
import
com.jarvanmo.wechatplugin.constant.CallResult
import
com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema
import
com.jarvanmo.wechatplugin.constant.WeChatPluginMethods
import
com.jarvanmo.wechatplugin.constant.WeChatPluginMethods
import
com.jarvanmo.wechatplugin.constant.WechatPluginKeys
import
com.jarvanmo.wechatplugin.constant.WechatPluginKeys
import
com.jarvanmo.wechatplugin.utils.AssetManagerUtil
import
com.jarvanmo.wechatplugin.utils.ShareImageUtil
import
com.jarvanmo.wechatplugin.utils.FileUtil
import
com.jarvanmo.wechatplugin.utils.WeChatThumbnailUtil
import
com.jarvanmo.wechatplugin.utils.WeChatThumbnailUtil
import
com.tencent.mm.opensdk.modelbase.BaseResp
import
com.tencent.mm.opensdk.modelbase.BaseResp
import
com.tencent.mm.opensdk.modelmsg.*
import
com.tencent.mm.opensdk.modelmsg.*
...
@@ -15,7 +11,6 @@ import com.tencent.mm.opensdk.openapi.IWXAPI
...
@@ -15,7 +11,6 @@ import com.tencent.mm.opensdk.openapi.IWXAPI
import
io.flutter.plugin.common.MethodCall
import
io.flutter.plugin.common.MethodCall
import
io.flutter.plugin.common.MethodChannel
import
io.flutter.plugin.common.MethodChannel
import
io.flutter.plugin.common.PluginRegistry
import
io.flutter.plugin.common.PluginRegistry
import
java.io.File
/***
/***
...
@@ -106,21 +101,20 @@ object WeChatPluginHandler {
...
@@ -106,21 +101,20 @@ object WeChatPluginHandler {
private
fun
shareImage
(
call
:
MethodCall
,
result
:
MethodChannel
.
Result
)
{
private
fun
shareImage
(
call
:
MethodCall
,
result
:
MethodChannel
.
Result
)
{
val
imagePath
=
call
.
argument
<
String
>(
WechatPluginKeys
.
IMAGE
)
val
imagePath
=
call
.
argument
<
String
>(
WechatPluginKeys
.
IMAGE
)
val
imgObj
=
createWxImageObject
(
imagePath
)
val
byteArray
=
ShareImageUtil
.
getImageData
(
registrar
,
imagePath
)
val
imgObj
=
if
(
byteArray
!=
null
){
WXImageObject
(
byteArray
)
}
else
{
null
}
if
(
imgObj
==
null
)
{
if
(
imgObj
==
null
)
{
result
.
error
(
CallResult
.
RESULT_FILE_NOT_EXIST
,
CallResult
.
RESULT_FILE_NOT_EXIST
,
imagePath
)
result
.
error
(
CallResult
.
RESULT_FILE_NOT_EXIST
,
CallResult
.
RESULT_FILE_NOT_EXIST
,
imagePath
)
return
return
}
}
// val bmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_img)
// val imgObj = WXImageObject(bmp)
//
val
msg
=
WXMediaMessage
()
val
msg
=
WXMediaMessage
()
msg
.
mediaObject
=
imgObj
msg
.
mediaObject
=
imgObj
//
// val thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true)
// bmp.recycle()
msg
.
thumbData
=
WeChatThumbnailUtil
.
thumbnailForCommon
(
call
.
argument
(
WechatPluginKeys
.
THUMBNAIL
),
registrar
)
msg
.
thumbData
=
WeChatThumbnailUtil
.
thumbnailForCommon
(
call
.
argument
(
WechatPluginKeys
.
THUMBNAIL
),
registrar
)
//
//
val
req
=
SendMessageToWX
.
Req
()
val
req
=
SendMessageToWX
.
Req
()
...
@@ -130,25 +124,25 @@ object WeChatPluginHandler {
...
@@ -130,25 +124,25 @@ object WeChatPluginHandler {
result
.
success
(
true
)
result
.
success
(
true
)
}
}
private
fun
createWxImageObject
(
imagePath
:
String
):
WXImageObject
?{
//
private fun createWxImageObject(imagePath:String):WXImageObject?{
var
imgObj
:
WXImageObject
?
=
null
//
var imgObj: WXImageObject? = null
var
imageFile
:
File
?
=
null
//
var imageFile:File? = null
if
(
imagePath
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
)){
//
if (imagePath.startsWith(WeChatPluginImageSchema.SCHEMA_ASSETS)){
val
key
=
imagePath
.
substring
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
.
length
,
imagePath
.
length
)
//
val key = imagePath.substring(WeChatPluginImageSchema.SCHEMA_ASSETS.length, imagePath.length)
val
assetFileDescriptor
=
AssetManagerUtil
.
openAsset
(
registrar
,
key
,
""
)
//
val assetFileDescriptor = AssetManagerUtil.openAsset(registrar,key,"")
imageFile
=
FileUtil
.
createTmpFile
(
assetFileDescriptor
)
//
imageFile = FileUtil.createTmpFile(assetFileDescriptor)
}
else
if
(
imagePath
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_FILE
)){
//
}else if (imagePath.startsWith(WeChatPluginImageSchema.SCHEMA_FILE)){
imageFile
=
File
(
imagePath
)
//
imageFile = File(imagePath)
}
//
}
if
(
imageFile
!=
null
&&
imageFile
.
exists
()){
//
if(imageFile != null && imageFile.exists()){
imgObj
=
WXImageObject
()
//
imgObj = WXImageObject()
imgObj
.
setImagePath
(
imagePath
)
//
imgObj.setImagePath(imagePath)
}
else
{
//
}else{
Log
.
d
(
WechatPlugin
.
TAG
,
CallResult
.
RESULT_FILE_NOT_EXIST
)
//
Log.d(WechatPlugin.TAG,CallResult.RESULT_FILE_NOT_EXIST)
}
//
}
//
return
imgObj
//
return imgObj
}
//
}
fun
onResp
(
resp
:
BaseResp
)
{
fun
onResp
(
resp
:
BaseResp
)
{
val
result
=
mapOf
(
val
result
=
mapOf
(
"errStr"
to
resp
.
errStr
,
"errStr"
to
resp
.
errStr
,
...
@@ -158,8 +152,6 @@ object WeChatPluginHandler {
...
@@ -158,8 +152,6 @@ object WeChatPluginHandler {
"openId"
to
resp
.
openId
"openId"
to
resp
.
openId
)
)
channel
?.
invokeMethod
(
WeChatPluginMethods
.
WE_CHAT_RESPONSE
,
result
)
channel
?.
invokeMethod
(
WeChatPluginMethods
.
WE_CHAT_RESPONSE
,
result
)
}
}
...
...
android/src/main/kotlin/com/jarvanmo/wechatplugin/utils/ShareImageUtil.java
0 → 100644
浏览文件 @
a5cc5f33
package
com
.
jarvanmo
.
wechatplugin
.
utils
;
import
android.content.res.AssetFileDescriptor
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema
;
import
com.jarvanmo.wechatplugin.constant.WechatPluginKeys
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
io.flutter.plugin.common.PluginRegistry
;
import
okhttp3.OkHttpClient
;
import
okhttp3.Request
;
import
okhttp3.Response
;
import
okhttp3.ResponseBody
;
public
class
ShareImageUtil
{
public
static
byte
[]
getImageData
(
PluginRegistry
.
Registrar
registrar
,
String
path
)
{
byte
[]
result
=
null
;
if
(
path
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
))
{
String
key
=
path
.
substring
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
.
length
(),
path
.
length
());
AssetFileDescriptor
fileDescriptor
=
AssetManagerUtil
.
openAsset
(
registrar
,
key
,
getPackage
(
key
));
try
{
InputStream
inputStream
=
fileDescriptor
.
createInputStream
();
result
=
streamToByteArray
(
inputStream
);
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
}
}
else
if
(
path
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_FILE
))
{
Bitmap
bmp
=
null
;
bmp
=
BitmapFactory
.
decodeFile
(
path
);
result
=
Util
.
bmpToByteArray
(
bmp
,
true
);
}
else
{
InputStream
inputStream
=
openStream
(
path
);
if
(
inputStream
!=
null
)
{
result
=
streamToByteArray
(
inputStream
);
}
}
return
result
;
}
private
static
byte
[]
streamToByteArray
(
InputStream
inputStream
){
Bitmap
bmp
=
null
;
bmp
=
BitmapFactory
.
decodeStream
(
inputStream
);
return
Util
.
bmpToByteArray
(
bmp
,
true
);
}
private
static
String
getPackage
(
String
assetsName
)
{
String
packageStr
=
null
;
if
(
assetsName
.
contains
(
WechatPluginKeys
.
PACKAGE
))
{
int
index
=
assetsName
.
indexOf
(
WechatPluginKeys
.
PACKAGE
);
packageStr
=
assetsName
.
substring
(
index
+
WechatPluginKeys
.
PACKAGE
.
length
(),
assetsName
.
length
());
}
return
packageStr
;
}
private
static
InputStream
openStream
(
String
url
){
OkHttpClient
okHttpClient
=
new
OkHttpClient
.
Builder
().
build
();
Request
request
=
new
Request
.
Builder
().
url
(
url
).
get
().
build
();
try
{
Response
response
=
okHttpClient
.
newCall
(
request
).
execute
();
ResponseBody
responseBody
=
response
.
body
();
if
(
response
.
isSuccessful
()
&&
responseBody
!=
null
){
return
responseBody
.
byteStream
();
}
else
{
return
null
;
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
}
android/src/main/kotlin/com/jarvanmo/wechatplugin/utils/WeChatThumbnailUtil.java
浏览文件 @
a5cc5f33
package
com
.
jarvanmo
.
wechatplugin
.
utils
;
package
com
.
jarvanmo
.
wechatplugin
.
utils
;
import
android.content.res.AssetFileDescriptor
;
import
android.content.res.AssetFileDescriptor
;
import
android.graphics.Bitmap
;
import
android.graphics.BitmapFactory
;
import
com.jarvanmo.wechatplugin.WechatPlugin
;
import
com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema
;
import
com.jarvanmo.wechatplugin.constant.WeChatPluginImageSchema
;
import
com.jarvanmo.wechatplugin.constant.WechatPluginKeys
;
import
java.io.File
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.net.URLConnection
;
import
java.security.Key
;
import
io.flutter.plugin.common.PluginRegistry
;
import
io.flutter.plugin.common.PluginRegistry
;
import
okhttp3.OkHttpClient
;
import
okhttp3.Request
;
import
okhttp3.Response
;
import
okhttp3.ResponseBody
;
import
okio.Okio
;
import
okio.Okio
;
import
okio.Source
;
import
okio.Source
;
...
@@ -20,17 +31,20 @@ public class WeChatThumbnailUtil {
...
@@ -20,17 +31,20 @@ public class WeChatThumbnailUtil {
public
static
byte
[]
thumbnailForMiniProgram
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
public
static
byte
[]
thumbnailForMiniProgram
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
byte
[]
result
=
null
;
byte
[]
result
=
null
;
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
))
{
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
))
{
result
=
fromAssetForMiniProgram
(
thumbnail
,
registrar
);
result
=
fromAssetForMiniProgram
(
thumbnail
,
registrar
);
}
else
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_FILE
))
{
}
else
{
}
}
return
result
;
return
result
;
}
}
private
static
byte
[]
fromAssetForMiniProgram
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
private
static
byte
[]
fromAssetForMiniProgram
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
){
byte
[]
result
=
null
;
byte
[]
result
=
null
;
String
key
=
thumbnail
.
substring
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
.
length
(),
thumbnail
.
length
());
String
key
=
thumbnail
.
substring
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
.
length
(),
thumbnail
.
length
());
AssetFileDescriptor
fileDescriptor
=
AssetManagerUtil
.
openAsset
(
registrar
,
key
,
""
);
AssetFileDescriptor
fileDescriptor
=
AssetManagerUtil
.
openAsset
(
registrar
,
key
,
getPackage
(
key
)
);
if
(
fileDescriptor
!=
null
&&
fileDescriptor
.
getLength
()
<=
128
*
1024
)
{
if
(
fileDescriptor
!=
null
&&
fileDescriptor
.
getLength
()
<=
128
*
1024
)
{
try
{
try
{
...
@@ -61,19 +75,32 @@ public class WeChatThumbnailUtil {
...
@@ -61,19 +75,32 @@ public class WeChatThumbnailUtil {
return
result
;
return
result
;
}
}
public
static
byte
[]
thumbnailForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
){
public
static
byte
[]
thumbnailForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
byte
[]
result
=
null
;
byte
[]
result
=
null
;
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
))
{
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
))
{
result
=
fromAssetForCommon
(
thumbnail
,
registrar
);
result
=
fromAssetForCommon
(
thumbnail
,
registrar
);
}
else
if
(
thumbnail
.
startsWith
(
WeChatPluginImageSchema
.
SCHEMA_FILE
))
{
Bitmap
bmp
=
BitmapFactory
.
decodeFile
(
thumbnail
);
Bitmap
thumbBmp
=
Bitmap
.
createScaledBitmap
(
bmp
,
COMMON_THUMB_SIZE
,
COMMON_THUMB_SIZE
,
true
);
bmp
.
recycle
();
result
=
Util
.
bmpToByteArray
(
thumbBmp
,
true
);
}
else
{
InputStream
input
=
openStream
(
thumbnail
);
if
(
input
!=
null
)
{
Bitmap
bmp
=
BitmapFactory
.
decodeStream
(
input
);
Bitmap
thumbBmp
=
Bitmap
.
createScaledBitmap
(
bmp
,
COMMON_THUMB_SIZE
,
COMMON_THUMB_SIZE
,
true
);
bmp
.
recycle
();
result
=
Util
.
bmpToByteArray
(
thumbBmp
,
true
);
}
}
}
return
result
;
return
result
;
}
}
private
static
byte
[]
fromAssetForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
){
private
static
byte
[]
fromAssetForCommon
(
String
thumbnail
,
PluginRegistry
.
Registrar
registrar
)
{
int
size
=
32
;
int
size
=
32
;
byte
[]
result
=
null
;
byte
[]
result
=
null
;
String
key
=
thumbnail
.
substring
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
.
length
(),
thumbnail
.
length
());
String
key
=
thumbnail
.
substring
(
WeChatPluginImageSchema
.
SCHEMA_ASSETS
.
length
(),
thumbnail
.
length
());
AssetFileDescriptor
fileDescriptor
=
AssetManagerUtil
.
openAsset
(
registrar
,
key
,
""
);
AssetFileDescriptor
fileDescriptor
=
AssetManagerUtil
.
openAsset
(
registrar
,
key
,
getPackage
(
key
)
);
if
(
fileDescriptor
!=
null
&&
fileDescriptor
.
getLength
()
<=
size
*
1024
)
{
if
(
fileDescriptor
!=
null
&&
fileDescriptor
.
getLength
()
<=
size
*
1024
)
{
try
{
try
{
...
@@ -107,4 +134,32 @@ public class WeChatThumbnailUtil {
...
@@ -107,4 +134,32 @@ public class WeChatThumbnailUtil {
// result = Util.bmpToByteArray(thumbBmp, true);
// result = Util.bmpToByteArray(thumbBmp, true);
return
result
;
return
result
;
}
}
private
static
String
getPackage
(
String
assetsName
)
{
String
packageStr
=
null
;
if
(
assetsName
.
contains
(
WechatPluginKeys
.
PACKAGE
))
{
int
index
=
assetsName
.
indexOf
(
WechatPluginKeys
.
PACKAGE
);
packageStr
=
assetsName
.
substring
(
index
+
WechatPluginKeys
.
PACKAGE
.
length
(),
assetsName
.
length
());
}
return
packageStr
;
}
private
static
InputStream
openStream
(
String
url
){
OkHttpClient
okHttpClient
=
new
OkHttpClient
.
Builder
().
build
();
Request
request
=
new
Request
.
Builder
().
url
(
url
).
get
().
build
();
try
{
Response
response
=
okHttpClient
.
newCall
(
request
).
execute
();
ResponseBody
responseBody
=
response
.
body
();
if
(
response
.
isSuccessful
()
&&
responseBody
!=
null
){
return
responseBody
.
byteStream
();
}
else
{
return
null
;
}
}
catch
(
IOException
e
)
{
e
.
printStackTrace
();
return
null
;
}
}
}
}
lib/src/wechat_share_models.dart
浏览文件 @
a5cc5f33
...
@@ -3,6 +3,9 @@ import 'package:wechat_plugin/src/wechat_scene.dart';
...
@@ -3,6 +3,9 @@ import 'package:wechat_plugin/src/wechat_scene.dart';
const
String
_scene
=
"scene"
;
const
String
_scene
=
"scene"
;
const
String
_transaction
=
"transaction"
;
const
String
_transaction
=
"transaction"
;
const
String
_thumbnail
=
"thumbnail"
;
const
String
_thumbnail
=
"thumbnail"
;
const
String
_title
=
"title"
;
const
String
_description
=
"description"
;
class
WeChatShareTextModel
{
class
WeChatShareTextModel
{
final
String
text
;
final
String
text
;
...
@@ -80,8 +83,7 @@ class WeChatShareImageModel {
...
@@ -80,8 +83,7 @@ class WeChatShareImageModel {
:
this
.
transaction
=
transaction
??
"text"
,
:
this
.
transaction
=
transaction
??
"text"
,
this
.
scene
=
scene
??
WeChatScene
.
TIMELINE
,
this
.
scene
=
scene
??
WeChatScene
.
TIMELINE
,
this
.
thumbnail
=
thumbnail
??
""
,
this
.
thumbnail
=
thumbnail
??
""
,
assert
(
image
!=
null
),
assert
(
image
!=
null
);
assert
(
thumbnail
!=
null
);
Map
toMap
()
{
Map
toMap
()
{
return
{
return
{
...
@@ -92,3 +94,40 @@ class WeChatShareImageModel {
...
@@ -92,3 +94,40 @@ class WeChatShareImageModel {
};
};
}
}
}
}
class
WeChatShareMusicModel
{
final
String
transaction
;
final
WeChatScene
scene
;
final
String
musicUrl
;
final
String
musicLowBandUrl
;
final
String
thumbnail
;
final
String
title
;
final
String
description
;
WeChatShareMusicModel
(
{
String
transaction
,
WeChatScene
scene
,
this
.
musicUrl
,
this
.
musicLowBandUrl
,
this
.
title
:
""
,
this
.
description
:
""
,
String
thumbnail
})
:
this
.
transaction
=
transaction
??
"text"
,
this
.
scene
=
scene
??
WeChatScene
.
TIMELINE
,
this
.
thumbnail
=
thumbnail
??
""
,
assert
(
musicUrl
!=
null
||
musicLowBandUrl
!=
null
),
assert
(
thumbnail
!=
null
);
Map
toMap
()
{
return
{
_transaction:
transaction
,
_scene:
scene
.
toString
(),
"musicUrl"
:
musicUrl
,
"musicLowBandUrl"
:
musicLowBandUrl
,
_thumbnail:
thumbnail
,
_title:
title
,
_description:
description
};
}
}
lib/wechat_plugin.dart
浏览文件 @
a5cc5f33
...
@@ -36,6 +36,11 @@ class WechatPlugin {
...
@@ -36,6 +36,11 @@ class WechatPlugin {
}
}
static
Future
shareMusic
(
WeChatShareMusicModel
model
)
async
{
return
await
_channel
.
invokeMethod
(
"shareMusic"
,
model
.
toMap
());
}
static
Future
<
dynamic
>
_handler
(
MethodCall
methodCall
){
static
Future
<
dynamic
>
_handler
(
MethodCall
methodCall
){
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论