Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
wangquan wangquan
testDome
Commits
1c8b3d6c
Commit
1c8b3d6c
authored
Aug 25, 2025
by
wangquan wangquan
Browse files
22
parent
440ddd1b
Changes
93
Hide whitespace changes
Inline
Side-by-side
test-use-main/src/main/java/com/zxr/demos/mapper/BaseServiceTypeMapper.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.mapper
;
import
com.zxr.demos.common.entity.BaseServiceType
;
import
org.springframework.stereotype.Repository
;
import
tk.mybatis.mapper.common.Mapper
;
@Repository
public
interface
BaseServiceTypeMapper
extends
Mapper
<
BaseServiceType
>
{
}
test-use-main/src/main/java/com/zxr/demos/mapper/BaseTaskMapper.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.mapper
;
import
com.zxr.demos.common.entity.BaseTask
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
@Mapper
public
interface
BaseTaskMapper
extends
tk
.
mybatis
.
mapper
.
common
.
Mapper
<
BaseTask
>
{
List
<
BaseTask
>
getTaskListByUserPhone
(
@Param
(
"userPhone"
)
String
userPhone
,
@Param
(
"tenantId"
)
String
tenantId
);
}
test-use-main/src/main/java/com/zxr/demos/mapper/RbDeliveryFailRetryMapper.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.zxr.demos.common.entity.RbDeliveryFailRetry
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.springframework.stereotype.Repository
;
@Mapper
@Repository
public
interface
RbDeliveryFailRetryMapper
extends
BaseMapper
<
RbDeliveryFailRetry
>
{
}
test-use-main/src/main/java/com/zxr/demos/mapper/TestMapper.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.mapper
;
import
com.zxr.demos.common.entity.KunKun
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Select
;
import
java.util.List
;
@Mapper
public
interface
TestMapper
{
@Select
(
"SELECT * from `department`"
)
List
<
KunKun
>
iKuns
();
}
test-use-main/src/main/java/com/zxr/demos/mapper/UdspCarSeriesListApiMapper.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.zxr.demos.common.param.UdspQueryCarSeriesListParam
;
import
com.zxr.demos.common.entity.CarSeriesList
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Select
;
import
org.springframework.stereotype.Component
;
import
java.util.List
;
/*
* @Description:
* @Author: 张先冉
* @date: 2024/9/3 10:52
*/
@Component
public
interface
UdspCarSeriesListApiMapper
extends
BaseMapper
<
CarSeriesList
>
{
int
insertBatch
(
@Param
(
"carSerList"
)
List
<
CarSeriesList
>
carSerList
);
void
deleteCarSerTable
();
List
<
CarSeriesList
>
queryPagCarSeriesList
(
UdspQueryCarSeriesListParam
param
);
int
updateMustVisit
(
@Param
(
"id"
)
int
id
,
@Param
(
"modelCode"
)
String
modelCode
,
@Param
(
"modelName"
)
String
modelName
);
@Select
(
"select * from car_series_list"
)
List
<
CarSeriesList
>
queryPage
();
}
test-use-main/src/main/java/com/zxr/demos/mapper/UdspPartsDataMapper.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.zxr.demos.common.param.UdspQueryPartsParam
;
import
com.zxr.demos.common.entity.PartsData
;
import
com.zxr.demos.common.response.UdspPartsResult
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.stereotype.Component
;
import
java.util.List
;
/**
* <p>
* 零件数据表 Mapper 接口
* </p>
*
* @author zxr
* @since 2024-09-05
*/
@Component
public
interface
UdspPartsDataMapper
extends
BaseMapper
<
PartsData
>
{
List
<
UdspPartsResult
>
queryPageParts
(
UdspQueryPartsParam
param
);
int
insertBatch
(
@Param
(
"partsDataList"
)
List
<
PartsData
>
partsDataList
);
void
deleteparts
();
}
test-use-main/src/main/java/com/zxr/demos/mapper/UdspWorkHourApiMapper.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.zxr.demos.common.response.UdspWorkHourResult
;
import
com.zxr.demos.common.param.UdspQueryWorkHourParam
;
import
com.zxr.demos.common.entity.WorkHourData
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/*
* @Description:
* @Author: 张先冉
* @date: 2024/9/3 10:52
*/
@Mapper
public
interface
UdspWorkHourApiMapper
extends
BaseMapper
<
WorkHourData
>
{
int
insertBatch
(
@Param
(
"workHourList"
)
List
<
WorkHourData
>
workHourList
);
void
deleteWorkHourTable
();
List
<
UdspWorkHourResult
>
queryPageWorkHour
(
UdspQueryWorkHourParam
param
);
}
test-use-main/src/main/java/com/zxr/demos/service/CommonService.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service
;
import
com.zxr.demos.common.enums.EsCreateViewEnum
;
import
org.elasticsearch.index.query.BoolQueryBuilder
;
import
org.elasticsearch.index.query.QueryBuilder
;
import
org.elasticsearch.index.query.QueryBuilders
;
import
org.springframework.stereotype.Service
;
@Service
public
class
CommonService
{
public
QueryBuilder
buildCreateViewQuery
(
EsCreateViewEnum
conditionEnum
,
BoolQueryBuilder
boolQuery
)
{
if
(
EsCreateViewEnum
.
MY_CREATED
.
getCode
().
equals
(
conditionEnum
.
getCode
()))
{
boolQuery
.
must
(
QueryBuilders
.
matchQuery
(
"info"
,
"一条"
));
return
boolQuery
;
}
else
if
(
EsCreateViewEnum
.
MY_CONCERN
.
getCode
().
equals
(
conditionEnum
.
getCode
()))
{
boolQuery
.
must
(
QueryBuilders
.
matchQuery
(
"info"
,
"二条"
));
return
boolQuery
;
}
return
QueryBuilders
.
boolQuery
();
}
}
test-use-main/src/main/java/com/zxr/demos/service/MyServiceMethodRuntime.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service
;
import
org.springframework.stereotype.Service
;
@Service
public
class
MyServiceMethodRuntime
{
public
void
methodA
()
{
try
{
Thread
.
sleep
(
100
);
// 模拟执行时间
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
public
void
methodB
()
{
try
{
Thread
.
sleep
(
200
);
// 模拟执行时间
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
test-use-main/src/main/java/com/zxr/demos/service/UdspCarSeriesListService.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service
;
import
com.github.pagehelper.PageInfo
;
import
com.zxr.demos.common.param.UdspQueryCarSeriesListParam
;
import
com.zxr.demos.common.response.UdspCarSeriesListResult
;
public
interface
UdspCarSeriesListService
{
PageInfo
<
UdspCarSeriesListResult
>
queryPagCarSeriesList
(
UdspQueryCarSeriesListParam
param
);
}
test-use-main/src/main/java/com/zxr/demos/service/UdspPartsService.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service
;
import
com.github.pagehelper.PageInfo
;
import
com.zxr.demos.common.param.UdspQueryPartsParam
;
import
com.zxr.demos.common.response.UdspPartsResult
;
public
interface
UdspPartsService
{
PageInfo
<
UdspPartsResult
>
queryPageParts
(
UdspQueryPartsParam
param
);
}
test-use-main/src/main/java/com/zxr/demos/service/UdspWorkHourDataService.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service
;
import
com.github.pagehelper.PageInfo
;
import
com.zxr.demos.common.param.UdspQueryWorkHourParam
;
import
com.zxr.demos.common.response.UdspWorkHourResult
;
public
interface
UdspWorkHourDataService
{
PageInfo
<
UdspWorkHourResult
>
queryPageWorkHour
(
UdspQueryWorkHourParam
param
);
}
test-use-main/src/main/java/com/zxr/demos/service/impl/UdspCarSeriesListServiceImpl.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service.impl
;
import
cn.hutool.core.bean.BeanUtil
;
import
com.github.pagehelper.PageInfo
;
import
com.zxr.demos.common.entity.CarSeriesList
;
import
com.zxr.demos.common.param.UdspQueryCarSeriesListParam
;
import
com.zxr.demos.common.response.UdspCarSeriesListResult
;
import
com.zxr.demos.common.utils.PageUtil
;
import
com.zxr.demos.mapper.UdspCarSeriesListApiMapper
;
import
com.zxr.demos.service.UdspCarSeriesListService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.List
;
@Slf4j
@Service
public
class
UdspCarSeriesListServiceImpl
implements
UdspCarSeriesListService
{
@Autowired
private
UdspCarSeriesListApiMapper
carSeriesListApiMapper
;
@Override
public
PageInfo
<
UdspCarSeriesListResult
>
queryPagCarSeriesList
(
UdspQueryCarSeriesListParam
param
)
{
log
.
info
(
"param:{}"
,
param
);
PageInfo
info
=
PageUtil
.
build
(
param
.
getPageNo
(),
param
.
getPageSize
());
List
<
CarSeriesList
>
carSeriesList
=
carSeriesListApiMapper
.
queryPagCarSeriesList
(
param
);
log
.
info
(
"carSeriesList:{}"
,
carSeriesList
);
List
<
UdspCarSeriesListResult
>
resultList
=
new
ArrayList
<>();
for
(
CarSeriesList
seriesList
:
carSeriesList
)
{
UdspCarSeriesListResult
result
=
BeanUtil
.
copyProperties
(
seriesList
,
UdspCarSeriesListResult
.
class
);
result
.
setCode
(
seriesList
.
getModelCode
());
resultList
.
add
(
result
);
}
log
.
info
(
"carSeriesListResultList:{}"
,
resultList
);
return
PageUtil
.
paging
(
info
,
resultList
);
}
}
test-use-main/src/main/java/com/zxr/demos/service/impl/UdspPartsServiceImpl.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service.impl
;
import
com.github.pagehelper.PageInfo
;
import
com.zxr.demos.common.param.UdspQueryPartsParam
;
import
com.zxr.demos.common.response.UdspPartsResult
;
import
com.zxr.demos.common.utils.PageUtil
;
import
com.zxr.demos.mapper.UdspPartsDataMapper
;
import
com.zxr.demos.service.UdspPartsService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
@Slf4j
@Service
public
class
UdspPartsServiceImpl
implements
UdspPartsService
{
@Autowired
private
UdspPartsDataMapper
partsDataMapper
;
@Override
public
PageInfo
<
UdspPartsResult
>
queryPageParts
(
UdspQueryPartsParam
param
)
{
log
.
info
(
"param:{}"
,
param
);
PageInfo
info
=
PageUtil
.
build
(
param
.
getPageNo
(),
param
.
getPageSize
());
List
<
UdspPartsResult
>
udspPartsResults
=
partsDataMapper
.
queryPageParts
(
param
);
log
.
info
(
"udspPartsResults:{}"
,
udspPartsResults
);
return
PageUtil
.
paging
(
info
,
udspPartsResults
);
}
}
test-use-main/src/main/java/com/zxr/demos/service/impl/UdspWorkHourDataServiceImpl.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service.impl
;
import
com.github.pagehelper.PageInfo
;
import
com.zxr.demos.service.UdspWorkHourDataService
;
import
com.zxr.demos.common.param.UdspQueryWorkHourParam
;
import
com.zxr.demos.common.utils.PageUtil
;
import
com.zxr.demos.mapper.UdspWorkHourApiMapper
;
import
com.zxr.demos.common.response.UdspWorkHourResult
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
@Slf4j
@Service
public
class
UdspWorkHourDataServiceImpl
implements
UdspWorkHourDataService
{
@Autowired
private
UdspWorkHourApiMapper
workHourApiMapper
;
@Override
public
PageInfo
<
UdspWorkHourResult
>
queryPageWorkHour
(
UdspQueryWorkHourParam
param
)
{
log
.
info
(
"param:{}"
,
param
);
PageInfo
info
=
PageUtil
.
build
(
param
.
getPageNo
(),
param
.
getPageSize
());
List
<
UdspWorkHourResult
>
workHourResultList
=
workHourApiMapper
.
queryPageWorkHour
(
param
);
return
PageUtil
.
paging
(
info
,
workHourResultList
);
}
}
test-use-main/src/main/java/com/zxr/demos/service/impl/myServiceImpl.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service.impl
;
import
com.zxr.demos.common.entity.CarSeriesList
;
import
com.zxr.demos.common.response.UdspCarSeriesListResult
;
import
com.zxr.demos.mapper.UdspCarSeriesListApiMapper
;
import
com.zxr.demos.mapper.UdspPartsDataMapper
;
import
com.zxr.demos.mapper.UdspWorkHourApiMapper
;
import
com.zxr.demos.service.UdspCarSeriesListService
;
import
com.zxr.demos.service.UdspPartsService
;
import
com.zxr.demos.service.UdspWorkHourDataService
;
import
com.zxr.demos.service.myService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.ArrayList
;
import
java.util.List
;
@Slf4j
@Service
public
class
myServiceImpl
implements
myService
{
@Autowired
private
UdspWorkHourDataService
workHourDataService
;
@Autowired
private
UdspCarSeriesListService
carSeriesListService
;
@Autowired
private
UdspPartsService
partsService
;
@Autowired
private
UdspPartsDataMapper
partsDataMapper
;
@Autowired
private
UdspWorkHourApiMapper
workHourApiMapper
;
@Autowired
private
UdspCarSeriesListApiMapper
carSeriesListApiMapper
;
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
myInsert
()
{
insert
();
}
public
void
insert
()
{
try
{
List
<
CarSeriesList
>
carSeriesLists
=
makeInsertData
();
carSeriesListApiMapper
.
insertBatch
(
carSeriesLists
);
throw
new
RuntimeException
(
"模拟错误"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
log
.
error
(
"删除和插入失败,任务回滚,错误信息: {}"
,
e
.
getMessage
());
throw
new
RuntimeException
(
"向上抛出错误: "
+
e
.
getMessage
());
}
}
private
static
List
<
CarSeriesList
>
makeInsertData
()
{
UdspCarSeriesListResult
result1
=
new
UdspCarSeriesListResult
();
result1
.
setCode
(
"123"
);
result1
.
setModelName
(
"zxr"
);
UdspCarSeriesListResult
result2
=
new
UdspCarSeriesListResult
();
result2
.
setCode
(
"123"
);
result2
.
setModelName
(
"zxr"
);
List
<
UdspCarSeriesListResult
>
resultList
=
new
ArrayList
<>();
resultList
.
add
(
result2
);
resultList
.
add
(
result1
);
//模拟接收数据
List
<
CarSeriesList
>
carSeriesLists
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
resultList
.
size
();
i
++)
{
CarSeriesList
carSeriesList
=
new
CarSeriesList
();
carSeriesList
.
setModelCode
(
resultList
.
get
(
i
).
getCode
());
carSeriesList
.
setModelName
(
resultList
.
get
(
i
).
getModelName
());
carSeriesList
.
setId
((
long
)
i
+
1
);
carSeriesLists
.
add
(
carSeriesList
);
}
return
carSeriesLists
;
}
}
test-use-main/src/main/java/com/zxr/demos/service/myService.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.service
;
public
interface
myService
{
void
myInsert
();
}
test-use-main/src/main/java/com/zxr/demos/workTest/JdApiSignature.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.demos.workTest
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.SerializationFeature
;
import
lombok.extern.slf4j.Slf4j
;
import
java.nio.charset.StandardCharsets
;
import
java.security.MessageDigest
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
@Slf4j
public
class
JdApiSignature
{
public
static
String
generateJdSignature
(
String
appKey
,
String
appSecret
,
String
method
,
Map
<
String
,
Object
>
paramJson
,
String
version
)
throws
Exception
{
// 获取当前时间戳
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss.SSSXXX"
);
sdf
.
setTimeZone
(
TimeZone
.
getTimeZone
(
"Asia/Shanghai"
));
String
timestamp
=
sdf
.
format
(
new
Date
());
// JSON 序列化,确保 JSON 格式紧凑
ObjectMapper
objectMapper
=
new
ObjectMapper
();
objectMapper
.
configure
(
SerializationFeature
.
ORDER_MAP_ENTRIES_BY_KEYS
,
true
);
// 确保 JSON 字段有序
String
paramJsonStr
=
objectMapper
.
writeValueAsString
(
paramJson
);
// 组装参数
Map
<
String
,
String
>
params
=
new
TreeMap
<>();
// TreeMap 自动按照 key 排序
params
.
put
(
"360buy_param_json"
,
paramJsonStr
);
params
.
put
(
"app_key"
,
appKey
);
params
.
put
(
"method"
,
method
);
params
.
put
(
"timestamp"
,
timestamp
);
params
.
put
(
"v"
,
version
);
// 拼接签名字符串
StringBuilder
signBuilder
=
new
StringBuilder
(
appSecret
);
for
(
Map
.
Entry
<
String
,
String
>
entry
:
params
.
entrySet
())
{
signBuilder
.
append
(
entry
.
getKey
()).
append
(
entry
.
getValue
());
}
signBuilder
.
append
(
appSecret
);
// 计算 MD5 签名
String
sign
=
md5
(
signBuilder
.
toString
()).
toUpperCase
();
// 返回最终签名
return
sign
;
}
private
static
String
md5
(
String
input
)
throws
Exception
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"MD5"
);
byte
[]
digest
=
md
.
digest
(
input
.
getBytes
(
StandardCharsets
.
UTF_8
));
StringBuilder
hexString
=
new
StringBuilder
();
for
(
byte
b
:
digest
)
{
hexString
.
append
(
String
.
format
(
"%02x"
,
b
));
}
return
hexString
.
toString
();
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
String
appKey
=
"CE3360330396998664698BADF532C298"
;
String
appSecret
=
"9d87285c00df44b3be2ffa1d2c9be572"
;
String
method
=
"jingdong.jd3cs.order.queryOrderEvaluate"
;
String
version
=
"2.0"
;
// 360buy_param_json 参数
Map
<
String
,
Object
>
paramJson
=
new
LinkedHashMap
<>();
paramJson
.
put
(
"appId"
,
appKey
);
paramJson
.
put
(
"venderCode"
,
""
);
Map
<
String
,
Object
>
data
=
new
LinkedHashMap
<>();
data
.
put
(
"startTime"
,
1640966400
);
data
.
put
(
"endTime"
,
1641052800
);
data
.
put
(
"pageNo"
,
1
);
data
.
put
(
"serviceTypeId"
,
501
);
data
.
put
(
"orderNos"
,
Arrays
.
asList
(
"PH0121121900004842"
,
"PH0122030800165609"
));
paramJson
.
put
(
"data"
,
data
);
paramJson
.
put
(
"createBy"
,
"张三"
);
// 生成签名
String
sign
=
generateJdSignature
(
appKey
,
appSecret
,
method
,
paramJson
,
version
);
System
.
out
.
println
(
"签名:"
+
sign
);
}
}
test-use-main/src/main/java/com/zxr/moduleTest01/annotation/myAnnotation/TimeLog.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.moduleTest01.annotation.myAnnotation
;
import
java.lang.annotation.*
;
@Target
({
ElementType
.
METHOD
})
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Documented
public
@interface
TimeLog
{
String
value
()
default
""
;
}
test-use-main/src/main/java/com/zxr/moduleTest01/annotation/myAspect/TimeLogAspect.java
0 → 100644
View file @
1c8b3d6c
package
com.zxr.moduleTest01.annotation.myAspect
;
import
com.zxr.moduleTest01.annotation.myAnnotation.TimeLog
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.reflect.MethodSignature
;
import
org.springframework.stereotype.Component
;
import
java.lang.reflect.Method
;
@Aspect
@Component
public
class
TimeLogAspect
{
@Around
(
"@annotation(com.zxr.moduleTest01.annotation.myAnnotation.TimeLog)"
)
public
Object
around
(
ProceedingJoinPoint
proceedingJoinPoint
)
throws
Throwable
{
long
start
=
System
.
currentTimeMillis
();
Object
result
=
proceedingJoinPoint
.
proceed
();
long
end
=
System
.
currentTimeMillis
();
MethodSignature
signature
=
(
MethodSignature
)
proceedingJoinPoint
.
getSignature
();
Method
method
=
signature
.
getMethod
();
TimeLog
timeLog
=
method
.
getAnnotation
(
TimeLog
.
class
);
System
.
out
.
println
(
"⏱ 方法 ["
+
method
.
getName
()
+
"] 执行耗时: "
+
(
end
-
start
)
+
" ms"
);
if
(!
timeLog
.
value
().
isEmpty
())
{
System
.
out
.
println
(
"📌 说明: "
+
timeLog
.
value
());
}
return
result
;
}
}
Prev
1
2
3
4
5
Next
Write
Preview
Supports
Markdown
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