" + escapeHtml(item.text || "").slice(0, 600) + "
", item.score === null || item.score === undefined ? "" : "score: " + escapeHtml(item.score) + "", "(function () { var page = document.querySelector(".knowledge-page"); if (!page) { return; } var documentForm = document.getElementById("knowledgeDocumentForm"); var documentStatus = document.getElementById("knowledgeDocumentStatus"); var documentTable = document.getElementById("knowledgeDocumentTable"); var documentSearch = document.getElementById("knowledgeDocumentSearch"); var searchForm = document.getElementById("knowledgeSearchForm"); var queryInput = document.getElementById("knowledgeSearchQuery"); var results = document.getElementById("knowledgeSearchResults"); var sourceSearch = document.getElementById("knowledgeSourceSearch"); var sourceTable = document.getElementById("knowledgeSourceTable"); var documentFileInput = document.getElementById("knowledgeDocumentFile"); var uploadDropzone = document.getElementById("knowledgeUploadDropzone"); function csrfToken() { var cookie = document.cookie.split("; ").find(function (item) { return item.indexOf("csrftoken=") === 0; }); return cookie ? decodeURIComponent(cookie.split("=")[1]) : ""; } function escapeHtml(value) { return String(value || "") .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } async function patchDocument(row, payload) { var response = await fetch(row.getAttribute("data-detail-url"), { method: "PATCH", headers: { "Content-Type": "application/json", "X-CSRFToken": csrfToken(), }, body: JSON.stringify(payload), }); if (!response.ok) { throw new Error("知识库材料更新失败。"); } return response.json(); } async function deleteDocument(row) { var response = await fetch(row.getAttribute("data-detail-url"), { method: "DELETE", headers: { "X-CSRFToken": csrfToken() }, }); if (!response.ok) { throw new Error("知识库材料删除失败。"); } } async function indexDocument(row) { var response = await fetch(row.getAttribute("data-index-url"), { method: "POST", headers: { "X-CSRFToken": csrfToken() }, }); if (!response.ok) { throw new Error("知识库材料解析入库失败。"); } return response.json(); } function renderResults(payload) { if (!results) { return; } if (payload.error_message) { results.innerHTML = '
' + escapeHtml(payload.error_message) + "
"; return; } if (!payload.results || !payload.results.length) { results.innerHTML = '未检索到依据片段。
'; return; } results.innerHTML = payload.results .map(function (item, index) { return [ '" + escapeHtml(item.text || "").slice(0, 600) + "
", item.score === null || item.score === undefined ? "" : "score: " + escapeHtml(item.score) + "", "检索中...
'; try { var response = await fetch(page.getAttribute("data-search-url"), { method: "POST", headers: { "Content-Type": "application/json", "X-CSRFToken": csrfToken(), }, body: JSON.stringify({ query: query }), }); renderResults(await response.json()); } catch (error) { renderResults({ error_message: "检索失败,请稍后重试。" }); } }); } function bindTableSearch(input, table, selector) { if (!input || !table) { return; } input.addEventListener("input", function () { var keyword = input.value.trim().toLowerCase(); table.querySelectorAll(selector).forEach(function (row) { row.hidden = keyword && row.textContent.toLowerCase().indexOf(keyword) === -1; }); }); } bindTableSearch(documentSearch, documentTable, "tbody tr[data-document-id]"); bindTableSearch(sourceSearch, sourceTable, "tbody tr[data-source-name]"); })();