awesome/public/js/main.js
cheney 64f3f6ea58
Some checks failed
Build and Deploy / build (push) Successful in 11s
Build and Deploy / deploy (push) Failing after 49s
feat: 首页版本号、简介布局与反显、密钥眼睛融合、定时拉取开关
2026-09-01 11:15:35 +08:00

185 lines
6.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(function () {
"use strict";
var toastEl = document.querySelector(".toast");
var toastTimer = null;
function toast(msg) {
if (!toastEl) return;
toastEl.textContent = msg;
toastEl.classList.add("show");
clearTimeout(toastTimer);
toastTimer = setTimeout(function () {
toastEl.classList.remove("show");
}, 2200);
}
window.awToast = toast;
async function postJson(url, body, method) {
var res = await fetch(url, {
method: method || "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(body || {}),
});
var json = null;
try {
json = await res.json();
} catch (e) {}
if (!res.ok || (json && json.ok === false)) {
throw new Error((json && json.error && json.error.message) || "请求失败(" + res.status + "");
}
return json;
}
window.awApi = postJson;
document.querySelectorAll("[data-copy]").forEach(function (btn) {
btn.addEventListener("click", function () {
var text = btn.getAttribute("data-copy");
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(
function () { toast("已复制"); },
function () { toast("复制失败,请手动选择文本"); }
);
} else {
toast("当前环境不支持自动复制");
}
});
});
var searchInput = document.getElementById("q");
var echo = document.getElementById("query-echo");
if (searchInput && echo) {
var paint = function () {
var q = searchInput.value.trim();
echo.textContent = q
? '→ mcp: search_entries({ "q": "' + q + '", "limit": 20 })'
: '→ mcp: search_entries({ "q": "…" })';
};
searchInput.addEventListener("input", paint);
paint();
}
var searchForm = document.getElementById("search-form");
if (searchForm) {
searchForm.addEventListener("submit", function (e) {
e.preventDefault();
var q = searchForm.querySelector("#q") ? searchForm.querySelector("#q").value.trim() : "";
location.href = "/entries" + (q ? "?q=" + encodeURIComponent(q) : "");
});
}
var randomBtn = document.getElementById("random-btn");
if (randomBtn) {
randomBtn.addEventListener("click", function () {
location.href = "/random";
});
}
var navToggle = document.querySelector(".nav-toggle");
if (navToggle) {
navToggle.addEventListener("click", function () {
var bar = document.querySelector(".topbar");
var open = bar.classList.toggle("menu-open");
navToggle.setAttribute("aria-expanded", open ? "true" : "false");
});
}
var railToggle = document.getElementById("rail-toggle");
if (railToggle) {
railToggle.addEventListener("click", function () {
document.getElementById("filter-rail").classList.toggle("open");
});
}
document.querySelectorAll(".tree-row[data-tree]").forEach(function (row) {
row.addEventListener("click", function () {
var target = document.getElementById(row.getAttribute("data-tree"));
if (!target) return;
var open = target.classList.toggle("open");
row.setAttribute("aria-expanded", open ? "true" : "false");
});
});
document.querySelectorAll(".view-tabs button[data-view]").forEach(function (tab) {
tab.addEventListener("click", function () {
document
.querySelectorAll(".view-tabs button[data-view]")
.forEach(function (t) { t.setAttribute("aria-selected", "false"); });
tab.setAttribute("aria-selected", "true");
var view = tab.getAttribute("data-view");
document.querySelectorAll("[data-view-panel]").forEach(function (p) {
p.hidden = p.getAttribute("data-view-panel") !== view;
});
});
});
document.querySelectorAll(".filter-auto input[type=checkbox], .filter-auto select").forEach(function (el) {
el.addEventListener("change", function () {
el.form && el.form.submit();
});
});
document.querySelectorAll("[data-eye-toggle]").forEach(function (btn) {
btn.addEventListener("click", function () {
var input = btn.closest(".pwd-field, .ai-key-field")
? btn.closest(".pwd-field, .ai-key-field").querySelector("input")
: null;
if (!input) return;
var show = input.type === "password";
input.type = show ? "text" : "password";
btn.setAttribute("aria-label", show ? "隐藏密码" : "显示密码");
if (show) btn.setAttribute("data-show", "");
else btn.removeAttribute("data-show");
});
});
var loginForm = document.getElementById("login-form");
if (loginForm) {
loginForm.addEventListener("submit", function (e) {
e.preventDefault();
if (!loginForm.reportValidity()) return;
postJson("/api/admin/login", {
username: loginForm.username.value,
password: loginForm.password.value,
remember: loginForm.remember ? loginForm.remember.checked : true,
})
.then(function () {
toast("登录成功,正在进入管理台…");
setTimeout(function () { location.href = "/admin"; }, 400);
})
.catch(function (err) { toast(err.message); });
});
}
var commentForm = document.querySelector(".comment-form[data-entry-id]");
if (commentForm) {
commentForm.addEventListener("submit", function (e) {
e.preventDefault();
if (!commentForm.reportValidity()) return;
postJson("/api/comments", {
entryId: Number(commentForm.getAttribute("data-entry-id")),
authorName: commentForm.querySelector("[name=authorName]").value,
body: commentForm.querySelector("[name=body]").value,
})
.then(function () {
toast("评论已发布");
setTimeout(function () { location.reload(); }, 500);
})
.catch(function (err) { toast(err.message); });
});
}
var feedbackForm = document.querySelector(".feedback[data-feedback]");
if (feedbackForm) {
feedbackForm.addEventListener("submit", function (e) {
e.preventDefault();
if (!feedbackForm.reportValidity()) return;
postJson("/api/feedback", { body: feedbackForm.querySelector("textarea").value })
.then(function () {
toast("已收到,感谢反馈");
feedbackForm.reset();
})
.catch(function (err) { toast(err.message); });
});
}
})();