Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
P
poc-api
Project
Project
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
poc
poc-api
Commits
9da0d28a
Commit
9da0d28a
authored
Nov 07, 2024
by
Roger Wu
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'release' of
ssh://gitlab.gsstcloud.com:10022/poc/poc-api
into release
parents
af30a519
b24e3e65
Show whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
537 additions
and
179 deletions
+537
-179
AgentApplicationMallService.java
...nt_application/aggregate/AgentApplicationMallService.java
+8
-2
AgentApplicationMallServiceImpl.java
...ation/aggregate/impl/AgentApplicationMallServiceImpl.java
+10
-2
BizAgentApplicationMallConvert.java
...t_application/convert/BizAgentApplicationMallConvert.java
+10
-18
MemberCollectQuery.sql
...cn/com/poc/agent_application/query/MemberCollectQuery.sql
+5
-3
AgentApplicationInfoRestImpl.java
...t_application/rest/impl/AgentApplicationInfoRestImpl.java
+5
-0
BizAgentApplicationMallRestImpl.java
...pplication/rest/impl/BizAgentApplicationMallRestImpl.java
+13
-9
BizAgentApplicationMallServiceImpl.java
...tion/service/impl/BizAgentApplicationMallServiceImpl.java
+3
-0
CurrentUserRolePermission.java
.../com/poc/common/annotation/CurrentUserRolePermission.java
+24
-0
RedisLimit.java
src/main/java/cn/com/poc/common/annotation/RedisLimit.java
+83
-0
RedisLimitAspect.java
src/main/java/cn/com/poc/common/aspect/RedisLimitAspect.java
+91
-0
AgentApplicationServiceImpl.java
...oc/expose/aggregate/impl/AgentApplicationServiceImpl.java
+1
-1
AgentApplicationRest.java
...ain/java/cn/com/poc/expose/rest/AgentApplicationRest.java
+1
-1
AgentApplicationRestImpl.java
...cn/com/poc/expose/rest/impl/AgentApplicationRestImpl.java
+15
-1
AgentApplicationClickEventMessage.java
...poc/message/entity/AgentApplicationClickEventMessage.java
+16
-0
AgentApplicationConsumerService.java
.../poc/message/service/AgentApplicationConsumerService.java
+9
-0
AgentApplicationProducerService.java
.../poc/message/service/AgentApplicationProducerService.java
+10
-0
AgentApplicationConsumerServiceImpl.java
...age/service/impl/AgentApplicationConsumerServiceImpl.java
+36
-0
AgentApplicationProducerServiceImpl.java
...age/service/impl/AgentApplicationProducerServiceImpl.java
+18
-0
AgentApplicationTopic.java
.../java/cn/com/poc/message/topic/AgentApplicationTopic.java
+11
-0
MemberInfoDto.java
src/main/java/cn/com/poc/user/dto/MemberInfoDto.java
+2
-0
BizMemberInfoRest.java
src/main/java/cn/com/poc/user/rest/BizMemberInfoRest.java
+8
-0
BizMemberInfoRestImpl.java
...java/cn/com/poc/user/rest/impl/BizMemberInfoRestImpl.java
+13
-0
exception.properties
...in/resources/framemax-config/i18n/en/exception.properties
+3
-2
exception.properties
...resources/framemax-config/i18n/zh_cn/exception.properties
+71
-70
exception.properties
...resources/framemax-config/i18n/zh_tw/exception.properties
+71
-70
No files found.
src/main/java/cn/com/poc/agent_application/aggregate/AgentApplicationMallService.java
View file @
9da0d28a
...
...
@@ -4,8 +4,14 @@ package cn.com.poc.agent_application.aggregate;
public
interface
AgentApplicationMallService
{
/**
* 收藏/取消收藏应用广场中的应用
*
* */
*/
void
collectOrCancelAgentInMall
(
Integer
id
)
throws
Exception
;
/**
* 添加浏览量
*
* @param agentPublishId 应用广场发布id
*/
void
addClickNumber
(
Integer
agentPublishId
)
throws
Exception
;
}
src/main/java/cn/com/poc/agent_application/aggregate/impl/AgentApplicationMallServiceImpl.java
View file @
9da0d28a
package
cn
.
com
.
poc
.
agent_application
.
aggregate
.
impl
;
import
cn.com.poc.agent_application.aggregate.AgentApplicationMallService
;
import
cn.com.poc.agent_application.convert.BizAgentApplicationMallConvert
;
import
cn.com.poc.agent_application.dto.BizAgentApplicationMallDto
;
import
cn.com.poc.agent_application.entity.BizAgentApplicationMallEntity
;
import
cn.com.poc.agent_application.entity.BizAgentApplicationPublishEntity
;
import
cn.com.poc.agent_application.entity.BizMemberAgentApplicationCollectEntity
;
...
...
@@ -85,4 +83,14 @@ public class AgentApplicationMallServiceImpl implements AgentApplicationMallServ
}
bizAgentApplicationMallService
.
update
(
mallEntity
);
}
@Override
public
void
addClickNumber
(
Integer
agentPublishId
)
throws
Exception
{
BizAgentApplicationMallEntity
mallEntity
=
bizAgentApplicationMallService
.
getByAgentPublishId
(
agentPublishId
);
if
(
mallEntity
==
null
)
{
return
;
}
mallEntity
.
setClickNumber
(
mallEntity
.
getClickNumber
()
+
1
);
bizAgentApplicationMallService
.
update
(
mallEntity
);
}
}
src/main/java/cn/com/poc/agent_application/convert/BizAgentApplicationMallConvert.java
View file @
9da0d28a
...
...
@@ -119,8 +119,8 @@ public class BizAgentApplicationMallConvert {
BizAgentApplicationPublishService
agentApplicationPublishService
=
SpringUtils
.
getBean
(
BizAgentApplicationPublishServiceImpl
.
class
);
BizAgentApplicationPublishEntity
publishEntity
=
agentApplicationPublishService
.
get
(
item
.
getAgentPublishId
());
AgentApplicationBaseInfo
baseInfo
=
new
AgentApplicationBaseInfo
();
if
(
publishEntity
!=
null
)
{
AgentApplicationBaseInfo
baseInfo
=
new
AgentApplicationBaseInfo
();
baseInfo
.
setMemberId
(
publishEntity
.
getMemberId
());
baseInfo
.
setAgentId
(
publishEntity
.
getAgentId
());
baseInfo
.
setAgentTitle
(
publishEntity
.
getAgentTitle
());
...
...
@@ -129,10 +129,8 @@ public class BizAgentApplicationMallConvert {
baseInfo
.
setAgentSystem
(
publishEntity
.
getAgentSystem
());
baseInfo
.
setAgentPublishStatus
(
publishEntity
.
getAgentPublishStatus
());
baseInfo
.
setPublishTime
(
publishEntity
.
getPublishTime
());
}
AgentApplicationCommConfig
commConfig
=
new
AgentApplicationCommConfig
();
if
(
publishEntity
!=
null
)
{
commConfig
.
setPreamble
(
publishEntity
.
getPreamble
());
commConfig
.
setFeaturedQuestions
(
publishEntity
.
getFeaturedQuestions
());
commConfig
.
setContinuousQuestionStatus
(
publishEntity
.
getContinuousQuestionStatus
());
...
...
@@ -140,32 +138,26 @@ public class BizAgentApplicationMallConvert {
commConfig
.
setContinuousQuestionTurn
(
publishEntity
.
getContinuousQuestionTurn
());
commConfig
.
setVariableStructure
(
publishEntity
.
getVariableStructure
());
commConfig
.
setIsLongMemory
(
publishEntity
.
getIsLongMemory
());
}
AgentApplicationKnowledgeConfig
knowledgeConfig
=
new
AgentApplicationKnowledgeConfig
();
if
(
publishEntity
!=
null
)
{
knowledgeConfig
.
setKnowledgeIds
(
publishEntity
.
getKnowledgeIds
());
}
AgentApplicationCommModelConfig
commModelConfig
=
new
AgentApplicationCommModelConfig
();
if
(
publishEntity
!=
null
)
{
commModelConfig
.
setLargeModel
(
publishEntity
.
getLargeModel
());
commModelConfig
.
setTopP
(
publishEntity
.
getTopP
());
commModelConfig
.
setCommunicationTurn
(
publishEntity
.
getCommunicationTurn
());
}
dto
.
setId
(
item
.
getId
());
dto
.
setAgentType
(
item
.
getAgentType
());
dto
.
setCollectNumber
(
item
.
getCollectNumber
());
dto
.
setClickNumber
(
item
.
getClickNumber
());
dto
.
setUnitIds
(
publishEntity
.
getUnitIds
());
dto
.
setBaseInfo
(
baseInfo
);
dto
.
setCommConfig
(
commConfig
);
dto
.
setKnowledgeConfig
(
knowledgeConfig
);
dto
.
setCommModelConfig
(
commModelConfig
);
if
(
publishEntity
!=
null
)
{
dto
.
setUnitIds
(
publishEntity
.
getUnitIds
());
}
dto
.
setId
(
item
.
getId
());
dto
.
setAgentType
(
item
.
getAgentType
());
dto
.
setCollectNumber
(
item
.
getCollectNumber
());
dto
.
setClickNumber
(
item
.
getClickNumber
());
dto
.
setIsCopy
(
item
.
getIsCopy
());
dto
.
setIsSale
(
item
.
getIsSale
());
dto
.
setPopularity
(
item
.
getPopularity
());
...
...
src/main/java/cn/com/poc/agent_application/query/MemberCollectQuery.sql
View file @
9da0d28a
select
baap
.
member_id
as
member_id
,
select
distinct
baap
.
member_id
as
member_id
,
baap
.
agent_id
as
agent_id
,
baap
.
agent_title
as
agent_title
,
baap
.
agent_desc
as
agent_desc
,
baap
.
agent_avatar
as
agent_avatar
from
biz_member_agent_application_collect
bmaac
left
join
biz_agent_application_publish
baap
on
baap
.
agent_id
=
bmaac
.
agent_id
and
baap
.
is_deleted
=
'N'
where
bmaac
.
is_deleted
=
'N'
<<
and
bmaac
.
is_collect
=
:
isCollect
>>
left
join
biz_agent_application_publish
baap
on
baap
.
agent_id
=
bmaac
.
agent_id
where
baap
.
is_deleted
=
'N'
and
bmaac
.
is_deleted
=
'N'
<<
and
bmaac
.
is_collect
=
:
isCollect
>>
<<
and
bmaac
.
member_id
=
:
memberId
>>
order
by
baap
.
created_time
desc
\ No newline at end of file
src/main/java/cn/com/poc/agent_application/rest/impl/AgentApplicationInfoRestImpl.java
View file @
9da0d28a
...
...
@@ -7,6 +7,7 @@ import cn.com.poc.agent_application.entity.*;
import
cn.com.poc.agent_application.query.AgentApplicationInfoQueryCondition
;
import
cn.com.poc.agent_application.rest.AgentApplicationInfoRest
;
import
cn.com.poc.agent_application.service.*
;
import
cn.com.poc.common.annotation.RedisLimit
;
import
cn.com.poc.common.constant.CommonConstant
;
import
cn.com.poc.common.service.RedisService
;
import
cn.com.poc.common.utils.BlContext
;
...
...
@@ -347,6 +348,7 @@ public class AgentApplicationInfoRestImpl implements AgentApplicationInfoRest {
}
@Override
@RedisLimit
(
key
=
"collect:agent_person"
,
currentUser
=
true
,
count
=
1
,
timeout
=
1
,
exceptionInfo
=
"exception/too.many.requests"
)
public
void
collectOrCancelAgentInPerson
(
String
agentId
)
throws
Exception
{
Assert
.
notNull
(
agentId
);
agentApplicationInfoService
.
collectOrCancelAgentInPerson
(
agentId
);
...
...
@@ -359,6 +361,9 @@ public class AgentApplicationInfoRestImpl implements AgentApplicationInfoRest {
if
(
MapUtils
.
isEmpty
(
map
))
{
BizAgentApplicationInfoEntity
infoEntity
=
bizAgentApplicationInfoService
.
getByAgentId
(
agentId
);
List
<
Variable
>
variableStructure
=
infoEntity
.
getVariableStructure
();
if
(
CollectionUtils
.
isEmpty
(
variableStructure
))
{
return
result
;
}
for
(
Variable
variable
:
variableStructure
)
{
AgentApplicationValueMemoryDto
valueMemoryDto
=
new
AgentApplicationValueMemoryDto
();
valueMemoryDto
.
setKey
(
variable
.
getKey
());
...
...
src/main/java/cn/com/poc/agent_application/rest/impl/BizAgentApplicationMallRestImpl.java
View file @
9da0d28a
...
...
@@ -11,13 +11,17 @@ import cn.com.poc.agent_application.entity.BizAgentApplicationPublishEntity;
import
cn.com.poc.agent_application.entity.BizMemberAgentApplicationCollectEntity
;
import
cn.com.poc.agent_application.query.MallAgentApplicationQueryCondition
;
import
cn.com.poc.agent_application.query.MallAgentApplicationQueryItem
;
import
cn.com.poc.agent_application.query.MemberCollectQueryCondition
;
import
cn.com.poc.agent_application.query.MemberCollectQueryItem
;
import
cn.com.poc.agent_application.rest.BizAgentApplicationMallRest
;
import
cn.com.poc.agent_application.service.BizAgentApplicationCategoryService
;
import
cn.com.poc.agent_application.service.BizAgentApplicationMallService
;
import
cn.com.poc.agent_application.service.BizAgentApplicationPublishService
;
import
cn.com.poc.agent_application.service.BizMemberAgentApplicationCollectService
;
import
cn.com.poc.common.annotation.RedisLimit
;
import
cn.com.poc.common.constant.CommonConstant
;
import
cn.com.poc.common.constant.XLangConstant
;
import
cn.com.poc.common.utils.BlContext
;
import
cn.com.poc.common.utils.StringUtils
;
import
cn.com.yict.framemax.core.i18n.I18nMessageException
;
import
cn.com.yict.framemax.data.model.PagingInfo
;
...
...
@@ -28,6 +32,7 @@ import javax.annotation.Resource;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.TimeUnit
;
@Component
public
class
BizAgentApplicationMallRestImpl
implements
BizAgentApplicationMallRest
{
...
...
@@ -111,20 +116,18 @@ public class BizAgentApplicationMallRestImpl implements BizAgentApplicationMallR
}
}
List
<
MallAgentApplicationQueryItem
>
items
=
bizAgentApplicationMallService
.
mallAgentApplicationQuery
(
mallAgentApplicationQueryCondition
,
pagingInfo
);
MemberCollectQueryCondition
collectQueryCondition
=
new
MemberCollectQueryCondition
();
collectQueryCondition
.
setMemberId
(
BlContext
.
getCurrentUserNotException
().
getUserId
());
collectQueryCondition
.
setIsCollect
(
CommonConstant
.
YOrN
.
Y
);
List
<
MemberCollectQueryItem
>
memberCollectQueryItems
=
bizMemberAgentApplicationCollectService
.
queryMemberCollect
(
collectQueryCondition
,
null
);
for
(
MallAgentApplicationQueryItem
item
:
items
)
{
BizAgentApplicationMallDto
mallDto
=
BizAgentApplicationMallConvert
.
itemToDto
(
item
);
// 如果应用上架了
if
(
CommonConstant
.
IsDeleted
.
Y
.
equals
(
mallDto
.
getIsSale
()))
{
if
(
mallDto
.
getBaseInfo
()
!=
null
&&
CommonConstant
.
YOrN
.
Y
.
equals
(
mallDto
.
getIsSale
()))
{
// 设置当前用户是否收藏了
if
(
mallDto
.
getBaseInfo
()
!=
null
)
{
BizMemberAgentApplicationCollectEntity
collect
=
bizMemberAgentApplicationCollectService
.
getByAgentId
(
mallDto
.
getBaseInfo
().
getAgentId
());
if
(
collect
!=
null
)
{
mallDto
.
setIsCollect
(
collect
.
getIsCollect
());
}
else
{
mallDto
.
setIsCollect
(
CommonConstant
.
IsDeleted
.
N
);
}
}
String
agentId
=
mallDto
.
getBaseInfo
().
getAgentId
();
mallDto
.
setIsCollect
(
memberCollectQueryItems
.
stream
().
anyMatch
(
v
->
agentId
.
equals
(
v
.
getAgentId
()))
?
CommonConstant
.
YOrN
.
Y
:
CommonConstant
.
YOrN
.
N
);
resultList
.
add
(
mallDto
);
}
}
...
...
@@ -143,6 +146,7 @@ public class BizAgentApplicationMallRestImpl implements BizAgentApplicationMallR
}
@Override
@RedisLimit
(
currentUser
=
true
,
key
=
"collect:agent"
,
count
=
1
,
timeout
=
1
,
exceptionInfo
=
"exception/collect.limit.message"
)
public
void
collectOrCancelAgentInMall
(
Integer
id
)
throws
Exception
{
Assert
.
notNull
(
id
);
agentApplicationMallService
.
collectOrCancelAgentInMall
(
id
);
...
...
src/main/java/cn/com/poc/agent_application/service/impl/BizAgentApplicationMallServiceImpl.java
View file @
9da0d28a
...
...
@@ -109,6 +109,9 @@ public class BizAgentApplicationMallServiceImpl extends BaseServiceImpl
if
(
entity
.
getIsSale
()
!=
null
)
{
model
.
setIsSale
(
entity
.
getIsSale
());
}
if
(
entity
.
getCategoryId
()
!=
null
)
{
model
.
setCategoryId
(
entity
.
getCategoryId
());
}
if
(
entity
.
getPopularity
()
!=
null
)
{
model
.
setPopularity
(
entity
.
getPopularity
());
}
...
...
src/main/java/cn/com/poc/common/annotation/CurrentUserRolePermission.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
common
.
annotation
;
import
org.springframework.stereotype.Component
;
import
java.lang.annotation.*
;
/**
* @author Ken
*/
@Target
({
ElementType
.
METHOD
})
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Documented
@Component
public
@interface
CurrentUserRolePermission
{
String
[]
permissionCodeArr
();
String
prompt
()
default
"无权限,请联系管理员"
;
}
src/main/java/cn/com/poc/common/annotation/RedisLimit.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
common
.
annotation
;
import
org.springframework.stereotype.Component
;
import
java.lang.annotation.*
;
/**
* 限流
*/
@Target
(
ElementType
.
METHOD
)
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Component
@Documented
public
@interface
RedisLimit
{
/**
* 限流key
*/
String
key
();
/**
* 限流数量 [单位时间内次数]
*/
int
count
();
/**
* 限流时间 默认60秒
*/
long
timeout
()
default
60
;
/**
* 限流时间单位 [默认秒]
*/
LimitTimeUnit
timeUnit
()
default
LimitTimeUnit
.
SECONDS
;
/**
* 是否针对当前用户
*
* @return
*/
boolean
currentUser
()
default
false
;
/**
* 异常信息
*/
String
exceptionInfo
()
default
""
;
enum
LimitTimeUnit
{
/**
* 秒
*/
SECONDS
,
/**
* 分钟
*/
MINUTES
,
/**
* 小时
*/
HOURS
,
/**
* 天
*/
DAYS
,
/**
* 当日
*/
DAY_OF_MONTH
,
/**
* 当月
*/
MONTH_OF_YEAR
;
LimitTimeUnit
(){}
}
}
src/main/java/cn/com/poc/common/aspect/RedisLimitAspect.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
common
.
aspect
;
import
cn.com.poc.common.annotation.RedisLimit
;
import
cn.com.poc.common.utils.BlContext
;
import
cn.com.poc.common.utils.DateUtils
;
import
cn.com.poc.support.security.oauth.entity.UserBaseEntity
;
import
cn.com.yict.framemax.core.exception.BusinessException
;
import
cn.com.yict.framemax.core.i18n.I18nMessageException
;
import
org.aspectj.lang.ProceedingJoinPoint
;
import
org.aspectj.lang.annotation.Around
;
import
org.aspectj.lang.annotation.Aspect
;
import
org.aspectj.lang.annotation.Pointcut
;
import
org.aspectj.lang.reflect.MethodSignature
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.lang.reflect.Method
;
import
java.util.Date
;
import
java.util.concurrent.TimeUnit
;
/**
* 限流切面
*/
@Aspect
@Component
public
class
RedisLimitAspect
{
private
final
Logger
logger
=
LoggerFactory
.
getLogger
(
RedisLimitAspect
.
class
);
@Resource
private
RedisTemplate
<
String
,
Integer
>
redisTemplate
;
@Pointcut
(
"@annotation( cn.com.poc.common.annotation.RedisLimit)"
)
public
void
redisLimitAnnotation
()
{
}
@Around
(
value
=
"redisLimitAnnotation()"
)
public
Object
around
(
ProceedingJoinPoint
joinPoint
)
throws
Throwable
{
Method
method
=
((
MethodSignature
)
joinPoint
.
getSignature
()).
getMethod
();
RedisLimit
annotation
=
method
.
getAnnotation
(
RedisLimit
.
class
);
StringBuilder
redisKey
=
new
StringBuilder
();
String
key
=
annotation
.
key
();
redisKey
.
append
(
"Limit_"
);
redisKey
.
append
(
key
);
redisKey
.
append
(
":"
);
if
(
annotation
.
currentUser
())
{
UserBaseEntity
currentUser
=
BlContext
.
getCurrentUserNotException
();
redisKey
.
append
(
currentUser
.
getUserId
());
}
if
(
Boolean
.
FALSE
.
equals
(
redisTemplate
.
hasKey
(
redisKey
.
toString
())))
{
redisTemplate
.
opsForValue
().
increment
(
redisKey
.
toString
(),
1
);
redisTemplate
.
expire
(
redisKey
.
toString
(),
expireTime
(
annotation
.
timeout
(),
annotation
.
timeUnit
()),
TimeUnit
.
MILLISECONDS
);
}
else
if
(
redisTemplate
.
opsForValue
().
get
(
redisKey
.
toString
()).
intValue
()
>=
annotation
.
count
())
{
throw
new
I18nMessageException
(
annotation
.
exceptionInfo
());
}
else
{
redisTemplate
.
opsForValue
().
increment
(
redisKey
.
toString
(),
1
);
}
return
joinPoint
.
proceed
();
}
private
Long
expireTime
(
Long
timeout
,
RedisLimit
.
LimitTimeUnit
limitTimeUnit
)
{
switch
(
limitTimeUnit
)
{
case
SECONDS:
return
timeout
*
1000
;
case
MINUTES:
return
timeout
*
60
*
1000
;
case
HOURS:
return
timeout
*
60
*
60
*
1000
;
case
DAYS:
Date
date
=
new
Date
();
return
DateUtils
.
diffTwoDate
(
DateUtils
.
addDays
(
date
,
timeout
.
intValue
()),
date
);
case
DAY_OF_MONTH:
Date
dayBegin
=
DateUtils
.
getDayBegin
(
DateUtils
.
addDays
(
DateUtils
.
getToday
(),
timeout
.
intValue
()));
return
DateUtils
.
diffTwoDate
(
dayBegin
,
DateUtils
.
getToday
());
case
MONTH_OF_YEAR:
Date
monthBegin
=
DateUtils
.
getMonthBegin
(
DateUtils
.
getMonthAfter
(
DateUtils
.
getToday
(),
timeout
.
intValue
()));
return
DateUtils
.
diffTwoDate
(
monthBegin
,
DateUtils
.
getToday
());
default
:
throw
new
BusinessException
(
"不支持的单位"
);
}
}
}
src/main/java/cn/com/poc/expose/aggregate/impl/AgentApplicationServiceImpl.java
View file @
9da0d28a
src/main/java/cn/com/poc/expose/rest/AgentApplicationRest.java
View file @
9da0d28a
...
...
@@ -31,7 +31,7 @@ public interface AgentApplicationRest extends BaseRest {
/**
* 创建对话
*/
String
createDialogues
()
throws
Exception
;
String
createDialogues
(
@RequestParam
(
required
=
false
)
String
agentId
)
throws
Exception
;
/**
* 调用 已发布Agent应用
...
...
src/main/java/cn/com/poc/expose/rest/impl/AgentApplicationRestImpl.java
View file @
9da0d28a
package
cn
.
com
.
poc
.
expose
.
rest
.
impl
;
import
cn.com.poc.agent_application.aggregate.AgentApplicationInfoService
;
import
cn.com.poc.agent_application.aggregate.AgentApplicationMallService
;
import
cn.com.poc.agent_application.convert.AgentApplicationInfoConvert
;
import
cn.com.poc.agent_application.convert.BizAgentApplicationPublishConvert
;
import
cn.com.poc.agent_application.dto.AgentApplicationCreateContinueQuesDto
;
...
...
@@ -19,10 +20,14 @@ import cn.com.poc.common.utils.UUIDTool;
import
cn.com.poc.expose.aggregate.AgentApplicationService
;
import
cn.com.poc.expose.dto.*
;
import
cn.com.poc.expose.rest.AgentApplicationRest
;
import
cn.com.poc.message.entity.AgentApplicationClickEventMessage
;
import
cn.com.poc.message.service.AgentApplicationProducerService
;
import
cn.com.poc.support.security.oauth.entity.UserBaseEntity
;
import
cn.com.yict.framemax.core.i18n.I18nMessageException
;
import
cn.com.yict.framemax.data.model.PagingInfo
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
...
...
@@ -37,6 +42,7 @@ import java.util.stream.Collectors;
@Component
public
class
AgentApplicationRestImpl
implements
AgentApplicationRest
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
AgentApplicationRest
.
class
);
@Resource
private
AgentApplicationService
agentApplicationService
;
...
...
@@ -50,6 +56,9 @@ public class AgentApplicationRestImpl implements AgentApplicationRest {
@Resource
private
BizAgentApplicationDialoguesRecordService
bizAgentApplicationDialoguesRecordService
;
@Resource
private
AgentApplicationProducerService
agentApplicationProducerService
;
@Override
public
List
<
String
>
getRecommendQuestions
(
HttpServletRequest
httpServletRequest
)
throws
Exception
{
return
agentApplicationService
.
getRecommendQuestions
(
httpServletRequest
.
getHeader
(
"x-lang"
));
...
...
@@ -78,7 +87,12 @@ public class AgentApplicationRestImpl implements AgentApplicationRest {
}
@Override
public
String
createDialogues
()
{
public
String
createDialogues
(
String
agentId
)
{
if
(
StringUtils
.
isNotBlank
(
agentId
))
{
AgentApplicationClickEventMessage
agentApplicationClickEventMessage
=
new
AgentApplicationClickEventMessage
();
agentApplicationClickEventMessage
.
setAgentId
(
agentId
);
agentApplicationProducerService
.
clickEvent
(
agentApplicationClickEventMessage
);
}
return
"DIA_"
+
UUIDTool
.
getUUID
();
}
...
...
src/main/java/cn/com/poc/message/entity/AgentApplicationClickEventMessage.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
message
.
entity
;
import
java.io.Serializable
;
public
class
AgentApplicationClickEventMessage
implements
Serializable
{
private
String
agentId
;
public
String
getAgentId
()
{
return
agentId
;
}
public
void
setAgentId
(
String
agentId
)
{
this
.
agentId
=
agentId
;
}
}
src/main/java/cn/com/poc/message/service/AgentApplicationConsumerService.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
message
.
service
;
import
cn.com.poc.message.entity.AgentApplicationClickEventMessage
;
import
cn.com.yict.framemax.core.service.BaseService
;
public
interface
AgentApplicationConsumerService
extends
BaseService
{
void
clickEvent
(
AgentApplicationClickEventMessage
message
)
throws
Exception
;
}
src/main/java/cn/com/poc/message/service/AgentApplicationProducerService.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
message
.
service
;
import
cn.com.poc.message.entity.AgentApplicationClickEventMessage
;
import
cn.com.yict.framemax.core.service.BaseService
;
public
interface
AgentApplicationProducerService
extends
BaseService
{
AgentApplicationClickEventMessage
clickEvent
(
AgentApplicationClickEventMessage
message
);
}
src/main/java/cn/com/poc/message/service/impl/AgentApplicationConsumerServiceImpl.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
message
.
service
.
impl
;
import
cn.com.poc.agent_application.aggregate.AgentApplicationMallService
;
import
cn.com.poc.agent_application.entity.BizAgentApplicationPublishEntity
;
import
cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService
;
import
cn.com.poc.agent_application.service.BizAgentApplicationPublishService
;
import
cn.com.poc.message.entity.AgentApplicationClickEventMessage
;
import
cn.com.poc.message.service.AgentApplicationConsumerService
;
import
cn.com.poc.message.topic.AgentApplicationTopic
;
import
cn.com.yict.framemax.core.service.BaseService
;
import
cn.com.yict.framemax.tumbleweed.client.annotation.Consumer
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
@Service
public
class
AgentApplicationConsumerServiceImpl
implements
AgentApplicationConsumerService
{
@Resource
private
BizAgentApplicationPublishService
bizAgentApplicationPublishService
;
@Resource
private
AgentApplicationMallService
agentApplicationMallService
;
@Override
@Consumer
(
topic
=
AgentApplicationTopic
.
AGENT_APPLICATION_CLICK_EVENT
,
retry
=
true
)
public
void
clickEvent
(
AgentApplicationClickEventMessage
message
)
throws
Exception
{
BizAgentApplicationPublishEntity
agentApplicationPublishEntity
=
bizAgentApplicationPublishService
.
getByAgentId
(
message
.
getAgentId
());
if
(
agentApplicationPublishEntity
!=
null
)
{
Integer
publishId
=
agentApplicationPublishEntity
.
getId
();
agentApplicationMallService
.
addClickNumber
(
publishId
);
}
}
}
src/main/java/cn/com/poc/message/service/impl/AgentApplicationProducerServiceImpl.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
message
.
service
.
impl
;
import
cn.com.poc.message.entity.AgentApplicationClickEventMessage
;
import
cn.com.poc.message.service.AgentApplicationProducerService
;
import
cn.com.poc.message.topic.AgentApplicationTopic
;
import
cn.com.yict.framemax.core.service.BaseService
;
import
cn.com.yict.framemax.tumbleweed.client.annotation.Producer
;
import
org.springframework.stereotype.Service
;
@Service
public
class
AgentApplicationProducerServiceImpl
implements
AgentApplicationProducerService
{
@Override
@Producer
(
topic
=
AgentApplicationTopic
.
AGENT_APPLICATION_CLICK_EVENT
)
public
AgentApplicationClickEventMessage
clickEvent
(
AgentApplicationClickEventMessage
message
)
{
return
message
;
}
}
src/main/java/cn/com/poc/message/topic/AgentApplicationTopic.java
0 → 100644
View file @
9da0d28a
package
cn
.
com
.
poc
.
message
.
topic
;
public
interface
AgentApplicationTopic
{
/**
* Agent application click event.
*/
String
AGENT_APPLICATION_CLICK_EVENT
=
"agent_application_click_event"
;
}
src/main/java/cn/com/poc/user/dto/MemberInfoDto.java
View file @
9da0d28a
...
...
@@ -2,6 +2,8 @@ package cn.com.poc.user.dto;
import
cn.com.yict.framemax.data.model.BaseModelClass
;
import
com.fasterxml.jackson.annotation.JsonIgnoreProperties
;
import
com.fasterxml.jackson.annotation.JsonInclude
;
import
java.util.Date
;
...
...
src/main/java/cn/com/poc/user/rest/BizMemberInfoRest.java
View file @
9da0d28a
...
...
@@ -8,7 +8,9 @@ import cn.com.poc.user.dto.MemberPasswordRequestDto;
import
cn.com.yict.framemax.core.rest.BaseRest
;
import
cn.com.yict.framemax.web.permission.Access
;
import
cn.com.yict.framemax.web.permission.Permission
;
import
org.springframework.security.core.parameters.P
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestParam
;
@Permission
(
Access
.
Safety
)
public
interface
BizMemberInfoRest
extends
BaseRest
{
...
...
@@ -41,4 +43,10 @@ public interface BizMemberInfoRest extends BaseRest {
* @return
*/
MemberInfoDto
getCurrentMemberInfo
()
throws
Exception
;
/**
* 获取用户昵称
*/
@Permission
(
Access
.
Anonymous
)
MemberInfoDto
getMemberNickName
(
@RequestParam
Long
memberId
)
throws
Exception
;
}
\ No newline at end of file
src/main/java/cn/com/poc/user/rest/impl/BizMemberInfoRestImpl.java
View file @
9da0d28a
...
...
@@ -14,6 +14,7 @@ import cn.com.poc.user.aggregation.MemberInfoService;
import
cn.com.poc.user.builder.LoginChannelBuilder
;
import
cn.com.poc.user.entity.MemberInfoEntity
;
import
cn.com.poc.user.service.BizMemberInfoService
;
import
cn.com.yict.framemax.core.i18n.I18nMessageException
;
import
cn.com.yict.framemax.security.oauth.OauthAccesstokenManager
;
import
cn.com.yict.framemax.security.oauth.entity.OauthResultEntity
;
import
org.springframework.stereotype.Component
;
...
...
@@ -111,4 +112,16 @@ public class BizMemberInfoRestImpl implements BizMemberInfoRest {
return
MemberInfoConvert
.
converEntity2Dto
(
memberInfoEntity
);
}
@Override
public
MemberInfoDto
getMemberNickName
(
Long
memberId
)
throws
Exception
{
MemberInfoEntity
memberInfoEntity
=
bizMemberInfoService
.
getById
(
memberId
.
intValue
());
if
(
memberInfoEntity
==
null
)
{
throw
new
I18nMessageException
(
"exception/user.does.not.exist"
);
}
MemberInfoDto
memberInfoDto
=
new
MemberInfoDto
();
memberInfoDto
.
setNickName
(
memberInfoEntity
.
getNickName
());
memberInfoDto
.
setAvatarUrl
(
memberInfoEntity
.
getAvatarUrl
());
return
memberInfoDto
;
}
}
\ No newline at end of file
src/main/resources/framemax-config/i18n/en/exception.properties
View file @
9da0d28a
...
...
@@ -58,7 +58,7 @@ failed.to.obtain.token=Failed to obtain token
re-verify.the.user.identity
=
Please re verify the user's identity
user.cannot.be.found
=
The user cannot be found
verification.code.is.incorrect.please.re-enter
=
The verification code is incorrect, please re-enter
user.does.not.exist
=
The login u
ser does not exist
user.does.not.exist
=
U
ser does not exist
password.error.please.re-enter
=
Password error, please re-enter
unable.find.user.association.relationship
=
Unable to find user's association relationship
account.has.already
=
This account has already been registered, please replace it
...
...
@@ -68,3 +68,4 @@ model.not.exist=Model not exist
upload.more.than.10m
=
The uploaded file cannot exceed 10M file name
error.file.content.is.null
=
Incorrect file, file contents cannot be empty, file name
file.content.more.than.100w
=
The number of characters in a file cannot exceed 100w
collect.limit.message
=
Click too fast, do not repeat the operation
\ No newline at end of file
src/main/resources/framemax-config/i18n/zh_cn/exception.properties
View file @
9da0d28a
publication.failed
=
发布失败
create.[role.instruction]
.configuration.does.not.exist
=
创建[角色指令]配置不存在
create.[opening.statement]
.configuration.does.not.exist
=
创建[开场白]配置不存在
failed.to.create.[opening.statement]=创建[开场白]失败
the.configuration.for.creating.[avatar.prompt]
.does.not.exist.please.contact.the.administrator
=
创建[头像提示语]配置不存在,请联系管理员
failed.to.create.[avatar]
.please.try.again.later
=
创建[头像]失败,请稍后再试
create.[application.information]
.configuration.does.not.exist.please.contact.the.administrator
=
创建[应用信息]配置不存在,请联系管理员
failed.to.create.[application.information]
.please.try.again.later
=
创建[应用信息]失败,请稍后再试
user.not.login
=
用户未登录
application.does.not.exist
=
应用不存在
application.not.released
=
应用未发布
generation.failed.please.try.again.later
=
生成失败,请稍后重试
data.does.not.exist
=
数据不存在
there.are.too.many.tasks.currently.please.try.again.later
=
当前任务过多,请稍后重试
verification.code.has.expired.please.obtain.it.again
=
验证码已过期,请重新获取
maximum.number.of.verifications.has.been.reached
=
验证次数已达上限
verification.code.sending.failed.please.try.again
=
验证码发送失败!请重试
upload.exception.please.check.the.file.before.uploading.again
=
上传异常,请检查文件后再上传
abnormal.call.to.upload.alibaba.cloud.images
=
调用上传阿里云图片异常!
cannot.read.data.from.this.url
=
不能从该url中读取到数据
error.signature
=
错误的签名
signature.validity.time.exception
=
签名有效时间异常
signature.has.expired
=
签名已过期
app.not.found
=
未找到应用
failed.to.generate.recommendation.question
=
生成推荐问题失败
document.does.not.exist
=
文档不存在
knowledge.base.information.does.not.exist
=
知识库信息不存在
repetitive.training.in.the.knowledge.base
=
知识库重复训练
knowledge.base.does.not.exist
=
知识库不存在
private.key.of.the.marketing.platform.configuration.project.is.empty
=
营销中台配置项目私钥为空
decryption.offset.of.the.marketing.platform.configuration.is.empty
=
营销中台配置解密偏移量为空
middle.server.is.unresponsive.or.has.timed.out
=
中台服务器无响应或响应超时!
key.for.the.marketing.platform.configuration.project.is.empty
=
营销中台配置项目key为空
secret.for.the.marketing.platform.configuration.project.is.empty
=
营销中台配置项目密钥为空
failed.to.obtain.xinghai.apptoken
=
获取兴海apptoken失败
default.login.channel.login.is.currently.not.supported
=
暂不支持默认登录渠道登录!
third.party.authorization.channel.abnormal
=
第三方授权渠道异常!
third.party.login.channel.abnormality
=
第三方登录渠道异常
abnormal.configuration.of.bai.liantong.open.platform
=
百联通开放平台配置异常!
abnormal.acquisition.of.mini.program.information.please.check.if.the.configuration.is.correct
=
获取小程序信息异常!请检查配置是否正确!
currently.no.default.registration.channel.for.login
=
暂无默认注册渠道登录!
abnormal.registration.channel
=
注册渠道异常
login.expiration.time.configured.as.empty
=
登录过期时间配置为空!
there.is.currently.no.default.verification.code.channel.login
=
暂无默认验证码渠道登录!
verification.code.channel.abnormality
=
验证码渠道异常
failed.to.obtain.baidu.token
=
获取百度token失败
training.exception.please.contact.the.administrator
=
翻译异常,请联系管理员
image.generation.failed
=
生成图片失败
middle.platform.is.unresponsive
=
中台无响应,请联系开发人员
no.response.please.contact.the.developer
=
无响应,请联系开发人员
abnormal.knowledge.base.training
=
知识库训练异常
abnormal.training.status.of.knowledge.base.acquisition
=
获取知识库训练状态异常
delete.knowledge.base.exception
=
删除知识库异常
query.knowledge.base.exception
=
查询知识库异常
variable.structure.configuration.is.not.currently.supported
=
暂不支持变量结构配置
this.method.is.not.supported
=
不支持此方法
failed.to.obtain.token
=
获取token失败
re-verify.the.user.identity
=
请重新验证用户身份
user.cannot.be.found
=
找不到该用户
verification.code.is.incorrect.please.re-enter
=
验证码有误,请重新输入
user.does.not.exist
=
登录的用户不存在
password.error.please.re-enter
=
密码错误,请重新输入
unable.find.user.association.relationship
=
找不到用户的关联关系
account.has.already
=
该账号已经被注册,请更换一个
not.support.lang
=
不支持该语音
call.failure
=
调用失败
model.not.exist
=
模型不存在
upload.more.than.10m
=
上传的文件不能超过10M,文件名
error.file.content.is.null
=
错误的文件,文件内容不能为空,文件名
file.content.more.than.100w
=
文件内容字符数不能超过100w,文件名
\ No newline at end of file
publication.failed
=
\u
53D1
\u
5E03
\u5931\u
8D25
create.[role.instruction]
.configuration.does.not.exist
=
\u
521B
\u
5EFA[
\u
89D2
\u8272\u6307\u
4EE4]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728
create.[opening.statement]
.configuration.does.not.exist
=
\u
521B
\u
5EFA[
\u
5F00
\u
573A
\u
767D]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728
failed.to.create.[opening.statement]=\u521B\u5EFA[\u5F00\u573A\u767D]\u5931\u8D25
the.configuration.for.creating.[avatar.prompt]
.does.not.exist.please.contact.the.administrator
=
\u
521B
\u
5EFA[
\u5934\u
50CF
\u
63D0
\u
793A
\u
8BED]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728\u
FF0C
\u
8BF7
\u8054\u
7CFB
\u
7BA1
\u7406\u5458
failed.to.create.[avatar]
.please.try.again.later
=
\u
521B
\u
5EFA[
\u5934\u
50CF]
\u5931\u
8D25,
\u
8BF7
\u
7A0D
\u
540E
\u
518D
\u
8BD5
create.[application.information]
.configuration.does.not.exist.please.contact.the.administrator
=
\u
521B
\u
5EFA[
\u
5E94
\u7528\u
4FE1
\u
606F]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728\u
FF0C
\u
8BF7
\u8054\u
7CFB
\u
7BA1
\u7406\u5458
failed.to.create.[application.information]
.please.try.again.later
=
\u
521B
\u
5EFA[
\u
5E94
\u7528\u
4FE1
\u
606F]
\u5931\u
8D25,
\u
8BF7
\u
7A0D
\u
540E
\u
518D
\u
8BD5
user.not.login
=
\u7528\u6237\u
672A
\u
767B
\u
5F55
application.does.not.exist
=
\u
5E94
\u7528\u
4E0D
\u
5B58
\u5728
application.not.released
=
\u
5E94
\u7528\u
672A
\u
53D1
\u
5E03
generation.failed.please.try.again.later
=
\u
751F
\u6210\u5931\u
8D25,
\u
8BF7
\u
7A0D
\u
540E
\u
91CD
\u
8BD5
data.does.not.exist
=
\u6570\u
636E
\u
4E0D
\u
5B58
\u5728
there.are.too.many.tasks.currently.please.try.again.later
=
\u
5F53
\u
524D
\u
4EFB
\u
52A1
\u
8FC7
\u
591A
\u
FF0C
\u
8BF7
\u
7A0D
\u
540E
\u
91CD
\u
8BD5
verification.code.has.expired.please.obtain.it.again
=
\u
9A8C
\u
8BC1
\u7801\u
5DF2
\u
8FC7
\u
671F
\u
FF0C
\u
8BF7
\u
91CD
\u
65B0
\u
83B7
\u
53D6
maximum.number.of.verifications.has.been.reached
=
\u
9A8C
\u
8BC1
\u
6B21
\u6570\u
5DF2
\u
8FBE
\u
4E0A
\u9650
verification.code.sending.failed.please.try.again
=
\u
9A8C
\u
8BC1
\u7801\u
53D1
\u9001\u5931\u
8D25
\u
FF01
\u
8BF7
\u
91CD
\u
8BD5
upload.exception.please.check.the.file.before.uploading.again
=
\u
4E0A
\u
4F20
\u
5F02
\u
5E38,
\u
8BF7
\u
68C0
\u
67E5
\u6587\u
4EF6
\u
540E
\u
518D
\u
4E0A
\u
4F20
abnormal.call.to.upload.alibaba.cloud.images
=
\u
8C03
\u7528\u
4E0A
\u
4F20
\u
963F
\u
91CC
\u
4E91
\u
56FE
\u7247\u
5F02
\u
5E38
\u
FF01
cannot.read.data.from.this.url
=
\u
4E0D
\u
80FD
\u
4ECE
\u
8BE5url
\u
4E2D
\u
8BFB
\u
53D6
\u5230\u6570\u
636E
error.signature
=
\u9519\u
8BEF
\u7684\u
7B7E
\u
540D
signature.validity.time.exception
=
\u
7B7E
\u
540D
\u6709\u6548\u
65F6
\u
95F4
\u
5F02
\u
5E38
signature.has.expired
=
\u
7B7E
\u
540D
\u
5DF2
\u
8FC7
\u
671F
app.not.found
=
\u
672A
\u
627E
\u5230\u
5E94
\u7528
failed.to.generate.recommendation.question
=
\u
751F
\u6210\u
63A8
\u8350\u
95EE
\u9898\u5931\u
8D25
document.does.not.exist
=
\u6587\u6863\u
4E0D
\u
5B58
\u5728
knowledge.base.information.does.not.exist
=
\u
77E5
\u
8BC6
\u
5E93
\u
4FE1
\u
606F
\u
4E0D
\u
5B58
\u5728
repetitive.training.in.the.knowledge.base
=
\u
77E5
\u
8BC6
\u
5E93
\u
91CD
\u
590D
\u
8BAD
\u
7EC3
knowledge.base.does.not.exist
=
\u
77E5
\u
8BC6
\u
5E93
\u
4E0D
\u
5B58
\u5728
private.key.of.the.marketing.platform.configuration.project.is.empty
=
\u8425\u9500\u
4E2D
\u
53F0
\u
914D
\u
7F6E
\u9879\u
76EE
\u
79C1
\u
94A5
\u
4E3A
\u
7A7A
decryption.offset.of.the.marketing.platform.configuration.is.empty
=
\u8425\u9500\u
4E2D
\u
53F0
\u
914D
\u
7F6E
\u
89E3
\u
5BC6
\u
504F
\u
79FB
\u
91CF
\u
4E3A
\u
7A7A
middle.server.is.unresponsive.or.has.timed.out
=
\u
4E2D
\u
53F0
\u
670D
\u
52A1
\u5668\u
65E0
\u
54CD
\u
5E94
\u6216\u
54CD
\u
5E94
\u
8D85
\u
65F6
\u
FF01
key.for.the.marketing.platform.configuration.project.is.empty
=
\u8425\u9500\u
4E2D
\u
53F0
\u
914D
\u
7F6E
\u9879\u
76EEkey
\u
4E3A
\u
7A7A
secret.for.the.marketing.platform.configuration.project.is.empty
=
\u8425\u9500\u
4E2D
\u
53F0
\u
914D
\u
7F6E
\u9879\u
76EE
\u
5BC6
\u
94A5
\u
4E3A
\u
7A7A
failed.to.obtain.xinghai.apptoken
=
\u
83B7
\u
53D6
\u5174\u
6D77apptoken
\u5931\u
8D25
default.login.channel.login.is.currently.not.supported
=
\u6682\u
4E0D
\u
652F
\u6301\u
9ED8
\u
8BA4
\u
767B
\u
5F55
\u
6E20
\u9053\u
767B
\u
5F55
\u
FF01
third.party.authorization.channel.abnormal
=
\u
7B2C
\u
4E09
\u
65B9
\u6388\u6743\u
6E20
\u9053\u
5F02
\u
5E38!
third.party.login.channel.abnormality
=
\u
7B2C
\u
4E09
\u
65B9
\u
767B
\u
5F55
\u
6E20
\u9053\u
5F02
\u
5E38
abnormal.configuration.of.bai.liantong.open.platform
=
\u
767E
\u8054\u
901A
\u
5F00
\u
653E
\u
5E73
\u
53F0
\u
914D
\u
7F6E
\u
5F02
\u
5E38
\u
FF01
abnormal.acquisition.of.mini.program.information.please.check.if.the.configuration.is.correct
=
\u
83B7
\u
53D6
\u
5C0F
\u
7A0B
\u
5E8F
\u
4FE1
\u
606F
\u
5F02
\u
5E38
\u
FF01
\u
8BF7
\u
68C0
\u
67E5
\u
914D
\u
7F6E
\u
662F
\u5426\u
6B63
\u
786E
\u
FF01
currently.no.default.registration.channel.for.login
=
\u6682\u
65E0
\u
9ED8
\u
8BA4
\u
6CE8
\u
518C
\u
6E20
\u9053\u
767B
\u
5F55
\u
FF01
abnormal.registration.channel
=
\u
6CE8
\u
518C
\u
6E20
\u9053\u
5F02
\u
5E38
login.expiration.time.configured.as.empty
=
\u
767B
\u
5F55
\u
8FC7
\u
671F
\u
65F6
\u
95F4
\u
914D
\u
7F6E
\u
4E3A
\u
7A7A!
there.is.currently.no.default.verification.code.channel.login
=
\u6682\u
65E0
\u
9ED8
\u
8BA4
\u
9A8C
\u
8BC1
\u7801\u
6E20
\u9053\u
767B
\u
5F55
\u
FF01
verification.code.channel.abnormality
=
\u
9A8C
\u
8BC1
\u7801\u
6E20
\u9053\u
5F02
\u
5E38
failed.to.obtain.baidu.token
=
\u
83B7
\u
53D6
\u
767E
\u
5EA6token
\u5931\u
8D25
training.exception.please.contact.the.administrator
=
\u
7FFB
\u
8BD1
\u
5F02
\u
5E38,
\u
8BF7
\u8054\u
7CFB
\u
7BA1
\u7406\u5458
image.generation.failed
=
\u
751F
\u6210\u
56FE
\u7247\u5931\u
8D25
middle.platform.is.unresponsive
=
\u
4E2D
\u
53F0
\u
65E0
\u
54CD
\u
5E94
\u
FF0C
\u
8BF7
\u8054\u
7CFB
\u
5F00
\u
53D1
\u
4EBA
\u5458
no.response.please.contact.the.developer
=
\u
65E0
\u
54CD
\u
5E94
\u
FF0C
\u
8BF7
\u8054\u
7CFB
\u
5F00
\u
53D1
\u
4EBA
\u5458
abnormal.knowledge.base.training
=
\u
77E5
\u
8BC6
\u
5E93
\u
8BAD
\u
7EC3
\u
5F02
\u
5E38
abnormal.training.status.of.knowledge.base.acquisition
=
\u
83B7
\u
53D6
\u
77E5
\u
8BC6
\u
5E93
\u
8BAD
\u
7EC3
\u
72B6
\u6001\u
5F02
\u
5E38
delete.knowledge.base.exception
=
\u5220\u9664\u
77E5
\u
8BC6
\u
5E93
\u
5F02
\u
5E38
query.knowledge.base.exception
=
\u
67E5
\u
8BE2
\u
77E5
\u
8BC6
\u
5E93
\u
5F02
\u
5E38
variable.structure.configuration.is.not.currently.supported
=
\u6682\u
4E0D
\u
652F
\u6301\u
53D8
\u
91CF
\u
7ED3
\u6784\u
914D
\u
7F6E
this.method.is.not.supported
=
\u
4E0D
\u
652F
\u6301\u
6B64
\u
65B9
\u
6CD5
failed.to.obtain.token
=
\u
83B7
\u
53D6token
\u5931\u
8D25
re-verify.the.user.identity
=
\u
8BF7
\u
91CD
\u
65B0
\u
9A8C
\u
8BC1
\u7528\u6237\u
8EAB
\u
4EFD
user.cannot.be.found
=
\u
627E
\u
4E0D
\u5230\u
8BE5
\u7528\u6237
verification.code.is.incorrect.please.re-enter
=
\u
9A8C
\u
8BC1
\u7801\u6709\u
8BEF
\u
FF0C
\u
8BF7
\u
91CD
\u
65B0
\u
8F93
\u5165
user.does.not.exist
=
\u7528\u6237\u
4E0D
\u
5B58
\u5728
password.error.please.re-enter
=
\u
5BC6
\u7801\u9519\u
8BEF,
\u
8BF7
\u
91CD
\u
65B0
\u
8F93
\u5165
unable.find.user.association.relationship
=
\u
627E
\u
4E0D
\u5230\u7528\u6237\u7684\u5173\u8054\u5173\u
7CFB
account.has.already
=
\u
8BE5
\u
8D26
\u
53F7
\u
5DF2
\u
7ECF
\u
88AB
\u
6CE8
\u
518C
\u
FF0C
\u
8BF7
\u
66F4
\u6362\u
4E00
\u
4E2A
not.support.lang
=
\u
4E0D
\u
652F
\u6301\u
8BE5
\u
8BED
\u
97F3
call.failure
=
\u
8C03
\u7528\u5931\u
8D25
model.not.exist
=
\u
6A21
\u
578B
\u
4E0D
\u
5B58
\u5728
upload.more.than.10m
=
\u
4E0A
\u
4F20
\u7684\u6587\u
4EF6
\u
4E0D
\u
80FD
\u
8D85
\u
8FC710M,
\u6587\u
4EF6
\u
540D
error.file.content.is.null
=
\u9519\u
8BEF
\u7684\u6587\u
4EF6
\u
FF0C
\u6587\u
4EF6
\u5185\u
5BB9
\u
4E0D
\u
80FD
\u
4E3A
\u
7A7A,
\u6587\u
4EF6
\u
540D
file.content.more.than.100w
=
\u6587\u
4EF6
\u5185\u
5BB9
\u
5B57
\u
7B26
\u6570\u
4E0D
\u
80FD
\u
8D85
\u
8FC7100w,
\u6587\u
4EF6
\u
540D
collect.limit.message
=
\u
70B9
\u
51FB
\u
8FC7
\u
5FEB,
\u
8BF7
\u
52FF
\u
91CD
\u
590D
\u
64CD
\u
4F5C
\ No newline at end of file
src/main/resources/framemax-config/i18n/zh_tw/exception.properties
View file @
9da0d28a
publication.failed
=
發佈失敗
create.[role.instruction]
.configuration.does.not.exist
=
創建[角色指令]配置不存在
create.[opening.statement]
.configuration.does.not.exist
=
創建[開場白]配置不存在
failed.to.create.[opening.statement]=創建[開場白]失敗
the.configuration.for.creating.[avatar.prompt]
.does.not.exist.please.contact.the.administrator
=
創建[頭像提示語]配置不存在,請聯繫管理員
failed.to.create.[avatar]
.please.try.again.later
=
創建[頭像]失敗,請稍後再試
create.[application.information]
.configuration.does.not.exist.please.contact.the.administrator
=
創建[應用信息]配置不存在,請聯繫管理員
failed.to.create.[application.information]
.please.try.again.later
=
創建[應用信息]失敗,請稍後再試
user.not.login
=
用戶未登錄
application.does.not.exist
=
應用不存在
application.not.released
=
應用未發佈
generation.failed.please.try.again.later
=
生成失敗,請稍後重試
data.does.not.exist
=
數據不存在
there.are.too.many.tasks.currently.please.try.again.later
=
當前任務過多,請稍後重試
verification.code.has.expired.please.obtain.it.again
=
驗證碼已過期,請重新獲取
maximum.number.of.verifications.has.been.reached
=
驗證次數已達上限
verification.code.sending.failed.please.try.again
=
驗證碼發送失敗!請重試
upload.exception.please.check.the.file.before.uploading.again
=
上傳異常,請檢查文件後再上傳
abnormal.call.to.upload.alibaba.cloud.images
=
調用上傳阿里雲圖片異常!
cannot.read.data.from.this.url
=
不能從該url中讀取到數據
error.signature
=
錯誤的簽名
signature.validity.time.exception
=
簽名有效時間異常
signature.has.expired
=
簽名已過期
app.not.found
=
未找到應用
failed.to.generate.recommendation.question
=
生成推薦問題失敗
document.does.not.exist
=
文檔不存在
knowledge.base.information.does.not.exist
=
知識庫信息不存在
repetitive.training.in.the.knowledge.base
=
知識庫重複訓練
knowledge.base.does.not.exist
=
知識庫不存在
private.key.of.the.marketing.platform.configuration.project.is.empty
=
營銷中臺配置項目私鑰爲空
decryption.offset.of.the.marketing.platform.configuration.is.empty
=
營銷中臺配置解密偏移量爲空
middle.server.is.unresponsive.or.has.timed.out
=
中臺服務器無響應或響應超時!
key.for.the.marketing.platform.configuration.project.is.empty
=
營銷中臺配置項目key爲空
secret.for.the.marketing.platform.configuration.project.is.empty
=
營銷中臺配置項目密鑰爲空
failed.to.obtain.xinghai.apptoken
=
獲取興海apptoken失敗
default.login.channel.login.is.currently.not.supported
=
暫不支持默認登錄渠道登錄!
third.party.authorization.channel.abnormal
=
第三方授權渠道異常!
third.party.login.channel.abnormality
=
第三方登錄渠道異常
abnormal.configuration.of.bai.liantong.open.platform
=
百聯通開放平臺配置異常!
abnormal.acquisition.of.mini.program.information.please.check.if.the.configuration.is.correct
=
獲取小程序信息異常!請檢查配置是否正確!
currently.no.default.registration.channel.for.login
=
暫無默認註冊渠道登錄!
abnormal.registration.channel
=
註冊渠道異常
login.expiration.time.configured.as.empty
=
登錄過期時間配置爲空!
there.is.currently.no.default.verification.code.channel.login
=
暫無默認驗證碼渠道登錄!
verification.code.channel.abnormality
=
驗證碼渠道異常
failed.to.obtain.baidu.token
=
獲取百度token失敗
training.exception.please.contact.the.administrator
=
翻译異常,請聯繫管理員
image.generation.failed
=
生成圖片失敗
middle.platform.is.unresponsive
=
中臺無響應,請聯繫開發人員
no.response.please.contact.the.developer
=
無響應,請聯繫開發人員
abnormal.knowledge.base.training
=
知識庫訓練異常
abnormal.training.status.of.knowledge.base.acquisition
=
獲取知識庫訓練狀態異常
delete.knowledge.base.exception
=
刪除知識庫異常
query.knowledge.base.exception
=
查詢知識庫異常
variable.structure.configuration.is.not.currently.supported
=
暫不支持變量結構配置
this.method.is.not.supported
=
不支持此方法
failed.to.obtain.token
=
獲取token失敗
re-verify.the.user.identity
=
請重新驗證用戶身份
user.cannot.be.found
=
找不到該用戶
verification.code.is.incorrect.please.re-enter
=
驗證碼有誤,請重新輸入
user.does.not.exist
=
登錄的用戶不存在
password.error.please.re-enter
=
密碼錯誤,請重新輸入
unable.find.user.association.relationship
=
找不到用戶的關聯關係
account.has.already
=
該賬號已經被註冊,請更換一個
not.support.lang
=
不支持該語言
call.failure
=
調用失敗
model.not.exist
=
模型不存在
upload.more.than.10m
=
上傳文件不可超過10M
error.file.content.is.null
=
錯誤的文件,内容不能爲空
file.content.more.than.100w
=
文件内容不可超100w字符
\ No newline at end of file
publication.failed
=
\u
767C
\u
4F48
\u5931\u6557
create.[role.instruction]
.configuration.does.not.exist
=
\u5275\u
5EFA[
\u
89D2
\u8272\u6307\u
4EE4]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728
create.[opening.statement]
.configuration.does.not.exist
=
\u5275\u
5EFA[
\u
958B
\u5834\u
767D]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728
failed.to.create.[opening.statement]=\u5275\u5EFA[\u958B\u5834\u767D]\u5931\u6557
the.configuration.for.creating.[avatar.prompt]
.does.not.exist.please.contact.the.administrator
=
\u5275\u
5EFA[
\u
982D
\u
50CF
\u
63D0
\u
793A
\u
8A9E]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728\u
FF0C
\u
8ACB
\u
806F
\u
7E6B
\u
7BA1
\u7406\u
54E1
failed.to.create.[avatar]
.please.try.again.later
=
\u5275\u
5EFA[
\u
982D
\u
50CF]
\u5931\u6557
,
\u
8ACB
\u
7A0D
\u
5F8C
\u
518D
\u
8A66
create.[application.information]
.configuration.does.not.exist.please.contact.the.administrator
=
\u5275\u
5EFA[
\u
61C9
\u7528\u
4FE1
\u
606F]
\u
914D
\u
7F6E
\u
4E0D
\u
5B58
\u5728\u
FF0C
\u
8ACB
\u
806F
\u
7E6B
\u
7BA1
\u7406\u
54E1
failed.to.create.[application.information]
.please.try.again.later
=
\u5275\u
5EFA[
\u
61C9
\u7528\u
4FE1
\u
606F]
\u5931\u6557
,
\u
8ACB
\u
7A0D
\u
5F8C
\u
518D
\u
8A66
user.not.login
=
\u7528\u6236\u
672A
\u
767B
\u9304
application.does.not.exist
=
\u
61C9
\u7528\u
4E0D
\u
5B58
\u5728
application.not.released
=
\u
61C9
\u7528\u
672A
\u
767C
\u
4F48
generation.failed.please.try.again.later
=
\u
751F
\u6210\u5931\u6557
,
\u
8ACB
\u
7A0D
\u
5F8C
\u
91CD
\u
8A66
data.does.not.exist
=
\u6578\u
64DA
\u
4E0D
\u
5B58
\u5728
there.are.too.many.tasks.currently.please.try.again.later
=
\u7576\u
524D
\u
4EFB
\u
52D9
\u
904E
\u
591A
\u
FF0C
\u
8ACB
\u
7A0D
\u
5F8C
\u
91CD
\u
8A66
verification.code.has.expired.please.obtain.it.again
=
\u
9A57
\u
8B49
\u
78BC
\u
5DF2
\u
904E
\u
671F
\u
FF0C
\u
8ACB
\u
91CD
\u
65B0
\u7372\u
53D6
maximum.number.of.verifications.has.been.reached
=
\u
9A57
\u
8B49
\u
6B21
\u6578\u
5DF2
\u9054\u
4E0A
\u9650
verification.code.sending.failed.please.try.again
=
\u
9A57
\u
8B49
\u
78BC
\u
767C
\u9001\u5931\u6557\u
FF01
\u
8ACB
\u
91CD
\u
8A66
upload.exception.please.check.the.file.before.uploading.again
=
\u
4E0A
\u
50B3
\u7570\u
5E38,
\u
8ACB
\u
6AA2
\u
67E5
\u6587\u
4EF6
\u
5F8C
\u
518D
\u
4E0A
\u
50B3
abnormal.call.to.upload.alibaba.cloud.images
=
\u
8ABF
\u7528\u
4E0A
\u
50B3
\u
963F
\u
91CC
\u
96F2
\u5716\u7247\u7570\u
5E38
\u
FF01
cannot.read.data.from.this.url
=
\u
4E0D
\u
80FD
\u
5F9E
\u
8A72url
\u
4E2D
\u
8B80
\u
53D6
\u5230\u6578\u
64DA
error.signature
=
\u
932F
\u
8AA4
\u7684\u
7C3D
\u
540D
signature.validity.time.exception
=
\u
7C3D
\u
540D
\u6709\u6548\u6642\u9593\u7570\u
5E38
signature.has.expired
=
\u
7C3D
\u
540D
\u
5DF2
\u
904E
\u
671F
app.not.found
=
\u
672A
\u
627E
\u5230\u
61C9
\u7528
failed.to.generate.recommendation.question
=
\u
751F
\u6210\u
63A8
\u
85A6
\u
554F
\u
984C
\u5931\u6557
document.does.not.exist
=
\u6587\u
6A94
\u
4E0D
\u
5B58
\u5728
knowledge.base.information.does.not.exist
=
\u
77E5
\u
8B58
\u
5EAB
\u
4FE1
\u
606F
\u
4E0D
\u
5B58
\u5728
repetitive.training.in.the.knowledge.base
=
\u
77E5
\u
8B58
\u
5EAB
\u
91CD
\u8907\u
8A13
\u
7DF4
knowledge.base.does.not.exist
=
\u
77E5
\u
8B58
\u
5EAB
\u
4E0D
\u
5B58
\u5728
private.key.of.the.marketing.platform.configuration.project.is.empty
=
\u
71DF
\u
92B7
\u
4E2D
\u
81FA
\u
914D
\u
7F6E
\u9805\u
76EE
\u
79C1
\u9470\u7232\u
7A7A
decryption.offset.of.the.marketing.platform.configuration.is.empty
=
\u
71DF
\u
92B7
\u
4E2D
\u
81FA
\u
914D
\u
7F6E
\u
89E3
\u
5BC6
\u
504F
\u
79FB
\u
91CF
\u7232\u
7A7A
middle.server.is.unresponsive.or.has.timed.out
=
\u
4E2D
\u
81FA
\u
670D
\u
52D9
\u5668\u7121\u
97FF
\u
61C9
\u6216\u
97FF
\u
61C9
\u
8D85
\u6642\u
FF01
key.for.the.marketing.platform.configuration.project.is.empty
=
\u
71DF
\u
92B7
\u
4E2D
\u
81FA
\u
914D
\u
7F6E
\u9805\u
76EEkey
\u7232\u
7A7A
secret.for.the.marketing.platform.configuration.project.is.empty
=
\u
71DF
\u
92B7
\u
4E2D
\u
81FA
\u
914D
\u
7F6E
\u9805\u
76EE
\u
5BC6
\u9470\u7232\u
7A7A
failed.to.obtain.xinghai.apptoken
=
\u7372\u
53D6
\u8208\u
6D77apptoken
\u5931\u6557
default.login.channel.login.is.currently.not.supported
=
\u
66AB
\u
4E0D
\u
652F
\u6301\u
9ED8
\u
8A8D
\u
767B
\u9304\u
6E20
\u9053\u
767B
\u9304\u
FF01
third.party.authorization.channel.abnormal
=
\u
7B2C
\u
4E09
\u
65B9
\u6388\u
6B0A
\u
6E20
\u9053\u7570\u
5E38!
third.party.login.channel.abnormality
=
\u
7B2C
\u
4E09
\u
65B9
\u
767B
\u9304\u
6E20
\u9053\u7570\u
5E38
abnormal.configuration.of.bai.liantong.open.platform
=
\u
767E
\u
806F
\u
901A
\u
958B
\u
653E
\u
5E73
\u
81FA
\u
914D
\u
7F6E
\u7570\u
5E38
\u
FF01
abnormal.acquisition.of.mini.program.information.please.check.if.the.configuration.is.correct
=
\u7372\u
53D6
\u
5C0F
\u
7A0B
\u
5E8F
\u
4FE1
\u
606F
\u7570\u
5E38
\u
FF01
\u
8ACB
\u
6AA2
\u
67E5
\u
914D
\u
7F6E
\u
662F
\u5426\u
6B63
\u
78BA
\u
FF01
currently.no.default.registration.channel.for.login
=
\u
66AB
\u7121\u
9ED8
\u
8A8D
\u
8A3B
\u
518A
\u
6E20
\u9053\u
767B
\u9304\u
FF01
abnormal.registration.channel
=
\u
8A3B
\u
518A
\u
6E20
\u9053\u7570\u
5E38
login.expiration.time.configured.as.empty
=
\u
767B
\u9304\u
904E
\u
671F
\u6642\u9593\u
914D
\u
7F6E
\u7232\u
7A7A!
there.is.currently.no.default.verification.code.channel.login
=
\u
66AB
\u7121\u
9ED8
\u
8A8D
\u
9A57
\u
8B49
\u
78BC
\u
6E20
\u9053\u
767B
\u9304\u
FF01
verification.code.channel.abnormality
=
\u
9A57
\u
8B49
\u
78BC
\u
6E20
\u9053\u7570\u
5E38
failed.to.obtain.baidu.token
=
\u7372\u
53D6
\u
767E
\u
5EA6token
\u5931\u6557
training.exception.please.contact.the.administrator
=
\u
7FFB
\u
8BD1
\u7570\u
5E38,
\u
8ACB
\u
806F
\u
7E6B
\u
7BA1
\u7406\u
54E1
image.generation.failed
=
\u
751F
\u6210\u5716\u7247\u5931\u6557
middle.platform.is.unresponsive
=
\u
4E2D
\u
81FA
\u7121\u
97FF
\u
61C9
\u
FF0C
\u
8ACB
\u
806F
\u
7E6B
\u
958B
\u
767C
\u
4EBA
\u
54E1
no.response.please.contact.the.developer
=
\u7121\u
97FF
\u
61C9
\u
FF0C
\u
8ACB
\u
806F
\u
7E6B
\u
958B
\u
767C
\u
4EBA
\u
54E1
abnormal.knowledge.base.training
=
\u
77E5
\u
8B58
\u
5EAB
\u
8A13
\u
7DF4
\u7570\u
5E38
abnormal.training.status.of.knowledge.base.acquisition
=
\u7372\u
53D6
\u
77E5
\u
8B58
\u
5EAB
\u
8A13
\u
7DF4
\u
72C0
\u
614B
\u7570\u
5E38
delete.knowledge.base.exception
=
\u
522A
\u9664\u
77E5
\u
8B58
\u
5EAB
\u7570\u
5E38
query.knowledge.base.exception
=
\u
67E5
\u
8A62
\u
77E5
\u
8B58
\u
5EAB
\u7570\u
5E38
variable.structure.configuration.is.not.currently.supported
=
\u
66AB
\u
4E0D
\u
652F
\u6301\u
8B8A
\u
91CF
\u
7D50
\u
69CB
\u
914D
\u
7F6E
this.method.is.not.supported
=
\u
4E0D
\u
652F
\u6301\u
6B64
\u
65B9
\u
6CD5
failed.to.obtain.token
=
\u7372\u
53D6token
\u5931\u6557
re-verify.the.user.identity
=
\u
8ACB
\u
91CD
\u
65B0
\u
9A57
\u
8B49
\u7528\u6236\u
8EAB
\u
4EFD
user.cannot.be.found
=
\u
627E
\u
4E0D
\u5230\u
8A72
\u7528\u6236
verification.code.is.incorrect.please.re-enter
=
\u
9A57
\u
8B49
\u
78BC
\u6709\u
8AA4
\u
FF0C
\u
8ACB
\u
91CD
\u
65B0
\u
8F38
\u5165
user.does.not.exist
=
\u7528\u6236\u
4E0D
\u
5B58
\u5728
password.error.please.re-enter
=
\u
5BC6
\u
78BC
\u
932F
\u
8AA4,
\u
8ACB
\u
91CD
\u
65B0
\u
8F38
\u5165
unable.find.user.association.relationship
=
\u
627E
\u
4E0D
\u5230\u7528\u6236\u7684\u
95DC
\u
806F
\u
95DC
\u
4FC2
account.has.already
=
\u
8A72
\u
8CEC
\u
865F
\u
5DF2
\u
7D93
\u
88AB
\u
8A3B
\u
518A
\u
FF0C
\u
8ACB
\u
66F4
\u
63DB
\u
4E00
\u
500B
not.support.lang
=
\u
4E0D
\u
652F
\u6301\u
8A72
\u
8A9E
\u
8A00
call.failure
=
\u
8ABF
\u7528\u5931\u6557
model.not.exist
=
\u
6A21
\u
578B
\u
4E0D
\u
5B58
\u5728
upload.more.than.10m
=
\u
4E0A
\u
50B3
\u6587\u
4EF6
\u
4E0D
\u
53EF
\u
8D85
\u
904E10M
error.file.content.is.null
=
\u
932F
\u
8AA4
\u7684\u6587\u
4EF6,
\u5185\u
5BB9
\u
4E0D
\u
80FD
\u7232\u
7A7A
file.content.more.than.100w
=
\u6587\u
4EF6
\u5185\u
5BB9
\u
4E0D
\u
53EF
\u
8D85100w
\u
5B57
\u
7B26
collect.limit.message
=
\u
9EDE
\u
64CA
\u
904E
\u
5FEB
\u
FF0C
\u
8ACB
\u
52FF
\u
91CD
\u8907\u
64CD
\u
4F5C
\ No newline at end of file
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