parent
8da55c377e
commit
832bf3bf66
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 7.8 KiB |
@ -0,0 +1,118 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-card shadow="never"> |
||||
<template #header> |
||||
<div style="display: flex; align-items: center"> |
||||
<el-icon><Loading /></el-icon> <span |
||||
style="font-weight: 700; font-size: 14px; line-height: 16px" |
||||
>设备监控</span |
||||
> |
||||
</div> |
||||
</template> |
||||
<el-form |
||||
ref="monitorFormRef" |
||||
:model="formData" |
||||
:rules="rules" |
||||
v-loading="loading" |
||||
> |
||||
<el-descriptions :column="2" border> |
||||
<el-descriptions-item |
||||
label=" 监控时长:(秒)" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<el-form-item style="margin-bottom: 0" prop="monitorPeriod"> |
||||
<el-input |
||||
v-model="formData.monitorPeriod" |
||||
placeholder="请输入监控时长" |
||||
/> |
||||
</el-form-item> |
||||
</el-descriptions-item> |
||||
<el-descriptions-item |
||||
label=" 采样周期:(秒)" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<el-form-item style="margin-bottom: 0" prop="monitorInterval"> |
||||
<el-input |
||||
v-model="formData.monitorInterval" |
||||
placeholder="请输入采样周期" |
||||
/> |
||||
</el-form-item> |
||||
</el-descriptions-item> |
||||
</el-descriptions> |
||||
</el-form> |
||||
<template #footer> |
||||
<div class="flex justify-end"> |
||||
<el-button type="primary" @click="submitForm(monitorFormRef)" |
||||
>确定</el-button |
||||
> |
||||
<el-button @click="resetForm(monitorFormRef)">重置</el-button> |
||||
</div> |
||||
</template> |
||||
</el-card> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { DeviceMonitorForm } from "@/api/remote/types"; |
||||
import { FormInstance, FormRules } from "element-plus"; |
||||
import { remoteDeviceMonitor } from "@/api/remote"; |
||||
const route = useRoute(); |
||||
let devId: number = parseInt(<string>route.params.devId); |
||||
const formData = ref<DeviceMonitorForm>({ |
||||
devId: devId, |
||||
}); |
||||
const loading = ref<boolean>(false); |
||||
const monitorFormRef = ref<FormInstance>(); |
||||
const rules = reactive<FormRules<DeviceMonitorForm>>({ |
||||
monitorInterval: [ |
||||
{ required: true, message: "请输入采样周期", trigger: "blur" }, |
||||
], |
||||
monitorPeriod: [ |
||||
{ required: true, message: "请输入监控时长", trigger: "blur" }, |
||||
], |
||||
}); |
||||
const resetForm = (formEl: FormInstance | undefined) => { |
||||
if (!formEl) return; |
||||
formEl.resetFields(); |
||||
}; |
||||
const submitForm = async (formEl: FormInstance | undefined) => { |
||||
if (!formEl) return; |
||||
await formEl.validate((valid, fields) => { |
||||
if (valid) { |
||||
loading.value = true; |
||||
remoteDeviceMonitor(formData.value) |
||||
.then(() => { |
||||
ElMessage({ |
||||
message: "操作成功", |
||||
type: "success", |
||||
duration: 1000, |
||||
}); |
||||
}) |
||||
.finally(() => { |
||||
loading.value = false; |
||||
}); |
||||
} else { |
||||
console.log("error submit!", fields); |
||||
} |
||||
}); |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
:deep(.my-label) { |
||||
width: 40px !important; |
||||
text-align: center !important; |
||||
background: var(--el-color-white) !important; |
||||
} |
||||
:deep(.el-card__body) { |
||||
padding: 10px 0 10px 0; |
||||
} |
||||
</style> |
@ -0,0 +1,183 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-card shadow="never"> |
||||
<template #header> |
||||
<div style="display: flex; align-items: center"> |
||||
<el-icon><Loading /></el-icon> <span |
||||
style="font-weight: 700; font-size: 14px; line-height: 16px" |
||||
>设备测速</span |
||||
> |
||||
</div> |
||||
</template> |
||||
<el-descriptions :column="2" border> |
||||
<el-descriptions-item |
||||
label="历史最佳速率" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
{{ speedMaxRate }} |
||||
</el-descriptions-item> |
||||
<el-descriptions-item |
||||
label="上网方式" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<div v-loading="connTypeLoading"> |
||||
{{ connType }} |
||||
</div> |
||||
</el-descriptions-item> |
||||
<el-descriptions-item |
||||
label="宽带账号" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
{{ pppoe }} |
||||
</el-descriptions-item> |
||||
<el-descriptions-item |
||||
label="测速服务器" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<el-select |
||||
v-model="downloadUrl" |
||||
placeholder="请选择测速服务器" |
||||
style="width: 100%" |
||||
> |
||||
<el-option |
||||
v-for="(item, index) in options" |
||||
:key="index" |
||||
:label="item" |
||||
:value="item" |
||||
/> |
||||
</el-select> |
||||
</el-descriptions-item> |
||||
</el-descriptions> |
||||
</el-card> |
||||
<el-card shadow="never"> |
||||
<template #header> |
||||
<div class="flex justify-between"> |
||||
<div style="display: flex; align-items: center"> |
||||
<el-icon><Loading /></el-icon> <span |
||||
style="font-weight: 700; font-size: 14px; line-height: 16px" |
||||
>设备测速进度及结果</span |
||||
> |
||||
</div> |
||||
<div> |
||||
<el-button |
||||
:disabled="loading" |
||||
@click="loadTr143Speed" |
||||
type="primary" |
||||
>开始测速</el-button |
||||
> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<div v-loading="loading"> |
||||
<el-empty |
||||
v-if="result?.resultState != '2'" |
||||
:description="result?.resultCode" |
||||
/> |
||||
<div class="flex justify-center"> |
||||
<el-progress |
||||
type="dashboard" |
||||
:width="200" |
||||
v-if="result?.resultState === '2'" |
||||
color="#00C3EE" |
||||
:percentage="parseFloat(result?.resultCode)" |
||||
> |
||||
<template #default="{ percentage }"> |
||||
<span class="percentage-value">{{ percentage }}</span> |
||||
<span class="percentage-label">Mbit/s</span> |
||||
</template> |
||||
</el-progress> |
||||
</div> |
||||
</div> |
||||
</el-card> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { Loading } from "@element-plus/icons-vue"; |
||||
import { getSpeedInfo, remoteCheckConnType, tr143Speed } from "@/api/remote"; |
||||
import { RemoteOperateResult } from "@/api/remote/types"; |
||||
|
||||
const route = useRoute(); |
||||
let devId: number = parseInt(<string>route.params.devId); |
||||
let pppoe: string = <string>route.params?.pppoe; |
||||
const options = ref<string[]>([]); |
||||
const downloadUrl = ref<string>(""); |
||||
const speedMaxRate = ref<string>(""); |
||||
const connType = ref<string>(""); |
||||
const connTypeLoading = ref<boolean>(false); |
||||
const result = ref<RemoteOperateResult>({ |
||||
resultState: "10", |
||||
resultCode: "暂无结果", |
||||
}); |
||||
const loading = ref<boolean>(false); |
||||
const loadSpeedInfo = () => { |
||||
getSpeedInfo(devId).then(({ data }) => { |
||||
options.value = data.downloadUrls; |
||||
speedMaxRate.value = data.speedMaxRate; |
||||
if (data.downloadUrls.length != 0) { |
||||
downloadUrl.value = data.downloadUrls[0]; |
||||
} |
||||
}); |
||||
}; |
||||
const loadConnType = () => { |
||||
connTypeLoading.value = true; |
||||
remoteCheckConnType(devId) |
||||
.then(({ data }) => { |
||||
connType.value = data; |
||||
}) |
||||
.finally(() => { |
||||
connTypeLoading.value = false; |
||||
}); |
||||
}; |
||||
const loadTr143Speed = () => { |
||||
loading.value = true; |
||||
tr143Speed(devId, downloadUrl.value) |
||||
.then(({ data }) => { |
||||
result.value = data; |
||||
}) |
||||
.finally(() => { |
||||
loading.value = false; |
||||
}); |
||||
}; |
||||
onMounted(() => { |
||||
loadSpeedInfo(); |
||||
loadConnType(); |
||||
}); |
||||
</script> |
||||
|
||||
<style scoped> |
||||
:deep(.my-label) { |
||||
width: 50px !important; |
||||
text-align: center !important; |
||||
background: var(--el-color-white) !important; |
||||
} |
||||
:deep(.el-card__body) { |
||||
padding: 10px 0 0 0; |
||||
} |
||||
.percentage-value { |
||||
display: block; |
||||
margin-top: 10px; |
||||
font-size: 28px; |
||||
} |
||||
.percentage-label { |
||||
display: block; |
||||
margin-top: 10px; |
||||
font-size: 20px; |
||||
} |
||||
</style> |
@ -0,0 +1,142 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-card shadow="never"> |
||||
<template #header> |
||||
<div style="display: flex; align-items: center"> |
||||
<el-icon><Loading /></el-icon> <span |
||||
style="font-weight: 700; font-size: 14px; line-height: 16px" |
||||
>PING测试</span |
||||
> |
||||
</div> |
||||
</template> |
||||
<el-form |
||||
ref="pingFormRef" |
||||
:model="formData" |
||||
v-loading="loading" |
||||
:rules="rules" |
||||
> |
||||
<el-descriptions :column="2" border> |
||||
<el-descriptions-item |
||||
label="主机" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<el-form-item prop="host" style="margin-bottom: 0"> |
||||
<el-input v-model="formData.host" placeholder="请输入主机" /> |
||||
</el-form-item> |
||||
</el-descriptions-item> |
||||
<el-descriptions-item |
||||
label="重复次数" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<el-form-item prop="pingNumber" style="margin-bottom: 0"> |
||||
<el-input |
||||
v-model="formData.pingNumber" |
||||
placeholder="请输入重复次数" |
||||
/> |
||||
</el-form-item> |
||||
</el-descriptions-item> |
||||
<el-descriptions-item |
||||
label="包大小" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<el-form-item prop="packSize" style="margin-bottom: 0"> |
||||
<el-input |
||||
v-model="formData.packSize" |
||||
placeholder="请输入包大小" |
||||
/> |
||||
</el-form-item> |
||||
</el-descriptions-item> |
||||
<el-descriptions-item |
||||
label="接口" |
||||
label-align="left" |
||||
align="center" |
||||
label-class-name="my-label" |
||||
class-name="my-content" |
||||
width="150px" |
||||
> |
||||
<el-form-item prop="pingInterface" style="margin-bottom: 0"> |
||||
<dictionary |
||||
type-code="ping_interface" |
||||
placeholder="请选择接口类型" |
||||
v-model="formData.pingInterface" |
||||
/> |
||||
</el-form-item> |
||||
</el-descriptions-item> |
||||
</el-descriptions> |
||||
</el-form> |
||||
<template #footer> |
||||
<div class="flex justify-end"> |
||||
<el-button type="primary" @click="submitForm(pingFormRef)" |
||||
>确认</el-button |
||||
> |
||||
<el-button @click="resetForm(pingFormRef)">重置</el-button> |
||||
</div> |
||||
</template> |
||||
</el-card> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { PingForm } from "@/api/remote/types"; |
||||
import { FormInstance, FormRules } from "element-plus"; |
||||
import { remoteIpPing } from "@/api/remote"; |
||||
const route = useRoute(); |
||||
let devId: number = parseInt(<string>route.params.devId); |
||||
const pingFormRef = ref<FormInstance>(); |
||||
const loading = ref<boolean>(false); |
||||
const formData = ref<PingForm>({ deviceId: devId }); |
||||
const rules = reactive<FormRules<PingForm>>({ |
||||
host: [{ required: true, message: "请输入主机", trigger: "blur" }], |
||||
pingNumber: [{ required: true, message: "请输入重复次数", trigger: "blur" }], |
||||
packSize: [{ required: true, message: "请输入包大小", trigger: "blur" }], |
||||
pingInterface: [{ required: true, message: "请选择接口", trigger: "blur" }], |
||||
}); |
||||
const resetForm = (formEl: FormInstance | undefined) => { |
||||
if (!formEl) return; |
||||
formEl.resetFields(); |
||||
}; |
||||
const submitForm = async (formEl: FormInstance | undefined) => { |
||||
if (!formEl) return; |
||||
await formEl.validate((valid, fields) => { |
||||
if (valid) { |
||||
loading.value = true; |
||||
remoteIpPing(formData.value) |
||||
.then(() => { |
||||
ElMessage({ |
||||
message: "操作成功", |
||||
duration: 1000, |
||||
type: "success", |
||||
}); |
||||
}) |
||||
.finally(() => { |
||||
loading.value = false; |
||||
}); |
||||
} else { |
||||
console.log("error submit!", fields); |
||||
} |
||||
}); |
||||
}; |
||||
</script> |
||||
|
||||
<style scoped> |
||||
:deep(.my-label) { |
||||
width: 40px !important; |
||||
text-align: center !important; |
||||
background: var(--el-color-white) !important; |
||||
} |
||||
:deep(.el-card__body) { |
||||
padding: 10px 0 10px 0; |
||||
} |
||||
</style> |
@ -0,0 +1,109 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-card shadow="never"> |
||||
<template #header> |
||||
<div style="display: flex; justify-content: space-between"> |
||||
<div style="display: flex; align-items: center"> |
||||
<el-icon size="15"><Grid /></el-icon> <span |
||||
style="font-weight: 700; font-size: 14px; line-height: 16px" |
||||
>设备软件版本升级--软件版本列表</span |
||||
> |
||||
</div> |
||||
</div> |
||||
</template> |
||||
<div class="any-table"> |
||||
<el-table |
||||
:data="tableData" |
||||
v-loading="loading" |
||||
max-height="450" |
||||
highlight-current-row |
||||
@row-click="handleCurrentChange" |
||||
> |
||||
<el-table-column width="55"> |
||||
<template #default="scope"> |
||||
<el-radio :label="scope.row.fileId" v-model="fileId"> |
||||
{{ "" }} |
||||
</el-radio> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column |
||||
width="200" |
||||
label="版本名称" |
||||
align="center" |
||||
prop="softVer" |
||||
/> |
||||
<el-table-column |
||||
label="版本描述" |
||||
align="center" |
||||
prop="devTypeVerDesc" |
||||
/> |
||||
</el-table> |
||||
</div> |
||||
<template #footer> |
||||
<div class="flex justify-end"> |
||||
<el-button type="primary" :disabled="loading" @click="submit" |
||||
>确定</el-button |
||||
> |
||||
</div> |
||||
</template> |
||||
</el-card> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { Grid } from "@element-plus/icons-vue"; |
||||
import { SoftVersionUpgradeVO } from "@/api/device-type-ver/types"; |
||||
import { ElTable } from "element-plus"; |
||||
import { upgradeSoftVerTable } from "@/api/device-type-ver"; |
||||
import { remoteSoftVerUpgrade } from "@/api/remote"; |
||||
|
||||
const route = useRoute(); |
||||
let devId: number = parseInt(<string>route.params.devId); |
||||
const fileId = ref<number>(); |
||||
const tableData = ref<SoftVersionUpgradeVO[]>([]); |
||||
const loading = ref<boolean>(false); |
||||
const handleCurrentChange = (val: SoftVersionUpgradeVO) => { |
||||
fileId.value = val.fileId; |
||||
}; |
||||
const loadData = () => { |
||||
loading.value = true; |
||||
upgradeSoftVerTable(devId) |
||||
.then(({ data }) => { |
||||
tableData.value = data; |
||||
}) |
||||
.finally(() => { |
||||
loading.value = false; |
||||
}); |
||||
}; |
||||
const submit = () => { |
||||
if (fileId.value === undefined) { |
||||
ElMessage({ |
||||
message: "请选择一个软件版本", |
||||
duration: 1000, |
||||
type: "success", |
||||
}); |
||||
return; |
||||
} |
||||
loading.value = true; |
||||
remoteSoftVerUpgrade(devId, fileId.value) |
||||
.then(() => { |
||||
ElMessage({ |
||||
message: "操作成功", |
||||
type: "success", |
||||
duration: 1000, |
||||
}); |
||||
}) |
||||
.finally(() => { |
||||
loading.value = false; |
||||
}); |
||||
}; |
||||
onMounted(() => { |
||||
loadData(); |
||||
}); |
||||
</script> |
||||
|
||||
<style scoped> |
||||
:deep(.el-card__body) { |
||||
padding: 10px 0 0 0; |
||||
} |
||||
</style> |
@ -0,0 +1,76 @@ |
||||
<template> |
||||
<div class="app-container"> |
||||
<el-card> |
||||
<template #header> |
||||
<div class="head-parent-right"> |
||||
<el-button :icon="Refresh" type="primary" @click="getData">刷新</el-button> |
||||
</div> |
||||
</template> |
||||
<div class="any-table"> |
||||
<el-table :data="tableData" v-loading="loading" max-height="500"> |
||||
<el-table-column label="任务编号" prop="operTaskId" align="center"> |
||||
<template #default="scope"> |
||||
<el-button type="primary" link |
||||
>{{ scope.row.operTaskId }} |
||||
</el-button> |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column label="AD编号" prop="devAdNo" align="center" /> |
||||
<el-table-column |
||||
label="任务描述" |
||||
prop="operTaskDesc" |
||||
align="center" |
||||
/> |
||||
<el-table-column label="操作者" prop="userName" align="center" /> |
||||
<el-table-column |
||||
label="创建时间" |
||||
prop="operTaskCreateTime" |
||||
align="center" |
||||
/> |
||||
<el-table-column label="结果" prop="resultState" align="center" /> |
||||
</el-table> |
||||
</div> |
||||
<pagination |
||||
v-if="total > 0" |
||||
v-model:total="total" |
||||
v-model:page="queryForm.pageNum" |
||||
v-model:limit="queryForm.pageSize" |
||||
@pagination="getData" |
||||
/> |
||||
</el-card> |
||||
</div> |
||||
</template> |
||||
|
||||
<script setup lang="ts"> |
||||
import { OperateTask2TableVO } from "@/api/operate-task2/types"; |
||||
import { operateTask2Page, taskTablePage } from "@/api/operate-task2"; |
||||
import { Refresh } from "@element-plus/icons-vue"; |
||||
defineOptions({ |
||||
name: "Task", |
||||
inheritAttrs: false, |
||||
}); |
||||
const tableData = ref<OperateTask2TableVO[]>([]); |
||||
const total = ref<number>(0); |
||||
const queryForm = ref<PageQuery>({ pageNum: 1, pageSize: 10 }); |
||||
const loading = ref<boolean>(false); |
||||
const getData = () => { |
||||
loading.value = true; |
||||
taskTablePage(queryForm.value) |
||||
.then(({ data }) => { |
||||
tableData.value = data.list; |
||||
total.value = data.total; |
||||
}) |
||||
.finally(() => { |
||||
loading.value = false; |
||||
}); |
||||
}; |
||||
onMounted(() => { |
||||
getData(); |
||||
}); |
||||
</script> |
||||
|
||||
<style scoped> |
||||
:deep(.el-card__body) { |
||||
padding: 10px 0 0 0; |
||||
} |
||||
</style> |
Loading…
Reference in new issue