init: Search Hub - 统一多搜索引擎聚合服务

This commit is contained in:
2026-05-09 18:46:05 +08:00
commit 81d726179c
27 changed files with 3179 additions and 0 deletions

67
templates/admin.html Normal file
View File

@@ -0,0 +1,67 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Search Hub - 管理面板</title>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/style.css">
</head>
<body>
<div class="container">
<div class="navbar">
<a href="/" class="navbar-brand">Search Hub</a>
<div class="navbar-links">
<a href="/web">返回搜索</a>
</div>
</div>
<div class="admin-layout">
<!-- 左列: 服务状态 + 搜索源 -->
<div>
<!-- 服务状态 -->
<div class="admin-section">
<div class="admin-section-title">服务状态</div>
<div class="info-chip">状态: <span id="hub-status"></span></div>
<div class="info-chip">版本: <span id="hub-version"></span></div>
<div class="info-chip">搜索历史: <span id="hub-history"></span></div>
</div>
<!-- 服务用量 -->
<div class="admin-section">
<div class="admin-section-title">服务用量</div>
<div id="usage-list">
<div class="info-chip">加载中...</div>
</div>
</div>
<!-- 搜索源列表 -->
<div class="admin-section">
<div class="admin-section-title">搜索源配置</div>
<div id="sources-list"></div>
</div>
</div>
<!-- 右列: API 文档 -->
<div class="admin-section" id="api-section">
<div class="admin-section-title">API 调用方式</div>
<div id="api-docs-list"></div>
</div>
</div>
</div>
<!-- 编辑弹窗 -->
<div id="edit-modal" class="modal-overlay" style="display:none">
<div class="modal-box">
<h2 id="edit-modal-title">编辑配置</h2>
<div id="edit-modal-body"></div>
<div class="modal-actions">
<button class="btn-ghost danger" onclick="closeEditModal()">取消</button>
<button class="btn-primary" id="save-btn" onclick="saveConfig()">保存</button>
</div>
</div>
</div>
<script src="/static/js/admin.js"></script>
</body>
</html>

83
templates/index.html Normal file
View File

@@ -0,0 +1,83 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Search Hub</title>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/style.css">
<style>
.initial-title { display: block; }
.initial-title.has-results { display: none; }
.compact-title { display: none; }
.compact-title.has-results { display: block; }
</style>
</head>
<body>
<div class="container">
<!-- 顶部导航 -->
<div class="navbar">
<a href="/" class="navbar-brand">Search Hub</a>
<div class="navbar-links">
<a href="/admin">管理面板</a>
</div>
</div>
<!-- 搜索区域 -->
<div class="search-section" id="search-section">
<div class="search-title" id="search-title">Search Hub</div>
<div class="search-box">
<input type="text" id="search-input" placeholder="搜索..." autofocus>
<button id="search-btn">搜索</button>
<button id="summarize-btn" class="summarize-btn-inline">AI 总结</button>
</div>
<div class="source-bar">
<span class="source-label">搜索源:</span>
<span class="source-tag source-active" data-source="auto">自动</span>
{% for s in sources if s.name not in ('ai',) %}
<span class="source-tag {% if not s.available %}source-disabled{% endif %}"
data-source="{{ s.name }}"
{% if not s.available %}title="不可用"{% endif %}>
{{ s.display_name }}
</span>
{% endfor %}
</div>
</div>
<!-- 搜索历史 -->
<div id="history-section">
<div id="history-list" class="d-flex flex-wrap gap-2 justify-content-center"></div>
</div>
<!-- 状态 -->
<div id="status-bar"></div>
<!-- 加载中(初始隐藏) -->
<div id="loading" style="display:none">搜索中<span class="typing-indicator"><span></span><span></span><span></span></span></div>
<!-- AI总结区域 — 在结果上方 -->
<div id="summary-section">
<div class="summary-card">
<div class="summary-header">AI 综合总结</div>
<div id="summary-content" class="summary-content">
<div class="summary-input-placeholder" id="summary-placeholder">
<div class="typing-indicator">
<span></span><span></span><span></span>
</div>
&nbsp;AI 总结中...
</div>
</div>
<div id="summary-meta" class="summary-meta"></div>
</div>
</div>
<!-- 搜索结果 -->
<div id="results-section"></div>
<!-- 空状态 -->
<div id="empty-state">暂无搜索结果</div>
</div>
<script src="/static/js/app.js"></script>
</body>
</html>