awesome/design/prototype/admin.html

246 lines
16 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

<!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>editorAI 接口)</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>