Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
yudao-cloud
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
hblj
yudao-cloud
Commits
58525e09
提交
58525e09
authored
5月 09, 2019
作者:
YunaiV
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
- 后端:修改配置文件,指向服务器
- 增加 .gitattributes ,解决 github 识别项目错误问题
上级
21dbd7b8
隐藏空白字符变更
内嵌
并排
正在显示
30 个修改的文件
包含
240 行增加
和
88 行删除
+240
-88
.gitattributes
.gitattributes
+4
-0
README.md
README.md
+28
-2
Server.md
Server.md
+0
-18
GlobalExceptionHandler.java
...coder/common/framework/config/GlobalExceptionHandler.java
+2
-0
DubboExceptionFilter.java
.../iocoder/common/framework/dubbo/DubboExceptionFilter.java
+105
-0
ServiceException.java
.../iocoder/common/framework/exception/ServiceException.java
+2
-3
com.alibaba.dubbo.rpc.Filter
...main/resource/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
+1
-0
CartItemGroupBO.java
...in/java/cn/iocoder/mall/order/api/bo/CartItemGroupBO.java
+0
-21
FeeMessageBO.java
.../main/java/cn/iocoder/mall/order/api/bo/FeeMessageBO.java
+0
-26
application-test.yaml
...vice-impl/src/main/resources/config/application-test.yaml
+7
-0
application.yaml
...r-service-impl/src/main/resources/config/application.yaml
+1
-0
application-test.yaml
...vice-impl/src/main/resources/config/application-test.yaml
+14
-0
application.yaml
...y-service-impl/src/main/resources/config/application.yaml
+1
-0
ProductSpuDO.java
...java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java
+2
-0
application-test.yaml
...vice-impl/src/main/resources/config/application-test.yaml
+13
-0
application.yaml
...t-service-impl/src/main/resources/config/application.yaml
+1
-0
application-test.yaml
...vice-impl/src/main/resources/config/application-test.yaml
+7
-0
application.yaml
...n-service-impl/src/main/resources/config/application.yaml
+1
-0
UsersProductSearchController.java
...cation/controller/users/UsersProductSearchController.java
+3
-0
application-test.yaml
...vice-impl/src/main/resources/config/application-test.yaml
+14
-0
application.yaml
...h-service-impl/src/main/resources/config/application.yaml
+1
-0
AdminController.java
.../admin/application/controller/admins/AdminController.java
+0
-1
application-test.yaml
...stem-application/src/main/resources/application-test.yaml
+2
-3
AdminSecurityContextHolder.java
...er/mall/admin/sdk/context/AdminSecurityContextHolder.java
+6
-7
AdminDO.java
...c/main/java/cn/iocoder/mall/admin/dataobject/AdminDO.java
+3
-0
application-test.yaml
...vice-impl/src/main/resources/config/application-test.yaml
+7
-0
application.yaml
...m-service-impl/src/main/resources/config/application.yaml
+1
-0
UserSecurityContextHolder.java
...oder/mall/user/sdk/context/UserSecurityContextHolder.java
+6
-7
application-test.yaml
...vice-impl/src/main/resources/config/application-test.yaml
+7
-0
application.yaml
...r-service-impl/src/main/resources/config/application.yaml
+1
-0
没有找到文件。
.gitattributes
0 → 100644
浏览文件 @
58525e09
*.css linguist-language=java
*.less linguist-language=java
*.js linguist-language=java
*.html linguist-language=java
README.md
浏览文件 @
58525e09
...
...
@@ -33,9 +33,35 @@ TODO 暂时不提供管理后台的账号密码,等后面提供。
TODO 此处应有一个演示的装逼 GIF 图。
##
TODO
##
其它演示
提供其他演示环境。例如说 skywalking、sentinel 等等。
下面,我们会提供目前用到的中间件的管理平台。
> 艿艿:考虑到大家可以看到更全的功能,所以一般提供 admin 账号。所以,大家素质使用哟。
** SkyWalking UI **
*
地址:http://skywalking-ui.shop.iocoder.cn:18099
*
管理员账号:admin / admin
** Dubbo Admin **
*
地址:http://dubbo-admin.shop.iocoder.cn:18099
*
管理员账号:无需登陆
** RocketMQ Console **
*
地址:http://rocketmq-console.shop.iocoder.cn:18099
*
管理员账号:admin / RPsa2GHjTNs8pxEU
** Sentinel Console **
TODO
** XXL-Job Console **
*
地址:http://job-console.shop.iocoder.cn:18099
*
管理员账号:admin / 233666
# 技术
...
...
Server.md
deleted
100644 → 0
浏览文件 @
21dbd7b8
# 前端 Server
*
admin 18083
*
# 后端 Server
# 基础服务
## MySQL
## Zookeeper
# 运维
*
ssh 端口
*
工作目录 /work2/
common/common-framework/src/main/java/cn/iocoder/common/framework/config/GlobalExceptionHandler.java
浏览文件 @
58525e09
...
...
@@ -54,4 +54,6 @@ public class GlobalExceptionHandler {
return
CommonResult
.
error
(
SysErrorCodeEnum
.
SYS_ERROR
.
getCode
(),
SysErrorCodeEnum
.
SYS_ERROR
.
getMessage
());
}
// TODO 芋艿,应该还有其它的异常,需要进行翻译
}
common/common-framework/src/main/java/cn/iocoder/common/framework/dubbo/DubboExceptionFilter.java
0 → 100644
浏览文件 @
58525e09
package
cn
.
iocoder
.
common
.
framework
.
dubbo
;
import
cn.iocoder.common.framework.exception.ServiceException
;
import
org.apache.dubbo.common.Constants
;
import
org.apache.dubbo.common.extension.Activate
;
import
org.apache.dubbo.common.logger.Logger
;
import
org.apache.dubbo.common.logger.LoggerFactory
;
import
org.apache.dubbo.common.utils.ReflectUtils
;
import
org.apache.dubbo.common.utils.StringUtils
;
import
org.apache.dubbo.rpc.*
;
import
org.apache.dubbo.rpc.filter.ExceptionFilter
;
import
org.apache.dubbo.rpc.service.GenericService
;
import
java.lang.reflect.Method
;
/**
* 基于 {@link org.apache.dubbo.rpc.filter.ExceptionFilter} 实现
*
* 主要目的是,一些全局性的异常,能够返回。因为,Dubbo Consumer 能够保证,一定会引入全局性的异常。
*/
@Activate
(
group
=
Constants
.
PROVIDER
)
public
class
DubboExceptionFilter
implements
Filter
{
private
final
Logger
logger
;
public
DubboExceptionFilter
()
{
this
(
LoggerFactory
.
getLogger
(
ExceptionFilter
.
class
));
}
public
DubboExceptionFilter
(
Logger
logger
)
{
this
.
logger
=
logger
;
}
@Override
public
Result
invoke
(
Invoker
<?>
invoker
,
Invocation
invocation
)
throws
RpcException
{
try
{
return
invoker
.
invoke
(
invocation
);
}
catch
(
RuntimeException
e
)
{
logger
.
error
(
"Got unchecked and undeclared exception which called by "
+
RpcContext
.
getContext
().
getRemoteHost
()
+
". service: "
+
invoker
.
getInterface
().
getName
()
+
", method: "
+
invocation
.
getMethodName
()
+
", exception: "
+
e
.
getClass
().
getName
()
+
": "
+
e
.
getMessage
(),
e
);
throw
e
;
}
}
@Override
public
Result
onResponse
(
Result
result
,
Invoker
<?>
invoker
,
Invocation
invocation
)
{
if
(
result
.
hasException
()
&&
GenericService
.
class
!=
invoker
.
getInterface
())
{
try
{
Throwable
exception
=
result
.
getException
();
// directly throw if it's checked exception
if
(!(
exception
instanceof
RuntimeException
)
&&
(
exception
instanceof
Exception
))
{
return
result
;
}
else
if
(
exception
instanceof
ServiceException
)
{
// add by 芋艿。如果是业务异常,继续抛出
return
result
;
}
// directly throw if the exception appears in the signature
try
{
Method
method
=
invoker
.
getInterface
().
getMethod
(
invocation
.
getMethodName
(),
invocation
.
getParameterTypes
());
Class
<?>[]
exceptionClassses
=
method
.
getExceptionTypes
();
for
(
Class
<?>
exceptionClass
:
exceptionClassses
)
{
if
(
exception
.
getClass
().
equals
(
exceptionClass
))
{
return
result
;
}
}
}
catch
(
NoSuchMethodException
e
)
{
return
result
;
}
// for the exception not found in method's signature, print ERROR message in server's log.
logger
.
error
(
"Got unchecked and undeclared exception which called by "
+
RpcContext
.
getContext
().
getRemoteHost
()
+
". service: "
+
invoker
.
getInterface
().
getName
()
+
", method: "
+
invocation
.
getMethodName
()
+
", exception: "
+
exception
.
getClass
().
getName
()
+
": "
+
exception
.
getMessage
(),
exception
);
// directly throw if exception class and interface class are in the same jar file.
String
serviceFile
=
ReflectUtils
.
getCodeBase
(
invoker
.
getInterface
());
String
exceptionFile
=
ReflectUtils
.
getCodeBase
(
exception
.
getClass
());
if
(
serviceFile
==
null
||
exceptionFile
==
null
||
serviceFile
.
equals
(
exceptionFile
))
{
return
result
;
}
// directly throw if it's JDK exception
String
className
=
exception
.
getClass
().
getName
();
if
(
className
.
startsWith
(
"java."
)
||
className
.
startsWith
(
"javax."
))
{
return
result
;
}
// directly throw if it's dubbo exception
if
(
exception
instanceof
RpcException
)
{
return
result
;
}
// otherwise, wrap with RuntimeException and throw back to the client
return
new
RpcResult
(
new
RuntimeException
(
StringUtils
.
toString
(
exception
)));
}
catch
(
Throwable
e
)
{
logger
.
warn
(
"Fail to ExceptionFilter when called by "
+
RpcContext
.
getContext
().
getRemoteHost
()
+
". service: "
+
invoker
.
getInterface
().
getName
()
+
", method: "
+
invocation
.
getMethodName
()
+
", exception: "
+
e
.
getClass
().
getName
()
+
": "
+
e
.
getMessage
(),
e
);
return
result
;
}
}
return
result
;
}
}
common/common-framework/src/main/java/cn/iocoder/common/framework/exception/ServiceException.java
浏览文件 @
58525e09
...
...
@@ -27,7 +27,7 @@ package cn.iocoder.common.framework.exception;
* 不限制规则。
* 一般建议,每个模块自增。
*/
public
class
ServiceException
extends
RuntimeException
{
public
final
class
ServiceException
extends
RuntimeException
{
/**
* 错误码
...
...
@@ -43,4 +43,4 @@ public class ServiceException extends RuntimeException {
return
code
;
}
}
\ No newline at end of file
}
common/common-framework/src/main/resource/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter
0 → 100644
浏览文件 @
58525e09
dubboExceptionFilter=cn.iocoder.common.framework.dubbo.DubboExceptionFilter
order/order-service-api/src/main/java/cn/iocoder/mall/order/api/bo/CartItemGroupBO.java
deleted
100644 → 0
浏览文件 @
21dbd7b8
package
cn
.
iocoder
.
mall
.
order
.
api
.
bo
;
import
java.util.List
;
/**
* 商品分组 BO
*
* 主要目的是,多个商品,
*/
public
class
CartItemGroupBO
{
/**
* TODO 芋艿,活动
*/
private
Object
activity
;
/**
* 商品数组
*/
private
List
<
CartItemBO
>
items
;
}
order/order-service-api/src/main/java/cn/iocoder/mall/order/api/bo/FeeMessageBO.java
deleted
100644 → 0
浏览文件 @
21dbd7b8
package
cn
.
iocoder
.
mall
.
order
.
api
.
bo
;
public
class
FeeMessageBO
{
/**
* 总价
*/
private
Integer
originalTotal
;
/**
* 优惠总价
*
* 注意,满多少元包邮,不算在优惠中。
*/
private
Integer
discountTotal
;
/**
* 邮费
*/
private
Integer
postageTotal
;
/**
* 最终价格
*
* 计算公式 = 总价 - 优惠总价 + 邮费
*/
private
Integer
presentTotal
;
}
order/order-service-impl/src/main/resources/config/application-test.yaml
0 → 100644
浏览文件 @
58525e09
spring
:
# datasource
datasource
:
url
:
jdbc:mysql://192.168.88.14:3306/mall_order?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name
:
com.mysql.jdbc.Driver
username
:
root
password
:
${MALL_MYSQL_PASSWORD}
order/order-service-impl/src/main/resources/config/application.yaml
浏览文件 @
58525e09
...
...
@@ -24,6 +24,7 @@ dubbo:
scan
:
base-packages
:
cn.iocoder.mall.order.biz.service
provider
:
filter
:
-exception
CartService
:
version
:
1.0.0
consumer
:
...
...
pay/pay-service-impl/src/main/resources/config/application-
dev
.yaml
→
pay/pay-service-impl/src/main/resources/config/application-
test
.yaml
浏览文件 @
58525e09
spring
:
# datasource
datasource
:
url
:
jdbc:mysql://192.168.88.14:3306/mall_apy?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name
:
com.mysql.jdbc.Driver
username
:
root
password
:
${MALL_MYSQL_PASSWORD}
# xxl-job
xxl
:
job
:
...
...
@@ -10,3 +18,9 @@ xxl:
logpath
:
/Users/yunai/logs/xxl-job/
logretentiondays
:
1
accessToken
:
# rocketmq
rocketmq
:
name-server
:
192.168.88.14:9876
producer
:
group
:
pay-producer-group
pay/pay-service-impl/src/main/resources/config/application.yaml
浏览文件 @
58525e09
...
...
@@ -24,6 +24,7 @@ dubbo:
scan
:
base-packages
:
cn.iocoder.mall.pay.biz.service
provider
:
filter
:
-exception
PayTransactionService
:
version
:
1.0.0
PayRefundService
:
...
...
product/product-service-impl/src/main/java/cn/iocoder/mall/product/dataobject/ProductSpuDO.java
浏览文件 @
58525e09
...
...
@@ -6,6 +6,8 @@ import lombok.experimental.Accessors;
/**
* 商品 SPU
*
* TODO 芋艿,后面增加商品普通参数。例如说,正面材料,背面材料,屏幕尺寸。
*/
@Data
@Accessors
(
chain
=
true
)
...
...
product/product-service-impl/src/main/resources/config/application-test.yaml
0 → 100644
浏览文件 @
58525e09
spring
:
# datasource
datasource
:
url
:
jdbc:mysql://192.168.88.14:3306/mall_product?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name
:
com.mysql.jdbc.Driver
username
:
root
password
:
${MALL_MYSQL_PASSWORD}
# rocketmq
rocketmq
:
name-server
:
192.168.88.14:9876
producer
:
group
:
product-producer-group
product/product-service-impl/src/main/resources/config/application.yaml
浏览文件 @
58525e09
...
...
@@ -24,6 +24,7 @@ dubbo:
scan
:
base-packages
:
cn.iocoder.mall.product.service
provider
:
filter
:
-exception
ProductAttrService
:
version
:
1.0.0
ProductCategoryService
:
...
...
promotion/promotion-service-impl/src/main/resources/config/application-test.yaml
0 → 100644
浏览文件 @
58525e09
spring
:
# datasource
datasource
:
url
:
jdbc:mysql://192.168.88.14:3306/mall_promotion?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name
:
com.mysql.jdbc.Driver
username
:
root
password
:
${MALL_MYSQL_PASSWORD}
promotion/promotion-service-impl/src/main/resources/config/application.yaml
浏览文件 @
58525e09
...
...
@@ -27,6 +27,7 @@ dubbo:
ProductSpuService
:
version
:
1.0.0
provider
:
filter
:
-exception
BannerService
:
version
:
1.0.0
CouponService
:
...
...
search/search-application/src/main/java/cn/iocoder/mall/search/application/controller/users/UsersProductSearchController.java
浏览文件 @
58525e09
...
...
@@ -19,6 +19,9 @@ import java.util.Collections;
import
static
cn
.
iocoder
.
common
.
framework
.
vo
.
CommonResult
.
success
;
// TODO 芋艿,搜索关键字的配置
// TODO 芋艿,搜索日志
@RestController
@RequestMapping
(
"users/product"
)
@Api
(
"商品搜索"
)
...
...
search/search-service-impl/src/main/resources/config/application-test.yaml
0 → 100644
浏览文件 @
58525e09
# es
spring
:
data
:
elasticsearch
:
cluster-name
:
elasticsearch
cluster-nodes
:
192.168.88.14:9300
repositories
:
enable
:
true
# rocketmq
rocketmq
:
name-server
:
192.168.88.14:9876
producer
:
group
:
search-producer-group
search/search-service-impl/src/main/resources/config/application.yaml
浏览文件 @
58525e09
...
...
@@ -19,6 +19,7 @@ dubbo:
scan
:
base-packages
:
cn.iocoder.mall.search.biz.service
provider
:
filter
:
-exception
ProductSearchService
:
version
:
1.0.0
consumer
:
...
...
system/system-application/src/main/java/cn/iocoder/mall/admin/application/controller/admins/AdminController.java
浏览文件 @
58525e09
...
...
@@ -50,7 +50,6 @@ public class AdminController {
public
CommonResult
<
List
<
AdminMenuTreeNodeVO
>>
menuResourceTree
()
{
List
<
ResourceBO
>
resources
=
resourceService
.
getResourcesByTypeAndRoleIds
(
ResourceConstants
.
TYPE_MENU
,
AdminSecurityContextHolder
.
getContext
().
getRoleIds
());
// 创建 AdminMenuTreeNodeVO Map
// Map<Integer, AdminMenuTreeNodeVO> treeNodeMap = resources.stream().collect(Collectors.toMap(ResourceBO::getId, ResourceConvert.INSTANCE::convert));
Map
<
Integer
,
AdminMenuTreeNodeVO
>
treeNodeMap
=
new
LinkedHashMap
<>();
// 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
resources
.
stream
().
sorted
(
Comparator
.
comparing
(
ResourceBO:
:
getSort
)).
forEach
(
resourceBO
->
treeNodeMap
.
put
(
resourceBO
.
getId
(),
ResourceConvert
.
INSTANCE
.
convert
(
resourceBO
)));
// 处理父子关系
...
...
system/system-application/src/main/resources/application-test.yaml
浏览文件 @
58525e09
...
...
@@ -2,7 +2,7 @@ spring:
boot
:
admin
:
client
:
enabled
:
true
enabled
:
false
# 暂时不用了
url
:
http://127.0.0.1:18097
...
...
@@ -12,4 +12,4 @@ management:
exposure
:
include
:
"
*"
server
:
port
:
19083
# 配置独立端口。而该端口,不使用 nginx 对外暴露,从而不配置安全认证。也就是说,内网环境可访问,外网环境不可访问。当然,这么做的前提是,认为内网安全。
\ No newline at end of file
port
:
19083
# 配置独立端口。而该端口,不使用 nginx 对外暴露,从而不配置安全认证。也就是说,内网环境可访问,外网环境不可访问。当然,这么做的前提是,认为内网安全。
system/system-sdk/src/main/java/cn/iocoder/mall/admin/sdk/context/AdminSecurityContextHolder.java
浏览文件 @
58525e09
...
...
@@ -7,24 +7,24 @@ package cn.iocoder.mall.admin.sdk.context;
*/
public
class
AdminSecurityContextHolder
{
private
static
final
ThreadLocal
<
AdminSecurityContext
>
securityContext
=
new
ThreadLocal
<
AdminSecurityContext
>();
private
static
final
ThreadLocal
<
AdminSecurityContext
>
SECURITY_CONTEXT
=
new
ThreadLocal
<
>();
public
static
void
setContext
(
AdminSecurityContext
context
)
{
securityContext
.
set
(
context
);
SECURITY_CONTEXT
.
set
(
context
);
}
public
static
AdminSecurityContext
getContext
()
{
AdminSecurityContext
ctx
=
securityContext
.
get
();
AdminSecurityContext
ctx
=
SECURITY_CONTEXT
.
get
();
// 为空时,设置一个空的进去
if
(
ctx
==
null
)
{
ctx
=
new
AdminSecurityContext
(
null
,
null
);
securityContext
.
set
(
ctx
);
SECURITY_CONTEXT
.
set
(
ctx
);
}
return
ctx
;
}
public
static
void
clear
()
{
securityContext
.
remove
();
SECURITY_CONTEXT
.
remove
();
}
}
\ No newline at end of file
}
system/system-service-impl/src/main/java/cn/iocoder/mall/admin/dataobject/AdminDO.java
浏览文件 @
58525e09
...
...
@@ -34,4 +34,7 @@ public class AdminDO extends DeletableDO {
*/
private
Integer
status
;
// TODO 芋艿,最后登陆时间、最后登陆 IP
// TODO 芋艿,登陆日志
}
system/system-service-impl/src/main/resources/config/application-test.yaml
0 → 100644
浏览文件 @
58525e09
spring
:
# datasource
datasource
:
url
:
jdbc:mysql://192.168.88.14:3306/mall_admin?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name
:
com.mysql.jdbc.Driver
username
:
root
password
:
${MALL_MYSQL_PASSWORD}
system/system-service-impl/src/main/resources/config/application.yaml
浏览文件 @
58525e09
...
...
@@ -24,6 +24,7 @@ dubbo:
scan
:
base-packages
:
cn.iocoder.mall.admin.service
provider
:
filter
:
-exception
AdminAccessLogService
:
version
:
1.0.0
AdminService
:
...
...
user/user-sdk/src/main/java/cn/iocoder/mall/user/sdk/context/UserSecurityContextHolder.java
浏览文件 @
58525e09
...
...
@@ -7,24 +7,24 @@ package cn.iocoder.mall.user.sdk.context;
*/
public
class
UserSecurityContextHolder
{
private
static
final
ThreadLocal
<
UserSecurityContext
>
securityContext
=
new
ThreadLocal
<
UserSecurityContext
>();
private
static
final
ThreadLocal
<
UserSecurityContext
>
SECURITY_CONTEXT
=
new
ThreadLocal
<
UserSecurityContext
>();
public
static
void
setContext
(
UserSecurityContext
context
)
{
securityContext
.
set
(
context
);
SECURITY_CONTEXT
.
set
(
context
);
}
public
static
UserSecurityContext
getContext
()
{
UserSecurityContext
ctx
=
securityContext
.
get
();
UserSecurityContext
ctx
=
SECURITY_CONTEXT
.
get
();
// 为空时,设置一个空的进去
if
(
ctx
==
null
)
{
ctx
=
new
UserSecurityContext
(
null
);
securityContext
.
set
(
ctx
);
SECURITY_CONTEXT
.
set
(
ctx
);
}
return
ctx
;
}
public
static
void
clear
()
{
securityContext
.
remove
();
SECURITY_CONTEXT
.
remove
();
}
}
\ No newline at end of file
}
user/user-service-impl/src/main/resources/config/application-test.yaml
0 → 100644
浏览文件 @
58525e09
spring
:
# datasource
datasource
:
url
:
jdbc:mysql://192.168.88.14:3306/mall_user?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name
:
com.mysql.jdbc.Driver
username
:
root
password
:
${MALL_MYSQL_PASSWORD}
user/user-service-impl/src/main/resources/config/application.yaml
浏览文件 @
58525e09
...
...
@@ -24,6 +24,7 @@ dubbo:
scan
:
base-packages
:
cn.iocoder.mall.user.biz.service
provider
:
filter
:
-exception
MobileCodeService
:
version
:
1.0.0
OAuth2Service
:
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论