wangzhibo
2026-07-16 28e1f42bd6866e8f9478a3ac5e851d202030e4eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
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}`;
});