Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
J
jgjk
Project
Project
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
Graph
比较
统计图
议题
0
议题
0
列表
看板
标记
Milestones
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
注册表
注册表
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
任建宇
jgjk
Commits
e050fc07
提交
e050fc07
authored
9月 24, 2020
作者:
liupengfei
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
--no commit message
上级
198a32dd
隐藏空白字符变更
内嵌
并排
正在显示
10 个修改的文件
包含
510 行增加
和
32 行删除
+510
-32
FgOrganClient.java
...in/java/com/zrqx/core/client/member/fg/FgOrganClient.java
+19
-0
FgOrganClientHystric.java
.../com/zrqx/core/client/member/fg/FgOrganClientHystric.java
+14
-0
Member.java
.../main/java/com/zrqx/core/commons/model/member/Member.java
+67
-0
BaseRedis.java
.../src/main/java/com/zrqx/core/commons/redis/BaseRedis.java
+2
-2
Redis.java
core/src/main/java/com/zrqx/core/commons/redis/Redis.java
+221
-30
CacheService.java
.../src/main/java/com/zrqx/core/components/CacheService.java
+35
-0
RedisCacheServiceImpl.java
.../java/com/zrqx/core/components/RedisCacheServiceImpl.java
+44
-0
RedisMember.java
...ain/java/com/zrqx/core/components/member/RedisMember.java
+41
-0
LoginVo.java
...main/java/com/zrqx/core/components/member/vo/LoginVo.java
+21
-0
TimeUnitEnum.java
core/src/main/java/com/zrqx/core/enums/TimeUnitEnum.java
+46
-0
没有找到文件。
core/src/main/java/com/zrqx/core/client/member/fg/FgOrganClient.java
浏览文件 @
e050fc07
...
...
@@ -3,6 +3,7 @@ package com.zrqx.core.client.member.fg;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
com.zrqx.core.client.vo.member.OrganVO
;
import
com.zrqx.core.util.response.CallBack
;
...
...
@@ -32,4 +33,22 @@ public interface FgOrganClient {
*/
@GetMapping
(
"/organ/{oid}"
)
CallBack
<
OrganVO
>
getById
(
@PathVariable
(
"oid"
)
Integer
oid
);
/**
* 根据机构id查询机构的关联资源, code:0:成功;1:机构不存在;
* @return
* @author ycw
* @date: 2019年2月14日 上午9:21:27
*/
@GetMapping
(
"/service/organ/diytypes/code"
)
CallBack
<
String
>
getCurrentOrganByMemberCode
(
@PathVariable
(
"code"
)
String
code
);
/**
* 根据机构id查询机构
* @return
* @author ycw
* @date: 2019年2月14日 上午9:21:27
*/
@GetMapping
(
"/organ/code}"
)
CallBack
<
OrganVO
>
getByCode
(
@RequestParam
(
"code"
)
String
code
);
}
core/src/main/java/com/zrqx/core/client/member/fg/FgOrganClientHystric.java
浏览文件 @
e050fc07
...
...
@@ -25,4 +25,18 @@ public class FgOrganClientHystric implements FgOrganClient {
logger
.
info
(
"通过机构id:"
+
organId
+
"调用机构服务失败"
);
return
CallBack
.
fail
();
}
@Override
public
CallBack
<
String
>
getCurrentOrganByMemberCode
(
String
code
)
{
logger
.
info
(
"通过机构code:"
+
code
+
"调用机构服务失败"
);
return
CallBack
.
fail
();
}
@Override
public
CallBack
<
OrganVO
>
getByCode
(
String
code
)
{
logger
.
info
(
"通过机构code:"
+
code
+
"调用机构服务失败"
);
return
CallBack
.
fail
();
}
}
core/src/main/java/com/zrqx/core/commons/model/member/Member.java
0 → 100644
浏览文件 @
e050fc07
package
com
.
zrqx
.
core
.
commons
.
model
.
member
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
com.zrqx.core.util.excelutil.ExcelResources
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
javax.persistence.GeneratedValue
;
import
javax.persistence.GenerationType
;
import
javax.persistence.Id
;
import
javax.persistence.Table
;
import
javax.persistence.Transient
;
import
java.util.Date
;
/**
* @author lpf
* @date 2020-06-24
*/
@Data
@Table
(
name
=
"m_member"
)
@ApiModel
(
value
=
"Member"
,
description
=
"用户基础信息"
)
public
class
Member
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
,
generator
=
"SELECT REPLACE (UUID(), '-', '')"
)
@ApiModelProperty
(
"会员id,新增时不需填写"
)
private
String
id
;
@ApiModelProperty
(
"会员账号"
)
private
String
account
;
@ApiModelProperty
(
"昵称"
)
private
String
nickName
;
@ApiModelProperty
(
"密码"
)
private
String
password
;
@ApiModelProperty
(
"手机号"
)
private
String
phone
;
@ApiModelProperty
(
"邮箱"
)
private
String
email
;
/** @see com.zrqx.core.enums.StatusEnum */
@ApiModelProperty
(
"用户状态 0 禁用 1启用 "
)
private
Integer
status
;
/** @see com.zrqx.core.enums.SourceEnum */
@ApiModelProperty
(
"用户来源"
)
private
String
sourceType
;
/** @see com.zrqx.core.enums.member.RegisterTypeEnum */
@ApiModelProperty
(
"注册方式"
)
private
String
registerType
;
@ApiModelProperty
(
"备注"
)
private
String
remark
;
@ApiModelProperty
(
"微信Key"
)
@JsonIgnore
private
String
wechatKey
;
@ApiModelProperty
(
"qqKey"
)
@JsonIgnore
private
String
qqKey
;
@ApiModelProperty
(
"创建时间"
)
@JsonIgnore
private
Date
uploadTime
;
@ApiModelProperty
(
"机构码"
)
private
String
code
;
//新增用户类型
@ApiModelProperty
(
"用户类别:0 普通用户,1专家用户,2机构用户"
)
private
Integer
level
;
@Transient
private
String
cover
;
}
core/src/main/java/com/zrqx/core/commons/redis/BaseRedis.java
浏览文件 @
e050fc07
...
...
@@ -30,8 +30,8 @@ public abstract class BaseRedis {
private
final
String
SET_ERROR
=
"redis 存储信息时错误"
;
private
final
String
GET_NULL_ERROR
=
"redis获取信息时为空;"
;
/** 默认失效时间
7
天 */
pr
ivate
final
int
DEFAULT_LOSE_TIME
=
7
;
/** 默认失效时间
1
天 */
pr
otected
final
int
DEFAULT_LOSE_TIME
=
1
;
protected
abstract
void
setStringRedisTemplate
(
StringRedisTemplate
stringRedisTemplate
);
/**
...
...
core/src/main/java/com/zrqx/core/commons/redis/Redis.java
浏览文件 @
e050fc07
package
com
.
zrqx
.
core
.
commons
.
redis
;
import
java.io.IOException
;
import
java.util.Enumeration
;
import
java.util.concurrent.TimeUnit
;
import
javax.servlet.http.HttpServletRequest
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.data.redis.connection.DefaultStringRedisConnection
;
import
org.springframework.data.redis.connection.RedisConnection
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.stereotype.Component
;
import
org.springframework.web.context.request.RequestContextHolder
;
import
org.springframework.web.context.request.ServletRequestAttributes
;
import
com.zrqx.core.commons.
form.LoginMemberInfo
;
import
com.zrqx.core.commons.
model.member.Member
;
import
com.zrqx.core.commons.model.sysuser.User
;
import
com.zrqx.core.components.member.RedisMember
;
import
com.zrqx.core.enums.ResponseCodeEnum
;
import
com.zrqx.core.enums.TimeUnitEnum
;
import
com.zrqx.core.exception.BaseException
;
import
com.zrqx.core.util.JsonUtil.JsonUtil
;
import
lombok.extern.slf4j.Slf4j
;
/**
* Redis消息管理 ,调用时不能用多线程调用
* @author lpf
*/
@Slf4j
@Component
public
class
Redis
extends
BaseRedis
{
...
...
@@ -29,10 +38,32 @@ public class Redis extends BaseRedis{
protected
void
setStringRedisTemplate
(
StringRedisTemplate
stringRedisTemplate
)
{
super
.
stringRedisTemplate
=
stringRedisTemplate
;
}
@Autowired
StringRedisTemplate
stringRedisTemplate
;
private
final
String
FG_TOKEN
=
"y-token"
;
private
final
String
BG_TOKEN
=
"x-token"
;
/**
* 获取当前登录名称
*
* @return
*/
public
String
getOpName
()
{
return
getMember
().
getNickName
();
}
/**
* 获取登录id
*
* @return
*/
public
String
getOpId
()
{
return
getMember
().
getId
();
}
public
final
String
FG_TOKEN
=
"y-token"
;
public
final
String
BG_TOKEN
=
"x-token"
;
public
String
getBgToken
()
{
...
...
@@ -44,47 +75,88 @@ public class Redis extends BaseRedis{
}
public
User
getUser
()
{
return
super
.
get
(
getBgToken
(),
User
.
class
);
}
public
User
getUserByToken
(
String
token
)
{
try
{
return
super
.
get
(
getBgToken
(),
User
.
class
);
return
this
.
get
(
User
.
class
,
token
);
}
catch
(
Exception
e
)
{
throw
new
BaseException
(
ResponseCodeEnum
.
NO_LOGIN
);
log
.
error
(
e
.
getMessage
(),
e
);
return
null
;
}
}
public
LoginMemberInfo
getMember
()
{
try
{
return
super
.
get
(
getFgToken
(),
LoginMemberInfo
.
class
);
}
catch
(
Exception
e
)
{
throw
new
BaseException
(
ResponseCodeEnum
.
NO_LOGIN
);
public
<
T
>
T
get
(
Class
<
T
>
clazz
,
String
token
)
{
if
(
token
!=
null
){
return
get
(
token
,
clazz
);
}
throw
new
BaseException
(
"RedisAdapter#get请登录后进行此操作"
);
}
// TODO 存储redis中的 用户解析不一致
public
LoginMemberInfo
getOrderMember
()
{
return
super
.
get
(
getFgToken
(),
LoginMemberInfo
.
class
);
public
void
setRedisMember
(
RedisMember
redisMember
)
{
redisMember
.
getMember
().
setPassword
(
null
);
redisMember
.
getMember
().
setQqKey
(
null
);
redisMember
.
getMember
().
setWechatKey
(
null
);
redisMember
.
getMember
().
setPhone
(
null
);
this
.
set
(
redisMember
.
getLoginVo
().
getToken
(),
redisMember
,
DEFAULT_LOSE_TIME
,
TimeUnit
.
DAYS
);
}
// TODO 待删除
public
String
getOpId
()
{
return
getOrderMember
().
getId
()
+
""
;
public
RedisMember
getRedisMember
()
{
return
super
.
get
(
getFgToken
(),
RedisMember
.
class
)
;
}
public
boolean
isExistMember
()
{
try
{
getMember
();
return
true
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
false
;
public
RedisMember
getRedisMember
(
String
token
)
{
return
super
.
get
(
token
,
RedisMember
.
class
);
}
public
RedisMember
getNotNullRedisMember
()
{
RedisMember
redisMember
=
this
.
getRedisMember
();
if
(
redisMember
==
null
)
{
throw
new
BaseException
(
"fg用户不存在"
);
}
return
redisMember
;
}
public
Member
getMember
()
{
RedisMember
redisMember
=
this
.
getRedisMember
();
if
(
redisMember
!=
null
)
{
return
redisMember
.
getMember
();
}
throw
new
BaseException
(
"fg用户不存在"
);
}
public
Member
getNotNullMember
()
{
Member
m
=
this
.
getMember
();
if
(
m
!=
null
)
{
return
m
;
}
throw
new
BaseException
(
"fg用户不存在"
);
}
public
Member
getNotNullMember
(
String
token
)
{
RedisMember
redisMember
=
this
.
getRedisMember
(
token
);
if
(
redisMember
==
null
||
redisMember
.
getMember
()
==
null
)
{
throw
new
BaseException
(
"fg用户不存在"
);
}
return
redisMember
.
getMember
();
}
public
String
getMemberId
()
{
Member
m
=
this
.
getNotNullMember
();
return
m
.
getId
()+
""
;
}
public
boolean
isExistUser
()
{
public
boolean
isExistMember
()
{
try
{
get
Us
er
();
get
NotNullMemb
er
();
return
true
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
return
false
;
}
}
public
String
getToken
(
String
tokenName
)
{
HttpServletRequest
request
=
((
ServletRequestAttributes
)
RequestContextHolder
.
getRequestAttributes
()).
getRequest
();
Enumeration
<
String
>
headerNames
=
request
.
getHeaderNames
();
...
...
@@ -101,6 +173,126 @@ public class Redis extends BaseRedis{
return
token
;
}
/**
* 添加到redis
* @param token
* Key
* @param obj
* Value
* @param timeout
* 过期时间
* @param unit
* TimeUnitEnum 时间格式
* @throws IOException
*/
public
void
add
(
String
token
,
Object
obj
,
long
timeout
,
TimeUnitEnum
unit
)
throws
IOException
{
stringRedisTemplate
.
opsForValue
().
set
(
token
,
JsonUtil
.
bean2Json
(
obj
),
timeout
,
TimeUnitEnum
.
getValue
(
unit
.
name
()));
}
public
void
add
(
String
token
,
Object
obj
,
long
timeout
,
TimeUnit
unit
)
throws
IOException
{
stringRedisTemplate
.
opsForValue
().
set
(
token
,
JsonUtil
.
bean2Json
(
obj
),
timeout
,
unit
);
}
/**
* 根据key查询redis中的数据
*
* @param token
* @return
*/
@Override
public
String
get
(
String
token
)
{
return
stringRedisTemplate
.
opsForValue
().
get
(
token
);
}
/**
* 根据X-Token查询redis中的数据
*
* @return
*/
public
String
get
()
{
String
str
=
stringRedisTemplate
.
opsForValue
().
get
(
getBgToken
());
return
str
;
}
/**
*写入redis并指定库
* @param key
* @param value 为对象时flag_json必须为true
* @param db 缓存的数据库
* @param flagJson 是否将value值转为json
* @param timeOut 时效(秒) 永久传null
* @param unit
* TimeUnitEnum 时间格式
* @return
* @author zzg
*/
public
boolean
set
(
final
String
key
,
Object
value
,
int
db
,
boolean
flagJson
,
long
timeOut
,
TimeUnit
unit
)
{
boolean
result
=
false
;
try
{
// TODO 共享连接无法切换
RedisConnection
redisConnection
=
stringRedisTemplate
.
getConnectionFactory
().
getConnection
();
DefaultStringRedisConnection
stringRedisConnection
=
new
DefaultStringRedisConnection
(
redisConnection
);
stringRedisConnection
.
select
(
db
);
if
(
flagJson
){
stringRedisConnection
.
set
(
key
,
JsonUtil
.
bean2Json
(
value
));
}
else
{
stringRedisConnection
.
set
(
key
,
value
.
toString
());
}
if
(
timeOut
!=
0
){
stringRedisConnection
.
expire
(
key
,
timeOut
);
}
stringRedisConnection
.
close
();
result
=
true
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
result
;
}
/**
* 读取指定db的缓存
* @param key
* @param db
* @return
* @author zzg
*/
public
String
get
(
final
String
key
,
int
db
)
{
String
result
=
null
;
try
{
RedisConnection
redisConnection
=
stringRedisTemplate
.
getConnectionFactory
().
getConnection
();
DefaultStringRedisConnection
stringRedisConnection
=
new
DefaultStringRedisConnection
(
redisConnection
);
stringRedisConnection
.
select
(
db
);
result
=
stringRedisConnection
.
get
(
key
);
stringRedisConnection
.
close
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
result
;
}
/**
* 删除指定db的key
* @param key
* @param db
* @author zzg
*/
public
void
remove
(
final
String
key
,
int
db
)
{
try
{
RedisConnection
redisConnection
=
stringRedisTemplate
.
getConnectionFactory
().
getConnection
();
DefaultStringRedisConnection
stringRedisConnection
=
new
DefaultStringRedisConnection
(
redisConnection
);
stringRedisConnection
.
select
(
db
);
if
(
stringRedisConnection
.
exists
(
key
)){
stringRedisConnection
.
del
(
key
);
}
stringRedisConnection
.
close
();
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
public
<
T
>
T
getInfoObjectRedis
(
String
key
,
Class
<
T
>
objClass
){
try
{
String
userInfo
=
get
(
key
);
...
...
@@ -109,9 +301,8 @@ public class Redis extends BaseRedis{
}
return
JsonUtil
.
json2Bean
(
userInfo
,
objClass
);
}
catch
(
Exception
e
)
{
throw
new
BaseException
(
"获取用户信息
错误!
"
+
e
.
getMessage
());
throw
new
BaseException
(
"获取用户信息
失败!
"
+
e
.
getMessage
());
}
}
}
core/src/main/java/com/zrqx/core/components/CacheService.java
0 → 100644
浏览文件 @
e050fc07
package
com
.
zrqx
.
core
.
components
;
/**
* @author lpf
* @date 2020-06-16
*/
public
interface
CacheService
{
/**
* key:value:expiresInSeconds
* @param key
* @param value
* @param expiresInSeconds
*/
void
set
(
String
key
,
String
value
,
long
expiresInSeconds
);
/**
* exists key
* @param key
* @return
*/
boolean
exists
(
String
key
);
/**
* delete key
* @param key
*/
void
delete
(
String
key
);
/**
* get key
* @param key
* @return
*/
String
get
(
String
key
);
}
core/src/main/java/com/zrqx/core/components/RedisCacheServiceImpl.java
0 → 100644
浏览文件 @
e050fc07
package
com
.
zrqx
.
core
.
components
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.core.Ordered
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.data.redis.core.StringRedisTemplate
;
import
org.springframework.stereotype.Component
;
import
java.util.concurrent.TimeUnit
;
/**
* redis 缓存实现
* @author lpf
* @date 2020-06-17
*/
@Component
@Primary
@Order
(
Ordered
.
LOWEST_PRECEDENCE
)
public
class
RedisCacheServiceImpl
implements
CacheService
{
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
@Override
public
void
set
(
String
key
,
String
value
,
long
expiresInSeconds
)
{
stringRedisTemplate
.
opsForValue
().
set
(
key
,
value
,
expiresInSeconds
,
TimeUnit
.
SECONDS
);
}
@Override
public
boolean
exists
(
String
key
)
{
return
stringRedisTemplate
.
hasKey
(
key
);
}
@Override
public
void
delete
(
String
key
)
{
stringRedisTemplate
.
delete
(
key
);
}
@Override
public
String
get
(
String
key
)
{
return
stringRedisTemplate
.
opsForValue
().
get
(
key
);
}
}
core/src/main/java/com/zrqx/core/components/member/RedisMember.java
0 → 100644
浏览文件 @
e050fc07
package
com
.
zrqx
.
core
.
components
.
member
;
import
com.zrqx.core.commons.model.member.Member
;
import
com.zrqx.core.components.member.vo.LoginVo
;
import
com.zrqx.core.enums.BooleanStatusEnum
;
import
com.zrqx.core.util.datatype.UUIDUtil
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* member 存储到redis中的对象, 所有和用户依赖相关,可以添加此类的属性
* @author lpf
* @date 2020-06-28
*/
@Data
public
class
RedisMember
{
@ApiModelProperty
(
"用户基本信息"
)
private
Member
member
;
@ApiModelProperty
(
"用户登录信息"
)
private
LoginVo
loginVo
;
@ApiModelProperty
(
"用户是否可以重置密码"
)
private
boolean
canResetPassword
;
@ApiModelProperty
(
"vip会员 0否 1是 2已过期"
)
private
Integer
vip
;
@ApiModelProperty
(
"机构用户所属机构id"
)
private
Integer
organId
;
@ApiModelProperty
(
"关联资源分类(机构用户)"
)
private
String
relatedResourceTypes
;
public
static
RedisMember
build
(){
RedisMember
redisMember
=
new
RedisMember
();
LoginVo
loginVo
=
new
LoginVo
();
loginVo
.
setIsExsit
(
BooleanStatusEnum
.
YES
.
getCode
());
loginVo
.
setToken
(
UUIDUtil
.
getUUID
());
redisMember
.
setLoginVo
(
loginVo
);
redisMember
.
setCanResetPassword
(
false
);
return
redisMember
;
}
}
core/src/main/java/com/zrqx/core/components/member/vo/LoginVo.java
0 → 100644
浏览文件 @
e050fc07
package
com
.
zrqx
.
core
.
components
.
member
.
vo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
/**
* 登录 vo
* @author lpf
* @date 2020-06-28
*/
@Data
@ApiModel
(
value
=
"LoginVo"
,
description
=
"用户登录信息"
)
public
class
LoginVo
{
@ApiModelProperty
(
"y-token"
)
private
String
token
;
/** @see com.zrqx.core.enums.BooleanStatusEnum */
@ApiModelProperty
(
"判断用户是否存在 不存在0 存在1"
)
private
String
isExsit
;
}
core/src/main/java/com/zrqx/core/enums/TimeUnitEnum.java
0 → 100644
浏览文件 @
e050fc07
package
com
.
zrqx
.
core
.
enums
;
import
java.util.concurrent.TimeUnit
;
/**
*
* @author lpf
* @date 2020-07-01 13:46
*/
public
enum
TimeUnitEnum
{
// 微秒 一百万分之一秒(就是毫秒/1000)
微秒
(
TimeUnit
.
MICROSECONDS
),
// 毫秒 千分之一秒
毫秒
(
TimeUnit
.
MILLISECONDS
),
// 毫微秒 十亿分之一秒(就是微秒/1000)
毫微秒
(
TimeUnit
.
NANOSECONDS
),
// 秒
秒
(
TimeUnit
.
SECONDS
),
// 分钟
分钟
(
TimeUnit
.
MINUTES
),
// 小时
小时
(
TimeUnit
.
HOURS
),
// 天
天
(
TimeUnit
.
DAYS
);
private
final
TimeUnit
value
;
private
TimeUnitEnum
(
TimeUnit
value
)
{
this
.
value
=
value
;
}
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
分钟
.
value
);
System
.
out
.
println
(
TimeUnitEnum
.
getValue
(
"小时"
));
}
public
static
TimeUnit
getValue
(
String
name
)
{
if
(
name
==
null
)
{
throw
new
IllegalArgumentException
(
"TimeUnitEnum name is not null"
);
}
for
(
TimeUnitEnum
mt
:
values
())
{
if
(
mt
.
name
().
equals
(
name
))
{
return
mt
.
value
;
}
}
return
天
.
value
;
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论