Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
shengzhang_
sa-token
提交
87292cb7
sa-token
项目概览
shengzhang_
/
sa-token
通知
68
Star
16
Fork
4
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
sa-token
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
87292cb7
编写于
1月 14, 2021
作者:
shengzhang_
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
v1.12.1更新
上级
3b9f6b71
变更
23
隐藏空白更改
内联
并排
Showing
23 changed file
with
50 addition
and
36 deletion
+50
-36
README.md
README.md
+2
-2
pom.xml
pom.xml
+1
-1
sa-token-core/pom.xml
sa-token-core/pom.xml
+1
-1
sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
...re/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
+1
-1
sa-token-dao-redis-jackson/pom.xml
sa-token-dao-redis-jackson/pom.xml
+2
-2
sa-token-dao-redis/pom.xml
sa-token-dao-redis/pom.xml
+2
-2
sa-token-demo-jwt/pom.xml
sa-token-demo-jwt/pom.xml
+4
-4
sa-token-demo-springboot/pom.xml
sa-token-demo-springboot/pom.xml
+4
-4
sa-token-doc/doc/README.md
sa-token-doc/doc/README.md
+2
-2
sa-token-doc/doc/index.html
sa-token-doc/doc/index.html
+2
-1
sa-token-doc/doc/more/update-log.md
sa-token-doc/doc/more/update-log.md
+1
-0
sa-token-doc/doc/start/download.md
sa-token-doc/doc/start/download.md
+2
-2
sa-token-doc/doc/start/example.md
sa-token-doc/doc/start/example.md
+1
-1
sa-token-doc/doc/use/at-check.md
sa-token-doc/doc/use/at-check.md
+1
-1
sa-token-doc/doc/use/dao-extend.md
sa-token-doc/doc/use/dao-extend.md
+2
-2
sa-token-doc/doc/use/route-check.md
sa-token-doc/doc/use/route-check.md
+5
-2
sa-token-doc/index.html
sa-token-doc/index.html
+1
-1
sa-token-spring-aop/pom.xml
sa-token-spring-aop/pom.xml
+2
-2
sa-token-spring-boot-starter/pom.xml
sa-token-spring-boot-starter/pom.xml
+2
-2
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java
...cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java
+2
-1
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteFunction.java
...in/java/cn/dev33/satoken/interceptor/SaRouteFunction.java
+3
-0
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java
...java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java
+5
-0
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java
.../main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java
+2
-2
未找到文件。
README.md
浏览文件 @
87292cb7
<p
align=
"center"
>
<img
alt=
"logo"
src=
"https://gitee.com/sz6/sa-token/raw/master/sa-token-doc/doc/logo.png"
width=
"150"
height=
"150"
>
</p>
<h1
align=
"center"
style=
"margin: 30px 0 30px; font-weight: bold;"
>
sa-token v1.12.
0
</h1>
<h1
align=
"center"
style=
"margin: 30px 0 30px; font-weight: bold;"
>
sa-token v1.12.
1
</h1>
<h4
align=
"center"
>
这可能是史上功能最全的Java权限认证框架!
</h4>
<h4
align=
"center"
>
<a
href=
"https://gitee.com/sz6/sa-token/stargazers"
><img
src=
"https://gitee.com/sz6/sa-token/badge/star.svg"
></a>
<a
href=
"https://github.com/click33/sa-token"
><img
src=
"https://img.shields.io/badge/sa--token-v1.12.
0
-2B9939"
></a>
<a
href=
"https://github.com/click33/sa-token"
><img
src=
"https://img.shields.io/badge/sa--token-v1.12.
1
-2B9939"
></a>
<a
href=
"https://github.com/click33/sa-token/stargazers"
><img
src=
"https://img.shields.io/github/stars/click33/sa-token"
></a>
<a
href=
"https://github.com/click33/sa-token/watchers"
><img
src=
"https://img.shields.io/github/watchers/click33/sa-token"
></a>
<a
href=
"https://github.com/click33/sa-token/network/members"
><img
src=
"https://img.shields.io/github/forks/click33/sa-token"
></a>
...
...
pom.xml
浏览文件 @
87292cb7
...
...
@@ -8,7 +8,7 @@
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-parent
</artifactId>
<packaging>
pom
</packaging>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
<!-- 项目介绍 -->
<name>
sa-token
</name>
...
...
sa-token-core/pom.xml
浏览文件 @
87292cb7
...
...
@@ -7,7 +7,7 @@
<parent>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-parent
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</parent>
<packaging>
jar
</packaging>
...
...
sa-token-core/src/main/java/cn/dev33/satoken/util/SaTokenConsts.java
浏览文件 @
87292cb7
...
...
@@ -10,7 +10,7 @@ public class SaTokenConsts {
/**
* sa-token 版本号
*/
public
static
final
String
VERSION_NO
=
"v1.12.
0
"
;
public
static
final
String
VERSION_NO
=
"v1.12.
1
"
;
/**
* sa-token 开源地址
...
...
sa-token-dao-redis-jackson/pom.xml
浏览文件 @
87292cb7
...
...
@@ -7,7 +7,7 @@
<parent>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-parent
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</parent>
<packaging>
jar
</packaging>
...
...
@@ -20,7 +20,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-boot-starter
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
<!-- RedisTemplate 相关操作API -->
<dependency>
...
...
sa-token-dao-redis/pom.xml
浏览文件 @
87292cb7
...
...
@@ -7,7 +7,7 @@
<parent>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-parent
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</parent>
<packaging>
jar
</packaging>
...
...
@@ -20,7 +20,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-boot-starter
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
<!-- RedisTemplate 相关操作API -->
<dependency>
...
...
sa-token-demo-jwt/pom.xml
浏览文件 @
87292cb7
...
...
@@ -29,7 +29,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-boot-starter
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
<!-- jwt -->
...
...
@@ -43,14 +43,14 @@
<!-- <dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis</artifactId>
<version>1.12.
0
</version>
<version>1.12.
1
</version>
</dependency> -->
<!-- sa-token整合redis (使用jackson序列化方式) -->
<!-- <dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis-jackson</artifactId>
<version>1.12.
0
</version>
<version>1.12.
1
</version>
</dependency> -->
<!-- 提供redis连接池 -->
...
...
@@ -63,7 +63,7 @@
<!-- <dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-aop</artifactId>
<version>1.12.
0
</version>
<version>1.12.
1
</version>
</dependency> -->
<!-- @ConfigurationProperties -->
...
...
sa-token-demo-springboot/pom.xml
浏览文件 @
87292cb7
...
...
@@ -29,21 +29,21 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-boot-starter
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
<!-- sa-token整合redis (使用jdk默认序列化方式) -->
<!-- <dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis</artifactId>
<version>1.12.
0
</version>
<version>1.12.
1
</version>
</dependency> -->
<!-- sa-token整合redis (使用jackson序列化方式) -->
<!-- <dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis-jackson</artifactId>
<version>1.12.
0
</version>
<version>1.12.
1
</version>
</dependency> -->
<!-- 提供redis连接池 -->
...
...
@@ -56,7 +56,7 @@
<!-- <dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-aop</artifactId>
<version>1.12.
0
</version>
<version>1.12.
1
</version>
</dependency> -->
<!-- @ConfigurationProperties -->
...
...
sa-token-doc/doc/README.md
浏览文件 @
87292cb7
<p
align=
"center"
>
<img
alt=
"logo"
src=
"https://gitee.com/sz6/sa-token/raw/master/sa-token-doc/doc/logo.png"
width=
"150"
height=
"150"
>
</p>
<h1
align=
"center"
style=
"margin: 30px 0 30px; font-weight: bold;"
>
sa-token v1.12.
0
</h1>
<h1
align=
"center"
style=
"margin: 30px 0 30px; font-weight: bold;"
>
sa-token v1.12.
1
</h1>
<h4
align=
"center"
>
这可能是史上功能最全的Java权限认证框架!
</h4>
<h4
align=
"center"
>
<a
href=
"https://gitee.com/sz6/sa-token/stargazers"
><img
src=
"https://gitee.com/sz6/sa-token/badge/star.svg"
></a>
<a
href=
"https://github.com/click33/sa-token"
><img
src=
"https://img.shields.io/badge/sa--token-v1.12.
0
-2B9939"
></a>
<a
href=
"https://github.com/click33/sa-token"
><img
src=
"https://img.shields.io/badge/sa--token-v1.12.
1
-2B9939"
></a>
<a
href=
"https://github.com/click33/sa-token/stargazers"
><img
src=
"https://img.shields.io/github/stars/click33/sa-token"
></a>
<a
href=
"https://github.com/click33/sa-token/watchers"
><img
src=
"https://img.shields.io/github/watchers/click33/sa-token"
></a>
<a
href=
"https://github.com/click33/sa-token/network/members"
><img
src=
"https://img.shields.io/github/forks/click33/sa-token"
></a>
...
...
sa-token-doc/doc/index.html
浏览文件 @
87292cb7
...
...
@@ -22,6 +22,7 @@
<nav>
<select
onchange=
"location.href=this.value"
>
<option
value=
"http://sa-token.dev33.cn/doc/index.html"
>
最新版
</option>
<option
value=
"http://sa-token.dev33.cn/v/v1.12.0/doc/index.html"
>
v1.12.0
</option>
<option
value=
"http://sa-token.dev33.cn/v/v1.11.0/doc/index.html"
>
v1.11.0
</option>
<option
value=
"http://sa-token.dev33.cn/v/v1.10.0/doc/index.html"
>
v1.10.0
</option>
<option
value=
"http://sa-token.dev33.cn/v/v1.9.0/doc/index.html"
>
v1.9.0
</option>
...
...
@@ -41,7 +42,7 @@
</div>
<script>
var
name
=
'
<img style="width: 50px; height: 50px; vertical-align: middle;" src="logo.png" alt="logo" />
'
;
name
+=
'
<b style="font-size: 24px; vertical-align: middle;">sa-token</b> <sub>v1.12.
0
</sub>
'
name
+=
'
<b style="font-size: 24px; vertical-align: middle;">sa-token</b> <sub>v1.12.
1
</sub>
'
window
.
$docsify
=
{
name
:
name
,
// 名字
repo
:
'
https://github.com/click33/sa-token
'
,
// github地址
...
...
sa-token-doc/doc/more/update-log.md
浏览文件 @
87292cb7
...
...
@@ -7,6 +7,7 @@
-
新增:新增身份临时切换功能,可在一个代码段内将会话临时切换为其它账号
**[重要]**
-
优化:将
`SaCheckInterceptor.java`
更名为
`SaAnnotationInterceptor.java`
,更语义化的名称
-
优化:优化文档
-
升级:v1.12.1,新增
`SaRouterUtil`
工具类,更方便的路由鉴权
### 2021-1-10 @v1.11.0
...
...
sa-token-doc/doc/start/download.md
浏览文件 @
87292cb7
...
...
@@ -9,14 +9,14 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-boot-starter
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
```
## Gradle依赖
Gradle用户引入依赖:
```
implementation 'cn.dev33:sa-token-spring-boot-starter:1.12.
0
'
implementation 'cn.dev33:sa-token-spring-boot-starter:1.12.
1
'
```
...
...
sa-token-doc/doc/start/example.md
浏览文件 @
87292cb7
...
...
@@ -18,7 +18,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-boot-starter
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
```
...
...
sa-token-doc/doc/use/at-check.md
浏览文件 @
87292cb7
...
...
@@ -21,7 +21,7 @@ sa-token内置两种模式完成注解鉴权,分别是`AOP模式`和`拦截器
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-aop
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
```
...
...
sa-token-doc/doc/use/dao-extend.md
浏览文件 @
87292cb7
...
...
@@ -11,7 +11,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-dao-redis
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
```
优点:兼容性好,缺点:session序列化后基本不可读,对开发者来讲等同于乱码
...
...
@@ -23,7 +23,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-dao-redis-jackson
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
```
优点:session序列化后可读性强,可灵活手动修改,缺点:兼容性稍差
...
...
sa-token-doc/doc/use/route-check.md
浏览文件 @
87292cb7
...
...
@@ -65,8 +65,8 @@ public class MySaTokenConfig implements WebMvcConfigurer {
// 注册sa-token的所有拦截器
@Override
public
void
addInterceptors
(
InterceptorRegistry
registry
)
{
// 根据路由划分模块,不同模块不同鉴权
registry
.
addInterceptor
(
new
SaRouteInterceptor
((
request
,
response
,
handler
)->{
// 根据路由划分模块,不同模块不同鉴权
SaRouterUtil
.
match
(
"/user/**"
,
()
->
StpUtil
.
checkPermission
(
"user"
));
SaRouterUtil
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkPermission
(
"admin"
));
SaRouterUtil
.
match
(
"/goods/**"
,
()
->
StpUtil
.
checkPermission
(
"goods"
));
...
...
@@ -94,7 +94,7 @@ public class MySaTokenConfig implements WebMvcConfigurer {
// 登录验证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
SaRouterUtil
.
match
(
"/**"
,
"/user/doLogin"
,
()
->
StpUtil
.
checkLogin
());
// 角色认证 --
以/admin/**
开头的路由,必须具备[admin]角色或者[super-admin]角色才可以通过认证
// 角色认证 --
拦截以 admin
开头的路由,必须具备[admin]角色或者[super-admin]角色才可以通过认证
SaRouterUtil
.
match
(
"/admin/**"
,
()
->
StpUtil
.
checkRoleOr
(
"admin"
,
"super-admin"
));
// 权限认证 -- 不同模块, 校验不同权限
...
...
@@ -105,6 +105,9 @@ public class MySaTokenConfig implements WebMvcConfigurer {
SaRouterUtil
.
match
(
"/notice/**"
,
()
->
StpUtil
.
checkPermission
(
"notice"
));
SaRouterUtil
.
match
(
"/comment/**"
,
()
->
StpUtil
.
checkPermission
(
"comment"
));
// 匹配RESTful风格路由
SaRouterUtil
.
match
(
"/article/get/{id}"
,
()
->
StpUtil
.
checkPermission
(
"article"
));
})).
addPathPatterns
(
"/**"
);
}
}
...
...
sa-token-doc/index.html
浏览文件 @
87292cb7
...
...
@@ -43,7 +43,7 @@
<!-- 内容部分 -->
<div
class=
"main-box"
>
<div
class=
"content-box"
>
<h1>
sa-token
<small>
v1.12.
0
</small></h1>
<h1>
sa-token
<small>
v1.12.
1
</small></h1>
<div
class=
"sub-title"
>
这可能是史上功能最全的Java权限认证框架!
</div>
<!-- <p>0配置开箱即用,低学习成本</p> -->
<p>
登录验证、权限验证、Session会话、踢人下线、集成Redis、前后台分离、模拟他人账号、临时身份切换、多账号体系、注解式鉴权、路由拦截式鉴权、花式token、自动续签、同端互斥登录、会话治理、Spring集成...
</p>
...
...
sa-token-spring-aop/pom.xml
浏览文件 @
87292cb7
...
...
@@ -7,7 +7,7 @@
<parent>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-parent
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</parent>
<packaging>
jar
</packaging>
...
...
@@ -20,7 +20,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-spring-boot-starter
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
<!-- spring-boot-starter-aop -->
<dependency>
...
...
sa-token-spring-boot-starter/pom.xml
浏览文件 @
87292cb7
...
...
@@ -7,7 +7,7 @@
<parent>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-parent
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</parent>
<packaging>
jar
</packaging>
...
...
@@ -19,7 +19,7 @@
<dependency>
<groupId>
cn.dev33
</groupId>
<artifactId>
sa-token-core
</artifactId>
<version>
1.12.
0
</version>
<version>
1.12.
1
</version>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
...
...
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaAnnotationInterceptor.java
浏览文件 @
87292cb7
...
...
@@ -35,6 +35,7 @@ public class SaAnnotationInterceptor implements HandlerInterceptor {
/**
* @param stpLogic 底层的 StpLogic 对象
* @return 拦截器自身
*/
public
SaAnnotationInterceptor
setStpLogic
(
StpLogic
stpLogic
)
{
this
.
stpLogic
=
stpLogic
;
...
...
@@ -45,7 +46,7 @@ public class SaAnnotationInterceptor implements HandlerInterceptor {
/**
* 创建,并指定一个默认的 StpLogic
*/
public
SaAnnotationInterceptor
()
{
public
SaAnnotationInterceptor
()
{
}
/**
...
...
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteFunction.java
浏览文件 @
87292cb7
...
...
@@ -12,6 +12,9 @@ public interface SaRouteFunction {
/**
* 执行验证的方法
* @param request request对象
* @param response response对象
* @param handler 处理对象
*/
public
void
run
(
HttpServletRequest
request
,
HttpServletResponse
response
,
Object
handler
);
...
...
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouteInterceptor.java
浏览文件 @
87292cb7
...
...
@@ -78,6 +78,7 @@ public class SaRouteInterceptor implements HandlerInterceptor {
/**
* @param stpLogic 底层的 StpLogic 对象
* @return 拦截器自身
*/
public
SaRouteInterceptor
setStpLogic
(
StpLogic
stpLogic
)
{
this
.
stpLogic
=
stpLogic
;
...
...
@@ -93,6 +94,7 @@ public class SaRouteInterceptor implements HandlerInterceptor {
/**
* @param type 验证类型 (1=登录验证, 2=角色验证, 3=权限验证, 4=自定义验证)
* @return 拦截器自身
*/
public
SaRouteInterceptor
setType
(
int
type
)
{
this
.
type
=
type
;
...
...
@@ -108,6 +110,7 @@ public class SaRouteInterceptor implements HandlerInterceptor {
/**
* @param mode 验证模式 AND | OR
* @return 拦截器自身
*/
public
SaRouteInterceptor
setMode
(
SaMode
mode
)
{
this
.
mode
=
mode
;
...
...
@@ -123,6 +126,7 @@ public class SaRouteInterceptor implements HandlerInterceptor {
/**
* @param codes 标识码数组
* @return 拦截器自身
*/
public
SaRouteInterceptor
setCodes
(
String
...
codes
)
{
this
.
codes
=
codes
;
...
...
@@ -138,6 +142,7 @@ public class SaRouteInterceptor implements HandlerInterceptor {
/**
* @param function 设置自定义模式下的执行函数
* @return 拦截器自身
*/
public
SaRouteInterceptor
setFunction
(
SaRouteFunction
function
)
{
this
.
type
=
SaRouteInterceptor
.
CUSTOM
;
...
...
sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/interceptor/SaRouterUtil.java
浏览文件 @
87292cb7
...
...
@@ -61,7 +61,7 @@ public class SaRouterUtil {
/**
* 校验指定路由匹配符是否可以匹配成功指定路径
* @param pattern 路由匹配符
* @param pattern
s
路由匹配符
* @param path 需要匹配的路径集合
* @return 是否匹配成功
*/
...
...
@@ -85,7 +85,7 @@ public class SaRouterUtil {
/**
* 校验指定路由匹配符是否可以匹配成功当前URI
* @param pattern 路由匹配符
* @param pattern
s
路由匹配符
* @return 是否匹配成功
*/
public
static
boolean
isMatchCurrURI
(
List
<
String
>
patterns
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录