Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
SatelliteDigital
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
nijiawen
SatelliteDigital
Commits
979b21eb
提交
979b21eb
authored
3月 30, 2026
作者:
周欢凯
浏览文件
操作
浏览文件
下载
差异文件
合并分支 'wx' 到 'dev/z'
Wx 查看合并请求
!1
上级
5c5eaf24
f69a6b8b
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
181 行增加
和
123 行删除
+181
-123
cdfCurve.vue
src/pages/all/components/cdf/cdfCurve.vue
+1
-1
index.vue
src/pages/all/components/cdf/index.vue
+2
-0
index.js
src/pages/all/components/loadingComponent1/index.js
+1
-1
index.vue
src/pages/all/index.vue
+15
-0
timers.vue
src/pages/footer/component/timers.vue
+1
-1
screenConfigeDialog.vue
src/pages/header/component/screenConfigeDialog.vue
+1
-0
index.vue
src/pages/lefts2/index.vue
+0
-0
index.vue
src/pages/rights/index.vue
+6
-3
request.js
src/utils/request.js
+154
-117
没有找到文件。
src/pages/all/components/cdf/cdfCurve.vue
浏览文件 @
979b21eb
...
@@ -202,7 +202,7 @@ function initChart() {
...
@@ -202,7 +202,7 @@ function initChart() {
rotate
:
45
,
rotate
:
45
,
margin
:
20
,
margin
:
20
,
fontSize
:
10
,
fontSize
:
10
,
//
interval: 'auto', // 或直接不写
interval
:
'auto'
,
// 或直接不写
// interval: function (index) {
// interval: function (index) {
// return index % 10 === 0 // 每10个显示一个
// return index % 10 === 0 // 每10个显示一个
// },
// },
...
...
src/pages/all/components/cdf/index.vue
浏览文件 @
979b21eb
...
@@ -59,6 +59,8 @@ const props = defineProps({
...
@@ -59,6 +59,8 @@ const props = defineProps({
default
:
null
default
:
null
}
}
});
});
console
.
log
(
"actualAvailabilityData"
,
props
.
data
[
1
])
onBeforeUnmount
(()
=>
{
onBeforeUnmount
(()
=>
{
//console.log("中,zhelixieza");
//console.log("中,zhelixieza");
...
...
src/pages/all/components/loadingComponent1/index.js
浏览文件 @
979b21eb
...
@@ -12,7 +12,7 @@ const SubLoading = (function() {
...
@@ -12,7 +12,7 @@ const SubLoading = (function() {
function
createLoading
(
options
=
{})
{
function
createLoading
(
options
=
{})
{
const
{
const
{
text
=
'
Loading...
'
,
text
=
'
正在加载中
'
,
background
=
'rgba(0, 0, 0, 0.57)'
,
background
=
'rgba(0, 0, 0, 0.57)'
,
color
=
'#fff'
,
color
=
'#fff'
,
zIndex
=
9999999
,
zIndex
=
9999999
,
...
...
src/pages/all/index.vue
浏览文件 @
979b21eb
...
@@ -182,6 +182,13 @@ const handleSwitchChange = (item) => {
...
@@ -182,6 +182,13 @@ const handleSwitchChange = (item) => {
break
;
break
;
case
'展开一级'
:
case
'展开一级'
:
if
(
item
.
enabled
)
{
subControls
.
value
[
1
].
enabled
=
false
window
.
ue5
(
"callBackControlExpendFn"
,
String
(
JSON
.
stringify
({
type
:
"SatelliteExpend2"
,
status
:
"close"
})));
}
if
(
window
.
ue5
)
{
if
(
window
.
ue5
)
{
window
.
ue5
(
"callBackControlExpendFn"
,
String
(
JSON
.
stringify
({
window
.
ue5
(
"callBackControlExpendFn"
,
String
(
JSON
.
stringify
({
type
:
"SatelliteExpend1"
,
type
:
"SatelliteExpend1"
,
...
@@ -195,6 +202,14 @@ const handleSwitchChange = (item) => {
...
@@ -195,6 +202,14 @@ const handleSwitchChange = (item) => {
break
;
break
;
case
'展开二级'
:
case
'展开二级'
:
if
(
item
.
enabled
)
{
subControls
.
value
[
0
].
enabled
=
false
window
.
ue5
(
"callBackControlExpendFn"
,
String
(
JSON
.
stringify
({
type
:
"SatelliteExpend1"
,
status
:
"close"
})));
}
// siteExpand1.value = true
if
(
window
.
ue5
)
{
if
(
window
.
ue5
)
{
window
.
ue5
(
"callBackControlExpendFn"
,
String
(
JSON
.
stringify
({
window
.
ue5
(
"callBackControlExpendFn"
,
String
(
JSON
.
stringify
({
type
:
"SatelliteExpend2"
,
type
:
"SatelliteExpend2"
,
...
...
src/pages/footer/component/timers.vue
浏览文件 @
979b21eb
...
@@ -1240,7 +1240,7 @@ const changeSpeed = () => {
...
@@ -1240,7 +1240,7 @@ const changeSpeed = () => {
const
startDrag
=
(
handle
,
e
)
=>
{
const
startDrag
=
(
handle
,
e
)
=>
{
//console.log("开始拖动");
//console.log("开始拖动");
if
(
is_flag_isRealtime
)
{
if
(
is_flag_isRealtime
.
value
)
{
ElMessage
({
ElMessage
({
type
:
'warning'
,
type
:
'warning'
,
message
:
'实时模式下无法进行拖拽'
,
message
:
'实时模式下无法进行拖拽'
,
...
...
src/pages/header/component/screenConfigeDialog.vue
浏览文件 @
979b21eb
...
@@ -492,6 +492,7 @@ const handleConfigApplay = async () => {
...
@@ -492,6 +492,7 @@ const handleConfigApplay = async () => {
_delayData
:
delayData
.
value
,
_delayData
:
delayData
.
value
,
_availabilityData
:
availabilityData
.
value
,
_availabilityData
:
availabilityData
.
value
,
_lossRateData
:
lossRateData
.
value
,
_lossRateData
:
lossRateData
.
value
,
_actualAvailabilityData
:
actualAvailabilityData
.
value
,
component1
:
currentComponent1
.
value
,
component1
:
currentComponent1
.
value
,
component2
:
currentComponent2
.
value
,
component2
:
currentComponent2
.
value
,
component3
:
currentComponent3
.
value
,
component3
:
currentComponent3
.
value
,
...
...
src/pages/lefts2/index.vue
浏览文件 @
979b21eb
This source diff could not be displayed because it is too large. You can
view the blob
instead.
src/pages/rights/index.vue
浏览文件 @
979b21eb
...
@@ -9,8 +9,8 @@
...
@@ -9,8 +9,8 @@
<!-- 卫星列表 -->
<!-- 卫星列表 -->
<div
class=
"satellite-section"
>
<div
class=
"satellite-section"
>
<!--
<cdf></cdf>
-->
<!--
<cdf></cdf>
-->
<component
:is=
"component2"
:data=
"[availabilityData
]"
zoomHeight=
"14"
:title=
"titles[1]"
slogan=
"可用性
"
<component
:is=
"component2"
:data=
"[availabilityData
, actualAvailabilityData]"
zoomHeight=
"14"
:title=
"titles[1]
"
:legendName=
"['规划可用性', '实际可用性']"
></component>
slogan=
"可用性"
:legendName=
"['规划可用性', '实际可用性']"
></component>
</div>
</div>
...
@@ -43,6 +43,7 @@ let trafficData = ref([])
...
@@ -43,6 +43,7 @@ let trafficData = ref([])
let
delayData
=
ref
([])
let
delayData
=
ref
([])
let
lossRateData
=
ref
([])
let
lossRateData
=
ref
([])
let
availabilityData
=
ref
([])
let
availabilityData
=
ref
([])
let
actualAvailabilityData
=
ref
([])
const
titles
=
ref
([
''
,
''
,
''
]);
const
titles
=
ref
([
''
,
''
,
''
]);
const
appStore
=
useAppStore
();
const
appStore
=
useAppStore
();
...
@@ -55,7 +56,7 @@ watch(() => appStore.chartConfig, (newVal) => {
...
@@ -55,7 +56,7 @@ watch(() => appStore.chartConfig, (newVal) => {
// console.log('appStore.chartConfig', appStore.chartConfig)
// console.log('appStore.chartConfig', appStore.chartConfig)
// console.log('newVal', newVal)
// console.log('newVal', newVal)
if
(
appStore
.
chartConfig
)
{
if
(
appStore
.
chartConfig
)
{
const
{
_capacityData
,
_trafficData
,
_delayData
,
_availabilityData
,
_lossRateData
,
_titles
}
=
appStore
.
chartConfig
const
{
_capacityData
,
_trafficData
,
_delayData
,
_availabilityData
,
_lossRateData
,
_titles
,
_actualAvailabilityData
}
=
appStore
.
chartConfig
component1
.
value
=
markRaw
(
appStore
.
chartConfig
.
component1
)
component1
.
value
=
markRaw
(
appStore
.
chartConfig
.
component1
)
component2
.
value
=
markRaw
(
appStore
.
chartConfig
.
component2
)
component2
.
value
=
markRaw
(
appStore
.
chartConfig
.
component2
)
component3
.
value
=
markRaw
(
appStore
.
chartConfig
.
component3
)
component3
.
value
=
markRaw
(
appStore
.
chartConfig
.
component3
)
...
@@ -65,6 +66,7 @@ watch(() => appStore.chartConfig, (newVal) => {
...
@@ -65,6 +66,7 @@ watch(() => appStore.chartConfig, (newVal) => {
delayData
.
value
=
_delayData
delayData
.
value
=
_delayData
availabilityData
.
value
=
_availabilityData
availabilityData
.
value
=
_availabilityData
lossRateData
.
value
=
_lossRateData
lossRateData
.
value
=
_lossRateData
actualAvailabilityData
.
value
=
_actualAvailabilityData
titles
.
value
=
_titles
titles
.
value
=
_titles
...
@@ -87,6 +89,7 @@ const getPanelCurveData = async (data) => {
...
@@ -87,6 +89,7 @@ const getPanelCurveData = async (data) => {
delayData
.
value
=
res
.
data
.
delay
delayData
.
value
=
res
.
data
.
delay
lossRateData
.
value
=
res
.
data
.
lossRate
lossRateData
.
value
=
res
.
data
.
lossRate
availabilityData
.
value
=
res
.
data
.
availability
availabilityData
.
value
=
res
.
data
.
availability
actualAvailabilityData
.
value
=
res
.
data
.
actualAvailability
}
}
}
}
...
...
src/utils/request.js
浏览文件 @
979b21eb
import
axios
from
'axios'
import
axios
from
"axios"
;
import
{
ElNotification
,
ElMessageBox
,
ElMessage
,
ElLoading
}
from
'element-plus'
import
{
import
{
getToken
,
removeToken
}
from
'@/utils/auth.js'
ElNotification
,
import
{
tansParams
}
from
'@/utils/function.js'
ElMessageBox
,
import
local
from
'@/utils/local.js'
ElMessage
,
import
{
saveAs
}
from
'file-saver'
ElLoading
,
}
from
"element-plus"
;
import
{
getToken
,
removeToken
}
from
"@/utils/auth.js"
;
import
{
tansParams
}
from
"@/utils/function.js"
;
import
local
from
"@/utils/local.js"
;
import
{
saveAs
}
from
"file-saver"
;
import
Loading
from
"@/pages/all/components/loadingComponent/index.js"
;
import
Loading2
from
"@/pages/all/components/loadingComponent1/index.js"
;
// import useUserStore from '@/store/modules/user'
// import useUserStore from '@/store/modules/user'
let
downloadLoadingInstance
;
let
downloadLoadingInstance
;
// 是否显示重新登录
// 是否显示重新登录
export
let
isRelogin
=
{
show
:
false
};
export
let
isRelogin
=
{
show
:
false
};
axios
.
defaults
.
headers
[
'Content-Type'
]
=
'application/json;charset=utf-8'
axios
.
defaults
.
headers
[
"Content-Type"
]
=
"application/json;charset=utf-8"
;
// 创建axios实例
// 创建axios实例
// console.log("import.meta.env.VITE_API_URL",import.meta.env.VITE_API_URL);
// console.log("import.meta.env.VITE_API_URL",import.meta.env.VITE_API_URL);
const
service
=
axios
.
create
({
const
service
=
axios
.
create
({
// axios中请求配置有baseURL选项,表示请求URL公共部分
// axios中请求配置有baseURL选项,表示请求URL公共部分
baseURL
:
import
.
meta
.
env
.
VITE_API_URL
,
baseURL
:
import
.
meta
.
env
.
VITE_API_URL
,
// 超时
// 超时
timeout
:
60000
timeout
:
60000
,
})
});
// request拦截器
// request拦截器
service
.
interceptors
.
request
.
use
(
config
=>
{
service
.
interceptors
.
request
.
use
(
if
(
config
.
method
===
'get'
&&
config
.
params
)
{
(
config
)
=>
{
let
url
=
config
.
url
+
'?'
+
tansParams
(
config
.
params
);
if
(
config
.
method
===
"get"
&&
config
.
params
)
{
url
=
url
.
slice
(
0
,
-
1
);
let
url
=
config
.
url
+
"?"
+
tansParams
(
config
.
params
);
config
.
params
=
{};
url
=
url
.
slice
(
0
,
-
1
);
config
.
url
=
url
;
config
.
params
=
{};
}
config
.
url
=
url
;
if
(
(
config
.
method
===
'post'
||
config
.
method
===
'put'
))
{
const
requestObj
=
{
url
:
config
.
url
,
data
:
typeof
config
.
data
===
'object'
?
JSON
.
stringify
(
config
.
data
)
:
config
.
data
,
time
:
new
Date
().
getTime
()
}
}
const
requestSize
=
Object
.
keys
(
JSON
.
stringify
(
requestObj
)).
length
;
// 请求数据大小
if
(
config
.
method
===
"post"
||
config
.
method
===
"put"
)
{
const
limitSize
=
5
*
1024
*
1024
;
// 限制存放数据5M
const
requestObj
=
{
if
(
requestSize
>=
limitSize
)
{
url
:
config
.
url
,
console
.
warn
(
`[
${
config
.
url
}
]: `
+
'请求数据大小超出允许的5M限制,无法进行防重复提交验证。'
)
data
:
return
config
;
typeof
config
.
data
===
"object"
?
JSON
.
stringify
(
config
.
data
)
:
config
.
data
,
time
:
new
Date
().
getTime
(),
};
const
requestSize
=
Object
.
keys
(
JSON
.
stringify
(
requestObj
)).
length
;
// 请求数据大小
const
limitSize
=
5
*
1024
*
1024
;
// 限制存放数据5M
if
(
requestSize
>=
limitSize
)
{
console
.
warn
(
`[
${
config
.
url
}
]: `
+
"请求数据大小超出允许的5M限制,无法进行防重复提交验证。"
,
);
return
config
;
}
const
sessionObj
=
local
.
session
.
getJSON
(
"sessionObj"
);
local
.
session
.
setJSON
(
"sessionObj"
,
requestObj
);
// if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
// local.session.setJSON('sessionObj', requestObj)
// } else {
// const s_url = sessionObj.url; // 请求地址
// const s_data = sessionObj.data; // 请求数据
// const s_time = sessionObj.time; // 请求时间
// const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
// // //console.log(s_data, requestObj.data, requestObj.time, s_time, s_url, requestObj.url);
// if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
// const message = '数据正在处理,请勿重复提交';
// console.warn(`[${s_url}]: ` + message)
// return Promise.reject(new Error(message))
// } else {
// local.session.setJSON('sessionObj', requestObj)
// }
// }
}
}
const
sessionObj
=
local
.
session
.
getJSON
(
'sessionObj'
)
return
config
;
local
.
session
.
setJSON
(
'sessionObj'
,
requestObj
)
},
(
error
)
=>
{
// if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
// local.session.setJSON('sessionObj', requestObj)
// } else {
// const s_url = sessionObj.url; // 请求地址
// const s_data = sessionObj.data; // 请求数据
// const s_time = sessionObj.time; // 请求时间
// const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交
// // //console.log(s_data, requestObj.data, requestObj.time, s_time, s_url, requestObj.url);
// if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
// const message = '数据正在处理,请勿重复提交';
// console.warn(`[${s_url}]: ` + message)
// return Promise.reject(new Error(message))
// } else {
// local.session.setJSON('sessionObj', requestObj)
// }
// }
}
return
config
},
error
=>
{
//console.log(error)
//console.log(error)
Promise
.
reject
(
error
)
Promise
.
reject
(
error
);
})
},
);
// 响应拦截器
// 响应拦截器
service
.
interceptors
.
response
.
use
(
service
.
interceptors
.
response
.
use
(
res
=>
{
(
res
)
=>
{
// 未设置状态码则默认成功状态
Loading
.
hide
();
const
code
=
res
.
data
.
code
||
200
;
Loading2
.
hide
();
// 获取错误信息
// 未设置状态码则默认成功状态
const
msg
=
res
.
data
.
msg
||
'未知错误'
;
const
code
=
res
.
data
.
code
||
200
;
// 二进制数据则直接返回
// 获取错误信息
if
(
res
.
request
.
responseType
===
'blob'
||
res
.
request
.
responseType
===
'arraybuffer'
)
{
const
msg
=
res
.
data
.
msg
||
"未知错误"
;
return
res
.
data
// 二进制数据则直接返回
}
if
(
if
(
code
===
401
)
{
res
.
request
.
responseType
===
"blob"
||
if
(
!
isRelogin
.
show
)
{
res
.
request
.
responseType
===
"arraybuffer"
isRelogin
.
show
=
true
;
)
{
removeToken
()
//删除token
return
res
.
data
;
ElMessageBox
.
confirm
(
'登录状态已过期,您可以继续留在该页面,或者重新登录'
,
'系统提示'
,
{
confirmButtonText
:
'重新登录'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
}).
then
(()
=>
{
isRelogin
.
show
=
false
;
// useUserStore().logOut().then(() => {
location
.
href
=
'/'
;
// })
}).
catch
(()
=>
{
isRelogin
.
show
=
false
;
});
}
}
return
Promise
.
reject
(
'无效的会话,或者会话已过期,请重新登录。'
)
if
(
code
===
401
)
{
}
else
if
(
code
===
500
)
{
if
(
!
isRelogin
.
show
)
{
ElMessage
({
message
:
msg
,
type
:
'error'
})
isRelogin
.
show
=
true
;
return
Promise
.
reject
(
new
Error
(
msg
))
removeToken
();
//删除token
}
else
if
(
code
===
601
)
{
ElMessageBox
.
confirm
(
ElMessage
({
message
:
msg
,
type
:
'warning'
})
"登录状态已过期,您可以继续留在该页面,或者重新登录"
,
return
Promise
.
reject
(
new
Error
(
msg
))
"系统提示"
,
}
else
if
(
code
!==
200
)
{
{
ElNotification
.
error
({
title
:
msg
})
confirmButtonText
:
"重新登录"
,
return
Promise
.
reject
(
'error'
)
cancelButtonText
:
"取消"
,
}
else
{
type
:
"warning"
,
return
Promise
.
resolve
(
res
.
data
)
},
}
)
},
.
then
(()
=>
{
error
=>
{
isRelogin
.
show
=
false
;
// useUserStore().logOut().then(() => {
location
.
href
=
"/"
;
// })
})
.
catch
(()
=>
{
isRelogin
.
show
=
false
;
});
}
return
Promise
.
reject
(
"无效的会话,或者会话已过期,请重新登录。"
);
}
else
if
(
code
===
500
)
{
ElMessage
({
message
:
msg
,
type
:
"error"
});
return
Promise
.
reject
(
new
Error
(
msg
));
}
else
if
(
code
===
601
)
{
ElMessage
({
message
:
msg
,
type
:
"warning"
});
return
Promise
.
reject
(
new
Error
(
msg
));
}
else
if
(
code
!==
200
)
{
ElNotification
.
error
({
title
:
msg
});
return
Promise
.
reject
(
"error"
);
}
else
{
return
Promise
.
resolve
(
res
.
data
);
}
},
(
error
)
=>
{
//console.log('err' + error)
//console.log('err' + error)
let
{
message
}
=
error
;
let
{
message
}
=
error
;
if
(
message
==
"Network Error"
)
{
if
(
message
==
"Network Error"
)
{
...
@@ -120,35 +147,45 @@ service.interceptors.response.use(
...
@@ -120,35 +147,45 @@ service.interceptors.response.use(
}
else
if
(
message
.
includes
(
"Request failed with status code"
))
{
}
else
if
(
message
.
includes
(
"Request failed with status code"
))
{
message
=
"系统接口"
+
message
.
substr
(
message
.
length
-
3
)
+
"异常"
;
message
=
"系统接口"
+
message
.
substr
(
message
.
length
-
3
)
+
"异常"
;
}
}
ElMessage
({
message
:
message
,
type
:
'error'
,
duration
:
5
*
1000
})
ElMessage
({
message
:
message
,
type
:
"error"
,
duration
:
5
*
1000
});
return
Promise
.
reject
(
error
)
return
Promise
.
reject
(
error
)
;
}
}
,
)
)
;
// 通用下载方法
// 通用下载方法
export
function
download
(
url
,
params
,
filename
,
config
)
{
export
function
download
(
url
,
params
,
filename
,
config
)
{
downloadLoadingInstance
=
ElLoading
.
service
({
text
:
"正在下载数据,请稍候"
,
background
:
"rgba(0, 0, 0, 0.7)"
,
})
downloadLoadingInstance
=
ElLoading
.
service
({
return
service
.
post
(
url
,
params
,
{
text
:
"正在下载数据,请稍候"
,
transformRequest
:
[(
params
)
=>
{
return
tansParams
(
params
)
}],
background
:
"rgba(0, 0, 0, 0.7)"
,
headers
:
{
'Content-Type'
:
'application/x-www-form-urlencoded'
},
});
responseType
:
'blob'
,
return
service
...
config
.
post
(
url
,
params
,
{
}).
then
(
async
(
data
)
=>
{
transformRequest
:
[
if
(
data
.
type
!==
'application/json'
)
{
(
params
)
=>
{
const
blob
=
new
Blob
([
data
])
return
tansParams
(
params
);
saveAs
(
blob
,
filename
)
},
}
else
{
],
const
resText
=
await
data
.
text
();
headers
:
{
"Content-Type"
:
"application/x-www-form-urlencoded"
},
const
rspObj
=
JSON
.
parse
(
resText
);
responseType
:
"blob"
,
const
errMsg
=
rspObj
.
msg
||
'下载文件失败,请联系管理员!'
;
...
config
,
ElMessage
.
error
(
errMsg
);
})
}
.
then
(
async
(
data
)
=>
{
downloadLoadingInstance
.
close
();
if
(
data
.
type
!==
"application/json"
)
{
}).
catch
((
r
)
=>
{
const
blob
=
new
Blob
([
data
]);
console
.
error
(
r
)
saveAs
(
blob
,
filename
);
ElMessage
.
error
(
'下载文件出现错误,请联系管理员!'
)
}
else
{
downloadLoadingInstance
.
close
();
const
resText
=
await
data
.
text
();
})
const
rspObj
=
JSON
.
parse
(
resText
);
const
errMsg
=
rspObj
.
msg
||
"下载文件失败,请联系管理员!"
;
ElMessage
.
error
(
errMsg
);
}
downloadLoadingInstance
.
close
();
})
.
catch
((
r
)
=>
{
console
.
error
(
r
);
ElMessage
.
error
(
"下载文件出现错误,请联系管理员!"
);
downloadLoadingInstance
.
close
();
});
}
}
export
default
service
export
default
service
;
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论