| 
					
				 | 
			
			
				@@ -1,768 +1,1080 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 <template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   <div class="app-container"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <el-tabs v-model="activeTab"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <!-- 摄像机管理标签页 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <el-tab-pane label="摄像机管理" name="cameras"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form :model="cameraQuery" ref="cameraQueryRef" :inline="true" label-width="98px"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="摄像机编号" prop="cameraCode"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-input v-model="cameraQuery.cameraCode" placeholder="请输入摄像机编号" clearable /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="摄像机名称" prop="cameraName"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-input v-model="cameraQuery.cameraName" placeholder="请输入摄像机名称" clearable /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="监控区域" prop="monitorArea"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-input v-model="cameraQuery.monitorArea" placeholder="请输入监控区域" clearable /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="楼栋" prop="building"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-select v-model="cameraQuery.building" placeholder="请选择楼栋" clearable style="width: 180px;"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="A栋" value="A" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="B栋" value="B" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="C栋" value="C" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="D栋" value="D" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="设备状态" prop="deviceStatus"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-select v-model="cameraQuery.deviceStatus" placeholder="请选择状态" clearable style="width: 180px;"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="在线" :value="1" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="离线" :value="0" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="故障" :value="2" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button type="primary" icon="Search" @click="getCameraList">搜索</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button icon="Refresh" @click="resetCameraQuery">重置</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-table v-loading="cameraLoading" :data="cameraList" stripe border> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="摄像机编号" prop="cameraCode" width="150" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="摄像机名称" prop="cameraName"  /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="监控区域" prop="monitorArea" width="120" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="位置信息" width="150"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <div>{{ scope.row.building }}栋-{{ scope.row.floor }}层</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <div class="text-gray-500">{{ scope.row.location_detail }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="IP地址" prop="ipAddress" width="120" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="端口" prop="port" width="80" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="品牌型号" width="120"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <div>{{ scope.row.brand }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <div class="text-gray-500">{{ scope.row.model }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="分辨率" prop="resolution" width="100" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="设备状态" prop="deviceStatus" width="100"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-tag :type="scope.row.deviceStatus === 1 ? 'success' : scope.row.deviceStatus === 2 ? 'warning' : 'danger'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {{ getStatusText(scope.row.deviceStatus) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="云台控制" prop="ptzSupport" width="100"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-tag :type="scope.row.ptzSupport === 1 ? 'success' : 'info'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {{ scope.row.ptzSupport === 1 ? '支持' : '不支持' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="录像状态" prop="recordingStatus" width="100"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-tag :type="scope.row.recordingStatus === 1 ? 'success' : 'danger'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {{ scope.row.recordingStatus === 1 ? '录像中' : '未录像' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="操作" width="400" fixed="right"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button link type="primary" icon="VideoCamera" @click="handleVideoPreview(scope.row)">实时预览</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button link type="success" icon="Setting" @click="handlePtzControl(scope.row)" v-if="scope.row.ptzSupport === 1">云台控制</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button link type="warning" icon="View" @click="handleCameraDetail(scope.row)">详情</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button link type="info" icon="VideoPlay" @click="handlePlayback(scope.row)">录像回放</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-table> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <pagination 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            v-show="cameraTotal > 0" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            :total="cameraTotal" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            v-model:page="cameraQuery.pageNum" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            v-model:limit="cameraQuery.pageSize" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            @pagination="getCameraList" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      </el-tab-pane> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <!-- 告警联动标签页 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <el-tab-pane label="告警联动" name="linkage"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form :model="linkageQuery" ref="linkageQueryRef" :inline="true" label-width="98px"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="联动规则名称" prop="ruleName"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-input v-model="linkageQuery.ruleName" placeholder="请输入联动规则名称" clearable /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="触发设备" prop="triggerDevice"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-input v-model="linkageQuery.triggerDevice" placeholder="请输入触发设备" clearable /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="联动摄像机" prop="linkageCamera"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-input v-model="linkageQuery.linkageCamera" placeholder="请输入联动摄像机" clearable /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item label="规则状态" prop="ruleStatus"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-select v-model="linkageQuery.ruleStatus" placeholder="请选择状态" clearable style="width: 180px;"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="启用" :value="1" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-option label="禁用" :value="0" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button type="primary" icon="Search" @click="getLinkageList">搜索</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button icon="Refresh" @click="resetLinkageQuery">重置</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-row :gutter="10" class="mb8"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-col :span="1.5"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                type="primary" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                plain 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                icon="Plus" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                @click="handleAddLinkage" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            >新增联动规则</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-col> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-row> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-table v-loading="linkageLoading" :data="linkageList" stripe border> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="规则名称" prop="rule_name"  /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="触发设备" prop="trigger_device_name"  /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="触发条件" prop="trigger_condition"  /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="联动摄像机" prop="linkage_camera_name"  /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="联动动作" prop="linkage_action" > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-tag>{{ getLinkageActionText(scope.row.linkage_action) }}</el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="延迟时间" prop="delayTime" width="100"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <span>{{ scope.row.delay_time }}秒</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="规则状态" prop="ruleStatus" width="100"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-tag :type="scope.row.ruleStatus === 1 ? 'success' : 'danger'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {{ scope.row.ruleStatus === 1 ? '启用' : '禁用' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <!-- 搜索和操作区域 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <div class="search-container"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <el-card shadow="never" class="search-card"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="search-form"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <el-form :inline="true" :model="searchForm" class="search-form-inline"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <el-form-item label="摄像机名称"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <el-input 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  v-model="searchForm.name" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  placeholder="请输入摄像机名称" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  clearable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  @keyup.enter="handleSearch" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  style="width: 200px" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<!--            <el-form-item label="监控点类型"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <el-select 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  v-model="searchForm.cameraType" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  placeholder="请选择类型" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  clearable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  style="width: 150px" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <el-option label="全部" value="" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <el-option label="枪机" :value="0" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <el-option label="半球" :value="1" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <el-option label="快球" :value="2" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <el-option label="带云台枪机" :value="3" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </el-form-item>--> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <el-button type="primary" icon="Search" @click="handleSearch"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <el-button icon="Refresh" @click="resetSearch"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                重置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </el-form> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<!--        <div class="search-actions"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <el-button type="primary" icon="Refresh" @click="getCameraList" class="refresh-btn"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <span>刷新列表</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="camera-stats"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <span class="stat-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <i class="el-icon-video-camera"></i> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              总计 <span class="stat-number">{{ cameraTotal }}</span> 个摄像机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </div>--> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </el-card> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <!-- 摄像机列表 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <el-card shadow="never" class="table-card"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <el-table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          v-loading="cameraLoading" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :data="cameraList" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          stripe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :header-cell-style="{background:'#f5f7fa',color:'#606266'}" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          class="camera-table" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <el-table-column label="摄像机信息" min-width="300"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="camera-info"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <div class="camera-name">{{ scope.row.name }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <div class="camera-code">编号:{{ scope.row.indexCode }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <el-table-column label="设备详情" min-width="200"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="device-details"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <el-tag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  :type="getCameraTypeTagType(scope.row.cameraType)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  size="small" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  effect="plain" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {{ getCameraTypeName(scope.row.cameraType) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="创建时间" prop="create_time" width="150"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <span>{{ parseTime(scope.row.create_time) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-table-column label="操作" width="250" fixed="right"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button link type="primary" icon="Edit" @click="handleEditLinkage(scope.row)">修改</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button link type="danger" icon="Delete" @click="handleDeleteLinkage(scope.row)">删除</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button link type="warning" icon="Switch" @click="handleToggleLinkage(scope.row)"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {{ scope.row.ruleStatus === 1 ? '禁用' : '启用' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-item">通道数 {{ scope.row.chanNum }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <el-table-column label="技术参数" min-width="200"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="tech-params"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="param-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <i class="el-icon-connection"></i> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {{ getTransTypeName(scope.row.transType) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="param-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <i class="el-icon-folder"></i> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                {{ getRecordLocationName(scope.row.recordLocation) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <el-table-column label="区域位置" min-width="250"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="location-info"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <div class="region-name">{{ scope.row.regionName }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <div class="region-path">{{ formatRegionPath(scope.row.regionPathName) }}</div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <el-table-column label="创建时间" width="180"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <span class="time-text">{{ parseTime(scope.row.createTime) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <el-table-column label="操作" width="200" fixed="right"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <template #default="scope"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="action-buttons"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <el-button 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  type="primary" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  size="small" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  icon="VideoPlay" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  @click="handleVideoPreview(scope.row)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  class="action-btn preview-btn" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                实时预览 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               </el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-table> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <pagination 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            v-show="linkageTotal > 0" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            :total="linkageTotal" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            v-model:page="linkageQuery.pageNum" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            v-model:limit="linkageQuery.pageSize" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            @pagination="getLinkageList" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      </el-tab-pane> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    </el-tabs> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <el-button 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  size="small" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  icon="InfoFilled" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  @click="handleCameraDetail(scope.row)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  class="action-btn detail-btn" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        </el-table-column> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      </el-table> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <pagination 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          v-show="cameraTotal > 0" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          :total="cameraTotal" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          v-model:page="cameraQuery.pageNo" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          v-model:limit="cameraQuery.pageSize" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          @pagination="getCameraList" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          class="pagination-wrapper" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    </el-card> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <!-- 实时视频预览抽屉 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <el-drawer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         v-model="videoVisible" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        title="实时视频预览" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        :title="currentCamera.name" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         direction="rtl" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        size="60%" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        size="70%" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        class="video-drawer" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <div class="video-container"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="video-player"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <video ref="videoPlayer" controls autoplay muted style="width: 100%; height: 400px; background: #000;"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <source :src="currentVideoUrl" type="application/x-mpegURL"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            您的浏览器不支持视频播放 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </video> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="video-info"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-descriptions :column="2" border> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-descriptions-item label="摄像机名称">{{ currentCamera.cameraName }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-descriptions-item label="监控区域">{{ currentCamera.monitorArea }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-descriptions-item label="位置">{{ currentCamera.building }}栋-{{ currentCamera.floor }}层</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-descriptions-item label="分辨率">{{ currentCamera.resolution }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-descriptions-item label="设备状态"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-tag :type="currentCamera.deviceStatus === 1 ? 'success' : 'danger'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {{ getStatusText(currentCamera.deviceStatus) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-descriptions-item label="录像状态"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-tag :type="currentCamera.recordingStatus === 1 ? 'success' : 'danger'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                {{ currentCamera.recordingStatus === 1 ? '录像中' : '未录像' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-descriptions> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div class="video-wrapper"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <!-- 视频播放区域 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="video-player-container"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="video-header"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <h3 class="video-title"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <i class="el-icon-video-camera"></i> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              实时画面 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </h3> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <el-button type="success" size="small" icon="Camera" @click="takeSnapshot"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              抓拍 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="video-player"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <iframe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                v-if="currentVideoUrl" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                :src="currentVideoUrl" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                class="video-iframe" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                allowfullscreen 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ></iframe> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div v-else class="video-placeholder"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <i class="el-icon-video-camera"></i> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <p>正在加载视频流...</p> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="video-controls"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-button type="primary" @click="startRecording" v-if="currentCamera.recordingStatus === 0">开始录像</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-button type="danger" @click="stopRecording" v-if="currentCamera.recordingStatus === 1">停止录像</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-button type="success" @click="takeSnapshot">抓拍</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-button type="warning" @click="handlePtzControl(currentCamera)" v-if="currentCamera.ptzSupport === 1">云台控制</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <!-- 摄像机信息展示 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="camera-details-panel"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <h4 class="panel-title">摄像机信息</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="info-grid"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="info-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-label">摄像机名称</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-value">{{ currentCamera.name }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="info-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-label">设备编号</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-value">{{ currentCamera.indexCode }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="info-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-label">监控点类型</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-value"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <el-tag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    :type="getCameraTypeTagType(currentCamera.cameraType)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    size="small" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  {{ getCameraTypeName(currentCamera.cameraType) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="info-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-label">通道数</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-value">{{ currentCamera.chanNum }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="info-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-label">传输协议</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-value">{{ getTransTypeName(currentCamera.transType) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="info-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-label">录像位置</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="info-value">{{ getRecordLocationName(currentCamera.recordLocation) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </el-drawer> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <!-- 云台控制抽屉 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    <!-- 摄像机详情抽屉 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     <el-drawer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        v-model="ptzVisible" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        title="云台控制" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        v-model="detailVisible" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        title="摄像机详细信息" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         direction="rtl" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        size="40%" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        size="50%" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        class="detail-drawer" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <div class="ptz-container"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="ptz-direction"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <h4>方向控制</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <div class="direction-grid"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <div class="direction-row"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="ptzControl('UP')" icon="ArrowUp" class="direction-btn">上</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      <div class="detail-wrapper"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="detail-section"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <h4 class="section-title">基本信息</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="detail-grid"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">摄像机名称</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.name }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <div class="direction-row"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="ptzControl('LEFT')" icon="ArrowLeft" class="direction-btn">左</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="ptzControl('STOP')" icon="Close" class="direction-btn stop-btn">停止</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="ptzControl('RIGHT')" icon="ArrowRight" class="direction-btn">右</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">摄像机编号</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.indexCode }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <div class="direction-row"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="ptzControl('DOWN')" icon="ArrowDown" class="direction-btn">下</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">外部编号</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.externalIndexCode || '无' }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">资源类型</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.resourceType }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="ptz-zoom"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <h4>变焦控制</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <div class="zoom-controls"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button @click="ptzControl('ZOOM_IN')" icon="ZoomIn">放大</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button @click="ptzControl('ZOOM_OUT')" icon="ZoomOut">缩小</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="detail-section"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <h4 class="section-title">技术参数</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="detail-grid"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">监控点类型</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                <el-tag 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    :type="getCameraTypeTagType(currentCamera.cameraType)" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    size="small" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  {{ getCameraTypeName(currentCamera.cameraType) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              </span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">通道类型</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.channelType }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">传输类型</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ getTransTypeName(currentCamera.transType) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">协议类型</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.treatyType }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">解码标签</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.decodeTag }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">录像位置</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ getRecordLocationName(currentCamera.recordLocation) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="ptz-focus"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <h4>聚焦控制</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <div class="focus-controls"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button @click="ptzControl('FOCUS_NEAR')" icon="Minus">近焦</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button @click="ptzControl('FOCUS_FAR')" icon="Plus">远焦</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-button @click="ptzControl('AUTO_FOCUS')" icon="Aim">自动聚焦</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="detail-section"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <h4 class="section-title">位置信息</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="detail-grid"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<!--            <div class="detail-item full-width"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">安装位置</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.installLocation || '未设置' }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">经度</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.longitude || '未设置' }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">纬度</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.latitude || '未设置' }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">海拔</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.elevation || '未设置' }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div>--> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">所属区域</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.regionName }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">区域路径</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ formatRegionPath(currentCamera.regionPathName) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="ptz-preset"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <h4>预置位控制</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-form :model="presetForm" :inline="true"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-form-item label="预置位"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-select v-model="presetForm.presetId" placeholder="选择预置位"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                <el-option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    v-for="preset in presetList" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    :key="preset.id" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    :label="preset.name" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    :value="preset.id" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="gotoPreset">转到</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="setPreset">设置</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              <el-button @click="deletePreset">删除</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-form> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="detail-section"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <h4 class="section-title">功能能力</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="detail-grid"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item full-width"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">支持功能</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ formatCapabilities(currentCamera.capability) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <div class="ptz-speed"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <h4>控制速度</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-slider v-model="ptzSpeed" :min="1" :max="10" show-input /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        <div class="detail-section"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <h4 class="section-title">其他信息</h4> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          <div class="detail-grid"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">父级编号</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.parentIndexCode }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">级联编码</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.cascadeCode || '无' }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">区域编号</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.regionIndexCode }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">排序号</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ currentCamera.disOrder }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">创建时间</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ parseTime(currentCamera.createTime) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            <div class="detail-item"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-label">更新时间</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              <span class="detail-value">{{ parseTime(currentCamera.updateTime) }}</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     </el-drawer> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <!-- 摄像机详情抽屉 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <el-drawer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        v-model="detailVisible" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        title="摄像机详情" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        direction="rtl" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        size="50%" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    > 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <el-descriptions :column="2" border> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="摄像机编号">{{ currentCamera.cameraCode }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="摄像机名称">{{ currentCamera.cameraName }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="监控区域">{{ currentCamera.monitorArea }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="位置">{{ currentCamera.building }}栋-{{ currentCamera.floor }}层-{{ currentCamera.locationDetail }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="IP地址">{{ currentCamera.ipAddress }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="端口">{{ currentCamera.port }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="品牌">{{ currentCamera.brand }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="型号">{{ currentCamera.model }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="分辨率">{{ currentCamera.resolution }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="帧率">{{ currentCamera.frameRate }} fps</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="云台支持"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-tag :type="currentCamera.ptzSupport === 1 ? 'success' : 'info'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            {{ currentCamera.ptzSupport === 1 ? '支持' : '不支持' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="红外夜视"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-tag :type="currentCamera.infraredSupport === 1 ? 'success' : 'info'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            {{ currentCamera.infraredSupport === 1 ? '支持' : '不支持' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="设备状态"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-tag :type="currentCamera.deviceStatus === 1 ? 'success' : currentCamera.deviceStatus === 2 ? 'warning' : 'danger'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            {{ getStatusText(currentCamera.deviceStatus) }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="录像状态"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-tag :type="currentCamera.recordingStatus === 1 ? 'success' : 'danger'"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            {{ currentCamera.recordingStatus === 1 ? '录像中' : '未录像' }} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-tag> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="存储路径">{{ currentCamera.storagePath }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-descriptions-item label="最后在线时间">{{ parseTime(currentCamera.lastOnlineTime) }}</el-descriptions-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      </el-descriptions> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    </el-drawer> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <!-- 联动规则配置对话框 --> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    <el-dialog v-model="linkageDialogVisible" :title="linkageDialogTitle" width="600px"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <el-form :model="linkageForm" :rules="linkageRules" ref="linkageFormRef" label-width="120px"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form-item label="规则名称" prop="ruleName"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-input v-model="linkageForm.ruleName" placeholder="请输入联动规则名称" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form-item label="触发设备" prop="triggerDeviceCode"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-select v-model="linkageForm.triggerDeviceCode" placeholder="请选择触发设备" filterable> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                v-for="device in triggerDeviceList" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                :key="device.code" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                :label="device.name" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                :value="device.code" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form-item label="触发条件" prop="triggerCondition"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-select v-model="linkageForm.triggerCondition" placeholder="请选择触发条件"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="设备报警" value="deviceAlarm" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="入侵检测" value="intrusionDetection" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="门禁异常" value="accessAbnormal" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="火灾报警" value="fireAlarm" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form-item label="联动摄像机" prop="linkageCameraCode"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-select v-model="linkageForm.linkageCameraCode" placeholder="请选择联动摄像机" filterable> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                v-for="camera in cameraList" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                :key="camera.cameraCode" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                :label="camera.cameraName" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                :value="camera.cameraCode" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form-item label="联动动作" prop="linkageAction"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-select v-model="linkageForm.linkageAction" placeholder="请选择联动动作"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="开始录像" value="start_recording" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="转到预置位" value="goto_preset" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="自动跟踪" value="auto_tracking" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-option label="抓拍图片" value="capture_image" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-select> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form-item label="延迟时间" prop="delayTime"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-input-number v-model="linkageForm.delayTime" :min="0" :max="300" controls-position="right" /> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <span style="margin-left: 8px;">秒</span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <el-form-item label="规则状态" prop="ruleStatus"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-radio-group v-model="linkageForm.ruleStatus"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-radio :label="1">启用</el-radio> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            <el-radio :label="0">禁用</el-radio> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          </el-radio-group> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </el-form-item> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      </el-form> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      <template #footer> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        <span class="dialog-footer"> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-button @click="linkageDialogVisible = false">取消</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          <el-button type="primary" @click="submitLinkageForm">确定</el-button> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        </span> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    </el-dialog> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   </div> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </template> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 <script setup> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import { ref, reactive, watch, onMounted } from 'vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import { listCameras, getCameraStream, ptzControl as ptzControlApi, recordingControl, takeCameraSnapshot } from '@/api/subsystem/video' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import { listLinkageRules, addLinkageRule, updateLinkageRule, deleteLinkageRule, toggleLinkageRule } from '@/api/subsystem/video' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { ref, reactive, onMounted } from 'vue' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import axios from 'axios' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const { proxy } = getCurrentInstance() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const activeTab = ref('cameras') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 监听activeTab的变化 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-watch(activeTab, (newVal) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (newVal === 'linkage') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    getLinkageList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 搜索表单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const searchForm = reactive({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  name: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cameraType: '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 摄像机查询相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const cameraQuery = reactive({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  pageNum: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  pageSize: 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cameraCode: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cameraName: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  monitorArea: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  building: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  deviceStatus: null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  pageNo: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  pageSize: 10 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const cameraList = ref([]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const cameraTotal = ref(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const cameraLoading = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 联动规则查询相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageQuery = reactive({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  pageNum: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  pageSize: 10, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ruleName: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  triggerDevice: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageCamera: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ruleStatus: null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageList = ref([]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageTotal = ref(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageLoading = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 视频预览相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const videoVisible = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const currentCamera = ref({}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const currentVideoUrl = ref('') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 云台控制相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const ptzVisible = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const ptzSpeed = ref(5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const presetForm = ref({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  presetId: null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const presetList = ref([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { id: 1, name: '预置位1' }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { id: 2, name: '预置位2' }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { id: 3, name: '预置位3' } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 详情相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const detailVisible = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 联动规则配置相关 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageDialogVisible = ref(false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageDialogTitle = ref('') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageForm = ref({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  id: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ruleName: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  triggerDeviceCode: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  triggerCondition: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageCameraCode: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageAction: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  delayTime: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ruleStatus: 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const linkageRules = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ruleName: [{ required: true, message: '请输入规则名称', trigger: 'blur' }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  triggerDeviceCode: [{ required: true, message: '请选择触发设备', trigger: 'change' }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  triggerCondition: [{ required: true, message: '请选择触发条件', trigger: 'change' }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageCameraCode: [{ required: true, message: '请选择联动摄像机', trigger: 'change' }], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageAction: [{ required: true, message: '请选择联动动作', trigger: 'change' }] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 触发设备列表(模拟数据,实际应从其他子系统获取) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const triggerDeviceList = ref([ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { code: 'ALARM001', name: '火灾报警器001' }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { code: 'DOOR001', name: '门禁001' }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  { code: 'MOTION001', name: '红外探测器001' } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 设备状态文本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const getStatusText = (status) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const texts = ['离线', '在线', '故障'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return texts[status] || '未知' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 联动动作文本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const getLinkageActionText = (action) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const texts = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'start_recording': '开始录像', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'goto_preset': '转到预置位', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'auto_tracking': '自动跟踪', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    'capture_image': '抓拍图片' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return texts[action] || '未知' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 查询摄像机列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function getCameraList() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   cameraLoading.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ...cameraQuery, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    pageNum: cameraQuery.pageNum, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    pageNo: cameraQuery.pageNo, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pageSize: cameraQuery.pageSize 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  listCameras(params).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cameraList.value = response.rows 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cameraTotal.value = response.total 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 添加搜索条件 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (searchForm.name) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    params.name = searchForm.name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (searchForm.cameraType !== '') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    params.cameraType = searchForm.cameraType 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  axios.get(`http://${__LOCAL_API__}/Hikvision/getCameraSearch`, { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    params: params 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (response.data.code === 200) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cameraList.value = response.data.data.list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      cameraTotal.value = response.data.data.total 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cameraLoading.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }).catch(error => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.error('获取摄像机列表失败:', error) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cameraLoading.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    proxy.$modal.msgError('获取摄像机列表失败') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 重置摄像机查询 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function resetCameraQuery() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  proxy.resetForm('cameraQueryRef') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cameraQuery.pageNum = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function handleSearch() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  cameraQuery.pageNo = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   getCameraList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 查询联动规则列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function getLinkageList() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageLoading.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ...linkageQuery, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    pageNum: linkageQuery.pageNum, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    pageSize: linkageQuery.pageSize 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  listLinkageRules(params).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    linkageList.value = response.rows 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    linkageTotal.value = response.total 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    linkageLoading.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 重置联动规则查询 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function resetLinkageQuery() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  proxy.resetForm('linkageQueryRef') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageQuery.pageNum = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  getLinkageList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 重置搜索 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function resetSearch() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  searchForm.name = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  searchForm.cameraType = '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  handleSearch() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // 实时视频预览 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function handleVideoPreview(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   currentCamera.value = row 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   videoVisible.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // 获取视频流地址 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  getCameraStream(row.camera_code).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    currentVideoUrl.value = response.data.streamUrl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 使用indexCode作为摄像机标识 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  currentVideoUrl.value = `http://${__LOCAL_API__}/Hikvision/getMonitoring?cameraIndexCode=${row.indexCode}` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 云台控制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function handlePtzControl(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 查看摄像机详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function handleCameraDetail(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   currentCamera.value = row 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ptzVisible.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  detailVisible.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 云台方向控制 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function ptzControl(direction) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const params = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cameraCode: currentCamera.value.cameraCode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    command: direction, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    speed: ptzSpeed.value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 抓拍 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function takeSnapshot() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  proxy.$modal.msgSuccess('抓拍成功,图片已保存') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 时间格式化 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function parseTime(time) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!time) return '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const date = new Date(time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const year = date.getFullYear() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const month = String(date.getMonth() + 1).padStart(2, '0') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const day = String(date.getDate()).padStart(2, '0') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const hours = String(date.getHours()).padStart(2, '0') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const minutes = String(date.getMinutes()).padStart(2, '0') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return `${year}-${month}-${day} ${hours}:${minutes}` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 获取摄像机类型名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function getCameraTypeName(type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const typeMap = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    0: '枪机', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    1: '半球', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    2: '快球', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    3: '带云台枪机' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ptzControlApi(params).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proxy.$modal.msgSuccess('云台控制指令发送成功') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return typeMap[type] || '未知类型' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 转到预置位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function gotoPreset() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!presetForm.value.presetId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proxy.$modal.msgWarning('请选择预置位') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 获取摄像机类型标签颜色 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function getCameraTypeTagType(type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const typeMap = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    0: 'primary', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    1: 'success', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    2: 'warning', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    3: 'danger' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ptzControl(`PRESET_${presetForm.value.presetId}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return typeMap[type] || 'info' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 设置预置位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function setPreset() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!presetForm.value.presetId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proxy.$modal.msgWarning('请选择预置位') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 获取传输类型名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function getTransTypeName(type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const typeMap = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    0: 'UDP', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    1: 'TCP' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ptzControl(`SET_PRESET_${presetForm.value.presetId}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return typeMap[type] || 'TCP' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 删除预置位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function deletePreset() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!presetForm.value.presetId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proxy.$modal.msgWarning('请选择预置位') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 获取录像位置名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function getRecordLocationName(location) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const locationMap = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '0': '中心存储', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '1': '设备存储' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ptzControl(`DEL_PRESET_${presetForm.value.presetId}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return locationMap[location] || '未知' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 开始录像 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function startRecording() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  recordingControl({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cameraCode: currentCamera.value.cameraCode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    action: 'start' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proxy.$modal.msgSuccess('开始录像成功') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    currentCamera.value.recordingStatus = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    getCameraList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 格式化区域路径 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function formatRegionPath(path) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!path) return '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // 将路径按/分割,过滤空值,返回最后两级 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const parts = path.split('/').filter(p => p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (parts.length > 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return `${parts[parts.length - 2]} / ${parts[parts.length - 1]}` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return parts.join(' / ') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 停止录像 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function stopRecording() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  recordingControl({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    cameraCode: currentCamera.value.cameraCode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    action: 'stop' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proxy.$modal.msgSuccess('停止录像成功') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    currentCamera.value.recordingStatus = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    getCameraList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 格式化能力集 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function formatCapabilities(capability) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!capability) return '无' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const capMap = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@vca_resource@': '智能分析', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@event_audio@': '音频事件', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@io@': 'IO控制', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@event_face@': '人脸事件', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@event_gis@': 'GIS事件', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@event_rule@': '规则事件', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@VoiceTalk@': '语音对讲', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@gis@': 'GIS定位', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@face@': '人脸识别', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@record@': '录像', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@heop_patch_upgrade@': '热补丁升级', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@vss@': '视频存储', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@event_io@': 'IO事件', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@net@': '网络', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@maintenance@': '维护', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@event_device@': '设备事件', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    '@status@': '状态监控' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const caps = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (const [key, value] of Object.entries(capMap)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (capability.includes(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      caps.push(value) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return caps.length > 0 ? caps.join('、') : '基础功能' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 抓拍 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function takeSnapshot() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  takeCameraSnapshot(currentCamera.value.cameraCode).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    proxy.$modal.msgSuccess('抓拍成功,图片已保存') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 初始化 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+onMounted(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  getCameraList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+</script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+<style scoped> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 全局样式 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.app-container { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background-color: #f5f7fa; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  min-height: calc(100vh - 84px); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 查看摄像机详情 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function handleCameraDetail(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  currentCamera.value = row 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  detailVisible.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 搜索区域 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.search-container { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 0 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 1px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 录像回放 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function handlePlayback(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  proxy.$modal.msgWarning('录像回放功能开发中...') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.search-card { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border: none; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 新增联动规则 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function handleAddLinkage() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageForm.value = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    id: null, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ruleName: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    triggerDeviceCode: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    triggerCondition: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    linkageCameraCode: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    linkageAction: '', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    delayTime: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ruleStatus: 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageDialogTitle.value = '新增联动规则' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageDialogVisible.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.search-card :deep(.el-card__body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 修改联动规则 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function handleEditLinkage(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageForm.value = { ...row } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageDialogTitle.value = '修改联动规则' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  linkageDialogVisible.value = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 搜索表单 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.search-form { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 0px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 删除联动规则 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function handleDeleteLinkage(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  proxy.$modal.confirm('确认删除该联动规则吗?').then(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    deleteLinkageRule(row.id).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      proxy.$modal.msgSuccess('删除成功') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      getLinkageList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.search-form-inline { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  flex-wrap: wrap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 16px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 启用/禁用联动规则 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function handleToggleLinkage(row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  const action = row.rule_status === 1 ? '禁用' : '启用' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  proxy.$modal.confirm(`确认${action}该联动规则吗?`).then(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    toggleLinkageRule(row.id, { ruleStatus: row.rule_status === 1 ? 0 : 1 }).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      proxy.$modal.msgSuccess(`${action}成功`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      getLinkageList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.search-form-inline .el-form-item { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 提交联动规则表单 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function submitLinkageForm() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  proxy.$refs['linkageFormRef'].validate((valid) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (valid) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (linkageForm.value.id) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        updateLinkageRule(linkageForm.value).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          proxy.$modal.msgSuccess('修改成功') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          linkageDialogVisible.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          getLinkageList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        addLinkageRule(linkageForm.value).then(response => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          proxy.$modal.msgSuccess('新增成功') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          linkageDialogVisible.value = false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          getLinkageList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.search-actions { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  justify-content: space-between; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// 初始化 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-onMounted(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  getCameraList() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-</script> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.refresh-btn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border: none; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 500; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-<style scoped> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.video-container { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.refresh-btn:hover { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  transform: translateY(-2px); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  box-shadow: 0 5px 15px rgba(102, 126, 234, 0.4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-stats { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.stat-item { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #606266; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 14px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.stat-number { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 600; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #667eea; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 表格卡片 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.table-card { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin: 0 20px 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border: none; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.table-card :deep(.el-card__body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 表格样式 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 14px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table :deep(.el-table__header-wrapper) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 12px 12px 0 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table :deep(.el-table__row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  transition: all 0.3s ease; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table :deep(.el-table__row:hover) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background-color: #f5f7fa; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 摄像机信息列 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-info { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 8px 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-name { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 15px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 500; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 4px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-code { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 设备详情列 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.device-details { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-item { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 13px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #606266; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 技术参数列 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.tech-params { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  flex-direction: column; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.param-item { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 6px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 13px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #606266; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.param-item i { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 位置信息列 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.location-info { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 8px 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.region-name { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 14px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 500; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 4px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.region-path { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 时间文本 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.time-text { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 13px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 操作按钮 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.action-buttons { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.action-btn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 6px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 400; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.preview-btn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border: none; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.preview-btn:hover { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  transform: translateY(-1px); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-btn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #f0f2f5; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border: 1px solid #e4e7ed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #606266; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-btn:hover { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #e6e8eb; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-color: #dcdfe6; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 分页样式 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.pagination-wrapper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   padding: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #fafafa; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 0 0 12px 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.video-player { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  margin-bottom: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 视频预览抽屉 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-drawer :deep(.el-drawer__header) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-bottom: 1px solid #e4e7ed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 20px 30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.video-info { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  margin-bottom: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-drawer :deep(.el-drawer__body) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #f5f7fa; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-wrapper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  height: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  flex-direction: column; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.video-controls { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  text-align: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 视频播放区域 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-player-container { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  flex: none; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: white; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  overflow: hidden; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.ptz-container { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-header { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  justify-content: space-between; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   padding: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-bottom: 1px solid #e4e7ed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-title { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 18px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-player { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  position: relative; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #000; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  height: 500px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-iframe { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  width: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  height: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border: none; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-placeholder { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  flex-direction: column; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  align-items: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  justify-content: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  height: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.ptz-direction, .ptz-zoom, .ptz-focus, .ptz-preset, .ptz-speed { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  margin-bottom: 30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.video-placeholder i { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 48px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 16px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.direction-grid { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  text-align: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 摄像机信息面板 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-details-panel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: white; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin: 0 20px 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 24px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.direction-row { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  margin-bottom: 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.panel-title { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin: 0 0 20px 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 16px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 500; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.direction-btn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  width: 60px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  height: 60px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  margin: 5px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.info-grid { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: grid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grid-template-columns: repeat(2, 1fr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.stop-btn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  background-color: #f56c6c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  border-color: #f56c6c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.info-item { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  flex-direction: column; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.info-label { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 13px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.info-value { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 14px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 500; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 详情抽屉 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-drawer :deep(.el-drawer__header) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   color: white; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 24px 30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-drawer :deep(.el-drawer__title) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: white; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-drawer :deep(.el-drawer__close) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: white; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-wrapper { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 30px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #f5f7fa; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  min-height: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-section { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: white; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 24px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin-bottom: 20px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.section-title { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  margin: 0 0 20px 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 16px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 500; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding-bottom: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-bottom: 2px solid #e4e7ed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-grid { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: grid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grid-template-columns: repeat(2, 1fr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 24px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-item { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  display: flex; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  flex-direction: column; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gap: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-item.full-width { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grid-column: span 2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-label { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 13px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 400; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.detail-value { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 15px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #303133; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-weight: 500; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  word-break: break-all; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 标签样式优化 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.el-tag { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 6px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 0 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  height: 26px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  line-height: 24px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 12px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 加载动画 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.el-loading-mask { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background-color: rgba(255, 255, 255, 0.9); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 响应式设计 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@media (max-width: 1200px) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .info-grid, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .detail-grid { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grid-template-columns: 1fr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .detail-item.full-width { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grid-column: span 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@media (max-width: 768px) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .search-actions { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    flex-direction: column; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gap: 16px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    align-items: stretch; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .camera-stats { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    justify-content: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .video-drawer :deep(.el-drawer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    width: 100% !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .detail-drawer :deep(.el-drawer) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    width: 100% !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .action-buttons { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    flex-direction: column; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    width: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  .action-btn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    width: 100%; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 动画效果 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@keyframes fadeIn { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  from { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    transform: translateY(10px); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  to { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    opacity: 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    transform: translateY(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table :deep(.el-table__row) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  animation: fadeIn 0.3s ease-out; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 滚动条美化 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+::-webkit-scrollbar { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  width: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  height: 8px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+::-webkit-scrollbar-track { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #f1f1f1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 4px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+::-webkit-scrollbar-thumb { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #c0c4cc; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  border-radius: 4px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+::-webkit-scrollbar-thumb:hover { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  background: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 过渡效果 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.el-button, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.el-tag { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  transition: all 0.3s ease; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 空状态样式 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.el-table__empty-block { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  padding: 60px 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.el-table__empty-text { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  color: #909399; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  font-size: 14px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 隐藏表格滚动条 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table :deep(.el-table__body-wrapper) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  overflow-x: hidden !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  overflow-y: hidden !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.zoom-controls, .focus-controls { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  text-align: center; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table :deep(.el-table__header-wrapper) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  overflow-x: hidden !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-.zoom-controls .el-button, .focus-controls .el-button { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  margin: 0 10px; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* 如果需要隐藏整个表格容器的滚动条 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+.camera-table :deep(.el-table) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  overflow: hidden !important; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 </style> 
			 |