Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
飞一样的人
gin-vue-admin
提交
1a8a3ae4
G
gin-vue-admin
项目概览
飞一样的人
/
gin-vue-admin
与 Fork 源项目一致
Fork自
FLIPPED-AURORA / gin-vue-admin
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gin-vue-admin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1a8a3ae4
编写于
3月 17, 2020
作者:
Mr.奇淼(
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加验证码接口 修改swagger某些参数错误
上级
6bf6652d
变更
10
展开全部
隐藏空白更改
内联
并排
Showing
10 changed file
with
1984 addition
and
78 deletion
+1984
-78
QMPlusServer/controller/api/exa_breakpoint_continue.go
QMPlusServer/controller/api/exa_breakpoint_continue.go
+3
-4
QMPlusServer/controller/api/sys_captcha.go
QMPlusServer/controller/api/sys_captcha.go
+43
-0
QMPlusServer/controller/api/sys_system.go
QMPlusServer/controller/api/sys_system.go
+4
-2
QMPlusServer/controller/api/sys_user.go
QMPlusServer/controller/api/sys_user.go
+13
-5
QMPlusServer/controller/servers/captcha.go
QMPlusServer/controller/servers/captcha.go
+54
-0
QMPlusServer/docs/docs.go
QMPlusServer/docs/docs.go
+718
-33
QMPlusServer/docs/swagger.json
QMPlusServer/docs/swagger.json
+717
-32
QMPlusServer/docs/swagger.yaml
QMPlusServer/docs/swagger.yaml
+429
-1
QMPlusServer/go.mod
QMPlusServer/go.mod
+1
-1
QMPlusServer/router/sys_base.go
QMPlusServer/router/sys_base.go
+2
-0
未找到文件。
QMPlusServer/controller/api/exa_breakpoint_continue.go
浏览文件 @
1a8a3ae4
...
...
@@ -17,7 +17,6 @@ import (
// @Param file formData file true "断点续传示例"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"上传成功"}"
// @Router /fileUploadAndDownload/breakpointContinue [post]
func
BreakpointContinue
(
c
*
gin
.
Context
)
{
fileMd5
:=
c
.
Request
.
FormValue
(
"fileMd5"
)
fileName
:=
c
.
Request
.
FormValue
(
"fileName"
)
...
...
@@ -62,7 +61,7 @@ func BreakpointContinue(c *gin.Context) {
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce application/json
// @Param file
params
file true "查找文件"
// @Param file
formData
file true "查找文件"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查找成功"}"
// @Router /fileUploadAndDownload/findFile [post]
func
FindFile
(
c
*
gin
.
Context
)
{
...
...
@@ -82,7 +81,7 @@ func FindFile(c *gin.Context) {
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce application/json
// @Param file
params
file true "查找文件"
// @Param file
formData
file true "查找文件"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查找成功"}"
// @Router /fileUploadAndDownload/findFile [post]
func
BreakpointContinueFinish
(
c
*
gin
.
Context
)
{
...
...
@@ -101,7 +100,7 @@ func BreakpointContinueFinish(c *gin.Context) {
// @Security ApiKeyAuth
// @accept multipart/form-data
// @Produce application/json
// @Param file
params
file true "查找文件"
// @Param file
formData
file true "查找文件"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查找成功"}"
// @Router /fileUploadAndDownload/removeChunk [post]
func
RemoveChunk
(
c
*
gin
.
Context
)
{
...
...
QMPlusServer/controller/api/sys_captcha.go
浏览文件 @
1a8a3ae4
package
api
import
(
"gin-vue-admin/controller/servers"
"github.com/dchest/captcha"
"github.com/gin-gonic/gin"
)
// 获取图片验证码id
// @Tags base
// @Summary 生成验证码
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body modelInterface.PageInfo true "生成验证码"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /base/captcha [post]
func
Captcha
(
c
*
gin
.
Context
)
{
id
:=
captcha
.
NewLen
(
6
)
captcha
.
Server
(
captcha
.
StdWidth
,
captcha
.
StdHeight
)
servers
.
ReportFormat
(
c
,
true
,
"test"
,
gin
.
H
{
"id"
:
id
,
"picPath"
:
"/base/captcha/"
+
id
+
".png"
,
})
}
// @Tags base
// @Summary 生成验证码图片路径
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data body modelInterface.PageInfo true "生成验证码图片路径"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /base/captcha/:id [get]
func
CaptchaImg
(
c
*
gin
.
Context
)
{
servers
.
GinCapthcaServeHTTP
(
c
.
Writer
,
c
.
Request
)
}
QMPlusServer/controller/api/sys_system.go
浏览文件 @
1a8a3ae4
...
...
@@ -26,7 +26,7 @@ func GetSystemConfig(c *gin.Context) {
// @Summary 设置配置文件内容
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body sysModel.System true
// @Param data body sysModel.System true
"设置配置文件内容"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
// @Router /system/setSystemConfig [post]
func
SetSystemConfig
(
c
*
gin
.
Context
)
{
...
...
@@ -40,11 +40,13 @@ func SetSystemConfig(c *gin.Context) {
}
}
//本方法开发中 开发者windows系统 缺少linux系统所需的包 因此搁置
// @Tags system
// @Summary 设置配置文件内容
// @Security ApiKeyAuth
// @Produce application/json
// @Param data body sysModel.System true
// @Param data body sysModel.System true
"设置配置文件内容"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
// @Router /system/ReloadSystem [post]
func
ReloadSystem
(
c
*
gin
.
Context
)
{
...
...
QMPlusServer/controller/api/sys_user.go
浏览文件 @
1a8a3ae4
...
...
@@ -7,6 +7,7 @@ import (
"gin-vue-admin/middleware"
"gin-vue-admin/model/modelInterface"
"gin-vue-admin/model/sysModel"
"github.com/dchest/captcha"
"github.com/dgrijalva/jwt-go"
"github.com/gin-gonic/gin"
"github.com/go-redis/redis"
...
...
@@ -23,6 +24,8 @@ var (
type
RegistAndLoginStuct
struct
{
Username
string
`json:"username"`
Password
string
`json:"password"`
Captcha
string
`json:"captcha"`
CaptchaId
string
`json:"captchaId"`
}
type
RegestStuct
struct
{
...
...
@@ -64,12 +67,17 @@ func Regist(c *gin.Context) {
func
Login
(
c
*
gin
.
Context
)
{
var
L
RegistAndLoginStuct
_
=
c
.
BindJSON
(
&
L
)
U
:=
&
sysModel
.
SysUser
{
Username
:
L
.
Username
,
Password
:
L
.
Password
}
if
err
,
user
:=
U
.
Login
();
err
!=
nil
{
servers
.
ReportFormat
(
c
,
false
,
fmt
.
Sprintf
(
"用户名密码错误或%v"
,
err
),
gin
.
H
{})
}
else
{
tokenNext
(
c
,
*
user
)
if
captcha
.
VerifyString
(
L
.
CaptchaId
,
L
.
Captcha
)
{
U
:=
&
sysModel
.
SysUser
{
Username
:
L
.
Username
,
Password
:
L
.
Password
}
if
err
,
user
:=
U
.
Login
();
err
!=
nil
{
servers
.
ReportFormat
(
c
,
false
,
fmt
.
Sprintf
(
"用户名密码错误或%v"
,
err
),
gin
.
H
{})
}
else
{
tokenNext
(
c
,
*
user
)
}
}
else
{
servers
.
ReportFormat
(
c
,
false
,
"验证码错误"
,
gin
.
H
{})
}
}
//登录以后签发jwt
...
...
QMPlusServer/controller/servers/captcha.go
浏览文件 @
1a8a3ae4
package
servers
import
(
"bytes"
"fmt"
"github.com/dchest/captcha"
"net/http"
"path"
"strings"
"time"
)
// 这里需要自行实现captcha 的gin模式
func
GinCapthcaServeHTTP
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
dir
,
file
:=
path
.
Split
(
r
.
URL
.
Path
)
ext
:=
path
.
Ext
(
file
)
id
:=
file
[
:
len
(
file
)
-
len
(
ext
)]
if
ext
==
""
||
id
==
""
{
http
.
NotFound
(
w
,
r
)
return
}
fmt
.
Println
(
"reload : "
+
r
.
FormValue
(
"reload"
))
if
r
.
FormValue
(
"reload"
)
!=
""
{
captcha
.
Reload
(
id
)
}
lang
:=
strings
.
ToLower
(
r
.
FormValue
(
"lang"
))
download
:=
path
.
Base
(
dir
)
==
"download"
if
Serve
(
w
,
r
,
id
,
ext
,
lang
,
download
,
captcha
.
StdWidth
,
captcha
.
StdHeight
)
==
captcha
.
ErrNotFound
{
http
.
NotFound
(
w
,
r
)
}
}
func
Serve
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
,
id
,
ext
,
lang
string
,
download
bool
,
width
,
height
int
)
error
{
w
.
Header
()
.
Set
(
"Cache-Control"
,
"no-cache, no-store, must-revalidate"
)
w
.
Header
()
.
Set
(
"Pragma"
,
"no-cache"
)
w
.
Header
()
.
Set
(
"Expires"
,
"0"
)
var
content
bytes
.
Buffer
switch
ext
{
case
".png"
:
w
.
Header
()
.
Set
(
"Content-Type"
,
"image/png"
)
captcha
.
WriteImage
(
&
content
,
id
,
width
,
height
)
case
".wav"
:
w
.
Header
()
.
Set
(
"Content-Type"
,
"audio/x-wav"
)
captcha
.
WriteAudio
(
&
content
,
id
,
lang
)
default
:
return
captcha
.
ErrNotFound
}
if
download
{
w
.
Header
()
.
Set
(
"Content-Type"
,
"application/octet-stream"
)
}
http
.
ServeContent
(
w
,
r
,
id
+
ext
,
time
.
Time
{},
bytes
.
NewReader
(
content
.
Bytes
()))
return
nil
}
QMPlusServer/docs/docs.go
浏览文件 @
1a8a3ae4
此差异已折叠。
点击以展开。
QMPlusServer/docs/swagger.json
浏览文件 @
1a8a3ae4
此差异已折叠。
点击以展开。
QMPlusServer/docs/swagger.yaml
浏览文件 @
1a8a3ae4
...
...
@@ -54,6 +54,10 @@ definitions:
type
:
object
api.RegistAndLoginStuct
:
properties
:
captcha
:
type
:
string
captchaId
:
type
:
string
password
:
type
:
string
username
:
...
...
@@ -66,6 +70,90 @@ definitions:
uuid
:
type
:
string
type
:
object
config.CasbinConfig
:
properties
:
modelPath
:
description
:
casbin model地址配置
type
:
string
type
:
object
config.Config
:
properties
:
casbinConfig
:
$ref
:
'
#/definitions/config.CasbinConfig'
type
:
object
jwt
:
$ref
:
'
#/definitions/config.JWT'
type
:
object
mysqlAdmin
:
$ref
:
'
#/definitions/config.MysqlAdmin'
type
:
object
qiniu
:
$ref
:
'
#/definitions/config.Qiniu'
type
:
object
redisAdmin
:
$ref
:
'
#/definitions/config.RedisAdmin'
type
:
object
system
:
$ref
:
'
#/definitions/config.System'
type
:
object
type
:
object
config.JWT
:
properties
:
signingKey
:
type
:
string
type
:
object
config.MysqlAdmin
:
properties
:
config
:
type
:
string
dbname
:
type
:
string
password
:
type
:
string
path
:
type
:
string
username
:
type
:
string
type
:
object
config.Qiniu
:
properties
:
accessKey
:
type
:
string
secretKey
:
type
:
string
type
:
object
config.RedisAdmin
:
properties
:
addr
:
type
:
string
db
:
type
:
integer
password
:
type
:
string
type
:
object
config.System
:
properties
:
addr
:
type
:
integer
env
:
type
:
string
useMultipoint
:
type
:
boolean
type
:
object
dbModel.ExaCustomer
:
properties
:
customerName
:
type
:
string
customerPhoneData
:
type
:
string
sysUser
:
$ref
:
'
#/definitions/sysModel.SysUser'
type
:
object
sysUserAuthorityID
:
type
:
string
sysUserId
:
type
:
integer
type
:
object
dbModel.ExaFileUploadAndDownload
:
properties
:
key
:
...
...
@@ -84,12 +172,30 @@ definitions:
pageSize
:
type
:
integer
type
:
object
sysModel.CasbinInReceive
:
properties
:
authorityId
:
type
:
string
casbinInfos
:
items
:
$ref
:
'
#/definitions/sysModel.CasbinInfo'
type
:
array
type
:
object
sysModel.CasbinInfo
:
properties
:
method
:
type
:
string
path
:
type
:
string
type
:
object
sysModel.SysApi
:
properties
:
description
:
type
:
string
group
:
type
:
string
method
:
type
:
string
path
:
type
:
string
type
:
object
...
...
@@ -189,6 +295,12 @@ definitions:
description
:
所属工作流ID
type
:
integer
type
:
object
sysModel.System
:
properties
:
config
:
$ref
:
'
#/definitions/config.Config'
type
:
object
type
:
object
info
:
contact
:
{}
description
:
This is a sample Server pets
...
...
@@ -428,6 +540,54 @@ paths:
summary
:
设置角色资源权限
tags
:
-
authority
/base/captcha
:
post
:
consumes
:
-
application/json
parameters
:
-
description
:
生成验证码
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/modelInterface.PageInfo'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
生成验证码
tags
:
-
base
/base/captcha/
:
get
:
consumes
:
-
application/json
parameters
:
-
description
:
生成验证码图片路径
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/modelInterface.PageInfo'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
生成验证码图片路径
tags
:
-
base
/base/login
:
post
:
parameters
:
...
...
@@ -468,6 +628,30 @@ paths:
summary
:
用户注册账号
tags
:
-
Base
/casbin/CasbinTest
:
get
:
consumes
:
-
application/json
parameters
:
-
description
:
获取权限列表
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/api.CreateAuthorityParams'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
casb RBAC RESTFUL测试路由
tags
:
-
casbin
/casbin/casbinPUpdata
:
post
:
consumes
:
...
...
@@ -478,7 +662,7 @@ paths:
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/
api.CreateAuthorityParams
'
$ref
:
'
#/definitions/
sysModel.CasbinInReceive
'
type
:
object
produces
:
-
application/json
...
...
@@ -516,6 +700,148 @@ paths:
summary
:
获取权限列表
tags
:
-
casbin
/customer/createExaCustomer
:
post
:
consumes
:
-
application/json
parameters
:
-
description
:
创建客户
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/dbModel.ExaCustomer'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
创建客户
tags
:
-
SysApi
/customer/deleteExaCustomer
:
post
:
consumes
:
-
application/json
parameters
:
-
description
:
删除客户
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/dbModel.ExaCustomer'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
删除客户
tags
:
-
SysApi
/customer/getExaCustomer
:
post
:
consumes
:
-
application/json
parameters
:
-
description
:
获取单一客户信息
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/dbModel.ExaCustomer'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
获取单一客户信息
tags
:
-
SysApi
/customer/getExaCustomerList
:
post
:
consumes
:
-
application/json
parameters
:
-
description
:
获取权限客户列表
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/modelInterface.PageInfo'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
获取权限客户列表
tags
:
-
SysApi
/customer/updataExaCustomer
:
post
:
consumes
:
-
application/json
parameters
:
-
description
:
创建客户
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/dbModel.ExaCustomer'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
更新客户信息
tags
:
-
SysApi
/fileUploadAndDownload/breakpointContinue
:
post
:
consumes
:
-
multipart/form-data
parameters
:
-
description
:
断点续传示例
in
:
formData
name
:
file
required
:
true
type
:
file
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"上传成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
断点续传到服务器
tags
:
-
ExaFileUploadAndDownload
/fileUploadAndDownload/deleteFile
:
post
:
parameters
:
...
...
@@ -538,6 +864,28 @@ paths:
summary
:
删除文件
tags
:
-
ExaFileUploadAndDownload
/fileUploadAndDownload/findFile
:
post
:
consumes
:
-
multipart/form-data
parameters
:
-
description
:
查找文件
in
:
formData
name
:
file
required
:
true
type
:
file
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"查找成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
查找文件
tags
:
-
ExaFileUploadAndDownload
/fileUploadAndDownload/getFileList
:
post
:
consumes
:
...
...
@@ -562,6 +910,28 @@ paths:
summary
:
分页文件列表
tags
:
-
ExaFileUploadAndDownload
/fileUploadAndDownload/removeChunk
:
post
:
consumes
:
-
multipart/form-data
parameters
:
-
description
:
查找文件
in
:
formData
name
:
file
required
:
true
type
:
file
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"查找成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
删除切片
tags
:
-
ExaFileUploadAndDownload
/fileUploadAndDownload/upload
:
post
:
consumes
:
...
...
@@ -788,6 +1158,64 @@ paths:
summary
:
更新菜单
tags
:
-
menu
/system/ReloadSystem
:
post
:
parameters
:
-
description
:
设置配置文件内容
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/sysModel.System'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"返回成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
设置配置文件内容
tags
:
-
system
/system/getSystemConfig
:
post
:
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"返回成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
获取配置文件内容
tags
:
-
system
/system/setSystemConfig
:
post
:
parameters
:
-
description
:
设置配置文件内容
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/sysModel.System'
type
:
object
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"返回成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
设置配置文件内容
tags
:
-
system
/user/changePassword
:
post
:
parameters
:
...
...
QMPlusServer/go.mod
浏览文件 @
1a8a3ae4
...
...
@@ -6,10 +6,10 @@ require (
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc
github.com/casbin/casbin v1.9.1
github.com/casbin/gorm-adapter v1.0.0
github.com/dchest/captcha v0.0.0-20170622155422-6a29415a8364
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
github.com/fsnotify/fsnotify v1.4.7
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
github.com/gin-gonic/gin v1.4.0
github.com/go-redis/redis v6.15.6+incompatible
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect
...
...
QMPlusServer/router/sys_base.go
浏览文件 @
1a8a3ae4
...
...
@@ -10,6 +10,8 @@ func InitBaseRouter(Router *gin.RouterGroup) (R gin.IRoutes) {
{
BaseRouter
.
POST
(
"regist"
,
api
.
Regist
)
BaseRouter
.
POST
(
"login"
,
api
.
Login
)
BaseRouter
.
GET
(
"captcha"
,
api
.
Captcha
)
BaseRouter
.
GET
(
"/captcha/:id"
,
api
.
CaptchaImg
)
}
return
BaseRouter
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录