246 lines
16 KiB
HTML
246 lines
16 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
<title>管理台 · Awesome Index</title>
|
||
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect x='4' y='4' width='20' height='20' rx='5' fill='%232436E8'/%3E%3Crect x='10' y='10' width='18' height='18' rx='5' fill='none' stroke='%23FF4D2E' stroke-width='2.5'/%3E%3C/svg%3E" />
|
||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||
<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,800&family=Hanken+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&family=Noto+Sans+SC:wght@400;500;700;900&display=swap" rel="stylesheet" />
|
||
<link rel="stylesheet" href="assets/css/main.css" />
|
||
</head>
|
||
<body>
|
||
|
||
<header class="topbar">
|
||
<div class="container topbar-inner">
|
||
<a class="brand" href="index.html">
|
||
<span class="brand-mark"><i></i><i></i></span>
|
||
AWESOME·INDEX
|
||
</a>
|
||
<nav class="topnav" aria-label="主导航">
|
||
<a href="index.html">首页</a>
|
||
<a href="list.html">浏览全部</a>
|
||
<a href="admin.html" aria-current="page">管理入口</a>
|
||
</nav>
|
||
<button class="btn btn-sm nav-toggle" aria-expanded="false">菜单</button>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="admin-shell">
|
||
<!-- 侧栏 -->
|
||
<nav class="admin-nav" aria-label="管理分区">
|
||
<h4>管理台</h4>
|
||
<button type="button" data-section="sec-accounts" aria-current="true">账号管理</button>
|
||
<button type="button" data-section="sec-tags" aria-current="false">标签管理</button>
|
||
<button type="button" data-section="sec-content" aria-current="false">内容管理</button>
|
||
<button type="button" data-section="sec-comments" aria-current="false">评论管理</button>
|
||
<button type="button" data-section="sec-sources" aria-current="false">内容源</button>
|
||
</nav>
|
||
|
||
<main class="admin-main">
|
||
<!-- 账号管理 -->
|
||
<section id="sec-accounts">
|
||
<p class="anno">// table: accounts · role: admin | editor | viewer</p>
|
||
<h1>账号管理</h1>
|
||
<p class="admin-desc">管理可以登录管理台的账号与角色。</p>
|
||
<div class="admin-toolbar">
|
||
<input class="input" type="search" placeholder="搜索用户名…" />
|
||
<div class="spacer"></div>
|
||
<button class="btn btn-primary btn-sm" type="button">新增账号</button>
|
||
</div>
|
||
<table class="data-table">
|
||
<thead><tr><th>用户名</th><th>角色</th><th>状态</th><th>最后登录</th><th style="text-align:right">操作</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><b>admin</b></td><td>admin</td><td><span class="status-pill status-ok">active</span></td><td class="mono">2026-08-26 09:14</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm" type="button">编辑</button><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除账号">删除</button></div></td></tr>
|
||
<tr><td><b>editor.lin</b></td><td>editor</td><td><span class="status-pill status-ok">active</span></td><td class="mono">2026-08-25 21:40</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm" type="button">编辑</button><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除账号">删除</button></div></td></tr>
|
||
<tr><td><b>ai-ingest</b></td><td>editor(AI 接口)</td><td><span class="status-pill status-warn">受限</span></td><td class="mono">2026-08-26 07:02</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm" type="button">编辑</button><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除账号">删除</button></div></td></tr>
|
||
</tbody>
|
||
</table>
|
||
</section>
|
||
|
||
<!-- 标签管理 -->
|
||
<section id="sec-tags" class="active">
|
||
<p class="anno">// tree: tags · 支持 嵌套 / 移动 / 删除(删除前需确认子标签归属)</p>
|
||
<h1>标签管理</h1>
|
||
<p class="admin-desc">拖拽调整层级与顺序;删除父标签时其子标签自动上移一级。</p>
|
||
<div class="tagmgr">
|
||
<div class="panel-box">
|
||
<h3>标签树 <span class="mono" style="font-weight:400;font-size:12px;color:var(--ink-dim)">(点击 ▶ 展开)</span></h3>
|
||
<ul class="tag-tree">
|
||
<li>
|
||
<button class="tree-row" type="button" data-tree="t-lang" aria-expanded="true"><span class="tw">▶</span> 编程语言 <span class="cnt">96</span></button>
|
||
<ul class="tag-children open" id="t-lang">
|
||
<li><button class="tree-row" type="button" data-tree="t-js" aria-expanded="true"><span class="tw">▶</span> JavaScript / TS <span class="cnt">41</span></button>
|
||
<ul class="tag-children open" id="t-js">
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> Node.js <span class="cnt">22</span></button></li>
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> Deno <span class="cnt">5</span></button></li>
|
||
</ul>
|
||
</li>
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> Rust <span class="cnt">28</span></button></li>
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> Go <span class="cnt">19</span></button></li>
|
||
</ul>
|
||
</li>
|
||
<li>
|
||
<button class="tree-row" type="button" data-tree="t-form" aria-expanded="false"><span class="tw">▶</span> 形态 <span class="cnt">58</span></button>
|
||
<ul class="tag-children" id="t-form">
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> CLI <span class="cnt">31</span></button></li>
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> 自托管 <span class="cnt">18</span></button></li>
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> Docker 就绪 <span class="cnt">9</span></button></li>
|
||
</ul>
|
||
</li>
|
||
<li><button class="tree-row" type="button"><span class="tw"></span> AI 相关 <span class="cnt">34</span></button></li>
|
||
</ul>
|
||
</div>
|
||
<div class="panel-box">
|
||
<h3>编辑标签:<span class="mono" style="font-size:13px">JavaScript / TS</span></h3>
|
||
<form data-demo-submit="标签已保存">
|
||
<p style="font-size:13px;color:var(--ink-dim);margin-bottom:6px">名称</p>
|
||
<input class="input" value="JavaScript / TS" style="margin-bottom:14px" />
|
||
<p style="font-size:13px;color:var(--ink-dim);margin-bottom:6px">上级标签</p>
|
||
<select class="select" style="width:100%;margin-bottom:14px">
|
||
<option>编程语言</option>
|
||
<option>— 移到顶层 —</option>
|
||
</select>
|
||
<p style="font-size:13px;color:var(--ink-dim);margin-bottom:6px">排序权重</p>
|
||
<input class="input" value="10" type="number" style="margin-bottom:18px;width:120px" />
|
||
<div style="display:flex;gap:10px">
|
||
<button class="btn btn-primary btn-sm" type="submit">保存修改</button>
|
||
<button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除标签">删除此标签</button>
|
||
</div>
|
||
</form>
|
||
<hr style="border:0;border-top:1.5px solid var(--ink-faint);margin:20px 0" />
|
||
<form style="display:flex;gap:10px" data-demo-submit="新标签已创建">
|
||
<input class="input" placeholder="新增子标签…" required />
|
||
<button class="btn btn-sm" type="submit">新增到该组</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 内容管理 -->
|
||
<section id="sec-content" hidden>
|
||
<p class="anno">// table: entries · 状态 active | greyed | pending</p>
|
||
<h1>内容管理</h1>
|
||
<p class="admin-desc">全部收录条目。灰掉 = 暂不可见但保留数据;删除为物理删除,需二次确认。</p>
|
||
<div class="stat-strip">
|
||
<div class="stat-cell"><b>1,284</b><span>总条目</span></div>
|
||
<div class="stat-cell"><b>1,241</b><span>active</span></div>
|
||
<div class="stat-cell"><b>31</b><span>greyed(已灰掉)</span></div>
|
||
<div class="stat-cell"><b>12</b><span>pending 待核验</span></div>
|
||
</div>
|
||
<div class="admin-toolbar">
|
||
<input class="input" type="search" placeholder="搜索标题 / 描述…" value="" />
|
||
<select class="select"><option>全部类型</option><option>工具</option><option>微服务</option><option>SaaS</option><option>网站</option><option>应用</option><option>脚本</option><option>插件</option></select>
|
||
<select class="select"><option>全部状态</option><option>active</option><option>greyed</option><option>pending</option></select>
|
||
<div class="spacer"></div>
|
||
<button class="btn btn-primary btn-sm" type="button">新增条目</button>
|
||
</div>
|
||
<table class="data-table">
|
||
<thead><tr><th>标题</th><th>类型</th><th>来源</th><th>状态</th><th>更新时间</th><th style="text-align:right">操作</th></tr></thead>
|
||
<tbody>
|
||
<tr>
|
||
<td><b>ripgrep</b><br /><span class="mono" style="font-size:11px;color:var(--ink-dim)">Rust · CLI</span></td>
|
||
<td>工具</td><td>人工</td><td><span class="status-pill status-ok">active</span></td><td class="mono">2026-08-23</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm" type="button">编辑</button><button class="btn btn-sm" type="button" data-demo-danger="原型演示:未灰掉条目">灰掉</button><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除条目">删除</button></div></td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>Uptime Kuma</b><br /><span class="mono" style="font-size:11px;color:var(--ink-dim)">JavaScript · 自托管</span></td>
|
||
<td>应用</td><td>人工</td><td><span class="status-pill status-ok">active</span></td><td class="mono">2026-08-19</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm" type="button">编辑</button><button class="btn btn-sm" type="button" data-demo-danger="原型演示:未灰掉条目">灰掉</button><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除条目">删除</button></div></td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>free-stock-cdn</b><br /><span class="mono" style="font-size:11px;color:var(--ink-dim)">AI 录入 · 待核验</span></td>
|
||
<td>网站</td><td>AI 接口</td><td><span class="status-pill status-warn">pending</span></td><td class="mono">2026-08-25</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm" type="button">编辑</button><button class="btn btn-sm" type="button">通过</button><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除条目">删除</button></div></td>
|
||
</tr>
|
||
<tr>
|
||
<td><b>old-torrent-helper</b><br /><span class="mono" style="font-size:11px;color:var(--ink-dim)">Shell · 脚本</span></td>
|
||
<td>脚本</td><td>人工</td><td><span class="status-pill status-dim">greyed</span></td><td class="mono">2026-06-30</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm" type="button">编辑</button><button class="btn btn-sm" type="button">恢复</button><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除条目">删除</button></div></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</section>
|
||
|
||
<!-- 评论管理 -->
|
||
<section id="sec-comments" hidden>
|
||
<p class="anno">// table: comments · 先审后删</p>
|
||
<h1>评论管理</h1>
|
||
<p class="admin-desc">处理举报与垃圾评论;删除会同时从 DuckDB 中移除记录。</p>
|
||
<div class="admin-toolbar">
|
||
<select class="select"><option>全部评论</option><option>待处理举报</option><option>最新发布</option></select>
|
||
<div class="spacer"></div>
|
||
<input class="input" type="search" placeholder="搜索评论内容…" />
|
||
</div>
|
||
<table class="data-table">
|
||
<thead><tr><th>评论者</th><th>内容</th><th>所属条目</th><th>时间</th><th style="text-align:right">操作</th></tr></thead>
|
||
<tbody>
|
||
<tr><td><b>kentang</b></td><td style="max-width:280px">配合 fzf 之后基本回不去原生 grep 了…</td><td class="mono">ripgrep</td><td class="mono">2026-08-20</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除评论">删除</button></div></td></tr>
|
||
<tr><td><b>spam-bot-7</b></td><td style="max-width:280px">免费领取!!!点我主页……</td><td class="mono">Uptime Kuma</td><td class="mono">2026-08-24</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除评论">删除</button></div></td></tr>
|
||
<tr><td><b>moss</b></td><td style="max-width:280px">Windows 下也稳……</td><td class="mono">ripgrep</td><td class="mono">2026-08-14</td>
|
||
<td><div class="row-actions"><button class="btn btn-sm btn-danger" type="button" data-demo-danger="原型演示:未删除评论">删除</button></div></td></tr>
|
||
</tbody>
|
||
</table>
|
||
</section>
|
||
|
||
<!-- 内容源 -->
|
||
<section id="sec-sources" hidden>
|
||
<p class="anno">// sources: human editor + ai endpoint · 灰掉策略可按来源配置</p>
|
||
<h1>内容源管理</h1>
|
||
<p class="admin-desc">控制数据从哪里进来。人工录入始终可用;AI 接口录入可随时关闭或限制为「仅待审核」。</p>
|
||
<div style="display:grid;gap:16px;margin-top:24px;max-width:720px">
|
||
<div class="panel-box">
|
||
<h3 style="display:flex;align-items:center;gap:10px"><span class="dot"></span> 人工录入</h3>
|
||
<p style="font-size:13.5px;color:var(--ink-dim)">管理员与编辑在管理台直接 新增 / 修改 / 灰掉 / 删除 条目。所有改动写入审计日志。</p>
|
||
<div class="switchline" style="border-bottom:0">
|
||
本月人工改动
|
||
<span class="mono">47 次 · 最近 2026-08-26 09:14</span>
|
||
</div>
|
||
</div>
|
||
<div class="panel-box">
|
||
<h3 style="display:flex;align-items:center;gap:10px"><span class="dot dot-off"></span> AI 接口录入</h3>
|
||
<div class="switchline">
|
||
启用 AI 录入接口
|
||
<label class="toggle"><input type="checkbox" checked aria-label="启用 AI 录入接口" /><i></i></label>
|
||
</div>
|
||
<div class="switchline">
|
||
新条目先进入待审核(不直接可见)
|
||
<label class="toggle"><input type="checkbox" checked aria-label="待审核开关" /><i></i></label>
|
||
</div>
|
||
<div class="switchline">
|
||
自动灰掉:仓库 404 / 半年无核验通过
|
||
<label class="toggle"><input type="checkbox" aria-label="自动灰掉开关" /><i></i></label>
|
||
</div>
|
||
<div class="switchline" style="border-bottom:0">
|
||
接口密钥
|
||
<span class="mono">ak_live_••••••••4f2a <button class="copy-btn" style="color:var(--ink);border-color:var(--ink)" type="button" data-copy="ak_live_demo_key">复制</button></span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</main>
|
||
</div>
|
||
|
||
<footer class="footer on-panel">
|
||
<div class="container">
|
||
<div class="footer-bar" style="border-top:0;padding-top:26px">
|
||
<span>© 2026 honor3.com · Awesome Index Admin</span>
|
||
<span style="display:flex;gap:22px">
|
||
<a href="login.html" style="color:inherit;text-decoration:none">退出登录 →</a>
|
||
<span class="mono">db: duckdb · env: local</span>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
|
||
<div class="toast" role="status"></div>
|
||
<script src="assets/js/main.js"></script>
|
||
</body>
|
||
</html>
|