v1.0.4: 基本搜索功能 - 按网址/标题/任务名子串匹配查找已爬内容, 支持跳转预览

This commit is contained in:
2026-08-11 15:21:31 +08:00
parent e70a3a877f
commit e8541a8545
5 changed files with 164 additions and 2 deletions
+63
View File
@@ -443,6 +443,69 @@ def api_task_probe(tid):
return jsonify(result)
# ---------------- API: 搜索 ----------------
@app.route("/api/search")
def api_search():
"""基本搜索: 对任务名/网址/标题做子串匹配 (仅遍历本地内存数据, 轻量)"""
q = (request.args.get("q") or "").strip()
if not q:
return jsonify({"q": q, "count": 0, "results": []})
ql = q.lower()
results = []
seen = set()
for task in store.load_tasks():
if task.get("deleted_at"):
continue # 回收站任务不参与搜索
auto = task.get("auto") or {}
task_hit = (
ql in (task.get("name") or "").lower()
or any(ql in u.lower() for u in task.get("urls", []))
or ql in ((auto.get("seed_url") or "").lower())
)
for run in store.get_runs(task["id"]):
for r in run.get("results", []):
url = r.get("url") or ""
title = r.get("title") or ""
if ql not in url.lower() and ql not in title.lower():
continue
key = (task["id"], run.get("id"), url)
if key in seen:
continue
seen.add(key)
results.append({
"type": "page",
"task_id": task["id"],
"task_name": task.get("name", ""),
"mode": task.get("mode", ""),
"run_id": run.get("id", ""),
"run_status": run.get("status", ""),
"url": url,
"title": title,
"status": r.get("status", ""),
"crawl_time": r.get("crawl_time", ""),
"html_file": r.get("html_file", ""),
"txt_file": r.get("txt_file", ""),
"meta_file": r.get("meta_file", ""),
"images": len(r.get("images", []) or []),
})
if len(results) >= 100:
break
if len(results) >= 100:
break
if task_hit and len(results) < 100:
results.append({
"type": "task",
"task_id": task["id"],
"task_name": task.get("name", ""),
"mode": task.get("mode", ""),
"urls_count": len(task.get("urls", [])),
"created_at": task.get("created_at", ""),
"seed_url": auto.get("seed_url", ""),
})
return jsonify({"q": q, "count": len(results), "results": results})
# ---------------- API: 运行记录与文件 ----------------
@app.route("/api/runs/<rid>")