Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-backend
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
AutogeneralShanghai
yd-backend
Commits
661008eb
Commit
661008eb
authored
Apr 25, 2020
by
yao.xiao
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加-经纪人设置保存(未完成),阿里部分代码(oss)
parent
65854245
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
1114 additions
and
25 deletions
+1114
-25
yd-api/pom.xml
+7
-1
yd-api/src/main/java/com/yd/api/practitioner/PractitionerController.java
+17
-18
yd-api/src/main/java/com/yd/api/practitioner/service/PractitionerService.java
+15
-2
yd-api/src/main/java/com/yd/api/practitioner/service/impl/PractitionerServiceImpl.java
+0
-0
yd-api/src/main/java/com/yd/dal/service/customer/AclFileUploadDALService.java
+19
-0
yd-api/src/main/java/com/yd/dal/service/customer/impl/AclFileUploadDALServiceImpl.java
+15
-0
yd-api/src/main/java/com/yd/dal/service/practitioner/PractitionerDALService.java
+8
-0
yd-api/src/main/java/com/yd/dal/service/practitioner/impl/PractitionerDALServiceImpl.java
+6
-0
yd-api/src/main/java/com/yd/rmi/ali/oss/service/OssService.java
+12
-0
yd-api/src/main/java/com/yd/rmi/ali/oss/service/impl/OssServiceImpl.java
+197
-0
yd-api/src/main/java/com/yd/rmi/ali/oss/vo/OssOperateTypeEnum.java
+72
-0
yd-api/src/main/java/com/yd/rmi/ali/oss/vo/OssRequestVO.java
+196
-0
yd-api/src/main/java/com/yd/rmi/ali/oss/vo/OssResponseVO.java
+72
-0
yd-api/src/main/java/com/yd/rmi/ali/ossinterf/service/AliOssInterfService.java
+115
-0
yd-api/src/main/java/com/yd/rmi/ali/ossinterf/service/impl/AliOssInterfServiceImpl.java
+325
-0
yd-api/src/main/java/com/yd/rmi/tencent/test.java
+0
-4
yd-api/src/main/java/com/yd/util/HttpUtil.java
+38
-0
No files found.
yd-api/pom.xml
View file @
661008eb
...
...
@@ -94,7 +94,7 @@
<artifactId>
pagehelper-spring-boot-starter
</artifactId>
<version>
1.2.5
</version>
</dependency>
<!--
<!--
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
...
...
@@ -115,6 +115,12 @@
<groupId>
commons-beanutils
</groupId>
<artifactId>
commons-beanutils
</artifactId>
</dependency>
<dependency>
<groupId>
com.aliyun.oss
</groupId>
<artifactId>
aliyun-sdk-oss
</artifactId>
<version>
2.8.2
</version>
<scope>
compile
</scope>
</dependency>
</dependencies>
<build>
...
...
yd-api/src/main/java/com/yd/api/practitioner/PractitionerController.java
View file @
661008eb
...
...
@@ -5,8 +5,7 @@ import com.yd.api.practitioner.vo.login.PractitionerLoginRequestVO;
import
com.yd.api.practitioner.vo.login.PractitionerLoginResponseVO
;
import
com.yd.api.practitioner.vo.rank.PractitionerRankRequestVO
;
import
com.yd.api.practitioner.vo.rank.PractitionerRankResponseVO
;
import
com.yd.api.practitioner.vo.setting.SettingQueryRequestVO
;
import
com.yd.api.practitioner.vo.setting.SettingQueryResponseVO
;
import
com.yd.api.practitioner.vo.setting.*
;
import
com.yd.api.result.JsonResult
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
...
...
@@ -69,25 +68,25 @@ public class PractitionerController {
* @param requestVO
* @return responseVO
*/
//
@RequestMapping("/settingSave")
//
public Object mySettingSave(@RequestBody SettingSaveRequestVO requestVO) throws Exception {
//
JsonResult result = new JsonResult();
//
SettingSaveResponseVO responseVO = practitionerService.settingSave(requestVO);
//
result.setData(responseVO);
//
result.addResult(responseVO);
//
return result;
//
}
@RequestMapping
(
"/settingSave"
)
public
Object
mySettingSave
(
@RequestBody
SettingSaveRequestVO
requestVO
)
throws
Exception
{
JsonResult
result
=
new
JsonResult
();
SettingSaveResponseVO
responseVO
=
practitionerService
.
settingSave
(
requestVO
);
result
.
setData
(
responseVO
);
result
.
addResult
(
responseVO
);
return
result
;
}
/**
* 删除经纪人照片
*/
//
@RequestMapping("/imgDelete")
//
public Object imgDelete(@RequestBody ImgDeleteRequestVO requestVO){
//
JsonResult result = new JsonResult();
//
ImgDeleteResponseVO responseVO = practitionerService.imgDelete(requestVO);
//
result.setData(responseVO);
//
result.addResult(responseVO);
//
return result;
//
}
@RequestMapping
(
"/imgDelete"
)
public
Object
imgDelete
(
@RequestBody
ImgDeleteRequestVO
requestVO
){
JsonResult
result
=
new
JsonResult
();
ImgDeleteResponseVO
responseVO
=
practitionerService
.
imgDelete
(
requestVO
);
result
.
setData
(
responseVO
);
result
.
addResult
(
responseVO
);
return
result
;
}
}
yd-api/src/main/java/com/yd/api/practitioner/service/PractitionerService.java
View file @
661008eb
...
...
@@ -4,8 +4,7 @@ import com.yd.api.practitioner.vo.login.PractitionerLoginRequestVO;
import
com.yd.api.practitioner.vo.login.PractitionerLoginResponseVO
;
import
com.yd.api.practitioner.vo.rank.PractitionerRankRequestVO
;
import
com.yd.api.practitioner.vo.rank.PractitionerRankResponseVO
;
import
com.yd.api.practitioner.vo.setting.SettingQueryRequestVO
;
import
com.yd.api.practitioner.vo.setting.SettingQueryResponseVO
;
import
com.yd.api.practitioner.vo.setting.*
;
import
org.springframework.stereotype.Service
;
@Service
(
"practitionerService"
)
...
...
@@ -31,4 +30,18 @@ public interface PractitionerService {
* @return
*/
SettingQueryResponseVO
settingQuery
(
SettingQueryRequestVO
requestVO
);
/**
* 经纪人删除头像生活照
* @param requestVO
* @return
*/
ImgDeleteResponseVO
imgDelete
(
ImgDeleteRequestVO
requestVO
);
/**
* 保存经纪人设置头像,生活照
* @param requestVO
* @return
*/
SettingSaveResponseVO
settingSave
(
SettingSaveRequestVO
requestVO
)
throws
Exception
;
}
yd-api/src/main/java/com/yd/api/practitioner/service/impl/PractitionerServiceImpl.java
View file @
661008eb
This diff is collapsed.
Click to expand it.
yd-api/src/main/java/com/yd/dal/service/customer/AclFileUploadDALService.java
View file @
661008eb
...
...
@@ -23,4 +23,23 @@ public interface AclFileUploadDALService {
* @return
*/
List
<
AclFileUpload
>
findByAclFileUpload
(
AclFileUpload
fileUpload
);
/**
* 通过id查找ag_acl_file_upload信息
* @param fileId
* @return
*/
AclFileUpload
findFileUploadById
(
Long
fileId
);
/**
* 通过id更新ag_acl_file_upload
* @param fileUpload
*/
void
updateFileUpload
(
AclFileUpload
fileUpload
);
/**
* 保存ag_acl_file_upload
* @param aclFileUpload
*/
void
saveFileUpload
(
AclFileUpload
aclFileUpload
);
}
yd-api/src/main/java/com/yd/dal/service/customer/impl/AclFileUploadDALServiceImpl.java
View file @
661008eb
...
...
@@ -32,4 +32,19 @@ public class AclFileUploadDALServiceImpl implements AclFileUploadDALService {
public
List
<
AclFileUpload
>
findByAclFileUpload
(
AclFileUpload
fileUpload
)
{
return
aclFileUploadMapper
.
findByAclFileUpload
(
fileUpload
);
}
@Override
public
AclFileUpload
findFileUploadById
(
Long
fileId
)
{
return
aclFileUploadMapper
.
selectByPrimaryKey
(
fileId
);
}
@Override
public
void
updateFileUpload
(
AclFileUpload
fileUpload
)
{
aclFileUploadMapper
.
updateByPrimaryKeySelective
(
fileUpload
);
}
@Override
public
void
saveFileUpload
(
AclFileUpload
aclFileUpload
)
{
aclFileUploadMapper
.
insertSelective
(
aclFileUpload
);
}
}
yd-api/src/main/java/com/yd/dal/service/practitioner/PractitionerDALService.java
View file @
661008eb
package
com
.
yd
.
dal
.
service
.
practitioner
;
import
com.yd.dal.entity.customer.AclFileUpload
;
import
com.yd.dal.entity.practitioner.AclPractitionerInfo
;
import
com.yd.dal.entity.practitioner.PractitionerBasicInfo
;
import
com.yd.dal.entity.practitioner.PractitionerInfo
;
...
...
@@ -55,4 +56,11 @@ public interface PractitionerDALService {
* @return
*/
AclPractitionerInfo
findPractitionerById
(
Long
practitionerId
);
/**
* 通过id更新practitioner
* @param practitioner
*/
void
updatePractitioner
(
AclPractitionerInfo
practitioner
);
}
yd-api/src/main/java/com/yd/dal/service/practitioner/impl/PractitionerDALServiceImpl.java
View file @
661008eb
...
...
@@ -71,4 +71,10 @@ public class PractitionerDALServiceImpl implements PractitionerDALService {
public
AclPractitionerInfo
findPractitionerById
(
Long
practitionerId
)
{
return
aclPractitionerMapper
.
selectByPrimaryKey
(
practitionerId
);
}
@Override
@TargetDataSource
(
dataSourceKey
=
DataSourceKey
.
DB_MASTER
)
public
void
updatePractitioner
(
AclPractitionerInfo
practitioner
)
{
aclPractitionerMapper
.
updateByPrimaryKeySelective
(
practitioner
);
}
}
yd-api/src/main/java/com/yd/rmi/ali/oss/service/OssService.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
rmi
.
ali
.
oss
.
service
;
import
com.yd.rmi.ali.oss.vo.OssRequestVO
;
import
com.yd.rmi.ali.oss.vo.OssResponseVO
;
import
java.io.InputStream
;
public
interface
OssService
{
String
putFileToOss
(
String
string
,
String
key
,
InputStream
is
)
throws
Exception
;
}
yd-api/src/main/java/com/yd/rmi/ali/oss/service/impl/OssServiceImpl.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
rmi
.
ali
.
oss
.
service
.
impl
;
import
com.aliyun.oss.model.*
;
import
com.yd.api.result.CommonResult
;
import
com.yd.rmi.ali.oss.service.OssService
;
import
com.yd.rmi.ali.oss.vo.OssOperateTypeEnum
;
import
com.yd.rmi.ali.oss.vo.OssRequestVO
;
import
com.yd.rmi.ali.oss.vo.OssResponseVO
;
import
com.yd.rmi.ali.ossinterf.service.AliOssInterfService
;
import
com.yd.util.CommonUtil
;
import
com.yd.util.config.ZHBErrorConfig
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.util.ArrayList
;
import
java.util.List
;
@Service
(
"ossService"
)
public
class
OssServiceImpl
implements
OssService
{
// @Autowired
// private SystemConfigService systemConfigService;
@Autowired
private
AliOssInterfService
aliOssInterfService
;
public
boolean
doesBucketExist
(
String
bucketName
){
// String endpoint = systemConfigService.getSingleConfigValue("ALI_OSS_ENDPOINT");
// String accessKeyId = systemConfigService.getSingleConfigValue("ALI_OSS_ACCESS_KEY_ID");
// String accessKeySecret = systemConfigService.getSingleConfigValue("ALI_OSS_ACCESS_KEY_SECRET");
// aliOssInterfService.initAttribute(endpoint, accessKeyId, accessKeySecret);
return
aliOssInterfService
.
doesBucketExist
(
bucketName
);
}
/**
* 上传文件到OSS
* @param bucketName
* @param key
* @param is
* @return
*/
@Override
public
String
putFileToOss
(
String
bucketName
,
String
key
,
InputStream
is
)
throws
Exception
{
String
url
=
null
;
if
(
CommonUtil
.
isNullOrBlank
(
key
)
||
is
==
null
){
return
null
;
}
// if(CommonUtil.isNullOrBlank(bucketName)){
// bucketName = systemConfigService.getSingleConfigValue("ALI_OSS_BUCKET_NAME");
// }
OssRequestVO
ossRequestVO
=
new
OssRequestVO
();
File
file
=
null
;
OutputStream
os
=
null
;
try
{
file
=
File
.
createTempFile
(
"tmp"
,
null
);
// System.out.println("文件是否存在:"+file.exists()+"---------------临时文件路径:"+file.getAbsolutePath());
os
=
new
FileOutputStream
(
file
);
int
len
=
0
;
byte
[]
bytes
=
new
byte
[
1024
];
while
((
len
=
is
.
read
(
bytes
)
)
>
0
){
os
.
write
(
bytes
,
0
,
len
);
os
.
flush
();
}
ossRequestVO
.
setOperateType
(
OssOperateTypeEnum
.
PUT_OBJECT
.
getCode
());
ossRequestVO
.
setBucketName
(
bucketName
);
ossRequestVO
.
setKey
(
key
);
ossRequestVO
.
setFile
(
file
);
OssResponseVO
ossResponseVO
=
ossOperate
(
ossRequestVO
);
ossRequestVO
.
setOperateType
(
OssOperateTypeEnum
.
GENERATE_URL
.
getCode
());
ossResponseVO
=
ossOperate
(
ossRequestVO
);
url
=
ossResponseVO
.
getUrl
();
}
catch
(
Exception
e
){
throw
e
;
}
finally
{
if
(
os
!=
null
){
try
{
os
.
close
();}
catch
(
Exception
e
){
e
.
printStackTrace
();}}
if
(
is
!=
null
){
try
{
is
.
close
();}
catch
(
Exception
e
){
e
.
printStackTrace
();}}
if
(
file
!=
null
){
file
.
delete
();}
// System.out.println("文件是否存在:"+file.exists());
}
return
url
;
}
private
OssResponseVO
ossOperate
(
OssRequestVO
ossRequestVO
)
{
OssResponseVO
ossResponseVO
=
new
OssResponseVO
();
boolean
success
=
true
;
String
message
=
ZHBErrorConfig
.
getErrorInfo
(
"800000"
);
if
(
ossRequestVO
==
null
||
CommonUtil
.
isNullOrBlank
(
ossRequestVO
.
getOperateType
())){
String
[]
params
=
{
"operateType"
};
ossResponseVO
.
setCommonResult
(
new
CommonResult
(
false
,
ZHBErrorConfig
.
getErrorInfo
(
"610001"
,
params
)));
return
ossResponseVO
;
}
String
operateType
=
ossRequestVO
.
getOperateType
();
String
bucketName
=
ossRequestVO
.
getBucketName
();
CannedAccessControlList
cannedAccessControlList
=
ossRequestVO
.
getCannedAccessControlList
();
String
key
=
ossRequestVO
.
getKey
();
File
file
=
ossRequestVO
.
getFile
();
String
checkMessage
=
""
;
if
(
OssOperateTypeEnum
.
DOES_BUCKET_EXIST
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
GET_BUCKET_ACL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
CREATE_BUCKET
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
SET_BUCKET_ACL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
DOES_OBJECT_EXIST
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
GET_OBJECT_ACL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
PUT_OBJECT
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
SET_OBJECT_ACL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
GET_OBJECT
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
LIST_OBJECTS
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
GENERATE_URL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
DELETE_OBJECTS
.
getCode
().
equals
(
operateType
)){
if
(
CommonUtil
.
isNullOrBlank
(
bucketName
)){
String
[]
params
=
{
"bucketName"
};
checkMessage
+=
ZHBErrorConfig
.
getErrorInfo
(
"610001"
,
params
);
}
if
(
OssOperateTypeEnum
.
DOES_OBJECT_EXIST
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
GET_OBJECT_ACL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
PUT_OBJECT
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
SET_OBJECT_ACL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
GET_OBJECT
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
GENERATE_URL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
DELETE_OBJECTS
.
getCode
().
equals
(
operateType
)){
if
(
CommonUtil
.
isNullOrBlank
(
key
)){
String
[]
params
=
{
"key"
};
checkMessage
+=
ZHBErrorConfig
.
getErrorInfo
(
"610001"
,
params
);
}
}
if
(
OssOperateTypeEnum
.
SET_BUCKET_ACL
.
getCode
().
equals
(
operateType
)
||
OssOperateTypeEnum
.
SET_OBJECT_ACL
.
getCode
().
equals
(
operateType
)){
if
(
cannedAccessControlList
==
null
){
String
[]
params
=
{
"cannedAccessControlList"
};
checkMessage
+=
ZHBErrorConfig
.
getErrorInfo
(
"610001"
,
params
);
}
}
if
(
OssOperateTypeEnum
.
PUT_OBJECT
.
getCode
().
equals
(
operateType
)){
if
(
file
==
null
){
String
[]
params
=
{
"file"
};
checkMessage
+=
ZHBErrorConfig
.
getErrorInfo
(
"610001"
,
params
);
}
}
}
if
(!
CommonUtil
.
isNullOrBlank
(
checkMessage
)){
ossResponseVO
.
setCommonResult
(
new
CommonResult
(
false
,
checkMessage
));
return
ossResponseVO
;
}
if
(
OssOperateTypeEnum
.
DOES_BUCKET_EXIST
.
getCode
().
equals
(
operateType
)){
boolean
isExists
=
aliOssInterfService
.
doesBucketExist
(
bucketName
);
ossResponseVO
.
setExists
(
isExists
);
}
else
if
(
OssOperateTypeEnum
.
GET_BUCKET_ACL
.
getCode
().
equals
(
operateType
)){
AccessControlList
accessControlList
=
aliOssInterfService
.
getBucketAcl
(
bucketName
);
ossResponseVO
.
setAccessControlList
(
accessControlList
);
}
else
if
(
OssOperateTypeEnum
.
CREATE_BUCKET
.
getCode
().
equals
(
operateType
)){
aliOssInterfService
.
createBucket
(
bucketName
,
cannedAccessControlList
);
}
else
if
(
OssOperateTypeEnum
.
SET_BUCKET_ACL
.
getCode
().
equals
(
operateType
)){
aliOssInterfService
.
setBucketAcl
(
bucketName
,
cannedAccessControlList
);
}
else
if
(
OssOperateTypeEnum
.
LIST_BUCKETS
.
getCode
().
equals
(
operateType
)){
BucketList
bucketList
=
aliOssInterfService
.
listBuckets
();
ossResponseVO
.
setBucketList
(
bucketList
);
}
else
if
(
OssOperateTypeEnum
.
DOES_OBJECT_EXIST
.
getCode
().
equals
(
operateType
)){
boolean
isExists
=
aliOssInterfService
.
doesObjectExist
(
bucketName
,
key
);
ossResponseVO
.
setExists
(
isExists
);
}
else
if
(
OssOperateTypeEnum
.
GET_OBJECT_ACL
.
getCode
().
equals
(
operateType
)){
ObjectAcl
objectAcl
=
aliOssInterfService
.
getObjectAcl
(
bucketName
,
key
);
ossResponseVO
.
setObjectAcl
(
objectAcl
);
}
else
if
(
OssOperateTypeEnum
.
PUT_OBJECT
.
getCode
().
equals
(
operateType
)){
aliOssInterfService
.
putObject
(
bucketName
,
key
,
file
);
}
else
if
(
OssOperateTypeEnum
.
SET_OBJECT_ACL
.
getCode
().
equals
(
operateType
)){
aliOssInterfService
.
setObjectAcl
(
bucketName
,
key
,
cannedAccessControlList
);
}
else
if
(
OssOperateTypeEnum
.
GET_OBJECT
.
getCode
().
equals
(
operateType
)){
OSSObject
ossObject
=
aliOssInterfService
.
getObject
(
bucketName
,
key
);
ossResponseVO
.
setOssObject
(
ossObject
);
}
else
if
(
OssOperateTypeEnum
.
LIST_OBJECTS
.
getCode
().
equals
(
operateType
)){
ObjectListing
objectListing
=
aliOssInterfService
.
listObjects
(
bucketName
,
ossRequestVO
.
getPrefix
());
ossResponseVO
.
setObjectListing
(
objectListing
);
}
else
if
(
OssOperateTypeEnum
.
GENERATE_URL
.
getCode
().
equals
(
operateType
)){
String
url
=
aliOssInterfService
.
generateUrl
(
bucketName
,
key
);
ossResponseVO
.
setUrl
(
url
);
}
else
if
(
OssOperateTypeEnum
.
DELETE_OBJECTS
.
getCode
().
equals
(
operateType
)){
List
<
String
>
keys
=
new
ArrayList
<
String
>();
keys
.
add
(
key
);
aliOssInterfService
.
deleteObjects
(
bucketName
,
keys
);
}
ossResponseVO
.
setCommonResult
(
new
CommonResult
(
success
,
message
));
return
ossResponseVO
;
}
}
yd-api/src/main/java/com/yd/rmi/ali/oss/vo/OssOperateTypeEnum.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
rmi
.
ali
.
oss
.
vo
;
public
enum
OssOperateTypeEnum
{
/**
* 判断存储空间是否存在
*/
DOES_BUCKET_EXIST
(
"doesBucketExist"
,
"判断存储空间是否存在"
),
/**
* 获取存储空间访问权限
*/
GET_BUCKET_ACL
(
"getBucketAcl"
,
"获取存储空间访问权限"
),
/**
* 创建存储空间
*/
CREATE_BUCKET
(
"createBucket"
,
"创建存储空间"
),
/**
* 列出当前访问域名下的所有存储空间
*/
LIST_BUCKETS
(
"listBuckets"
,
"列出当前访问域名下的所有存储空间"
),
/**
* 设置存储空间访问权限
*/
SET_BUCKET_ACL
(
"setBucketAcl"
,
"设置存储空间访问权限"
),
/**
* 判断对象是否存在
*/
DOES_OBJECT_EXIST
(
"doesObjectExist"
,
"判断对象是否存在"
),
/**
* 获取对象的访问权限
*/
GET_OBJECT_ACL
(
"getObjectAcl"
,
"获取对象的访问权限"
),
/**
* 上传文件
*/
PUT_OBJECT
(
"putObject"
,
"上传文件"
),
/**
* 设置对象访问权限
*/
SET_OBJECT_ACL
(
"setObjectAcl"
,
"设置对象访问权限"
),
/**
* 下载对象
*/
GET_OBJECT
(
"getObject"
,
"下载对象"
),
/**
* 列出当前访问域名下的所有对象
*/
LIST_OBJECTS
(
"listObjects"
,
"列出当前访问域名下的所有对象"
),
/**
* 获取对象外网访问URL
*/
GENERATE_URL
(
"generateUrl"
,
"获取对象外网访问URL"
),
/**
* 删除文件
*/
DELETE_OBJECTS
(
"deleteObjects"
,
"删除文件"
);
private
String
code
;
private
String
message
;
public
String
getCode
()
{
return
code
;
}
public
String
getMessage
()
{
return
message
;
}
private
OssOperateTypeEnum
(
String
code
,
String
message
)
{
this
.
code
=
code
;
this
.
message
=
message
;
}
}
yd-api/src/main/java/com/yd/rmi/ali/oss/vo/OssRequestVO.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
rmi
.
ali
.
oss
.
vo
;
import
com.aliyun.oss.model.CannedAccessControlList
;
import
java.io.File
;
public
class
OssRequestVO
{
private
String
operateType
;
//操作类型,详见OssOperateTypeEnum
private
String
endpoint
;
//访问域名
private
String
accessKeyId
;
//accessKeyId
private
String
accessKeySecret
;
//accessKeySecret
private
String
bucketName
;
//存储空间名
private
CannedAccessControlList
cannedAccessControlList
;
//权限
private
String
key
;
//对象名
private
File
file
;
//文件
private
String
prefix
;
//获取对象列表时的前缀
private
Long
idBegin
;
//起始ID
private
Long
idEnd
;
//终止ID
/**
* 获取属性 operateType 操作类型,详见OssOperateTypeEnum
* @return operateType
*/
public
String
getOperateType
(){
return
this
.
operateType
;
}
/**
* 属性赋值 operateType 操作类型,详见OssOperateTypeEnum
* @param operateType
*/
public
void
setOperateType
(
String
operateType
){
this
.
operateType
=
operateType
;
}
/**
* 获取属性 endpoint 访问域名
* @return endpoint
*/
public
String
getEndpoint
(){
return
this
.
endpoint
;
}
/**
* 属性赋值 endpoint 访问域名
* @param endpoint
*/
public
void
setEndpoint
(
String
endpoint
){
this
.
endpoint
=
endpoint
;
}
/**
* 获取属性 accessKeyId accessKeyId
* @return accessKeyId
*/
public
String
getAccessKeyId
(){
return
this
.
accessKeyId
;
}
/**
* 属性赋值 accessKeyId accessKeyId
* @param accessKeyId
*/
public
void
setAccessKeyId
(
String
accessKeyId
){
this
.
accessKeyId
=
accessKeyId
;
}
/**
* 获取属性 accessKeySecret accessKeySecret
* @return accessKeySecret
*/
public
String
getAccessKeySecret
(){
return
this
.
accessKeySecret
;
}
/**
* 属性赋值 accessKeySecret accessKeySecret
* @param accessKeySecret
*/
public
void
setAccessKeySecret
(
String
accessKeySecret
){
this
.
accessKeySecret
=
accessKeySecret
;
}
/**
* 获取属性 bucketName 存储空间名
* @return bucketName
*/
public
String
getBucketName
(){
return
this
.
bucketName
;
}
/**
* 属性赋值 bucketName 存储空间名
* @param bucketName
*/
public
void
setBucketName
(
String
bucketName
){
this
.
bucketName
=
bucketName
;
}
/**
* 获取属性 cannedAccessControlList 权限
* @return cannedAccessControlList
*/
public
CannedAccessControlList
getCannedAccessControlList
(){
return
this
.
cannedAccessControlList
;
}
/**
* 属性赋值 cannedAccessControlList 权限
* @param cannedAccessControlList
*/
public
void
setCannedAccessControlList
(
CannedAccessControlList
cannedAccessControlList
){
this
.
cannedAccessControlList
=
cannedAccessControlList
;
}
/**
* 获取属性 key 对象名
* @return key
*/
public
String
getKey
(){
return
this
.
key
;
}
/**
* 属性赋值 key 对象名
* @param key
*/
public
void
setKey
(
String
key
){
this
.
key
=
key
;
}
/**
* 获取属性 file 文件
* @return file
*/
public
File
getFile
(){
return
this
.
file
;
}
/**
* 属性赋值 file 文件
* @param file
*/
public
void
setFile
(
File
file
){
this
.
file
=
file
;
}
/**
* 获取属性 prefix 获取对象列表时的前缀
* @return prefix
*/
public
String
getPrefix
(){
return
this
.
prefix
;
}
/**
* 属性赋值 prefix 获取对象列表时的前缀
* @param prefix
*/
public
void
setPrefix
(
String
prefix
){
this
.
prefix
=
prefix
;
}
/**
* 获取属性 idBegin 起始ID
* @return idBegin
*/
public
Long
getIdBegin
(){
return
this
.
idBegin
;
}
/**
* 属性赋值 idBegin 起始ID
* @param idBegin
*/
public
void
setIdBegin
(
Long
idBegin
){
this
.
idBegin
=
idBegin
;
}
/**
* 获取属性 idEnd 终止ID
* @return idEnd
*/
public
Long
getIdEnd
(){
return
this
.
idEnd
;
}
/**
* 属性赋值 idEnd 终止ID
* @param idEnd
*/
public
void
setIdEnd
(
Long
idEnd
){
this
.
idEnd
=
idEnd
;
}
}
yd-api/src/main/java/com/yd/rmi/ali/oss/vo/OssResponseVO.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
rmi
.
ali
.
oss
.
vo
;
import
com.aliyun.oss.model.*
;
import
com.yd.api.result.CommonResult
;
public
class
OssResponseVO
{
private
String
operateType
;
//操作类型,详见OssOperateTypeEnum
private
boolean
exists
;
//存储空间、对象是否存在
private
BucketList
bucketList
;
//存储空间列表
private
AccessControlList
accessControlList
;
//存储空间、对象权限入参
private
ObjectAcl
objectAcl
;
//对象权限出参
private
OSSObject
ossObject
;
//对象下载出参
private
ObjectListing
objectListing
;
//对象列表
private
String
url
;
//对象外网访问URL
private
CommonResult
commonResult
;
public
String
getOperateType
()
{
return
operateType
;
}
public
void
setOperateType
(
String
operateType
)
{
this
.
operateType
=
operateType
;
}
public
boolean
isExists
()
{
return
exists
;
}
public
void
setExists
(
boolean
exists
)
{
this
.
exists
=
exists
;
}
public
BucketList
getBucketList
()
{
return
bucketList
;
}
public
void
setBucketList
(
BucketList
bucketList
)
{
this
.
bucketList
=
bucketList
;
}
public
AccessControlList
getAccessControlList
()
{
return
accessControlList
;
}
public
void
setAccessControlList
(
AccessControlList
accessControlList
)
{
this
.
accessControlList
=
accessControlList
;
}
public
ObjectAcl
getObjectAcl
()
{
return
objectAcl
;
}
public
void
setObjectAcl
(
ObjectAcl
objectAcl
)
{
this
.
objectAcl
=
objectAcl
;
}
public
OSSObject
getOssObject
()
{
return
ossObject
;
}
public
void
setOssObject
(
OSSObject
ossObject
)
{
this
.
ossObject
=
ossObject
;
}
public
ObjectListing
getObjectListing
()
{
return
objectListing
;
}
public
void
setObjectListing
(
ObjectListing
objectListing
)
{
this
.
objectListing
=
objectListing
;
}
public
String
getUrl
()
{
return
url
;
}
public
void
setUrl
(
String
url
)
{
this
.
url
=
url
;
}
public
CommonResult
getCommonResult
()
{
return
commonResult
;
}
public
void
setCommonResult
(
CommonResult
commonResult
)
{
this
.
commonResult
=
commonResult
;
}
}
yd-api/src/main/java/com/yd/rmi/ali/ossinterf/service/AliOssInterfService.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
rmi
.
ali
.
ossinterf
.
service
;
import
com.aliyun.oss.model.*
;
import
java.io.File
;
import
java.util.List
;
public
interface
AliOssInterfService
{
public
void
initAttribute
();
/**
* 初始化相关链接参数
* @param endpoint
* @param accessKeyId
* @param accessKeySecret
*/
public
void
initAttribute
(
String
endpoint
,
String
accessKeyId
,
String
accessKeySecret
);
/**
* 判断存储空间是否存在
* @param bucketName 存储空间名
* @return
*/
public
boolean
doesBucketExist
(
String
bucketName
);
/**
* 获取存储空间访问权限
* @param bucketName 存储空间名
* @return
*/
public
AccessControlList
getBucketAcl
(
String
bucketName
);
/**
* 创建存储空间
* @param bucketName 存储空间名
* @param cannedACL 访问权限
*/
public
void
createBucket
(
String
bucketName
,
CannedAccessControlList
cannedACL
);
/**
* 设置存储空间访问权限
* @param bucketName 存储空间名
* @param cannedACL 访问权限
*/
public
void
setBucketAcl
(
String
bucketName
,
CannedAccessControlList
cannedACL
);
/**
* 列出当前访问域名下的所有存储空间
* @return
*/
public
BucketList
listBuckets
();
/**
* 判断对象是否存在
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
boolean
doesObjectExist
(
String
bucketName
,
String
key
);
/**
* 获取对象的访问权限
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
ObjectAcl
getObjectAcl
(
String
bucketName
,
String
key
);
/**
* 上传文件
* @param bucketName 存储空间名
* @param key 对象名
* @param file 文件
*/
public
void
putObject
(
String
bucketName
,
String
key
,
File
file
);
/**
* 设置对象访问权限
* @param bucketName 存储空间名
* @param key 对象名
* @param cannedACL 访问权限
*/
public
void
setObjectAcl
(
String
bucketName
,
String
key
,
CannedAccessControlList
cannedACL
);
/**
* 下载对象
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
OSSObject
getObject
(
String
bucketName
,
String
key
);
/**
* 列出当前访问域名下的所有对象
* @param bucketName 存储空间名
* @param prefix
* @return
*/
public
ObjectListing
listObjects
(
String
bucketName
,
String
prefix
);
/**
* 获取对象外网访问URL
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
String
generateUrl
(
String
bucketName
,
String
key
);
/**
* 删除对象
* @param bucketName 存储空间名
* @param keys 对象名列表
*/
public
void
deleteObjects
(
String
bucketName
,
List
<
String
>
keys
);
}
yd-api/src/main/java/com/yd/rmi/ali/ossinterf/service/impl/AliOssInterfServiceImpl.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
rmi
.
ali
.
ossinterf
.
service
.
impl
;
import
com.aliyun.oss.HttpMethod
;
import
com.aliyun.oss.OSSClient
;
import
com.aliyun.oss.model.*
;
import
com.yd.rmi.ali.ossinterf.service.AliOssInterfService
;
import
com.yd.util.CommonUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.io.File
;
import
java.net.URL
;
import
java.util.Date
;
import
java.util.List
;
@Service
(
"aliOssInterfService"
)
public
class
AliOssInterfServiceImpl
implements
AliOssInterfService
{
private
String
endpoint
=
null
;
//SystemConstants.ALI_OSS_ENDPOINT;
private
String
accessKeyId
=
null
;
//SystemConstants.ALI_OSS_ACCESS_KEY_ID;
private
String
accessKeySecret
=
null
;
//SystemConstants.ALI_OSS_ACCESS_KEY_SECRET;
// @Autowired
// private SystemConfigService systemConfigService;
//
public
void
initAttribute
(){
// if(CommonUtil.isNullOrBlank(this.endpoint)){
// this.endpoint = systemConfigService.getSingleConfigValue("ALI_OSS_ENDPOINT");
// }
// if(CommonUtil.isNullOrBlank(this.accessKeyId)){
// this.accessKeyId = systemConfigService.getSingleConfigValue("ALI_OSS_ACCESS_KEY_ID");
// }
// if(CommonUtil.isNullOrBlank(this.accessKeySecret)){
// this.accessKeySecret = systemConfigService.getSingleConfigValue("ALI_OSS_ACCESS_KEY_SECRET");
// }
}
/**
* 初始化相关链接参数
* @param endpoint
* @param accessKeyId
* @param accessKeySecret
*/
public
void
initAttribute
(
String
endpoint
,
String
accessKeyId
,
String
accessKeySecret
){
if
(!
CommonUtil
.
isNullOrBlank
(
endpoint
)){
this
.
endpoint
=
endpoint
;
}
if
(!
CommonUtil
.
isNullOrBlank
(
accessKeyId
)){
this
.
accessKeyId
=
accessKeyId
;
}
if
(!
CommonUtil
.
isNullOrBlank
(
accessKeySecret
)){
this
.
accessKeySecret
=
accessKeySecret
;
}
}
/**
* 判断存储空间是否存在
* @param bucketName 存储空间名
* @return
*/
public
boolean
doesBucketExist
(
String
bucketName
){
boolean
result
=
false
;
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
result
=
ossClient
.
doesBucketExist
(
bucketName
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
result
;
}
/**
* 获取存储空间访问权限
* @param bucketName 存储空间名
* @return
*/
public
AccessControlList
getBucketAcl
(
String
bucketName
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
AccessControlList
accessControlList
=
null
;
try
{
accessControlList
=
ossClient
.
getBucketAcl
(
bucketName
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
accessControlList
;
}
/**
* 创建存储空间
* @param bucketName 存储空间名
* @param cannedACL 访问权限
*/
public
void
createBucket
(
String
bucketName
,
CannedAccessControlList
cannedACL
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
CreateBucketRequest
createBucketRequest
=
new
CreateBucketRequest
(
bucketName
);
createBucketRequest
.
setCannedACL
(
cannedACL
);
ossClient
.
createBucket
(
createBucketRequest
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
}
/**
* 设置存储空间访问权限
* @param bucketName 存储空间名
* @param cannedACL 访问权限
*/
public
void
setBucketAcl
(
String
bucketName
,
CannedAccessControlList
cannedACL
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
ossClient
.
setBucketAcl
(
bucketName
,
cannedACL
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
}
/**
* 列出当前访问域名下的所有存储空间
* @return
*/
public
BucketList
listBuckets
(){
BucketList
bucketList
=
null
;
ListBucketsRequest
listBucketsRequest
=
new
ListBucketsRequest
();
listBucketsRequest
.
setMaxKeys
(
500
);
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
bucketList
=
ossClient
.
listBuckets
(
listBucketsRequest
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
bucketList
;
}
/**
* 判断对象是否存在
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
boolean
doesObjectExist
(
String
bucketName
,
String
key
){
boolean
result
=
false
;
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
result
=
ossClient
.
doesObjectExist
(
bucketName
,
key
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
result
;
}
/**
* 获取对象的访问权限
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
ObjectAcl
getObjectAcl
(
String
bucketName
,
String
key
){
ObjectAcl
objectAcl
=
null
;
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
objectAcl
=
ossClient
.
getObjectAcl
(
bucketName
,
key
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
objectAcl
;
}
/**
* 上传文件
* @param bucketName 存储空间名
* @param key 对象名
* @param file 文件
*/
public
void
putObject
(
String
bucketName
,
String
key
,
File
file
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
ossClient
.
putObject
(
new
PutObjectRequest
(
bucketName
,
key
,
file
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
}
/**
* 设置对象访问权限
* @param bucketName 存储空间名
* @param key 对象名
* @param cannedACL 访问权限
*/
public
void
setObjectAcl
(
String
bucketName
,
String
key
,
CannedAccessControlList
cannedACL
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
ossClient
.
setObjectAcl
(
bucketName
,
key
,
cannedACL
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
}
/**
* 下载对象
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
OSSObject
getObject
(
String
bucketName
,
String
key
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
OSSObject
object
=
null
;
try
{
object
=
ossClient
.
getObject
(
bucketName
,
key
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
object
;
}
/**
* 列出当前访问域名下的所有对象
* @param bucketName 存储空间名
* @param prefix
* @return
*/
public
ObjectListing
listObjects
(
String
bucketName
,
String
prefix
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
ObjectListing
objectListing
=
null
;
try
{
objectListing
=
ossClient
.
listObjects
(
bucketName
,
prefix
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
objectListing
;
}
/**
* 获取对象外网访问URL
* @param bucketName 存储空间名
* @param key 对象名
* @return
*/
public
String
generateUrl
(
String
bucketName
,
String
key
){
OSSClient
ossClient
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
String
url
=
null
;
try
{
ObjectAcl
objectAcl
=
ossClient
.
getObjectAcl
(
bucketName
,
key
);
boolean
isPrivate
=
false
;
if
((
objectAcl
.
getPermission
().
toString
()).
equals
(
CannedAccessControlList
.
Private
.
toString
())){
isPrivate
=
true
;
}
if
((
objectAcl
.
getPermission
().
toString
()).
equals
(
CannedAccessControlList
.
Default
.
toString
())){
AccessControlList
accessControlList
=
ossClient
.
getBucketAcl
(
bucketName
);
if
(
(
accessControlList
.
getCannedACL
().
toString
()).
equals
(
CannedAccessControlList
.
Private
.
toString
())
){
isPrivate
=
true
;
}
}
if
(
isPrivate
){
Date
expiration
=
CommonUtil
.
dateOperation
(
new
Date
(),
"ADD"
,
"H"
,
2
);
GeneratePresignedUrlRequest
request
=
new
GeneratePresignedUrlRequest
(
bucketName
,
key
,
HttpMethod
.
GET
);
request
.
setExpiration
(
expiration
);
URL
signedUrl
=
ossClient
.
generatePresignedUrl
(
request
);
url
=
signedUrl
.
toString
();
}
else
{
url
=
endpoint
.
replace
(
"https://"
,
"https://"
+
bucketName
+
"."
)+
"/"
+
key
;
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
ossClient
.
shutdown
();
}
return
url
;
}
/**
* 删除对象
* @param bucketName 存储空间名
* @param keys 对象名列表
*/
public
void
deleteObjects
(
String
bucketName
,
List
<
String
>
keys
){
OSSClient
client
=
new
OSSClient
(
endpoint
,
accessKeyId
,
accessKeySecret
);
try
{
client
.
deleteObjects
(
new
DeleteObjectsRequest
(
bucketName
).
withKeys
(
keys
));
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
// CommonUtil.parseExceptionStack(e);
}
finally
{
client
.
shutdown
();
}
}
}
yd-api/src/main/java/com/yd/rmi/tencent/test.java
deleted
100644 → 0
View file @
65854245
package
com
.
yd
.
rmi
.
tencent
;
public
class
test
{
}
yd-api/src/main/java/com/yd/util/HttpUtil.java
0 → 100644
View file @
661008eb
package
com
.
yd
.
util
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.util.HashMap
;
import
java.util.Map
;
public
class
HttpUtil
{
/**
* 通过url取得文件返回InputStream类型数据
*
*/
public
static
Map
<
String
,
Object
>
getInput
(
String
path
)
{
URL
url
=
null
;
InputStream
is
=
null
;
boolean
success
=
true
;
String
message
=
"下载文件成功"
;
Map
<
String
,
Object
>
resp
=
new
HashMap
<>();
try
{
url
=
new
URL
(
path
);
HttpURLConnection
conn
=
(
HttpURLConnection
)
url
.
openConnection
();
//利用HttpURLConnection对象,我们可以从网络中获取网页数据.
conn
.
setDoInput
(
true
);
conn
.
connect
();
is
=
conn
.
getInputStream
();
//得到网络返回的输入流
}
catch
(
IOException
e
)
{
success
=
false
;
message
=
"下载文件失败"
;
}
finally
{
resp
.
put
(
"is"
,
is
);
resp
.
put
(
"message"
,
message
);
resp
.
put
(
"success"
,
success
);
return
resp
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment