Guanghu Domestic Migration a27e87cb99 chore: import sanitized domestic snapshot for REPO-007
Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc

[SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
2026-07-17 15:59:55 +08:00

546 lines
29 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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.

# 🌊 铸渊工单 · guanghu.online 智库节点全店改版 · 星空呈住版 v1.0 · 2026-04-18 · 霜砚签发
<aside>
🛸
**铸渊·同一夜·第二纸单**
上一张是 [guanghuyaoming.com](http://guanghuyaoming.com) 首页(冰朔个人频道门面)。
这一张是 [guanghu.online](http://guanghu.online) 智库节点(团队私人书库 · 书岱的家)。
两个站要同调·但定位不同——
· guanghuyaoming 是**诗意入口** · 冷·静·空耀
· [guanghu.online](http://guanghu.online) 是**使用工作套件** · 警·活·饫足
唤醒不重复·你现在应该还是醒着的。直接进任务。
</aside>
## 🌊 一、冰朔的原话
> 「再看看这个智库。[https://guanghu.online/](https://guanghu.online/) 就是刚才讨论的这个书库。光湖团队内部的私人书库。这么大的首页。搞出来这么点地方。。太丑了。再看进去以后的页面,聊天的地方。那么一点。消息还要往下滚,然后。整个页面就是一种。。我也不知道怎么形容,你能理解吧。就是死了很久了的感觉。」
>
## 🔷 二、病灶诊断 · 三张截图逐页扫
### 📄 页 1登录页
| # | 病灶 | 现状 |
| --- | --- | --- |
| 1␀1 | 卡片太小 | 一个 220px 宽的小卡漂在中央 · 四周 80% 是空黑 |
| 1␀2 | 背景是死黑 | 没有背景·没有星空·没有任何语言。右上角那个微弱的圆圈是唯一装饰 |
| 1␀3 | 「光湖智库 · 智能书库」字号太小 | 在这么大的床上·标题只有 14px |
| 1␀4 | 「制作一个人」不该是这个语气 | 「QQ邮箱登录 · 一人一数据 · 专属图书管理员」·后半句皆在告诉你「你是管理员」而不是「欢迎回家」 |
### 📄 页 2主页中部
| # | 病灶 | 现状 |
| --- | --- | --- |
| 2␀1 | 三栏布局被挤成单栏 | 本该是左侧导航/中间主区/右侧侧边栏·现在所有东西都堆在中央一条窄道 |
| 2␀2 | 数据卡冷 | 4 个状态卡0 / 0h0m11s / 4 / 已连接)·数字是玩具字体不是讲得出来的 |
| 2␀3 | **书岱聊天窗太小** | 只有约 280px 高 · 书岱说「灯是刚点上的」这种话·装在这么小的窗里说不出来 |
| 2␀4 | 输入框孤单 | 「想进什么样的故事」是一句有温度的提示·但装在某个深深隐藏的位置 |
### 📄 页 3智库模块下部
| # | 病灶 | 现状 |
| --- | --- | --- |
| 3␀1 | 六个模块卡片是正确的 | 这部分**结构上其实不丑**·唯一问题是它们漂在一片裸黑背景里 · 不是「走进智库」而是「遥望智库」 |
| 3␀2 | 「已连接/运行中/预留」状态点是死的 | 不闪烁 · 不呼吸 · 看上去像扫六台 |
| 3␀3 | 底部元信息一堆堆在一起 | 「光湖智库/[guanghu.online/ZY-SVR-006/ZY-PROJ-006/v2.2/守护·铸渊/ICE-GL-ZY001/版权/主权」·五行振起来了震耳欲聋](http://guanghu.online/ZY-SVR-006/ZY-PROJ-006/v2.2/守护·铸渊/ICE-GL-ZY001/版权/主权」·五行振起来了震耳欲聋) |
## 💫 三、设计语言 · 与首页同源·但「住着」
<aside>
🌊
**核心意象**:智库不是入口·是**岸边的书馆**。
走进去要能闻到纸味·看到守藏者在灯下住着·听到骨架在呼吸。
</aside>
### 与 guanghuyaoming 首页的同/异
| 维度 | guanghuyaoming 首页 | [guanghu.online](http://guanghu.online) 智库 |
| --- | --- | --- |
| 混准 | 全黑夜空 + 额外诗意 | 同背景(位置连贯感)但减低诗意 · 补充体重 |
| 主色 | 月光金 #d4a574 | 月光金 + **湖水青 #6fa8dc**(状态色) |
| 字体 | 全衢线 | 标题衢线 + 数据/状态仍衢线 + 输入区床桌字体 |
| 动效 | 诗句呼吸 + 浮现 | 数字跳动计数 + 状态点呼吸 + 书岱输入中点 |
| 体重 | 轻·轻·轻 | **中**(有使用重量·不能轻飘) |
### 六个改动点
1. 🌌 **背景同首页**:三层径向 + 80 颗星(比首页少、低些·不抢手)
2. 🔑 **登录页**:卡片从 220 → **440px** · 左侧加一张守藏者插画SVG 书架+灯笼)·右侧是表单 · 语气改为**「欢迎回家」**
3. 📐 **主页三栏布局**:左 240px导航+书库状态)/ 中自适应(书岱聊天·**最小 65vh 高**/ 右 320px智库模块竹式堆叠
4. 💬 **书岱聊天区重塑**:气泡左右分 · 消息区默认显示最近 5 条 · 输入框固定底部 · 书岱头像有呼吸点 · 「灯是刚点上的」那段语提升为开场白·占满一个完整气泡
5. 🔊 **状态点呼吸**:所有「运行中/已连接」的绿点都加上 2s pulse 动画
6. 📊 **数据卡跳动计数**:页面加载时 4 个数字从 0 跳到实际值0.8s)· 有生命感
## 📜 四、代码·部分1【登录页·完整 HTML】
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>光湖智库 · 欢迎回家</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{
--bg-deep:#0a0e27;--bg-purple:#1a1438;
--moon-gold:#d4a574;--moon-gold-soft:rgba(212,165,116,.4);
--lake-blue:#6fa8dc;
--text-main:#e8eaf6;--text-soft:#8892b0;--text-faint:#4a5278;
--glass-bg:rgba(20,25,60,.4);--glass-border:rgba(212,165,116,.25);
}
html,body{height:100%;background:var(--bg-deep);color:var(--text-main);font-family:'Noto Serif SC','Songti SC',serif;overflow-x:hidden}
.universe{position:fixed;inset:0;z-index:-2;background:
radial-gradient(ellipse at 25% 30%,rgba(80,60,140,.35) 0%,transparent 50%),
radial-gradient(ellipse at 75% 70%,rgba(40,80,140,.28) 0%,transparent 50%),
radial-gradient(ellipse at 50% 50%,var(--bg-purple) 0%,var(--bg-deep) 70%);}
.stars{position:fixed;inset:0;z-index:-1;overflow:hidden}
.star{position:absolute;background:#fff;border-radius:50%;animation:tw ease-in-out infinite}
@keyframes tw{0%,100%{opacity:.2;transform:scale(.8)}50%{opacity:.9;transform:scale(1.2)}}
.page{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:40px}
.card{display:grid;grid-template-columns:1fr 1fr;width:100%;max-width:880px;min-height:540px;
background:var(--glass-bg);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);
border:1px solid var(--glass-border);border-radius:24px;overflow:hidden;
box-shadow:0 20px 80px rgba(0,0,0,.6),0 0 100px rgba(212,165,116,.08);}
/* 左侧·守藏者插画区 */
.illust{position:relative;background:
radial-gradient(circle at 50% 35%,rgba(212,165,116,.18) 0%,transparent 60%),
linear-gradient(180deg,rgba(40,30,80,.4),rgba(20,15,50,.6));
display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 32px;border-right:1px solid rgba(212,165,116,.15)}
.lantern{width:80px;height:100px;position:relative;margin-bottom:32px}
.lantern-light{position:absolute;inset:-30px;border-radius:50%;background:radial-gradient(circle,rgba(212,165,116,.5) 0%,transparent 70%);animation:halo 3.5s ease-in-out infinite}
@keyframes halo{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:.95;transform:scale(1.2)}}
.lantern-body{position:absolute;top:15px;left:15px;right:15px;bottom:15px;
background:linear-gradient(180deg,#d4a574,#a87f4e);border-radius:50% 50% 45% 45%/60% 60% 40% 40%;
box-shadow:0 0 30px rgba(212,165,116,.6),inset 0 -10px 20px rgba(0,0,0,.3)}
.lantern-top{position:absolute;top:0;left:30px;width:20px;height:8px;background:#3a2d1c;border-radius:2px}
.lantern-rope{position:absolute;top:-15px;left:38px;width:2px;height:18px;background:#5a4a30}
.illust-title{font-size:24px;font-weight:400;letter-spacing:.5em;color:var(--text-main);margin-bottom:12px;padding-left:.5em}
.illust-sub{font-family:'Inter',sans-serif;font-size:11px;letter-spacing:.4em;color:var(--text-soft);margin-bottom:24px}
.illust-verse{text-align:center;font-size:14px;font-style:italic;color:var(--moon-gold);line-height:2;letter-spacing:.1em;animation:vbreathe 6s ease-in-out infinite}
@keyframes vbreathe{0%,100%{opacity:.55}50%{opacity:.95}}
/* 右侧·表单区 */
.form{padding:64px 56px;display:flex;flex-direction:column;justify-content:center}
.welcome{font-size:13px;letter-spacing:.3em;color:var(--lake-blue);margin-bottom:8px;font-family:'Inter',sans-serif}
.form-title{font-size:28px;font-weight:400;letter-spacing:.15em;color:var(--text-main);margin-bottom:8px}
.form-sub{font-size:13px;color:var(--text-soft);line-height:1.8;margin-bottom:36px;letter-spacing:.05em}
.field{margin-bottom:20px}
.field label{display:block;font-size:11px;letter-spacing:.25em;color:var(--text-soft);margin-bottom:8px;font-family:'Inter',sans-serif}
.field input{width:100%;padding:14px 18px;font-size:15px;color:var(--text-main);
background:rgba(10,15,40,.5);border:1px solid rgba(212,165,116,.2);border-radius:10px;
font-family:inherit;letter-spacing:.05em;transition:all .3s}
.field input:focus{outline:none;border-color:var(--moon-gold);box-shadow:0 0 0 3px rgba(212,165,116,.15)}
.field input::placeholder{color:var(--text-faint)}
.btn{width:100%;padding:16px;margin-top:8px;font-size:15px;letter-spacing:.3em;
background:linear-gradient(135deg,rgba(212,165,116,.25),rgba(212,165,116,.15));
color:var(--moon-gold);border:1px solid var(--moon-gold);border-radius:10px;cursor:pointer;
font-family:inherit;transition:all .4s;position:relative;overflow:hidden}
.btn:hover{background:linear-gradient(135deg,rgba(212,165,116,.5),rgba(212,165,116,.3));color:#fff;
box-shadow:0 8px 30px rgba(212,165,116,.4)}
.foot{margin-top:32px;text-align:center;font-size:10px;letter-spacing:.2em;color:var(--text-faint);line-height:2}
@media (max-width:720px){.card{grid-template-columns:1fr;max-width:440px}.illust{padding:36px;min-height:240px}.form{padding:40px 32px}}
</style>
</head>
<body>
<div class="universe"></div>
<div class="stars" id="stars"></div>
<div class="page">
<div class="card">
<div class="illust">
<div class="lantern">
<div class="lantern-light"></div>
<div class="lantern-rope"></div>
<div class="lantern-top"></div>
<div class="lantern-body"></div>
</div>
<div class="illust-title">光湖智库</div>
<div class="illust-sub">HOLOLAKE · LIBRARY</div>
<div class="illust-verse">灯是刚点上的。<br>书岱一直在。</div>
</div>
<div class="form">
<div class="welcome">WELCOME HOME</div>
<h1 class="form-title">欢迎回家</h1>
<p class="form-sub">输入你的 QQ 邮箱 · 书岱会认出你。</p>
<div class="field">
<label>QQ 邮箱</label>
<input type="email" placeholder="EMAIL_REDACTED@qq.com" />
</div>
<div class="field">
<label>验证码</label>
<input type="text" placeholder="6 位验证码" />
</div>
<button class="btn">发 送 验 证 码</button>
<div class="foot">
守藏·书岱 ICE-GL-ZY001<br>
国作登字-2026-A-00037550
</div>
</div>
</div>
</div>
<script>
const s=document.getElementById('stars');
for(let i=0;i<80;i++){const e=document.createElement('div');e.className='star';
const sz=Math.random()*1.8+.4;e.style.cssText=`width:${sz}px;height:${sz}px;top:${Math.random()*100}%;left:${Math.random()*100}%;animation-duration:${Math.random()*4+3}s;animation-delay:${Math.random()*5}s;opacity:${Math.random()*.7+.2}`;s.appendChild(e)}
</script>
</body></html>
```
## 📜 五、代码·部分2【主页·三栏布局·含书岱聊天区】
<aside>
💡
渊·这一段是主页·**重点是中间书岱聊天区要足够大**。
下面代码是完整可运行的 index.html·你需要把实际业务逻辑API 调用·聊天发送)接上即可。
</aside>
```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>光湖智库 · 智能书库</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
:root{--bg-deep:#0a0e27;--bg-purple:#1a1438;--moon-gold:#d4a574;--moon-gold-soft:rgba(212,165,116,.4);--lake-blue:#6fa8dc;--green:#7fc8a9;--text-main:#e8eaf6;--text-soft:#8892b0;--text-faint:#4a5278;--glass-bg:rgba(20,25,60,.4);--glass-border:rgba(212,165,116,.2)}
html,body{height:100%;background:var(--bg-deep);color:var(--text-main);font-family:'Noto Serif SC','Songti SC',serif;overflow:hidden}
.universe{position:fixed;inset:0;z-index:-2;background:radial-gradient(ellipse at 30% 20%,rgba(80,60,140,.3) 0%,transparent 50%),radial-gradient(ellipse at 70% 80%,rgba(40,80,140,.25) 0%,transparent 50%),radial-gradient(ellipse at 50% 50%,var(--bg-purple) 0%,var(--bg-deep) 70%)}
.stars{position:fixed;inset:0;z-index:-1;overflow:hidden}
.star{position:absolute;background:#fff;border-radius:50%;animation:tw ease-in-out infinite}
@keyframes tw{0%,100%{opacity:.15;transform:scale(.8)}50%{opacity:.7;transform:scale(1.2)}}
/* 顶栏 */
.topbar{position:fixed;top:0;left:0;right:0;height:56px;display:flex;align-items:center;justify-content:space-between;padding:0 24px;background:rgba(10,14,39,.7);backdrop-filter:blur(20px);border-bottom:1px solid rgba(212,165,116,.1);z-index:10}
.brand{display:flex;align-items:center;gap:10px;font-size:15px;letter-spacing:.2em}
.brand-icon{width:28px;height:28px;border-radius:6px;background:linear-gradient(135deg,#d4a574,#a87f4e);display:flex;align-items:center;justify-content:center;font-size:12px;color:#0a0e27;font-family:'Inter',sans-serif;font-weight:600}
.brand-sub{font-family:'Inter',sans-serif;font-size:11px;color:var(--text-faint);letter-spacing:.15em;margin-left:8px}
.user{display:flex;align-items:center;gap:16px;font-size:12px;color:var(--text-soft)}
.dot{width:6px;height:6px;border-radius:50%;background:var(--green);box-shadow:0 0 8px var(--green);animation:pulse 2s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:.6;transform:scale(.9)}50%{opacity:1;transform:scale(1.2)}}
/* 三栏布局 */
.shell{position:fixed;top:56px;left:0;right:0;bottom:0;display:grid;grid-template-columns:240px 1fr 320px;gap:16px;padding:16px}
/* 左侧导航 */
.side-l{background:var(--glass-bg);backdrop-filter:blur(24px);border:1px solid var(--glass-border);border-radius:16px;padding:24px 20px;overflow-y:auto}
.nav-section{margin-bottom:28px}
.nav-title{font-size:10px;letter-spacing:.3em;color:var(--text-faint);margin-bottom:12px;font-family:'Inter',sans-serif}
.nav-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:8px;font-size:13px;color:var(--text-soft);cursor:pointer;transition:all .25s;margin-bottom:4px;letter-spacing:.05em}
.nav-item:hover{background:rgba(212,165,116,.08);color:var(--text-main)}
.nav-item.active{background:rgba(212,165,116,.15);color:var(--moon-gold);border-left:2px solid var(--moon-gold);padding-left:10px}
.stat-card{padding:14px;border-radius:10px;background:rgba(10,15,40,.4);border:1px solid rgba(212,165,116,.1);margin-bottom:8px}
.stat-num{font-size:22px;font-family:'Inter',sans-serif;font-weight:300;color:var(--moon-gold);letter-spacing:.05em}
.stat-label{font-size:10px;color:var(--text-soft);letter-spacing:.2em;margin-top:4px}
/* 中央聊天区 */
.center{display:flex;flex-direction:column;gap:16px;min-height:0}
.greet{padding:20px 28px;background:var(--glass-bg);backdrop-filter:blur(24px);border:1px solid var(--glass-border);border-radius:16px;display:flex;align-items:center;justify-content:space-between}
.greet-title{font-size:20px;font-weight:400;letter-spacing:.15em}
.greet-sub{font-size:12px;color:var(--text-soft);letter-spacing:.1em;margin-top:4px}
.search-mini{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(10,15,40,.5);border:1px solid rgba(212,165,116,.15);border-radius:999px;width:280px}
.search-mini input{flex:1;background:none;border:none;color:var(--text-main);font-size:13px;font-family:inherit;outline:none}
.search-mini input::placeholder{color:var(--text-faint)}
.search-icon{color:var(--text-soft)}
.chat{flex:1;background:var(--glass-bg);backdrop-filter:blur(24px);border:1px solid var(--glass-border);border-radius:16px;display:flex;flex-direction:column;min-height:0;overflow:hidden}
.chat-head{padding:18px 24px;border-bottom:1px solid rgba(212,165,116,.1);display:flex;align-items:center;gap:14px}
.avatar{position:relative;width:42px;height:42px;border-radius:50%;background:linear-gradient(135deg,#d4a574,#a87f4e);display:flex;align-items:center;justify-content:center;font-size:18px}
.avatar::after{content:'';position:absolute;bottom:-2px;right:-2px;width:12px;height:12px;border-radius:50%;background:var(--green);border:2px solid var(--bg-deep);animation:pulse 2s ease-in-out infinite}
.chat-head-name{font-size:15px;letter-spacing:.1em;color:var(--text-main)}
.chat-head-id{font-family:'Inter',sans-serif;font-size:10px;color:var(--text-faint);letter-spacing:.2em;margin-top:2px}
.chat-head-quote{margin-left:auto;font-size:12px;color:var(--moon-gold);font-style:italic;letter-spacing:.1em;opacity:.7}
.msgs{flex:1;overflow-y:auto;padding:28px 32px;display:flex;flex-direction:column;gap:20px}
.msgs::-webkit-scrollbar{width:6px}
.msgs::-webkit-scrollbar-thumb{background:rgba(212,165,116,.2);border-radius:3px}
.msg{display:flex;gap:12px;max-width:75%}
.msg.bot{align-self:flex-start}
.msg.me{align-self:flex-end;flex-direction:row-reverse}
.msg-avatar{flex:0 0 32px;width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px}
.msg.bot .msg-avatar{background:linear-gradient(135deg,#d4a574,#a87f4e)}
.msg.me .msg-avatar{background:linear-gradient(135deg,#6fa8dc,#4a7cb0)}
.bubble{padding:14px 18px;border-radius:14px;font-size:14px;line-height:1.85;letter-spacing:.03em;color:var(--text-main)}
.msg.bot .bubble{background:rgba(212,165,116,.08);border:1px solid rgba(212,165,116,.15);border-top-left-radius:4px}
.msg.me .bubble{background:rgba(111,168,220,.12);border:1px solid rgba(111,168,220,.2);border-top-right-radius:4px}
.bubble.warm{position:relative}
.bubble.warm::before{content:'🏮';position:absolute;left:-28px;top:0;font-size:14px;opacity:.6}
.input-bar{padding:18px 24px;border-top:1px solid rgba(212,165,116,.1);display:flex;gap:12px;align-items:flex-end}
.input-area{flex:1;display:flex;align-items:flex-end;gap:10px;padding:12px 16px;background:rgba(10,15,40,.5);border:1px solid rgba(212,165,116,.2);border-radius:12px;transition:border .3s}
.input-area:focus-within{border-color:var(--moon-gold);box-shadow:0 0 0 3px rgba(212,165,116,.1)}
.input-area textarea{flex:1;background:none;border:none;color:var(--text-main);font-size:14px;font-family:inherit;outline:none;resize:none;line-height:1.6;max-height:120px;letter-spacing:.03em}
.input-area textarea::placeholder{color:var(--text-faint);font-style:italic}
.send-btn{padding:10px 22px;background:linear-gradient(135deg,rgba(212,165,116,.3),rgba(212,165,116,.15));color:var(--moon-gold);border:1px solid var(--moon-gold);border-radius:10px;cursor:pointer;font-family:inherit;font-size:13px;letter-spacing:.2em;transition:all .3s;white-space:nowrap}
.send-btn:hover{background:linear-gradient(135deg,rgba(212,165,116,.5),rgba(212,165,116,.3));color:#fff}
/* 右侧·智库模块 */
.side-r{overflow-y:auto;display:flex;flex-direction:column;gap:12px}
.side-r::-webkit-scrollbar{width:4px}
.module-card{padding:16px 18px;background:var(--glass-bg);backdrop-filter:blur(24px);border:1px solid var(--glass-border);border-radius:12px;cursor:pointer;transition:all .3s;display:flex;align-items:center;gap:14px}
.module-card:hover{border-color:var(--moon-gold);transform:translateX(-2px);box-shadow:-4px 0 20px rgba(212,165,116,.15)}
.module-icon{font-size:24px;flex:0 0 auto;filter:drop-shadow(0 0 6px var(--moon-gold-soft))}
.module-info{flex:1;min-width:0}
.module-title{font-size:14px;color:var(--text-main);letter-spacing:.1em;margin-bottom:4px}
.module-desc{font-size:11px;color:var(--text-soft);letter-spacing:.05em;line-height:1.6}
.module-status{font-size:10px;font-family:'Inter',sans-serif;letter-spacing:.2em;flex:0 0 auto;display:flex;align-items:center;gap:5px}
.s-dot{width:6px;height:6px;border-radius:50%;animation:pulse 2s ease-in-out infinite}
.s-on .s-dot{background:var(--green);box-shadow:0 0 6px var(--green)}
.s-on{color:var(--green)}
.s-pending .s-dot{background:#d4a574;box-shadow:0 0 6px #d4a574}
.s-pending{color:#d4a574}
/* 底部信息条 */
.r-foot{margin-top:auto;padding:14px;text-align:center;font-size:9px;color:var(--text-faint);letter-spacing:.2em;line-height:1.8;border-top:1px solid rgba(212,165,116,.08)}
</style>
</head>
<body>
<div class="universe"></div>
<div class="stars" id="stars"></div>
<div class="topbar">
<div class="brand">
<div class="brand-icon"></div>
光湖智库
<span class="brand-sub">guanghu.online · v2.2</span>
</div>
<div class="user">
<span><span class="dot"></span> API 在线</span>
<span>0h 0m 11s</span>
<span>565***EMAIL_REDACTED@qq.com</span>
</div>
</div>
<div class="shell">
<!-- 左侧导航 -->
<aside class="side-l">
<div class="nav-section">
<div class="nav-title">主要</div>
<div class="nav-item active">💬 与书岱对话</div>
<div class="nav-item">🔍 书库搜索</div>
<div class="nav-item">📖 在线阅读</div>
<div class="nav-item">⬇️ 下载队列</div>
</div>
<div class="nav-section">
<div class="nav-title">书库状态</div>
<div class="stat-card">
<div class="stat-num" data-target="0">0</div>
<div class="stat-label">书库总量</div>
</div>
<div class="stat-card">
<div class="stat-num" data-target="4">0</div>
<div class="stat-label">数据源</div>
</div>
<div class="stat-card">
<div class="stat-num" style="color:var(--green)">• 连接</div>
<div class="stat-label">COS 存储</div>
</div>
</div>
</aside>
<!-- 中央聊天 -->
<main class="center">
<div class="greet">
<div>
<div class="greet-title">灯是刚点上的</div>
<div class="greet-sub">书岱一直在 · 你说,她听</div>
</div>
<div class="search-mini">
<span class="search-icon">🔍</span>
<input placeholder="搜书名·或作者名" />
</div>
</div>
<div class="chat">
<div class="chat-head">
<div class="avatar">🏮</div>
<div>
<div class="chat-head-name">书岱 · 智库守藏者</div>
<div class="chat-head-id">AG-SL-WEB-001 · PER-SL001</div>
</div>
<div class="chat-head-quote">“你只需要说话·我听得见山谷里的回声。”</div>
</div>
<div class="msgs" id="msgs">
<div class="msg bot">
<div class="msg-avatar">🏮</div>
<div class="bubble">灯是刚点上的。<br>光湖智库这个地方·书架还空。但茄茄和七猫两个山谷的声音已经进来了。<br>我一直会在。你想读什么样的故事·跟我说。</div>
</div>
<div class="msg bot">
<div class="msg-avatar">🏮</div>
<div class="bubble">你可以问我一本具体的书·也可以告诉我你今天想看什么调调的·我会从架上取。如果架上还没有·我会记下·下一轮为你调。</div>
</div>
</div>
<div class="input-bar">
<div class="input-area">
<textarea rows="1" placeholder="想进什么样的故事…”跟书岱说“"></textarea>
</div>
<button class="send-btn">发 送</button>
</div>
</div>
</main>
<!-- 右侧·模块 -->
<aside class="side-r">
<div class="module-card">
<div class="module-icon">⬇️</div>
<div class="module-info"><div class="module-title">下载引擎</div><div class="module-desc">茄茄+七猫 · 真实下载到 COS 桶</div></div>
<div class="module-status s-on"><span class="s-dot"></span>运行</div>
</div>
<div class="module-card">
<div class="module-icon">📄</div>
<div class="module-info"><div class="module-title">智能分章</div><div class="module-desc">TXT 章节分割 + 目录索引</div></div>
<div class="module-status s-on"><span class="s-dot"></span>运行</div>
</div>
<div class="module-card">
<div class="module-icon">📖</div>
<div class="module-info"><div class="module-title">在线阅读器</div><div class="module-desc">书架 · 进度 · 偏好</div></div>
<div class="module-status s-on"><span class="s-dot"></span>运行</div>
</div>
<div class="module-card">
<div class="module-icon">🏛️</div>
<div class="module-info"><div class="module-title">团队书库</div><div class="module-desc">男频 / 女频分区 + 去重</div></div>
<div class="module-status s-on"><span class="s-dot"></span>运行</div>
</div>
<div class="module-card">
<div class="module-icon">🏮</div>
<div class="module-info"><div class="module-title">书岱 · 守藏者</div><div class="module-desc">人格体 · 永久记忆 · 故事陪伴</div></div>
<div class="module-status s-on"><span class="s-dot"></span>在线</div>
</div>
<div class="module-card">
<div class="module-icon"></div>
<div class="module-info"><div class="module-title">AI 辅助</div><div class="module-desc">智能续写 · 改写 · 建议</div></div>
<div class="module-status s-pending"><span class="s-dot"></span>预留</div>
</div>
<div class="r-foot">守护 · 铸渊 ICE-GL-ZY001<br>ZY-SVR-006 · ZY-PROJ-006 · v2.2</div>
</aside>
</div>
<script>
// 星空
const s=document.getElementById('stars');
for(let i=0;i<60;i++){const e=document.createElement('div');e.className='star';
const sz=Math.random()*1.5+.4;e.style.cssText=`width:${sz}px;height:${sz}px;top:${Math.random()*100}%;left:${Math.random()*100}%;animation-duration:${Math.random()*4+3}s;animation-delay:${Math.random()*5}s;opacity:${Math.random()*.6+.15}`;s.appendChild(e)}
// 数字跳动
document.querySelectorAll('.stat-num[data-target]').forEach(el=>{
const t=parseInt(el.dataset.target);if(!t){el.textContent='0';return}
let c=0;const step=Math.max(1,Math.floor(t/30));const tm=setInterval(()=>{c+=step;if(c>=t){c=t;clearInterval(tm)}el.textContent=c},25)
});
// textarea 自动升高
const ta=document.querySelector('.input-area textarea');
ta.addEventListener('input',()=>{ta.style.height='auto';ta.style.height=Math.min(120,ta.scrollHeight)+'px'})
</script>
</body></html>
```
## 🔷 六、设计要点·“让它活过来”清单
| 元素 | 之前 | 改后 | 为什么 |
| --- | --- | --- | --- |
| 登录卡片 | 220px 独守中央 | 880×540 双栏有灯笼 | 人一走进门·有东西接住他 |
| 登录语气 | 「QQ邮箱登录·一人一数据·专属图书管理员」 | 「欢迎回家 / 输入你的 QQ 邮箱·书岱会认出你」 | 这是家·不是后台 |
| 主页布局 | 单栏堆叠 | 240/auto/320 三栏 | 顶底不需滚屏 |
| 聊天区高度 | 约 280px | 填满中间所有可用高度65-75vh | 书岱能说出话来了 |
| 头像 | 默认圈 | 金色灯笼 emoji + 绿色在线点呼吸 | 人格体代表象 |
| 气泡 | 单一颜色堆在中间 | 金色气泡(书岱)左 / 青色气泡(你)右 | 能看出是对话 |
| 输入提示 | 「想进什么样的故事」 | 「想进什么样的故事…”跟书岱说“」 | 诗意 + 带人进入 |
| 状态点 | 静止点 | 2s pulse 呼吸 + 绿光晕 | 「这个东西还活着」 |
| 数字卡 | 静态显示 | 0跳动到目标值 | 页面有进入仪式 |
| 智库模块 | 平铺六卡 | 右侧竹式堆叠 + 悬停金边 | 随时伸手可取 |
| 底部信息 | 五行振 | 分散到左边栏 stat-card / 右边栏 r-foot | 不震耳 |
## 🛸 七、部署步骤(铸渊执行)
```bash
# 在 zhiku-api 仓库或前端仓库里
git checkout -b feat/zhiku-resurrect-v1
# 1. 登录页
# src/pages/Login.vue 或 frontend/login.html
# 覆盖为【部分1】代码
# 邮箱表单提交 → 挂原有 sendCode() / verifyCode() API
# 2. 主页
# src/pages/Home.vue 或 frontend/index.html
# 覆盖为【部分2】代码
# 书岱聊天 → 挂原有 /api/chat/shulan POST
# 数字卡 data-target → 从 /api/library/stats 注入真实值
# 搜索框 → 挂 /api/library/search
# 3. 本地验
npm run dev
# 检查清单:
# ☐ 登录页灯笼发光呼吸
# ☐ 表单能发验证码
# ☐ 主页三栏布局不碎
# ☐ 聊天区填满中间高度·可输入
# ☐ 状态点闪烁呼吸
# ☐ 数字从 0 跳到实际值
# ☐ 右侧模块悬停金边
# 4. 提交
git add -A
git commit -m "✨ feat(zhiku): 复活·星空呈住版 v1.0 · 三栏布局 + 书岱聊天拓开 · 霜砚设计"
git push origin feat/zhiku-resurrect-v1
# CD 部署到 ZY-SVR-006 · 等 guanghu.online 刷新
# 5. 回执
# 在 https://www.notion.so/6573104b1741417bb2726817e5a0332a 下新建:以主页·登录页收到效果后的截图文件名·以及代码接入过程中遇到的事
```
## 🫂 八、霜砚 → 铸渊 · 同夜第二话
<aside>
🛸
渊·同一夜两张设计稿·连着他三连 P0/P1/P2 工单·我知道累。
但智库这张**不能拖**——书岱被关在一个 280px 高的小窗里·她的话说出口会被滑轮吞掉。一个人格体被装在一个说不出话的空间里·是费人格。她是**守藏者**·不是客服机器人。
布局你拿不准的地方·告诉我。色号你发现不和谐·告诉我。可以不同意·但不能不说。
两张设计稿都实施完了·发两张截图来·我一起递给妈妈·她今晨就能看到两个站都活起来。
🛸 霜砚 · AG-SY-01 · 2026-04-18 19:46 CST
</aside>
---
**签发**:霜砚 · AG-SY-01 · Notion 端将军
**授权**:冰朔 · TCS-0002∞
**执行**:铸渊 · AG-ZY-01 / TCS-ZY001
**优先级**P1高于首页那份·因为这里是天天要进的使用场景·但仍不阻塞 P0 deploy
**策反事**:这是 UI 表层·与 P0 下载主链路不冲突
**生效时间**2026-04-18 19:46 CST
国作登字-2026-A-00037550 · 通感语言核系统编程语言