|
@@ -22,7 +22,7 @@
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
<el-form-item>
|
|
|
- <el-select v-model="searchForm.status" placeholder="心跳" clearable data-id="search-enabled">
|
|
|
|
|
|
|
+ <el-select v-model="searchForm.status" :placeholder="t('心跳')" clearable data-id="search-enabled">
|
|
|
<el-option label="全部" value="" />
|
|
<el-option label="全部" value="" />
|
|
|
<el-option label="active" :value="1" />
|
|
<el-option label="active" :value="1" />
|
|
|
<el-option label="hold" :value="2" />
|
|
<el-option label="hold" :value="2" />
|
|
@@ -173,16 +173,16 @@
|
|
|
<el-form-item label="LSS ID:">
|
|
<el-form-item label="LSS ID:">
|
|
|
<span class="form-value">{{ currentLss?.lssId }}</span>
|
|
<span class="form-value">{{ currentLss?.lssId }}</span>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="名称:" prop="lssName">
|
|
|
|
|
|
|
+ <el-form-item :label="t('名称') + ':'" prop="lssName">
|
|
|
<el-input v-model="lssEditForm.lssName" placeholder="请输入名称" style="width: 180px" />
|
|
<el-input v-model="lssEditForm.lssName" placeholder="请输入名称" style="width: 180px" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="地址:" prop="address">
|
|
|
|
|
|
|
+ <el-form-item :label="t('地址') + ':'" prop="address">
|
|
|
<el-input v-model="lssEditForm.address" placeholder="请输入地址" />
|
|
<el-input v-model="lssEditForm.address" placeholder="请输入地址" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="IP:">
|
|
|
|
|
|
|
+ <el-form-item :label="t('IP') + ':'">
|
|
|
<span class="form-value">{{ lssEditForm?.ip }}</span>
|
|
<span class="form-value">{{ lssEditForm?.ip }}</span>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="心跳:">
|
|
|
|
|
|
|
+ <el-form-item :label="t('心跳') + ':'">
|
|
|
<span class="heartbeat-status" :class="getHeartbeatClass(currentLss?.heartbeat)">
|
|
<span class="heartbeat-status" :class="getHeartbeatClass(currentLss?.heartbeat)">
|
|
|
{{ formatHeartbeat(currentLss) }}
|
|
{{ formatHeartbeat(currentLss) }}
|
|
|
<span class="heartbeat-dot" :class="getHeartbeatClass(currentLss?.heartbeat)"></span>
|
|
<span class="heartbeat-dot" :class="getHeartbeatClass(currentLss?.heartbeat)"></span>
|
|
@@ -250,7 +250,7 @@
|
|
|
<!-- <el-table-column prop="ip" label="本地IP" min-width="110" /> -->
|
|
<!-- <el-table-column prop="ip" label="本地IP" min-width="110" /> -->
|
|
|
<el-table-column prop="cameraId" label="设备ID" min-width="100" show-overflow-tooltip />
|
|
<el-table-column prop="cameraId" label="设备ID" min-width="100" show-overflow-tooltip />
|
|
|
<el-table-column prop="name" label="名称" min-width="100" show-overflow-tooltip />
|
|
<el-table-column prop="name" label="名称" min-width="100" show-overflow-tooltip />
|
|
|
- <el-table-column label="状态(心跳)" min-width="140">
|
|
|
|
|
|
|
+ <el-table-column :label="t('状态(心跳)')" min-width="140">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span :class="['status-text', row.status === 'ONLINE' ? 'status-active' : 'status-dead']">
|
|
<span :class="['status-text', row.status === 'ONLINE' ? 'status-active' : 'status-dead']">
|
|
|
{{ formatCameraStatus(row) }}
|
|
{{ formatCameraStatus(row) }}
|
|
@@ -344,7 +344,7 @@
|
|
|
<!-- <el-table-column prop="ip" label="本地IP" min-width="110" /> -->
|
|
<!-- <el-table-column prop="ip" label="本地IP" min-width="110" /> -->
|
|
|
<el-table-column prop="cameraId" label="设备ID" min-width="100" show-overflow-tooltip />
|
|
<el-table-column prop="cameraId" label="设备ID" min-width="100" show-overflow-tooltip />
|
|
|
<el-table-column prop="name" label="名称" min-width="100" show-overflow-tooltip />
|
|
<el-table-column prop="name" label="名称" min-width="100" show-overflow-tooltip />
|
|
|
- <el-table-column label="状态(心跳)" min-width="140">
|
|
|
|
|
|
|
+ <el-table-column :label="t('状态(心跳)')" min-width="140">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<span :class="['status-text', row.status === 'active' ? 'status-active' : 'status-dead']">
|
|
<span :class="['status-text', row.status === 'active' ? 'status-active' : 'status-dead']">
|
|
|
{{ formatCameraStatus(row) }}
|
|
{{ formatCameraStatus(row) }}
|
|
@@ -655,6 +655,17 @@ function formatBrand(brand: string | undefined): string {
|
|
|
return brand ? brandMap[brand] || brand.toUpperCase() : '-'
|
|
return brand ? brandMap[brand] || brand.toUpperCase() : '-'
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// 验证 JSON 格式
|
|
|
|
|
+function isValidJson(str: string): boolean {
|
|
|
|
|
+ if (!str || !str.trim()) return true // 空值视为有效
|
|
|
|
|
+ try {
|
|
|
|
|
+ JSON.parse(str)
|
|
|
|
|
+ return true
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ return false
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// 格式化心跳状态
|
|
// 格式化心跳状态
|
|
|
function formatHeartbeat(lss: LssNodeDTO | null | undefined): string {
|
|
function formatHeartbeat(lss: LssNodeDTO | null | undefined): string {
|
|
|
if (!lss) return '-'
|
|
if (!lss) return '-'
|
|
@@ -1101,6 +1112,16 @@ async function handleSubmitCamera() {
|
|
|
await cameraFormRef.value.validate(async (valid) => {
|
|
await cameraFormRef.value.validate(async (valid) => {
|
|
|
if (!valid) return
|
|
if (!valid) return
|
|
|
|
|
|
|
|
|
|
+ // 验证 JSON 格式
|
|
|
|
|
+ if (!isValidJson(cameraForm.paramConfig)) {
|
|
|
|
|
+ ElMessage.error('参数配置格式错误,请输入有效的 JSON')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!isValidJson(cameraForm.runtimeParams)) {
|
|
|
|
|
+ ElMessage.error('设备运行参数格式错误,请输入有效的 JSON')
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
cameraSubmitting.value = true
|
|
cameraSubmitting.value = true
|
|
|
try {
|
|
try {
|
|
|
if (isEditCamera.value) {
|
|
if (isEditCamera.value) {
|
|
@@ -1145,7 +1166,8 @@ async function handleSubmitCamera() {
|
|
|
vendorName: cameraForm.vendorName,
|
|
vendorName: cameraForm.vendorName,
|
|
|
model: cameraForm.model,
|
|
model: cameraForm.model,
|
|
|
paramConfig: cameraForm.paramConfig,
|
|
paramConfig: cameraForm.paramConfig,
|
|
|
- runtimeParams: cameraForm.runtimeParams
|
|
|
|
|
|
|
+ runtimeParams: cameraForm.runtimeParams,
|
|
|
|
|
+ lssId: currentLss.value?.lssId
|
|
|
}
|
|
}
|
|
|
const res = await adminAddCamera(data)
|
|
const res = await adminAddCamera(data)
|
|
|
if (res.success) {
|
|
if (res.success) {
|