function pad(n) { return String(n).padStart(2, '0'); } function formatNow() { const d = new Date(); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; } function buildDefaultGpsPayload() { return { msgType: 'com.hikvision.open.transparent', msgSeq: String(Date.now()), createDate: Date.now(), sn: 'F12345678', data: { gpsTime: formatNow(), longitude: 120.153245, latitude: 30.267421, speed: 60.5, direction: 180, elevation: 15.2, status: 'A', }, }; } function initTabs() { const tabs = document.querySelectorAll('.tab'); const panels = document.querySelectorAll('.tab-panel'); tabs.forEach((tab) => { tab.addEventListener('click', () => { const name = tab.dataset.tab; tabs.forEach((t) => { const active = t === tab; t.classList.toggle('active', active); t.setAttribute('aria-selected', active ? 'true' : 'false'); }); panels.forEach((panel) => { const active = panel.id === `panel-${name}`; panel.classList.toggle('active', active); panel.hidden = !active; }); }); }); } async function loadDefaults() { const res = await fetch('/api/defaults'); const data = await res.json(); document.getElementById('targetUrl').value = data.targetUrl; document.getElementById('clientId').value = data.clientId; document.getElementById('secret').value = data.secret; document.getElementById('uploadTime').value = formatNow(); if (data.gpsTargetUrl) { document.getElementById('gpsTargetUrl').value = data.gpsTargetUrl; } } function initWeightTab() { document.getElementById('nowBtn').addEventListener('click', () => { document.getElementById('uploadTime').value = formatNow(); }); document.getElementById('reportForm').addEventListener('submit', async (e) => { e.preventDefault(); const submitBtn = document.getElementById('submitBtn'); const result = document.getElementById('result'); submitBtn.disabled = true; result.textContent = '上报中...'; const payload = { targetUrl: document.getElementById('targetUrl').value.trim(), clientId: document.getElementById('clientId').value.trim(), secret: document.getElementById('secret').value.trim(), deviceNo: document.getElementById('deviceNo').value.trim(), uploadTime: document.getElementById('uploadTime').value.trim(), garbageType: document.getElementById('garbageType').value, garbageWeight: document.getElementById('garbageWeight').value.trim(), others: document.getElementById('others').value.trim(), }; try { const res = await fetch('/api/send', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); const data = await res.json(); result.textContent = JSON.stringify(data, null, 2); } catch (err) { result.textContent = JSON.stringify({ ok: false, msg: err.message }, null, 2); } finally { submitBtn.disabled = false; } }); } function initGpsTab() { const gpsPayload = document.getElementById('gpsPayload'); gpsPayload.value = JSON.stringify(buildDefaultGpsPayload(), null, 2); document.getElementById('gpsSendBtn').addEventListener('click', async () => { const sendBtn = document.getElementById('gpsSendBtn'); const result = document.getElementById('gpsResult'); const targetUrl = document.getElementById('gpsTargetUrl').value.trim(); const raw = gpsPayload.value.trim(); if (!targetUrl) { result.textContent = JSON.stringify({ ok: false, msg: '请填写目标地址' }, null, 2); return; } let body; try { body = JSON.parse(raw); } catch (err) { result.textContent = JSON.stringify({ ok: false, msg: `JSON 格式错误: ${err.message}` }, null, 2); return; } sendBtn.disabled = true; result.textContent = '发送中...'; try { const res = await fetch('/api/send-gps', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ targetUrl, payload: body }), }); const data = await res.json(); result.textContent = JSON.stringify(data, null, 2); } catch (err) { result.textContent = JSON.stringify({ ok: false, msg: err.message }, null, 2); } finally { sendBtn.disabled = false; } }); } initTabs(); initWeightTab(); initGpsTab(); loadDefaults().catch((err) => { document.getElementById('result').textContent = `加载默认配置失败: ${err.message}`; });