/** * 摄像头种子数据脚本 * 在浏览器控制台中运行此脚本,添加70条多样化的摄像头数据 * * 使用方法: * 1. 登录到 http://localhost:3000 (或生产环境) * 2. 打开浏览器开发者工具 (F12) * 3. 复制此脚本内容到控制台运行 */ const API_BASE = window.location.origin.includes('localhost') ? 'https://tg-live-game.pwtk.cc/api' : '/api' // 从 cookie 获取 token function getToken() { const match = document.cookie.match(new RegExp('(^| )token=([^;]+)')) return match ? decodeURIComponent(match[2]) : null } // 发送 API 请求 async function apiPost(path, data) { const token = getToken() if (!token) { throw new Error('未登录,请先登录系统') } const response = await fetch(`${API_BASE}${path}`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify(data) }) return response.json() } // 品牌列表 const brands = [ 'Hikvision', 'Dahua', 'Axis', 'Sony', 'Bosch', 'Uniview', 'Hanwha', 'Pelco', 'Vivotek', 'Tiandy', 'Ezviz', 'Reolink', 'Amcrest', 'Lorex', 'Swann' ] // 机器ID列表 (模拟不同的部署位置) const machineIds = [ 'FACTORY-A1', 'FACTORY-A2', 'FACTORY-B1', 'WAREHOUSE-01', 'WAREHOUSE-02', 'WAREHOUSE-03', 'OFFICE-HQ', 'OFFICE-BRANCH1', 'OFFICE-BRANCH2', 'RETAIL-STORE1', 'RETAIL-STORE2', 'PARKING-MAIN', 'PARKING-EAST', 'DATACENTER-01', 'DATACENTER-02' ] // 生成70条多样化摄像头数据 const cameras = [ // 工厂区域 (15台) { name: '生产线A-入口监控', ip: '192.168.1.101', brand: 'Hikvision', capability: 'ptz_enabled', machineId: 'FACTORY-A1', location: 'factory' }, { name: '生产线A-装配区', ip: '192.168.1.102', brand: 'Dahua', capability: 'switch_only', machineId: 'FACTORY-A1', location: 'factory' }, { name: '生产线A-质检站', ip: '192.168.1.103', brand: 'Axis', capability: 'ptz_enabled', machineId: 'FACTORY-A1', location: 'factory' }, { name: '生产线A-包装区', ip: '192.168.1.104', brand: 'Hikvision', capability: 'switch_only', machineId: 'FACTORY-A1', location: 'factory' }, { name: '生产线A-出货口', ip: '192.168.1.105', brand: 'Uniview', capability: 'ptz_enabled', machineId: 'FACTORY-A1', location: 'factory' }, { name: '生产线B-原料区', ip: '192.168.1.111', brand: 'Dahua', capability: 'switch_only', machineId: 'FACTORY-A2', location: 'factory' }, { name: '生产线B-加工中心', ip: '192.168.1.112', brand: 'Sony', capability: 'ptz_enabled', machineId: 'FACTORY-A2', location: 'factory' }, { name: '生产线B-焊接车间', ip: '192.168.1.113', brand: 'Bosch', capability: 'switch_only', machineId: 'FACTORY-A2', location: 'factory' }, { name: '生产线B-喷漆房', ip: '192.168.1.114', brand: 'Hanwha', capability: 'switch_only', machineId: 'FACTORY-A2', location: 'factory' }, { name: '生产线B-成品检验', ip: '192.168.1.115', brand: 'Hikvision', capability: 'ptz_enabled', machineId: 'FACTORY-A2', location: 'factory' }, { name: '厂房C-机械臂区', ip: '192.168.2.101', brand: 'Axis', capability: 'ptz_enabled', machineId: 'FACTORY-B1', location: 'factory' }, { name: '厂房C-物料暂存', ip: '192.168.2.102', brand: 'Dahua', capability: 'switch_only', machineId: 'FACTORY-B1', location: 'factory' }, { name: '厂房C-AGV通道', ip: '192.168.2.103', brand: 'Uniview', capability: 'switch_only', machineId: 'FACTORY-B1', location: 'factory' }, { name: '厂房C-配电室', ip: '192.168.2.104', brand: 'Tiandy', capability: 'switch_only', machineId: 'FACTORY-B1', location: 'factory' }, { name: '厂房C-消防通道', ip: '192.168.2.105', brand: 'Hikvision', capability: 'ptz_enabled', machineId: 'FACTORY-B1', location: 'factory' }, // 仓库区域 (15台) { name: '仓库1-入库区', ip: '192.168.3.101', brand: 'Dahua', capability: 'ptz_enabled', machineId: 'WAREHOUSE-01', location: 'warehouse' }, { name: '仓库1-货架A区', ip: '192.168.3.102', brand: 'Hikvision', capability: 'switch_only', machineId: 'WAREHOUSE-01', location: 'warehouse' }, { name: '仓库1-货架B区', ip: '192.168.3.103', brand: 'Hikvision', capability: 'switch_only', machineId: 'WAREHOUSE-01', location: 'warehouse' }, { name: '仓库1-叉车通道', ip: '192.168.3.104', brand: 'Axis', capability: 'ptz_enabled', machineId: 'WAREHOUSE-01', location: 'warehouse' }, { name: '仓库1-出库区', ip: '192.168.3.105', brand: 'Uniview', capability: 'ptz_enabled', machineId: 'WAREHOUSE-01', location: 'warehouse' }, { name: '仓库2-危化品区', ip: '192.168.3.111', brand: 'Bosch', capability: 'ptz_enabled', machineId: 'WAREHOUSE-02', location: 'warehouse' }, { name: '仓库2-冷藏区', ip: '192.168.3.112', brand: 'Sony', capability: 'switch_only', machineId: 'WAREHOUSE-02', location: 'warehouse' }, { name: '仓库2-高值品区', ip: '192.168.3.113', brand: 'Pelco', capability: 'ptz_enabled', machineId: 'WAREHOUSE-02', location: 'warehouse' }, { name: '仓库2-分拣中心', ip: '192.168.3.114', brand: 'Dahua', capability: 'switch_only', machineId: 'WAREHOUSE-02', location: 'warehouse' }, { name: '仓库2-打包区', ip: '192.168.3.115', brand: 'Vivotek', capability: 'switch_only', machineId: 'WAREHOUSE-02', location: 'warehouse' }, { name: '仓库3-散货区', ip: '192.168.3.121', brand: 'Tiandy', capability: 'switch_only', machineId: 'WAREHOUSE-03', location: 'warehouse' }, { name: '仓库3-托盘区', ip: '192.168.3.122', brand: 'Hikvision', capability: 'switch_only', machineId: 'WAREHOUSE-03', location: 'warehouse' }, { name: '仓库3-装车月台', ip: '192.168.3.123', brand: 'Dahua', capability: 'ptz_enabled', machineId: 'WAREHOUSE-03', location: 'warehouse' }, { name: '仓库3-验收区', ip: '192.168.3.124', brand: 'Ezviz', capability: 'switch_only', machineId: 'WAREHOUSE-03', location: 'warehouse' }, { name: '仓库3-退货处理', ip: '192.168.3.125', brand: 'Reolink', capability: 'switch_only', machineId: 'WAREHOUSE-03', location: 'warehouse' }, // 办公区域 (15台) { name: '总部大堂', ip: '192.168.10.101', brand: 'Axis', capability: 'ptz_enabled', machineId: 'OFFICE-HQ', location: 'office' }, { name: '总部前台', ip: '192.168.10.102', brand: 'Sony', capability: 'switch_only', machineId: 'OFFICE-HQ', location: 'office' }, { name: '总部会议室A', ip: '192.168.10.103', brand: 'Hikvision', capability: 'switch_only', machineId: 'OFFICE-HQ', location: 'office' }, { name: '总部会议室B', ip: '192.168.10.104', brand: 'Dahua', capability: 'switch_only', machineId: 'OFFICE-HQ', location: 'office' }, { name: '总部电梯厅', ip: '192.168.10.105', brand: 'Uniview', capability: 'switch_only', machineId: 'OFFICE-HQ', location: 'office' }, { name: '分公司1-入口', ip: '192.168.11.101', brand: 'Hanwha', capability: 'ptz_enabled', machineId: 'OFFICE-BRANCH1', location: 'office' }, { name: '分公司1-开放办公区', ip: '192.168.11.102', brand: 'Bosch', capability: 'switch_only', machineId: 'OFFICE-BRANCH1', location: 'office' }, { name: '分公司1-茶水间', ip: '192.168.11.103', brand: 'Amcrest', capability: 'switch_only', machineId: 'OFFICE-BRANCH1', location: 'office' }, { name: '分公司1-走廊', ip: '192.168.11.104', brand: 'Lorex', capability: 'switch_only', machineId: 'OFFICE-BRANCH1', location: 'office' }, { name: '分公司1-档案室', ip: '192.168.11.105', brand: 'Swann', capability: 'switch_only', machineId: 'OFFICE-BRANCH1', location: 'office' }, { name: '分公司2-大厅', ip: '192.168.12.101', brand: 'Hikvision', capability: 'ptz_enabled', machineId: 'OFFICE-BRANCH2', location: 'office' }, { name: '分公司2-培训室', ip: '192.168.12.102', brand: 'Dahua', capability: 'switch_only', machineId: 'OFFICE-BRANCH2', location: 'office' }, { name: '分公司2-财务室', ip: '192.168.12.103', brand: 'Axis', capability: 'switch_only', machineId: 'OFFICE-BRANCH2', location: 'office' }, { name: '分公司2-服务器机房', ip: '192.168.12.104', brand: 'Pelco', capability: 'ptz_enabled', machineId: 'OFFICE-BRANCH2', location: 'office' }, { name: '分公司2-楼梯间', ip: '192.168.12.105', brand: 'Vivotek', capability: 'switch_only', machineId: 'OFFICE-BRANCH2', location: 'office' }, // 零售门店 (10台) { name: '门店1-收银台', ip: '192.168.20.101', brand: 'Hikvision', capability: 'ptz_enabled', machineId: 'RETAIL-STORE1', location: 'retail' }, { name: '门店1-商品陈列区', ip: '192.168.20.102', brand: 'Dahua', capability: 'switch_only', machineId: 'RETAIL-STORE1', location: 'retail' }, { name: '门店1-试衣间走廊', ip: '192.168.20.103', brand: 'Uniview', capability: 'switch_only', machineId: 'RETAIL-STORE1', location: 'retail' }, { name: '门店1-库房入口', ip: '192.168.20.104', brand: 'Tiandy', capability: 'switch_only', machineId: 'RETAIL-STORE1', location: 'retail' }, { name: '门店1-出入口', ip: '192.168.20.105', brand: 'Ezviz', capability: 'ptz_enabled', machineId: 'RETAIL-STORE1', location: 'retail' }, { name: '门店2-主通道', ip: '192.168.21.101', brand: 'Reolink', capability: 'ptz_enabled', machineId: 'RETAIL-STORE2', location: 'retail' }, { name: '门店2-生鲜区', ip: '192.168.21.102', brand: 'Amcrest', capability: 'switch_only', machineId: 'RETAIL-STORE2', location: 'retail' }, { name: '门店2-酒水区', ip: '192.168.21.103', brand: 'Lorex', capability: 'switch_only', machineId: 'RETAIL-STORE2', location: 'retail' }, { name: '门店2-自助结账', ip: '192.168.21.104', brand: 'Swann', capability: 'ptz_enabled', machineId: 'RETAIL-STORE2', location: 'retail' }, { name: '门店2-员工通道', ip: '192.168.21.105', brand: 'Hikvision', capability: 'switch_only', machineId: 'RETAIL-STORE2', location: 'retail' }, // 停车场 (8台) { name: '停车场A-入口闸机', ip: '192.168.30.101', brand: 'Dahua', capability: 'ptz_enabled', machineId: 'PARKING-MAIN', location: 'parking' }, { name: '停车场A-出口闸机', ip: '192.168.30.102', brand: 'Hikvision', capability: 'ptz_enabled', machineId: 'PARKING-MAIN', location: 'parking' }, { name: '停车场A-B1层', ip: '192.168.30.103', brand: 'Uniview', capability: 'switch_only', machineId: 'PARKING-MAIN', location: 'parking' }, { name: '停车场A-B2层', ip: '192.168.30.104', brand: 'Axis', capability: 'switch_only', machineId: 'PARKING-MAIN', location: 'parking' }, { name: '停车场B-车位引导', ip: '192.168.31.101', brand: 'Bosch', capability: 'ptz_enabled', machineId: 'PARKING-EAST', location: 'parking' }, { name: '停车场B-充电桩区', ip: '192.168.31.102', brand: 'Sony', capability: 'switch_only', machineId: 'PARKING-EAST', location: 'parking' }, { name: '停车场B-无障碍车位', ip: '192.168.31.103', brand: 'Hanwha', capability: 'switch_only', machineId: 'PARKING-EAST', location: 'parking' }, { name: '停车场B-摩托车区', ip: '192.168.31.104', brand: 'Pelco', capability: 'switch_only', machineId: 'PARKING-EAST', location: 'parking' }, // 数据中心 (7台) { name: '机房A-服务器机柜', ip: '10.0.1.101', brand: 'Axis', capability: 'ptz_enabled', machineId: 'DATACENTER-01', location: 'datacenter' }, { name: '机房A-网络机柜', ip: '10.0.1.102', brand: 'Sony', capability: 'switch_only', machineId: 'DATACENTER-01', location: 'datacenter' }, { name: '机房A-UPS室', ip: '10.0.1.103', brand: 'Bosch', capability: 'switch_only', machineId: 'DATACENTER-01', location: 'datacenter' }, { name: '机房A-冷通道', ip: '10.0.1.104', brand: 'Hikvision', capability: 'switch_only', machineId: 'DATACENTER-01', location: 'datacenter' }, { name: '机房B-热通道', ip: '10.0.2.101', brand: 'Dahua', capability: 'switch_only', machineId: 'DATACENTER-02', location: 'datacenter' }, { name: '机房B-消防系统', ip: '10.0.2.102', brand: 'Pelco', capability: 'ptz_enabled', machineId: 'DATACENTER-02', location: 'datacenter' }, { name: '机房B-门禁区', ip: '10.0.2.103', brand: 'Vivotek', capability: 'switch_only', machineId: 'DATACENTER-02', location: 'datacenter' } ] // 生成通道数据 function generateChannels(cameraId, name, ip, capability) { const channels = [] const channelCount = capability === 'ptz_enabled' ? Math.floor(Math.random() * 2) + 2 : Math.floor(Math.random() * 2) + 1 const channelNames = { ptz_enabled: ['主画面', '全景视角', '细节特写', '广角监控'], switch_only: ['标清画面', '高清画面', '夜视模式'] } const names = capability === 'ptz_enabled' ? channelNames.ptz_enabled : channelNames.switch_only for (let i = 0; i < channelCount; i++) { channels.push({ channelId: `${cameraId}-ch${i + 1}`, name: names[i] || `通道${i + 1}`, rtspUrl: `rtsp://${ip}:554/stream${i + 1}`, defaultView: i === 0 }) } return channels } // 执行添加摄像头 async function seedCameras() { console.log('开始添加摄像头数据...') console.log(`总计: ${cameras.length} 台摄像头`) let successCount = 0 let failCount = 0 const errors = [] for (let i = 0; i < cameras.length; i++) { const cam = cameras[i] const cameraId = `CAM-${String(i + 1).padStart(3, '0')}` const cameraData = { cameraId: cameraId, name: cam.name, ip: cam.ip, port: 554, username: 'admin', password: 'admin123', brand: cam.brand, capability: cam.capability, machineId: cam.machineId, channels: generateChannels(cameraId, cam.name, cam.ip, cam.capability) } try { const result = await apiPost('/admin/cameras/add', cameraData) if (result.success) { successCount++ console.log(`✅ [${i + 1}/${cameras.length}] ${cam.name} - 添加成功`) } else { failCount++ errors.push({ camera: cam.name, error: result.errMessage || '未知错误' }) console.log(`❌ [${i + 1}/${cameras.length}] ${cam.name} - 失败: ${result.errMessage}`) } } catch (err) { failCount++ errors.push({ camera: cam.name, error: err.message }) console.log(`❌ [${i + 1}/${cameras.length}] ${cam.name} - 异常: ${err.message}`) } // 添加小延迟避免请求过快 await new Promise((resolve) => setTimeout(resolve, 100)) } console.log('\n========== 添加完成 ==========') console.log(`✅ 成功: ${successCount} 台`) console.log(`❌ 失败: ${failCount} 台`) if (errors.length > 0) { console.log('\n失败详情:') errors.forEach((e) => console.log(` - ${e.camera}: ${e.error}`)) } return { successCount, failCount, errors } } // 运行脚本 seedCameras()