135 lines
4.2 KiB
JavaScript
135 lines
4.2 KiB
JavaScript
const searchInput = document.getElementById("searchInput");
|
|
const memberSelect = document.getElementById("memberSelect");
|
|
const generateBtn = document.getElementById("generateBtn");
|
|
const statusText = document.getElementById("statusText");
|
|
const resultCard = document.getElementById("resultCard");
|
|
const qrImage = document.getElementById("qrImage");
|
|
const downloadLink = document.getElementById("downloadLink");
|
|
const rawJson = document.getElementById("rawJson");
|
|
|
|
const metaMemberId = document.getElementById("metaMemberId");
|
|
const metaVillage = document.getElementById("metaVillage");
|
|
const metaUuid = document.getElementById("metaUuid");
|
|
const metaStatus = document.getElementById("metaStatus");
|
|
const metaMsg = document.getElementById("metaMsg");
|
|
const metaQrPrefix = document.getElementById("metaQrPrefix");
|
|
const metaPayloadLen = document.getElementById("metaPayloadLen");
|
|
const metaPayloadPrefix = document.getElementById("metaPayloadPrefix");
|
|
|
|
let allItems = [];
|
|
|
|
function setStatus(message, isError = false) {
|
|
statusText.textContent = message;
|
|
statusText.classList.toggle("error", isError);
|
|
}
|
|
|
|
function renderOptions(items) {
|
|
memberSelect.innerHTML = "";
|
|
|
|
if (!items.length) {
|
|
const option = document.createElement("option");
|
|
option.value = "";
|
|
option.textContent = "没有可选 ID";
|
|
memberSelect.appendChild(option);
|
|
return;
|
|
}
|
|
|
|
for (const item of items) {
|
|
const option = document.createElement("option");
|
|
option.value = String(item.member_id);
|
|
option.textContent = item.label;
|
|
memberSelect.appendChild(option);
|
|
}
|
|
|
|
if (!memberSelect.value) {
|
|
memberSelect.selectedIndex = 0;
|
|
}
|
|
}
|
|
|
|
function filterItems() {
|
|
const keyword = searchInput.value.trim().toLowerCase();
|
|
if (!keyword) {
|
|
renderOptions(allItems);
|
|
setStatus(`已加载 ${allItems.length} 个 ID`);
|
|
return;
|
|
}
|
|
|
|
const filtered = allItems.filter((item) => {
|
|
const idText = String(item.member_id);
|
|
const village = String(item.village_name || "").toLowerCase();
|
|
return idText.includes(keyword) || village.includes(keyword);
|
|
});
|
|
|
|
renderOptions(filtered);
|
|
setStatus(`筛选后剩余 ${filtered.length} 个 ID`);
|
|
}
|
|
|
|
async function loadFoundIds() {
|
|
setStatus("正在加载 ID 列表...");
|
|
try {
|
|
const response = await fetch("/api/found-ids");
|
|
const data = await response.json();
|
|
if (!response.ok || !data.ok) {
|
|
throw new Error(data.error || "加载 ID 列表失败");
|
|
}
|
|
allItems = data.items || [];
|
|
renderOptions(allItems);
|
|
setStatus(`已加载 ${allItems.length} 个 ID`);
|
|
} catch (error) {
|
|
setStatus(error.message || "加载失败", true);
|
|
}
|
|
}
|
|
|
|
function showResult(data) {
|
|
resultCard.classList.remove("hidden");
|
|
qrImage.src = data.data_url;
|
|
downloadLink.href = data.data_url;
|
|
downloadLink.download = `member_${data.member_id}.gif`;
|
|
metaMemberId.textContent = data.member_id ?? "-";
|
|
metaVillage.textContent = data.village_name ?? "-";
|
|
metaUuid.textContent = data.uuid ?? "-";
|
|
metaStatus.textContent = data.status ?? "-";
|
|
metaMsg.textContent = data.msg ?? "-";
|
|
metaQrPrefix.textContent = data.qr_prefix ?? "-";
|
|
metaPayloadLen.textContent = data.payload_len ?? "-";
|
|
metaPayloadPrefix.textContent = data.payload_hex_prefix ?? "-";
|
|
rawJson.textContent = JSON.stringify(data, null, 2);
|
|
}
|
|
|
|
async function generateQr() {
|
|
const memberId = memberSelect.value;
|
|
if (!memberId) {
|
|
setStatus("请先选择一个 member_id", true);
|
|
return;
|
|
}
|
|
|
|
generateBtn.disabled = true;
|
|
setStatus(`正在为 ${memberId} 生成二维码...`);
|
|
|
|
try {
|
|
const response = await fetch("/api/generate", {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({ member_id: Number(memberId) }),
|
|
});
|
|
const data = await response.json();
|
|
if (!response.ok || !data.ok) {
|
|
throw new Error(data.error || "生成二维码失败");
|
|
}
|
|
showResult(data);
|
|
setStatus(`member_id=${memberId} 生成成功`);
|
|
} catch (error) {
|
|
setStatus(error.message || "生成失败", true);
|
|
} finally {
|
|
generateBtn.disabled = false;
|
|
}
|
|
}
|
|
|
|
searchInput.addEventListener("input", filterItems);
|
|
generateBtn.addEventListener("click", generateQr);
|
|
memberSelect.addEventListener("dblclick", generateQr);
|
|
|
|
loadFoundIds();
|