This commit is contained in:
2026-04-27 01:56:43 +08:00
parent dfb5fe0c89
commit d4378afbc9
2 changed files with 98 additions and 55 deletions

View File

@@ -764,7 +764,7 @@
<button type="button" class="btn-ghost" data-open="config">环境配置</button>
<button type="button" class="btn-ghost" data-open="logs">运行日志</button>
{% if console_authed %}
<form method="post" action="/auth/console/logout" style="margin:0;">
<form method="post" action="{{ app_url('/auth/console/logout') }}" style="margin:0;">
<button type="submit" class="btn-ghost">退出验证</button>
</form>
{% endif %}
@@ -859,16 +859,16 @@
<p class="alert-warn" role="alert">客户端:{{ error }}</p>
{% endif %}
<div class="btn-row">
<form method="post" action="/start">
<form method="post" action="{{ app_url('/start') }}">
<button class="btn-primary" type="submit">初始化 / 连接 Telegram</button>
</form>
<form method="post" action="/stop">
<form method="post" action="{{ app_url('/stop') }}">
<button class="btn-danger" type="submit">断开 Telegram</button>
</form>
<form method="post" action="/jobs/continuous/start">
<form method="post" action="{{ app_url('/jobs/continuous/start') }}">
<button class="btn-primary" type="submit">启动持续抓取(含心跳)</button>
</form>
<form method="post" action="/jobs/continuous/stop">
<form method="post" action="{{ app_url('/jobs/continuous/stop') }}">
<button class="btn-danger" type="submit">停止持续抓取</button>
</form>
</div>
@@ -892,14 +892,14 @@
<strong>添加</strong><code>@用户名</code><code>-100…</code><code>https://t.me/xxx</code>
不支持仅靠群内显示标题。
</p>
<form method="post" action="/channels/add" class="form-inline">
<form method="post" action="{{ app_url('/channels/add') }}" class="form-inline">
<input type="text" name="channel_spec" placeholder="@channel 或 -100… 或 https://t.me/…" aria-label="要添加的频道" />
<button class="btn-primary" type="submit">添加</button>
</form>
<p class="hint">
<strong>移除</strong><code>all</code><code>1,2</code><code>-100…</code><code>@用户名</code> / t.me须已在监控中
</p>
<form method="post" action="/channels/remove" class="form-inline">
<form method="post" action="{{ app_url('/channels/remove') }}" class="form-inline">
<input type="text" name="channel_spec" placeholder="all 或 1,2 或 -100… 或 @name" aria-label="要移除的频道" />
<button class="btn-danger" type="submit">移除</button>
</form>
@@ -907,15 +907,15 @@
<div class="ops-block">
<h4>任务(抓取 / 导出 / 补媒体)</h4>
<p class="hint">范围:<code>all</code><code>1,3</code><code>-100…</code> 或已在监控的 <code>@</code> / 链接。</p>
<form method="post" action="/jobs/scrape" class="form-inline">
<form method="post" action="{{ app_url('/jobs/scrape') }}" class="form-inline">
<input type="text" name="selection" value="all" aria-label="抓取范围" />
<button class="btn-primary" type="submit">开始抓取</button>
</form>
<form method="post" action="/jobs/export" class="form-inline">
<form method="post" action="{{ app_url('/jobs/export') }}" class="form-inline">
<input type="text" name="selection" value="all" aria-label="导出范围" />
<button class="btn-primary" type="submit">导出 CSV+JSON</button>
</form>
<form method="post" action="/jobs/rescrape" class="form-inline">
<form method="post" action="{{ app_url('/jobs/rescrape') }}" class="form-inline">
<input type="text" name="selection" value="all" aria-label="补抓范围" />
<button class="btn-primary" type="submit">补抓媒体</button>
</form>
@@ -946,7 +946,7 @@
<div>
<p class="hint">账号可见频道:勾选后加入监控。标题包含配置项「账号列表隐藏」中任一子串的会话不会出现在此列表(默认隐藏含「远程-到岗-技术招聘」的群,避免选到自有招聘群)。</p>
{% if account_channels %}
<form method="post" action="/channels/add-selected" class="account-pick-form">
<form method="post" action="{{ app_url('/channels/add-selected') }}" class="account-pick-form">
<div class="account-pick-toolbar">
<button type="button" class="text-btn" id="account-select-all">全选可选项</button>
<button type="button" class="text-btn" id="account-select-none">全不选</button>
@@ -988,7 +988,7 @@
</div>
<div class="modal-body">
<p class="hint">保存后建议断开并重新连接 Telegram。</p>
<form method="post" action="/config" class="config-form">
<form method="post" action="{{ app_url('/config') }}" class="config-form">
{% for f in fields %}
{% if f.key in binary_env_keys %}
<div class="field-row field-row-toggle">
@@ -1037,6 +1037,21 @@
<script src="https://cdn.jsdelivr.net/npm/echarts@5.5.1/dist/echarts.min.js"></script>
<script>
window.__URL_PREFIX__ = {{ url_prefix|tojson }};
function appPath(p) {
p = p.startsWith("/") ? p : ("/" + p);
var pre = window.__URL_PREFIX__ || "";
return pre ? (pre + p) : p;
}
function appHomeWithQuery(tail) {
var pre = window.__URL_PREFIX__ || "";
var base = pre ? (pre + "/") : "/";
base = base.replace(/\/*$/, "/");
if (!tail) return base;
if (tail.charAt(0) !== "?") tail = "?" + tail;
return base + tail;
}
function formatInt(n) {
if (n == null || isNaN(n)) return "—";
return Number(n).toLocaleString("zh-CN");
@@ -1049,7 +1064,7 @@
async function consoleAuthStatus() {
try {
var r = await fetch("/auth/console/status", { credentials: "same-origin" });
var r = await fetch(appPath("/auth/console/status"), { credentials: "same-origin" });
if (!r.ok) return false;
var j = await r.json();
return j.ok === true;
@@ -1086,7 +1101,7 @@
}
var pw = authPwd ? authPwd.value : "";
try {
var res = await fetch("/auth/console/login", {
var res = await fetch(appPath("/auth/console/login"), {
method: "POST",
headers: { "Content-Type": "application/json" },
credentials: "same-origin",
@@ -1102,7 +1117,7 @@
pendingOpenDlgId = null;
}
if (authPwd) authPwd.value = "";
window.location.href = "/" + tail;
window.location.href = appHomeWithQuery(tail);
} else {
if (authErr) {
authErr.textContent = (data && data.error) ? data.error : "验证失败";
@@ -1266,7 +1281,7 @@
var qs = new URLSearchParams({ days: String(days) });
if (kw) qs.set("keywords", kw);
try {
var res = await fetch("/api/stats/overview?" + qs.toString());
var res = await fetch(appPath("/api/stats/overview") + "?" + qs.toString());
if (!res.ok) throw new Error("HTTP " + res.status);
var data = await res.json();
applyStats(data);
@@ -1307,7 +1322,7 @@
async function refreshStatus() {
try {
var statusResp = await fetch("/api/jobs/status", { credentials: "same-origin" });
var statusResp = await fetch(appPath("/api/jobs/status"), { credentials: "same-origin" });
if (statusResp.ok) {
var status = await statusResp.json();
var runningEl = document.getElementById("job-running");
@@ -1355,7 +1370,7 @@
}
}
var channelsResp = await fetch("/api/channels/monitored", { credentials: "same-origin" });
var channelsResp = await fetch(appPath("/api/channels/monitored"), { credentials: "same-origin" });
if (channelsResp.ok) {
var payload = await channelsResp.json();
var wrap = document.getElementById("monitored-list");